View previous topic :: View next topic |
Author |
Message |
embedder
Joined: 11 Feb 2010 Posts: 19
|
PIC18F85K22 UART2 |
Posted: Fri Apr 08, 2011 9:27 am |
|
|
I am having a problem getting UART2 to work on PIC18F85K22. I can see valid characters getting to the RX2 pin (7 / RG2) on the 'scope, but no response or break from from kbhit() or fgetc(). I tried changing the port to a SW UART, but no luck. UART2 transmits OK, but no RX. UART1 works fine. Is there a bug or have I missed something "obvious"? Thanks for reading...
Code: |
#include <18F85K22.h>
#define DEBUG_MODE // comment-out for stand-alone operation
#ifdef DEBUG_MODE
#device ICD=TRUE
#endif
#ifdef DEBUG_MODE
#FUSES MCLR
#else
#FUSES NOMCLR
#endif
#device adc=12
#FUSES NOWDT // No Watch Dog Timer
#FUSES WDT128 // Watch Dog Timer uses 1:128 Postscale
#FUSES SOSC_DIG // Enables C0 & C1 as digital I/O
#FUSES NOXINST // Extended set extension and Indexed Addressing mode disabled (Legacy mode)
#FUSES PUT // Power Up Timer
#FUSES NOBROWNOUT // No brownout reset
#FUSES WDT_NOSLEEP
#FUSES NOEXTADDRSFT
#FUSES RTCOSC_INT
#FUSES HSM
#FUSES INTRC_HP
#FUSES PLLEN
#use delay(clock=16000000)
#use rs232(UART1, baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,stream=COM_A,errors)
#use rs232(UART2, baud=9600,parity=N,xmit=PIN_G1,rcv=PIN_G2,stream=COM_B,errors)
// RS232
#define MDX_SHDN PIN_G0
#define MD1_TXEN PIN_C0
#define MD1_REN PIN_C1
#define MD2_TXEN PIN_G3
#define MD2_REN PIN_G4
char cmd;
void init()
{
// RS232
output_high(MDX_SHDN); // MAX3323 ON
output_high(MD1_REN); // Rx enable
output_high(MD1_TXEN); // Tx enable
output_high(MD2_REN); // Rx enable
output_high(MD2_TXEN); // Tx enable
delay_ms(20);
}
void main()
{
disable_interrupts(GLOBAL);
setup_adc_ports(ALL_ANALOG|VSS_VDD);
setup_adc(ADC_CLOCK_INTERNAL|ADC_TAD_MUL_0);
setup_wdt(WDT_OFF);
setup_timer_3(T3_DISABLED|T3_DIV_BY_1);
setup_timer_4(T4_DISABLED,0,1);
setup_comparator(NC_NC_NC_NC);
setup_oscillator(OSC_16MHZ);
enable_interrupts(GLOBAL);
init();
fprintf(COM_A, "NYMPH COM_A\r\n");
fprintf(COM_B, "NYMPH COM_B\r\n");
while (TRUE) {
if(kbhit(COM_A)){
cmd=fgetc(COM_A);
fputc(cmd,COM_A);
}
if(kbhit(COM_B)){
cmd=fgetc(COM_B);
fputc(cmd,COM_B);
}
}
reset_cpu();
}
|
|
|
|
embedder
Joined: 11 Feb 2010 Posts: 19
|
|
Posted: Fri Apr 08, 2011 9:35 am |
|
|
Compiler V4.119 |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Fri Apr 08, 2011 5:01 pm |
|
|
Quote: | void main()
{
disable_interrupts(GLOBAL);
setup_adc_ports(ALL_ANALOG|VSS_VDD);
setup_adc(ADC_CLOCK_INTERNAL|ADC_TAD_MUL_0);
setup_wdt(WDT_OFF); |
The UART2 pins are set as analog pins by the line in bold.
They should be configured as digital pins.
You are setting ALL 24 pins that can be analog, as analog pins.
You should change it to select the specific analog pins that you need.
There are 24 analog-configurable pins on this PIC.
Also, in your program you are enabling/disabling Global interrupts.
There is no need for this. You have no interrupt routines. |
|
|
embedder
Joined: 11 Feb 2010 Posts: 19
|
|
Posted: Fri Apr 08, 2011 5:17 pm |
|
|
Excellent catch. Thank you!
(I plan to have some interrupt routines in the near future). |
|
|
temtronic
Joined: 01 Jul 2010 Posts: 9228 Location: Greensville,Ontario
|
|
Posted: Fri Apr 08, 2011 6:31 pm |
|
|
Ever since the design guys figured out you could 'multipurpose' a pin, it's been a battle to get the 'correct' configuration.
Things were easier back in the days of 8008s, teletypes and papertape ! |
|
|
embedder
Joined: 11 Feb 2010 Posts: 19
|
|
Posted: Mon Apr 11, 2011 8:18 am |
|
|
That was it PCM programmer. Thanks for your help. Caught-out by the doubled edged sword of multi-purpose pins. |
|
|
|