TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: dpulgar en 05 de Abril de 2008, 11:19:59

Título: Puerto Serial Problema con la velocidad PIC16F883
Publicado por: dpulgar en 05 de Abril de 2008, 11:19:59
Tengo un caso extraño con el puerto serial del PIC16F883 resulta que ajusto la velocidad a 4800, pero el transmite
a 4400 baud. un error de un 8.33% he probado con varias velocidades:

Baud         
Real   Obtenido   Diferencia   %
1200   1100   -100   8.33%
2400   2200   -200   8.33%
4800   4400   -400   8.33%
9600   8800   -800   8.33%

#use rs232(baud=4800,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8,errors)

he probado tambien con:
#use rs232(baud=4800,parity=N,BRGH1OK,xmit=PIN_C6,rcv=PIN_C7,bits=8,errors)

BRGH1OK:  Allow bad baud rates on chips that have baud rate problems.

Nota: este proyecto esta armado y de 10 equipos 2 presentan este problema de transmision y recepcion
En principio este problema se lo atribuia a las etapa de transmision intermedias MAX232, etc. y ruido del circuito
y fui cambiando varias etapas del cicuito. Hasta que llegue al Micro.
El Micro realiza todas sus funciones bien, menos la tx y rx. Cuando logro ajustar con SIOW un baud rate no convencional
esto lo hago por prueba y error hasta ver el mensaje correctamente. Luego de ajustar la tx & rx no tiene
problema.

La version de CCS que utilizo es 4.068

Programa de prueba:

// Device: PIC16F883 4096 WORD, 368 Byte SRAM, 256 Byte EEProm
//                          _____
//   MCLR   --->  1  |º       | 28 <---> RB.7
//   RA.0  <--->  2  |        | 27 <---> RB.6
//   RA.1  <--->  3  |        | 26 <---> RB.5
//   RA.2  <--->  4  |        | 25 <---> RB.4
//   RA.3  <--->  5  |        | 24 <---> RB.3
//   RA.4  <--->  6  |        | 23 <---> RB.2
//   RA.5  <--->  7  |        | 22 <---> RB.1
//   Vss      --->  8  |        | 21 <---> RB.0
//   RA.7  <--->  9  |        | 20 <---  Vdd
//   RA.6  <---> 10 |        | 19 <---  Vss
//   RC.0  <---> 11 |        | 18 <---> RC.7
//   RC.1  <---> 12 |        |  17 <---> RC.6
//   RC.2  <---> 13 |        | 16 <---> RC.5
//   RC.3  <---> 14 |____ | 15 <---> RC.4
//

#include <16F883.h>
#device adc=10

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES INTRC_IO                 //Internal RC Osc, no CLKOUT
#FUSES PUT                      //Power Up Timer
#FUSES NOMCLR                   //Master Clear pin enabled
#FUSES NOPROTECT                //Code not protected from reading*
#FUSES NOCPD                    //No EE protection
#FUSES BROWNOUT                 //Reset when brownout detected
#FUSES NOIESO                   //Internal External Switch Over mode disabled
#FUSES NOFCMEN                  //Fail-safe clock monitor disabled
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NODEBUG                  //No Debug mode for ICD
#FUSES NOWRT                    //Program memory not write protected
#FUSES BORV40                   //Brownout reset at 4.0V

#use delay(clock=8000000,RESTART_WDT)
#use rs232(baud=4800,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8,errors)

#define OFF         0
#define ON          1

#define led_1       PIN_B3
#define led_2       PIN_B6
#define led_3       PIN_B7

#define tx          PIN_C6
#define rx          PIN_C7

#ZERO_RAM

void main() {

   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_CLOCK_DIV_8);
   setup_spi(SPI_SS_DISABLED);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1 (T1_INTERNAL|T1_DIV_BY_8);
   setup_timer_2(T2_DISABLED,0,1);
   setup_comparator(NC_NC_NC_NC);
   setup_oscillator(OSC_8MHZ|OSC_INTRC);

   output_drive(led_1);
   output_drive(led_2);
   output_drive(led_3);

   output_bit(led_1, OFF);
   output_bit(led_2, OFF);
   output_bit(led_3, OFF);

   while (true) {

      output_bit(led_1, ON);
      delay_ms(250);
      puts("Hello Word");
      output_bit(led_1, OFF);
      delay_ms(250);

   }
}
Título: Re: Puerto Serial Problema con la velocidad PIC16F883
Publicado por: QIQE en 05 de Abril de 2008, 15:08:33
deberias de comprobar si tu pic oscila realmente al la frecuencia que crees, claro al ser oscilador interno es un problema, no se si lo podras ver en la patilla osc con el osciloscopio y si no mediante un programa haciendo toggle en un pin, si puedes lo mejor seria cambiar el oscilador por un cristal que fuese medianamente bueno y comprobar si tienes esos desfases tambien.
Título: Re: Puerto Serial Problema con la velocidad PIC16F883
Publicado por: jfh900 en 05 de Abril de 2008, 15:34:47
Creo que lo que apunta QUIQUE es lo correctos. me parece que hay programas que permiten recalibrar el oscilador interno del pic, ya que es posible que este mal calibrado.

Un saludo
Título: Re: Puerto Serial Problema con la velocidad PIC16F883
Publicado por: dpulgar en 06 de Abril de 2008, 14:42:33
Gracias a todos por la mano. Efectivamente es la calibracion del oscilador interno he recurrido a la instru.:

setup_oscillator(OSC_8MHZ|,val_osc);

he variado "val_osc" desde -15 a 15 OSC_TUNE, hasta que transmite y recibe bien, luego he creado un programa
en VB6 para compartirlo con todos. Consiste en una calibracion por el puerto serial.
El programa del PIC varia de -15 a 15, en 31 transmiciones con un intervalo de tiempo de 500 ms, envia el dato conocido
en este caso "+"  por el RS232, el VB6 captura el dato y localiza
los datos que estan correcto luego busca el valor intermedio.

Saludos,

Título: Re: Puerto Serial Problema con la velocidad PIC16F883
Publicado por: miltonmc en 07 de Abril de 2008, 23:00:19
lo voy a probar para ver como funciona ya que me pasa algo igual cuando uso el oscilador interno
gracias a todos