|
|
View previous topic :: View next topic |
Author |
Message |
koenbielen
Joined: 23 Apr 2009 Posts: 42
|
18F25K22 UART problem |
Posted: Wed Oct 03, 2012 3:27 am |
|
|
hi
Interrupt does not work on both serial ports.
I never get an interrupt.
Tips are welcome
thanks
Code: |
#use rs232(baud=38400,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8,DISABLE_INTS,STREAM=RFNETWERK)
#use rs232(baud=38400,parity=N,xmit=PIN_B6,rcv=PIN_B7,bits=8,DISABLE_INTS,STREAM=PC)
//----------------------------------------------------------------
#INT_RDA
void SerialDataAvailable()
{
if(kbhit(RFNETWERK))
{
nGroeneLedsLevel++;
bFlagUpdatePanelLeds = TRUE;
ReadSerialData();
}
if(kbhit(PC))
{
nGroeneLedsLevel++;
bFlagUpdatePanelLeds = TRUE;
ReadSerialData();
}
}
//----------------------------------------------------------------
//------------------------------------------------------------------------------
void main()
{
//setup_oscillator (osc_8MHZ | OSC_PLL_ON);
setup_uart(1);
setup_uart(2);
delay_ms(300);
//-----------------------------------------------------------------------------------------------------------------------------------------------------
set_tris_a (0xE3);
set_tris_b (0x80);
set_tris_c (0x80);
set_tris_e (0XFF);
//-----------------------------------------------------------------------------------------------------------------------------------------------------
disable_interrupts(INT_EXT);
enable_interrupts(INT_TIMER1);
enable_interrupts(INT_RDA);
enable_interrupts(INT_RDA2);
disable_interrupts(INT_EEPROM);
enable_interrupts(global);
while (1)
{
for(lX=0;lX<=500;lX++)
{
set_pwm1_duty(lX);
delay_ms(10);
}
output_bit(PIN_A2,input(PIN_A5)); // KNOP 1 RODE LED
output_bit(PIN_A3,input(PIN_A7)); // KNOP 2 GELE LED
output_bit(PIN_A4,input(PIN_A6)); // KNOP 3 GROENE LED
delay_ms(20);
output_bit(PIN_C0,input(PIN_A5)); // KNOP 1 RODE LED
output_bit(PIN_C1,input(PIN_A6)); // KNOP 1 RODE LED
delay_ms(500);
PrintInfoToPC(123,456.789);
}
} |
|
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19498
|
|
Posted: Wed Oct 03, 2012 3:40 am |
|
|
Er. Of course it won't. There are two separate interrupts for the two UARTs.
INT_RDA triggers to say a character is available/waiting on UART1. No point in testing kbhit, the character _is_ there.
For UART2, INT_RDA2 triggers. You are enabling this, but have no handler for it. Will crash the chip.
Get rid of 'DISABLE_INTS' in the RS232 definitions. This is to prevent interrupts from interfering with _software_ UARTs. You _want_ interrupts to occur.
Add 'ERRORS' to both RS232 definitions. This is _required_ when using the hardware UARTs, unless _you_ add error handling code to your handler.
You don't show your 'ReadSerialData' routine, but you'd not normally want the same routine for the two UARTs. The routine should read just _one_ character (this is all that is waiting for you), and exit ASAP, or it risks loosing data.
Best Wishes |
|
|
RF_Developer
Joined: 07 Feb 2011 Posts: 839
|
|
Posted: Wed Oct 03, 2012 3:48 am |
|
|
Serial receive interrupts will only work with hardware UARTS. You don't say which PIC you are using: many have only one hardware UART. So we cannot tell whether both your UARTS are goign to be implemented in hardware or not.
If both UARTS are hardware, then they will have different interrupts, int_rda is for the first or only (hardware) UART. #int_rda1 and #int_rda2 are for both, in PICs that have two or more hardware UARTS.
Don't use kbhit() in serial receive (i.e. int_rda) ISRs. The interrupt TELLS you a character is available, there is no point in testing to see if there's one. Also, even if you don't need it (for example your buffer is full and you are ignoring the character) you must always read the character from the UART.
Only use set_tris if you are using fast IO on that port. CCS C handles port direction automatically for you by default. HOWEVER some PICs (generally lower pin count ones which share functions between pins) may need some pin allocation and in a very few specific cases *may* need a set_tris to get the ports to work correctly. Then again, low pin count PICs don't have two hardware UARTS...
All interrupts are disabled by hardware at reset, Therefore you only need to enablee the ones you intend to use. ONLY enable interrupts if you have a valid ISR to handle them, otherwise your code will crash.
Please use the code tags, using the Code button on the messge page, to preserve formatting in code.
RF Developer
PS: It appears I posted at much the same time as Ttelmah. |
|
|
koenbielen
Joined: 23 Apr 2009 Posts: 42
|
Solved |
Posted: Wed Oct 03, 2012 5:19 am |
|
|
Thanks for the info
tried it and it worked.
And also solved another problem with the getc, it had to be fgetc()
Thanks
PS : RF_Developer look at the topic, you see the PIC used |
|
|
|
|
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
|