Autor Tema: Teclado 4x4 en rb4-rb7  (Leído 2344 veces)

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

Desconectado vinnymoy

  • PIC10
  • *
  • Mensajes: 15
Teclado 4x4 en rb4-rb7
« en: 18 de Junio de 2009, 23:55:41 »
Estoy haciendo un proyecto de un controlador on off con pic. La cosa es que debo ingresar por teclado un valor de setpoint para que mi sistema se mantenga a esa temperatura. Pero el problema es que la parte del teclado ni se mosquea en funcionar y estoy utilizando una libreria conocida por todos, osea probada, pero iguasl siempre esta encendido y no sé como hacerle funcionar.


Ayuda please.


Ahi va el codigo central...

Código: [Seleccionar]
#include "H:\os 5355\Documents\Espe\Séptimo\Instrumentación y sensores\Laboratorio 4 - Control de temperatura\Temperatura.h"
#include <lcd.C>
#include <KBD.C>
//#include <stdlib.h>


unsigned int  valor,centigrado,au1=0,tecla=50,setpoint=0,val, valorPWM;
short ban1=1,aux=0, ban2=0;
unsigned char teclac='z';
long  valor1;

#int_RB
void  RB_isr(void)
{
   delay_us(50);
   teclac=kbd_getc();
   delay_us(50);
   
   if ( tecla >= 48 && tecla <= 57){
      val = tecla - 48;
   } else {
      val = tecla - 55;
   }
   tecla=val;
   ban1=0;
   ban2=1;
   delay_us(50); 
}


void main()
{

   port_b_pullups(TRUE);
   setup_adc_ports(AN0);
   setup_adc(ADC_CLOCK_INTERNAL);
   setup_psp(PSP_DISABLED);
   setup_spi(SPI_SS_DISABLED);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DIV_BY_16,255,1);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);
   setup_ccp1(CCP_PWM);
   lcd_init();
   kbd_init();
   enable_interrupts(INT_RB);
   enable_interrupts(GLOBAL);

   // TODO: USER CODE!!

   lcd_gotoxy(1,1);
   lcd_putc("\fInstrumentacion");
   lcd_gotoxy(1,2);
   lcd_putc("   y Sensores");
   delay_ms(2000);
   lcd_putc("\f");
   set_adc_channel(0);

for(;;){
// Adquisicion del dato del ADC RA0
   delay_us(100);
   valor=read_adc();
   delay_ms(15);

//Escalas a centigrados y farenheit
   centigrado=valor;
   centigrado=centigrado*0.588; //150/255
///////////////////////////////////////////

//Ingresar Set Point
if(ban1==0){
   do{
      lcd_gotoxy(1,1);
      lcd_putc("Set Point:");
     
      if(tecla<=9&&tecla>=0){
         if(au1==0){
            setpoint=setpoint+tecla;
            au1=1;
         }
         if(au1==1){
            setpoint=setpoint*10+tecla;
            au1=2;
         }
         if(au1==2){
            setpoint=setpoint*100+tecla;
            au1=3;
            ban1=1;
         }
      }
      if(tecla==14)
         ban1=1;
           
      lcd_gotoxy(11,1);
      printf(lcd_putc,"%d",setpoint);
             
   }while(ban1==0);
}
///////////////////////////////////////////
ban2=0;
////Control de Temperatura
do{
   valor1=setpoint-centigrado;
   if(valor1>=0)
      valorPWM=valor;
   if(valor1<0)
      valorPWM=0;

//Configuración al PWM
     set_pwm1_duty(valorPWM);


//Imprime el valor de temperatura
   if(aux!=valor){
    //Envio al lcd
     lcd_gotoxy(1,1);
     printf(lcd_putc,"Centigra2= %u",centigrado);
     lcd_gotoxy(1,2);
     printf(lcd_putc,"Error= %Ld",valor1);
     delay_ms(1000);
     lcd_putc("\f");
    }
   aux=valor;
   }while(ban2==0);
///////////////////////////////////////////
}
}



Ahora el .h

Código: [Seleccionar]
#include <16F877A.h>
#device adc=8

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES XT                       //Crystal osc <= 4mhz
#FUSES NOPUT                    //No Power Up Timer
#FUSES NOPROTECT                //Code not protected from reading
#FUSES NODEBUG                  //No Debug mode for ICD
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD                    //No EE protection
#FUSES WRT_50%                  //Lower half of Program Memory is Write Protected

#use delay(clock=4000000)


La libreria del teclado:

Código: [Seleccionar]
///////////////////////////////////////////////////////////////////////////
////                             KBDD.C                                ////
////                  Generic keypad scan driver                       ////
////                                                                   ////
////  kbd_init()   Must be called before any other function.           ////
////                                                                   ////
////  c = kbd_getc(c)  Will return a key value if pressed or /0 if not ////
////                   This function should be called frequently so as ////
////                   not to miss a key press.                        ////
////                                                                   ////
///////////////////////////////////////////////////////////////////////////
////        (C) Copyright 1996,2003 Custom Computer Services           ////
//// This source code may only be used by licensed users of the CCS C  ////
//// compiler.  This source code may only be distributed to other      ////
//// licensed users of the CCS C compiler.  No other use, reproduction ////
//// or distribution is permitted without written permission.          ////
//// Derivative programs created using this software in object code    ////
//// form are not restricted in any way.                               ////
///////////////////////////////////////////////////////////////////////////

////////////////// The following defines the keypad layout on port D

// Un-comment the following define to use port B
 #define use_portb_kbd TRUE

// Make sure the port used has pull-up resistors (or the LCD) on
// the column pins


#if defined(__PCH__)
#if defined use_portb_kbd
   #byte kbd = 0xF81                   // This puts the entire structure
#else
   #byte kbd = 0xF83                   // This puts the entire structure
#endif
#else
#if defined use_portb_kbd
   #byte kbd = 6                  // on to port B (at address 6)
#else
   #byte kbd = 8                 // on to port D (at address 8)
#endif
#endif

#if defined use_portb_kbd
   #define set_tris_kbd(x) set_tris_b(x)
#else
   #define set_tris_kbd(x) set_tris_d(x)
#endif


//Keypad connection:   (for example column 0 is B2)
//                Bx:

#define COL0 (1 << 0) // PIN_B0
#define COL1 (1 << 1) // PIN_B1
#define COL2 (1 << 2) // PIN_B2
#define COL3 (1 << 3) // PIN_B3

#define ROW0 (1 << 4) // PIN_B4
#define ROW1 (1 << 5) // PIN_B5
#define ROW2 (1 << 6) // PIN_B6
#define ROW3 (1 << 7) // PIN_B7

#define ALL_ROWS (ROW0|ROW1|ROW2|ROW3)
#define ALL_PINS (ALL_ROWS|COL0|COL1|COL2|COL3)


// Keypad layout:
char const KEYS[4][4] = {{'1','2','3','A'},
                         {'4','5','6','B'},
                         {'7','8','9','C'},
                         {'F','0','E','D'}};

#define KBD_DEBOUNCE_FACTOR 33    // Set this number to apx n/333 where
                                  // n is the number of times you expect
                                  // to call kbd_getc each second

void kbd_init() {
}

char kbd_getc( ) {
   static BYTE kbd_call_count;
   static short int kbd_down;
   static char last_key;
   static BYTE col;

   BYTE kchar;
   BYTE row;

   kchar='\0';
   if(++kbd_call_count>KBD_DEBOUNCE_FACTOR) {
       switch (col) {
         case 0   : set_tris_kbd(ALL_PINS&~COL0);
                    kbd=~COL0&ALL_PINS;
                    break;
         case 1   : set_tris_kbd(ALL_PINS&~COL1);
                    kbd=~COL1&ALL_PINS;
                    break;
         case 2   : set_tris_kbd(ALL_PINS&~COL2);
                    kbd=~COL2&ALL_PINS;
                    break;
         case 3   : set_tris_kbd(ALL_PINS&~COL3);
                    kbd=~COL3&ALL_PINS;
                    break;
       }

       if(kbd_down) {
         if((kbd & (ALL_ROWS))==(ALL_ROWS)) {
           kbd_down=FALSE;
           kchar=last_key;
           last_key='\0';
         }
       } else {
          if((kbd & (ALL_ROWS))!=(ALL_ROWS)) {
             if((kbd & ROW0)==0)
               row=0;
             else if((kbd & ROW1)==0)
               row=1;
             else if((kbd & ROW2)==0)
               row=2;
             else if((kbd & ROW3)==0)
               row=3;
             last_key =KEYS[row][col];
             kbd_down = TRUE;
          } else {
             ++col;
             if(col==4)
               col=0;
          }
       }
      kbd_call_count=0;
   }
  set_tris_kbd(ALL_PINS);
  return(kchar);
}




Espero alguien me pueda decir donde estoy jalado... Que ya son dos semestres que no puedo sacar bien el teclado por la interrupcion...

Desconectado acerdgr82

  • PIC10
  • *
  • Mensajes: 14
Re: Teclado 4x4 en rb4-rb7
« Respuesta #1 en: 19 de Junio de 2009, 14:54:07 »
Hola Vinnymoy,

Puede que el problema lo tengas en el falg RBIF, que siempre se te queda activado. Al principio de la función RB_isr(void) prueba de leer el puerto B:crea una variable auxiliar y pon: aux=input_b(); (la lectura del puerto b es una condición necesaria para borrar RBIF)

Suerte!!!!


 

anything