|
|
View previous topic :: View next topic |
Author |
Message |
cogen
Joined: 30 Jun 2007 Posts: 12
|
16f88 strange UART behavior |
Posted: Thu Jul 14, 2011 1:10 am |
|
|
Greetings,
The following code will echo, but will not work with the case statement. Also kbhit() with a single getc() call will just loop, even though there are no characters being input.
I expect I have done something stupid, any insight would be appreciated. I have had some consistent UART problems with this chip.
Thanks in advance....
Code: |
#include "main.h"
#include "flex_lcd.c"
#define rs485_cntrl pin_B0
void blink(void)
{
output_high(pin_B1);
delay_ms(1000);
output_low(pin_B1);
delay_ms(1000);
}
int16 ohms = 102;
int16 minutes = 20;
int fuel_percent = 73;
int1 on_off = 0;
char perc = "%";
char t = 'a';
char s = 'a';
void main()
{
setup_oscillator(OSC_4MHZ|OSC_TIMER1);
setup_ccp1(CCP_PWM);
set_pwm1_duty(55);
setup_comparator(NC_NC_NC_NC);
setup_timer_2(T2_DIV_BY_1,250,1); //200 us overflow, 200 us interrupt
lcd_init();
delay_ms(10);
output_low(RS485_cntrl);//enable rs485 chip to recieve
setup_uart(TRUE);
// output_high(RS485_cntrl);//enable rs485 chip to transmit
while (1)
{
output_low(RS485_cntrl);//enable rs485 chip to recieve
delay_ms(1);
if(kbhit(PORT1)){
s = getc();
s = getc();
output_high(RS485_cntrl);//enable rs485 chip to transmit
delay_ms(1);
putc(s);
delay_ms(1);
output_low(RS485_cntrl);//enable rs485 chip to recieve
delay_ms(1);
}
switch(s){
case 'a':
printf(lcd_putc,"Fuel %c %u Time %Lu\n",perc, fuel_percent, minutes);
if (on_off)printf(lcd_putc,")hms= %Lu Pump = ON\n", ohms);
if (!on_off)printf(lcd_putc,"Ohms %Lu Pump = OFF\n", ohms);
delay_ms(400);
break;
case 'b':
printf(lcd_putc,"Fuel %c %u Time %Lu\n",perc, 12, 123);
if (on_off)printf(lcd_putc,")hms= %Lu Pump = ON\n", ohms);
if (!on_off)printf(lcd_putc,"Ohms %Lu Pump = OFF\n", ohms);
delay_ms(400);
break;
case 'c':
printf(lcd_putc,"Fuel %c %u Time %Lu\n",perc, 37, 501);
if (on_off)printf(lcd_putc,")hms= %Lu Pump = ON\n", ohms);
if (!on_off)printf(lcd_putc,"Ohms %Lu Pump = OFF\n", ohms);
delay_ms(400);
break;
default:
printf(lcd_putc,"Fuel %c %u Time %Lu\n",perc, 99, 999);
if (on_off)printf(lcd_putc,")hms= %Lu Pump = ON\n", ohms);
if (!on_off)printf(lcd_putc,"Ohms %Lu Pump = OFF\n", ohms);
delay_ms(400);
break;
}
}
Header file>>>>>>>>>>>>>>>>>>>>
#include <16f88.h>
#device adc=16
#FUSES NOWDT //No Watch Dog Timer
#FUSES INTRC_IO //Internal RC Osc, no CLKOUT
#FUSES NOBROWNOUT //No brownout reset
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES CCPB3
#use delay(int=4000000)
#use rs232(baud=9600,parity=N,xmit=PIN_B5,rcv=PIN_B2,bits=8,stream=PORT1,errors)
|
|
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19504
|
|
Posted: Thu Jul 14, 2011 2:19 am |
|
|
I'd be suspicious of your RS4385 hardware, rather than the UART.
1) Have you got the RS485 bus _biased_ so when nothing is transmitting, receiving devices 'see' a high on their RX line?. This is required on RS485 - a couple of manufacturers do receivers that automatically do this. The 'A' line needs to be fractionally above the B line on the bus.
2) Is your bus terminated?. Again ties to the above, with it being possible to make the terminator also provide the bias - there are terminator chips that do this.
3) Is your buffer chip setup, so that when you are transmitting, the RX line to the PIC is again 'high'. You need to turn off the receive part at the same time you turn on the TX part, and have a pull-up resistor, so when the receive part is disabled, the RO line floats high (normally it goes high impedance when the receiver is disabled).
Unless all of the above are 'true', the UART _will_ be receiving unexpected characters, which will probably explain the problems...
Best Wishes |
|
|
cogen
Joined: 30 Jun 2007 Posts: 12
|
|
Posted: Thu Jul 14, 2011 4:21 pm |
|
|
Ttelmah,
Thank you for your response. I will check the RS485 hardware this evening, (my other job).
I just wanted to thank you in person, (or as close as I can get). I have seen many, many thoughtful posts by you on this forum. I for one, am really appreciative of your knowledge and the effort you put into supporting this forum. Thank you!
I will post my findings on the hardware at my first opportunity.
Mike |
|
|
cogen
Joined: 30 Jun 2007 Posts: 12
|
|
Posted: Thu Jul 14, 2011 7:52 pm |
|
|
I have built the hardware as Ttelmah has described with the exception of pulling the rx pin on the pic high. Was not sure that was what was meant. Rs485 chip is a sn65hvd1780. |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19504
|
|
Posted: Fri Jul 15, 2011 2:08 am |
|
|
The point is when you turn on the transmitter, and turn off the receiver, the receive output on the chip _floats_. If you look at the data sheet, when RE is high. there is between -1, and 1uA of current flow on the output pin (so indeterminate direction). If this is connected to the receive input of the PIC, which has no inherent pullup, the line can float anywhere (limited only by the clamp diodes in the chips). Certainly _not_ guaranteed to give a nice 'idle' level, instead you may well receive garbage characters (depending on electrical noise, and the actual float current.....
You have to ensure that when you turn the receiver off, the R line floats _high_.
Best Wishes |
|
|
cogen
Joined: 30 Jun 2007 Posts: 12
|
|
Posted: Sun Jul 17, 2011 10:52 am |
|
|
Well, I pulled the rx pin high, and did not solve the problem. I am doing PIC to PIC communication however, and the problem seems to clear up when I cut the PC out of the picture. I had tried a couple of different terminal programs in case there were extraneous characters being introduced. No help.
I do seem to remember having a similar problem with the 16f88 a while ago with just a rs232 connection....Thank you for the help! |
|
|
|
|
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
|