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

Обсуждаем контроллеры компании Atmel.
ВитГо
Вымогатель припоя
Сообщения: 680
Зарегистрирован: Ср фев 24, 2010 19:16:07

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

Сообщение ВитГо »

unalex писал(а):ну а чтоб горело как надо, задержку просто перемещу выше

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

   while(1)
   {
      LEDSTATE(LED(count), 1);
      count++;
      _delay_ms(500);
      LEDSTATE(LED(count-1), 0);
      if(count == 8) count = 0;
     
   }

угу, и получите вместо постоянно потушенного светодиода - постоянно горящий светодиод :-)

нужно добавить вторую задержку, либо переписать код чтобы инвертировать состояние бита порта...

вторая задержка:

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

   while(1)
   {
      LEDSTATE(LED(count), 1);
      count++;
      _delay_ms(500);
      LEDSTATE(LED(count-1), 0);
      if(count == 8) count = 0;
      _delay_ms(500); // вторая задержка !
   }


как инвертировать сами разберетесь ?

кстати, а обязательно count сначала инкрементировать а потом использовать уменьшенным на единицу?
может быть лучше так написать?, наверняка код при компиляции будет короче на пару байт (если конечно оптимизатор сам не исправит)

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

   while(1)
   {
      LEDSTATE(LED(count), 1);
      _delay_ms(500);
      LEDSTATE(LED(count), 0);
      _delay_ms(500); // вторая задержка !     
     
      count++;
      if(count == 8) count = 0;
   }

заодно так ИМХО нагляднее и сразу видно что и как работает...

я подобный вашему прием (ранний инкремент переменной) использовал как то на асме, но там это действительно было необходимо чтобы не вставлять лишние nop'ы задержки.. на СИ же это не нужно и будет только мешать читаемости программы
на асме это выглядело как то так (смотрите коммент выделенный !!!!)

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

LCD_PCD8544_SENDBYTE:   ;---------- отправка байта на дисплей (R16 байт)
                        push  R17
                        push  R16

                        ldi   R17 , 8     ; количество бит в байте
LCD_PCD8544_SENDBYTE_loop:
                        cbi      MOSIPORT , MOSIPIN   ; mosi=0
                        sbrc   R16 , 7
                        sbi      MOSIPORT , MOSIPIN   ; mosi=1

                        sbi      CLKPORT  , CLKPIN    ; sck=1
                        lsl      R16         ; !!!! команда реализующая задержку и одновременно "полезно" сдвигающая отправляемый байт
                        cbi      CLKPORT  , CLKPIN    ; sck=0

                        dec      R17
                        brne   LCD_PCD8544_SENDBYTE_loop

                        pop      R16
                        pop      R17
                        ret
Аватара пользователя
unalex
Мучитель микросхем
Сообщения: 424
Зарегистрирован: Сб авг 25, 2007 22:02:05
Откуда: Германия, Viernheim

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

Сообщение unalex »

с дефайнами разобрался, ну а насчет задержки вроде все правильно работает

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

int main(void)
{
   DDRA = 0xff;
   unsigned char count = 0;
   while(1)
   {
      PORTA|=(1<<(count));      //Зажигаем LED
      count++;               //Инкремент
     _delay_ms(500);         //Ждем
      PORTA&=~(1<<(count-1));   //Тушим тот же LED
     //счетчик при этом не уменьшается и в следующей итерации работает уже с новым LED
      if(count == 8) count = 0;            
   }
   return 0;
}


вроде все правильно - светодиод горит положенное время, потом тухнет, потом сразу загорается следующий и получается нормальный бегущий огонь или я чего-то упустил?
Коктейль "Рекурсивный": 20% спирта, 30% воды, 50% коктейля "Рекурсивный"...
ВитГо
Вымогатель припоя
Сообщения: 680
Зарегистрирован: Ср фев 24, 2010 19:16:07

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

Сообщение ВитГо »

unalex писал(а):вроде все правильно - светодиод горит положенное время, потом тухнет, потом сразу загорается следующий и получается нормальный бегущий огонь или я чего-то упустил?


ааа, бегущий! сорри ! я просмотрел этот момент.. посыпал свою голову пеплом и укусил себя за хвост :facepalm:
Ramzezka
Встал на лапы
Сообщения: 97
Зарегистрирован: Пт апр 30, 2010 18:24:41

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

Сообщение Ramzezka »

Добрый день. Я новичок в МК. Использую atmega8
Подскажите пожалуйста, как объявить переменную, которую будет видно из основной функции main и из обработчика прерывания по переполнению таймера?

Хочу в основной программе задавать ей значение 1 или 0, а в прерывании в зависимости от ее значения будет зажигаться или тухнуть светодиод.

_____


разобрался сам
ВитГо
Вымогатель припоя
Сообщения: 680
Зарегистрирован: Ср фев 24, 2010 19:16:07

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

Сообщение ВитГо »

ну для начала объявите глобальную переменную..
ну и возможно использовать префикс типа volatile

http://chipenable.ru/index.php/programming-avr/item/60-kak-ispolzovat-klyuchevoe-slovo-volatile.html
russo_turisto
Первый раз сказал Мяу!
Сообщения: 34
Зарегистрирован: Ср окт 07, 2009 06:45:38
Откуда: Astana KZ

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

Сообщение russo_turisto »

А как посмотреть по каким регистрам компилятор раскидывает переменные для отладки в протеусе?

И для отладки в протеусе какой лучше файл подключать? ELF или COFF
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

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

Сообщение vitalik_1984 »

russo_turisto , насколько я понял, *.elf файл содержит данные о прошивке и о фьюз битах контроллера, а *.cof содержит прошивку плюс данные исходного кода, поэтому для отладки лучше второй. Если исходный код не видно, после запуска отладки выбираем в меню отладка- >исходный код.
harrd
Первый раз сказал Мяу!
Сообщения: 37
Зарегистрирован: Ср апр 01, 2009 17:52:51

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

Сообщение harrd »

Здравствуйте, уважаемые форумчане. Вот программка с аврлаба, (http://avrlab.com/node/114) демонстрирует вывод данных на сдвиговый регистр, инкрементируя переменную и выводя её значение в порт. Прошил в attiny2313, всё работает, светодиоды на выходе регистра HC595 весело мигают, показывая в двоичном виде числа. Мне понадобилось ограничить максимальное значение выводимое на сдвиговый регистр числом 10 (от 0 до 9) Меняю значение переменной i, получается какая-то ерунда. Подскажите, что надо изменить в программе

#include <avr/io.h>

#define DATA 0
#define SCL 1
#define REC 2

void pause (unsigned int a)
{ unsigned int i;

for (i=a;i>0;i--)
;
}

void send_data (unsigned int data)
{ unsigned char i;

for (i=0;i<16;i++)
{
if ((data&0x8000)==0x00) PORTD&=~_BV(DATA); //Выставляем данные на PD0
else PORTD|=_BV(DATA);
asm("nop");
PORTD|=_BV(SCL); //Импульс на SCL
asm("nop");
PORTD&=~_BV(SCL);
asm("nop");
data=(data<<1);
}
PORTD|=_BV(REC); //Импульс на Latch clock
asm("nop");
PORTD&=~_BV(REC);
}

int main(void)
{ unsigned int data=0;
PORTD=0x00; //Первоначально выключаем выхода
DDRD=0x07; //PD0-PD2 как выхода

while (1)
{
send_data(data); //Отправить данные
data=data+1;
pause(500);
}
return 1;
}
Аватара пользователя
Goldsmith
Опытный кот
Сообщения: 736
Зарегистрирован: Пн янв 10, 2011 03:06:36
Откуда: Ростов-на-Дону
Контактная информация:

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

Сообщение Goldsmith »

harrd писал(а):Мне понадобилось ограничить максимальное значение выводимое на сдвиговый регистр числом 10 (от 0 до 9) Меняю значение переменной i, получается какая-то ерунда.
А в каком именно фрагменте Вашего кода реализовано это ограничение?

И еще большая просьба: проявляйте, пожалуйста, уважение к тем, кто читает Ваш код, форматируйте его. Компилятору все равно, он и в одну строку программу воспримет, а человеку читать такие папирусы не очень комфортно, структура не видна.
Любой дурак может писать код. Настоящий профессионал - это тот, кто способен постоянно создавать продукт высокого качества, укладываясь при этом в бюджет.
J. Ganssle
harrd
Первый раз сказал Мяу!
Сообщения: 37
Зарегистрирован: Ср апр 01, 2009 17:52:51

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

Сообщение harrd »

К сожалению, код не мой, я только его пытаюсь переделать под свои нужды. Мне кажется, реализовать ограничение можно в этом фрагменте

for (i=0;i<16;i++)
{
if ((data&0x8000)==0x00) PORTD&=~_BV(DATA); //Выставляем данные на PD0

Извините, что не отформатировал код, вставил копипастом. Учту замечание.
Аватара пользователя
Goldsmith
Опытный кот
Сообщения: 736
Зарегистрирован: Пн янв 10, 2011 03:06:36
Откуда: Ростов-на-Дону
Контактная информация:

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

Сообщение Goldsmith »

Больше похоже, что этим занимается фрагмент:

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

while (1)
{
  send_data(data); //Отправить данные
  data=data+1;
  pause(500);
}
Переменная data увеличивается в цикле на единицу, пробегая все значения по кругу. Если замените на

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

dta = (data + 1) % 10;
, то значение переменной никогда не превысит 9.

P. S. И еще замечание по поводу функции pause: задавать временные интервалы при помощи пустого цикла - не самое удачное решение. Во-первых, такие задержки сильно зависят от тактовой частоты процессора. Во-вторых, при оптимизации компилятор обнаружит, что цикл ничего не делает, и проигнорирует его. Вставьте в тело цикла хотя бы nop.
Любой дурак может писать код. Настоящий профессионал - это тот, кто способен постоянно создавать продукт высокого качества, укладываясь при этом в бюджет.
J. Ganssle
harrd
Первый раз сказал Мяу!
Сообщения: 37
Зарегистрирован: Ср апр 01, 2009 17:52:51

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

Сообщение harrd »

Goldsmith, большое спасибо. Микроконтроллеры начал изучать недавно, поэтому извините за неграмотные вопросы. Оптимизацию я отключил, в программах с циклами задержки приходится так делать, иначе задержки не работают. Наверное, есть более правильное решение этой проблемы, но я не знаю.
TICLIR
Встал на лапы
Сообщения: 134
Зарегистрирован: Вс авг 01, 2010 16:05:25

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

Сообщение TICLIR »

Добрый кому вечер,кому ночь. Есть такая тема "Atmega88_USB_new" вот на базе штуке хочется поэксперементировать с USB,
но дело в том, что на WinAVR-20100110 компилятор выдаёт сплошные ошибки. Вроде как положено создал Makefile, и настроил конфигурацию.
А вот в AVR studio компилируется без проблем, но я с ним ни когда в плотную не сталкивался. Может у кого есть исходник под именно WinAVR-20100110 дайте ссылку.Или как то можно подправить этот исходник, только я не знаю как его прикрепить.
Аватара пользователя
Kavka
Мудрый кот
Сообщения: 1810
Зарегистрирован: Чт июн 10, 2010 08:55:35
Откуда: Сибирские Афины

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

Сообщение Kavka »

Для начала, какой исходник? Ссылочку на сайт проекта дал бы. А то телепаты в отпуске. :)
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
TICLIR
Встал на лапы
Сообщения: 134
Зарегистрирован: Вс авг 01, 2010 16:05:25

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

Сообщение TICLIR »

А вот этот файл, вот пока разобрался как отправить.
Вложения
Atmega88_USB_new.rar
(66.89 КБ) 216 скачиваний
Аватара пользователя
Kavka
Мудрый кот
Сообщения: 1810
Зарегистрирован: Чт июн 10, 2010 08:55:35
Откуда: Сибирские Афины

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

Сообщение Kavka »

Если вопрос в том чтобы откомпилировать этот проект только при наличии WinAVR (из командной строки, без студии), то, при правильно установленной WinAVR (и подходящей версии оной), достаточно
1) распаковать то что в архиве
2) зайти в каталог default
3) выполнить make clean и make
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Аватара пользователя
unalex
Мучитель микросхем
Сообщения: 424
Зарегистрирован: Сб авг 25, 2007 22:02:05
Откуда: Германия, Viernheim

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

Сообщение unalex »

никаких ошитбок не выдает кроме
Symbol 'WDCE' could not be resolved main.c /Atmega88_USB_new line 22
Symbol 'WDTCSR' could not be resolved main.c /Atmega88_USB_new line 22


видимо они не прописаны в стандартных заголовочных файлах
Коктейль "Рекурсивный": 20% спирта, 30% воды, 50% коктейля "Рекурсивный"...
TICLIR
Встал на лапы
Сообщения: 134
Зарегистрирован: Вс авг 01, 2010 16:05:25

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

Сообщение TICLIR »

Вот в чём вопрос,в подходящей версии. А у меня вот эта WinAVR-20100110, а эта версия выдаёт сплошные ошибки.
\Atmega88_USB_new/main.c:101: undefined reference to `usbRxLen'
\Atmega88_USB_new/main.c:106: undefined reference to `usbTxLen1'
\Atmega88_USB_new/main.c:107: undefined reference to `usbSetInterrupt'
Аватара пользователя
Kavka
Мудрый кот
Сообщения: 1810
Зарегистрирован: Чт июн 10, 2010 08:55:35
Откуда: Сибирские Афины

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

Сообщение Kavka »

Kavka писал(а):2) зайти в каталог default
3) выполнить make clean и make
Блллин, слов нет.
Даже по подсказке не смогли сделать. :kill:
Может по картинке получиться :))
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
TICLIR
Встал на лапы
Сообщения: 134
Зарегистрирован: Вс авг 01, 2010 16:05:25

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

Сообщение TICLIR »

Kavka писал(а):Блллин, слов нет.Даже по подсказке не смогли сделать

Правельно,для меня это пустой звук, т.к. я не знаю что это и для чего надо.
Делал программки и мне это го ни когда не было надо.
Может просветите меня ссылочкой где почитать, я же не знаю что это.

А программы make clean и make почему-то у меня сами закрываются не успев открытся, почему так?
Ответить

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