USART: Valor en baudios incorrecto

Hola,

estoy actualmente trabajando en un PIC24 para establecer comunicación USART a 9600 baudios. Trabajo con el compilador CCS, y en mi placa tengo un cristal de 10MHz. Estaba empleando:

Código:
#include <24FJ128GA106.h>

#device ADC=10
#device PASS_STRINGS = IN_RAM

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES NOJTAG                   //JTAG disabled
#FUSES NOPROTECT                //Code not protected from reading
#FUSES NOWRT                    //Program memory not write protected
#FUSES NODEBUG                  //No Debug mode for ICD
#FUSES ICSP1                    //ICD uses PGC1/PGD1 pins
#FUSES NOWINDIS                 //Watch Dog Timer in Window mode
#FUSES WPOSTS16                 //Watch Dog Timer PostScalar 1:32768
#FUSES NOIESO                   //Internal External Switch Over mode disabled
#FUSES FRC                      //Internal Fast RC Oscillator
#FUSES NOCKSFSM                 //Clock Switching is disabled, fail Safe clock monitor is disabled
#FUSES NOOSCIO                  //OSC2 is clock output
#FUSES XT                       //Crystal osc <= 4mhz for PCM/PCH , 3mhz to 10 mhz for PCD
#FUSES IOL1WAY                  //Allows only one reconfiguration of peripheral pins
#FUSES WPEND_LOW             
#FUSES NOWPCFG               
#FUSES NOWPDIS               

#use delay(clock=10000000)
#define TXPIN  PIN_B9
#define RXPIN  PIN_B8
#use rs232(baud=9600, xmit=TXPIN, rcv=RXPIN, parity=N)

Para posteriormente utilizar printf o putc. Cuando hago esto, recibo basura. He ojeado la ayuda del CCS, y vi que una de las fuentes de error de este fenomeno es que los baudios no sean los correctos. Supuestamente, para errores mayores al 3%, el compilador debería sacarme un warning al respeto, y no lo hace, pero he mirado con un analizados lógico y sí que existe cierta inexactitud en los baudios, con lo que creo que este es efectivamente el problema.


La cuestion es... ¿como lo soluciono? Cada vez que busco en internet, este problema es típico de la gente que utiliza el oscilador interno, y lo solucionan poniéndole un cristal. ¿Podría ser que tenga algún fuse incorrecto?

Otro intento que he hecho ha sido definir los registros y configurar manualmente. En este caso no tengo muy claro si para calcular el valor de U1BRG, Fcy=Fosc/4 o bien Fosc/2, pero vamos, que en cualquiera de los 2 casos pasaba a no recibir absolutamente nada, ni basura ni nada. El código usado en este intento fue:

Código:
#WORD U1MODE  = 0x0220
#WORD U1STA   = 0x0222
#WORD U1BRG   = 0x0224
#WORD U1TXREG = 0x0226
#WORD U1RXREG = 0x0228
#DEFINE TRMT bit_test(U1MODE,8)

...

void main()
{
   output_bit(PIN_LED_VERDE, ON);
   U1MODE = 0x8890;
   U1STA = 0x9400;
   U1BRG = 31;
   while(ALWAYS)
   {
      output_toggle(PIN_LED_ROJO);
      //printf(rs_p,"hola mundo!\r\n");
      U1TXREG = 'A';
      //putc('B');
      delay_ms(100);
   }
}

A ver si a alguien se le ocurre algo, porque no poder usar el #use es una incomodidad... Gracias de antemano
 
Hi romancito,
lo que yo hago en esto casos es transmitir 0xaa en ciclos y sin delay
para medir cada pulso con el osciloscopio, que a 9600 deberia ser de 0.104 milisegundos.
Dices que ya usaste el analizador digital, que tiempo dio para cada pulso?
En el arreglo del crystal estas utilizando capacitores o resistores?
:)
 
El arreglo del cristal lo hago con 2 condensadores de 22pF. En cuando al tiempo de los pulsos, no te lo se decir con exactitud, pero era ligeramente superior, de unos 0.122 ms. De momento estoy funcionando con el reloj interno, con el cual tengo una exactitud muy buena y me permite hacer las comunicaciones a 9600 baudios, pero querría poder arreglar este problema para hacer uso del reloj externo.

Yo pienso que mi problema está en los fuses, que no los tengo muy claros.¿Alguna idea?
 
Atrás
Arriba