Autor Tema: Duda con I2C  (Leído 2160 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado JORGITO_YKE

  • PIC10
  • *
  • Mensajes: 39
Duda con I2C
« en: 22 de Mayo de 2014, 18:54:03 »
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:

Código: [Seleccionar]
'--------------------------------------------------------
'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

« Última modificación: 02 de Junio de 2014, 22:27:02 por JORGITO_YKE »

Desconectado ricb

  • PIC10
  • *
  • Mensajes: 7
Re: Duda con I2C
« Respuesta #1 en: 24 de Mayo de 2014, 09:24:46 »
Hola...mirando tú esquema y el programa no coinciden las señales de datosy el clock entre el PIC  y la memoria.
Saludos

Desconectado JORGITO_YKE

  • PIC10
  • *
  • Mensajes: 39
Re: Duda con I2C
« Respuesta #2 en: 24 de Mayo de 2014, 17:35:23 »
Si al final me acabe dando cuenta. Pero gracias de todos modos. No esta de menos pausar de vez en cuando las tareas jaja. Aun así me surge otra pequeña duda. Corregir corregí todo eso. Pero hice un simple programa para probar que consta de 4 botones (botón 1: graba en la EEPROM el valor de X; botón 2: lee la EEPROM y pone el valor en Y;botón 3: muestra el valor de VAR X;botón 4: muestra valor de VAR Y) X=15 e Y=0, lo que hago es escribir el valor de X y luego lo coloco en Y. Mi pregunta es porque leo 15 y me devuelve 16??? En proteus simula bien pero en la realidad hace ese experimento raro. Saludos.
« Última modificación: 02 de Junio de 2014, 22:25:23 por JORGITO_YKE »

Desconectado JORGITO_YKE

  • PIC10
  • *
  • Mensajes: 39
Re: Duda con I2C
« Respuesta #3 en: 02 de Junio de 2014, 22:25:57 »
Creí tenerlo listo pero nada sigue fallando. Solo lee 16. He adjuntado el nuevo código que estoy usando. Como dije en proteus funciona perfectamente pero en la realidad pues no. Alguien tiene alguna sugerencia? O hay algo que pusiera mal en el código? Muchas gracias. La eeprom que uso es una 24c01.
« Última modificación: 02 de Junio de 2014, 22:29:35 por JORGITO_YKE »