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

 
 
> 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
 
Start new topic
Ответов
733259
сообщение May 14 2006, 04:56
Сообщение #2


Местный
***

Группа: Участник
Сообщений: 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
ra9ftm2
сообщение May 15 2006, 15:24
Сообщение #3





Группа: Участник
Сообщений: 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
Сообщение #4


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

Группа: Свой
Сообщений: 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 Текстовая версия Сейчас: 31st July 2025 - 16:00
Рейтинг@Mail.ru


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