| ??? 10/09/09 11:20 Read: times |
#169567 - Timer Capture 2 ISR Execution. |
hi all,
I am working with P89V664 micro controller on sdcc. My aim is to use the Timer 2 to capture the H to L pulses at T2EX pin and update a variable of 16 bits. The Source of H to L transitions is an IR sensor which works as given in the link: http://www.sbprojects.com/knowledge/ir/sharp.htm Now, I am able to capture the Negitive transitions, generate interrupts. I am failing to update the variable with 1 and 0; I have to implement this in the ISR of timer2 only(I was happy polling!). I am compiling this code for large model. I am posting you the ISR I have used with minimal modifications.
/* Capture the negitive edges and update the queue with the number
* received. */
void zk_timer2_capture_isr() __interrupt 7
{
static long int ovf; /* Timer overflow counter */
static uint16_t word;
static uint8_t bits_recvd; /* count the number of bits received. */
idata char word_buf[17] = "----------------";/* a buffer to print on LCD*/
uint16_t timer_val; /* hold the timer capture value */
uint32_t lag_edge;
static uint32_t lead_edge; /* the previous negitive edge needs
* to be preserved. */
int32_t diff;
if (TF2 == 1) { /* check overflow */
ovf++;
TF2 = 0;
P3_4 = !P3_4; //for debugging, buzzer beeps
}
if (EXF2 == 1) {
/* Capture Interrupt is not disabled! So keep ISR
* small! */
timer_val = RCAP2H;
timer_val <<= 8;
timer_val |= RCAP2L;
EXF2 = 0; /* clear the flags */
P1_4 = !P1_4; //for debugging, led toggles
lag_edge = timer_val;
if (lead_edge == 0) { /* for the first pulse only */
lead_edge = lag_edge;
ovf = 0;
}
else {
diff = lag_edge - lead_edge + (ovf * 0xFFFF);
/* Consider the timer overflow */
ovf = 0;
if (diff <= CLK_6_1MS) /* received 0 */ {
word |= 0x0000;
word_buf[bits_recvd] = '0';
/* check each bit received, for
* debugging only. */
bits_recvd++;
}
else {
if (diff <= CLK_6_2MS) { /* received 1 */
word |= 0x8000;
word_buf[bits_recvd] = '1';
}
else
word_buf[bits_recvd] = 'X'; /* FIXME:This should
* not happen. */
bits_recvd++;
}
word >>= 1;
if (bits_recvd == (MAX_NUM_BITS - 1)) {
/* 15 -bits received. Update the buffer. */
lead_edge = 0;
bits_recvd = 0;
word = word >> 1;
/* update the buffer here. */
lcd_printl(0, word_buf);
sprintf(word_buf, "received %d bits.", bits_recvd);
lcd_printl(1, word_buf);
word = 0;
}
else
lead_edge = lag_edge;
}
}
}
The initiation of Timer2 is as done here: http://www.8052.com/forum/read/169319 The Observations made are: 1. LED toggles and the buzzer beep, indicating that the ISR is entered. 2. The number of bits received is always (bits_recvd)1. 3. The word received is always 0. Any suggestions would be greatly appreciated. Regards, Sarma. |
| Topic | Author | Date |
| Timer Capture 2 ISR Execution. | 01/01/70 00:00 | |
| Why the Large model? | 01/01/70 00:00 | |
| Large Model on SDCC | 01/01/70 00:00 | |
| WHICH variable | 01/01/70 00:00 | |
| Variable | 01/01/70 00:00 | |
| That is a *really* bad name for a variable! | 01/01/70 00:00 | |
word |= 0x0000; | 01/01/70 00:00 |



