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...
#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
#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:
///////////////////////////////////////////////////////////////////////////
//// 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...