Volviendo hacia atras:
'*******************PIC Entrenadora BASIC (PicEBasic)************************
'NOMBRE: 16F88_Pic_EBasic_Ejemplo_18
'MICRO: PIC16F88
'FECHA/AUTOR: 06/07 - By COS, PSI v7.41
'Practicando con la funcion Read/Write (EEPROM interna del micro) y WatchDog
'Hereda todas las funciones del ejemplo 17______
'Practicando con la funcion Read/Write (EEPROM interna del micro)
'Se envia por el puerto serie las cinco primeras posiciones de memoria EEPROM
'las tres primeras como control para saber si es la primera vez que se ejecuta el programa
'y la 4 y 5 son dos contadores que indican el numero de veces que se ejecuto el programa
'ya sea por reset o por puesta en marcha de la alimentacion
'la posicion cinco indica las veces que la posicion 4 desbordo (255).
'puerto serie a 1200 baudios, por emulacion.
'Hereda todas las funciones del ejemplo 16_______
'Practicando con el WatchDog
'Si se pulsa S1 o S2 se anula la linea que hace reset al WatchDog
'Activacion del reset generado por el WatchDog sobre los 262,144mSeg.
'**********************************************************************
Define CONFIG = 0x2f54 'Configuración de bits (fuses)
Define CONF_WORD_2 = 0x3ffc 'Configuración de bits (fuses)
Define CLOCK_FREQUENCY = 8 'Frecuencia del reloj en Mhz
'Define SIMULATION_WAITMS_VALUE = 1 'Hace que se ignoren los tiempos de los WaitMs
'-----------------------------Configuracion del Clock, Puertos I/O--------------
AllDigital 'todos los puertos como I/O
CMCON = 0x07 'comparador a off
OSCCON = 0x7e 'set intrc To 8mhz, se usara reloj interno a 8Mhz
TRISA = 0xff 'Puerto A como Entradas
TRISB = 0xff 'puerto B como Entradas
'TRISA.4 = 1 'como entrada (RA4, adc)
'TRISA.6 = 1 'como entrada (RA6, tecla S1)
'TRISA.5 = 1 'como entrada (RA5, tecla S2)
TRISB.3 = 0 'como salida, iluminacion lcd
TRISA.7 = 0 'como salida, led amarillo
TRISB.0 = 0 'como salida, led verde
TRISB.4 = 0 'como salida, control servo
PORTB.3 = 1 'luz lcd a on (RB3)
PORTA.7 = 1 'led amarillo a off (RA7), negado
PORTB.0 = 1 'led verde a off (RB0), negado
'---------------------------Configuracion del WatchDog--------------------------
OPTION_REG.T0CS = 0 'selecciona reloj interno para el WDT
'Prescaler del Wdt
'_wdt_div8192 = 8 '262,144mSeg.
WDTCON.WDTPS0 = 0 'Prescaler Rate Select bits
WDTCON.WDTPS1 = 0
WDTCON.WDTPS2 = 0
WDTCON.WDTPS3 = 1
OPTION_REG.PSA = 0 'No prescales2
'-----------------------------Declaracion y Asignacion de valores---------------
Dim n As Byte 'variable auxiliar
Dim dato_eeprom(5) As Byte 'variables por los que pasaran los valores de la eeprom
Dim watchdog_on As Bit 'permite que se haga el reset al contador del watchdog
Dim pause As Word 'asigna el valor de espera en mSeg.
watchdog_on = 1 'inicializa la variable, borrado del registro del watchdog a on
'---------------------------------------------------------------------------------
Gosub clear_watchdog 'borra el contador del watchdog antes que rebose
Gosub actualiza_eeprom
RA7 = 0 'salida led amarillo
RB0 = 0 'salida led verde
pause = 5000 'carga la rutina de espera con 5 Seg.
Gosub wait_ms 'salto con retorno a la rutina de espera
main: 'comienza la rutina principal
Gosub clear_watchdog 'salto con retorno a la rutina
RA7 = 1 'salida led amarillo
RB0 = 1 'salida led verde
pause = 500 'carga la rutina de espera con 0,5 Seg.
Gosub wait_ms 'salto con retorno a la rutina de espera
RB0 = 0 'salida led verde
pause = 500 'carga la rutina de espera con 0,5 Seg.
Gosub wait_ms 'salto con retorno a la rutina de espera
RA7 = 0 'salida led amarillo
pause = 500 'carga la rutina de espera con 0,5 Seg.
Gosub wait_ms 'Borra pone a cero el registro contador del WDT
Goto main 'impide que termine la rutina main
End
clear_watchdog: 'borra el contador del WatchDog
If watchdog_on = 0 Then Return 'determina si se hace el reset al WatchDog
ASM: clrwdt 'reinicializa el WDT, assembler
Return
wait_ms: 'rutina de espera, reset al WatchDog y lectura de las teclas
While pause > 0 'bucle que se repite mientras la condiccion sea cierta
If RA6 = 0 Or RA5 = 0 Then watchdog_on = 0 'lee las teclas
WaitMs 1 'espera 1 mSeg.
pause = pause - 1 'decrementa el tiempo de espera
Gosub clear_watchdog 'salto con retorno a la rutina
Wend 'acota el bucle While
Return
actualiza_eeprom: 'comprueba si la eeprom fue escrita, si no la inicializa y comienza el contaje
For n = 0 To 4 'bucle para recorrer las primeras posiciones de memoria
Read n, dato_eeprom(n) 'se asigna el contenido de la direc. "n" el dato a la varia. dato_eeprom(n)
Next n 'acota el bucle For
If dato_eeprom(0) <> 0 Or dato_eeprom(1) <> 1 Or dato_eeprom(2) <> 2 Then 'verifica eeprom inicializada
For n = 0 To 2 '____Escribe los tres primeros caracteres de control
Write n, n 'escribe en la eeprom
Next n '_____________
Write 3, 1 'inicializa el primer contador
Write 4, 0 'inicializa el segundo contador que nos indica las veces que reboso el primer contador
Else 'si lo anterior no es cierto entonces esto otro
If dato_eeprom(3) = 255 Then
dato_eeprom(4) = dato_eeprom(4) + 1 'se incrementa el segundo contador
Write 4, dato_eeprom(4) 'se escribe el valor del segundo contador
Endif
dato_eeprom(3) = dato_eeprom(3) + 1 'incrementa el primer contador
Write 3, dato_eeprom(3) 'escribe el nuevo valor para el primer contador
Endif
Serout PORTB.5, 1200, #dato_eeprom(0), #dato_eeprom(1), #dato_eeprom(2) 'envia las tres
'primeras posiciones al puerto serie
Serout PORTB.5, 1200, " ", #dato_eeprom(3), "-", #dato_eeprom(4), CrLf 'envia las 2 ultimas
'posiciones al puerto serie
Return