Обсуждаем контроллеры компании Atmel.
Ответить

Re: ATmega8 . Таймер .Бегущий огонь .

Сб мар 09, 2013 20:07:59


Спасибо большое за ответ !
пользуюсь AVRStudio 4 . моделирую схемы в Proteus .
Отпишусь о результатах позже .


При моделировании программа запускаетcя через время равное времени задержки по таймеру , дальше выполняется тело программы ( бегущие огни ) , т.е. сначала выполняется задержка по таймеру , потом обработчик прерываний ( до бесконечности ) .
Программа не выходит из обработчика прерываний .
Последний раз редактировалось RossiaForever Сб мар 09, 2013 21:33:10, всего редактировалось 1 раз.

Re: ATmega8 . Таймер .Бегущий огонь .

Сб мар 09, 2013 21:32:12

RossiaForever писал(а):При моделировании программа запускаетcя через время равное времени задержки по таймеру , дальше выполняется тело программы ( бегущие огни ) , т.е. сначала выполняется задержка по таймеру , потом обработчик прерываний ( до бесконечности ) .
Программа не выходит из обработчика прерываний .


Есть версия , что команда reti ( выход из прерывания ) не выполняется из-за того что перед ней стоит команда rjmp Shift , иными словами в обработчике прерывания у нас еще один бесконечный цикл ( Shift - rjmp Shift ) , из-за которого программа не доходит до выхода из прерывания .

Код:
Init: Ldi Temp1 , 0b00000001 ; начало тела программы
Shift :
cpi Temp1,0b10000000
breq Init
lsl Temp1
;********************************************
   OUT   PORTD,TEMP1
;********************************************
rjmp Shift  ; конец тела программы

reti

Re: ATmega8 . Таймер .Бегущий огонь .

Вс мар 10, 2013 11:13:49

Осталось самое сложное , отладить программу .
Дело вот в чем : посчитанное время задержки и время при моделировании различаются , т.е. в ниже приведенной программе при 4 МГц ( а при 8 МГц еще меньше ) я посчитал время задержки примерно 0,1 с , а при моделировании это время составляет чуть меньше 1 с .
Так же при отладке в AVRStudio 4 показывает частоту 4 МГц .
В чем может быть причина ? Заранее спасибо !!!

Код:
.include "m8def.inc"
.def     Temp=R16
.def     Temp1=R17
.def     Count_Time=R18
.org 0
.cseg

 rjmp _Reset

;----------

; ***** ВЕКТОРА ПРЕРЫВАНИЙ *****
.org $0001
rjmp INT_0
.org $0009
   RJMP   TIM0
;rjmp Timer0_OVF0

INT_0:
;Timer0_OVF0:
reti
;*******************************************

;----------

; ***** ИНИЦИАЛИЗАЦИЯ *****

_Reset:

Ldi Temp1 , 0b00000001
 
ldi Count_Time, 255

ldi Temp,0b11111111 ; настройка порта D на выход
out DDRD,Temp
 
 LDI R16,Low(RAMEND)
 OUT SPL,R16
 LDI R16,High(RAMEND) ; установка указателя стека   для стека можно и так
 OUT SPh,R16         

; LDI R16,High(RAMEND)
; OUT SPH,R16
; LDI R16,Low(RAMEND) ; установка указателя стека   
; OUT SPL,R16         
;*******************************************************
ldi Temp,0b00000001   ;разрешить прерывание по переполнению
out TIMSK,Temp

;ldi Temp,0b00000010   ;????????????????разрешить прерывание по переполнению
;out TIMSK,Temp
;*******************************************************
ldi Temp,0b00000010  ;тактовый сигнал = CK/8
out TCCR0,Temp

 sei                   ;разрешить прерывания

;----------

; ***** ОСНОВНОЙ ЦИКЛ *****

Inf:      rjmp Inf              ;бесконечный цикл

;----------

; ***** ОБРАБОТЧИК ПРЕРЫВАНИЯ ТАЙМЕРА *****

TIM0:
ldi Temp,0            ;обнуление таймера
out TCNT0,Temp
dec Count_Time ; регистр для отсчета прерываний
cpi Count_Time,0b00000000
breq end_timer
reti
end_timer:

cpi Temp1,0b10000000 ; начало тела программы
breq Init
lsl Temp1
rjmp Output
Init:Ldi Temp1 , 0b00000001
;********************************************
Output:OUT   PORTD,TEMP1
;********************************************
  ; конец тела программы

reti

Ответить