|
|
View previous topic :: View next topic |
Author |
Message |
PICman
Joined: 02 Nov 2007 Posts: 26
|
PIC16F88 cannot read RS232 |
Posted: Mon Dec 01, 2008 4:20 pm |
|
|
Hi...
I have a problem with a PIC16F88 and the #int_RDA interrupt.
I configured the PIC for 9600,8,N and while I can send (without any
problem) data out from the microcontroller, I have no reaction from it
when I send RS232 data into it.
My code:
Code: |
//
// PIC16F88
//
// RA3 = RXD
// RA1 = TXD
//
// _________ _________
// __| \/ |__
// DEL debug |__|Ra2 41 Ra1|__| 9600 bps --->---
// __| |__
// --->-- 9600 bps |__|Ra3 40 Ra0|__|
// __| |__
// |__|Ra4 clkin|__| 11,0592 MHz in
// __|____ |__
// +5V|__|MCLR/Vpp clkout|__|
// __| |__
// 0V|__|Vss Vdd|__| +5V
// __| |__
// |__|Rb0/int Rb7/ICSPDAT|__|
// __| |__
// |__|Rb1 Rb6/PGC|__|
// __| |__
// |__|Rb2 Rb5|__|
// __| |__
// |__|Rb3 Rb4|__|
// |____________________|
//
#include <16F88.h>
#device adc=8
//#FUSES XT,NOWDT,PUT,NOPROTECT,BROWNOUT,NOMCLR,NOLVP,NOCPD
//#use fast_io(b) //On ne veut pas barrer le TRIS (port I2C)
#FUSES EC_IO,NOWDT,PUT,NOPROTECT,BROWNOUT,NOMCLR,NOLVP,NOCPD
#FUSES
#use delay(clock=11059200,RESTART_WDT)
#use rs232(baud=9600,parity=N,xmit=PIN_A1,rcv=PIN_A3,bits=8)
//no master clear a5 (reset) ;cpd barrer eedata;nolvp lo-volt prog
/////////////////////////////////////////
void entree_rs232(void); //
void rad(void); //
void aff_stream(int8); //
void ini_pic(void); // P R O T O T Y P E S
int1 a_0,a_1,a_2,a_3,a_4,a_5,a_6,a_7; //
int1 carac_entre; //
int8 carac; //
int8 message; //
/////////////////////////////////////////
//#ZERO_RAM
//#int_RTCC
////////////////////////
#int_RDA //
void RDA_isr(void) //
{ // The (in)famous interrupt that does NOT
carac=getc(); // work!
carac_entre=1; //
} //
////////////////////////
///////////////////////////////////////////////////////////
void ini_pic(void) //
{ //
setup_adc_ports(NO_ANALOGS|VSS_VDD); //
setup_adc(ADC_OFF); //
setup_spi(FALSE); //
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1); //
setup_timer_1(T1_DISABLED); //
setup_timer_2(T2_DISABLED,0,1); //
setup_comparator(NC_NC_NC_NC); //
setup_vref(FALSE); //
enable_interrupts(INT_RDA); //
enable_interrupts(GLOBAL); //
setup_oscillator(False); //
port_b_pullups(true); //
output_a(0); //
output_b(0); //
set_tris_a(0b11111001); // gauche=bit7, droite=bit0 //
set_tris_b(0b11111111); // gauche=bit7, droite=bit0 //
} //
///////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
void aff_stream(int8 message) //
{ //
putchar(65); //
delay_us(104); // To add a second stop bit //
//
putchar(66); //
delay_us(104); //
//
putchar(67); //
delay_us(104); //
//
putchar(68); //
delay_us(104); //
//
putchar(69); //
delay_us(104); //
//
//
if(message==0) //
{ //
putchar(48); //
delay_us(104); //
} //
if(message==1) //
{ //
putchar(49); //
delay_us(104); //
} //
} //
///////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
void main() /////
{ /////
/*=-=*//*=-=*//*=-=*//*=-=*//*=-=*//*=-=*//*=-=*//*=-=*//*=-=*/ /////
ini_pic(); /////
/////
a_0=1; // /////
a_1=1; // /////
a_2=1; // /////
a_3=1; // pour éviter l'envoi de chaînes /////
a_4=1; // à la mise en marche. /////
a_5=1; // /////
a_6=1; // /////
a_7=1; // /////
/////
carac_entre=1; /////
/////
putchar(0xFF); // Pour initialiser la ligne RS232 à MARK /////
/////
while(1) // /////
{ // /////
if(input_state(PIN_B0)) // /////
{ // /////
if(a_0==0) // /////
{ // Character stream is sent /////
aff_stream(0); // on LO-HI transition /////
a_0=1; // /////
} // /////
} // /////
else // /////
{ // /////
a_0=0; // /////
delay_ms(100); // /////
} // /////
/////
/////
if(carac_entre) // /////
{ // /////
delay_ms(50); // Make the LED on pin 1 flash /////
output_high(PIN_A2); // on #int_RDA /////
delay_ms(50); // /////
output_low(PIN_A2); // /////
delay_ms(50); // /////
output_high(PIN_A2); // /////
delay_ms(50); // /////
output_low(PIN_A2); // /////
delay_ms(50); // /////
output_high(PIN_A2); // /////
delay_ms(50); // /////
output_low(PIN_A2); // /////
delay_ms(50); // /////
output_high(PIN_A2); // /////
delay_ms(50); // /////
output_low(PIN_A2); // /////
delay_ms(50); // /////
output_high(PIN_A2); // /////
delay_ms(50); // /////
output_low(PIN_A2); // /////
carac_entre=0; // /////
} // /////
} /////
} /////
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
|
I checked everything I could see. The crystal is a 11.0592 MHz (9600 * 1152) and I get my data out at a precise frequency (9600 +/- 10 bps) despite my raw way to add a second stop bit! I checked my interrupts (GLOBAL and #int_RDA), I've read the info. about #int_RDA in the manual and tested with both CCS 4.074 and 3.249.
My test circuit does (is supposed to...) flash an LED on pin 1 when an RS232 character is sent to the PIC. I've checked the waveform on pin 2 (RS232 input) and it's okay (idle at MARK (+5V) and levels ok, BTW, it's fed by a MAX232). I also changed the RS232 input pin (along with it's TRIS) w/o any success.
Did anyone ever get that problem ? and how did you solve it ?
Thanks for your attention. |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Mon Dec 01, 2008 4:34 pm |
|
|
Quote: |
#use rs232(baud=9600,parity=N,xmit=PIN_A1,rcv=PIN_A3,bits=8)
#int_RDA
void RDA_isr(void)
{ // The (in)famous interrupt that does NOT work!
carac=getc();
carac_entre=1;
} |
#int_rda only works with the hardware UART. To use #int_rda, change
your #use rs232() statement to use pins B5 and B2 for Tx and Rx.
Also change your hardware connections to use those pins. |
|
|
PICman
Joined: 02 Nov 2007 Posts: 26
|
|
Posted: Mon Dec 01, 2008 9:38 pm |
|
|
Wow!
Thanks a lot !!!!
I'll try that tomorrow ! That completely make sense !
Again, thanks ! |
|
|
Guest
|
|
Posted: Tue Dec 02, 2008 7:36 am |
|
|
IT WORKED !
I just tried it and everything's okay !
Thanks PCM Programmer ! |
|
|
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
Powered by phpBB © 2001, 2005 phpBB Group
|