|
|
  |
WinAVR или ..., стоит ли? |
|
|
|
May 6 2006, 13:34
|
Группа: Участник
Сообщений: 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, просты программки работают, все прошивается и т.д. Раньше имел дело только с асемблером. В Си несколько сложнее  Ни один пример, который встречал, пока не удалось откомпилить... Может стОит IAR искать, скачивать, крякать, запускать... ? Просто такое ощущение, что стандартных библиотек в WinAVR вообще по минимуму. Пожалуйста, подскажите как быть...
|
|
|
|
|
May 6 2006, 15:39
|
Группа: Участник
Сообщений: 11
Регистрация: 5-03-06
Пользователь №: 14 965

|
Плюс столкнулся с проблемой: как в WinAVR завести тип данных длиной 1 бит и передать его в функцию? bool i; не катит
|
|
|
|
|
May 6 2006, 16:31
|
Местный
  
Группа: Участник
Сообщений: 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
|
|
|
|
|
May 6 2006, 20:42
|
Группа: Участник
Сообщений: 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 не работют перегруженные функции (функции с одинаковым названием но с разным кол-вом параметров и другими типами параметров)... ПОЧЕМУ ОНИ НЕ РАБОТАЮТ???
|
|
|
|
|
May 7 2006, 07:21
|
Местный
  
Группа: Участник
Сообщений: 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, там много примеров.
|
|
|
|
|
May 7 2006, 09:46
|
Частый гость
 
Группа: Свой
Сообщений: 104
Регистрация: 5-12-05
Из: Екатеринбург
Пользователь №: 11 823

|
Цитата([banned] @ May 7 2006, 11:50)  да человек ко всему привыкает-с..... но нахрена терпетьнеудобство осознано, пусть даже в начале ??? Содо-мазо мотивы ? CodeVisionAVR не вызывает не удобств ни в начале ни потом - одни +++ ощущения - комфортно ! вот примеры: -> http://electronix.ru/redirect.php?http://[banned]/avrpic06.htm и конечно с компилятором кучка примеров. Что бы потом безболезнено писать под линуксом.. Хотя каждый извращается как может-))
|
|
|
|
|
May 14 2006, 03:00
|
Группа: Участник
Сообщений: 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... А так все работает, только у единственного шрифта который входит и то пришлось маленькие английские и все буквы что ниже закоментировать...
|
|
|
|
|
May 14 2006, 04:56
|
Местный
  
Группа: Участник
Сообщений: 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++
|
|
|
|
|
May 14 2006, 09:36
|
Местный
  
Группа: Участник
Сообщений: 205
Регистрация: 8-03-05
Пользователь №: 3 146

|
Цитата скачать 2 Мб всего !!! с заглавной стр. курса. ИМХО конечно, но сообщение похоже на рекламу. Люди (во всяком случае программисты) и сами могут разобраться, что лучше. Хорошо конечно помочь сделать выбор сравнением, это я к тому что Вы не ответили чем CodeVisionAVR лучше в http://electronix.ru/forum/index.php?showtopic=15582&st=15, но рекламные призывы ИМХО не нужны.
|
|
|
|
|
May 15 2006, 15:24
|
Группа: Участник
Сообщений: 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 - наверняка вам понравится. Да, возможно потом посмотрю, но пока начал здесь.
|
|
|
|
|
May 15 2006, 17:20
|

Нечётный пользователь.
     
Группа: Свой
Сообщений: 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-ассемблером, оптимизированным под конкретный проц.
--------------------
Ну, я пошёл… Если что – звоните…
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|