Buenos dias, tengo un problema al tratar de correr un programa que trabaja bien en el 16f877A (con teclado matricial y lcd) pero al cargarselo al 18f4620 (entro al programa y en la primera linea le cambio el device). lo trato de correr en el Proteus y corre a medias, . el programa tiene una seccion de antirebote que no trabaja bien. Esta seccion con el 16f877a trabaja muy bien pero al cargarselo al 18f4620 no trabaja (ej. si oprimo en el teclado el numero 2, se sigue escribiendo 22222) Sin hacerle ningun cambio en el programa salvo el del tipo de device en la primera linea del programa. El programa tiene una seccion en la que se maneja con interrupciones del Timer0 escrita por Pocher y modificada por PalitroqueZ. Esta seccion no trabaja como debe de ser en el 18f4620. No se si sea por en la toma de la lectura del flanco de la pulsacion, o que el 877a sea de 8 bits y el 4620 de un mayor numero de bits, o se usan de diferente forma las interrupciones o tenga que ver con algun fuses que se requiera declarar o alguna instruccion que si funcione para el 16f877a y que no funcione para el 18f4620. Sabe alguien si hay algun cambio significativo en lo que se refiere al uso tel Timer0 y de la captura de los flancos
Resumiendo: La seccion antirebote trabaja bien en el 16f877a pero trabaja a medias en el 18f4620
Visualizando las variable e la watchwindows del Proteus, en el 18f4620 se ve que arranca el timer0 y llega a su valor preset y se reinicia si es que la tecla continua aprimida
a diferencia de usar el 16f877a que llega al valor y se detiene aun si continua oprimida la tecla.
Anexo la secccion de antirebotes
#include <18f4620.h>
//#include <16f877A>
.
.
.
.
.
.
#include "Teclado_flex_change_portb.C"
//#SEPARATE #INCLUDE "SELECTOR.C"
//#INCLUDE "MATRIZ.C"
//#SEPARATE #INCLUDE "SELECTOR2.C"
//#SEPARATE #INCLUDE "SELECTOR3.C"
//#SEPARATE #INCLUDE "SELECTOR repaldo.C"
//------------------------- INTERRUPCION TMR0 -----------------------------
#INT_timer0
void tmr0_isr(){
//INT16 temp;
if(iContador_1ms==iVeces_iContador_1ms){
temp = input_b() & iLos_Cuatro_MSB_PORTB;
if(iFlanco_RB == temp){
iTecla_capturada==kbd_getc();
// delay_ms(2);
fImprimir=1;
clear_interrupt(int_rb); // RBIF = 0 limpia la bandera
}
Limpiar_Columnas();
iContador_1ms=0;
disable_interrupts(INT_TIMER0);
// #asm movf PORTB,0 #endasm
clear_interrupt(int_rb); // RBIF = 0 limpia la bandera
enable_interrupts(int_rb);
}else{
iContador_1ms++;
}
}
//------------------------- INTERRUPCION RB4..RB7 -----------------------------
#INT_rb // INT16errupcion cambio de estado RB[4-7]
void control_rb() {
iFlanco_RB = input_b() & iLos_Cuatro_MSB_PORTB;
if(iFlanco_RB != iLos_Cuatro_MSB_PORTB){
disable_interrupts(INT_RB);
iContador_1ms=0;
// setup_timer_0(RTCC_INTERNAL|RTCC_DIV_64|RTCC_8_BIT);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_64|RTCC_8_BIT);
set_timer0(16); // retardo de ~ 1ms
// set_timer0(68); // retardo de ~ 1ms
enable_interrupts(INT_TIMER0);
}
Limpiar_Columnas();
}
#INT_TIMER1
void TIMER1_isr(void) {
//4ms INT16errupt
timer1_counter++;
if ((timer1_counter >= 180)||(DS==20)) {
//if ((timer1_counter >= 180)) {
disable_interrupts(GLOBAL);
disable_interrupts(INT_TIMER1);
timer1_flag = TRUE;
timer1_counter= 0;
XX=8;
GG=7;
DS=0;
// DFT=0;
}
}
Aqui esta la seccion de "Teclado_flex_change_portb.C"
* Teclado4.c - Conexiones del teclado.
He realizado unas modificaciones en Teclado3.c (así se llamaba el original)
para optimizar los recursos del uC PIC
Entre ellos tenemos:
- todas las variables concernientes a la identificación del teclado,
se han llevado a constantes (para desocupar RAM)
- dichas constantes corresponden a la combinación generada por los valores
que los pines del teclado deben tener, con ello si queremos identificar
la tecla en otra parte del programa, solo tenemos que localizar la
etiqueta de constante correspondiente.
- una vez que se valida un condicional sale inmediatamente de kbd_getc()
evitando la demora de preguntar por los otros condicionales y por
consiguiente sale mas pronto de la interrupción.
Autor: Pocher
Modificación: PalitroqueZ 14-May-2008 11:10am
Este código puede usarse libremente siempre que se mantenga/n y/o respete/n
el/los credito/s de/los autor/es
*******************************************************************************
iColumna2
iColumna0 ^
^ |
| |
|---|---|---|---|
RB4 ---> | 1 | 2 | 3 | A |
|---|---|---|---|
RB5 ---> | 4 | 5 | 6 | B |
|---|---|---|---|
RB6 ---> | 7 | 8 | 9 | C |
|---|---|---|---|
RB7 ---> | * | 0 | # | D |
|---|---|---|---|
^ ^
| |
iColumna3
iColumna1
RB4 = fila0
RB5 = fila1
RB6 = fila2
RB7 = fila3
*/
int16 const iLos_Cuatro_MSB_PORTB=0b11110000; // selecciona los 4 MSB
int8 iPuerto_compuesto;
//*****************************************************
int8 const iTeclaA=0B11100111; // 0xE7
int8 const iTeclaB=0B11010111; // 0xD7
int8 const iTeclaC=0B10110111; // 0xB7
int8 const iTeclaD=0B01110111; // 0x77
int8 const iTecla1=0B11101110; // 0xEE
int8 const iTecla4=0B11011110; // 0xDE
int8 const iTecla7=0B10111110; // 0xBE
int8 const iTeclaAsterisco=0B01111110; // 0x7E
int8 const iTecla2=0B11101101; // 0xED
int8 const iTecla5=0B11011101; // 0xDD
int8 const iTecla8=0B10111101; // 0xBD
int8 const iTecla0=0B01111101; // 0x7D
int8 const iTecla3=0B11101011; // 0xEB
int8 const iTecla6=0B11011011; // 0xDB
int8 const iTecla9=0B10111011; // 0xBB
int8 const iTeclaNumeral=0B01111011; // 0x7B
//int8 const iTeclaA=0B11100111; // 0xE7
//int8 const iTeclaB=0B11010111; // 0xD7
//int8 const iTeclaC=0B10110111; // 0xB7
//int8 const iTeclaD=0B01110111; // 0x77
//***********************************************************
void Configurar_iPuerto_compuesto(void);
//***********************************************************
int8 kbd_getc(){
int8 tecla;
output_low(iColumna0);
output_high(iColumna1);
output_high(iColumna2);
output_high(iColumna3);
Configurar_iPuerto_compuesto();
if(iPuerto_compuesto == iTecla1 ){tecla=iTecla1; return tecla;}
if(iPuerto_compuesto == iTecla4 ){tecla=iTecla4; return tecla;}
if(iPuerto_compuesto == iTecla7 ){tecla=iTecla7; return tecla;}
if(iPuerto_compuesto == iTeclaAsterisco ){tecla=iTeclaAsterisco; return tecla;}
output_high(iColumna0);
output_low(iColumna1);
output_high(iColumna2);
output_high(iColumna3);
Configurar_iPuerto_compuesto();
if(iPuerto_compuesto == iTecla2 ){tecla=iTecla2; return tecla;}
if(iPuerto_compuesto == iTecla5 ){tecla=iTecla5; return tecla;}
if(iPuerto_compuesto == iTecla8 ){tecla=iTecla8; return tecla;}
if(iPuerto_compuesto == iTecla0 ){tecla=iTecla0; return tecla;}
output_high(iColumna0);
output_high(iColumna1);;
output_low(iColumna2);
output_high(iColumna3);
Configurar_iPuerto_compuesto();
if(iPuerto_compuesto == iTecla3 ){tecla=iTecla3; return tecla;}
if(iPuerto_compuesto == iTecla6 ){tecla=iTecla6; return tecla;}
if(iPuerto_compuesto == iTecla9 ){tecla=iTecla9; return tecla;}
if(iPuerto_compuesto == iTeclaNumeral ){tecla=iTeclaNumeral; return tecla;}
output_high(iColumna0);
output_high(iColumna1);
output_high(iColumna2);
output_low(iColumna3);
Configurar_iPuerto_compuesto();
if(iPuerto_compuesto == iTeclaA ){tecla=iTeclaA; return tecla;}
if(iPuerto_compuesto == iTeclaB ){tecla=iTeclaB; return tecla;}
if(iPuerto_compuesto == iTeclaC ){tecla=iTeclaC; return tecla;}
if(iPuerto_compuesto == iTeclaD ){tecla=iTeclaD; return tecla;}
}
//**************************************************************
// Aquí se agrupa los bits concerniente a las columnas 1-4 junto
// con RB[7-4] en un solo registro para manejarlo a posteriori
// iPuerto_compuesto = [RB7,RB6,RB5,RB4,columna3,columna2,columna1,columna0]
//**************************************************************
void Configurar_iPuerto_compuesto(void){
iPuerto_compuesto=0;
iPuerto_compuesto = input_b() & iLos_Cuatro_MSB_PORTB;
iPuerto_compuesto |= (input_state(iColumna3) << 3);
iPuerto_compuesto |= (input_state(iColumna2) << 2);
iPuerto_compuesto |= (input_state(iColumna1) << 1);
iPuerto_compuesto |= input_state(iColumna0);
}
//********************************************************************
// iColumna[3-0]=0
//********************************************************************
void Limpiar_Columnas(void){
output_low(iColumna0);
output_low(iColumna1);
output_low(iColumna2);
output_low(iColumna3);
}