WinAvr в вопросах и ответах

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
AI_Disable
Сверлит текстолит когтями
Сообщения: 1116
Зарегистрирован: Чт окт 15, 2009 14:16:18
Откуда: Екб
Контактная информация:

Сообщение AI_Disable »

ARV писал(а):
AI_Disable писал(а):А таймер разве не сбросится по достижению OCR1B? Я боялся, что режим CTC выбирается для обоих регистров сравнения одновременно.
читайте даташит - СТС работает по OCR1A или ICR1.

Хех, точно, никогда не обращал внимание на колонку "TOP" таблицы, теперь хоть знать буду. Спасибо. :)
Аватара пользователя
sachok
Опытный кот
Сообщения: 849
Зарегистрирован: Сб янв 05, 2008 11:05:15
Откуда: Україна м.Луцьк
Контактная информация:

Сообщение sachok »

Что делает эта функция pgm_read_byte(); и как ее заменить в CVAVR?
Я не Сашок!!!
minime
Открыл глаза
Сообщения: 42
Зарегистрирован: Пн янв 04, 2010 16:06:47

Сообщение minime »

вы поиск сделайте в папке WinAVR и увидите.
Аватара пользователя
AI_Disable
Сверлит текстолит когтями
Сообщения: 1116
Зарегистрирован: Чт окт 15, 2009 14:16:18
Откуда: Екб
Контактная информация:

Сообщение AI_Disable »

Эта функция отвечает за чтение из флэша, если не ошибаюсь.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Сообщение ARV »

sachok писал(а):Что делает эта функция pgm_read_byte(); и как ее заменить в CVAVR?
в CVAVR вы просто объявляете переменную типа flash char и можете ее использовать вместо этой функции.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
sachok
Опытный кот
Сообщения: 849
Зарегистрирован: Сб янв 05, 2008 11:05:15
Откуда: Україна м.Луцьк
Контактная информация:

Сообщение 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
то не работает.
Я не Сашок!!!
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Сообщение ARV »

а почему вы не в теме про CVAVR задаете вопрос?

я же сказал, надо объявлять переменные иначе - вот и все!

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

flash char font_lookup[][] = {...........};

lcd_cache[lcd_cache_index++] = font_lookup[ch - 32][i]  << 1;
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
sachok
Опытный кот
Сообщения: 849
Зарегистрирован: Сб янв 05, 2008 11:05:15
Откуда: Україна м.Луцьк
Контактная информация:

Сообщение sachok »

ARV писал(а):а почему вы не в теме про CVAVR задаете вопрос?

Потому что вопрос по переделке кода с WinAVR, AVRGCC :))
Спасибо!!! Теперь всё понятно стало.
Я не Сашок!!!
Аватара пользователя
Avarges
Вымогатель припоя
Сообщения: 512
Зарегистрирован: Вт дек 22, 2009 02:24:50
Контактная информация:

Сообщение 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 будет разница ?
minime
Открыл глаза
Сообщения: 42
Зарегистрирован: Пн янв 04, 2010 16:06:47

Сообщение minime »

возможно он воспримет число как int без знака

U - без знака
L лонг
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Сообщение ARV »

minime писал(а):возможно он воспримет число как int без знака

U - без знака
L лонг
не возможно, а стопроцентно воспримет как int. по умолчанию все числовые константы воспринимаются, как int
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
Cat Career
Родился
Сообщения: 12
Зарегистрирован: Пн янв 11, 2010 12:51:31
Откуда: Санкт-Петербург

Сообщение Cat Career »

Народ, а можно к winavr-овскому проекту подключить готовую ассемблеровскую библиотеку? И как это сделать, если можно?
Заранее благодарен за ответ...
Результат верен с точностью до ошибки
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Сообщение ARV »

Cat Career писал(а):Народ, а можно к winavr-овскому проекту подключить готовую ассемблеровскую библиотеку? И как это сделать, если можно?
Заранее благодарен за ответ...
а почему ж нельзя? если написано на GAS (GNU assembler) - без проблем, а если на обычном-привычном, то придется немного поколдовать с исходником, чтобы WinAVR скомпилировал его...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
Cat Career
Родился
Сообщения: 12
Зарегистрирован: Пн янв 11, 2010 12:51:31
Откуда: Санкт-Петербург

Сообщение Cat Career »

Хм... написано на ассемблере в AVRStudio, и winavr используется как плагин к ней... не подскажете, что делать в этом случае?
P.S. Ничего найти не могу по этому поводу...
Результат верен с точностью до ошибки
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Сообщение ARV »

сделать придется минимум следующее:
1. переименовать файл ассемблера так, чтобы расширение стало .s
2. в функциях ассемблерного файла перераспределить регистры так, как требует WinAVR для функций для параметров и результата
3. описать секции и имена функций
4. описать переменные, если требуется
5. сделать заголовочный файл (.h) с описанием функций и данных ассемблерного модуля.

после этого компилировать проект :)

P.S. все необходимые манипуляции описаны в разделе документации к avr-libc из комплекта WinAVR - на английском 8)
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
uchar
Родился
Сообщения: 8
Зарегистрирован: Чт янв 28, 2010 16:27:21

Как прочитать РОН в WinAVR?

Сообщение uchar »

Поиском не нашел, решил задать вопрос..
Как на сях в WinAVR можно прочитать содержимое регистра, например R0?
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Как прочитать РОН в WinAVR?

Сообщение ARV »

uchar писал(а):Поиском не нашел, решил задать вопрос..
Как на сях в WinAVR можно прочитать содержимое регистра, например R0?
зададимся вопросом: а зачем это надо?!
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
uchar
Родился
Сообщения: 8
Зарегистрирован: Чт янв 28, 2010 16:27:21

Re: Как прочитать РОН в WinAVR?

Сообщение 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" чему соответствуют?
Аватара пользователя
avreal
Опытный кот
Сообщения: 842
Зарегистрирован: Чт дек 31, 2009 19:27:45
Откуда: Бровари, Україна
Контактная информация:

Re: Как прочитать РОН в WinAVR?

Сообщение avreal »

uchar писал(а):

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

        : "=r" (__result)       \
        : "z" (__addr16)        \
        : "r0"                  \


У оператора mov ссылка %0 соответствует операнду "=r" - это понятно, а операнды "z" и "r0" чему соответствуют?

r0 это R0 а z это Z :-)
Вторая строка "констрейнов" - это "входы" ассемблерной вставки, и тут прописано, что в регистр "z" надо записать значение __addr16.
Получите ассемблерный исходник ключиком -S и посмотрите, что там выполняется непосредственно перед комментарием
/* #APP */
отмечающим начало кода из вставки.

Третья строка - это "что мы портим из регистров, не указав их в первых двух строках"

В документации всё расписано.
Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Как прочитать РОН в WinAVR?

Сообщение ARV »

uchar писал(а):
ARV писал(а):
uchar писал(а):Поиском не нашел, решил задать вопрос..
Как на сях в WinAVR можно прочитать содержимое регистра, например R0?
зададимся вопросом: а зачем это надо?!


Хотел прочитать несколько байт памяти программ - на асме это делал командой LPM, в принципе все было понятно.
Решил попробовать на С, выяснил, что есть макрос pgm_read_byte_near(address_short) __LPM((uint16_t)(address_short)) - ну и решил,
что результат чтения как и на асме тоже сохраняется в регистре R0.
и снова повторюсь: ЗАЧЕМ ЭТО НАДО?

у вас есть функция pgm_read_byte(addr) - зачем вам приплетать ассемблер?! пользуйтесь на здоровье тем, что уже за вас сделали!
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Ответить

Вернуться в «AVR»