Уже неделю борюсь с WinAVR, много проблем разрешил, но эта - Не изменяется ГЛОБАЛЬНАЯ ПЕРЕМЕННАЯ в обработчике прерывания!!!!!! Компилятор WinAVR. МС - Attiny2313
/*********** cpu clock speed if not defined ****************************************/ #ifndef F_CPU #define F_CPU 4000000//Hz #endif
/*********** set desired baud rate *************************************************/ #define BAUDRATE 19200 //bod //calculate UBRR value #define UBRRVAL ((F_CPU/(BAUDRATE*16UL))-1) //UBRVAL - Индекс скорости
И что наблюдается на светодиодах при отправке чего-то на МК?
Добавлено спустя 1 минуту 44 секунды: Первое, что напрашивается - поменять в программе местами красный и желтый светодиоды, проверить что оно вообще работает, а то может светодиод криво подключен красный
=DeaD= писал(а):И что наблюдается на светодиодах при отправке чего-то на МК?
Добавлено спустя 1 минуту 44 секунды: Первое, что напрашивается - поменять в программе местами красный и желтый светодиоды, проверить что оно вообще работает, а то может светодиод криво подключен красный
леды подключены верно, при отправке символа на уарт, зелёный мигает один раз(как и задумано) и программа поехала дальше (желтый мигает). Если в прерывании отослать обратно символ, например предварительно его ++, то всё получается...
avr123.nm.ru писал(а):В "Си для МК" - avr123.nm.ru/05.htm - рекомендую объявлять переменные изменяемые в прерывании с модификатором:
volatile int a=0;
хм.. не пробывал, не знаю такого модификатора. гдето по подробнее про него узнать можно? (не считая поиска)))
Добавлено спустя 3 минуты 46 секунд: По идее моя конструкция не должна работать.... ведь при прерывании записываются все регистры.... а потом восстанавливаются. т.е. если до прерывания А=0; то и после, влюбом случае, 'А' должна быть =0 ......
=DeaD= писал(а):А если зелёным мигать только если а!=0?
Добавлено спустя 3 минуты 4 секунды: И в основном цикле тоже мигать красным не столько, сколько в "а" лежит, а просто мигать 1 раз, если а!=0.
(везде читать не "а", а "chr_cntr")
если "а" не равно 0 - то фига с маслом.... т.е. а попрежнему ноль.
Мне не понятно, как подобные конструкции работают у других, как например множество примеров по заполнению буфера (buf) символами, когда buf обьявлен глобально как массив... Правда большинство примеров делалось на CVAVR, возможно он "за кадром" чтото делает с переменной buf (например volatile (ещё не пробывал)). Но использования данног компилятора не нахожу выходом из проблемы, люблю когда всё на виду и логично. ...вот тут-то и напрашивается ассемблер, только он мне не нравится.
да... я заметил, что после целого дня за компом, я думаю медленнее чем мой контроллер)))) Я этот курс раза три прочитал, ща ещё попробую.
=DeaD= писал(а):А зелёным щас мигает если а!=0?
(я уже спать, у нас 2 ночи )
чтото я запутался вообще... не мигает. а=0
Нашел -
volatile - ставьте если нужно предотвратить возможность повреждения содержимого переменной в прерывании, и не позволить компилятору попытаться выкинуть её при оптимизации кода.
Попробую на эмуляторе, сам МК на работе, к компу с ЛПТ подключен, до усб программера руки не доходят.
volatile - ставьте если нужно предотвратить возможность повреждения содержимого переменной в прерывании, и не позволить компилятору попытаться выкинуть её при оптимизации кода.
Руководство по WinAVR есть в папке C:\WinAVR-20081124rc3\doc\avr-libc
avr-libc-user-manual.pdf - там пример как раз про - volatile int