Alarma pic16f628a no funciona

#2
Y que errores has tenido al simularla? si no das mas datos dudo mucho que alguien te ayude...
 
#3
Bueno, lo principal es que no activa el relé cuando se digita la clave, a pesar que todo el código aparenta estar bien, simplemente enciende el led y queda lista para volver a digitar la clave (1,2,3,4). He revisado y segun el texto todo está bien, por tal motivo es que solicito me ayuden para ver si puedo armarla pues la verdad no manejo Assembler y el Basic me parece más práctico a la hora de desarrollar los proyectos.

Gracias y sigo atento a cualquier comentario.
 
#6
Yo sigo insistiendo en encontrar orientación!!!:cool:
La idea general es que cuando se opriman las teclas 7 y c del teclado hexadecimal, se pueda introducir la nueva clave.

Normalmente se deben digitar 1,2,3,4 y así activar el relé, sinembargo esto no está sucediendo. Agrego el código en Basic para ver quien puede echarme la mano.

PHP:
@ DEVICE pic16F628A, INTRC_OSC_NOCLKOUT ' Opción del Osc Interno
 @ DEVICE pic16F628A, WDT_ON ' Watchdog Timer ON
 @ DEVICE pic16F628A, PWRT_ON ' Power-On Timer
 @ DEVICE pic16F628A, BOD_ON
 @ DEVICE pic16F628A, MCLR_OFF ' Master Clear Opción interno
 @ DEVICE pic16F628A, LVP_OFF ' Bajo voltaje de programación
 @ DEVICE pic16F628A, CPD_OFF ' Protección del código de memoria OFF
 @ DEVICE pic16F628A, PROTECT_OFF' protección de código OFF

 CMCON=7                    ; Conversión de análogo a digital del puerto A
 NUMERO VAR BYTE
 R VAR BYTE
 BIP VAR PORTA.0
 LED VAR PORTA.1
 DOOR VAR PORTA.2
 A VAR PORTB.0              ; Nombre para los pines de las columnas de la matriz
 B VAR PORTB.1
 C VAR PORTB.2
 D VAR PORTB.3
 
 UNO VAR PORTB.4            ; Nombre para los pines de las filas de la matriz
 DOS var PORTB.5
 TRES VAR PORTB.6
 CUATRO VAR PORTB.7
 
 SETPRIME VAR BYTE            ; Variable para almacenar la primera clave
 SETSEGUN VAR BYTE            ; Variable para almacenar la segunda clave
 SETERCER VAR BYTE
 SETCUART VAR BYTE
 
 INICIANDO:
 FOR R=1 TO 3                 ; Programa del led para saber si está funcionando
 high LED: HIGH BIP
  PAUSE 1000
  LOW LED: LOW BIP
  pause 150
  next
  
   '*********** GUARDA LA CLAVE DE FABRICA ************
   EEPROM 0,[1,2,3,4] ' Cargar la memoria eeprom desde cero en adelante
   
   RESET:
    FOR R=1 TO 3
    high LED: HIGH BIP
    PAUSE 50
    LOW LED: LOW BIP
    pause 50
    
    IF (CUATRO=0) AND (UNO=0) THEN RESET; Corresponden a teclas 7 y C
    next
    
    read 0,SETPRIME ; Leer el dato de la eemprom 0 y gardar en setprime
    read 1,SETSEGUN
    READ 2,SETERCER
    READ 3,SETCUART
    
   
  GOTO TECLAUNO                ; Ir a comparar claves

  GRABAUNO:                    ; Programa para cambiar la clave
   GOSUB PTECLA: HIGH LED      ; Espera a que suelte las teclas
   GOSUB BARRIDO: GOSUB PTECLA ; Ir a BARRIDO y retorna a un antirrebote
   HIGH LED
   WRITE 0, NUMERO             ; Guardar en la eemprom 0 el valor de número
   
  GRABADOS:
   GOSUB BARRIDO:GOSUB PTECLA
   HIGH LED
   WRITE 1, NUMERO            ;  Guardar en la eemprom 1 el valor de número
   
  GRABATRES:
   GOSUB BARRIDO:GOSUB PTECLA
   HIGH LED
   WRITE 2, NUMERO            ;  Guardar en la eemprom 2 el valor de número
   
  GRABACUATRO:
   GOSUB BARRIDO: GOSUB PTECLA
   HIGH LED
   WRITE 3, NUMERO            ; Guardar en la eemprom 3 el valor de número
   
   GOTO RESET
      
  BARRIDO:
   LOW A                         ; Sensar fila A
   IF UNO=0 THEN NUMERO=1:RETURN ; Si pulsó la tecla uno devuelvala cargada con 1
   if dos=0 THEN NUMERO=2:RETURN
   IF TRES=0 THEN NUMERO=3:RETURN
   IF CUATRO=0 THEN NUMERO=10:RETURN
   HIGH a
   LOW B                         ; sensar la fila B
   IF UNO=0 THEN NUMERO=4:RETURN 
   if dos=0 THEN NUMERO=5:RETURN
   IF TRES=0 THEN NUMERO=6:RETURN
   IF CUATRO=0 THEN NUMERO=11:RETURN
   HIGH B
   LOW C                         ; sensar la fila C
   IF UNO=0 THEN NUMERO=7:RETURN 
   if dos=0 THEN NUMERO=8:RETURN
   IF TRES=0 THEN NUMERO=9:RETURN
   IF CUATRO=0 THEN NUMERO=12:RETURN
   HIGH C
   LOW D                         ; sensar la fila D
   IF UNO=0 THEN NUMERO=14:RETURN 
   if dos=0 THEN NUMERO=0:RETURN
   IF TRES=0 THEN NUMERO=15:RETURN
   IF CUATRO=0 THEN NUMERO=13:RETURN
   HIGH D
   PAUSE 10
   GOTO BARRIDO
   
   '*** PROGRAMA ANTIRREBOTE***
   PTECLA:
    HIGH LED:HIGH BIP             ; Genera sonido cada que se pulsa una tecla
    PAUSE 100
    LOW LED:LOW BIP
    
    ESPACIO:
     IF UNO=0 THEN ESPACIO        ; Si la tecla sigue pulsada ir a ESPACIO
     IF DOS=0 THEN ESPACIO
     IF TRES=0 THEN ESPACIO
     IF CUATRO=0 THEN ESPACIO
     PAUSE 25                      ; Retorna si se sueltan las teclas
     RETURN
     
    '*** COMPARACION DE CLAVES ***
   TECLAUNO:
    GOSUB BARRIDO                  ; Ir abarrido y retornar con un valor
    GOSUB PTECLA                   ; Envía a ANTIRREBOTE para soltar tecla
    IF NUMERO=SETPRIME THEN TECLADOS
    GOTO FALSO
    
   TECLADOS:
    GOSUB BARRIDO:GOSUB PTECLA
    IF NUMERO=SETSEGUN THEN TECLATRES
    GOTO FALSO1
    
   TECLATRES:
    GOSUB BARRIDO:GOSUB PTECLA
    IF NUMERO=SETERCER THEN TECLACUATRO
    GOTO FALSO2
    
   TECLACUATRO:
    GOSUB BARRIDO:GOSUB PTECLA
    IF NUMERO=SETCUART THEN OPENGE
    GOTO FALSO3
    
   OPENGE:
    FOR R=1 TO 2
    PAUSE 100
    HIGH LED:HIGH BIP
    PAUSE 100
    LOW LED:LOW BIP
    NEXT
    HIGH DOOR                          ; Se conecta el relé
    PAUSE 1000
    LOW DOOR
    HIGH A:HIGH B:HIGH C:LOW D         ; Sensar solo la fila D
    if CUATRO=0 THEN GRABAUNO          ; Corresponde tecla D grabar
    GOTO TECLAUNO
    
    '*** LAZOS FALSOS-TECLAS ERRÓNEAS ***
    FALSO:
     GOSUB BARRIDO:GOSUB PTECLA
     
    FALSO1:
     GOSUB BARRIDO: GOSUB PTECLA
    
    FALSO2:
    GOSUB BARRIDO:GOSUB PTECLA
   
    FALSO3:
     FOR R=1 TO 30
     PAUSE 150
     HIGH LED:HIGH BIP
     PAUSE 150
     HIGH A:HIGH B:HIGH D:LOW C ; Sensar solo la fila C
     if (cuatro=0) and (UNO=0) THEN RESET
     NEXT
     
     
    PANICO:
     HIGH LED
     PAUSE 500
     LOW LED 
     PAUSE 500
     HIGH A:HIGH B:HIGH D:LOW C
     if (cuatro=0) and (UNO=0) THEN RESET
     GOTO PANICO
     
    END
 
Última edición por un moderador:
#12
entonces no creo que sea problema de software ni de hardware... me suena mas a que algo sucede con el proteus...

Pero me quede con la duda... proteus genera sonido?
 
#13
entonces no creo que sea problema de software ni de hardware... me suena mas a que algo sucede con el proteus...

Pero me quede con la duda... proteus genera sonido?
En proteus si se puede generar sonido, claro que en la alarma no me funciona.

Descargué una serie de ejemplos en basic que supuestamente funcionan bien, sinembargo he probado leer un teclado 3X4 en lcd y me he encontrado con la sorpresa que no lee los numeros de la segunda columna y si se entra a variar con High y Low las columnas, entonces los valores que se muestran en pantalla son erraticos, aquí está el código por si alguien quiere analizarlo y encontrar el error, creo que por esto tampoco funciona la alarma pues si no hay una lectura correcta del teclado nunca va a funcionar la dichosa alarma, también adjunto la simulación.
Si alguien tiene una simulación con este pic para leer un teclado en basic que funcione, por favor subirla.

PHP:
@ DEVICE pic16F628A, INTRC_OSC_NOCLKOUT ' Opción del Osc Interno
 @ DEVICE pic16F628A, WDT_ON ' Watchdog Timer ON
 @ DEVICE pic16F628A, PWRT_ON ' Power-On Timer
 @ DEVICE pic16F628A, BOD_ON
 @ DEVICE pic16F628A, MCLR_OFF ' Master Clear Opción interno
 @ DEVICE pic16F628A, LVP_OFF ' Bajo voltaje de programación
 @ DEVICE pic16F628A, CPD_OFF ' Protección del código de memoria OFF
 @ DEVICE pic16F628A, PROTECT_OFF' protección de código OFF

 CMCON=7 
                    ; Conversión de análogo a digital del puerto A
 NUMERO VAR BYTE

 
 COLUMNA1 VAR PORTA.4
 COLUMNA2 VAR PORTA.5
 COLUMNA3 VAR PORTA.6
 
 FILA1 VAR PORTA.0
 FILA2 VAR PORTA.1
 FILA3 VAR PORTA.2
 FILA4 VAR PORTA.3

DEFINE LCD_DREG PORTB 'UTILIZAR 4 BITS DEL PUERTO B PARA TX DE DATOS
DEFINE LCD_DBIT 4     'DESDE EL BIT B.4 AL BIT B.7
DEFINE LCD_RSREG PORTB'UTILIZAR EL REGISTRO  DE CONTROL/DATOS EN EL PUERTO B
DEFINE LCD_RSBIT 1    'EN EL BIT B.1
DEFINE LCD_EREG PORTB 'UTILIZAR EL ENABLE EN EL PUERTO B
DEFINE LCD_EBIT 3     'EN EL BIT B.3

TRISB=0    'ESTABLECER EL PUERTO B COMO SALIDA
PAUSE 500    ' PAUSE DE MEDIO SEGUNDO

    VAR1 VAR Byte   ' Declaramos la Variable VAR1 
  
    var1 = 0        ' Inicializamos la variable VAR1 
    
    Pause 200       ' Pausa de 200 milisegundos

	Lcdout $fe, 1   ' Limpia la pantalla
	Lcdout $fe, 2   ' Posiciona el cursor en el inicio 
	Lcdout          "* Pantalla LCD *"  
	Lcdout $fe,$C0, "* Teclado Mat. *"

    PAUSE 3000      ' Pausa de 3 segundos
    
Inicio:

    Call Teclado

	Lcdout $fe, 2   ' Posiciona el cursor en el inicio
	Lcdout          "Tecla Pulsada:  "  
	Lcdout $fe,$C0, "--> ",#var1,"           "
    GoTo Inicio    
   
Teclado:

	LOW COLUMNA1    ' Columna 1 = 0
 '   HIGH COLUMNA2     ' Columna 2 = 1
'	HIGH COLUMNA3    ' Columna 3 = 1

	If FILA1 = 0 Then VAR1 = 1 		' tecla "1"
	If FILA2 = 0 Then VAR1 = 4		' tecla "4"
	If FILA3 = 0 Then VAR1 = 7		' tecla "7"
	If FILA4 = 0 Then VAR1 = 10		' tecla "*"

	HIGH COLUMNA1     ' Columna 1 = 1
	LOW COLUMNA2     ' Columna 2 = 0
'	HIGH COLUMNA3     ' Columna 3 = 1

	If FILA1 = 0 Then VAR1 = 2 		' tecla "2"
	If FILA2 = 0 Then VAR1 = 5		' tecla "5"
	If FILA3 = 0 Then VAR1 = 8   	' tecla "8"
	If FILA4 = 0 Then VAR1 = 11		' tecla "0"

'	HIGH COLUMNA1    ' Columna 1 = 1
	HIGH COLUMNA2    ' Columna 2 = 1
	LOW COLUMNA3    ' Columna 3 = 0

	If FILA1 = 0 Then VAR1 = 3		' tecla "3"
	If FILA2 = 0 Then VAR1 = 6		' tecla "6"
	If FILA3 = 0 Then VAR1 = 9		' tecla "9"
	If FILA4 = 0 Then VAR1 = 12		' tecla "#"
     HIGH COLUMNA3
    PAUSE 10
	RETURN      ' Retorna una línea después del llamado "Call" 
       End
 

Adjuntos

Última edición por un moderador:
#15
En proteus si se puede generar sonido, claro que en la alarma no me funciona.

Descargué una serie de ejemplos en basic que supuestamente funcionan bien, sinembargo he probado leer un teclado 3X4 en lcd y me he encontrado con la sorpresa que no lee los numeros de la segunda columna y si se entra a variar con High y Low las columnas, entonces los valores que se muestran en pantalla son erraticos, aquí está el código por si alguien quiere analizarlo y encontrar el error, creo que por esto tampoco funciona la alarma pues si no hay una lectura correcta del teclado nunca va a funcionar la dichosa alarma, también adjunto la simulación.
Si alguien tiene una simulación con este pic para leer un teclado en basic que funcione, por favor subirla.

PHP:
@ DEVICE pic16F628A, INTRC_OSC_NOCLKOUT ' Opción del Osc Interno
@ DEVICE pic16F628A, WDT_ON ' Watchdog Timer ON
@ DEVICE pic16F628A, PWRT_ON ' Power-On Timer
@ DEVICE pic16F628A, BOD_ON
@ DEVICE pic16F628A, MCLR_OFF ' Master Clear Opción interno
@ DEVICE pic16F628A, LVP_OFF ' Bajo voltaje de programación
@ DEVICE pic16F628A, CPD_OFF ' Protección del código de memoria OFF
@ DEVICE pic16F628A, PROTECT_OFF' protección de código OFF
 
CMCON=7 
; Conversión de análogo a digital del puerto A
NUMERO VAR BYTE
 
 
COLUMNA1 VAR PORTA.4
COLUMNA2 VAR PORTA.5
COLUMNA3 VAR PORTA.6
 
FILA1 VAR PORTA.0
FILA2 VAR PORTA.1
FILA3 VAR PORTA.2
FILA4 VAR PORTA.3
 
DEFINE LCD_DREG PORTB 'UTILIZAR 4 BITS DEL PUERTO B PARA TX DE DATOS
DEFINE LCD_DBIT 4 'DESDE EL BIT B.4 AL BIT B.7
DEFINE LCD_RSREG PORTB'UTILIZAR EL REGISTRO DE CONTROL/DATOS EN EL PUERTO B
DEFINE LCD_RSBIT 1 'EN EL BIT B.1
DEFINE LCD_EREG PORTB 'UTILIZAR EL ENABLE EN EL PUERTO B
DEFINE LCD_EBIT 3 'EN EL BIT B.3
 
TRISB=0 'ESTABLECER EL PUERTO B COMO SALIDA
PAUSE 500 ' PAUSE DE MEDIO SEGUNDO
 
VAR1 VAR Byte ' Declaramos la Variable VAR1 
 
var1 = 0 ' Inicializamos la variable VAR1 
 
Pause 200 ' Pausa de 200 milisegundos
 
    Lcdout $fe, 1 ' Limpia la pantalla
    Lcdout $fe, 2 ' Posiciona el cursor en el inicio 
    Lcdout "* Pantalla LCD *" 
    Lcdout $fe,$C0, "* Teclado Mat. *"
 
PAUSE 3000 ' Pausa de 3 segundos
 
Inicio:
 
Call Teclado
 
    Lcdout $fe, 2 ' Posiciona el cursor en el inicio
    Lcdout "Tecla Pulsada: " 
    Lcdout $fe,$C0, "--> ",#var1," "
GoTo Inicio 
 
Teclado:
 
    LOW COLUMNA1 ' Columna 1 = 0
' HIGH COLUMNA2 ' Columna 2 = 1
'    HIGH COLUMNA3 ' Columna 3 = 1
 
    If FILA1 = 0 Then VAR1 = 1         ' tecla "1"
    If FILA2 = 0 Then VAR1 = 4        ' tecla "4"
    If FILA3 = 0 Then VAR1 = 7        ' tecla "7"
    If FILA4 = 0 Then VAR1 = 10        ' tecla "*"
 
    HIGH COLUMNA1 ' Columna 1 = 1
    LOW COLUMNA2 ' Columna 2 = 0
'    HIGH COLUMNA3 ' Columna 3 = 1
 
    If FILA1 = 0 Then VAR1 = 2         ' tecla "2"
    If FILA2 = 0 Then VAR1 = 5        ' tecla "5"
    If FILA3 = 0 Then VAR1 = 8     ' tecla "8"
    If FILA4 = 0 Then VAR1 = 11        ' tecla "0"
 
'    HIGH COLUMNA1 ' Columna 1 = 1
    HIGH COLUMNA2 ' Columna 2 = 1
    LOW COLUMNA3 ' Columna 3 = 0
 
    If FILA1 = 0 Then VAR1 = 3        ' tecla "3"
    If FILA2 = 0 Then VAR1 = 6        ' tecla "6"
    If FILA3 = 0 Then VAR1 = 9        ' tecla "9"
    If FILA4 = 0 Then VAR1 = 12        ' tecla "#"
HIGH COLUMNA3
PAUSE 10
    RETURN ' Retorna una línea después del llamado "Call" 
End
Amigo he revisado el codigo y realizado unos ajustes y funciona perfectamente la lectura de teclado de 3x4 , veia que era muy demorado por los retardos que configure y anda ha todo dar te dejo la simulacion y el codigo. En cuando al de la alarma mirare como te puedo dar una mano.
 

Adjuntos

Última edición por un moderador:
#16
Gracias por Mil!!!

Te estoy extremadamente agradecido por tu ayuda, es muy importante destacar el espíritu de colaboración y servicio por parte de los foreros, especialmente de aquellos con mayor conocimiento pero que, sin vanalidad alguna y desprendidos de todo interés, ayudan y ayudan a todo el que pueden.

Nuevamente mil gracias a Mecatrodatos y espero en un futuro cercano poder retribuir al mínimo toda la colaboración aquí prestada.
 
#17
Hola Chelo,

No sé cual es ese lenguaje, pero si es entendible y no muy difícil de aprender, seguro me interesa, si puedes subir el código sería novedoso para mí.

Gracias,
 
#18
Es el lenguaje c pero para programar circuitos

PHP:
#include <system.h>      /* Libreria por default
void main()
{
      trisa=0xF;            /*Entradas al puerto a del pic en hexadecimal*/
      trisb=0x00;             /*Entradas al puerto b del pic en hexadecimal*/
      portb=0x00;            /*Salidas al puerto b del pic en hexadecimal*/
      porta=0x00;           /*Salidas al puerto a del pic en hexadecimal*/
      while (1)
      {
            if (porta.0==1)    /*Activacion de alarma
            {
                portb.0=1;            /*Indica que la alarma a sido activada
                if (porta.1==1)       /*Puerta uno se abre
                {
                      delay_s(1);        /*Se da un tiempo para desactivar la alarma
                      portb.1=1;         /*La sirena se activa sino se desactiva la alrma
                      delay_s(2);        /Tiempo de activacion de sirena
                      portb.1=0;         /*Se desactiva la sirena
                 }
                 if (porta.2==1)        /*puerta dos
                {
                      delay_s(1);
                      portb.1=1;
                      delay_s(2);
                      portb.1=0;
                 }
                 if (porta.3==1)         /*Puerta tres
                {
                      delay_s(1);
                      portb.1=1;
                      delay_s(2);
                      portb.1=0;
                 }
                 if (porta.4==1)          /*Puerta cuatro
                {
                      delay_s(1);
                      portb.1=1;
                      delay_s(2);
                      portb.1=0;
                 }
          }
}
El pic16f84a cuenta con dos puertos, que es el a y b, el puerto a cuenta con cinco pines (RA0, RA1, RA2, RA3, RA4), mientras el puerto b con 8 (RB0-RB7). Para no poner el codigo en hexadecimal, se dan las salidas en binario como pudiste observar, para esto se utiliza el punto (portb.0, porta.4, etc.), con esto le indicas que pin y en que puerto.
Es algo bastante sencillo, espero con esto te puedas ayudar.
 
Última edición por un moderador:
#19
Gracias Chelo,

Voy a tratar de armar algo con este código y si me funciona lo postearé después para que todos tengan acceso a el.

De cualquier forma sigo interesado en decifrar la falla que existe en la alarma con el 16f628, pues me parece increible que basándose en un texto muy reconocido, falle.

Muchos saludos.

Aqui estoy nuevamente,

Anexo este código que parece funcionar a medias, si se digita el número 1, dice "clave correcta" cuando deberían ser el 1 y el 2, es decir, que con el primer dígito de la clave hace como si se hubiera digitado la clave completa.

Ojalá alguien pase por aquí y ojee... se agradece cualquier ayuda.
En el comprimido está el código es .txt por si acaso y la simulación en proteus.
 

Adjuntos

Última edición:
#20
Adjunto simulación y archivo para basic pro de esta clave de acceso para quien crea pueda servirle o quiera hacerle mejoras, utiliza el pic 16f628a y me gustaría saber como hago para que aparezca el asterisco sin borrarse con cada digitación hasta completar los cuatro necesarios.

Saludos.
 

Adjuntos

Temas similares

Arriba