|
|
View previous topic :: View next topic |
Author |
Message |
RoProe
Joined: 03 Mar 2005 Posts: 6
|
ICD-U40 Debugger Monitor with real RS232 |
Posted: Thu Mar 03, 2005 6:12 am |
|
|
Hello,
i use the 16F877 (4MHz) with the ICD-U40.
In my Programm, there ist a real RS232 mit the internel UART and i use Software FIFO on this UART. With Interrupt at receive an send.
For Debug info i want to use the RS232(DEBUGGER) with ICD and the Monitor Window.
The Debug-Output works very well. But if i receive any charecter on the real UART, the Debugger send only ")%/&%/&" ans o on.
Is there any Problem to use UART and Debugger at the same time?
RoProe |
|
|
treitmey
Joined: 23 Jan 2004 Posts: 1094 Location: Appleton,WI USA
|
|
Posted: Thu Mar 03, 2005 8:48 am |
|
|
Look up #use RS232 in the manual. Look at the invert function.
If you use the internal UART, you need a level translater (max232) before it is run to the PC serial port.
If you don't use the UART, then you can use the invert function and a 1k resister in series right into the serial port pin2or 3.
For a test change the pin used so its not the uart. Then put in the resister, add the invert code and see what comes out. |
|
|
RoProe
Joined: 03 Mar 2005 Posts: 6
|
|
Posted: Thu Mar 03, 2005 9:19 am |
|
|
That isn't the problem.
The real UART is use with MAX232 and it works every Time.
The "#use RS232(DEBUGGER)" works with problems. If there is a interrupt from real uart, the "#use RS232(DEBUGGER)" write only stuff.
RoProe |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Thu Mar 03, 2005 5:14 pm |
|
|
I don't have a CCS ICD to test, but this may help:
The CCS compiler uses a software UART on Pin B3 to send out
the DEBUGGER characters. If you get an interrupt when a character
is being sent out, then the timing of the RS232 pulses on pin B3
will not be correct. To fix this, you need to disable interrupts when
you're sending data out on the DEBUGGER pin. See the example below.
Of course, if you disable interrupts for too long, this may cause
other problems in your program. For example, you could miss
incoming characters in your #int_rda routine.
Code: | #include <16F877.H>
#device CCSICD=TRUE
#fuses XT, NOWDT, NOPROTECT, BROWNOUT, PUT, NOLVP
#use delay(clock = 4000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7, ERRORS)
#int_rda
void rda_isr(void)
{
char c;
c = getc();
}
//============================
main()
{
printf("Hello World");
#use rs232(DEBUGGER)
disable_interrupts(GLOBAL);
printf("ABC");
enable_interrupts(GLOBAL);
while(1);
} |
-----------------------
Edited to add:
To solve the problem of interrupts being disabled for "too long"
when the DEBUGGER software UART is used, I created the code below.
With this code, the interrupts will only be disabled for one character
time period when the DEBUGGER output is used. In between each
character, interrupts will be re-enabled. This will allow the hardware
UART interrupts to occur and you won't loose incoming characters.
Code: | #include <16F877.H>
#device CCSICD=TRUE
#fuses XT, NOWDT, NOPROTECT, BROWNOUT, PUT, NOLVP
#use delay(clock = 4000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7, ERRORS)
#int_rda
void rda_isr(void)
{
char c;
c = getc();
}
// Function Prototype
void debugger_out(char c);
//============================
main()
{
printf("Hello World");
printf(debugger_out, "ABC");
while(1);
}
//==================
// The printf(debugger_out, "ABC") statement will send
// characters to the following routine, one at a time.
// It will send 'A', then 'B', and finally 'C'. So now,
// interrupts will only be disabled for one character time
// period.
void debugger_out(char c)
{
#use rs232(DEBUGGER)
disable_interrupts(GLOBAL);
putc(c);
enable_interrupts(GLOBAL);
} |
|
|
|
Guest Guest
|
RS-232 with debugger |
Posted: Mon Mar 07, 2005 5:13 pm |
|
|
I am trying to dend data over the RS-232 port while simultaneously sending the data to the debugger window using the ICD-U40. Will your code do this? How does the microcontroller know to switch to and from the debugger? Do you have to say
Code: |
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7, ERRORS)
printf("Serial");
#use rs232(DEBUGGER)
printf("Debugger");
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7, ERRORS)
printf("Serial");
...
|
To switch back and forth between modes? In the previous code you have only one call to change the communication to the debugger. Does it somehow automatically change back to the RS232 port? Are you just assuming the user is using an ICD-S40 instead of a U40 and he wants to write to the Debugger window? |
|
|
Guest Guest
|
RS232 with Debugger |
Posted: Mon Mar 07, 2005 5:42 pm |
|
|
Ok, to answer my own question, the above code does work.
Now I have another question. Does switching between modes like this cause any significant performance delays / problems besides the interrupt problems discussed earlier? |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Mon Mar 07, 2005 9:23 pm |
|
|
Each you have a #use rs232(DEBUGGER) statement, the compiler
generates code for another instance of the software UART.
Each instance takes about 38 ROM words in the .LST file.
That's why it's better to use one "access" routine, as in my example,
and send the string to it with the special CCS feature that lets you
re-direct the output of printf to a routine. |
|
|
dilandau
Joined: 25 Aug 2010 Posts: 11
|
|
Posted: Wed Sep 21, 2011 9:27 am |
|
|
What I would do to check solve this problem:
1 - check you have #device ICD=TRUE fuse
2 - check there is a IO pin connected to ICD pin6 (for debugging)
3 - check that pin to be the one you use in the use232.
I use it this way. In my case PIN_B5 is the one for monitoring. (using CANBUS developer from CCS)
Code: | #use rs232(debugger,STREAM=MONITOR, baud=2400,xmit=PIN_B5,rcv=PIN_B5) |
4 - Enable data acquisition for PICC monitor. In the "Debug Configure" tab, set "userstream enabled" to "true" |
|
|
|
|
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
|