реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> WinAVR или ..., стоит ли?
ra9ftm2
сообщение May 6 2006, 13:34
Сообщение #1





Группа: Участник
Сообщений: 11
Регистрация: 5-03-06
Пользователь №: 14 965



Вот все пытаюсь какой-нить пример запустить на WinAVR, никак не могу ничего найти подходящего.
Простые штучки получается откомпилить и они прослеживаются в aStudio. Типа этого:
#include <avr/io.h>
#include <avr/delay.h>
void ioinit (void)
{DDRD=0xFF;DDRC=0xFF;}

int main(void)
{ ioinit();
while(1)
{ PORTD= 0xff; _delay_ms(10);PORTD=0;}
return (0);}

Но хочется чего-то более сложного.
В примерах, которые мне попадаются, используются левые типы типа BYTE, BIT и т.п.
Левые функции, которые я не могу найти в папках winavr\avr\include\... Например outp(0xff,DDRB);

Вот только что нашел очень хороший исходник-библиотеку от Alechin здесь http://electronix.ru/forum/index.php?showtopic=10934&st=0 - "Драйвер граф. дисплея МТ12864" - мне как раз его и нужно оживить. Засунул все в aStudio проект. И результат - куча ошибок.

МК atmega8, просты программки работают, все прошивается и т.д.
Раньше имел дело только с асемблером. В Си несколько сложнее sad.gif
Ни один пример, который встречал, пока не удалось откомпилить...

Может стОит IAR искать, скачивать, крякать, запускать... ?
Просто такое ощущение, что стандартных библиотек в WinAVR вообще по минимуму.

Пожалуйста, подскажите как быть...
Go to the top of the page
 
+Quote Post
ra9ftm2
сообщение May 6 2006, 15:39
Сообщение #2





Группа: Участник
Сообщений: 11
Регистрация: 5-03-06
Пользователь №: 14 965



Плюс столкнулся с проблемой:
как в WinAVR завести тип данных длиной 1 бит и передать его в функцию?
bool i; не катит sad.gif
Go to the top of the page
 
+Quote Post
vet
сообщение May 6 2006, 15:59
Сообщение #3


Знающий
****

Группа: Свой
Сообщений: 550
Регистрация: 16-06-04
Из: Казань
Пользователь №: 32



Битовые переменные есть в CodeVision.
Вообще, CV легче осваивается и удобнее в работе, чем WinAVR или IAR. Ну, и библиотеками укомплектован на все случаи. Для перехода с ассемблера - оптимальный выбор, имхо.
Недостаток - менее плотный код, по сравнению с вышеуказанными компиляторами.


--------------------
Главная линия этого опуса ясна мне насквозь!
Go to the top of the page
 
+Quote Post
733259
сообщение May 6 2006, 16:31
Сообщение #4


Местный
***

Группа: Участник
Сообщений: 205
Регистрация: 8-03-05
Пользователь №: 3 146



Вообщето в http://electronix.ru/forum/index.php?showtopic=10934&st=0 написано
Цитата
Предлагаю сюда скидывать (кому не жалко) свои инклюды для работы с периферийными устройствами, предназначенные для работы в IAR.
следовательно - надо портировать, копаться.
Можно написать где нибудь в .h типа:

#define BYTE uint8_t
#define outp(val,port) (port) = (val)

т.е. добавить недостающее.

Чтобы был bool надо собирать avr-g++

Сообщение отредактировал 733259 - May 6 2006, 16:54
Go to the top of the page
 
+Quote Post
ra9ftm2
сообщение May 6 2006, 20:42
Сообщение #5





Группа: Участник
Сообщений: 11
Регистрация: 5-03-06
Пользователь №: 14 965



Цитата(733259 @ May 6 2006, 19:31) *
Чтобы был bool надо собирать avr-g++


avr-c++, наверное...
По крайне мере в хелпе avr-libc написано: "lternatively, the C++ compiler could be explicitly called by the name avr-c++."
... Но как avr-gcc.exe поменять на avr-c++.exe (ну или avr-g++.exe котороый также там валяется) в AVR Studio??? Что-то на вскидку не нашел...

Дело в том, что меня беспокоит не только тип bool. Но и то, что например в этой WinAVR не работют перегруженные функции (функции с одинаковым названием но с разным кол-вом параметров и другими типами параметров)... ПОЧЕМУ ОНИ НЕ РАБОТАЮТ???
Go to the top of the page
 
+Quote Post
733259
сообщение May 7 2006, 07:21
Сообщение #6


Местный
***

Группа: Участник
Сообщений: 205
Регистрация: 8-03-05
Пользователь №: 3 146



avr-g++ и avr-c++ абсолютно одинаковы, синонимы.
Цитата
Но и то, что например в этой WinAVR не работют перегруженные функции
А перегруженные функции доступны только в c++ а не простом c, avr-g++ (avr-c++) нужно собирать.
Скачайте avrlib - http://members.home.nl/jmnieuwkamp1/AVRlib/avrlib.zip, там много примеров.
Go to the top of the page
 
+Quote Post
Старый Бабай
сообщение May 7 2006, 08:34
Сообщение #7


Частый гость
**

Группа: Свой
Сообщений: 104
Регистрация: 5-12-05
Из: Екатеринбург
Пользователь №: 11 823



не знаю по мне WinAVR намного удобнее и приятнее.
В начале конечно вызывает неудобство,но потом привыкаешь.
если что стучм . ася 260394959
Go to the top of the page
 
+Quote Post
Старый Бабай
сообщение May 7 2006, 09:46
Сообщение #8


Частый гость
**

Группа: Свой
Сообщений: 104
Регистрация: 5-12-05
Из: Екатеринбург
Пользователь №: 11 823



Цитата([banned] @ May 7 2006, 11:50) *
да человек ко всему привыкает-с.....

но нахрена терпетьнеудобство осознано, пусть даже в начале ???

Содо-мазо мотивы ?

CodeVisionAVR не вызывает не удобств ни в начале ни потом - одни +++ ощущения - комфортно !

вот примеры:

-> http://electronix.ru/redirect.php?http://[banned]/avrpic06.htm

и конечно с компилятором кучка примеров.


Что бы потом безболезнено писать под линуксом..
Хотя каждый извращается как может-))
Go to the top of the page
 
+Quote Post
forever failure
сообщение May 7 2006, 13:57
Сообщение #9


Местный
***

Группа: Участник
Сообщений: 256
Регистрация: 6-03-05
Из: Екатеринбург
Пользователь №: 3 112



переменная логического типа есть и в плоском Ц, только этот тип называется _Bool или bool, если подключить загловок:
#include <stdbool.h>
ну и компилять надо с ключом --std=g99 или --std=c99.
Go to the top of the page
 
+Quote Post
ra9ftm2
сообщение May 14 2006, 03:00
Сообщение #10





Группа: Участник
Сообщений: 11
Регистрация: 5-03-06
Пользователь №: 14 965



Пересобрал этот пример с ЖК дисплеем под WinAVR+aStudio.
Пришлось конечно попыхтеть но так хато хоть в коде разобрался.
Там есть переменные(массивы) - шрифты, которые занимают много места для Mega8.
Конечно оптимизация и т.д., но всеравно не входит:

AVR Memory Usage:
-----------------
Device: atmega8
Program: 3516 bytes (42.9% Full)
(.text + .data + .bootloader)
Data: 616 bytes (60.2% Full)
(.data + .bss + .noinit)
Build succeeded with 0 Warnings...

Особенно при добавлении таких новых переменных растет секция Data. Это вообще что такое? Оперативная память или чего? Если так может у WinAVR есть какое-нить волшебное слово перед определением переменной? (типа volatile чтоб оптимизация не работала...)

Вот даже если такую конструкцию добавляю сразу растет секция Data:
BYTE zero[]=
{
0x00, 0xf8, 0xfe, 0x06, 0x03, 0x83, 0xc3, 0x63, 0x33, 0x1e, 0xfe, 0xf8,
0x00, 0x07, 0x1f, 0x1e, 0x33, 0x31, 0x30, 0x30, 0x30, 0x18, 0x1f, 0x07,
};

Ах да, все это работает когда я банально заменил файлик avr-gcc.exe на avr-c++.exe у WinAVR...

А так все работает, только у единственного шрифта который входит и то пришлось маленькие английские и все буквы что ниже закоментировать... sad.gif
Go to the top of the page
 
+Quote Post
733259
сообщение May 14 2006, 04:56
Сообщение #11


Местный
***

Группа: Участник
Сообщений: 205
Регистрация: 8-03-05
Пользователь №: 3 146



.data - инициализированные переменные в RAM, шрифты лучше поместить в флэшку (.text) вот так:
BYTE __attribute__((progmem)) zero[] = {
или
#include <avr/pgmspace.h>
BYTE PROGMEM zero[] = {

читаем так
byte = pgm_read_byte(zero + n);

на скорость функция особо не влияет - pgm_read_byte транслируется в одну команду (lpm)

Цитата
Ах да, все это работает когда я банально заменил файлик avr-gcc.exe на avr-c++.exe у WinAVR...

ИМХО лучше в makefile написать CC = avr-c++
Go to the top of the page
 
+Quote Post
733259
сообщение May 14 2006, 09:36
Сообщение #12


Местный
***

Группа: Участник
Сообщений: 205
Регистрация: 8-03-05
Пользователь №: 3 146



Цитата
скачать 2 Мб всего !!! с заглавной стр. курса.
ИМХО конечно, но сообщение похоже на рекламу. Люди (во всяком случае программисты) и сами могут разобраться, что лучше. Хорошо конечно помочь сделать выбор сравнением, это я к тому что Вы не ответили чем CodeVisionAVR лучше в http://electronix.ru/forum/index.php?showtopic=15582&st=15, но рекламные призывы ИМХО не нужны.
Go to the top of the page
 
+Quote Post
ra9ftm2
сообщение May 15 2006, 15:24
Сообщение #13





Группа: Участник
Сообщений: 11
Регистрация: 5-03-06
Пользователь №: 14 965



Цитата(733259 @ May 14 2006, 07:56) *
...
читаем так
byte = pgm_read_byte(zero + n);
...


Да, но не перекраивать же теперь всю программу? Может быть можно как-то адрес получить?

Пробовал пока вот так:

struct FONT Font_6x8 =
{ 8, 6, 255,
&Font_6x8_Data[0] // вот здесь адрес получаю, эта структура без изменений
};


BYTE Font_6x8_Data[] PROGMEM
=
{0x01,0x02,..., };

считывал как обычно по адресу - работает только почему-то буквы не те печатает.
Т.е. идет смещение. Или это вообще непонятно что получается...?

Я так понял в IAR это обозначает __flash вот так:
__flash BYTE Font_6x8_Data[] =
{...};

Но там никаких левых функций не используется для чтения.

Цитата
попробуйте компилятор CodeVisionAVR - наверняка вам понравится.

Да, возможно потом посмотрю, но пока начал здесь.
Go to the top of the page
 
+Quote Post
ReAl
сообщение May 15 2006, 17:20
Сообщение #14


Нечётный пользователь.
******

Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417



Цитата(ra9ftm2 @ May 15 2006, 17:24) *
Да, но не перекраивать же теперь всю программу? Может быть можно как-то адрес получить?
Пробовал пока вот так:
struct FONT Font_6x8 =
{ 8, 6, 255,
&Font_6x8_Data[0] // вот здесь адрес получаю, эта структура без изменений
};


BYTE Font_6x8_Data[] PROGMEM
=
{0x01,0x02,..., };

считывал как обычно по адресу - работает только почему-то буквы не те печатает.
Т.е. идет смещение. Или это вообще непонятно что получается...?

Я так понял в IAR это обозначает __flash вот так:
__flash BYTE Font_6x8_Data[] =
{...};
Но там никаких левых функций не используется для чтения.
Фрагмент &Font_6x8_Data[0] в инициализаторе - абсолютно правильный.
Но можно и вообще Font_6x8_Data - будет не менее правильно.
А вот уже потом - как ни крути, а Font_6x8->ptr вместе со всеми смещениями - придётся пихать под pgm_read_byte()

Дело в том, что gcc отродясь заточен под чистый нейман - единое адресное пространство.
И в него малореально добавить возможность написать
*ptr
для ptr, указывающего во флеш или eeprom - ну нет такого модификатора к адресам во внутреннем представлении. Т.е. для *ptr он всегда будет генерить ld/ldd/lds, но не lpm.
Поєтому нужна псевlофункции pgm_read_..., которые просто макросы с inline-ассемблером, оптимизированным под конкретный проц.


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 17:05
Рейтинг@Mail.ru


Страница сгенерированна за 0.01459 секунд с 7
ELECTRONIX ©2004-2016