Haz una pregunta
  Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos
Foros Registrarse ¿Olvidaste tu contraseña?

Temas similares

19/07/2012 #1


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!
19/07/2012 #2

Avatar de Basalto

Hola.
PIC16F628A http://ww1.microchip.com/downloads/e...doc/40044f.pdf. Página 82 tabla 12-7 tienes los registros asociados a la comunicación serial asíncrona.

PIC18F26K22 http://ww1.microchip.com/downloads/e...Doc/41412F.pdf. Página 275 tabla 16-2, aquí como puedes ver tienes muchos mas registros que configurar.
19/07/2012 #3


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.
25/07/2012 #4


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...
Respuesta
¿Tienes una mejor respuesta a este tema? ¿Quieres hacerle una pregunta a nuestra comunidad y sus expertos? Registrate

Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos

Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO ©2011, Crawlability, Inc.