TODOPIC

Microcontroladores PIC => Lenguaje Basic para microcontroladores PIC => Mensaje iniciado por: b16a1 en 31 de Marzo de 2008, 17:06:02

Título: Pequeño programa en PBP con pequeño problema
Publicado 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

Código: [Seleccionar]
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.
Título: Re: Pequeño programa en PBP con pequeño problema
Publicado por: facundo_10 en 31 de Marzo de 2008, 19:59:32
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!
Título: Re: Pequeño programa en PBP con pequeño problema
Publicado por: navaismo en 31 de Marzo de 2008, 20:42:16
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.
Título: Re: Pequeño programa en PBP con pequeño problema
Publicado por: navaismo en 31 de Marzo de 2008, 22:11:17
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
Título: Re: Pequeño programa en PBP con pequeño problema
Publicado por: facundo_10 en 31 de Marzo de 2008, 22:27:46
Gracuias por despejarme la duda !
Título: Re: Pequeño programa en PBP con pequeño problema
Publicado por: b16a1 en 01 de Abril de 2008, 02:54:58
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
Título: Re: Pequeño programa en PBP con pequeño problema
Publicado por: navaismo en 01 de Abril de 2008, 12:30:21
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
Título: Re: Pequeño programa en PBP con pequeño problema
Publicado por: b16a1 en 01 de Abril de 2008, 13:36:02
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