TODOPIC
Simuladores, editores de PCB, etc => Simuladores de circuitos => Proteus ISIS => Mensaje iniciado por: PicMinor en 11 de Abril de 2014, 06:12:48
-
¡¡ Saludos al foro !!
Estoy teniendo problemas al intentar simular en el proteus un micro que temporiza mediante saltos en el WDT. He leído en algún sitio que el Proteus desactiva de oficio el Watchdog. ¿Es eso cierto? ¿Nadie ha tenido problemas con el Watchdog y el Proteus?
-
Yo he tenido algún problema con algún micro, pero aún he tenido más, por culpa del compilador. En mi caso el ccs...
Sí también utilizas el ccs, prueba a cambiar de versión a ver que tal va
-
¿Nadie ha tenido problemas con el Watchdog y el Proteus?
yo no
-
¡ Saludos al foro !
Al parecer nadie ha tenido problemas así que voy a poner el código para que lo comprobéis. Si lo cargamos en el MPLAB (PIC10F200, lenguaje ensamblador, 4 MHz) y lo simulamos con el propio simulador del MPLAB funciona correctamente, es decir llega al bucle Salida_On al cabo de 1 segundo.
Si utilizamos el Proteus VSM no funciona, se queda en la instrucción goto Bajo_Consumo y NUNCA salta el Watchdog.
;==================================================================================================
; Test del Watchdog
;==================================================================================================
LIST P = 10F200, F = INHX8M
INCLUDE "P10F200.INC"
;==================================================================================================
; OPCIONES DE CONFIGURACION
;==================================================================================================
__CONFIG ( _MCLRE_OFF & _CP_OFF & _WDT_ON & _IntRC_OSC )
ERRORLEVEL 0,-205
;==================================================================================================
; Pines Asignados
;==================================================================================================
#define SALIDA GPIO,0 ; Pin de Salida
;==================================================================================================
; Posiciones de memoria
;==================================================================================================
CBLOCK 0x10 ; Memoria de Usuario
Num_WDTs ; Número de WDT's transcurridos
ENDC
;==================================================================================================
; PROGRAMA PRINCIPAL
;==================================================================================================
ORG 0x000 ; Origen de la memoria
MOVWF OSCCAL ; Guarda el valor de OSCCAL de la factoria (modelos OTPs)
;--------------------------------------------------------------------------------------------------
; Comprueba el Tipo de Reset. Si es el WDT bifurca
;--------------------------------------------------------------------------------------------------
Comprueba_WU
BTFSS STATUS,NOT_TO ; Comprueba el Flag del WDT
GOTO Es_Por_WDT ; Se ha reseteado por WDT
;==================================================================================================
; Arranque por el Reset POR (Power On Reset)
;==================================================================================================
Power_On_Reset
CLRF GPIO ; Borra el puerto
MOVLW B'00001000' ; GP3 entrada, el resto salidas
TRIS GPIO ; Configura los pines
BCF SALIDA ; Salida a cero
CLRF Num_WDTs ; No tenemos ningún WDT
;--------------------------------------------------------------------------------------------------
; Entramos al estado de Bajo Consumo.
; Salimos por WDT (Si funciona)
;--------------------------------------------------------------------------------------------------
A_Dormir
CLRF GPIO ; Borra el puerto
MOVLW B'00001000' ; GP3 entrada, el resto salidas
TRIS GPIO ; Configura los pines
MOVLW B'10001000' ; Preescaler 1:1
OPTION ; Asigna el Option
CLRWDT ; Inicializamos el WDT
Bajo_Consumo
SLEEP ; Pone el micro en bajo consumo
GOTO Bajo_Consumo ; Bucle de Bajo Consumo
;==================================================================================================
; Tratamiento de los Resets por WDT
;==================================================================================================
Es_Por_WDT
INCF Num_WDTs,F ; Ha transcurrido un WDT
MOVLW D'56' ; Retardo
SUBWF Num_WDTs,W ; Comprueba si es mayor
BTFSS STATUS,C ; Comprueba si lo es
GOTO A_Dormir ; Volvemos al Bucle
Salida_On
CLRWDT ; Resetamos el WDT
BSF SALIDA ; Salida a Uno
GOTO Salida_On ; Bucle Infinito
END
-
Para PalitroqueZ:
Comentas que tú no has tenido problemas con la simulación del WDT en el proteus. ¿Podrías indicarme cómo lo has hecho?
-
he aquí un ejemplo escrito en C
#include <16f877A.h>
#fuses XT,WDT,BROWNOUT
#fuses PUT,NOWRT,NOLVP,NODEBUG,NOPROTECT
#use delay (clock=4M)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)
#zero_ram
void main(void){
output_a(0);
output_b(0);
set_tris_a(0);
set_tris_b(0b1);
disable_interrupts(global);
disable_interrupts(int_timer1);
disable_interrupts(int_rda);
disable_interrupts(int_ext);
setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_OFF);
setup_spi(FALSE);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
port_b_pullups(FALSE);
setup_wdt(WDT_2304MS);
while(1){
printf("probando\r\n");
}
}
y lo que muestra el proteus (cuando no se reinicia el perro antes del desborde)
(http://www.todopic.com.ar/foros/imgtiny/2vtusg8.jpg)
-
¡¡ Por fin encontré dónde estaba el problema !!
Lo comento por si le ocurre a alguien más. El problema era que en los parámetros del micro cargaba el programa pero NO HABIA PUESTO EL VALOR DE PROGRAM CONFIGURATION WORD. Así que la simulación fallaba. En el momento en que puse el valor correcto funcionó sin problemas.
¡ Saludos al foro !
-
:-)