Autor Tema: Cerradura electrónica con lector de código de barras  (Leído 2770 veces)

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

Desconectado Pic_lady

  • PIC10
  • *
  • Mensajes: 13
Cerradura electrónica con lector de código de barras
« en: 16 de Junio de 2008, 18:31:04 »
Estoy trabajando con una lectora Voyager MS9520, y ya he leido lo publicado por RedPic (creo que ese es su nombre), pero debido a que no trabajo con lenguaje C me di a la tarea de traducir el codigo a ASM, basicamente creo que hace lo mismo, pero mi tabla solo incluye los numeros del 0 al 9 porque la lectora leerá un codigo numérico otra variación que le hice es que para transmitir al hyperterminal trabajo con el módulo USART con un cristal de 4MHz a 9600bps. Pero no me esta funcionando, cuando lee me manda solo un mensaje que le ordeno que escriba en ese caso y luego tiene que enviar los numeros correspondientes al codigo leido, les agradecería un monton si me pueden ayudar, ah y al igual que el código original trabajo con la interrupcion externa y la señal de datos va a RB1. Tambien lo simule pero de una manera muy ortodoxa en proteus con un push button uno de logictoggle para el flanco del reloj y un logicstate para la señal de datos y me funciona, estoy pensando que mi programa es muy lento para atender la interrupción, no se acepto cualquier sugerencia.   Aqui esta mi codigo:



CBLOCK      0x0020
                  Primer_digito,Segundo_digito,Tercer_digito,Cuarto_digito,Quinto_digito,Sexto_digito,Septimo_digito,Octavo_digito
                  Contador_bits,dato_lectora,Dato_completo
                  w_Anterior,status_Anterior,pclath_Anterior
                  CtteBaud, Auxiliar
                  Dato_Enviado1,puntero
                  Offset_L,Offset_H,Aux_w
                  Contador_cedula,var,flagx
      ENDC
      #Define         green      PORTC,0
      #Define         red         PORTC,1

;--------------------------------------------------------------------
; Vectores de inicio...
            ORG          0x0000
            nop
              goto         INICIO

            ORG          0x0004
            nop
            movwf        w_Anterior
            movf      STATUS,w
            movwf      status_Anterior
            movf      PCLATH,w
            movwf      pclath_Anterior
            Pagesel      INTERRUPCION
            goto      INTERRUPCION
            goto      INTERRUPCION

;--------------------------------------------------------------------
; Tabla de mensajes...

;--------------------------------------------------------------------
; Archivos de cabecera...
Include   "TX-USART-F87XA.INC"
;--------------------------------------------------------------------
;********************************************************************
; Programa principal...
;********************************************************************
INICIO:
            call            Cond_Iniciales
            call            mensaje_serial_1
Principal:
            btfsc         Dato_completo,0
            call            Procesar_dato
            btfsc         flagx,1
            call            compare
            goto         Principal                  
      
;********************************************************************
;--------------------------------------------------------------------
; Subrutinas...
;-------------------------------------------------------------------
Cond_Iniciales:

            banksel         PORTB
            clrf            PORTB
            banksel         TRISB
            movlw         b'00000011'
            movwf         TRISB

            banksel         PORTC
            clrf            PORTC
            banksel         TRISC
            movlw         b'10000000'
            movwf         TRISC
   
            banksel          OPTION_REG
            movlw         b'00000000'
            movwf         OPTION_REG

            movlw         .25
            movwf         CtteBaud
            call            IniUSART

            banksel          TXSTA
            movlw         0x24
            movwf         TXSTA

            banksel         RCSTA
            movlw         b'10010000'
            movwf         RCSTA
   
            banksel         STATUS
            movlw         .11
            movwf         Contador_bits
            movlw         0x00
            movwf         puntero
            movlw         0x00
            movwf         Contador_cedula
            movlw         0x00
            movwf         Dato_completo

            bcf            INTCON,INTF
            movf         PORTB,w

            banksel          INTCON
            movlw         b'00010000'
            movwf         INTCON
            
            bsf            INTCON,7
            
            movlw         0x20
            movwf         FSR
   
            bsf            flagx,0

            return

;-------------------------------------------------------------------
INTERRUPCION:
            btfsc         flagx,0
            call            mensaje_serial_2
            bcf            INTCON,INTF
            bsf            STATUS,C
            movlw         .11
            subwf         Contador_bits,w
            btfsc         STATUS,C
            goto         get_out
            bsf            STATUS,C
            movlw         0x03
            subwf         Contador_bits,w
            btfss         STATUS,C
            goto         fin_interrupcion
            btfss         PORTB,1
            goto         $+4
            bsf            STATUS,C
            rrf            dato_lectora
            goto         $+3
            bcf            STATUS,C
            rrf            dato_lectora
            goto         get_out

fin_interrupcion:
            movlw         0x01
            xorwf         Contador_bits,w
            btfss         STATUS,Z
            goto         get_out
            bsf            Dato_completo,0
            movlw         .12
            movwf         Contador_bits
get_out:
            bcf            flagx,0
            decf         Contador_bits,f
            movf         pclath_Anterior,w
            movwf         PCLATH
            movf         status_Anterior,w
            movwf         STATUS
            movf           w_Anterior,w
            retfie

;--------------------------------------------------------------------
mensaje_serial_1:
            movlw         LOW(Mensaje_2)
            movwf         Offset_L
            movlw         HIGH(Mensaje_2)
            movwf         Offset_H

            movf         puntero,w         
            addwf         Offset_L,f
            btfss         STATUS,Z
            goto         $+3

            movlw         .1
            addwf         Offset_H,f
      
            movf         Offset_H,w
            movwf         PCLATH

            movf         puntero,w
            Lcall         Tabla_ini
            movwf         var
            movlw         0x00
            addwf         var,w
            btfsc         STATUS,Z
            goto         salir_mensaje_1
            movf         var,w
            call            DatoUSART_Tx
            incf            puntero,f      
            goto         mensaje_serial_1
salir_mensaje_1:
            movlw         0x00
            movwf         puntero
            return

;--------------------------------------------------------------------
Procesar_dato:
            bcf            Dato_completo,0
            movlw         0x00
            movwf         puntero
            movlw         0x08
            bcf            STATUS,Z
            xorwf         Contador_cedula,w
            btfss         STATUS,Z
            goto         Ciclo_Procesar_dato
            movlw         0x0D
            call            DatoUSART_Tx
            movlw         0x0A
            call            DatoUSART_Tx
            call            mensaje_serial_2
            movlw         0x00
            movwf         Contador_cedula
            movlw         0x00
            movwf         puntero
            movlw         0x20
            movwf         FSR
            goto         Ciclo_Procesar_dato
Ciclo_Procesar_dato:
            movlw         LOW(Msj_1)
            movwf         Offset_L
            movlw         HIGH(Msj_1)
            movwf         Offset_H

            movf         puntero,w         
            addwf         Offset_L,f
            btfss         STATUS,Z
            goto         $+3

            movlw         .1
            addwf         Offset_H,f
      
            movf         Offset_H,w
            movwf         PCLATH

            movf         puntero,w
            call            Tabla_lectora
            movwf         Aux_w
            bcf            STATUS,Z
            xorwf         dato_lectora,w
            btfsc         STATUS,Z
            goto         get_next
            bcf            STATUS,Z
            movlw         0x00
            addwf         Aux_w
            btfsc         STATUS,Z
            goto         salir_procesar
            bcf            STATUS,C   
            movlw         0x02   
            addwf         puntero
            goto         Ciclo_Procesar_dato

get_next:
            incf            puntero
            movf         puntero,w
            call            Tabla_lectora
            movwf         INDF
            call            DatoUSART_Tx
            incf            FSR
            incf            Contador_cedula
            bcf            STATUS,Z
            movlw         0x08
            xorwf         Contador_cedula,w
            btfss         STATUS,Z
            goto         salir_procesar
            bsf            flagx,1
                     
salir_procesar:
            movlw         0x00
            movwf         dato_lectora
            movlw         0x00
            movwf         puntero
            return

;--------------------------------------------------------------------

mensaje_serial_2:
            movlw         LOW(Mensaje_1)
            movwf         Offset_L
            movlw         HIGH(Mensaje_1)
            movwf         Offset_H

            movf         puntero,w         
            addwf         Offset_L,f
            btfss         STATUS,Z
            goto         $+3

            movlw         .1
            addwf         Offset_H,f
      
            movf         Offset_H,w
            movwf         PCLATH

            movf         puntero,w
            Lcall         Tabla_CI
            movwf         var
            movlw         0x00
            addwf         var
            btfsc         STATUS,Z
            goto         salir_mensaje_2
            movf         var,w
            call            DatoUSART_Tx
            incf            puntero,f   
            goto         mensaje_serial_2
salir_mensaje_2:
            return
;--------------------------------------------------------------------
compare:
            bcf            STATUS,Z
            movlw         '1'
            xorwf         Primer_digito,w
            btfss         STATUS,Z
            goto         acceso_negado
            bcf            STATUS,Z
            movlw         '8'
            xorwf         Segundo_digito,w
            btfss         STATUS,Z
            goto         acceso_negado
            bcf            STATUS,Z
            movlw         '5'
            xorwf         Tercer_digito
            btfss         STATUS,Z
            goto         acceso_negado
            bcf            STATUS,Z
            movlw         '2'
            xorwf         Cuarto_digito
            btfss         STATUS,Z
            goto         acceso_negado
            bcf            STATUS,Z
            movlw         '7'
            xorwf         Quinto_digito
            btfss         STATUS,Z
            goto         acceso_negado
            bcf            STATUS,Z
            movlw         '5'
            xorwf         Sexto_digito
            btfss         STATUS,Z
            goto         acceso_negado
            bcf            STATUS,Z
            movlw         '9'
            xorwf         Septimo_digito
            btfss         STATUS,Z
            goto         acceso_negado
            bcf            STATUS,Z
            movlw         '1'
            xorwf         Octavo_digito
            btfss         STATUS,Z
            goto         acceso_negado
            bcf            red
            bsf            green
            call            mensaje_acceso         
            goto         salir_compare
acceso_negado:
            bcf            green
            bsf            red      
            movlw         0x00
            movwf         puntero
ciclo_negado:
            movlw         LOW(Mensaje_AN)
            movwf         Offset_L
            movlw         HIGH(Mensaje_AN)
            movwf         Offset_H

            movf         puntero,w         
            addwf         Offset_L,f
            btfss         STATUS,Z
            goto         $+3

            movlw         .1
            addwf         Offset_H,f
      
            movf         Offset_H,w
            movwf         PCLATH

            movf         puntero,w
            Lcall         Tabla_AN
            movwf         var
            movlw         0x00
            addwf         var,w
            btfsc         STATUS,Z
            goto         salir_compare
            movf         var,w
            call            DatoUSART_Tx
            incf            puntero,f      
            goto         ciclo_negado
salir_compare:         
            bcf            flagx,1
            return

;--------------------------------------------------------------------
mensaje_acceso:
            movlw         0x00
            movwf         puntero
mensaje_serial_A:
            movlw         LOW(Mensaje_Acc)
            movwf         Offset_L
            movlw         HIGH(Mensaje_Acc)
            movwf         Offset_H

            movf         puntero,w         
            addwf         Offset_L,f
            btfss         STATUS,Z
            goto         $+3

            movlw         .1
            addwf         Offset_H,f
      
            movf         Offset_H,w
            movwf         PCLATH

            movf         puntero,w
            Lcall         Tabla_Acc
            movwf         var
            movlw         0x00
            addwf         var
            btfsc         STATUS,Z
            goto         salir_mensaje_A
            movf         var,w
            call            DatoUSART_Tx
            incf            puntero,f   
            goto         mensaje_serial_A
salir_mensaje_A:
            return
;--------------------------------------------------------------------
Tabla_lectora:   addwf              PCL,f
Msj_1              EQU         $
            DT         0x45,'0',0x16,'1',0x1e,'2',0x26,'3',0x25,'4',0x2E,'5',0x36,'6',0x3d,'7',0x3e,'8',0x46,'9',0x00

Tabla_ini:      addwf              PCL,f
Mensaje_2:       EQU             $
                      DT         " ***Cerradura Electronica*** ",0x0D,0x0A,0x00

Tabla_CI:      addwf              PCL,f
Mensaje_1:        EQU             $
                DT               "C.I.: ",0x00

Tabla_AN:      addwf              PCL,f
Mensaje_AN:        EQU      $
                      DT         0x0D,0x0A,"Usted no puede entrar a las instalaciones",0x0D,0x0A,0x00

Tabla_Acc:      addwf              PCL,f
Mensaje_Acc:        EQU      $
                      DT         0x0D,0x0A,"Usted puede ingresar",0x0D,0x0A,0x00
;--------------------------------------------------------------------
; Fin del programa...
Fin:
   END
;********************************************************************
;--------------------------------------------------------------------


 

anything