|
|
View previous topic :: View next topic |
Author |
Message |
farah0103
Joined: 20 Apr 2010 Posts: 6
|
Entering XBee AT Command using Motion Sensor |
Posted: Thu Apr 26, 2012 8:37 am |
|
|
Hi..
I really need help with this source code. What i'm trying to do here is that whenever an external interrupt from sensor occurs, xbee will display its serial low value by using ATSL command. What I'm expecting from the display is:
PIC Alive
OK
(ATNI value)
OK
What I get from this is:
PIC Alive
OK
Here is my source code. Hope anyone can help me with this. Many thanks.
Code: |
#include "18f2525.h"
#fuses NOLVP,NOWDT,PUT,BROWNOUT,INTRC_IO
#use delay(clock=2000000)
#use rs232(baud=9600, xmit=pin_C6, rcv=pin_C7, ERRORS, PARITY=N, BITS=8, STOP=1)
#define BUFFER_SIZE 32
BYTE buffer[BUFFER_SIZE];
BYTE next_in = 0;
BYTE next_out = 0;
#int_rda
void serial_isr() {
int t;
buffer[next_in]=getc();
t=next_in;
next_in=(next_in+1) % BUFFER_SIZE;
if(next_in==next_out)
next_in=t;
}
#define bkbhit (next_in!=next_out)
BYTE bgetc() {
BYTE c;
while(!bkbhit) ;
c=buffer[next_out];
next_out=(next_out+1) % BUFFER_SIZE;
return(c);
}
#int_ext
void isr_ext(void)
{
enable_interrupts(int_rda);
delay_ms(1000);
printf("+++");
delay_ms(1000);
printf("ATSL\r");
delay_ms(1000);
printf("ATCN\r");
delay_ms(1000);
while(bkbhit)
putc( bgetc() );
output_high(pin_b3);
delay_ms(500);
output_low(pin_b3);
}
void main()
{
printf("PIC Alive\r");
SET_TRIS_B(0b00000001);
ext_int_edge(L_to_H); ////when interrupt goes low to high (rising edge)
enable_interrupts(INT_EXT); //enable INT0
enable_interrupts(global); //enable global interrupt
delay_ms(2000);
printf("PIC Alive\r");
while(true);
}
|
|
|
|
ezflyr
Joined: 25 Oct 2010 Posts: 1019 Location: Tewksbury, MA
|
|
Posted: Thu Apr 26, 2012 9:03 am |
|
|
Hi,
Your strategy of using the UART interrupt and the external interrupt is probably not going to work. Post a link to the sensor you are using, so that we can help you determine the best way to use it!
Thanks,
John |
|
|
farah0103
Joined: 20 Apr 2010 Posts: 6
|
|
|
ezflyr
Joined: 25 Oct 2010 Posts: 1019 Location: Tewksbury, MA
|
|
Posted: Fri Apr 27, 2012 8:02 am |
|
|
Hi,
OK, I was under the impression that your sensor had a serial interface from your first post, but that is clearly not the case. Can you provide a description of what exactly you want your code to do? I appears that you want to sent some 'AT' commands to something (what??), and then receive a serial reply which is then displayed? What is the serial device?
A couple of comments: You generally want to keep your interrupt routines as short as possible, and generally NEVER want to put things like delays and printf's inside your ISR's as they just take too long and defeat the whole purpose of using interrupts. The preferred technique is to set flags inside the interrupt, and then process things outside the ISR.
I think the external interrupt is really not needed for this project, although you could use it if you don't mind the added complexity. Rather, I would just use a tight loop in main to 'poll' your sensor, and then do what you want once it is tripped.
John |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19496
|
|
Posted: Fri Apr 27, 2012 9:47 am |
|
|
I'll give you a _guide_ to what you need to do. There are some problems though. You have the clock set to 20MHz, but the internal RC oscillator which you select, doesn't allow this speed. I've set it to a speed it supports. Beware also though that this oscillator is 'borderline', for running RS232. OK at room temperature, but likely to go wrong if the temperature moves by much - perhaps you should be thinking about using a better oscillator.....
Code: |
#include "18f2525.h"
#fuses NOLVP,NOWDT,PUT,BROWNOUT,INTRC_IO
#use delay(clock=1600000)
#use rs232(baud=9600, xmit=pin_C6, rcv=pin_C7, ERRORS, PARITY=N, BITS=8, STOP=1)
int1 old_input;
#define BUFFER_SIZE 32
BYTE buffer[BUFFER_SIZE];
BYTE next_in = 0;
BYTE next_out = 0;
#int_rda
void serial_isr() {
int t;
buffer[next_in]=getc();
t=next_in++;
if (next_in==BUFFER_SIZE) next_in=0; //faster and handles non binary
//buffer sizes
if(next_in==next_out)
next_in=t;
}
#define bkbhit (next_in!=next_out)
BYTE bgetc() {
BYTE c;
while(!bkbhit) ;
c=buffer[next_out++];
if (next_out== BUFFER_SIZE) next_out=0;
return(c);
}
void main(void) {
printf("PIC Alive\r");
old_input=input(PIN_B0);
enable_interrupts(INT_RDA);
enable_interrupts(global); //enable global interrupt
do {
//Now check for the input signal
if (input(PIN_B0)) {
if (old_input==FALSE) {
//Here input has gone high
old_input=TRUE;
delay_ms(1000);
printf("+++");
delay_ms(1000);
printf("ATSL\r");
delay_ms(1000);
printf("ATCN\r");
delay_ms(1000);
while(bkbhit)
putc( bgetc() );
output_high(pin_b3);
delay_ms(500);
output_low(pin_b3);
}
}
else
old_input=FALSE;
}
}
|
Key point is that delays etc., are out in the 'main' code. I've not even bothered with interrupts to detect the incoming edge, just checking for the line being high, when it was low. You could use the interrupt and set a flag equally well.
Key thing to understand, is that with the output code inside the interrupt handler, INT_RDA, is not serviced.
Best Wishes |
|
|
farah0103
Joined: 20 Apr 2010 Posts: 6
|
|
Posted: Mon May 14, 2012 8:56 pm |
|
|
Thanks very much...
It works... |
|
|
|
|
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
|