TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado 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);
}
}
-
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.
-
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
-
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,
-
lo voy a probar para ver como funciona ya que me pasa algo igual cuando uso el oscilador interno
gracias a todos