TODOPIC
Microcontroladores PIC => Lenguaje Basic para microcontroladores PIC => Mensaje iniciado por: b16a1 en 31 de Marzo de 2008, 17:06:02
-
tengo un pequeño problemin con este programa escrito en PBP, el programa lo saque de una pagina en internet y consiste en un candado electronico con clave
lo raro es que lo simulo en proteus y me va de maravilla :(
estoy usando un pic 16f877a, una botonera simple montada en un protoboard con resistencias de 10k (ver proteus para ver como lo tengo) y un display lcd de 16x2.
todo funciona bien ecepto cuando apreto por primera ves la tecla numero 1, ya que me aparece el mensaje PROCESSING... y luego WRONG PASSWORD
y segun la secuencia de este programa deberia decir ENTER THE FIRST NUMBER
esto solo sucede la primera ves ya que al segundo intento el programa corre de maravilla.
aqui les dejo el codigo
DEFINE LCD_DREG PORTA 'Comunicación con el LCD por el puerto A
DEFINE LCD_DBIT 0 'El bus de datos del LCD comienza en el bit 0
DEFINE LCD_BITS 4 'Bus del LCD en modo de 4 bits
DEFINE LCD_LINES 2 ' LCD de dos lineas
DEFINE LCD_EREG PORTB ' Setea el portb para LCD Enable
DEFINE LCD_EBIT 0 ' Setea el bit 0 para LCD Enable
DEFINE OSC 20 ' 4 MHz del Oscilador
NUM var byte ' Variable para almacenar el numero leido del teclado
FKY var byte ' Flag para identificar el metodo que invoca la lectura
cont var byte ' variable para contar los errores
TRISB = %01110000 ' RB7, RB3 - RB1 como salidas, (0 = output y 1 = input)
TRISA = $0 ' Todo el puerto A como salidas
PORTB.7 = 0
pause 500 'Inicialización
Lcdout $fe, 1 ' Limpia pantalla LCD
Lcdout "IPN-INFORMATICS" ' Despliega mensaje
Lcdout $fe, $C0 ' Salta a segunda línea
Lcdout "ENGINEERING" ' Despliega mensaje
pause 2000
Lcdout $fe, 1 ' Limpia pantalla LCD
Lcdout " ELECTRONIC " ' Despliega mensaje
Lcdout $fe, $C0 ' Salta a segunda línea
Lcdout " LOCK " ' Despliega mensaje
pause 1500
INICIO: Lcdout $fe, 1 ' Limpia pantalla LCD
Lcdout " PUSH 1 TO " ' Despliega mensaje
Lcdout $fe, $C0 ' Salta a segunda línea
Lcdout "ENTER PASSWORD"
pause 500
MSG: PORTB = $2 ' Se energiza el primer renglon
IF PORTB = $12 then ' ¿Se presionó el numero 1?
Lcdout $fe, 1 ' Limpia pantalla LCD
Lcdout "PROCESSING..." ' Despliega mensaje
pause 1000
Lcdout $fe, 1 ' Limpia pantalla LCD
Lcdout "ENTER THE FIRST" ' Despliega mensaje
Lcdout $fe, $C0 ' Salta a segunda línea
Lcdout "NUMBER"
goto KEY1
Endif
goto MSG
KEY1: FKY = 1 ' Estamos en el primer numero
IF NUM = 5 then ' ¿se presionó el numero correcto?
Lcdout $fe, 1 ' Limpia pantalla LCD
Lcdout "PROCESSING..." ' Despliega mensaje
pause 500
Lcdout $fe, 1 ' Limpia pantalla LCD
Lcdout "ENTER THE NEXT" ' Despliega mensaje
Lcdout $fe, $C0 ' Salta a segunda línea
Lcdout "NUMBER"
NUM = 0
goto KEY2
ENDIF
IF NUM <> 0 then goto ERROR ' Se presionó una tecla ?
goto LEER ' Ir a leer el teclado
KEY2: FKY = 2 ' Estamos en el segundo numero
IF NUM = 7 then ' ¿se presionó el numero correcto?
Lcdout $fe, 1 ' Limpia pantalla LCD
Lcdout "PROCESSING..." ' Despliega mensaje
pause 500
Lcdout $fe, 1 ' Limpia pantalla LCD
Lcdout "ENTER THE NEXT" ' Despliega mensaje
Lcdout $fe, $C0 ' Salta a segunda línea
Lcdout "NUMBER"
NUM = 0
goto KEY3
ENDIF
IF NUM <> 0 then goto ERROR ' Se presionó una tecla ?
goto LEER ' Ir a leer el teclado
KEY3: FKY = 3 ' Estamos en el segundo numero
IF NUM = 3 then ' ¿se presionó el numero correcto?
Lcdout $fe, 1 ' Limpia pantalla LCD
Lcdout "PROCESSING..." ' Despliega mensaje
pause 500
Lcdout $fe, 1 ' Limpia pantalla LCD
Lcdout "ENTER THE NEXT" ' Despliega mensaje
Lcdout $fe, $C0 ' Salta a segunda línea
Lcdout "NUMBER"
NUM = 0
goto KEY4
ENDIF
IF NUM <> 0 then goto ERROR ' Se presionó una tecla ?
goto LEER ' Ir a leer el teclado
KEY4: FKY = 4 ' Estamos en el segundo numero
IF NUM = 9 then ' ¿se presionó el numero correcto?
pause 500
goto EXITO
ENDIF
IF NUM <> 0 then goto ERROR ' Se presionó una tecla ?
goto LEER ' Ir a leer el teclado
LEER: PORTB = $2 ' Se energiza el primer renglon
NUM = 0 ' Suponemos que no se ha presionado ningun numero
IF PORTB = $12 THEN NUM = 1 ' ¿Se presionó el numero 1?
IF PORTB = $22 THEN NUM = 2 ' ¿Se presionó el numero 2?
IF PORTB = $42 THEN NUM = 3 ' ¿Se presionó el numero 3?
PORTB = $4 ' Se energiza el segundo renglon
IF PORTB = $14 THEN NUM = 4 ' ¿Se presionó el numero 4?
IF PORTB = $24 THEN NUM = 5 ' ¿Se presionó el numero 5?
IF PORTB = $44 THEN NUM = 6 ' ¿Se presionó el numero 6?
PORTB = $8 ' Se energiza el tercer renglon
IF PORTB = $18 then NUM = 7 ' ¿se presionó el numero 7?
IF PORTB = $28 THEN NUM = 8 ' ¿Se presionó el numero 8?
IF PORTB = $48 THEN NUM = 9 ' ¿Se presionó el numero 9?
IF FKY = 1 then goto KEY1
IF FKY = 2 then goto KEY2
IF FKY = 3 then goto KEY3
IF FKY = 4 then goto KEY4
EXITO: Lcdout $fe, 1 ' Limpia pantalla LCD
Lcdout " OPEN LOCK :-) " ' Despliega mensaje
pause 5000
cont = 0
Lcdout $fe, 1 ' Limpia pantalla LCD
goto INICIO
ERROR: cont = cont + 1
num=0
Lcdout $fe, 1 ' Limpia pantalla LCD
Lcdout "WRONG PASSWORD" ' Despliega mensaje
if cont => 4 then goto ALARMA
pause 1000
goto INICIO
ALARMA: PORTB.7 = 0
Lcdout $fe, 1 ' Limpia pantalla LCD
PAUSE 200
Lcdout "! ALARM !"
PORTB.7 = 1
Pause 200
goto ALARMA
END
bueno tambien dejare los archivos con la simulacion en proteus en
http://rapidshare.de/files/38984314/ElectronicLockPIC16F877A.rar.html
desde ya muchas gracias por cualquier sugerencia y/o ayuda.
-
una pregunta aqui en esta rutina :
INICIO: Lcdout $fe, 1 ' Limpia pantalla LCD
Lcdout " PUSH 1 TO " ' Despliega mensaje
Lcdout $fe, $C0 ' Salta a segunda línea
Lcdout "ENTER PASSWORD"
pause 500
Aqui me parece que tendrias que dejar una espera o algo, porque cuando pasa la pause de 0.5 segundos, que hace el programa a que rutina salta ?No hay ni un GOTO, ni GOSUB, ni un IF , THEN ELSE.. No entiendo bien esa parte del programa!
-
Se va a la rutina de MSG, por default - o mejor dicho por lo que entiendo- todos los lenguajes de programacion corren linea a linea de arriba hacia abajo a menos que se le diga donde saltar.
La etiqueta INICIO lo que hace es mostrar en un LCD en la primer linea el mensaje de PUSH 1 TO y en la segunda ENTER PASSWORD, lo que en la realidad verias como
PUSH 1 TO
ENTER PASSWORD
Si ya se que esta de mas poner eso, pero eso es lo que hace esa rutina, lo que comentas del IF viene abajito en MSG ahi evalua la condicion.
-
Hola b16a1, por lo que comentas solo pasa la primera que usas el programa, puede ser que rebota demasiado el boton, crea un antirrebotes por software.
¿Como lo puedes hacer?
Mete un if anidado con una pause de unos 50 milisegundos
-
Gracuias por despejarme la duda !
-
MSG: PORTB = $2 ' Se energiza el primer renglon
IF PORTB = $12 then goto RETARDO ' ¿Se presionó el numero 1?
RETARDO:
IF PORTB = $2 then
Lcdout $fe, 1 ' Limpia pantalla LCD
Lcdout "PROCESSING..." ' Despliega mensaje
pause 1000
Lcdout $fe, 1 ' Limpia pantalla LCD
Lcdout "ENTER THE FIRST" ' Despliega mensaje
Lcdout $fe, $C0 ' Salta a segunda línea
Lcdout "NUMBER"
goto KEY1
else
PAUSE 50
goto RETARDO
Endif
goto MSG
nose si estara bien pero le puse que mientras este pulsado el boton se quede en retardo, y una ves que se deje de pulsar continue con el programa
que me dicen?
p.d: gracias por todos los comentarios y ayudas
-
Yo me referia mas a un antirebote, como veras cuando pulsas un boton pasas de estado alto a bajo -o viceserversa segun sea el caso- muchas veces antes de que el boton estabilice su estado. Esto ocasiona que el micro pueda leer esos rebotes y por eso salte a la otra rutina un antirebote por software seria mas o menos asi.
IF PORTX.X=1 then
pause 50 'aqui haces el antirrebote esperas 50ms para que se acoplen los contactos del boton
IF PORTX.X=1 then 'aqui vuelves a leer el estado si cumple con el anterior ejecutas las rutinas
...
...
endif
endif
Saludos
-
MSG: PORTB = $2 ' Se energiza el primer renglon
IF PORTB = $12 then ' ¿Se presionó el numero 1?
pause 50 'antirrebote por software
if portb = $12 then
Lcdout $fe, 1 ' Limpia pantalla LCD
Lcdout "PROCESSING..." ' Despliega mensaje
pause 1000
Lcdout $fe, 1 ' Limpia pantalla LCD
Lcdout "ENTER THE FIRST" ' Despliega mensaje
Lcdout $fe, $C0 ' Salta a segunda línea
Lcdout "NUMBER"
goto KEY1
endif
Endif
goto MSG
puse en rojo lo que modifique en el codigo
disculpenme si soy muy pregunton
pero a penas valla al laboratorio de mi universidad quemo el pic
y les cuento como me fue
gracias navaismo