View previous topic :: View next topic |
Author |
Message |
igorbb
Joined: 06 Sep 2007 Posts: 7 Location: Brazil
|
RS232 - HARD X SOFT |
Posted: Thu Sep 06, 2007 8:53 am |
|
|
Hi all , I need some help regarding the use of the RS232.
I'm using a CCS 4.14 for a pic16f628a.
When using the hardware to do a serial communication with the system I have to control (another PIC that I can't change the code) it works just fine !
But when I change for the software communication ( using FORCE_SW in the #use_rs232) or using Pin that dos not have support for hardware USART the communications it just do not work.
What's worst about it that this is happening in the PROTEUS simulation and in the real actual hardware.
But if i plug the rx/tx in a PC ( or in a virtual term in PROTEUS) I get the right answer.
What I mean is : I'm sending the correct data. ( theses is what I tested and checked in a osciloscope)
But the other system cant understand me.
IF i use the hardware USART he can.
If i don't he can't.
---
Thanks in advance |
|
|
Humberto
Joined: 08 Sep 2003 Posts: 1215 Location: Buenos Aires, La Reina del Plata
|
|
Posted: Thu Sep 06, 2007 10:36 am |
|
|
It would be nice if we can see some code to help you.
Humberto |
|
|
igorbb
Joined: 06 Sep 2007 Posts: 7 Location: Brazil
|
|
Posted: Thu Sep 06, 2007 1:05 pm |
|
|
Ok.
This code works :
Code: |
#include <16F628A.h>
#FUSES NOWDT //No Watch Dog Timer
#FUSES HS //High speed Osc (> 4mhz)
#FUSES NOPUT //No Power Up Timer
#FUSES NOPROTECT //Code not protected from reading
#FUSES BROWNOUT //Reset when brownout detected
#FUSES MCLR //Master Clear pin enabled
#FUSES LVP //Low Voltage Programming on B3(PIC16) or B5(PIC18)
#FUSES NOCPD //No EE protection
#use delay(clock=20000000)
#use rs232(baud=9600,parity=N,xmit=PIN_b2,rcv=PIN_b1,bits=8)// HARDWARE
#use I2C(master, sda=PIN_A0, scl=PIN_A1, fast=100000)
boolean key_present;
unsigned char comando,dado;
void comunica_teclado()// KEYBOARD
{
unsigned char a;
do
{
a=getc();
comando=getc();
dado=getc();
} while(a!='@');
//espera receber @ na serial
if(comando == 'W')
{
putc(0x01);
}
else if(comando == 'Q')
{
printf("@QCAA");
putc(0);
key_present=1;
}
else if( comando == 'R')
{
putc(0x02);
}
}
void main()
{
port_b_pullups( true); // LIGA PULLUPS DA PORTA B
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);
setup_oscillator(False);
printf("inicio");
for(;;)
{
comunica_teclado();
}
} |
|
|
|
igorbb
Joined: 06 Sep 2007 Posts: 7 Location: Brazil
|
|
Posted: Thu Sep 06, 2007 1:11 pm |
|
|
And this does not.
Code: | #include <16F628A.h>
#FUSES NOWDT //No Watch Dog Timer
#FUSES HS //High speed Osc (> 4mhz)
#FUSES NOPUT //No Power Up Timer
#FUSES NOPROTECT //Code not protected from reading
#FUSES BROWNOUT //Reset when brownout detected
#FUSES MCLR //Master Clear pin enabled
#FUSES LVP //Low Voltage Programming on B3(PIC16) or B5(PIC18)
#FUSES NOCPD //No EE protection
#use delay(clock=20000000)
#use rs232(baud=9600,parity=N,xmit=PIN_a2,rcv=PIN_a3,bits=8)// OTHER PINS
#use I2C(master, sda=PIN_A0, scl=PIN_A1, fast=100000)
boolean key_present;
unsigned char comando,dado;
void comunica_teclado()// KEYBOARD
{
unsigned char a;
do
{
a=getc();
comando=getc();
dado=getc();
} while(a!='@');
//espera receber @ na serial
if(comando == 'W')
{
putc(0x01);
}
else if(comando == 'Q')
{
printf("@QCAA");
putc(0);
key_present=1;
}
else if( comando == 'R')
{
putc(0x02);
}
}
void main()
{
port_b_pullups( true); // LIGA PULLUPS DA PORTA B
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);
setup_oscillator(False);
printf("inicio");
for(;;)
{
comunica_teclado();
}
} |
|
|
|
igorbb
Joined: 06 Sep 2007 Posts: 7 Location: Brazil
|
|
Posted: Thu Sep 06, 2007 1:12 pm |
|
|
This also does not work:
Code: | #include <16F628A.h>
#FUSES NOWDT //No Watch Dog Timer
#FUSES HS //High speed Osc (> 4mhz)
#FUSES NOPUT //No Power Up Timer
#FUSES NOPROTECT //Code not protected from reading
#FUSES BROWNOUT //Reset when brownout detected
#FUSES MCLR //Master Clear pin enabled
#FUSES LVP //Low Voltage Programming on B3(PIC16) or B5(PIC18)
#FUSES NOCPD //No EE protection
#use delay(clock=20000000)
#use rs232(baud=9600,FORCE_SW,parity=N,xmit=PIN_b2,rcv=PIN_b1,bits=8)// FORCED SOFTWARE
#use I2C(master, sda=PIN_A0, scl=PIN_A1, fast=100000)
boolean key_present;
unsigned char comando,dado;
void comunica_teclado()// KEYBOARD
{
unsigned char a;
do
{
a=getc();
comando=getc();
dado=getc();
} while(a!='@');
//espera receber @ na serial
if(comando == 'W')
{
putc(0x01);
}
else if(comando == 'Q')
{
printf("@QCAA");
putc(0);
key_present=1;
}
else if( comando == 'R')
{
putc(0x02);
}
}
void main()
{
port_b_pullups( true); // LIGA PULLUPS DA PORTA B
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);
setup_oscillator(False);
printf("inicio");
for(;;)
{
comunica_teclado();
}
}
|
Last edited by igorbb on Thu Sep 06, 2007 1:14 pm; edited 1 time in total |
|
|
igorbb
Joined: 06 Sep 2007 Posts: 7 Location: Brazil
|
|
Posted: Thu Sep 06, 2007 1:14 pm |
|
|
That's why I'm thinking the problem is software comunication library.
Every time it uses a software for some reason the other system does not understand him.
But I've checked and thereis data going on the TX pin. |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Thu Sep 06, 2007 1:39 pm |
|
|
Try a very simple program, as shown below. Then try it with FORCE_SW.
Code: |
#include <16F628A.H>
#fuses HS, NOWDT, NOPROTECT, BROWNOUT, PUT, NOLVP
#use delay(clock = 20000000)
#use rs232(baud=9600, xmit=PIN_B2, rcv=PIN_B1, ERRORS)
//======================================
void main()
{
char c;
while(1)
{
c = getc();
putc(c);
}
|
Note that this program uses NOLVP. That's important. The LVP fuse
is only used if you have a LVP programmer. 99% of all programmers
use High Voltage mode, and therefore must use the NOLVP fuse setting.
Quote: | I'm using a CCS 4.14 for a pic16f628a. |
There is no version 4.14. Post your true compiler version. See this list:
http://www.ccsinfo.com/devices.php?page=versioninfo
If you really have vs. 4.014, then I suggest that you upgrade to a later
verson. Vs. 4.014 will have many bugs in it. The bugs could be the
reason your programs don't work. (Besides using the LVP fuse). |
|
|
igorbb
Joined: 06 Sep 2007 Posts: 7 Location: Brazil
|
|
Posted: Thu Sep 06, 2007 1:57 pm |
|
|
Its 4.014. Sorry for that.
I will try the NOLVP.
And the problem its not the communication by it self .
When I use in a hyperterminal it works just fine. ( Using HARD or SOFT communication)
But my system ( other PIC that I can't change nothing on the code) just understand when I use Hardware communication!
I will try with other CCS too.
--
Thanks for the help
;)
I will keep you updated with the results. |
|
|
igorbb
Joined: 06 Sep 2007 Posts: 7 Location: Brazil
|
|
Posted: Thu Sep 06, 2007 2:19 pm |
|
|
Also tryed with the CCS 3.249
And I got the same error.
Its very strange cause in the hyperterminal Its the same for the both case ( With the software and hardware) But my system just understand when i use hardware.
=/ |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Thu Sep 06, 2007 2:30 pm |
|
|
What are the connections to your other PIC ? (For Tx and Rx)
Do the Tx and Rx signals go through a MAX232 chip ? |
|
|
|