Problemas al migrar de 16F a 18F

Tengo un problema y espero que podáis echarme una mano. Llevo dos días buscando alguna solución por foros y páginas relacionadas pero no consigo nada.

El tema es el siguiente: Estoy haciendo un proyecto con una PIC16F628A, pero por necesidad de más memoria he decidido cambiar a una PIC18F26K22. Una vez hecha la migración todo funciona correctamente menos la rutina de tratamiento de interrupción RDA. No se que puede ser. He buscado por todos sitios algo parecido pero no encuentro nada.

Esta es la cabecera para la PIC16F628A:

Código:
#include <16F628a.h>
#include <crc.c>

#fuses NOWDT,INTRC_IO, NOPUT, NOPROTECT, NOBROWNOUT, NOMCLR, NOLVP, NOCPD

#use delay(clock=4000000, RESTART_WDT)
#use RS232(BAUD=9600,BITS=8,PARITY=N,XMIT=PIN_B2,RCV=PIN_B1)

#byte PORTB = 0X06
#byte PORTA = 0X05
#byte RCSTA = 0X18
#byte TXSTA = 0X98
#byte PIR1  = 0X0C
#byte INTCON = 0X0B

#define ENABLE_RX            RCSTA = 0b10010000
#define DISABLE_RX           RCSTA = 0b10000000

La cabecera para la PIC18F26K22 es la siguiente:

Código:
#include <18F26k22.h>
#include <crc.c>

#fuses NOWDT,INTRC_IO, NOPUT, NOPROTECT, NOBROWNOUT, NOMCLR, NOLVP, NOCPD

#use delay(clock=4000000, RESTART_WDT)
#use RS232(BAUD=9600,BITS=8,PARITY=N,XMIT=PIN_C6,RCV=PIN_C7)  

#byte PORTC = 0XF82
#byte PORTB = 0XF81
#byte PORTA = 0XF80
#byte RCSTA1 = 0XFAB
#byte TXSTA1 = 0XFAC
#byte PIR1  = 0XF9E
#byte INTCON = 0XFF2

#define ENABLE_RX            RCSTA1 = 0b10010000
#define DISABLE_RX           RCSTA1 = 0b10000000

Si alguien me puede guiar, se lo agradecería mucho!
 
Gracias por contestar. Yo me creía que CCS se encargaba de configurar todos esos registros. Les echaré un vistazo, a ver si soy capaz de hacerlo andar. Muchas gracias de nuevo.
 
He configurado todos los registros pero el comportamiento sigue siendo el mismo. Siempre entra en la rutina de tratamiento de interrupción por recepción de datos por rx (#int_RDA) pero nunca entra en la condición. Os pongo la rutina:

Código:
#int_RDA
void RDA_isr(void)
{  
   disable_interrupts(global);
   if(kbhit()){
      buffer_rx[indice]=getc(); 
     output_toggle(LED_TEST);
      if (buffer_rx[0]==1){ 
         indice++;
         if ((indice==2)||(bueno)){
            if(buffer_rx[1]<=11){
               bueno=true;
               if (indice==(buffer_rx[1]+5)){//buffer_rx[1] indica el número de datos a redicibir. 5 = 4 primeros bytes + checksum
                  indice=0;
                  bueno=false;
                  buffer_listo=true; 
                  output_toggle(LED);                  
               }  
            }
            else{
               buffer_rx[0]=buffer_rx[1];//Se asigna el dato leído a buffer_rx[0], ya que puede ser un dato válido
               indice=1;//Se acaba de asignar un valor a buffer_rx[0], si indice=0, entonces se perdería ese valor
            }
         }
      }
      else{
         buffer_rx[0]=buffer_rx[1];//Igual que 'else' anterior
         indice=1;
      }
   }
   enable_interrupts(global);
   clear_interrupt(INT_RDA);
}

Con la 16F628A va de perfecto. Lee toda la cadena de datos. Alguna sugerencia? Ya no se que hacer...
 
Atrás
Arriba