desktop

interrupcion watchdog timer en el atmega88

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
 
Asi a bote pronto, no sabría decirte, pero no todos los ATmega tienen interrupción del desbordamiento del watchdog. Lo normal es que este resetee el micro.

Hablando desde el fondo de mi memoria dinámica, esa que nunca se refresca, me suena que había que hacer alguna cosa para que se activase la interruppción en los micros que tenían esta opción para evitar que se resetease cuando saltase el watchdog. Algo similar pasaba con el BrownOut detector.

Te recomiendo que eches dos ojeadas a la sección de fuses y del watchdog del datasheet de tu micro exacto. Ten en cuenta que algunos ATmega difieren según la letra, así un M644P y un M644V tienen algunas características y periféricos diferentes además de las tensiones y velocidades de funcionamiento.
 
Que quieres decir con : El fusible WDTON esta activo?
Si WDTON=0: Siempre hará un reset a time-out
Si WDTON=1: La acción en time-out depende de WDE y WDIE
Recuerda: To stay in Interrupt and System Reset Mode, WDIE must be set after each interrupt.
Porque haces:STS WDTCSR,r17 ;seteando el registro "prescaler 128", y luego:[/SIZE]sts 0x60,r17 ;habilitar watchdog timer con preescalar 1024.
Saludos


No tengo mucha práctica con ensamblador, pero se me ocurre una cosa más:
Dentro de la rutina de Interrup. tienes: SBRS r16,1 ;Brinca si bit 1 en r16 = 1
Si la condición bit1 de r16 igual a 1 no se cumple, nunca se podrá salir de la interrup.
Una cosa más ¿cuánto tiempo estará portb=0? no veo ninguna temporización para eso.
Saludos.
 
Última edición:
Atrás
Arriba