Страница 1 из 1
Ошибка, таймер, AtMega8A
Добавлено: Сб авг 04, 2012 05:00:29
kras
Код: Выделить всё
.include "m8adef.inc"
.device ATmega8a
.equ K_div = 250
.def rK_div = r16
start:
rjmp Reset
.org $006
rjmp TIM0
.org $00C
TIM0:
inc r17
sbrs r17,0
sbr r18,0b01000000
sbrc r17,0
cbr r18,0b01000000
out PortD,r18
out TCNT0,rK_div
reti
Reset:
ldi r18,low(RAMEND)
out SPL,r18
ldi r18,0b01000000
out DDRD,r18
clr r17
clr r18
ldi r18,(1<<TOIE0)
out TIMSK,r18
ldi rK_div,K_div
neg rK_div
out TCNT0,rK_div
ldi r18,0b00000010
out TCCR0,r18
sei
cy:
rjmp cy
Списал код с Ревич ЮВ Практическое программирование мк... Кое-что понял, но с прерываниями я слабо дружу. Код заработал в другой вариации, но только на дебагере AVR Studio. Я хочу понять, как работает код и почему счетчик не запускается сейчас. Зачем нужен цикл cy? На нем циклит, а логики не понимаю.
Re: Ошибка, таймер, AtMega8A
Добавлено: Сб авг 04, 2012 08:13:17
ctpexhih
Цикл су - это бесконечный цикл, в котором выполняется основная программа мк. Если не сделать бесконечный цикл, то контроллер пройдет программу один раз, и остановится, поможет только его сброс (питанием или сброс по входу reset).
Re: Ошибка, таймер, AtMega8A
Добавлено: Сб авг 04, 2012 08:39:09
Flasher
ctpexhih писал(а):...контроллер пройдет программу один раз, и остановится, поможет только его сброс (питанием или сброс по входу reset).
Контроллер никогда не останавливается. За пределами написанной программы во FLASHe находится куча FF ? которые будут интерпретироваться как инструкции. Затем произойдет переполнение адресного счетчика и контроллер начнет выполнять код с 0 адреса.
Re: Ошибка, таймер, AtMega8A
Добавлено: Вс авг 05, 2012 09:13:49
kras
Все-равно не могу найти ошибку
Re: Ошибка, таймер, AtMega8A
Добавлено: Пн авг 06, 2012 06:36:10
kras
Ок, тогда дайте что-нибудь простое и работающее на таймере
Re: Ошибка, таймер, AtMega8A
Добавлено: Пн авг 06, 2012 07:11:31
akl
Здравствуйте. Попробуйте привести в соответствие адреса прерываний
Re: Ошибка, таймер, AtMega8A
Добавлено: Пн авг 06, 2012 12:50:00
kras
Попробовал, в том числе исправил адрес 00С на 009, но пока не получается. Короче как я понял, само собой, я не понял: после запуска таймера начинает выполняться другая программа, расположенная по адресу. После выдачи таймером сигнала окончания счета происходит переход к основной программе. А как поконкретнее, почему у меня таймер не запускается? Это же происходит после метки Reset? Или как написать самый простой код?
Re: Ошибка, таймер, AtMega8A
Добавлено: Пн авг 06, 2012 14:04:16
akl
Вроде должен работать. Запустил код в 4-й студии. Транслятор дал предупреждение о неустановленном стеке. Установил старшую часть стека. Посмотрите
Код: Выделить всё
.include "m8adef.inc"
.device ATmega8a
.equ K_div = 250
.def rK_div = r16
start:
rjmp Reset
;.org $006
;rjmp TIM0
.org $009
;.org $00C
TIM0:
;inc r17
;sbrs r17,0
;sbr r18,0b01000000
;sbrc r17,0
;cbr r18,0b01000000
;out PortD,r18
IN R18,PIND
EOR R18,R19
OUT PORTD,R18
out TCNT0,rK_div
reti
Reset:
ldi r18,low(RAMEND)
out SPL,r18
LDI R20,HIGH(RAMEND)
OUT SPH,R20
ldi r18,0b01000000
out DDRD,r18
clr r17
;clr r18
ldi r18,(1<<TOIE0)
out TIMSK,r18
ldi rK_div,K_div
neg rK_div
out TCNT0,rK_div
;ldi r18,0b00000010 ; длительность 1 и 0 по 500мкс при Fclk=4МГц
ldi r18,0b00000101 ; длительность 1 и 0 по 64мс при Fclk=4МГц
out TCCR0,r18
LDI R19,0b01000000
sei
cy:
rjmp cy
Re: Ошибка, таймер, AtMega8A
Добавлено: Пн авг 06, 2012 15:47:00
kras
ОО, а у меня все-равно не работает. Может я чего не понимаю? Вот, ничего не меняю:
Код: Выделить всё
.include "m8adef.inc"
.device ATmega8a
.equ K_div = 250
.def rK_div = r16
start:
rjmp Reset
;.org $006
;rjmp TIM0
.org $009
;.org $00C
TIM0:
;inc r17
;sbrs r17,0
;sbr r18,0b01000000
;sbrc r17,0
;cbr r18,0b01000000
;out PortD,r18
IN R18,PIND
EOR R18,R19
OUT PORTD,R18
out TCNT0,rK_div
reti
Reset:
ldi r18,low(RAMEND)
out SPL,r18
LDI R20,HIGH(RAMEND)
OUT SPH,R20
ldi r18,0b01000000
out DDRD,r18
clr r17
;clr r18
ldi r18,(1<<TOIE0)
out TIMSK,r18
ldi rK_div,K_div
neg rK_div
out TCNT0,rK_div
;ldi r18,0b00000010 ; длительность 1 и 0 по 500мкс при Fclk=4МГц
ldi r18,0b00000101 ; длительность 1 и 0 по 64мс при Fclk=4МГц
out TCCR0,r18
LDI R19,0b01000000
sei
cy:
rjmp cy
Отдаживаю: первый jump на Reset, затем проходит 17циклов по 17кмс (тактовая частота 1МГц). В итоге все замыкается на цикле cy. Все, больше ничего!:(
Re: Ошибка, таймер, AtMega8A
Добавлено: Пн авг 06, 2012 16:50:41
akl
TEST_TIME0.rar
Вот картинки работы студии
1-начальное состояние после установок
2-после первого переполнения таймера
3-после второго переполнения
Далее состояние PD6 меняется каждый раз на противоположное.
Re: Ошибка, таймер, AtMega8A
Добавлено: Вт авг 07, 2012 08:14:23
kras
Во, ок, тогда где происходит переход на TIM0? У меня этого перехода нет, после всего сразу идет вечный пустой цикл.
УРА, врубился, что цикл не вечный, спасибо!