Autor Tema: Ayuda con intercambio de Pic 16f877A por 18F4620  (Leído 1822 veces)

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

Desconectado charlosh

  • PIC10
  • *
  • Mensajes: 12
Ayuda con intercambio de Pic 16f877A por 18F4620
« en: 20 de Agosto de 2010, 14:44:00 »
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);
}


 

anything