Страница 21 из 110
Добавлено: Вт дек 08, 2009 22:30:29
AI_Disable
ARV писал(а):AI_Disable писал(а):А таймер разве не сбросится по достижению OCR1B? Я боялся, что режим CTC выбирается для обоих регистров сравнения одновременно.
читайте даташит - СТС работает по OCR1A или ICR1.
Хех, точно, никогда не обращал внимание на колонку "TOP" таблицы, теперь хоть знать буду. Спасибо.

Добавлено: Пн янв 04, 2010 17:23:39
sachok
Что делает эта функция pgm_read_byte(); и как ее заменить в CVAVR?
Добавлено: Пн янв 04, 2010 17:50:17
minime
вы поиск сделайте в папке WinAVR и увидите.
Добавлено: Пн янв 04, 2010 17:55:23
AI_Disable
Эта функция отвечает за чтение из флэша, если не ошибаюсь.
Добавлено: Пн янв 04, 2010 18:51:22
ARV
sachok писал(а):Что делает эта функция pgm_read_byte(); и как ее заменить в CVAVR?
в CVAVR вы просто объявляете переменную типа
flash char и можете ее использовать вместо этой функции.
Добавлено: Пн янв 04, 2010 19:32:06
sachok
Вот это у меня есть:
Код: Выделить всё
void lcd_chr (unsigned char size, unsigned char ch )
{
unsigned char i, c;
if ( size == font_1x )
{
for ( i = 0; i < 5; i++ )
{
/* Copy lookup table from Flash ROM to LcdCache */
lcd_cache[lcd_cache_index++] = pgm_read_byte(&( font_lookup[ ch - 32 ][ i ] ) ) << 1;
}
}
}
Нужно переделать под CVAVR, если просто убрать
то не работает.
Добавлено: Пн янв 04, 2010 20:51:53
ARV
а почему вы не в теме про CVAVR задаете вопрос?
я же сказал, надо объявлять переменные иначе - вот и все!
Код: Выделить всё
flash char font_lookup[][] = {...........};
lcd_cache[lcd_cache_index++] = font_lookup[ch - 32][i] << 1;
Добавлено: Пн янв 04, 2010 21:35:57
sachok
ARV писал(а):а почему вы не в теме про CVAVR задаете вопрос?
Потому что вопрос по переделке кода с WinAVR, AVRGCC
Спасибо!!! Теперь всё понятно стало.
Добавлено: Ср янв 06, 2010 15:00:04
Avarges
Не нашёл в дебрях документации, объясните как расшифровать все эти опции командной строки, например:
avr-gcc -I"." -I"../usbdrv" -I"../." -g -mmcu=atmega16 -Wall -DF_CPU=16000000UL -Os -fsigned-char -DDEBUG_LEVEL=2 -c ../usbdrv/usbdrv.c
Если написать
-DF_CPU=16000000UL
без UL будет разница ?
Добавлено: Ср янв 06, 2010 15:04:56
minime
возможно он воспримет число как int без знака
U - без знака
L лонг
Добавлено: Ср янв 06, 2010 19:26:47
ARV
minime писал(а):возможно он воспримет число как int без знака
U - без знака
L лонг
не возможно, а стопроцентно воспримет как
int. по умолчанию все числовые константы воспринимаются, как
int
Добавлено: Ср янв 20, 2010 14:16:11
Cat Career
Народ, а можно к winavr-овскому проекту подключить готовую ассемблеровскую библиотеку? И как это сделать, если можно?
Заранее благодарен за ответ...
Добавлено: Ср янв 20, 2010 15:51:44
ARV
Cat Career писал(а):Народ, а можно к winavr-овскому проекту подключить готовую ассемблеровскую библиотеку? И как это сделать, если можно?
Заранее благодарен за ответ...
а почему ж нельзя? если написано на GAS (GNU assembler) - без проблем, а если на обычном-привычном, то придется немного поколдовать с исходником, чтобы WinAVR скомпилировал его...
Добавлено: Ср янв 20, 2010 16:15:57
Cat Career
Хм... написано на ассемблере в AVRStudio, и winavr используется как плагин к ней... не подскажете, что делать в этом случае?
P.S. Ничего найти не могу по этому поводу...
Добавлено: Ср янв 20, 2010 16:23:32
ARV
сделать придется минимум следующее:
1. переименовать файл ассемблера так, чтобы расширение стало
.s
2. в функциях ассемблерного файла перераспределить регистры так, как требует WinAVR для функций для параметров и результата
3. описать секции и имена функций
4. описать переменные, если требуется
5. сделать заголовочный файл (.h) с описанием функций и данных ассемблерного модуля.
после этого компилировать проект
P.S. все необходимые манипуляции описаны в разделе документации к avr-libc из комплекта WinAVR - на английском

Как прочитать РОН в WinAVR?
Добавлено: Чт янв 28, 2010 16:59:14
uchar
Поиском не нашел, решил задать вопрос..
Как на сях в WinAVR можно прочитать содержимое регистра, например R0?
Re: Как прочитать РОН в WinAVR?
Добавлено: Чт янв 28, 2010 21:45:13
ARV
uchar писал(а):Поиском не нашел, решил задать вопрос..
Как на сях в WinAVR можно прочитать содержимое регистра, например R0?
зададимся вопросом: а зачем это надо?!
Re: Как прочитать РОН в WinAVR?
Добавлено: Вт фев 02, 2010 14:47:41
uchar
ARV писал(а):uchar писал(а):Поиском не нашел, решил задать вопрос..
Как на сях в WinAVR можно прочитать содержимое регистра, например R0?
зададимся вопросом: а зачем это надо?!
Хотел прочитать несколько байт памяти программ - на асме это делал командой LPM, в принципе все было понятно.
Решил попробовать на С, выяснил, что есть макрос pgm_read_byte_near(address_short) __LPM((uint16_t)(address_short)) - ну и решил,
что результат чтения как и на асме тоже сохраняется в регистре R0.
Сейчас уже разобрался как читать из flash-памяти, поковырял файл pgmspace.h, есть там дефайн такой :
Код: Выделить всё
#define __LPM_classic__(addr) \
(__extension__({ \
uint16_t __addr16 = (uint16_t)(addr); \
uint8_t __result; \
__asm__ \
( \
"lpm" "\n\t" \
"mov %0, r0" "\n\t" \
: "=r" (__result) \
: "z" (__addr16) \
: "r0" \
); \
__result; \
}))
Не понимаю до конца как работает ассемблерная конструкция

Почему первой идет команда lpm - ведь сначала надо адрес записать в регистр Z?
У оператора mov ссылка %0 соответствует операнду "=r" - это понятно, а операнды "z" и "r0" чему соответствуют?
Re: Как прочитать РОН в WinAVR?
Добавлено: Вт фев 02, 2010 15:12:22
avreal
uchar писал(а):Код: Выделить всё
: "=r" (__result) \
: "z" (__addr16) \
: "r0" \
У оператора mov ссылка %0 соответствует операнду "=r" - это понятно, а операнды "z" и "r0" чему соответствуют?
r0 это R0 а z это Z

Вторая строка "констрейнов" - это "входы" ассемблерной вставки, и тут прописано, что в регистр "z" надо записать значение __addr16.
Получите ассемблерный исходник ключиком
-S и посмотрите, что там выполняется непосредственно перед комментарием
/* #APP */
отмечающим начало кода из вставки.
Третья строка - это "что мы портим из регистров, не указав их в первых двух строках"
В
документации всё расписано.
Re: Как прочитать РОН в WinAVR?
Добавлено: Вт фев 02, 2010 15:22:41
ARV
uchar писал(а):ARV писал(а):зададимся вопросом: а зачем это надо?!
Хотел прочитать несколько байт памяти программ - на асме это делал командой LPM, в принципе все было понятно.
Решил попробовать на С, выяснил, что есть макрос pgm_read_byte_near(address_short) __LPM((uint16_t)(address_short)) - ну и решил,
что результат чтения как и на асме тоже сохраняется в регистре R0.
и снова повторюсь: ЗАЧЕМ ЭТО НАДО?
у вас есть функция
pgm_read_byte(addr) - зачем вам приплетать ассемблер?! пользуйтесь на здоровье тем, что уже за вас сделали!