Hola estoy relizado un programador para activar un relé a diferentes horas,
El projecto lo estoy haciendo en PicBasicPro, y el problema es que no consigo que regrese, al estado en que se encontraba,
en el caso de que falle la alimentación del dispositivo.
Os paso mi codigo para ver si me podeis hechar una mano.
Define I2C_SCLOUT 1 ;No es necesario resistencia pull-up en SCL
CMCON = 7 ; Habilito Puerto A Todo Digital TESTEANDO....???
'********************* DEFINO LOS PINES DEL LCD *****************
DEFINE LCD_DREG PORTB ;bit de datos del LCD empezando
DEFINE LCD_DBIT 0 ;por B.0, B.1, B.2 y B.3
DEFINE LCD_RSREG PORTB ;bit de registro del LCD conectar
DEFINE LCD_BITS 4 ;Definimos el pic para usar el LCD con 4 lineas.
DEFINE LCD_RSBIT 4 ;en el puerto B.4
DEFINE LCD_EREG PORTB ;bit de Enable conectar en el
DEFINE LCD_EBIT 5 ;puerto B.5
DEFINE LCD_LINES 2 ;Numero de lineas del LCD
'*************** DEFINO NOMBRES DE LOS PINES DE SALIDA ******
RELE VAR PORTA.2 ' SALIDA RELE_1 DE ACTIVACION
'**DEFINO PINES DEL CHIP I2C DS1307 y EEPROM ********************
contro CON %10100000 ;contro contiene valor constante %10100000
;Que es la direccion del Dispositivo memoria
;EEprom I2c
CPIN Var Portb.7 ;pin señal de reloj I2C
DPIN Var Portb.6 ;pin de datos I2C
'memo VAR BYTE ;variable para almacenar dato leído de la EEprom
segu var byte ;definir tamaño de variable segundos 1 a 255
minu var byte ;variable para los minutos
hora var byte ;variable para las horas
diaS var byte ;variable día de la semana
diaF var byte ;variable día fecha del mes
mes var byte ;variable mes
anio var byte ;variable año de 2 dígitos
dato VAR BYTE ;variable para almacenar dato leído
actualizado var bit
alarma var bit ' guardo como esta el rele on o off
transi var bit
'*******************************************************************
EEPROM 0,[0] ;memoria 0 con el valor inicial 0 , sirve para
;indicar que nunca ha corrido este programa
EEPROM 1,[0] ;memoria 1 con el valor inicial 0
EEPROM 2,[0] ;memoria 2 con el valor inicial 0
READ 0,actualizado ;carga el valor de la memoria EEPROM dirección 0
'READ 1,alarma ;carga el valor de la memoria EEPROM dirección 1
'READ 2,transi ;carga el valor de la memoria EEPROM dirección 2
IF actualizado=0 THEN grabarRTC ;si es la 1ra vez que corre ir a grabar RTC
;caso contrario solo leer el RTC
'******************************* inicio *****************************
inicio:
pause 10
I2CREAD DPIN,CPIN,%11010000,0,[segu] ;leer los datos de mem. 0,
I2CREAD DPIN,CPIN,%11010000,1,[minu] ;1,2,..y guardarlos en sus
I2CREAD DPIN,CPIN,%11010000,2,[hora] ;respectivas variables
I2CREAD DPIN,CPIN,%11010000,3,[diaS]
I2CREAD DPIN,CPIN,%11010000,4,[diaF]
I2CREAD DPIN,CPIN,%11010000,5,[mes]
I2CREAD DPIN,CPIN,%11010000,6,[anio]
lcdout $fe,1,hex2 hora,":",hex2 minu,":",hex2 segu ;mostrar la
;hora minuto y segundos en 2 dígitos (HEX2)
if alarma =1 and transi=0 then conecta
if alarma =0 and transi=1 then desconecta
'************************ PROGRAMACION DE LAS ALARMAS *********************
conec:
if PORTA.2=1 then WRITE $01,1 ' Guardamos el estado en alarma
desco:
if PORTA.2=0 then WRITE $02,0 ' Guardamos el estado en transito
horarios:
if hora=$06 and minu=$00 and segu=$00 then high RELE
if hora=$06 and minu=$00 and segu=$10 then low RELE
if hora=$06 and minu=$00 and segu=$12 then high RELE
if hora=$06 and minu=$00 and segu=$15 then low RELE
goto inicio ;volver a leer los datos
'***************************************************************
desconecta:
low rele
pause 10
if rele=0 then WRITE transi,0 ' Guardamos el estado en transito
goto conec
conecta:
high rele
pause 10
if rele=1 then WRITE alarma,1 ' Guardamos el estado en alarma
goto desco
' *********** PUESTA EN FECHA Y HORA ****************************
grabarRTC:
I2CWRITE DPIN,CPIN,%11010000,0,[$57] ; Poner Segundo inicial
Pause 10 ;retardo para finalizar grabación
I2CWRITE DPIN,CPIN,%11010000,1,[$59] ; Poner Minuto inicial
Pause 10
I2CWRITE DPIN,CPIN,%11010000,2,[$05] ;Poner la Hora inicial
Pause 10
I2CWRITE DPIN,CPIN,%11010000,3,[$4] ;Poner nombre del dia ,D=1,L=2
Pause 10 ;M=3 , M=4, J=5, V=6, S=7
I2CWRITE DPIN,CPIN,%11010000,4,[$09] ;Poner numero del dia
Pause 10
I2CWRITE DPIN,CPIN,%11010000,5,[$7] ;Poner nombre del mes
Pause 50
I2CWRITE DPIN,CPIN,%11010000,6,[$14] ;Poner numero del año 2014
Pause 10
I2CWRITE DPIN,CPIN,%11010000,7,[$10] ;control %00010000 para
Pause 10 ;encender el led cada 1 seg.
WRITE $00,1 ;escribe en la memoria 0 el valor de 1 para que no
;se vuelva a grabar otra vez estos datos en el RTC
GOTO inicio ;ir a presentar los datos en el LCD
end
Muchas gracias