atmega16 asembler.

Saludos comunidad, bueno aqui tengo un código en asembler para atmega16 que es un frecuencimetro, pero hay una parte del código que no logro entenderla, si alguien pudiera brindarme un poco de ayuda se lo agradeceria, a continuación les dejo el código. La parte que no entiendo es la interrupción del timer1 y como esque hace el cambio a bcd... de ahí todo lo demas pues si


SOFTWARE DEL PROGRAMA PRINCIPAL IMPLEMENTADO:
.include "m16def.inc"
.def binario=r20
.def h=r21
.def dig10=r18
.def dig32=r17
.def cont=r19
.def tempo=r16
.def t0high=r22

.org 0x0
jmp inicio
.org 0x0c
jmp int_comp1a ; se genera esta interrupción cada segundo
.org 0x12
jmp int_ov0; se genera esta interrupcion cada vez que se desborde el counter0

inicio:
ldi tempo,0b00000000
out ddrb,tempo
ldi tempo,0b01111111
out ddrd,tempo
ldi tempo,0b00001111
out ddrc,tempo
ldi tempo,high(ramend); se inicializa es stack
out sph,tempo
ldi tempo,low(ramend)
out spl,tempo
clr t0high
ldi tempo,0b00000110
out tccr0,tempo ; se configura para que el counter0 detecte flancos de bajada
ldi tempo,high(15624); se carga este valor para que se genere una interrupción cada segundo
out ocr1ah,tempo
ldi tempo,low(15624); se carga este valor para que se genere una interrupción cada segundo
out ocr1al,tempo
ldi tempo,0b0000000
out tccr1a,tempo
ldi tempo,0b00001011
out tccr1b,tempo
ldi tempo,0b00010001
out timsk,tempo
sei

ser tempo
out portb,tempo
clr tempo
out sfior,tempo
lazo1: ; este es el lazo del programa principal, el barrido de displays
mov tempo,dig10
andi tempo,0b00001111
rcall bcd_7seg
sbi portc,3
out portd,tempo
cbi portc,0
rcall retardo

mov tempo,dig10
swap tempo
andi tempo,0b00001111
rcall bcd_7seg
sbi portc,0
out portd,tempo
cbi portc,1
rcall retardo

mov tempo,dig32
andi tempo,0b00001111
rcall bcd_7seg
sbi portc,1
out portd,tempo
cbi portc,2
rcall retardo

mov tempo,dig32
swap tempo
andi tempo,0b00001111
rcall bcd_7seg
sbi portc,2
out portd,tempo
cbi portc,3
rcall retardo

rjmp lazo1
retardo: ;se llama a un retardo para la correcta visualización en los displays
ldi tempo,100
lazo_ret:
dec tempo
brne lazo_ret
ret

.include "bcd_7seg.asm"; se incluye este programa para la descodificación de binario a 7segmentos

int_ov0: ; esta interrupcion lleva la cuenta de los ciclos ya que el counter se desborda
push tempo
in tempo,sreg
push tempo
inc t0high; se incrementa cada vez que el counter se desborda
pop tempo
out sreg,tempo
pop tempo
reti



int_comp1a:;esta interrupcion se genera cada segundo
push tempo
in tempo,sreg
push tempo
in binario,tcnt0
mov h,t0high
ldi cont,16
clr dig10
clr dig32
lazo:; en este lazo se procede a la conversión de binario a bcd
clc
rol binario
rol h
rol dig10
rol dig32
dec cont
breq fin
ldi tempo,0x03
add tempo,dig10
sbrc tempo,3
mov dig10,tempo
ldi tempo,0x30
add tempo,dig10
sbrc tempo,7
mov dig10,tempo
ldi tempo,0x03
add tempo,dig32
sbrc tempo,3
mov dig32,tempo
ldi tempo,0x30
add tempo,dig32
sbrc tempo,7
mov dig32,tempo
rjmp lazo
fin:
clr tempo
out tcnt0,tempo
clr t0high ; se encera el contador
out tcnt1h,tempo ; se encera el timer
out tcnt1l,tempo ; se encera el timer
pop tempo
out sreg,tempo
pop tempo
reti





SOFTWARE DEL PROGRAMA “bcd_7seg”
.cseg
bcd_7seg:
.include "m16def.inc"
push zh
push zl
ldi zl,low(tabla_bcd_7seg*2)
ldi zh,high(tabla_bcd_7seg*2)
add zl,tempo
clr tempo
adc zh,tempo
lpm tempo,z
pop zl
pop zh
ret
tabla_bcd_7seg:
.db 0b01000000,0b01111001
.db 0b00100100,0b00110000
.db 0b00011001,0b00010010
.db 0b00000010,0b01111000
.db 0b00000000,0b00010000
 
Atrás
Arriba