|
|
View previous topic :: View next topic |
Author |
Message |
cyclo.sl
Joined: 07 Oct 2009 Posts: 11
|
Problem with software rs232 |
Posted: Mon Oct 26, 2009 11:35 am |
|
|
I'm using a software rs232 to communicate with another pic. When I'm testing the application with the pc rs232, the transmit of the sw rs232 works fine but the receive pin doesn't seem to work. Following is a part of my coding.. (pic18f4431)
Code: | #include pic18f4431.h
#use rs232(stream=2,baud=9600,parity=N,xmit=PIN_E1,rcv=PIN_E0,bits=8,errors,force_sw,disable_ints)
set_tris_e(0x01);
fprintf(2,"Hello"); // working
if (kbhit(2))
int8 char = getch(2); //not working..
//but when I disconnect the recev wire to pic, getch(2) returns a zero.
|
Any idea about this?
Thanks.. |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Mon Oct 26, 2009 11:54 am |
|
|
1. Post a short compilable test program, with #fuses, #use delay, main(), etc.
2. Post if you are using a MAX232-type chip to interface the serial port
connections on the PIC to the PC.
3. Post your compiler version. |
|
|
cyclo.sl
Joined: 07 Oct 2009 Posts: 11
|
|
Posted: Mon Oct 26, 2009 1:00 pm |
|
|
Thanks PCM Programmer..
my bad.. I should have posted a complete program.
I'm using ccs PCWHD 4.057 and yes I'm using a MAX232 level converter.
Code: |
#include <18F4431.h>
#device adc=8
#FUSES NOWDT //No Watch Dog Timer
#FUSES WDT128 //Watch Dog Timer uses 1:128 Postscale
#FUSES INTRC_IO //Internal RC Osc, no CLKOUT
#FUSES NOPROTECT //Code not protected from reading
#FUSES IESO //Internal External Switch Over mode enabled
#FUSES NOBROWNOUT //No brownout reset
#FUSES BORV27 //Brownout reset at 2.7V
#FUSES NOPUT //No Power Up Timer
#FUSES NOCPD //No EE protection
#FUSES NOSTVREN //Stack full/underflow will not cause reset
#FUSES NODEBUG //No Debug mode for ICD
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOWRT //Program memory not write protected
#FUSES NOWRTD //Data EEPROM not write protected
#FUSES FCMEN //Fail-safe clock monitor enabled
#FUSES NOWINEN //WDT Timer Window Disabled
#FUSES T1LOWPOWER //Timer1 low power operation when in sleep
#FUSES HPOL_HIGH //High-Side Transistors Polarity is Active-High (PWM 1,3,5 and 7)
//PWM module high side output pins have active high output polarity
#FUSES NOWRTC //configuration not registers write protected
#FUSES NOWRTB //Boot block not write protected
#FUSES NOEBTR //Memory not protected from table reads
#FUSES NOEBTRB //Boot block not protected from table reads
#FUSES NOCPB //No Boot Block code protection
#FUSES LPOL_HIGH //Low-Side Transistors Polarity is Active-High (PWM 0,2,4 and 6)
//PWM module low side output pins have active high output polar
#FUSES PWMPIN //PWM outputs disabled upon Reset
#FUSES MCLR //Master Clear pin enabled
#FUSES FLTAC1 //FLTA input is multiplexed with RC1
#FUSES SSP_RC //SCK/SCL=RC5, SDA/SDI=RC4, SDO=RC7
#FUSES PWM4D5 //PWM4 output is multiplexed on RD5
#FUSES EXCLKC3 //TMR0/T5CKI external clock input is muliplexed with RC3
#use delay(clock=8000000)
#use rs232(stream=1,baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8,errors)
#use rs232(stream=2,baud=9600,parity=N,xmit=PIN_E1,rcv=PIN_E0,bits=8,errors,force_sw,disable_ints)
void main(){
fprintf(1,"\n\rInitializing...");
setup_adc_ports(NO_ANALOGS|VSS_VDD);
setup_adc(ADC_OFF|ADC_TAD_MUL_0|ADC_WHEN_INT0|ADC_INT_EVERY_OTHER);
setup_spi(SPI_SS_DISABLED);
setup_wdt(WDT_OFF);
setup_timer_0(RTCC_INTERNAL);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
set_tris_a(0x00);
set_tris_b(0x00);
set_tris_c(0x80);
set_tris_d(0xFF);
set_tris_e(0x01);
fprintf(1,"Done"); //working (Hyper terminal)
fprintf(2,"Soft UART"); //working
int8 char = 'A';
while(true){
char = 'A';
if (kbhit(2))
char = getch(2);
fprintf(1,"char %u",char); // printing A
}
}
|
As I said before, once I disconnect the receive wire from the sw rs232 recv pin, getch() always returns a zero(char=0).
I tried changing the sw uart pins in #use rs232 directive. But same thing happens with others pins too. Transmit is working but not the receive.
Tried using the Invert param in use rs232,but didn't work either.
Hope I made my self clear. If not, please tell me what else I have to post.. thanks |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Mon Oct 26, 2009 3:34 pm |
|
|
Quote: | int8 char = 'A';
*** Error 51 "PCH_Test.c" Line 64(3,7): A numeric expression must appear here |
Your code doesn't compile. I installed PCH vs. 4.057 and I got this error.
Quote: | char = 'A';
*** Error 28 "PCH_Test.c" Line 66(12,13): Expecting an identifier |
And I got this error, and more.
Quote: | if (kbhit(2))
char = getch(2);
fprintf(1,"char %u",char); // printing A
*** Error 51 "PCH_Test.c" Line 68(7,11): A numeric expression must appear here
*** Error 51 "PCH_Test.c" Line 69(24,28): A numeric expression must appear here
*** Error 43 "PCH_Test.c" Line 71(1,2): Expecting a declaration |
It doesn't like any of this either, and for the same reasons.
You can't use a keyword as a variable name. This means you're not
posting your real program.
Quote: | #use rs232(stream=1,baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8,errors) #use rs232(stream=2,baud=9600,parity=N,xmit=PIN_E1,rcv=PIN_E0,bits=8,errors,force_sw,disable_ints)
*** Error 100 "PCH_Test.c" Line 39(5,78): USE parameter value is out of range "STREAM"
*** Error 100 "PCH_Test.c" Line 40(5,100): USE parameter value is out of range "STREAM"
|
If I compile it with vs. 4.099, it gives me these additional errors.
It doesn't like numbers as streams. I pretty much knew that, but
apparently 4.057 doesn't report the error.
You need to fix all this. Post real code that compiles with no errors
and has been tested. |
|
|
cyclo.sl
Joined: 07 Oct 2009 Posts: 11
|
|
Posted: Mon Oct 26, 2009 5:48 pm |
|
|
PCM programmer wrote: |
Your code doesn't compile. I installed PCH vs. 4.057 and I got this error.
|
omg thanks a lot PCM programmer. and Im really sorry for not posting the real code. The reason is that it is very lengthy. Since I don't want to make you angry any more, I'll post it. I've omitted few parts which will not affect this code. No compile errors generated.
Code: |
#include "pic18f4431core.h" //which holdes all thoes fuses and #use directives mentioned in my prev post
#define STREAM_SENSORS 2
#define STREAM_IR 1
#define INIT_DUTY 400L
#define MOTOR1_START_DUTY 564L
#define MOTOR2_START_DUTY 572L
#define MOTOR3_START_DUTY 596L
#define MOTOR4_START_DUTY 564L
int8 command=0;
int1 hasNewCommand=0;
void initialize(void);
void readCommand(void);
void processCommand(void);
void initialize()
{
fprintf(STREAM_IR,"\n\rInitializing...");
setup_adc_ports(NO_ANALOGS|VSS_VDD);
setup_adc(ADC_OFF|ADC_TAD_MUL_0|ADC_WHEN_INT0|ADC_INT_EVERY_OTHER);
setup_spi(SPI_SS_DISABLED);
setup_wdt(WDT_OFF);
setup_timer_0(RTCC_INTERNAL);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
set_tris_a(0x00);
set_tris_b(0x00);
set_tris_c(0x80);
set_tris_d(0xFF);
set_tris_e(0x01);
setup_power_pwm(PWM_CLOCK_DIV_64 | PWM_FREE_RUN,1,0,2499L,0,1,0);
setup_power_pwm_pins(PWM_BOTH_ON,PWM_BOTH_ON,PWM_BOTH_ON,PWM_BOTH_ON);
set_power_pwm0_duty(INIT_DUTY);
set_power_pwm2_duty(INIT_DUTY);
set_power_pwm4_duty(INIT_DUTY);
set_power_pwm6_duty(INIT_DUTY);
fprintf(STREAM_IR," Done.");
}
void readCommand()
{
if (kbhit(STREAM_SENSORS)){
command = getch(STREAM_SENSORS);
hasNewCommand = 1;
}
}
void processCommand()
{
fprintf(STREAM_IR,"Command %u received.",command);
//processing
hasNewCommand = 0;
}
void main()
{
initialize();
delay_ms(500);
while(true)
{
fprintf(STREAM_IR,".");
delay_ms(500);
readCommand();
if (hasNewCommand)
processCommand();
}
} |
Stream_IR, which is the hardware UART, is working fine. And fprintfs with Stream_Sensors are also working fine. Yet the kbhit() in readCommand() always returns false even though I send values from the pc. Once I remove the recv wire, it returns true and the command variable will have a zero(may be because of pin floating). Is that indicate the receiving is working?
I thought the stream id should be a number and thats why I used a #define for that. yes the Compiler isn't giving any warnings for that. But why only receive is not working..?
Thank you |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Mon Oct 26, 2009 5:51 pm |
|
|
Quote: | #include "pic18f4431core.h" |
It won't compile without this file. |
|
|
cyclo.sl
Joined: 07 Oct 2009 Posts: 11
|
|
Posted: Mon Oct 26, 2009 6:27 pm |
|
|
Thanks.
Yes that file only contains all thoes fuse settings and #use directives which I posted earlier. It is the normal header file automatically generated by CCS upon creating a new project.
pic18f4431core.h
Code: |
#include <18F4431.h>
#device adc=8
#FUSES NOWDT //No Watch Dog Timer
#FUSES WDT128 //Watch Dog Timer uses 1:128 Postscale
#FUSES INTRC_IO //Internal RC Osc, no CLKOUT
#FUSES NOPROTECT //Code not protected from reading
#FUSES IESO //Internal External Switch Over mode enabled
#FUSES NOBROWNOUT //No brownout reset
#FUSES BORV27 //Brownout reset at 2.7V
#FUSES NOPUT //No Power Up Timer
#FUSES NOCPD //No EE protection
#FUSES NOSTVREN //Stack full/underflow will not cause reset
#FUSES NODEBUG //No Debug mode for ICD
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOWRT //Program memory not write protected
#FUSES NOWRTD //Data EEPROM not write protected
#FUSES FCMEN //Fail-safe clock monitor enabled
#FUSES NOWINEN //WDT Timer Window Disabled
#FUSES T1LOWPOWER //Timer1 low power operation when in sleep
#FUSES HPOL_HIGH //High-Side Transistors Polarity is Active-High (PWM 1,3,5 and 7)
//PWM module high side output pins have active high output polarity
#FUSES NOWRTC //configuration not registers write protected
#FUSES NOWRTB //Boot block not write protected
#FUSES NOEBTR //Memory not protected from table reads
#FUSES NOEBTRB //Boot block not protected from table reads
#FUSES NOCPB //No Boot Block code protection
#FUSES LPOL_HIGH //Low-Side Transistors Polarity is Active-High (PWM 0,2,4 and 6)
//PWM module low side output pins have active high output polar
#FUSES PWMPIN //PWM outputs disabled upon Reset
#FUSES MCLR //Master Clear pin enabled
#FUSES FLTAC1 //FLTA input is multiplexed with RC1
#FUSES SSP_RC //SCK/SCL=RC5, SDA/SDI=RC4, SDO=RC7
#FUSES PWM4D5 //PWM4 output is multiplexed on RD5
#FUSES EXCLKC3 //TMR0/T5CKI external clock input is muliplexed with RC3
#use delay(clock=8000000)
#use rs232(stream=1,baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8,errors)
#use rs232(stream=2,baud=9600,parity=N,xmit=PIN_E1,rcv=PIN_E0,bits=8,errors,force_sw,disable_ints)
|
|
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Mon Oct 26, 2009 7:05 pm |
|
|
I told you that modern versions of the compiler will not accept numbers
as the stream identifiers.
I suggest that you give the streams proper names, instead of using '1'
and '2'. Give them names such as "PC" and "GPS", or whatever name
is suitable for your application. Change all functions that use streams
to use the new names.
See if that fixes the problem. |
|
|
ckielstra
Joined: 18 Mar 2004 Posts: 3680 Location: The Netherlands
|
|
Posted: Mon Oct 26, 2009 7:46 pm |
|
|
A minor error, but could bite you later: Code: | setup_spi(SPI_SS_DISABLED); | This is an error in the CCS wizard. Disable SPI with: |
|
|
cyclo.sl
Joined: 07 Oct 2009 Posts: 11
|
|
Posted: Tue Oct 27, 2009 8:31 am |
|
|
Hey PCM programmer, I tried changing the stream IDs but still not working. Please tell me if you have any suggestions.
Thank you
Thanks Ckielstra.. I made that change starting away.. |
|
|
|
|
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
|