TODOPIC

Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: gioalex07 en 04 de Diciembre de 2017, 00:33:19

Título: Teclado matricial-problema lectura
Publicado por: gioalex07 en 04 de Diciembre de 2017, 00:33:19
Hola comunidad, tengo este programa para realizar la lectura de un teclado matricial de 4x3 pero estoy simulando en proteus y no capta cuando yo oprimo una tecla. No se que podría estar mal o que se puede modificar para que funcione. O donde falla la interrupción ya que es la primera vez que realizo este metodo
*Lo primordial es saber cual dato oprimió ya lo demás del programa es impresión en LCD

#include <xc.h>
#define _XTAL_FREQ 4000000

void esc_lcd(char datos, char rs, char rw);
void config_lcd_8bits();
void leer_teclado_matricial(int *resultado);
int  i,j,bandera,interrupcion = 0;
int  resultado[2] = {99,99};
char clave     [4]  = {'6','7','8','9'};
char teclado   [12] = {'1','2','3','4','5','6','7','8','9','*','0','#'};
int  vector    [4]  = {0b00000001,0b00000010,0b00000100,0b00001000};
int  inicio    [10] = {'P','r','e','s','i','o','n','e',' ','#'};
int  ingreso   [13] = {'I','n','g','r','e','s','e',' ','c','l','a','v','e'};
int  final     [14] = {'C','l','a','v','e',' ','c','o','r','r','e','c','t','a'};

void main(void){
   OSCCONbits.SCS = 11;
   OSCCONbits.IRCF = 110;
   ADCON1bits.PCFG0=1;
   ADCON1bits.PCFG1=1;
   ADCON1bits.PCFG2=1;
   ADCON1bits.PCFG3=1;
   TRISA = 0;
   TRISB = 0b11100000;
   TRISD = 0;
   TRISE = 0;
   RCONbits.IPEN    = 1;
   INTCONbits.PEIE  = 1;
   INTCONbits.RBIE  = 1;
   INTCON2bits.RBIP = 1;
   INTCONbits.GIE   = 1;
   config_lcd_8bits();
 
   
   while (1){
      while(bandera == 0){
    esc_lcd(0b00000000,0,0);
    for(i = 0; i<10; i++){
       esc_lcd(inicio,1,0);
    }
    bandera = 1;
      }
     
   }
     
 }
 
 void esc_lcd(char datos, char rs, char rw){
   LATB0 = 0;
   LATB2 = rs;
   LATB1 = rw;
   __delay_us(1);
   LATB0 = 1;
   __delay_us(1);
   PORTD = datos;
   __delay_us(1);
   LATB0 = 0;
   __delay_us(1);
}

void config_lcd_8bits(){
   __delay_ms(15);
   esc_lcd(0b00110000,0,0);
   __delay_ms(4.1);
   esc_lcd(0b00110000,0,0);
   __delay_us(100);
   esc_lcd(0b00110000,0,0);
   esc_lcd(0b00110000,0,0);
   esc_lcd(0b00001111,0,0);
   esc_lcd(0b00000001,0,0);
   esc_lcd(0b00000110,0,0);
}

void leer_teclado_matricial(int *resultado){
   int num      = 0;
   resultado[0] = 99;
   resultado[1] = 99;
   
   for(i = 0; i<4; i++){
      LATA  = 0;
      PORTA = vector;
      __delay_ms(20);
      num   = PORTB;
     
      switch(num){
    case 0b00100000:
       resultado[0] = i;
       resultado[1] = 1;
       break;
    case 0b01000000:
       resultado[0] = i;
       resultado[1] = 2;
       break;
    case 0b10000000:
       resultado[0] = i;
       resultado[1] = 3;
       break;
    default:
       resultado[0] = 99;
       resultado[1] = 99;
       break;   
      }
   }
}

void interrupt high_priority interrupcion_puertob(){
   if(INTCONbits.RBIF == 1){
      interrupcion = 1;
      INTCONbits.RBIE  = 0;
      leer_teclado_matricial(resultado);
    if((resultado[0] == 4) && (resultado[1] == 3)){
       esc_lcd(0b00000000,0,0);
       for(i = 0; i<13; i++){
          esc_lcd(ingreso,1,0);
       }
    }
    INTCONbits.RBIE  = 1;
    INTCONbits.RBIF = 0;
   }
}
Título: Re:Teclado matricial-problema lectura
Publicado por: gioalex07 en 04 de Diciembre de 2017, 16:34:38
Implemente la interfaz humana de un cajero bancario. Para ello visualice en un display
alfanumérico LCD la frase “Presione #” y cuando alguien presione la tecla “#”, se debe
visualizar el texto “Ingrese clave”.
Si el usuario ingresa la clave de 4 dígitos numérica correcta, que estaba previamente
almacenada en un microcontrolador y será “6789”, el display debe mostrar “Clave correcta”
y activar un LED. La visualización del texto y el LED encendido debe durar 5 segundos.

En caso de que la clave sea incorrecta se debe volver al estado inicial y visualizar “Presione
#”.

Esto es lo que tengo que realizar para contextualizar el problema..

Gracias a quien pueda ayudarme
Título: Re:Teclado matricial-problema lectura
Publicado por: KILLERJC en 05 de Diciembre de 2017, 15:09:14
Discculpa pero estoy viendo algunos errores en la logica de programacion:

Código: C
  1. PORTA = vector;
Esto..... vector es un array. Por lo tanto, lo que estas haciendo alli es intentar poner "la direccion" de vector en el puerto A. Seguramente que esto no es lo que buscabas y tal ves era
Código: C
  1. PORTA = vector[i];

- Delays dentro de la interrupcion.. Nunca.
- Funciones que ocupen demasiado tiempo como escribir en el LCD ( ya que usan delays) en la interrupcion TAMPOCO. LLeva la muestra al loop principal. La interrupcion es atender y salir.

- Esto:

Código: C
  1. int  final     [14] = {'C','l','a','v','e',' ','c','o','r','r','e','c','t','a'};

Cambialo por:

Código: C
  1. char final[] = "Clave correcta";

Es mas simple de realizar, mas simple de saver cuando es que termino el string ya que al usar las comillas ocupa 1 espacio mas el cual usa un caracter nulo 0x00 o '\0' para identificar cuando es que termino. No te preocupas por que cantidad hay de caracteres.

- Aca en este punto

Código: C
  1. num   = PORTB;
  2.      
  3.       switch(num){

Tenes que tener cuidado, ya que va a leer todo los demas pines tambien. El switch espera si o si el numero que vos le das, si hay orto bit en 1 no te sirve. Si tenes 3 bits que se pueden poner en 1, entonces mejor asegurarnos que pasen solo los 3 bits de mayor peso, asi:

Código: C
  1. num   = PORTB & 0b11100000;
  2.      
  3.       switch(num){
Título: Re:Teclado matricial-problema lectura
Publicado por: gioalex07 en 05 de Diciembre de 2017, 22:42:37
Pues te comento que por tiempo dijo que lo hicieramos por polling y ahora tengo problema al guardar en un arreglo las teclas que se pulsan para compararlas con un arreglo fijo. *lo enmarco con //aqui
quiero guardar los pulsos pero siempre se almacena 1 ejm 9999  o  8888 y asi entonces nunca pasara a la siguiente condicion

gracias por tu ayuda

#include <xc.h>
#define _XTAL_FREQ 4000000

void esc_lcd(char datos, char rs, char rw);
void config_lcd_8bits();
void leer();
int  inicio    [10] = {'P','r','e','s','i','o','n','e',' ','#'};
int  ingreso   [13] = {'I','n','g','r','e','s','e',' ','c','l','a','v','e'};
int  final     [14] = {'C','l','a','v','e',' ','c','o','r','r','e','c','t','a'};
int  final1    [16] = {'C','l','a','v','e',' ','i','n','c','o','r','r','e','c','t','a'};
int  vector    [4]  = {0b000000001,0b000000010,0b000000100,0b000001000};
char clave     [4]  = {};
char clave1    [4]  = {'6','7','8','9'};
int bandera,bandera1,bandera2,bandera3,clave_correcta, i, posicion,punto,variable = 0;
int bandera4, bandera5 = 0;
char tecla;

void main(){
   
    OSCCONbits.SCS = 11;
    OSCCONbits.IRCF = 110;
    ADCON1bits.PCFG0=1;
    ADCON1bits.PCFG1=1;
    ADCON1bits.PCFG2=1;
    ADCON1bits.PCFG3=1;
    TRISA = 0;
    TRISBbits.RB4 = 1;
    TRISBbits.RB5 = 1;
    TRISBbits.RB6 = 1;
    TRISC = 0;
    TRISD = 0;
    TRISE = 0;
   
    config_lcd_8bits();
   
   
    while(1){
       bandera1 = 1;
       bandera2 = 1;
       bandera3 = 1;

       while(bandera == 0){
            esc_lcd(0b100000000,0,0);
            for(i = 0; i<10; i++){
                esc_lcd(inicio,1,0);
            }
            bandera = 1;
       bandera1 = 0;
        }

       
   while(bandera1 == 0){
       leer();
       if(tecla == '#'){
          esc_lcd(0b10000000,0,0);
          for(i=0;i<13;i++){
        esc_lcd(ingreso,1,0);
          }
          for(i=0; i<4; i++){
        clave = '0';
          }
          bandera1 = 1;
          bandera2 = 0;
       }
    }

//aqui
   while(bandera2 == 0){
      while(posicion < 4){
         leer();
         if((tecla == '1')||(tecla == '2')||(tecla == '3')||(tecla == '4')||(tecla == '5')||(tecla == '6')||(tecla == '7')||(tecla == '8')||(tecla == '9')||(tecla == '0')){
       clave[posicion] = tecla;
       posicion++;
         }
         bandera2 = 1;
         bandera3 = 0;
      }
   }
   
   while(bandera3 == 0){
      for(i=0; i<4; i++){
         if(clave == clave1){
        esc_lcd(0b100000000,0,0);
        for(i = 0; i<14; i++){
           esc_lcd(final,1,0);
        }
        bandera3 = 1;
        bandera = 0;
         }
      }
   }
    } 
}


void esc_lcd(char datos, char rs, char rw){
    LATE0 = 0;
    LATE2 = rs;
    LATE1 = rw;
    __delay_us(1);
    LATE0 = 1;
    __delay_us(1);
    PORTD = datos;
    __delay_us(1);
    LATE0 = 0;
    __delay_us(1);
}

void config_lcd_8bits(){
    __delay_ms(15);
    esc_lcd(0b00110000,0,0);
    __delay_ms(4.1);
    esc_lcd(0b00110000,0,0);
    __delay_us(100);
    esc_lcd(0b00111000,0,0);
    esc_lcd(0b00110000,0,0);
    esc_lcd(0b00001111,0,0);
    esc_lcd(0b00000001,0,0);
    esc_lcd(0b00000110,0,0);
}

void leer(){
   for(i = 0; i<4; i++){
        if((PORTBbits.RB4 == 0)&&(PORTBbits.RB5 == 0)&&(PORTBbits.RB6 == 0)){
            PORTA = vector;
            __delay_ms(20);
            if((PORTA == 0b00000001)&&(PORTBbits.RB4 == 1)){
                tecla = '1';
            }
            else if((PORTA == 0b00000001)&&(PORTBbits.RB5 == 1)){
                tecla = '2';
            }
            else if((PORTA == 0b00000001)&&(PORTBbits.RB6 == 1)){
                tecla = '3';
            }
            else if((PORTA == 0b00000010)&&(PORTBbits.RB4 == 1)){
                tecla = '4';
            }
            else if((PORTA == 0b00000010)&&(PORTBbits.RB5 == 1)){
                tecla = '5';
            }
            else if((PORTA == 0b00000010)&&(PORTBbits.RB6 == 1)){
                tecla = '6';
            }
            else if((PORTA == 0b00000100)&&(PORTBbits.RB4 == 1)){
                tecla = '7';
            }
            else if((PORTA == 0b00000100)&&(PORTBbits.RB5 == 1)){
                tecla = '8';
            }
            else if((PORTA == 0b00000100)&&(PORTBbits.RB6 == 1)){
                tecla = '9';
            }
            else if((PORTA == 0b00001000)&&(PORTBbits.RB4 == 1)){
                tecla = '*';
            }
            else if((PORTA == 0b00001000)&&(PORTBbits.RB5 == 1)){
                tecla = '0';
            }
            else if((PORTA == 0b00001000)&&(PORTBbits.RB6 == 1)){
                tecla = '#';
            }
        }
    }
}
Título: Re:Teclado matricial-problema lectura
Publicado por: KILLERJC en 08 de Diciembre de 2017, 15:01:08
A no ser que pongas la contraseña con una super velocidad de 20ms cada tecla eso no va a funcionar.

Y seguis teniendo el mismo problema que antes, el cual ya te lo habia respondido.