Hola a todos. Estoy intentando controlar la iluminación de mi display a través de unos menús. Bien, esta parte la tengo hecha y me funciona. Lo que no logro es almacenar la variable en la EEPROM. Haber si alguien me puede echar un cable. Yo creo que lo estoy haciendo bien siguiendo el manual de pic basic de todopic pero es obvio que algo falla porque no guarda el valor.
Este es mi codigo:
'--------------------------------------------------------
'REGISTROS
ADCON1 = 7 'PORTA (ADCON1 = %00000111 ó ADCON1 = 7) apago los conversores A/D y hago PORTA digital
CMCON = 7 'Apago los comparadores
'--------------------------------------------------------
'FUSES
@ Device PIC16F877A
@ Device XT_OSC, WDT_OFF, PWRT_ON, BOD_OFF, LVP_OFF
'--------------------------------------------------------
'VELOCIDAD DEL OSCILADOR
DEFINE OSC 4 'Oscilador de 4mhz de velocidad
'--------------------------------------------------------
'CONFIGURACION DE BUS I2C
DEFINE I2C_SLOW 1 'Para osciladores de menos de 8 mhz
'--------------------------------------------------------
'CONFIGURACION DEL LCD
DEFINE LCD_DREG PORTD 'Defino el puerto de los datos del LCD
DEFINE LCD_DBIT 4 'Utilizamos D4 D5 D6 D7
DEFINE LCD_RSREG PORTD 'Defino el puerto de RS
DEFINE LCD_RSBIT 2 'Numero de puerto de RS
DEFINE LCD_EREG PORTD 'Defino el puerto de Enable
DEFINE LCD_EBIT 3 'Numero de puerto de Enable
DEFINE LCD_BITS 4 'Bits de datos
DEFINE LCD_LINES 2 'Lineas del LCD
'--------------------------------------------------------
'DECLARACION DE VARIABLES
mins VAR BYTE 'Variable de los minutos 0-255
decmin var BYTE 'Variable de deciams de minuto 0-255
sec VAR BYTE 'Variable de los segundos 0-255
decsec VAR BYTE 'Variable de decimas de segundo 0-255
light VAR BYTE 'Variable de incremento/disminucion de iluminacion de LCD
contrast VAR BYTE 'Variable de incremento/disminucion de contraste de LCD
addr0 VAR byte 'Direcciones de memoria eeprom para guardar los ajustes y los tiempos
addr1 VAR byte
addr2 VAR byte
addr3 VAR byte
addr4 VAR byte
addr5 VAR byte
counter VAR BYTE 'Variable del contador del timer
updatelcd VAR BYTE 'Variable de actualizacion de LCD'
'--------------------------------------------------------
'ALIAS
scl VAR PORTC.3 'Alias puerto de reloj I2C
sda VAR PORTC.4 'Alias puerto de datos I2C
'--------------------------------------------------------
'CONFIGURACION DE PUERTOS
TRISA=1 'PORTA como entrada
TRISB=0 'PORTB como salida
TRISC=0 'PORTC como salida
TRISD=0 'PORTD como salida
TRISE=0 'PORTE como salida
PORTA.0=0
PORTA.1=0
PORTA.2=0
PORTA.3=0
PORTA.4=0
PORTA.5=0
'--------------------------------------------------------
'INICIALIZACION DE LAS VARIABLES
mins=0
decmin=0
sec=0
decsec=0
light=0
contrast=0
addr0=%00000000
addr1=%00000001
addr2=%00000010
addr3=%00000011
addr4=%00000100
addr5=%00000101
counter=0
updatelcd=0
'--------------------------------------------------------
'*********************************************************************************************************************************************************************
'***********************************************************************COMIENZO DEL PROGRAMA*************************************************************************
'*********************************************************************************************************************************************************************
'--------------------------------------------------------
'INICIALIZACION DE LA INSOLADORA
LOW PORTC.7
HIGH PORTC.6 'Enciendo el led de power
PAUSE 2000 'Pausa de 2000ms para inicializar el LCD
LCDOUT $FE,1 'Limpio la pantalla
LCDOUT $FE,$80," BIENVENIDO "
LCDOUT $FE,$C0," JORGE "
PAUSE 2000 'Pausa de 2000ms
LCDOUT $FE,$80," INICIALIZANDO "
LCDOUT $FE,$C0," INSOLADORA "
PAUSE 2500 'Pausa de 2500ms
I2CREAD sda,scl,$A0,addr0,[light] 'Leo la memoria y cargo el valor de la iluminacion del LCD
PAUSE 10 'Pausa hasta finalizar lectura
I2CREAD sda,scl,$A0,addr1,[contrast] 'Leo la memoria y cargo el valor del contraste del LCD
PAUSE 10 'Pausa hasta finalizar lectura
'--------------------------------------------------------
'MENU PRINCIPAL
maininsolate:
LCDOUT $FE,$80, ">> INSOLAR <<"
LCDOUT $FE,$C0, " AJUSTES "
IF PORTA.0=1 THEN 'Si pulso UP hago
PAUSE 100 'Pausa de 100ms para antirrebote
GOSUB beep 'Emito pitido con pulsacion
GOTO mainabout 'Voy a mainabout
ENDIF
IF PORTA.2=1 THEN 'Si pulso DOWN hago
PAUSE 100 'Pausa de 100ms para antirrebote
GOSUB beep 'Emito pitido con pulsacion
GOTO mainsettings 'Voy a mainsettings
ENDIF
IF PORTA.4=1 THEN 'Si pulso SET/CANCEL hago
PAUSE 100 'Pausa de 100ms para antirrebote
GOSUB beep 'Emito pitido con pulsacion
GOTO settime 'Voy a settime
ENDIF
GOTO maininsolate
mainsettings:
LCDOUT $FE,$80, ">> AJUSTES <<"
LCDOUT $FE,$C0, " ACERCA DE "
IF PORTA.0=1 THEN 'Si pulso UP hago
PAUSE 100 'Pausa de 100ms para antirrebote
GOSUB beep 'Emito pitido con pulsacion
GOTO maininsolate 'Voy a maininsolate
ENDIF
IF PORTA.2=1 THEN 'Si pulso DOWN hago
PAUSE 100 'Pausa de 100ms para antirrebote
GOSUB beep 'Emito pitido con pulsacion
GOTO mainabout 'Voy a mainabout
ENDIF
IF PORTA.4=1 THEN 'Si pulso SET/CANCEL hago
PAUSE 100 'Pausa de 100ms para antirrebote
GOSUB beep 'Emito pitido con pulsacion
GOTO bckl 'Voy a bckl
ENDIF
GOTO mainsettings
mainabout:
LCDOUT $FE,$80, ">> ACERCA DE <<"
LCDOUT $FE,$C0, " INSOLAR "
IF PORTA.0=1 THEN 'Si pulso UP hago
PAUSE 100 'Pausa de 100ms para antirrebote
GOSUB beep 'Emito pitido con pulsacion
GOTO mainsettings 'Voy a mainsettings
ENDIF
IF PORTA.2=1 THEN 'Si pulso DOWN hago
PAUSE 100 'Pausa de 100ms para antirrebote
GOSUB beep 'Emito pitido con pulsacion
GOTO maininsolate 'Voy a maininsolate
ENDIF
IF PORTA.4=1 THEN 'Si pulso SET/CANCEL hago
PAUSE 100 'Pausa de 100ms para antirrebote
GOSUB beep 'Emito pitido con pulsacion
GOTO about 'Voy a about
ENDIF
GOTO mainabout
'--------------------------------------------------------
'SUBMENU TIEMPO
settime:
LCDOUT $FE,$80, ">> AJUSTAR TIEMPO <<"
LCDOUT $FE,$C0, " ULTIMO TIEMPO "
IF PORTA.0=1 THEN 'Si pulso UP hago
PAUSE 100 'Pausa de 100ms para antirrebote
GOSUB beep 'Emito pitido con pulsacion
GOTO lasttime 'Voy a lasttime
ENDIF
IF PORTA.2=1 THEN 'Si pulso DOWN hago
PAUSE 100 'Pausa de 100ms para antirrebote
GOSUB beep 'Emito pitido con pulsacion
GOTO lasttime 'Voy a lasttime
ENDIF
IF PORTA.4=1 THEN 'Si pulso SET/CANCEL hago
PAUSE 100 'Pausa de 100ms para antirrebote
GOSUB beep 'Emito pitido con pulsacion
GOTO setdecsec 'Voy a setdecsec
ENDIF
GOTO settime
lasttime:
LCDOUT $FE,$80, ">> ULTIMO TIEMPO <<"
LCDOUT $FE,$C0, " AJUSTAR TIEMPO "
IF PORTA.0=1 THEN 'Si pulso UP hago
PAUSE 100 'Pausa de 100ms para antirrebote
GOSUB beep 'Emito pitido con pulsacion
GOTO settime 'Voy a settime
ENDIF
IF PORTA.2=1 THEN 'Si pulso DOWN hago
PAUSE 100 'Pausa de 100ms para antirrebote
GOSUB beep 'Emito pitido con pulsacion
GOTO settime 'Voy a settime
ENDIF
IF PORTA.4=1 THEN 'Si pulso SET/CANCEL hago
PAUSE 100 'Pausa de 100ms para antirrebote
GOSUB beep 'Emito pitido con pulsacion
GOTO readlasttime 'Voy a readlasttime'
ENDIF
GOTO lasttime
'--------------------------------------------------------
'SUBMENU AJUSTES
bckl:
LCDOUT $FE,$80, ">> ILUMINACION <<"
LCDOUT $FE,$C0, " CONTRASTE "
IF PORTA.0=1 THEN 'Si pulso UP hago
PAUSE 100 'Pausa de 100ms para antirrebote
GOSUB beep 'Emito pitido con pulsacion
GOTO back 'Voy a back
ENDIF
IF PORTA.2=1 THEN 'Si pulso DOWN hago
PAUSE 100 'Pausa de 100ms para antirrebote
GOSUB beep 'Emito pitido con pulsacion
GOTO cont 'Voy a cont
ENDIF
IF PORTA.4=1 THEN 'Si pulso SET/CANCEL hago
PAUSE 100 'Pausa de 100ms para antirrebote
GOSUB beep 'Emito pitido con pulsacion
GOTO setbckl 'Voy a setbckl
ENDIF
GOTO bckl
cont:
LCDOUT $FE,$80, ">> CONTRASTE <<"
LCDOUT $FE,$C0, " VOLVER "
IF PORTA.0=1 THEN 'Si pulso UP hago
PAUSE 100 'Pausa de 100ms para antirrebote
GOSUB beep 'Emito pitido con pulsacion
GOTO bckl 'Voy a bckl
ENDIF
IF PORTA.2=1 THEN 'Si pulso DOWN hago
PAUSE 100 'Pausa de 100ms para antirrebote
GOSUB beep 'Emito pitido con pulsacion
GOTO back 'Voy a back
ENDIF
IF PORTA.4=1 THEN 'Si pulso SET/CANCEL hago
PAUSE 100 'Pausa de 100ms para antirrebote
GOSUB beep 'Emito pitido con pulsacion
GOTO setcontrast 'Voy a setcontrast
ENDIF
GOTO cont
back:
LCDOUT $FE,$80, ">> VOLVER <<"
LCDOUT $FE,$C0, " ILUMINACION "
IF PORTA.0=1 THEN 'Si pulso UP hago
PAUSE 100 'Pausa de 100ms para antirrebote
GOSUB beep 'Emito pitido con pulsacion
GOTO cont 'Voy a cont
ENDIF
IF PORTA.2=1 THEN 'Si pulso DOWN hago
PAUSE 100 'Pausa de 100ms para antirrebote
GOSUB beep 'Emito pitido con pulsacion
GOTO bckl 'Voy a bckl
ENDIF
IF PORTA.4=1 THEN 'Si pulso SET/CANCEL hago
PAUSE 100 'Pausa de 100ms para antirrebote
GOSUB beep 'Emito pitido con pulsacion
GOTO maininsolate 'Voy a maininsolate
ENDIF
GOTO back
'--------------------------------------------------------
'SUBMENU ACERCA DE
about:
LCDOUT $FE,$80, " FIRMWARE V 1.0 "
LCDOUT $FE,$C0, " JFF 2014 "
IF PORTA.4=1 THEN 'Si pulso SET/CANCEL hago
PAUSE 100 'Pausa de 100ms para antirrebote
GOSUB beep 'Emito pitido con pulsacion
GOTO maininsolate 'Voy a maininsolate'
ENDIF
GOTO about
'--------------------------------------------------------
'AJUSTE DE TIEMPO
setdecsec:
GOSUB lcd
PAUSE 100
LCDOUT $FE,$C0,$10,$10,$10,$10,$10,$10,$10, DEC mins,DEC decmin,":",DEC sec,"_",$10,$10,$10,$10,$10,$10,$10,$10
PAUSE 100
IF PORTA.0=1 && minS!=1 THEN 'Si pulso UP y min es distinto de 1 hago
PAUSE 100 'Pausa de 100ms para antirrebote
GOSUB beep 'Emito pitido con pulsacion
decsec=decsec+1 'Incremento decimas de segundo
ENDIF
IF PORTA.1=1 THEN 'Si pulso RIGHT hago
PAUSE 100 'Pausa de 100ms para antirrebote
GOSUB beep 'Emito pitido con pulsacion
GOTO setmin 'Voy a setmin
ENDIF
IF PORTA.2=1 && minS!=1 THEN 'Si pulso DOWN y min es distinto de 1 hago
PAUSE 100 'Pausa de 100ms para antirrebote
GOSUB beep 'Emito pitido con pulsacion
decsec=decsec-1 'Disminuyo decimas de segundo
ENDIF
IF PORTA.3=1 THEN 'Si pulso LEFT hago
PAUSE 100 'Pausa de 100ms para antirrebote
GOSUB beep 'Emito pitido con pulsacion
GOTO setsec 'Voy a setsec
ENDIF
IF minS+decmin+sec+decsec!=0 THEN 'Si la suma de los tiempos es distinto de 0 hago
IF PORTA.4=1 THEN 'Si pulso SET/BACK hago
PAUSE 100 'Pausa de 100ms para antirrebote
GOSUB savetime 'Guardo el ultimo tiempo de insolacion en la eeprom
GOSUB beep 'Emito pitido con pulsacion
GOTO start 'Voy a start
ENDIF
ENDIF
IF decsec>9 THEN 'Si la variable decsec es mayor que 9 le doy valor cero
decsec=0
ENDIF
GOTO setdecsec
setsec:
GOSUB lcd
PAUSE 200
LCDOUT $FE,$C0,$10,$10,$10,$10,$10,$10,$10, DEC mins,DEC decmin,":_",DEC decsec,$10,$10,$10,$10,$10,$10,$10,$10
PAUSE 200
IF PORTA.0=1 && minS!=1 THEN 'Si pulso UP y min es distinto de 1 hago
PAUSE 100 'Pausa de 100ms para antirrebote
GOSUB beep 'Emito pitido con pulsacion
sec=sec+1 'Incremento los segundos
ENDIF
IF PORTA.1=1 THEN 'Si pulso RIGHT hago
PAUSE 100 'Pausa de 100ms para antirrebote
GOSUB beep 'Emito pitido con pulsacion
GOTO setdecsec 'Voy a setdecsec'
ENDIF
IF PORTA.2=1 && minS!=1 THEN 'Si pulso DOWN y min es distinto de 1 hago
PAUSE 100 'Pausa de 100ms para antirrebote
GOSUB beep 'Emito pitido con pulsacion
sec=sec-1 'Disminuyo los segundos
ENDIF
IF PORTA.3=1 THEN 'Si pulso LEFT hago
PAUSE 100 'Pausa de 100ms para antirrebote
GOSUB beep 'Emito pitido con pulsacion
GOTO setdecmin 'Voy a setdecmin
ENDIF
IF minS+decmin+sec+decsec!=0 THEN 'Si la suma de los tiempos es distinto de 0 hago
IF PORTA.4=1 THEN 'Si pulso SET/BACK hago
PAUSE 100 'Pausa de 100ms para antirrebote
GOSUB savetime 'Guardo el ultimo tiempo de insolacion en la eeprom
GOSUB beep 'Emito pitido con pulsacion
GOTO start 'Voy a start
ENDIF
ENDIF
IF sec>5 THEN 'Si la variable sec es mayor que 5 le doy valor cero
sec=0
ENDIF
GOTO setsec
setdecmin:
GOSUB lcd
PAUSE 200
LCDOUT $FE,$C0,$10,$10,$10,$10,$10,$10,$10, DEC mins,"_:",DEC sec,DEC decsec,$10,$10,$10,$10,$10,$10,$10,$10
PAUSE 200
IF PORTA.0=1 && minS!=1 THEN 'Si pulso UP y min es distinto de 1 hago
PAUSE 100 'Pausa de 100ms para antirrebote
GOSUB beep 'Emito pitido con pulsacion
decmin=decmin+1 'Incremento las decimas de minuto
ENDIF
IF PORTA.1=1 THEN 'Si pulso RIGHT hago
PAUSE 100 'Pausa de 100ms para antirrebote
GOSUB beep 'Emito pitido con pulsacion
GOTO setsec 'Voy a setsec
ENDIF
IF PORTA.2=1 && minS!=1 THEN 'Si pulso DOWN y min es distinto de 1 hago
PAUSE 100 'Pausa de 100ms para antirrebote
GOSUB beep 'Emito pitido con pulsacion
decmin=decmin-1 'Disminuyo las decimas de minuto
ENDIF
IF PORTA.3=1 THEN 'Si pulso LEFT hago
PAUSE 100 'Pausa de 100ms para antirrebote
GOSUB beep 'Emito pitido con pulsacion
GOTO setmin 'Voy a setmin
ENDIF
IF minS+decmin+sec+decsec!=0 THEN 'Si la suma de los tiempos es distinto de 0 hago
IF PORTA.4=1 THEN 'Si pulso SET/BACK hago
PAUSE 100 'Pausa de 100ms para antirrebote
GOSUB savetime 'Guardo el ultimo tiempo de insolacion en la eeprom
GOSUB beep 'Emito pitido con pulsacion
GOTO start 'Voy a start
ENDIF
ENDIF
IF decmin>9 THEN 'Si la variable decmin es mayor que 9 le doy valor cero
decmin=0
ENDIF
GOTO setdecmin
setmin:
GOSUB lcd
PAUSE 200
LCDOUT $FE,$C0,$10,$10,$10,$10,$10,$10,$10, "_",DEC decmin,":",DEC sec,DEC decsec,$10,$10,$10,$10,$10,$10,$10,$10
PAUSE 200
IF PORTA.0=1 THEN 'Si pulso UP hago
PAUSE 100 'Pausa de 100ms para antirrebote
GOSUB beep 'Emito pitido con pulsacion
mins=mins+1 'Incremento los minutos
ENDIF
IF PORTA.1=1 THEN 'Si pulso RIGHT hago
PAUSE 100 'Pausa de 100ms para antirrebote
GOSUB beep 'Emito pitido con pulsacion
GOTO setdecmin 'Voy a setdecmin
ENDIF
IF PORTA.2=1 THEN 'Si pulso DOWN hago
PAUSE 100 'Pausa de 100ms para antirrebote
GOSUB beep 'Emito pitido con pulsacion
mins=mins-1 'Disminuyo los minutos
ENDIF
IF PORTA.3=1 THEN 'Si pulso LEFT hago
PAUSE 100 'Pausa de 100ms para antirrebote
GOSUB beep 'Emito pitido con pulsacion
GOTO setdecsec 'Voy a setdecsec
ENDIF
IF minS+decmin+sec+decsec!=0 THEN 'Si la suma de los tiempos es distinto de 0 hago
IF PORTA.4=1 THEN 'Si pulso SET/BACK hago
PAUSE 100 'Pausa de 100ms para antirrebote
GOSUB savetime 'Guardo el ultimo tiempo de insolacion en la eeprom
GOSUB beep 'Emito pitido con pulsacion
GOTO start 'Voy a start
ENDIF
ENDIF
IF mins>1 THEN 'Si la variable min es mayor que 1 le doy valor cero
mins=0
ENDIF
IF mins=1 THEN 'Si la variable min es igual a 1 decmin,sec y decsec se igualan a 0 para limitar el tiempo a 10:00 minutos
decmin=0
sec=0
decsec=0
ENDIF
GOTO setmin
'--------------------------------------------------------
'ULTIMO TIEMPO
readlasttime: 'Leo el tiempo de la ultima insolacion de la eeprom
I2CREAD sda,scl,$A0,addr2,[mins]
PAUSE 10
I2CREAD sda,scl,$A0,addr3,[decmin]
PAUSE 10
I2CREAD sda,scl,$A0,addr4,[sec]
PAUSE 10
I2CREAD sda,scl,$A0,addr5,[decsec]
PAUSE 10
GOTO setlasttime
setlasttime:
LCDOUT $FE,$80, " ULTIMO TIEMPO "
LCDOUT $FE,$C0,$10,$10,$10,$10,$10,$10,$10, DEC mins,DEC decmin,":",DEC sec,DEC decsec,$10,$10,$10,$10,$10,$10,$10,$10
IF PORTA.4=1 THEN 'Si pulso SET/BACK hago
PAUSE 100 'Pausa de 100ms para antirrebote
GOSUB beep 'Emito pitido con pulsacion
GOTO start 'Voy a start
ENDIF
GOTO setlasttime
'--------------------------------------------------------
'AJUSTE DE ILUMINACION
setbckl:
LCDOUT $FE,$80, "AJUSTAR ILUMINACION"
IF light!=255 THEN 'Permito subir iluminacion mientras light sea distinto a 255
IF PORTA.1=1 THEN 'Si pulso RIGHT hago
PAUSE 20 'Pausa de 20ms para antirrebote
light=light+1 'Aumento la iluminacion de la pantalla
LCDOUT $FE,1 'Limpio la pantalla
ENDIF
ENDIF
IF light!=0 THEN 'Permito disminuir iluminacion mientras light sea distinto a 0
IF PORTA.3=1 THEN 'Si pulso LEFT hago
PAUSE 20 'Pausa de 20ms para antirrebote
light=light-1 'Disminuyo la iluminacion de la pantalla
LCDOUT $FE,1 'Limpio la pantalla
ENDIF
ENDIF
IF PORTA.4=1 THEN 'Si pulso SET/BACK hago
PAUSE 100 'Pausa de 20ms para antirrebote
GOSUB beep 'Emito pitido con pulsacion
lcdout $FE,$C0, " Guardando ajustes " 'Muestro mensaje
PAUSE 1000 'Pausa de 1000ms
I2CWRITE sda,scl,$A0,addr0,[light] 'Guardo los ajustes en la eeprom
PAUSE 10 'Pausa hasta finalizar escritura
GOTO bckl 'Voy a bckl
ENDIF
IF light>255 then 'Barra de porcentaje de iluminacion
light=255
ENDIF
IF light>=0 and light<15 then
GOSUB bar0
ENDIF
IF light>=15 AND light<30 THEN
GOSUB bar1
ENDIF
IF light>=30 AND light<45 THEN
GOSUB bar2
ENDIF
IF light>=45 AND light<60 THEN
GOSUB bar3
ENDIF
IF light>=60 AND light<75 THEN
GOSUB bar4
ENDIF
IF light>=75 AND light<90 THEN
GOSUB bar5
ENDIF
IF light>=90 AND light<105 THEN
GOSUB bar6
ENDIF
IF light>=105 AND light<120 THEN
GOSUB bar7
ENDIF
IF light>=120 AND light<135 THEN
GOSUB bar8
ENDIF
IF light>=135 AND light<150 THEN
GOSUB bar9
ENDIF
IF light>=150 AND light<165 THEN
GOSUB bar10
ENDIF
IF light>=165 AND light<1100 THEN
GOSUB bar11
ENDIF
IF light>=1100 AND light<195 THEN
GOSUB bar12
ENDIF
IF light>=195 AND light<210 THEN
GOSUB bar13
ENDIF
IF light>=210 AND light<225 THEN
GOSUB bar14
ENDIF
IF light>=225 AND light<240 THEN
GOSUB bar15
ENDIF
IF light>=240 AND light<=255 THEN
GOSUB bar16
ENDIF
GOTO setbckl
'--------------------------------------------------------
'AJUSTE DE CONTRASTE
setcontrast:
LCDOUT $FE,$80, " AJUSTAR contrastE "
IF contrast!=255 THEN 'Permito subir contraste mientras contrast sea distinto a 255
IF PORTA.1=1 THEN 'Si pulso RIGHT hago
PAUSE 20 'Pausa de 20ms para antirrebote
contrast=contrast+1 'Aumento el contraste de la pantalla
ENDIF
ENDIF
IF contrast!=0 THEN 'Permito bajar contraste mientras contrast sea distinto a 0
IF PORTA.3=1 THEN 'Si pulso LEFT hago
PAUSE 20 'Pausa de 20ms para antirrebote
contrast=contrast-1 'Disminuyo el contraste de la pantalla
ENDIF
ENDIF
IF PORTA.4=1 THEN 'Si pulso SET/BACK hago
PAUSE 100 'Pausa de 20ms para antirrebote
GOSUB beep 'Emito pitido con pulsacion
lcdout $FE,$C0, " Guardando ajustes " 'Muestro mensaje
PAUSE 1000 'Pausa de 1000ms
I2CWRITE sda,scl,$A0,addr1,[contrast] 'Guardo los ajustes en la eeprom
PAUSE 10 'Pausa hasta finalizar escritura
GOTO cont 'Voy a cont
ENDIF
IF contrast>255 then 'Barra de porcentaje de contraste
contrast=255
ENDIF
IF contrast>=0 and contrast<15 then
GOSUB bar0
ENDIF
IF contrast>=15 AND contrast<30 THEN
GOSUB bar1
ENDIF
IF contrast>=30 AND contrast<45 THEN
GOSUB bar2
ENDIF
IF contrast>=45 AND contrast<60 THEN
GOSUB bar3
ENDIF
IF contrast>=60 AND contrast<75 THEN
GOSUB bar4
ENDIF
IF contrast>=75 AND contrast<90 THEN
GOSUB bar5
ENDIF
IF contrast>=90 AND contrast<105 THEN
GOSUB bar6
ENDIF
IF contrast>=105 AND contrast<120 THEN
GOSUB bar7
ENDIF
IF contrast>=120 AND contrast<135 THEN
GOSUB bar8
ENDIF
IF contrast>=135 AND contrast<150 THEN
GOSUB bar9
ENDIF
IF contrast>=150 AND contrast<165 THEN
GOSUB bar10
ENDIF
IF contrast>=165 AND contrast<1100 THEN
GOSUB bar11
ENDIF
IF contrast>=1100 AND contrast<195 THEN
GOSUB bar12
ENDIF
IF contrast>=195 AND contrast<210 THEN
GOSUB bar13
ENDIF
IF contrast>=210 AND contrast<225 THEN
GOSUB bar14
ENDIF
IF contrast>=225 AND contrast<240 THEN
GOSUB bar15
ENDIF
IF contrast>=240 AND contrast<=255 THEN
GOSUB bar16
ENDIF
GOTO setcontrast
'--------------------------------------------------------
'CONFIRMAR TIEMPO
start:
LCDOUT $FE,$80, " PULSE START "
LCDOUT $FE,$C0,$10,$10,$10,$10,$10,$10,$10, DEC mins,DEC decmin,":",DEC sec,DEC decsec,$10,$10,$10,$10,$10,$10,$10,$10
IF PORTA.4=1 THEN 'Si pulso SET/BACK hago
PAUSE 100 'Pausa de 100ms para antirrebote
GOSUB beep 'Emito pitido con pulsacion
GOTO maininsolate 'Voy a maininsolate
ENDIF
IF PORTA.5=1 THEN 'Si pulso START/PAUSE/STOP hago
PAUSE 100 'Pausa de 100ms para antirrebote
GOSUB beep 'Emito pitido con pulsacion
GOTO insolate 'Voy a insolate
ENDIF
GOTO start
'--------------------------------------------------------acabar esta parte con el sensor de tapa abierta. volver a maininsolate.
'FIN
final
LOW PORTC.2 'Desactivo el rele de las lamparas
LOW PORTC.7 'Apago el led de busy
HIGH PORTC.6 'Enciendo el led de power
LCDOUT $FE,$80, " RETIRAR PLACA " 'Muestro mensaje
GOSUB beep 'Emito 3 pitidos cada +/-30 segundos hasta que se abra la tapa
PAUSE 100
GOSUB beep
PAUSE 100
GOSUB beep
PAUSE 30000
GOTO final
'--------------------------------------------------------
'*********************************************************************************************************************************************************************
'********************************************************A PARTIR DE AQUI ESTAN HABILITADAS LAS INTERRUPCIONES********************************************************
'*********************************************************************************************************************************************************************
'--------------------------------------------------------
'INSOLAR
insolate:
LOW PORTC.6 'Apago el led de power
HIGH PORTC.7 'Enciendo el led de busy
HIGH PORTC.2 'Activo el rele de las lamparas
OPTION_REG = %1010110 'configuracion registro OPTION_REG (referirse al datasheet para mas info)
INTCON = %10100000 'configuracion del registro INTCON (referirse al datasheet para mas info)
LCDOUT $FE,$80, " INSOLANDO " 'Muestro mensaje
LCDOUT $FE,$C0,$10,$10,$10,$10,$10,$10,$10, DEC mins,DEC decmin,":",DEC sec,DEC decsec,$10,$10,$10,$10,$10,$10,$10,$10
ON INTERRUPT GOTO interrup 'Al generarse una interrupcion cada segundo voy a interrup
IF updatelcd=1 THEN 'Al generarse una interrupcion cada segundo updatelcd toma valor 1 y refresco la pantalla
LCDOUT $FE,$C0,$10,$10,$10,$10,$10,$10,$10, DEC mins,DEC decmin,":",DEC sec,DEC decsec,$10,$10,$10,$10,$10,$10,$10,$10
ENDIF
GOTO insolate
'--------------------------------------------------------
'*********************************************************************************************************************************************************************
'*****************************************************************************SUBRUTINAS******************************************************************************
'*********************************************************************************************************************************************************************
'--------------------------------------------------------
beep: 'Subrutinas para ahorrar espacio de programa (pitido)
FreqOut PORTC.5, 100, 5000
RETURN
savetime: 'Subrutinas para ahorrar espacio de programa (guardar tiempo de insolacion)
lcdout $FE,$C0, " Guardando tiempo "
PAUSE 970
I2CWRITE sda,scl,$A0,addr2,[mins]
PAUSE 10
I2CWRITE sda,scl,$A0,addr3,[decmin]
PAUSE 10
I2CWRITE sda,scl,$A0,addr4,[sec]
PAUSE 10
I2CWRITE sda,scl,$A0,addr5,[decsec]
PAUSE 10
RETURN
bar0: 'Subrutinas para ahorrar espacio de programa (mostrar barra de iluminacion/contraste)
lcdout $FE,$C0, "<- +>"
RETURN
bar1:
lcdout $FE,$C0, "<-",$FF," +>"
RETURN
bar2:
lcdout $FE,$C0, "<-",$FF,$FF," +>"
RETURN
bar3:
lcdout $FE,$C0, "<-",$FF,$FF,$FF," +>"
RETURN
bar4:
lcdout $FE,$C0, "<-",$FF,$FF,$FF,$FF," +>"
RETURN
bar5:
lcdout $FE,$C0, "<-",$FF,$FF,$FF,$FF,$FF," +>"
RETURN
bar6:
lcdout $FE,$C0, "<-",$FF,$FF,$FF,$FF,$FF,$FF," +>"
RETURN
bar7:
lcdout $FE,$C0, "<-",$FF,$FF,$FF,$FF,$FF,$FF,$FF," +>"
RETURN
bar8:
lcdout $FE,$C0, "<-",$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF," +>"
RETURN
bar9:
lcdout $FE,$C0, "<-",$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF," +>"
RETURN
bar10:
lcdout $FE,$C0, "<-",$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF," +>"
RETURN
bar11:
lcdout $FE,$C0, "<-",$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF," +>"
RETURN
bar12:
lcdout $FE,$C0, "<-",$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF," +>"
RETURN
bar13:
lcdout $FE,$C0, "<-",$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF," +>"
RETURN
bar14:
lcdout $FE,$C0, "<-",$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF," +>"
RETURN
bar15:
lcdout $FE,$C0, "<-",$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF," +>"
RETURN
bar16:
lcdout $FE,$C0, "<-",$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,"+>"
RETURN
lcd: 'Subrutina para ahorrar espacio de programa (mostrar ajustar tiempo en LCD)
LCDOUT $FE,$80, " AJUSTAR TIEMPO "
LCDOUT $FE,$C0,$10,$10,$10,$10,$10,$10,$10, DEC minS,DEC decmin,":",DEC sec,DEC decsec,$10,$10,$10,$10,$10,$10,$10,$10
RETURN
DISABLE 'Deshabilita interrupciones dentro de la subrutina de interrupcion
interrup:
counter=counter+1 'Incrementa el contador de interrupciones del TMR0
TMR0=0 'Resta 4 al contador de 256 del TMR0
IF counter < 31 THEN reset '31 cuentas * 32256ms = 999936us = 1s (Al cumplirse el ciclo reinicio el flag del TMR0)
counter=0 'Cada segundo transcurrido - Actualiza el tiempo
IF decsec>=0 THEN 'Si decsec es menor o igual que 0
decsec=decsec-1 'le voy restando 1
IF decsec=255 THEN 'Si decsec es igual a 255
decsec=9 'le doy valor 9
IF sec>=0 THEN 'Si sec es menor o igual que 0
sec=sec-1 'le voy restando 1
IF sec=255 THEN 'Si sec es igual a 255
sec=5 'le doy valor 5
IF decmin>=0 THEN 'Si decmin es menor o igual que 0
decmin=decmin-1 'le voy restando 1
IF decmin=255 THEN 'Si decmin es igual a 255
decmin=9 'le doy valor 9
IF mins>=0 THEN 'Si min es menor o igual que 0
mins=mins-1 'le voy restando 1
IF mins=255 THEN 'Si min es igual a 255
mins=1 'le doy valor 1
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
IF mins=0 && decmin=0 && sec=0 && decsec=0 THEN 'Si el tiempo llega a 00:00 hago
LCDOUT $FE,1 'Limpio la pantalla
PAUSE 100 'Pausa de 100ms para refrescar LCD
GOTO final 'Voy a final
ENDIF
updatelcd=1 'Actualizar LCD
reset:
INTCON.2 = 0 'Por cada ciclo de 31 cuentas reinicio el flag del TMR0
RESUME
ENABLE
'--------------------------------------------------------
'*********************************************************************************************************************************************************************
'**************************************************************************FIN DEL PROGRAMA***************************************************************************
'*********************************************************************************************************************************************************************
'--------------------------------------------------------
END 'Fin del programa