Seguramente estoy muy espeso, pero sigo sin entender algo.
Creo que me explicaré más claramente si pego aquí el código:
Codigo:
LIST P=16C84
ERRORLEVEL -302 ;SUPPRESS BANK SELECTION MESSAGES
__CONFIG 3FF7H ;RC OSC, WATCHDOG
__IDLOCS 1234
;
PORTB EQU 6
TRISB EQU 86H
OPTREG EQU 81H
STATUS EQU 3
CARRY EQU 0
RP0 EQU 5
MSB EQU 3 ;BIT POSITION OF LEFTMOST LED
;
CLRF PORTB ;ALL LEDS OFF
BSF STATUS,RP0 ;SELECT REGISTER BANK 1
CLRF TRISB ;SET PORTB TO ALL OUTPUTS
MOVLW 0AH
MOVWF OPTREG ;ASSIGN PRESCALER (1
TO WDT
BCF STATUS,RP0 ;SELECT REGISTER BANK 0
INCF PORTB,F ;TURN ON RIGHTMOST LED
BCF STATUS,CARRY ;CLEAR CARRY
LEFT SLEEP ;WAIT FOR WDT TIMEOUT
RLF PORTB,F ;TURN ON LED TO LEFT
BTFSS PORTB,MSB ;REACHED LEFTMOST?
GOTO LEFT ;LOOP IF NOT
RIGHT SLEEP ;WAIT FOR WDT TIMEOUT
RRF PORTB,F ;TURN ON LED TO RIGHT
BTFSS PORTB,0 ;REACHED RIGHTMOST?
GOTO RIGHT ;LOOP IF NOT
GOTO LEFT ;START NEW CYCLE
;
ORG 2100H
;
DE "Copyright (C) 1996 David Tait"
END
Mi duda la tengo en las líneas con etiquetas LEFT y RIGHT. Según veo, el micro se detendrá ahí y sólo saldrá de su estado adormecido mediante el reset del WDT. Pero, si es cierto lo que me estáis contando, el reset del WDT hará que el micro comience la ejecución del programa por la primera línea del mismo, y no por el siguiente comando al SLEEP. ¿Dónde me he perdido?
Yo pensaba que el desbordamiento del WDT provocaba siempre un
reset y el reinicio del sistema y creía que T0ni0 estaba equivocado.
Pero investigándolo en el libro que yo uso, probé el siguiente programa
que demuestra que el amigo T0ni0 tenía razón (y que yo estaba equivocado).
;Codigo:
===================================================================
; Del libro "MICROCONTROLADOR PIC16F84. DESARROLLO DE PROYECTOS"
; E. Palacios, F. Remiro y L. López.
; Editorial Ra-Ma. www.ra-ma.es
; ===================================================================
;
; Este programa comprueba el funcionamiento de la instrucción "sleep" y el "Watchdog".
; El PIC se pone en modo bajo consumo. El despertar del mismo se producirá cada vez que el
; Watchdog desborde su cuenta, en ese momento se producirá un incremento de un contador que se
; visualizará en pantalla. El proceso debe repetirse cada medio segundo aproximadamente.
;
; Con un preescaler de 32 el desbordamiento del Watchdog se producirá cada
; 18 x 32 = 576 ms, es decir, cada medio segundo aproximadamente.
; ZONA DE DATOS **********************************************************************
__CONFIG _CP_OFF & _WDT_ON & _PWRTE_ON & _XT_OSC
; Observad que se ha habilitado el Watchdog.
LIST P=16F84A
INCLUDE <P16F84A.INC>
CBLOCK 0x0C
Contador
ENDC
; ZONA DE CÓDIGOS ********************************************************************
ORG 0
Inicio
call LCD_Inicializa
bsf STATUS,RP0
movlw b"00001101" ; Un prescaler de 32 es asignado al Watchdog.
movwf OPTION_REG
bcf STATUS,RP0
clrf Contador ; Inicializa el contador y lo visualiza.
; La sección "Principal" es de mantenimiento. Visualiza y pasa a modo bajo consumo
; del cual solo puede salir por desbordamiento del Watchdog.
Principal
call LCD_Linea1
movf Contador,W ; Pasa a visualizar el contador.
call BIN_a_BCD ; Se debe visualizar en BCD.
call LCD_Byte ; Visualiza el contador.
sleep ; Pasa a modo de bajo consumo.
incf Contador,F ; El Watchdog incrementa el contador.
goto Principal
INCLUDE <RETARDOS.INC>
INCLUDE <BIN_BCD.INC>
INCLUDE <LCD_4BIT.INC>
END
; ===================================================================
; Del libro "MICROCONTROLADOR PIC16F84. DESARROLLO DE PROYECTOS"
; E. Palacios, F. Remiro y L. López.
; Editorial Ra-Ma. www.ra-ma.es
; ===================================================================
Efectivamente: en el modo SLEEP un desbordamiento del Watchdog provoca
que se ejecute la siguiente instrucción, NO el reinicio del programa.
Gracias amigos, me han provocado a investigar y aprender algo nuevo.
Saludos.