View previous topic :: View next topic |
Author |
Message |
Andrew83
Joined: 16 Sep 2008 Posts: 51
|
Question about interrupt flag |
Posted: Sun Jan 11, 2009 4:08 am |
|
|
Hello 2 all !
I've been researching for a few days, the following problem :
Is there a way to monitor the interrupt flag in ccs c ? i.e. let's say that i have the need for a interrupt at a specified value like 842 uS (for example) but i don't want to do nothing in that interrupt, just to monitor the interrupt flag.
So, when the interrupt flag is set, i increase a counter variable.
If the counter variable reaches a value of "2" then i know that 1,84 ms have passed from the first initialization of the timer.
Is this possible ?
Thank you very much !!
P.S.: I'm using a pic 18f452 and ccs compiler version 4.057. |
|
|
FvM
Joined: 27 Aug 2008 Posts: 2337 Location: Germany
|
|
Posted: Sun Jan 11, 2009 6:01 am |
|
|
Increase a counter is more than doing nothing, I think. The most obvious solution would be to do just this an interrupt service routine. Alternatively you can use no ISR, monitor the interrupt flag (e.g. in your main loop), count the event and reset the flag manually. But why? |
|
|
Andrew83
Joined: 16 Sep 2008 Posts: 51
|
|
Posted: Sun Jan 11, 2009 6:14 am |
|
|
Hello FvM !
So...i am trying to build a IR transmitter using a pic.
Taking as an example the RC5 code :
-a logic "1" bit is represented by a 842 uS high and a 842 uS low.
-a logic "0" bit is represented by a 842 uS low and a 842 uS high.
Let's say i wanted to represent the following command : 01110.
I don't want the pic to stop whatever he was doing to service this process(of converting the commnad into a train of pulses).
I was interested to know if i could get de 842uS period without using #INT_TIMER0 and by just counting the number of times the flag of the timer sets, and how can i do this (if it is possible).
Thank's !! |
|
|
Andrew83
Joined: 16 Sep 2008 Posts: 51
|
|
Posted: Sun Jan 11, 2009 6:22 am |
|
|
Currently, my serial transmitter does the following:
1. Receives a character form serial port.
2.Translates this character into binary form, and saves the result into a globaly declared string.
3.When the conversion is complete, i enable de timer0 interrupt, go through the string and modelate the waveform (e.g. translate the series of zeros and ones into IR pulses).
I think that this course of action makes sense.
However, i'm searching for a more direct way of translating the binary string into IR pulses. |
|
|
FvM
Joined: 27 Aug 2008 Posts: 2337 Location: Germany
|
|
Posted: Sun Jan 11, 2009 7:17 am |
|
|
As you mentioned RC5: How do you generate the around 36 kHz modulation? Normally, RC5 transmission is using a fixed number of carrier cycles instead of an additional timer. You should be able to find many PIC RC5 transmission examples.
Apart from this, you simply didn't tell why you want to avoid a timer interrupt. It's also unclear, in which code you want to poll the timer IR flag and count the events. Obviously, this code has to be executed periodically and faster than a timer period. But then it's possible, of course. |
|
|
Andrew83
Joined: 16 Sep 2008 Posts: 51
|
|
Posted: Sun Jan 11, 2009 7:32 am |
|
|
Quote: | How do you generate the around 36 kHz modulation? |
The answer is PWM module. To modulate a 842uS High @ 36 KHz i'm using the pwm module. I'm mantaining the pwm module ON, for the duration of the timer0 period ( i.e. when timer0 overflows, it disables also the PWM module).
Quote: | you simply didn't tell why you want to avoid a timer interrupt. |
The answer is, because i don't want to use the string array to save the binary form of the command. I want to be able to modulate the waveform as i convert the character form the serial port .
Let me give you an example code:
Code: |
#include <18F452.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=10MHz)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)
#include <string.h>
void main()
{
char c,d,i,buffer[9];
while(1)
{
c=getc();
for(i = 0; i < 8; i++)
{
if(c & 0x80)
{
d='1';
}
else
{
d='0';
}
c <<= 1;
buffer[i]=d;
}
buffer[8]=0;
printf("%s \n\r",buffer);
}
}
|
I want to be able to do the conversion in the "if(c & 0x80)" statement.
For it to work, i think it is crucial that i know the state of the timer0 interrupt flag.
Quote: | You should be able to find many PIC RC5 transmission examples. |
99% of the examples that are out there, are about RC5 receiver (i.e. receiving and decoding signals from a remote control).
Thank you very much for your input, FvM ! |
|
|
FvM
Joined: 27 Aug 2008 Posts: 2337 Location: Germany
|
|
Posted: Sun Jan 11, 2009 8:57 am |
|
|
The suggestion was to count the timer events, not to do the output itself in the ISR. It would be still possible with your code. But as you intend to do nothing but poll the timer flag, you can do with no problems.
Code: | #bit TMR1IF = 0xF9E.0
while (!TMR1IF);
TMR1IF=0; |
|
|
|
Andrew83
Joined: 16 Sep 2008 Posts: 51
|
|
Posted: Sun Jan 11, 2009 9:03 am |
|
|
Thank you very much FvM ! I appreciate your patience and interest! |
|
|
muhibraza1
Joined: 26 Jul 2013 Posts: 23
|
|
Posted: Sun Sep 28, 2014 11:13 pm |
|
|
hello Andrew83 !
you can also do it with the CCS built in functions interrupt_active() and clear_interrupts()....
Like this :
Code: |
while(!interrupt_active(INT_TIMER1));
clear_interrupts(INT_TIMER1);
|
This way you dont even need to locate a variable on the flag address. |
|
|
|