TODOPIC

Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: artgos en 20 de Junio de 2005, 16:53:00

Título: rutina lectura teclado matricial por mascara
Publicado por: artgos en 20 de Junio de 2005, 16:53:00
Hola a todos, creo que el sistema se llama asi.

cojo el puerto completo, le resto con los elemtons de una tabla y asi es como se la tecla (esplicacion a groso modo)

Cuando lo simulo e incluso montado el display de 7 segmentos se queda como borrado (en la realidad tambien) y mirando las variables ni se inicializan y la verdad no encuentro el fallo ( soy mas de corazon y constancia que de habilidad la verdad)
Si pudieran analizar el programa y decirme donde encuetran fallos, se que es una cosa sencilla pero yo no consigo hacer que corra, sin que sea un "chorizo" de programa increible.

Las RA0-RA2 estan puenteadas con RB0-RB2 con una resistencia de 10K cada una

Perdon por el prrafazo y aqui esta el programa:

;   Declaracion de micro
;-------------------------------------------------------------
   list P=16f873
   include "P16f873A.inc"

;   Declaracion de vectores, inicio e interrupcion
;-------------------------------------------------------------

   org 0x00
   goto inicio
   org 0x04
   goto interrupcion
   org 0x05

;   Configuracion del pic
;---------------------------------------------------------------

inicio

   bsf STATUS,RP0
   clrf TRISC
   movlw b"00000110"
   movwf ADCON1
   clrf TRISA
   movlw b"11111111"
   movwf TRISB
   movlw b"00000111"
   movwf OPTION_REG


;   Configuracion de vector de interrupcion para interrupcion RB4-7 y RB0
;------------------------------------------------------------------------------


   movlw b"00011000"
   movwf INTCON
   bcf STATUS,RP0
   clrf PORTA
   clrf PORTB
   clrf PORTC

;   rutina principal
;-------------------------------------------------------------------

   contador   equ 0x20
   contador2   equ 0x21
   auxiliar   equ 0x24
   contador3   equ 0x25
   contador4   equ 0x26
   contador5   equ 0x27
   movlw d"1"
   movwf contador4
   clrf PORTA
   clrf PORTB
   clrf PORTC   
   movlw b"10011000"
   movwf INTCON


aqui   movlw d"3"
   movwf contador
   clrf contador2
alli   movfw contador2
   call cuenta
   movwf PORTA
   
   incf contador2
   decfsz contador
   goto alli
   goto aqui


;   tabla de salidas
;-------------------------------------------------------------------

cuenta:
   addwf PCL,F
   retlw   b"00000001"
   retlw    b"00000010"
   retlw    b"00000100"
   return





interrupcion
   movfw PORTB
   
   movwf auxiliar
   movfw contador4
   call tabla
   subwf auxiliar,W
   btfsc STATUS,Z
   goto igual
   incf contador4
   goto interrupcion
igual
   movfw contador4
   movwf PORTC
   call delay3
   call delay3
   call delay3
   call delay3
   call delay3
   clrf PORTB
   clrf PORTC
   clrf INTCON
   retfie

   
   


;   tabla
;---------------------------------------------------------------
tabla
   addwf PCL,F
   retlw   b"10000001"
   retlw    b"10000010"
   retlw    b"10000100"
   retlw   b"01000001"
   retlw    b"01000010"
   retlw    b"01000100"
   retlw   b"00100001"
   retlw    b"00100010"
   retlw    b"00100100"
   retlw   b"00010001"
   retlw    b"00010010"
   retlw    b"00010100"
   return

; rutina de retardo
;-------------------------------------------------------------------
delay2:
   clrf PORTB
   movwf auxiliar
   movlw d"100"
   movwf contador3
   bcf INTCON,T0IF
   movlw d"100"
   movwf TMR0
delay1
   btfss INTCON,T0IF
   goto delay1
   decfsz contador3
   goto vuelta
   goto delay2
vuelta
   movfw auxiliar
   return

delay3:

   movwf auxiliar
   movlw d"255"
   movwf contador3
   bcf INTCON,T0IF
   movlw d"1"
   movwf TMR0
delay4
   btfss INTCON,T0IF
   goto delay4
   decfsz contador3
   goto vuelta
   goto delay3
vuelta2
   movfw auxiliar
   return
   end
Título: RE: rutina lectura teclado matricial por mascara
Publicado por: antoniof en 20 de Junio de 2005, 17:15:00
Tres cosillas:

1.- Siempre que se programe alguna interrupción y el micro esté haiendo algo más importante que un "fin goto fin", hay que salvar como mínimo el registro "w" y el "status" antes de entrar en la interrupción para no perder esta info. Busca ne este foro o en el datasheet como hacerlo.

2.- No tienes en cuenta la opción en la "tabla", que se te dará bastantes veces, de que la interrupción se de cuando el estado de alguna entrada pase de uno a cero. Tu sólo contemplas la opción de que pasen de cero a uno, con lo cual te hacen falta las opciones:
"00001000"
"00000100"
"00000010"
"00000001"

3.- Al salir de la interrucpión, borras el registro INTCON, con lo cual desactivas todas las interrupciónes. Sólo debes borrar el flag que la originó, en este caso, el bit RBIF.
Título: RE: rutina lectura teclado matricial por mascara
Publicado por: artgos en 20 de Junio de 2005, 17:36:00

Hola compañero:

Gracias por contestarme tan rapido, haber dos aclaraciones, antes de nada gracias por lo del INTCON ya que no lo habia metido en la rutina de recorrer la primera tabla.
No tengo en cuenta las opciones de los 0 en la parte alta del puerto por que solo habra un uno en la parte alta  cunado lo haya en la baja, luego entonces esas opciones no hacen falta, ya que el uno se lo doy con el teclado.

He correegido lo que me has dicho (cosa que te agradezco a estas horas y despues de trabajr todo el dia la verdad es que uno esta bastante espeso).
y me sigue haceindo nada  menos,jejej

Una manita por fvor que se que aqui hay gente con un nivelazo que me podria traer al lado de la luz (jejejej tengo que dejar de ver la venganza de los sith)

Un saludo
Título: RE: rutina lectura teclado matricial por mascara
Publicado por: antoniof en 20 de Junio de 2005, 17:55:00
Mañana por la mañana te paso una rutina que he echo para un teclado con el puerto B y por interrupción que ocupa muy poco. Ahora no porque la tengo en el otro PC y tengo su monitor aqui mismo y es muy tarde para andar montando el PC y sacando el programa.
Mañana sin falta te la paso.
Título: RE: rutina lectura teclado matricial por mascara
Publicado por: artgos en 21 de Junio de 2005, 01:04:00
muchas gracias de verdad que me tiene loco

De todas maneras haber si soluciono esto por orgullo personal, pero tu rutina me vendra de lujo ya que llevo estancado con esto ya desde hace ni se sabe, en la simulacion va (la rutina larguisima que hice) pero en protoboard na de na

Un saludo
Título: RE: rutina lectura teclado matricial por mascara
Publicado por: antoniof en 21 de Junio de 2005, 04:33:00
Aqui la tienes:

Codigo:
rb_if   movlw   0x0e
   movwf   portb      ;Todas las columnas a 1 excepto la primera
   comf   portb,w
   andlw   0xf0
   btfss   status,2   ;Comprueba si el pulsador está en la primera columna
   goto   col1
   movlw   0x0d
   movwf   portb      ;Todas las columnas a 1 excepto la segunda
   comf   portb,w
   andlw   0xf0
   btfss   status,2   ;Comprueba si el pulsador está en la segunda columna
   goto   col2
   movlw   0x0b
   movwf   portb      ;Todas las columnas a 1 excepto la tercera
   comf   portb,w
   andlw   0xf0
   btfss   status,2   ;Comprueba si el pulsador está en la tercera columna
   goto   col3
   movlw   0x07
   movwf   portb      ;Todas las columnas a 1 excepto la cuarta
   comf   portb,w
   andlw   0xf0
   btfss   status,2   ;Comprueba si el pulsador está en la cuarta columna
   goto   col4
   clrf   tecla      ;Ninguna tecla pulsada
   goto   ca_tclf      ;Fin
col1   clrf   tecla      ;Borra el registro de las teclas
   goto   ca_tcl      ;Calcula la tecla pulsada
col2   movlw   0x04
   movwf   tecla      ;Precarga el valor 4 en el registro de las teclas
   goto   ca_tcl      ;Calcula la tecla pulsada
col3   movlw   0x08
   movwf   tecla      ;Precarga el valor 8 en el registro de las teclas
   goto   ca_tcl      ;Calcula la tecla pulsada
col4   movlw   0x0c
   movwf   tecla      ;Precarga el valor 12 en el registro de las teclas
   goto   ca_tcl      ;Calcula la tecla pulsada
      
ca_tcl   btfss   portb,4      ;Suma 1 si el pulsador está en la primera fila
   movlw   0x01
   btfss   portb,5      ;Suma 2 si el pulsador está en la segunda fila
   movlw   0x02
   btfss   portb,6      ;Suma 3 si el pulsador está en la tercera fila
   movlw   0x03
   btfss   portb,7      ;Suma 4 si el pulsador está en la cuarta fila
   movlw   0x04
   addwf   tecla,f
ca_tclf   *******         ;A partir de aqui, tendrás un número del 0 al 16
            ;guardado en el registro "tecla"


Para que funcione, tienes que activar las resistencias del pull-up en el puerto B, cargar el TRISB como "1111000" y borrar el puerto B para que salte la interrupción.

La parte alta del puerto B son la filas y la parte baja las columnas.
Título: RE: rutina lectura teclado matricial por mascara
Publicado por: artgos en 21 de Junio de 2005, 05:09:00
muchisimas gracias antonio, la verdad es que da gusto que te ayuden tan rapido como lo has hecho tu.

Al final como te dije soy muy cabezon y he conseguido que la mia corra, vivavivaviva, por lo menos en proteus y con un codigo relativamente pequeño creo yo aqui lo pongo para que le echen un vistazo y lo use el que quiera, lo tengo todo comentado para no liarse

Lo colgare tambien en el almacen de assembler para que lo use todo el mundo


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;                                      ;
;PROGRAMA QUE LEE UN TECLADO DE 3X4 (TELEFONICO) Y DA EL VALOR POR EL PUERTO C           ;
;                                      ;
;SE UTILIZAN LA INTERRUPCION DE CAMBIO DE ESTADO EN EL RB4-RB7 Y EL TMR0 PARA HACER LOS RETARDOS  ;
;                                      ;
;INICIALMENTE PARA EL PIC 16F873A, PERO EXTRAPOLABLE A CUALQUIERA, SOLO UTILIZA EL PUERTOB      ;
;PUDIENDO COMPAGINARSE CON UN LCD PERFECTAMENTE                       ;
;                                      ;
;   REALIZADO POR DANIEL GARCIA PINOS                        ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;




;   Declaracion de micro
;-------------------------------------------------------------
   list P=16f873
   include "P16f873A.inc"

;   Declaracion de vectores, inicio e interrupcion
;-------------------------------------------------------------

   org 0x00
   goto inicio
   org 0x04
   goto interrupcion
   org 0x05

;   Configuracion del pic
;---------------------------------------------------------------

inicio

   bsf STATUS,RP0         ;SELECCIONAMOS BANCO DE MEMORIA 1
   clrf TRISC         ;Configuracion de los puertos
   movlw b"00000110"      ;ANULAMOS EL CONVERSOR ANALOGICO/DIGITAL
   movwf ADCON1         ;
   clrf TRISA         ;PONEMOS EN SALIDA EL PUERTO A
   movlw b"11110000"      ;PONEMOS LA PARTE BAJA DEL PUERTO B COMO SALIDA Y LA PARTE ALTA COMO ENTRADA
   movwf TRISB         ;
   movlw b"10000111"      ;QUITAMOS RESISTENCIAS DEL PULL-UP Y PRESCALER DE 256 PARA EL TMR0
   movwf OPTION_REG      ;VOLVEMOS AL BANCO DE MEORIA 0
   bcf STATUS,RP0

;   Configuracion de vector de interrupcion para interrupcion RB4-7 y RB0
;------------------------------------------------------------------------------
   
   clrf PORTA         ;
   clrf PORTB         ;RESETEAMOS PUERTOS
   clrf PORTC         ;

;   rutina principal
;-------------------------------------------------------------------

   contador   equ 0x20   ;CUENTA LA POSICION EN LA PRIMERA TABLA
   contador2   equ 0x21   ;AVANZA EN LA PRIMERA TABLA
   auxiliar   equ 0x24   ;SALVA EL VALOR DE W EN EL RETARDO
   contador3   equ 0x25   ;CUENTA EL NUMERO DE VECES QUE SE A DESBORDADO EL TMR0
   contador4   equ 0x26   ;CUENTA LOS AVANCES EN LA TABLA PARA AVERIGUAR LA TECLA Y NOS DA EL VALOR EN LA    

            ;TABLA DE CONVERSION
   auxiliar2   equ 0x27   ;ALMACENA EL VALOR DEL PUERTOB PARA COMPROBAR LA TECLA
   clrf contador4         ;INICIALIZAMOS CON 0X00 EL CONTADOR4
   clrf auxiliar2         ;Y EL ALMACEN DEL PUERTOB
aqui   movlw b"10001000"      ;
   movwf INTCON         ;CONFIGURAMOS VECTOR DE INTERRUPCIONES, POR CAMBIO DE ESTADO EN RB4-RB7 Y ACTIVAMOS

               ;PERMISOS
   movlw d"3"         
   movwf contador         ;CONFIGURAMOS EL PORSICIONADOR EN LA PRIMERA TABLA (CUENTA) CON EL NUMERO DE       

         ;POSICIONES QUE TIENE
   clrf contador2         ;NOS POSICIONAMOS EN LA POSICION 0   
alli   movfw contador2         ;CARGAMOS LA POSICION EN W
   call cuenta         ;COGEMOS EL VALOR DE LA POSICION EN W
   movwf PORTB         ;LO SACAMOS POR LA PARTE BAJA DEL PUERTOB
   nop            ;
   nop            ;ESTABILIZAMOS LA SEÑAL (ALGUNA GENTE LO HACE CON UNO SOLO, YO PREFIERO CON 2)
   incf contador2         ;AVANZAMOS EN LA TABLA
   decfsz contador         ;ES EL ULTIMO PUESTO
   goto alli         ;NO, SEGUIMOS AVANZANDO
   goto aqui         ;SI REINICIALIZAMOS VECTOR DE INTERRUPCION Y POSICION 0 EN LA TABLA


;   tabla de salidas
;-------------------------------------------------------------------

cuenta:
   addwf PCL,F
   retlw   b"00000001"
   retlw    b"00000010"
   retlw    b"00000100"
   return

;   interrupcion
;------------------------------------------------------------------



interrupcion
   movfw PORTB         ;CARGAMOS EL VALOR DEL PUERTOB EN AUXILIAR2
   movwf auxiliar2   
   clrf PORTB         ;LIMPIAMOS EL PUERTOB Y EL REGISTRO DE INTERRUPCIONES
   clrf INTCON         ;ESTO LO HAGO PQ SINO AL VOLVER Y CAMBIAR EL PUERTO OTRA VEZ HAY FALSAS       

         ;INTERRUPCIONES
seguir   movfw contador4         
   call tabla         ;COGEMOS EL VALOR DE LA TABLA PARA PODER COMPARA CON EL PUERTO Y SABER LA TECLA
   subwf auxiliar2,W      ;
   btfsc STATUS,Z         ;RESTAMOS EL VALOR DEL PUERTO CON EL DE LA TABLA Y SI ES 0 SABEMOS QUE ES IGUAL
   goto igual         
   incf contador4         ;SI NO, AVANZAMOS EN LA TABLA PARA PODER SEGUIR MIRANDO
   goto seguir      
   
igual
   movfw contador4         ;COGEMOS EL VALOR DE LA TECLA Y LO TRANSFORMAMOS (AQUI SE PUEDE O EN ASCII O EN    

            ;DIGITAL CAMBIANDO LA D POR NADA Y PODER MANDARLO A UN DISPLAY LCD
   call tabla2
   clrf contador4         ;BORRAMOS LA TECLA (SINO DA PROBLEMAS LA PROXIMAVEZ AL MIRAR EL UNO
   movwf PORTC         ;LO SACAMOS POR EL PUERTOC (EN MI CASO POR DISPLAYS 7 SEG, ATRAVES DE 7448
   call delay3         ;
   call delay3         ;
   call delay3         ;TIEMPO QUE SE VE EL DATO EN EL DISPLAY 7 SEG
   call delay3         ;
   call delay3         ;
   clrf PORTC         ;LIMPIAMOS PUERTO
   retfie            ;SALIMOS DE LA INTERRUPCION

;   tabla DE VALORES DE COMPARACION CON EL PUERTOB
;---------------------------------------------------------------
tabla
   addwf PCL,F
   retlw   b"00010001"
   retlw    b"00010010"
   retlw    b"00010100"
   retlw   b"00100001"
   retlw    b"00100010"
   retlw    b"00100100"
   retlw   b"01000001"
   retlw    b"01000010"
   retlw    b"01000100"
   retlw   b"10000001"
   retlw    b"10000010"
   retlw    b"10000100"
   return

;   tabla2, TRANSFORMACION DE LA TECLA PULSADA
;-------------------------------------------------------------

tabla2
   addwf PCL,F
   retlw d"1"
   retlw d"2"
   retlw d"3"
   retlw d"4"
   retlw d"5"
   retlw d"6"
   retlw d"7"
   retlw d"8"
   retlw d"9"
   retlw  "*"
   retlw d"0"
   retlw  "#"
   return
; rutina de retardo
;-------------------------------------------------------------------
delay2:
   
   movwf auxiliar         ;SALVAMOS EL VALOR DE W
   movlw d"100"         ;CONFIGURAMOS 100 DESBORDAMIENTOS DEL TMR0
   movwf contador3         
   bcf INTCON,T0IF         ;RESETEAMOS FLAG DE SEÑALIZACION DE DESBORDAMIENTO
   movlw d"100"         ;HACEMOS QUE EL TMR0 TENGA QUE RECORRER 155 POSICIONES (AL SER COMPLEMENTO A       

         ;1,255-100)
   movwf TMR0
delay1
   btfss INTCON,T0IF      ;SE A DESBORDADO EL TMR0?
   goto delay1         ;NO, LO PREGUNTAMOS OTRA VEZ
   decfsz contador3      ;ES LA VEZ 100?
   goto vuelta         ;SI VAMOS A VUELTA
   goto delay1         ;VOLVEMOS A PREGUNTAR
vuelta
   movfw auxiliar         ;DEVOLVEMOS SU VALOR A W
   return            ;VOLVEMOS A LA RUTINA QUE NOS LLAMO

delay3:

   movwf auxiliar
   movlw d"255"
   movwf contador3
   bcf INTCON,T0IF
   movlw d"1"
   movwf TMR0
delay4               ;LO MISMO DE ANTES PERO CON OTRA TEMPORIZACION
   btfss INTCON,T0IF
   goto delay4
   decfsz contador3
   goto vuelta2
   goto delay4
vuelta2
   movfw auxiliar
   return
   end