martes, 7 de octubre de 2008

Contador de 1 a f pero solo una vez

;**********************************************************************
;***** PROGRAMA QUE CUENTA DE 1 A F UNA VEZ *****
;**********************************************************************
.include"m32def.inc"
.def temp= r16

.def incr= r17

;***** TABLA DE VECTORES DE INTERRUPCION *****

.org $000 ;selección de dirección para esta inetrrupcion

rjmp RESET ;manjo de interrupción 1=RESET

.org $004
rjmp INT_1 ;manejo de interrupción 3=INT1

RESET:

ldi temp, low(RAMEND)
out SPL, temp
ldi temp, high(RAMEND)
out SPH, temp ;se configura al stack-pointer para subrutina e interrupciones
clr temp
out DDRD, temp
ser temp
out DDRB, temp
out PORTD, temp
ldi temp, 0b10000000
out GICR, temp ;se crea la mascara para interrupción externa
ldi temp, 0b00001000
out MCUCR, temp ;la interrupción se genera en el flanco positivo
sei ;habilitación del bit I en SREG
rjmp INICIO

;***** S U B R U T I N A S *****

SUBRUTINA:

; 2000000 cycles:
; -----------------------------
; delaying 1999998 cycles:
ldi R17, $12
WGLOOP0: ldi R18, $BC
WGLOOP1: ldi R19, $C4
WGLOOP2: dec R19
brne WGLOOP2
dec R18
brne WGLOOP1
dec R17
brne WGLOOP0
; -----------------------------
; delaying 2 cycles:
nop
nop
ret
; =============================
;***** INTERRUPCIONES *****
INT_1:


dec incr
rcall SUBRUTINA
out PORTB, incr
cpi incr, 0
breq fin
brne INT_1

fin:
reti
;***** P R O G R A M A P R I N C I P A L *****

INICIO:

inc incr
rcall SUBRUTINA
out PORTB, incr
cpi incr, 15
breq fina
brne INICIO

fina:
rjmp fina

No hay comentarios: