atmega32 прерывание по таймеру

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Аватара пользователя
Cat
Электрический кот
Сообщения: 1087
Зарегистрирован: Вт май 05, 2009 10:43:42
Откуда: Россия
Контактная информация:

Re: atmega32 прерывание по таймеру

Сообщение Cat »

Я уж не "начинаю", давно пишу. Что поделать, я дитя CVAVR :))) , сейчас уже себя переучить не могу, да и как-то так не испытываю напрягов.

Хотелось бы видеть блок-схему, составлял ли ее автор топика? Именно с нее должна начинаться любая программа сложнее "помигать светодиодом"

Повторю вопрос: какое ТЗ?
Боевой ватник.
Реклама
Аватара пользователя
Engineer_Keen
Друг Кота
Сообщения: 3872
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Re: atmega32 прерывание по таймеру

Сообщение Engineer_Keen »

ploop писал(а):Да ладно, сам когда начинал писал битами.
Я думаю 90% так начинали (я тоже), пока им тут (или еще где) мозги не вправили :)))
Что касается проги, то во-первых при компиляции вылезает варнинг:
warning: 'TIMER0_COMPA_vect' appears to be a misspelled signal handler
Во-вторых, вот что получается в районе asm("sei"), т.е. прям перед while в майн:

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

SEI
LDI R24,$0D
CALL $00C2
Т.е вместо вызова lcd_com(0x0D), прога переходит на вектор обработчика как раз TIMER0_COMPA_vect...
А, нет, стоп, не ту кнопку для трассировки нажал... Функция cd_com(0x0D) выполняется, как раз во время нее случается TIMER0_COMPA_vect, а раз она "appears to be a misspelled", вместо нее стоит заглушка и переход на 0, т.е. ресет. Короче вектор надо правильно обозвать и все заработает. У нулевого таймера 1 OCR, так что надо писать TIMER0_COMP_vect.
Последний раз редактировалось Engineer_Keen Чт мар 22, 2012 15:03:54, всего редактировалось 1 раз.
Реклама
Аватара пользователя
okmonster
Первый раз сказал Мяу!
Сообщения: 24
Зарегистрирован: Сб мар 10, 2012 11:29:53

Re: atmega32 прерывание по таймеру

Сообщение okmonster »

Cat писал(а):Я уж не "начинаю", давно пишу. Что поделать, я дитя CVAVR :))) , сейчас уже себя переучить не могу, да и как-то так не испытываю напрягов.

Хотелось бы видеть блок-схему, составлял ли ее автор топика? Именно с нее должна начинаться любая программа сложнее "помигать светодиодом"

Повторю вопрос: какое ТЗ?

я же обьяснил у меня есть две функции которые нужно запускать с определеной частотой
для чего я и хочу использовать таймеры!
какая блок схема тут. просто помогите запустить 0 таймер, ибо он отказывается работать
если запускаю первый такмер то все четко а запускаю нулевый таймер то ничего хорошего не получается
и одновременно тоже
Аватара пользователя
okmonster
Первый раз сказал Мяу!
Сообщения: 24
Зарегистрирован: Сб мар 10, 2012 11:29:53

Re: atmega32 прерывание по таймеру

Сообщение okmonster »

Engineer_Keen писал(а):
ploop писал(а):Да ладно, сам когда начинал писал битами.
Я думаю 90% так начинали (я тоже), пока им тут (или еще где) мозги не вправили :)))
Что касается проги, то во-первых при компиляции вылезает варнинг:
warning: 'TIMER0_COMPA_vect' appears to be a misspelled signal handler
Во-вторых, вот что получается в районе asm("sei"), т.е. прям перед while в майн:

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

SEI
LDI R24,$0D
CALL $00C2
Т.е вместо вызова lcd_com(0x0D), прога переходит на вектор обработчика как раз TIMER0_COMPA_vect...
А, нет, стоп, не ту кнопку для трассировки нажал... Функция cd_com(0x0D) выполняется, как раз во время нее случается TIMER0_COMPA_vect, а раз она "appears to be a misspelled", вместо нее стоит заглушка и переход на 0, т.е. ресет. Короче вектор надо правильно обозвать и все заработает.

и что это значит?(
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
Engineer_Keen
Друг Кота
Сообщения: 3872
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Re: atmega32 прерывание по таймеру

Сообщение Engineer_Keen »

А что у вас варниниги при компиляции не вылезали? Переименовываем TIMER0_COMPA_vect в TIMER0_COMP_vect и все должно работать.
Реклама
Аватара пользователя
okmonster
Первый раз сказал Мяу!
Сообщения: 24
Зарегистрирован: Сб мар 10, 2012 11:29:53

Re: atmega32 прерывание по таймеру

Сообщение okmonster »

Engineer_Keen писал(а):А что у вас варниниги при компиляции не вылезали? Переименовываем TIMER0_COMPA_vect в TIMER0_COMP_vect и все должно работать.
нет, все хорошо пишет
Реклама
Аватара пользователя
Cat
Электрический кот
Сообщения: 1087
Зарегистрирован: Вт май 05, 2009 10:43:42
Откуда: Россия
Контактная информация:

Re: atmega32 прерывание по таймеру

Сообщение Cat »

Почему TCNT1=0x00; ? Разве счетчик таймера 1 не 16-битный, и в данном случае регистр TCNT1 не разбит на TCNT1H TCNT1L, к которым доступ осуществляется путем двух действий?
Боевой ватник.
Аватара пользователя
okmonster
Первый раз сказал Мяу!
Сообщения: 24
Зарегистрирован: Сб мар 10, 2012 11:29:53

Re: atmega32 прерывание по таймеру

Сообщение okmonster »

Cat писал(а):Почему TCNT1=0x00; ? Разве счетчик таймера 1 не 16-битный, и в данном случае регистр TCNT1 не разбит на TCNT1H TCNT1L, к которым доступ осуществляется путем двух действий?
вроде бы 16
но TCNT1=0x00; понятия не имею почему
Аватара пользователя
Cat
Электрический кот
Сообщения: 1087
Зарегистрирован: Вт май 05, 2009 10:43:42
Откуда: Россия
Контактная информация:

Re: atmega32 прерывание по таймеру

Сообщение Cat »

Тогда идем в хидеры вашего компилятора и смотрим как осуществлен доступ к данному регистру. Что за компилятор?
Боевой ватник.
Аватара пользователя
okmonster
Первый раз сказал Мяу!
Сообщения: 24
Зарегистрирован: Сб мар 10, 2012 11:29:53

Re: atmega32 прерывание по таймеру

Сообщение okmonster »

Engineer_Keen писал(а):А что у вас варниниги при компиляции не вылезали? Переименовываем TIMER0_COMPA_vect в TIMER0_COMP_vect и все должно работать.
исправил
теперь в proteus куча ероров
Аватара пользователя
Engineer_Keen
Друг Кота
Сообщения: 3872
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Re: atmega32 прерывание по таймеру

Сообщение Engineer_Keen »

okmonster писал(а):нет, все хорошо пишет
Странно, ну все равно переименуйте :dont_know:
Какие ерроры? Что пишет?
Cat писал(а):Почему TCNT1=0x00; ? Разве счетчик таймера 1 не 16-битный, и в данном случае регистр TCNT1 не разбит на TCNT1H TCNT1L, к которым доступ осуществляется путем двух действий?
Так какая разница, писать TCNT1=0x00 или TCNT1=0x0000, думаю компилятор сам в нужной последовательности загрузит нули в L и H или нет?
Аватара пользователя
okmonster
Первый раз сказал Мяу!
Сообщения: 24
Зарегистрирован: Сб мар 10, 2012 11:29:53

Re: atmega32 прерывание по таймеру

Сообщение okmonster »

Cat писал(а):Тогда идем в хидеры вашего компилятора и смотрим как осуществлен доступ к данному регистру. Что за компилятор?
avr studio 5
Аватара пользователя
okmonster
Первый раз сказал Мяу!
Сообщения: 24
Зарегистрирован: Сб мар 10, 2012 11:29:53

Re: atmega32 прерывание по таймеру

Сообщение okmonster »

ероры не скопировать! протеус не дает такой возможности
Аватара пользователя
Engineer_Keen
Друг Кота
Сообщения: 3872
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Re: atmega32 прерывание по таймеру

Сообщение Engineer_Keen »

Ну так перепишите или сфоткайте..
Аватара пользователя
okmonster
Первый раз сказал Мяу!
Сообщения: 24
Зарегистрирован: Сб мар 10, 2012 11:29:53

Re: atmega32 прерывание по таймеру

Сообщение okmonster »

вот
Вложения
123.jpg
(98.2 КБ) 183 скачивания
Аватара пользователя
Cat
Электрический кот
Сообщения: 1087
Зарегистрирован: Вт май 05, 2009 10:43:42
Откуда: Россия
Контактная информация:

Re: atmega32 прерывание по таймеру

Сообщение Cat »

Engineer_Keen писал(а): Так какая разница, писать TCNT1=0x00 или TCNT1=0x0000, думаю компилятор сам в нужной последовательности загрузит нули в L и H или нет?
Ассемблерный код из даташита:
out TCNT1H,r17
out TCNT1L,r16


В таблице регистров, TCNT1L и H имеют разные адреса, выводы соответствующие- На Си тоже бы надо писать в каждый по отдельности.
Боевой ватник.
Аватара пользователя
Engineer_Keen
Друг Кота
Сообщения: 3872
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Re: atmega32 прерывание по таймеру

Сообщение Engineer_Keen »

К компилятору (по крайней мере мой WinAVR) нет претензий:

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

;самая первая команда после JMP:
CLR R1 
[...]
;в коде где стоит TCNT1=0x00:
OUT $2D,R1
OUT $2C,R1
Если помните наизусть таблицу регистров это как раз TCNT1H и TCNT1L, так что все ок...

Че-то он там с памятью намудрил, может компилятор глючный... У меня таких ошибок нету. Прерывания вызываются одно через 5-6мс, второе через 1с.
Аватара пользователя
Cat
Электрический кот
Сообщения: 1087
Зарегистрирован: Вт май 05, 2009 10:43:42
Откуда: Россия
Контактная информация:

Re: atmega32 прерывание по таймеру

Сообщение Cat »

Да, все верно:

$2D ($4D) TCNT1H Timer/Counter1 – Counter Register High Byte 116
$2C ($4C) TCNT1L Timer/Counter1 – Counter Register Low Byte

Может и вправду компилятор. У меня как-то на заре были просто фееричные глюки, куча ошибок при компиляции, причем причина оказалась вовсе не в том, что писал компилятор, я просто "задефайнил" зарезервированное слово. :)))
Engineer_Keen писал(а): Если помните наизусть таблицу регистров это как раз TCNT1H и TCNT1L, так что все ок...
Тонкая подколка зачтена! :beer:
Боевой ватник.
Аватара пользователя
okmonster
Первый раз сказал Мяу!
Сообщения: 24
Зарегистрирован: Сб мар 10, 2012 11:29:53

Re: atmega32 прерывание по таймеру

Сообщение okmonster »

в общем что получилось( в протеусе запускаешь проходит пару секунд и ерор выпадает потом опять работает некоторое время и ерор выпадает
вместе перезапускается мейн

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

с чем это связано?
Аватара пользователя
okmonster
Первый раз сказал Мяу!
Сообщения: 24
Зарегистрирован: Сб мар 10, 2012 11:29:53

Re: atmega32 прерывание по таймеру

Сообщение okmonster »

вот файлы
Вложения
курсовой практикум.rar
(222.85 КБ) 439 скачиваний
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»