View previous topic :: View next topic |
Author |
Message |
hexfet13
Joined: 03 Jul 2009 Posts: 8
|
PIC18f14K22 and uart problems |
Posted: Fri Aug 12, 2011 9:28 am |
|
|
Hi,
I'm trying to test this simple debug program to do an echo function on the serial port:
Code: | #INCLUDE <18f14k22.h>
#FUSES NOMCLR,INTRC,NOWDT
#USE DELAY(CLOCK=1000000)
#USE RS232(BAUD=9600,XMIT=PIN_B7,RCV=PIN_B5)
void main(){
char tmp;
setup_oscillator(OSC_1MHZ);
printf("\n\rDEBUG LINE\n\r);
while (1){
tmp=getc();
printf("%c",tmp);
}
}
|
On hyperterminal I see the line "DEBUG LINE" but by pressing a key my program does nothing.
The pic14fk22 works with 2V and between rs232 port there are two level translators that interfaces a max232 that works at 3.3V (from 3.3 to 2V for TX PC's line and 2.2 to 3.3V for RX PC's line).
With my oscilloscope I can see that by pressing a key on hyperterminal I see the 0-2V signal directly on a B5 pin....so I don't understand where is the problem.
There's something wrong on my code?
Thanks! |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Fri Aug 12, 2011 12:58 pm |
|
|
Post your compiler version. |
|
|
hexfet13
Joined: 03 Jul 2009 Posts: 8
|
|
Posted: Sun Aug 14, 2011 2:20 am |
|
|
Thanks for your reply.
My compiler version is 4.093.
At this time the problem is not solved yet; i don't understand what's wrong. |
|
|
hexfet13
Joined: 03 Jul 2009 Posts: 8
|
|
Posted: Sun Aug 14, 2011 3:54 am |
|
|
I tried this simple code:
Code: | #INCLUDE <18f14k22.h>
#fuses NOWDT, NOMCLR, INTRC
#use delay(clock=1000000)
void main(){
setup_oscillator(OSC_INTRC|OSC_1MHZ);
while (1){
output_bit(PIN_B7,input(PIN_B5));
}
}
|
With mplab sim, applying a stimulus directly on pin B5, B7 follow exactly the signal on the input.
My pic with this code behaves in a strange mode: I measure correctly 2V on B5 but B7 remains always to 0V. Seems that the pin internally does not to be read .....I don't understand: this micro is correctly powered with +2.0V and gnd.
Any suggestion? |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Sun Aug 14, 2011 4:06 pm |
|
|
You have an older version of the compiler and it doesn't completely
support the 18F14K22. For example, the CCS standard is to configure
PortA as all digital in their start-up code. They don't do this in vs. 4.093.
Also, setup_adc_ports(NO_ANALOGS) doesn't work in that version. That
should properly set all analog pins on Ports A and B to be all digital. But it
doesn't. So to fix it, you can add the lines shown in bold below to your program:
Quote: |
#include <18F14K22.h>
#fuses NOWDT, NOMCLR, INTRC_IO
#use delay(clock=1M)
void make_all_pins_digital(void)
{
#byte ANSEL = getenv("SFR:ANSEL")
#byte ANSELH = getenv("SFR:ANSELH")
ANSEL = 0;
ANSELH = 0;
}
//========================
void main()
{
make_all_pins_digital();
while(1);
} |
Explanation of why it's happening:
The PIC data sheet explains what will happen if you try to read a digital
pin that is still configured as analog. To fix this problem, add the code
shown in bold above to your program. The data sheet says:
Quote: |
10.7 Port Analog Control
Setting an ANSx bit high will disable the associated digital input
buffer and cause all reads of that pin to return ‘0’ while allowing
analog functions of that pin to operate correctly.
|
|
|
|
hexfet13
Joined: 03 Jul 2009 Posts: 8
|
|
Posted: Tue Aug 16, 2011 7:17 am |
|
|
Yes, you are perfectly right, my compiler version does not support at 100% this micro.
Thanks for helping me |
|
|
|