.include "m328pdef.inc"
.equ DELAY_CYCLES = 1000000 ; Cantidad de ciclos para el retardo de 1 segundo
.org 0x0000
rjmp Reset
.org 0x001C
rjmp Timer1_CompA_ISR
Reset:
; Configuración de puertos
ldi r16, (1<<PB0) ; Configurar PB0 (pin 8) como salida
out DDRB, r16
; Configuración de Timer1
ldi r16, (1<<CTC1) ; Modo de comparación CTC (Clear Timer on Compare Match)
out TCCR1B, r16
ldi r16, (1<<CS12) ; Configurar prescaler a 256
out TCCR1B, r16
ldi r16, HIGH(DELAY_CYCLES)
out OCR1AH, r16
ldi r16, LOW(DELAY_CYCLES)
out OCR1AL, r16
; Habilitar interrupciones globales
sei
MainLoop:
rjmp MainLoop
Timer1_CompA_ISR:
; Contador de 00 a 99 y viceversa
ldi r16, 99 ; Inicializar r16 en 99
ldi r17, 0 ; Inicializar r17 en 0
CountLoop:
out PORTB, r16 ; Mostrar contador en el puerto B
call Delay ; Llamar a la función de retardo
dec r16 ; Decrementar r16
brne CountLoop ; Repetir si r16 no es cero
mov r16, r17 ; Intercambiar r16 y r17
mov r17, r16
reti ; Retorno de la interrupción
Delay:
; Retardo aproximado de 1 segundo usando bucle
ldi r18, 10
OuterLoop:
ldi r19, 20
InnerLoop:
dec r19
brne InnerLoop
dec r18
brne OuterLoop
ret
.end