Ошибка, таймер, AtMega8A

Здесь принимаются все самые невообразимые вопросы... Главное - не стесняйтесь. Поверьте, у нас поначалу вопросы были еще глупее :)
Ответить
kras
Опытный кот
Сообщения: 782
Зарегистрирован: Вт апр 26, 2011 18:37:06

Ошибка, таймер, AtMega8A

Сообщение 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? На нем циклит, а логики не понимаю.
На практике можно не успеть сделать того, что можно хорошо обосновать в теории. Но без практики теория может отдаляться от нее, и когда они встретятся снова - не узнает даже неприкосновенное шампанское профессора в лаборатории. Моя практика: robofeya.ru
Реклама
ctpexhih
Встал на лапы
Сообщения: 119
Зарегистрирован: Пн окт 05, 2009 20:01:20

Re: Ошибка, таймер, AtMega8A

Сообщение ctpexhih »

Цикл су - это бесконечный цикл, в котором выполняется основная программа мк. Если не сделать бесконечный цикл, то контроллер пройдет программу один раз, и остановится, поможет только его сброс (питанием или сброс по входу reset).
Реклама
Аватара пользователя
Flasher
Мудрый кот
Сообщения: 1802
Зарегистрирован: Ср сен 07, 2011 21:40:30

Re: Ошибка, таймер, AtMega8A

Сообщение Flasher »

ctpexhih писал(а):...контроллер пройдет программу один раз, и остановится, поможет только его сброс (питанием или сброс по входу reset).
Контроллер никогда не останавливается. За пределами написанной программы во FLASHe находится куча FF ? которые будут интерпретироваться как инструкции. Затем произойдет переполнение адресного счетчика и контроллер начнет выполнять код с 0 адреса.
kras
Опытный кот
Сообщения: 782
Зарегистрирован: Вт апр 26, 2011 18:37:06

Re: Ошибка, таймер, AtMega8A

Сообщение kras »

Все-равно не могу найти ошибку
На практике можно не успеть сделать того, что можно хорошо обосновать в теории. Но без практики теория может отдаляться от нее, и когда они встретятся снова - не узнает даже неприкосновенное шампанское профессора в лаборатории. Моя практика: robofeya.ru
Реклама
Эиком - электронные компоненты и радиодетали
kras
Опытный кот
Сообщения: 782
Зарегистрирован: Вт апр 26, 2011 18:37:06

Re: Ошибка, таймер, AtMega8A

Сообщение kras »

Ок, тогда дайте что-нибудь простое и работающее на таймере
На практике можно не успеть сделать того, что можно хорошо обосновать в теории. Но без практики теория может отдаляться от нее, и когда они встретятся снова - не узнает даже неприкосновенное шампанское профессора в лаборатории. Моя практика: robofeya.ru
Реклама
akl
Друг Кота
Сообщения: 4445
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Re: Ошибка, таймер, AtMega8A

Сообщение akl »

Здравствуйте. Попробуйте привести в соответствие адреса прерываний
Реклама
kras
Опытный кот
Сообщения: 782
Зарегистрирован: Вт апр 26, 2011 18:37:06

Re: Ошибка, таймер, AtMega8A

Сообщение kras »

Попробовал, в том числе исправил адрес 00С на 009, но пока не получается. Короче как я понял, само собой, я не понял: после запуска таймера начинает выполняться другая программа, расположенная по адресу. После выдачи таймером сигнала окончания счета происходит переход к основной программе. А как поконкретнее, почему у меня таймер не запускается? Это же происходит после метки Reset? Или как написать самый простой код?
На практике можно не успеть сделать того, что можно хорошо обосновать в теории. Но без практики теория может отдаляться от нее, и когда они встретятся снова - не узнает даже неприкосновенное шампанское профессора в лаборатории. Моя практика: robofeya.ru
akl
Друг Кота
Сообщения: 4445
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Re: Ошибка, таймер, AtMega8A

Сообщение 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
kras
Опытный кот
Сообщения: 782
Зарегистрирован: Вт апр 26, 2011 18:37:06

Re: Ошибка, таймер, AtMega8A

Сообщение 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. Все, больше ничего!:(
На практике можно не успеть сделать того, что можно хорошо обосновать в теории. Но без практики теория может отдаляться от нее, и когда они встретятся снова - не узнает даже неприкосновенное шампанское профессора в лаборатории. Моя практика: robofeya.ru
akl
Друг Кота
Сообщения: 4445
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Re: Ошибка, таймер, AtMega8A

Сообщение akl »

TEST_TIME0.rar
Вот картинки работы студии
1-начальное состояние после установок
2-после первого переполнения таймера
3-после второго переполнения
Далее состояние PD6 меняется каждый раз на противоположное.
kras
Опытный кот
Сообщения: 782
Зарегистрирован: Вт апр 26, 2011 18:37:06

Re: Ошибка, таймер, AtMega8A

Сообщение kras »

Во, ок, тогда где происходит переход на TIM0? У меня этого перехода нет, после всего сразу идет вечный пустой цикл.
УРА, врубился, что цикл не вечный, спасибо!
На практике можно не успеть сделать того, что можно хорошо обосновать в теории. Но без практики теория может отдаляться от нее, и когда они встретятся снова - не узнает даже неприкосновенное шампанское профессора в лаборатории. Моя практика: robofeya.ru
Ответить

Вернуться в «Теория»