Atmega и Proteus
Добавлено: Вт май 30, 2017 17:56:19
Всем привет. В общем есть простая мигалка по переполнению нулевого таймера. ATmega328. В АВР студии все прекрасно работает, в протеусе-0 реакции. Либо протеус тупит, либо я не настроил в нем что-то, так как собрал в железе и прошил - все работает замечательно. Файлы исходника, прошивки и протеуса прилагаю.
Добавлено after 4 hours 41 minute 41 second:
Все разобрался. Я неправильно сбрасывал счетчик предделителя. Перечитал Евстифеева. Для обнуления предделителя достаточно выставить бит PSRSYNC в регистре GTCCR, обнуляется он сам на след. такте, а я выставлял бит TSM, который хоть и обнуляется сам, но его все равно нужно в 0 выставлять для запуска. Для останова нужно выставить ОБА!!! бита в 1, а для запуска выставить их опять в 0. Прикол в другом, почему это в железа работало? странно. но нужно это запомнить.
так что инициализацию можно сделать так:
; настройка таймера Т0
; инизиализация предделителя на 1024
ldi r16, 0b00000101
out TCCR0B, r16
;разрешаем превывания по переполнению таймера
ldi r16, 1<<TOIE0
sts TIMSK0, r16
; обнуляем предделитель и разрешаем глобально прерывания
ldi r16, 1<<PSRSYNC
out GTCCR, r16
sei
clr r16
Добавлено after 4 hours 41 minute 41 second:
Все разобрался. Я неправильно сбрасывал счетчик предделителя. Перечитал Евстифеева. Для обнуления предделителя достаточно выставить бит PSRSYNC в регистре GTCCR, обнуляется он сам на след. такте, а я выставлял бит TSM, который хоть и обнуляется сам, но его все равно нужно в 0 выставлять для запуска. Для останова нужно выставить ОБА!!! бита в 1, а для запуска выставить их опять в 0. Прикол в другом, почему это в железа работало? странно. но нужно это запомнить.
так что инициализацию можно сделать так:
; настройка таймера Т0
; инизиализация предделителя на 1024
ldi r16, 0b00000101
out TCCR0B, r16
;разрешаем превывания по переполнению таймера
ldi r16, 1<<TOIE0
sts TIMSK0, r16
; обнуляем предделитель и разрешаем глобально прерывания
ldi r16, 1<<PSRSYNC
out GTCCR, r16
sei
clr r16