Страница 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, если просто убрать

Код: Выделить всё

pgm_read_byte
то не работает.

Добавлено: Пн янв 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 - на английском 8)

Как прочитать РОН в 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) - зачем вам приплетать ассемблер?! пользуйтесь на здоровье тем, что уже за вас сделали!