Hola a todos,
Ultimamente me ha dado por re-aprender a programar AVR's pero tengo un pequeño problema con el Watchdog timer, el programa parece correr bien en el simulador (AVR Studio), pero a la hora de correrlo sobre el micro simplemente parece no hacer nada, les pongo un programa sencillo con el mismo problema para hacerlo un poquita mas facil de explicar.
El programa en si se supone que pone en 1 todos los pines del puerto B por un segundo hasta que se activa la interrupcion del desbordamiento del watchdog timer y luego pone a 0 por un segundo hasta que vuelve la interrupcion en un ciclo infinito.
Por favor, podria alguien decirme en donde esta mi error?
P.D. El fusible WDTON esta activo.
.include "C:\VMLAB\include\m88def.inc"
reset:
rjmp start
reti ; Addr $01
reti ; Addr $02
reti ; Addr $03
reti ; Addr $04
reti ; Addr $05
rjmp wdt_int ; Addr $06 Use 'rjmp myVector'
reti ; Addr $07 to define a interrupt vector
reti ; Addr $08
reti ; Addr $09
reti ; Addr $0A
reti ; Addr $0B This is just an example
reti ; Addr $0C Not all MCUs have the same
reti ; Addr $0D number of interrupt vectors
reti ; Addr $0E
reti ; Addr $0F
reti ; Addr $10
start:
ldi r18,0x00
;================Set watchdog timer en interrupt mode================
cli
in r16,MCUSR ;Clear WDRF en MCUSR
ANDI r16,(0xFF & (0 << WDRF))
out MCUSR,r16
LDI r16,0x18
LDI r17,0x46
STS WDTCSR,r16 ;preparando el registro para el cambio cuatro
;ciclos a partir de aqui
STS WDTCSR,r17 ;seteando el registro
sei
ser r16
out ddrb,r16 ;configura puerto b como salida
ldi r17,0x61
wdr
sts 0x60,r17 ;habilitar watchdog timer con preescalar 1024
sei
clr r16
out portb,r16
loop:
nop
rjmp loop
wdt_int:
SBRS r16,1 ;Brinca si bit 1 en r16 = 1
ldi r17,0xFF ;carga r17 con FF
SBRC r16,1 ;brinca si bit 1 en r16 = 0
ldi r17,0x00 ;carga r17 con 00
MOV r16,r17 ;carga r16 en r17
out portb,r16 ;saca r16 a puerto
wdr
reti
Ultimamente me ha dado por re-aprender a programar AVR's pero tengo un pequeño problema con el Watchdog timer, el programa parece correr bien en el simulador (AVR Studio), pero a la hora de correrlo sobre el micro simplemente parece no hacer nada, les pongo un programa sencillo con el mismo problema para hacerlo un poquita mas facil de explicar.
El programa en si se supone que pone en 1 todos los pines del puerto B por un segundo hasta que se activa la interrupcion del desbordamiento del watchdog timer y luego pone a 0 por un segundo hasta que vuelve la interrupcion en un ciclo infinito.
Por favor, podria alguien decirme en donde esta mi error?
P.D. El fusible WDTON esta activo.
.include "C:\VMLAB\include\m88def.inc"
reset:
rjmp start
reti ; Addr $01
reti ; Addr $02
reti ; Addr $03
reti ; Addr $04
reti ; Addr $05
rjmp wdt_int ; Addr $06 Use 'rjmp myVector'
reti ; Addr $07 to define a interrupt vector
reti ; Addr $08
reti ; Addr $09
reti ; Addr $0A
reti ; Addr $0B This is just an example
reti ; Addr $0C Not all MCUs have the same
reti ; Addr $0D number of interrupt vectors
reti ; Addr $0E
reti ; Addr $0F
reti ; Addr $10
start:
ldi r18,0x00
;================Set watchdog timer en interrupt mode================
cli
in r16,MCUSR ;Clear WDRF en MCUSR
ANDI r16,(0xFF & (0 << WDRF))
out MCUSR,r16
LDI r16,0x18
LDI r17,0x46
STS WDTCSR,r16 ;preparando el registro para el cambio cuatro
;ciclos a partir de aqui
STS WDTCSR,r17 ;seteando el registro
sei
ser r16
out ddrb,r16 ;configura puerto b como salida
ldi r17,0x61
wdr
sts 0x60,r17 ;habilitar watchdog timer con preescalar 1024
sei
clr r16
out portb,r16
loop:
nop
rjmp loop
wdt_int:
SBRS r16,1 ;Brinca si bit 1 en r16 = 1
ldi r17,0xFF ;carga r17 con FF
SBRC r16,1 ;brinca si bit 1 en r16 = 0
ldi r17,0x00 ;carga r17 con 00
MOV r16,r17 ;carga r16 en r17
out portb,r16 ;saca r16 a puerto
wdr
reti