problema con programacion para EEPROM interna PIC 16F628A

buenas, pues no se donde dejar este tema, decido dejarlo aqui...
hoy he estado programando un cerrojo con calve en la memoria EEPROM y poder cambiar la clave (y que no se borre cuando se resetea el PIC)
les paso el codigo, para que vean como es, y si habria algun fallo..
esta en basic:

PHP:
'****************************************************************
'*  Name    : CERRADURA ELECTRONICA.BAS                         *
'*  Author  : Mulinee..46                                       *
'*  Notice  : Copyright (c) 2010 Mulinee..46                    *
'*          : All Rights Reserved                               *
'*  Date    : 27/07/2010                                        *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************
cmcon = 7                       ;cambiar a modo digital todo el puerto A
NUMERO VAR BYTE                 ;variable numero para almacenar la tecla pulsada
R VAR BYTE                      ;variable r para hacer repeticiones
BIP VAR PORTA.0                 ;el portA.0 Bip (conectar chicharra activa)
LEDVERDE VAR PORTA.1            ;el portA.1 se llamara LEDVERDE
LEDROJO VAR PORTA.3             ;el portA.3 se llamara LEDROJO
LEDAMARILLO VAR PORTA.4         ;el portA.4 se llamara LEDAMARILLO
LEDBLOQUEADO var PORTA.5        ;el portA.5 se llamara LEDBLOQUEADO
DOOR var PORTA.2                ;el portA.2 conectar rele para la cerradura
A var PORTB.0                   ;nombres para los pines de las filas
B VAR PORTB.1
C VAR PORTB.2
D VAR PORTB.3
UNO VAR PORTB.4                 ;nombres para los pines de las columnas
DOS VAR PORTB.5
TRES VAR PORTB.6
CUATRO VAR PORTB.7
SETPRIME VAR BYTE              ;variable para almacenar la 1era clave
SETSEGUN VAR BYTE              ;variable para almacenar la 2da clave
SETERCER VAR BYTE              ;variable para almacenar la 3ra clave
SETCUART VAR BYTE              ;variable para almacenar la 4ta clave
INICIANDO:                     ;programa del led para saber si esta funcionando
FOR R = 1 TO 2
high LEDVERDE : HIGH BIP
PAUSE 1000
LOW LEDVERDE : LOW BIP
PAUSE 150
NEXT
;******************GUARDA LA CLAVE DE FABRICA**********************
EEPROM 0.[1,2,3,4]               ;cargar la memoria EEPROM desde la direccion 0 en adelante
;******************************************************************
RESET:
FOR R = 1 TO 3
HIGH LEDAMARILLO : HIGH BIP
PAUSE 50
LOW LEDAMARILLO : LOW BIP
PAUSE 50
IF (CUATRO=0) AND (UNO=0) THEN RESET   ;corresponden a las teclas 7 y C
NEXT
READ 0,SETPRIME               ;leer el dato de la EEPROM 0 y guardar en setprime
READ 1,SETSEGUN               ;leer el dato de la EEPROM 1 y guardar en setsegun
read 2,SETERCER               ;leer el dato de la EEPROM 2 y guardar en setercer
read 3,SETCUART               ;leer el dato de la EEPROM 3 y guardar en setcuart
goto TECLAUNO                 ;ir a comparar claves
GRABAUNO:                     ;programa para cambiar clave
GOSUB PTECLA : HIGH LEDROJO : HIGH LEDVERDE   ;espera a que suelte las teclas
GOSUB BARRIDO : GOSUB PTECLA  ;ir a barrido y retorna a un antirrebote
HIGH LEDROJO : HIGH LEDVERDE  ;mantener encendido el LED
WRITE 0,NUMERO                ;guardar en la EEPROM 0 el valor de numero
GRABADOS:                     ;programa para cambiar clave
gosub BARRIDO : GOSUB PTECLA  ;ir a barrido y retorna a un antirrebote
high LEDROJO : HIGH LEDVERDE  ;mantener encendido el LED
WRITE 1,NUMERO                ;guardar en la EEPROM 1 el valor de numero
GRABATRES:                    ;programa para cambiar clave
gosub BARRIDO : GOSUB PTECLA  ;ir a barrido y retorna a un antirrebote
high LEDVERDE : HIGH LEDROJO  ;mantener encendido el LED
write 3,NUMERO                ;guardar en la EEPROM 3 el valor de numero
GRABACUATRO:                  ;programa para cambiar clave
high LEDROJO : HIGH LEDVERDE  ;mantener encendido el LED
write 4,NUMERO                ;guardar en la EEPROM 4 el valor de numero
goto RESET                    ;ir a reset para cargar el nuevo valor en las variables
BARRIDO:
low A                         ;sensar la fila A
if UNO =     0 THEN NUMERO = 1 : RETURN   ;tecla pulsada retorne cargada con 1
IF DOS =     0 THEN NUMERO = 2 : RETURN   ;tecla pulsada retorne cargada con 2
IF TRES =    0 THEN NUMERO = 3 : RETURN   ;tecla pulsada retorne cargada con 3
IF CUATRO = 0 THEN NUMERO = 10 : RETURN   ;tecla pulsada retorne cargada con 10
HIGH A
LOW B                         ;sensar la fila B
IF UNO =     0 THEN NUMERO = 4 : RETURN   ;tecla pulsada retorne cargada con 4
if DOS =     0 then NUMERO = 5 : return   ;tecla pulsada retorne cargada con 5
IF TRES =    0 then NUMERO = 6 : return   ;tecla pulsada retorne cargada con 6
if CUATRO = 0 then NUMERO = 11 : return   ;tecla pulsada retorna cargada con 11
high B 
low C                        ;sensar la fila C
if UNO =     0 then NUMERO = 7 : return   ;tecla pulsada retorne cargada con 7
if DOS =     0 THEN NUMERO = 8 : RETURN   ;tecla pulsada retorne cargada con 8
if TRES =    0 then NUMERO = 9 : return   ;tecla pulsada retorne cargada con 9
if CUATRO = 0 Then NUMERO = 12 : return   ;tecla pulsada retorne cargada con 12
high C
low D                       ;sensar la fila D
If UNO =    0 then NUMERO = 14 : return   ;tecla pulsada retorne cargada con 14
if DOS =     0 then NUMERO = 0 : return   ;tecla pulsada retorne cargada con 0
if TRES =   0 then NUMERO = 15 : return   ;tecla pulsada retorne cargada con 15
if CUATRO = 0 then NUMERO = 13 : return   ;tecla pulsada retorne cargada con 13
high D
pause 10
GOTO BARRIDO
;*********************PROGRAMA ANTIRREBOTE DE TECLAS****************
PTECLA:
high LEDVERDE : high BIP ;genera sonido cada vez que se pulsa tecla
pause 100                ;duracion 100 milisegundos
low LEDVERDE : low BIP   ;apagar sonido y led
ESPACIO:                 ;programa antirrebote de teclas
if UNO =    0 then ESPACIO   ;si la tecla sigue pulsada ir   espacio
IF DOS =    0 then ESPACIO   ;si la tecla sigue pulsada ir a espacio
IF TRES =   0 THEN ESPACIO   ;si la tecla sigue pulsada ir a espacio 
IF CUATRO = 0 then ESPACIO   ;si la tecla sigue pulsada ir a espacio
pause 25
return                       ;retorna si suelta las teclas
;******************************************************************
;**********************COMPARACION DE CLAVES***********************
TECLAUNO:
GOSUB BARRIDO             ;ir a barrido y retornar con un valor
GOSUB PTECLA              ;envia a un programa antirrebote para soltar tecla
if NUMERO = SETPRIME then TECLADOS   ;si el numero es igual a SETPRIME ir a TECLADOS
goto FALSO                ;caso contrario ir a lazo falso
TECLADOS:
gosub BARRIDO             ;ir a barrido y retornar con un valor
GOSUB PTECLA              ;envia a un programa antirrebote para soltar tecla
if NUMERO = SETSEGUN THEN TECLATRES   ;si el numero es igual a SETSEGUN ir a TECLATRES
goto FALSO1               ;caso contrario ir a lazo falso
TECLATRES:
GOSUB BARRIDO             ;ir a barrido y retornar con un valor
GOSUB PTECLA              ;envia a un programa antirrebote para soltar tecla
if NUMERO = SETERCER THEN TECLACUATRO   ;si el numero es igual a SETERCER ir a TECLACUATRO
goto FALSO2               ;caso contrario ir a lazo falso
TECLACUATRO:
GOSUB BARRIDO             ;ir a barrido y retornar con un valor
GOSUB PTECLA              ;envia a un programa antirrebote para soltar tecla
if NUMERO = SETCUART THEN OPENGE   ;si el numero es igual a SETCUART conectar rele
GOTO FALSO3               ;caso contrario ir a lazo falso
OPENGE:
FOR R = 1 to 2            ;2 pitos indica clave correcta
pause 100 
high LEDAMARILLO : high BIP : HIGH LEDVERDE
pause 100
low LEDAMARILLO : LOW LEDVERDE : LOW BIP
next
high DOOR                ;se conecta rele (abrir puerta)
PAUSE 1500               ;esperar 1,5 segundos
low DOOR                 ;desconectar rele
HIGH A : HIGH B : HIGH C : LOW D   ;sensar solo la fila D
IF CUATRO = 0 THEN GRABAUNO   ;corresponde a la tecla D para ir a GRABAR
GOTO TECLAUNO                 ;ir nuevamente a comparar las claves
;******************************************************************
;****************LAZOS FALSOS TECLAS ERRONEAS**********************
FALSO:
gosub BARRIDO : GOSUB PTECLA   ;estas teclas no comparan ninguna
FALSO1:                        ;clave solo espera que termine de
GOSUB BARRIDO : GOSUB PTECLA   ;pulsar las 4 teclas y no hacer nada
FALSO2:
GOSUB BARRIDO : GOSUB PTECLA 
FALSO3:
for R = 1 to 15                ;30 pitos indica calve incorrecta
pause 150
high LEDROJO : HIGH BIP
pause 150
low LEDROJO : LOW BIP
high A : HIGH B : HIGH D : LOW C   ;sensar solo la fila C
if (CUATRO = 0) AND (UNO = 0) then RESET   ;corresponden a las teclas 7 y C para resetear
next
PANICO:
high LEDBLOQUEADO
pause 500
low LEDBLOQUEADO
pause 500
HIGH A : HIGH B : HIGH D : LOW C   ;sensar solo la fila C
IF (CUATRO = 0) AND (UNO = 0) THEN RESET   ;corresponden a las teclas 7 y C para resetear
GOTO PANICO                        ;queda en este lazo para siempre
;******************************************************************
end
si hay que cambiar algo, diganmelo porfavor, gracias..

ahora presento seguidamente donde esta el problema:

PHP:
;******************GUARDA LA CLAVE DE FABRICA**********************
EEPROM 0.[1,2,3,4]             ;cargar la memoria EEPROM desde la direccion 0 en adelante
;******************************************************************
utilizo el MicroCode Studio + PBP244, y me da el error con eso , y me dice lo siguiente:

"
warning line 46: bad token "."
error line 46: expected '['. (CERRADURA ELECTRONICA CON CLAVE EN MEMORIA EEPROM Y CAMBIO DE CLAVE.bas)
"


es la primera vez que hago una programacion asi, y por lo que he visto, en lo demas no da falla.. mañana acabare de hacer el diagrama y lo subo, y me dicen tambien si esta bien...

si necesitan mas informacion, solo diganmelo(y)
saludos
 
Hazle caso al compilador, ahí te dice que punto "." es incorrecto, debes de escribir coma ","...
La sintaxis es EEPROM {Location,}[Constant{,Constant...}]... en el manual o help dice lo mismo.

Saludos
 
vale ok, entonces me tendria que quedar asi?
PHP:
;******************GUARDA LA CLAVE DE FABRICA**********************
EEPROM 0,[1,2,3,4] ;cargar la memoria EEPROM desde la direccion 0 en adelante
;******************************************************************
buen.. almenos asi no me da el error este..
gracias Carlos Alexis

ya he hecho el circuito pero.. no entiendo porque pasa esto..
a ver.. teoricamente tendria que estar desactivados los puertos b.0, b.1, b.2, b.3, y cuando le doy al pulsador, estos se activan..
porque aqui no?
estan mal conectados?
hay algun error en el codigo?
diguanme algo porfavor
saludos
 

Adjuntos

  • Pulsadores2.GIF
    Pulsadores2.GIF
    198.3 KB · Visitas: 64
Última edición:
Bueno, en ningún lado del código veo que usas los TRISx de los puertos y según el esquema del teclado debería ser TRISB = %11110000.
Desplazando un cero entre los pines 0, 1, 2, 3 y leyendo en busca de un cero en los pines 4, 5, 6, 7, obtendrías la tecla pulsada. Lo veo bien pero hace falta configurar el TRISx.
Pero una duda; las resistencias están a Pull-up o Pull-Down?, no se nota bien en el esquema ya que todos los pines del puerto B están a "1", creo que eso del TRISx es lo que te falta.

Saludos.
 
vale, ya me va.. hay algun mas que otro error pero .. da igual, tiene solucion

ok, ahora mirare lo que dices carlos, pero antes he conseguido que funcionara sin la configuracion TRISBx
 
Última edición:
Que bien, por mi parte prefiero estar seguro de lo que hago... ya sabes no se confía cuando usan frases como "Tal vez, es posible, pero antes funcionaba así!!" jeje...
En fin, cada compilador tiene sus cosas... por cierto has probado activar los Pull-Up del PORTB en modo entrada?, de esa forma te ahorras resistencias.

Suerte.
Saludos.
 
Atrás
Arriba