|
|
View previous topic :: View next topic |
Author |
Message |
gremi
Joined: 11 Mar 2008 Posts: 20 Location: Toulouse, France
|
Rda interrupt only twice |
Posted: Wed May 21, 2008 3:49 am |
|
|
Hi, I'm doing a datalogger (RS232->SDCARD)
I'm using a SDCOM-5 module : I send commands and it's written on the sd card (stream SDCOM)
I receive data from rs232 (stream = gill) on the hardware port.
Data is arriving on a continous way : I put data on strings, message and message2. When a '+' (ascii) is detected, I send the string in the main function. I use two strings because I send it with the software port while I still receive data.
Code: | #include <project.h>
#include <STRING.H>
#define DELAI 200
int flag,flag_envoi;
int8 compteur;
char message[256];
char message2[256];
#INT_RDA
serial_isr()
{
if(flag==0) {
message[compteur] = fgetc(GILL);
compteur++;
if (message[compteur-1]=='+') {
message[compteur]='\0';
compteur=0;
flag=1;
flag_envoi=1;
}
}else {
message2[compteur] = fgetc(GILL);
compteur++;
if (message2[compteur-1]=='+') {
message2[compteur]='\0';
compteur=0;
flag=0;
flag_envoi=1;
}
}
}
void main(void)
{
char retour[20];
int16 i;
int j;
int nb_trame=0;
char tampon;
fprintf(SDCOM, "init \r\n");
delay_ms(DELAI);
fprintf(SDCOM,"fcreate gill.txt \r\n");
delay_ms(DELAI);
fprintf(SDCOM,"fopen gill.txt /a \r\n");
delay_ms(DELAI);
fprintf(SDCOM,"fputs2 \r\n");
delay_ms(DELAI);
compteur=0;
enable_interrupts(INT_RDA);
enable_interrupts(GLOBAL);
flag=0;
flag_envoi=0;
while(nb_trame<=5) {
if (flag_envoi){
if(flag==0) fprintf(SDCOM,"0 %s \r\n",message);
else fprintf(SDCOM,"1 %s \r\n",message2);
flag_envoi=0;
nb_trame++;
}
}
fprintf(SDCOM,"%c",26);
fprintf(SDCOM,"fclose gill.txt \r\n");
while (1) {
delay_ms(500);
output_b(0xFF);
delay_ms(500);
output_b(0);
}
}
|
project.h :
Code: | #include <18F4620.h>
#fuses HS, NOWDT, NOPROTECT,NOLVP
#use delay(clock = 20000000)
#use rs232(baud=9600, xmit=PIN_C6,rcv=PIN_C7,stream=GILL)
#use rs232(baud=115200, xmit=PIN_C0,rcv=PIN_C1,stream=SDCOM) |
The problem I have is that the rda interruption is active only twice, after it never interrupts on rda...
Anyone can help me?
Thanks
CCS 4.069 + MPLAB 7 + microchip ICD + "Picdem 2+rhos" |
|
|
D-Kens
Joined: 09 May 2005 Posts: 35 Location: Toulouse (France)
|
|
Posted: Wed May 21, 2008 4:01 am |
|
|
Oh yeah, someone from Toulouse !!! I'm not the only one...
Well, I just had a quick look at your code, but I think you overflow the RS232 buffer, so it stops working after few charcters. In your Header file, you should add the ERRORS option in the definition of your RS232, to prevent the UART from stopping activity when an error occurs.
I don't have time now to look closely at what you wrote, but it seems like a common issue.
Good luck,
Christophe. |
|
|
Ttelmah Guest
|
|
Posted: Wed May 21, 2008 5:00 am |
|
|
As a 'separate' thing, I'd alter the serial receive code quite a bit. Array accesses, are quite slow (the compiler has to take the address of the start of the array, add the required offset, then transfer this value to the indirect addressing registers, to read/write the data..). Now it therefore is a lot quicker, to access arrays as little as possible, when storing data in the ISR. So:
Code: |
#INT_RDA
void serial_isr(void) {
int8 temp;
temp=fgetc(GILL);
if(flag==0) {
message[compteur] = temp;
compteur++;
if (temp=='+') {
message[compteur]='\0';
compteur=0;
flag=1;
flag_envoi=1;
}
}else {
message2[compteur] = temp;
compteur++;
if (temp=='+') {
message2[compteur]='\0';
compteur=0;
flag=0;
flag_envoi=1;
}
}
}
|
This 'saves' an array access on every pass through the ISR, which in some cases, may help.
Adding 'ERRORS', should be the default setting. However I can't see 'why' the UART would overflow with the given code. However there are other problems:
1) Are you really _sure_ that a '+', _will_ be received more often than every 256 characters, on the GILL stream?. If it is going to be exactly '256', there is a problem. Compteur, is only an 8 bit integer. As such, it can only hold values from 0 to 255. If there are 256 data bytes, _then_ the '+', Compteur needs to be able to reach 256, and the arrays need to be one character larger.
2) Add 'DISABLE_INTS' to the SDCOM declaration. Though this will _slow_the ability to respond to interrupts on the hardware UART it'll prevent the data corruption that will otherwise occur, if a character arrives, while one is being sent on the 'software' serial.
Best Wishes |
|
|
gremi
Joined: 11 Mar 2008 Posts: 20 Location: Toulouse, France
|
|
Posted: Wed May 21, 2008 6:03 am |
|
|
D-Kens wrote: | Oh yeah, someone from Toulouse !!! I'm not the only one...
Well, I just had a quick look at your code, but I think you overflow the RS232 buffer, so it stops working after few charcters. In your Header file, you should add the ERRORS option in the definition of your RS232, to prevent the UART from stopping activity when an error occurs.
I don't have time now to look closely at what you wrote, but it seems like a common issue.
Good luck,
Christophe. |
It works !! I added ERRORS and it works perfectly ;)
Merci beaucoup Christophe ;)
Ttelmah, thanks for the tip, i've modified my soft ... |
|
|
|
|
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
|