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);
}
}