Sebastian
Joined: 01 Dec 2003 Posts: 21 Location: Milan Italy
|
RS 232 INTERRUPT PROBLEM |
Posted: Wed Jan 04, 2006 7:37 am |
|
|
HI ALL !!
I HAVE TRY TO MANAGE INTERRUPTS.
I MUST TURN ON RXLED ( IN MY CODE ) AFTER EVERY RX 232 INTERRUPT BUT IN THIS WAY I SEE LED ON ONLY AFTER THE SECOND
PUSH BUTTON .
SOMEONE CAN TELL ME A RIGHT WAY........
#if defined(__PCH__)
#include <18F452.h>
#include <string.H>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7,ERRORS)
#endif
#include <input.c>
#define STX 0x02 // Start of Transmition
#define ETX 0x03 // End of Transmition
#define AD 0x55
#define SEMICOLON 0x3B
#define LED1 PIN_B0
#define LED2 PIN_B1
#define LED3 PIN_B2
#define LED4 PIN_B3
#define LED5 PIN_B4
#define LED6 PIN_B5
#define RFLED PIN_A1
#define RXLED PIN_A2
#define PUSH_BUTTON PIN_D0
//------------------------------------------------------------------------------
#define BUFFER_SIZE 9
//------------------------------------------------------------------------------
#DEFINE BUFFER_COMPARE
//------------------------------------------------------------------------------
// GLOBALS
static int8 char_rcved, data_valid, next_in;
static int8 buffer_overflow, stream_complete;
static int8 sermssg[BUFFER_SIZE];
/////////////////////////////////////////////////////////////////////
static int8 stringa[10]= {STX,0,0,0,1,1,SEMICOLON,AD,ETX};
// a string always ends with a NULL, so 9 char + NULL = [10]
////////////////////////////////////////////////////////////////////////
set_tris_b(0x00);
set_tris_d(0b11111111);
set_tris_a(0b00000000);
//------------------------------------------------------------------------------
#INT_RDA
void isr_serial_rcv()
{
char_rcved = getc(); // Get the incoming char
if ( char_rcved == STX )
{ next_in = 0; // Init the index
data_valid = TRUE; // Enable buffering
buffer_overflow = FALSE;
}
if ( data_valid )
{ sermssg[next_in] = char_rcved;
next_in++;
if ( next_in > BUFFER_SIZE ) // String longer than expected
{ data_valid = FALSE; // Stop buffering
buffer_overflow = TRUE;
}
if ( char_rcved == ETX )
{ data_valid = FALSE; // Stop buffering
stream_complete = TRUE;
}
}
}
void main()
{
delay_ms(400);
//set_tris_b(0x00);
//set_tris_d(0b11111111);
//set_tris_a(0b00000000);
stream_complete = FALSE;
enable_interrupts(GLOBAL);
while(1)
{
enable_interrupts( INT_RDA );
do{ // While stream_complete
do{
output_high(LED6);
delay_ms(200);
output_low(LED6);
delay_ms(200);
}while(input(PUSH_BUTTON));
(!input(PUSH_BUTTON));
output_b(0x00);
output_low(RXLED);
delay_ms(2000);
printf("\x2");
printf("0001wdloa;1;");
printf("\xFF");
printf("\x3");
//RX STX,0,0,0,1,1,SEMICOLON,AD,ETX RXLED ON
output_high(LED1);
delay_ms(2000);
////////////////////////////////// INTERRUPT
}while ( !stream_complete );
do{ // While stream_complete
do{
output_high(LED5);
delay_ms(200);
output_low(LED5);
delay_ms(200);
}while(input(PUSH_BUTTON));
(!input(PUSH_BUTTON));
output_b(0x00);
output_low(RXLED);
delay_ms(2000);
printf("\x2");
printf("0001wdloa;2;");
printf("\x80");
printf("\x3");
//RX STX,0,0,0,1,1,SEMICOLON,AD,ETX RXLED ON
output_high(LED2);
delay_ms(2000);
//////////////////////////////////INTERRUPT
}while ( !stream_complete );
if ( stream_complete )
{
stream_complete = FALSE; // IMPORTANT: If not the program re-enter
if ( !buffer_overflow )
{
disable_interrupts( INT_RDA );
#IFDEF BUFFER_COMPARE //////////////////////////////////////////////////////////
if (strcmp(stringa,sermssg))
{
output_high(RXLED);
}
#ENDIF //////////////////////////////////////////////////////////////////////////
} // if ( !buffer_overflow )
if ( buffer_overflow )
{// something wrong related to incoming string
output_b(0xff);
delay_ms(100); // Just to see a change in output_b
buffer_overflow = FALSE; // clear the fault !!!!
}
} // if ( stream_complete )
} // while(1)
} // void main() |
|