CodeVision AVR в вопросах и ответах

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
Fasterpast
Мучитель микросхем
Сообщения: 493
Зарегистрирован: Ср фев 14, 2007 12:07:58
Откуда: Москва
Контактная информация:

Re: CodeVision AVR в вопросах и ответах

Сообщение Fasterpast »

Подскажите, реально ли такой макрос вставить в Сишный код цавра?

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

   #define __far_mem_write(addr, data)                     \
           (__extension__({                                \
         uint32_t temp32 = (uint32_t)(addr);     \
         asm volatile(                           \
            "in __tmp_reg__, %1"     "\n\t" \
            "out %1, %C0"            "\n\t" \
            "movw r30, %0"           "\n\t" \
            "st Z, %2"               "\n\t" \
            "out %1, __tmp_reg__"           \
            :                               \
            : "r" (temp32),                 \
              "I" (_SFR_IO_ADDR(RAMPZ)),    \
              "r" ((uint8_t)data)           \
            : "r30", "r31"                  \
         );                                      \
      }))

Мои познания в асме не позволяют этого сделать. например, в упор не пойму что такое %1, %C0 и т.д.
Мастер Ломастер
Поставщик валерьянки для Кота
Сообщения: 1995
Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город
Контактная информация:

Re: CodeVision AVR в вопросах и ответах

Сообщение Мастер Ломастер »

это GCC-шная ассемблерная вставка. в CVAVR такого и близко нет. переделать можно - вместо %хх надо ставить соответствуюбщие регистры, где будут храниться параметры функции - GCC делает это сам, а в CVABR вы должны знать, в каких регистрах какие параметры функции переданы (или загрузить их из ячеек памяти, где они хранятся). хотите гемору - желаю удачи.
битва с дураками проиграна, победители торжествуют. слава победителям!
Аватара пользователя
Fasterpast
Мучитель микросхем
Сообщения: 493
Зарегистрирован: Ср фев 14, 2007 12:07:58
Откуда: Москва
Контактная информация:

Re: CodeVision AVR в вопросах и ответах

Сообщение Fasterpast »

Про регистры понял, эт легко найти чему они соответствуют.
Далее:
что такое \n\t?
и что здесь такое страшное написано?

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

            : "r" (temp32),                 \
              "I" (_SFR_IO_ADDR(RAMPZ)),    \
              "r" ((uint8_t)data)           \
            : "r30", "r31"
Мастер Ломастер
Поставщик валерьянки для Кота
Сообщения: 1995
Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город
Контактная информация:

Re: CodeVision AVR в вопросах и ответах

Сообщение Мастер Ломастер »

Fasterpast писал(а):Про регистры понял, эт легко найти чему они соответствуют.
Далее:
что такое \n\t?
и что здесь такое страшное написано?

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

            : "r" (temp32),                 \
              "I" (_SFR_IO_ADDR(RAMPZ)),    \
              "r" ((uint8_t)data)           \
            : "r30", "r31"

\n\t это перевод строки + табуляция :) просто оформление в одном операторе asm() нескольких строк ассемблера с "красивым" оформлением (только в листинге и видно). то, что написано в конце вставки после двоеточий, это как раз GCC-шные фичи, которые позволяют компилятору автоматически выбрать вместо процентов регистры и занести в них то, что вам нужно. для CVAVR аналога этому нет, поэтому рассказывать об этом подробнее - нет никакого смысла.
битва с дураками проиграна, победители торжествуют. слава победителям!
Аватара пользователя
Fasterpast
Мучитель микросхем
Сообщения: 493
Зарегистрирован: Ср фев 14, 2007 12:07:58
Откуда: Москва
Контактная информация:

Re: CodeVision AVR в вопросах и ответах

Сообщение Fasterpast »

Но ведь регистры можно и руками выбрать...
В общем, понял, спасибо. Пойду пробегусь по мануалу на GCC.
Мастер Ломастер
Поставщик валерьянки для Кота
Сообщения: 1995
Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город
Контактная информация:

Re: CodeVision AVR в вопросах и ответах

Сообщение Мастер Ломастер »

Fasterpast писал(а):Но ведь регистры можно и руками выбрать...
В общем, понял, спасибо. Пойду пробегусь по мануалу на GCC.
можно и руками, если знаешь, что в них есть. например, в том самом коде: __far_mem_write(addr, data) в каких регистрах будет addr и в каких data? если в текущей версии компилятора они будут, скажем, в r2 и r3, кто даст гарантию, что в следующей версии компилятор не запихнет их в другие регистры? а может, в другом режиме оптимизации компилятор пересунет данные в другие регистры? а вдруг он их вообще в стек засунет? как ассемблерная вставка сможет учесть все эти варианты?
битва с дураками проиграна, победители торжествуют. слава победителям!
Аватара пользователя
Fasterpast
Мучитель микросхем
Сообщения: 493
Зарегистрирован: Ср фев 14, 2007 12:07:58
Откуда: Москва
Контактная информация:

Re: CodeVision AVR в вопросах и ответах

Сообщение Fasterpast »

в том самом коде: __far_mem_write(addr, data) в каких регистрах будет addr и в каких data?

Ну так это с помощью ldd в начале вставки указывается, насколько я понимаю.
Последний раз редактировалось Fasterpast Вт май 17, 2011 22:55:41, всего редактировалось 2 раза.
Мастер Ломастер
Поставщик валерьянки для Кота
Сообщения: 1995
Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город
Контактная информация:

Re: CodeVision AVR в вопросах и ответах

Сообщение Мастер Ломастер »

Fasterpast писал(а):
в том самом коде: __far_mem_write(addr, data) в каких регистрах будет addr и в каких data?

Ну так это с помощью ldd в начале вставки указывается, насколько я понимаю.
может быть, может быть... но я пока не так уж уверен, что все так просто...
битва с дураками проиграна, победители торжествуют. слава победителям!
Аватара пользователя
DataLife
Вымогатель припоя
Сообщения: 601
Зарегистрирован: Пт фев 13, 2009 20:58:13
Откуда: Донецк

Re: CodeVision AVR в вопросах и ответах

Сообщение DataLife »

Здравствуйте.
Оговорюсь: я практически ноль в программировании.
Есть простецкий вопрос.Нужен ШИМ на Тини13.
С самим "кодом" ШИМа проблем нет, нашёл на просторах инета.
Главное, нужно запускать его только после подачи лог_0 на PORTB.3 (минус подать, короче).

Пробовал я делать так:

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

if (PORTB.3==0) {

if (c<=254) {

c++;

    }
else  {

c=255;   
    };

    delay_ms(10);   
    PWM_set(c);
    read_adc();

};


В итоге светодиод загорается без всякого предупреждения, хоть и плавно.

Подскажите, как корректно написать "если" пожалуйста.
Вложения
1.c
Файл с программой.
(2.42 КБ) 426 скачиваний
Только те, кто предпринимают абсурдные попытки, смогут достичь невозможного.
nedman
Родился
Сообщения: 2
Зарегистрирован: Пн май 16, 2011 13:53:25

Re: CodeVision AVR в вопросах и ответах

Сообщение nedman »

доброго времени суток... вопрос касается таймера на атмега8(извините если задавали много раз. сам не нашел). как написать код ?
если 1 на пине мк, то счетчик начинает работать 5 секунд и посылается на другой пин 1. после работы(5 сек) этот пин ставится в 0. в коде можно использовать разные ножки мк я пойму. только прошу пояснить, чтобы понять.
Аватара пользователя
Fasterpast
Мучитель микросхем
Сообщения: 493
Зарегистрирован: Ср фев 14, 2007 12:07:58
Откуда: Москва
Контактная информация:

Re: CodeVision AVR в вопросах и ответах

Сообщение Fasterpast »

Мастер Ломастер писал(а):может быть, может быть... но я пока не так уж уверен, что все так просто...

В состоянии аффекта родил таки функцию!

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

#pragma warn- // this will prevent warnings
void mem_write2(unsigned long addr, unsigned char data) {
#asm
            ldd R18,Y+1
            ldd R19,Y+2
            ldd R20,Y+3
            ldd R21,Y+4

            ld R22,Y
           
            in R0, RAMPZ   
            out RAMPZ, R20
            movw R30, R18     
           
                   
            st Z, R22               
            out RAMPZ, R0
#endasm
}
#pragma warn+ // enable warnings

И оно даже пашет! Это запись байта во внешнюю память >64kb для xMega, вот )
Причем пашет раза в два быстрее, чем аналогичная функция на С где-то найденная мной.

Теперь осталось написать read, но он пока не хочет работать.
Мастер Ломастер
Поставщик валерьянки для Кота
Сообщения: 1995
Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город
Контактная информация:

Re: CodeVision AVR в вопросах и ответах

Сообщение Мастер Ломастер »

с xMega не доводилось работать, но сдается мне, что нормальный компилятор должен поддерживать работу с внешним ОЗУ на уровне языка Си без всяких самописных функций... то есть вы просто должны будете как-то указать, что переменная или массив находятся во внешнем ОЗУ, задать диапазон адресов этого внешнего ОЗУ в параметрах проекта - и все, пишите программу обычно, а компилятор сам разбирается, как достать ваши данные...

вроде бы AVR-GCC именно так и делает - поправьте, если я не прав...
битва с дураками проиграна, победители торжествуют. слава победителям!
Аватара пользователя
Fasterpast
Мучитель микросхем
Сообщения: 493
Зарегистрирован: Ср фев 14, 2007 12:07:58
Откуда: Москва
Контактная информация:

Re: CodeVision AVR в вопросах и ответах

Сообщение Fasterpast »

Мастер Ломастер писал(а):с xMega не доводилось работать, но сдается мне, что нормальный компилятор должен поддерживать работу с внешним ОЗУ на уровне языка Си без всяких самописных функций... то есть вы просто должны будете как-то указать, что переменная или массив находятся во внешнем ОЗУ, задать диапазон адресов этого внешнего ОЗУ в параметрах проекта - и все, пишите программу обычно, а компилятор сам разбирается, как достать ваши данные...

вроде бы AVR-GCC именно так и делает - поправьте, если я не прав...

Да, но только иксмега держит 16мб внешней памяти, а указатели в GCC и в CVAVR - 16бит, т.е. Адресовать более 64к памяти нельзя. В иксмеге для этого сделали регистр RAMP* добавляющий еще 8 старших бит к адресу. Собственно для этого такие макросы и нужны... В атмеге тоже вроде бы есть такой регистр, но он там только для адресации флеша.

Выкладываю окончательный вариант чтения и записи во внешнюю память для xMega

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

#pragma warn- // this will prevent warnings
void mem_write(unsigned long addr, unsigned char data) {
#asm
            ldd R30,Y+1
            ldd R31,Y+2
            ldd R22,Y+3
            ldd R23,Y+4
            ld R24,Y
            in R0, RAMPZ   
            out RAMPZ, R22
            st Z, R24               
            out RAMPZ, R0
#endasm
}
#pragma warn+ // enable warnings

#pragma warn- // this will prevent warnings
unsigned char mem_read(unsigned long addr) {
#asm
            ld R30,y
            ldd R31,y+1
            ldd R22,y+2
            ldd R23,y+3
            in R0, RAMPZ   
            out RAMPZ, R22     
            ld R30, Z
            out RAMPZ, R0   
#endasm
}
#pragma warn+ // enable warnings
Аватара пользователя
ARM
Встал на лапы
Сообщения: 84
Зарегистрирован: Пт май 20, 2011 05:35:56
Откуда: Воронеж

Re: CodeVision AVR в вопросах и ответах

Сообщение ARM »

Доброго всем времени суток .

я пытаюсь освоить avr , и не могу справится с компиляцией файла в hex . программатор спаять я смог и даже зашил в мк простую программу (горение светодиода ) , смог откомпилировать в CodeVision , но через некоторое время вылезла сист ошибка и CodeVision пришлось перестанавливать , после перестановки как ни стараюсь но hex файл получит не могу , а ещё вот какая странность :

когда я нажимаю на кнопку compile the progect пишит что ошибок нет (1 прик файл )
а когда я нажимаю на кнопку build all progects files пишит что есть одна ошибка ( 2) и хекс не появляется хотя в поле erors ничего нет :(

люди пожалуйста помогите а то так хочется светодиод заставить мигать а не гореть .
Вложения
2.JPG
(103.85 КБ) 493 скачивания
1.JPG
(104.18 КБ) 500 скачиваний
лень и ненависть двигатель прогресса а финансовые потоки тормоз
Аватара пользователя
Сериг
Это не хвост, это антенна
Сообщения: 1451
Зарегистрирован: Пт фев 19, 2010 19:39:28
Откуда: Москва

Re: CodeVision AVR в вопросах и ответах

Сообщение Сериг »

галочки фьюзов трогали???????если трогали ,можно собирать реаниматор или попробывать повесить варц
Аватара пользователя
Сериг
Это не хвост, это антенна
Сообщения: 1451
Зарегистрирован: Пт фев 19, 2010 19:39:28
Откуда: Москва

Re: CodeVision AVR в вопросах и ответах

Сообщение Сериг »

напишите сам код,вот он
#include <tiny2313.h>
#include <delay.h>
void(main)void
DDRD0b1111111
{ while (1)
PORTD.6=1;
delay_ms(500);
PORTD.6=0;
delay_ms(400);
}
Аватара пользователя
rs39
Открыл глаза
Сообщения: 53
Зарегистрирован: Сб май 07, 2011 14:35:24
Откуда: Россия

Re: CodeVision AVR в вопросах и ответах

Сообщение rs39 »

Сериг писал(а):DDRD0b1111111


Осмелюсь спросить..
А разве в CVAVR допускается так, без знака присвоения?
Аватара пользователя
ARM
Встал на лапы
Сообщения: 84
Зарегистрирован: Пт май 20, 2011 05:35:56
Откуда: Воронеж

Re: CodeVision AVR в вопросах и ответах

Сообщение ARM »

фьюзы я не трогал , с контролёром всё впорядке , проблема с компилятором


ЛЮди проше дайте плиз сылку хорошего рабочего код вижина ото руки не из гуглового места растут и сам не чего нормального не нашол
:hunger:


P.S. Сериг , код ест , я знаю как это сделать , в фото простейшая програама которая ни хрена не делает нужна чисто длятого чтобы спросить как это исправить
Последний раз редактировалось ARM Пт май 20, 2011 15:46:35, всего редактировалось 1 раз.
лень и ненависть двигатель прогресса а финансовые потоки тормоз
Аватара пользователя
rs39
Открыл глаза
Сообщения: 53
Зарегистрирован: Сб май 07, 2011 14:35:24
Откуда: Россия

Re: CodeVision AVR в вопросах и ответах

Сообщение rs39 »

Прежде чем другой дистр ставить, нужно от этого полную очистку компа сделать. Иначе ошибки останутся.
А вобще советую для начала скачать демо-версию с офф. сайта. Там ошибок не будет. Доступного кода в 2 или сколько там килобайт слихвой хватит для обучающих проектов вроде мигалки и т.д.
Офф. сайт http://www.hpinfotech.ro/html/download.htm
Последний раз редактировалось rs39 Пт май 20, 2011 15:48:58, всего редактировалось 1 раз.
Аватара пользователя
ARM
Встал на лапы
Сообщения: 84
Зарегистрирован: Пт май 20, 2011 05:35:56
Откуда: Воронеж

Re: CodeVision AVR в вопросах и ответах

Сообщение ARM »

спс прошил уже :)))
лень и ненависть двигатель прогресса а финансовые потоки тормоз
Ответить

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