Hallo,
This is what the code for scenario 2 looks like.
/* INIT Interrupts and Timer */
command result_t StdControl.init() {
sbi(EICRB, ISC51);
sbi(EICRB, ISC50); // Rising edge of INT1 generates an interrupt
cbi(DDRE,5); // Making INT pin input
sbi(EIMSK, 5); /* Enable INT1 */
sbi(EICRB, ISC41);
sbi(EICRB, ISC40); // Rising edge of INT0 generates an interrupt
cbi(DDRE,4); // Making INT pin input
sbi(EIMSK, 4); /* Enable INT0 */
sbi(ETIMSK, TOIE3); // Enable Timer3 overflow
return SUCCESS;
}
cbi(EIMSK, 5);
__nesc_enable_interrupt();
call Receive.startCount();
atomic {
outp(0, TCNT3L); // reset TIMER3
outp(0, TCNT3H); // reset TIMER3
sbi(TCCR3B, CS30);
sbi(TCCR3B, CS31); /* Timer3 on */
call Leds.greenToggle();
//call Timer.start(TIMER_ONE_SHOT, 500); /* Version 1: Timer should run for 500ms */
}
}
// {
// call Receive.stopCount();
// atomic{
// timebtw = __inw_atomic(TCNT3L);
// return SUCCESS;
// }
cbi(EIMSK, 4);
__nesc_enable_interrupt();
call Receive.stopCount();
sbi(EIMSK, 5);
cbi(TCCR3B, CS31); /* Timer3 off */
timebtw = __inw_atomic(TCNT3L); //Read the value of Timer3
outp(0x00, TCCR3B);
return SUCCESS;
}
TOSH_SIGNAL(SIG_OVERFLOW3) {
}
If you look at the code, there are two versions actually. The first one(commented) starts the Timers(Timer1) and Timer3 and then waits for Timer1 to fire and then reads the value of Timer3. The variable timebtw is in 95% of the runs 1 and then at certain runs it goes up to about 56 which is still low and wrong. I will expect that at all runs it should give me about the same value.
The other one starts a timer(Timer3) after an interrupt(INT1), and then after the next interrupt comes(INT0), stops the timer and then reads the value of Timer3. It behaves just the same like the scenario above, which is wrong.
Thanks again
From: Harri Siirtola <[EMAIL PROTECTED]>
To: "Lima GANSE Kenneth" <[EMAIL PROTECTED]>, [email protected]
Subject: Re: [Tinyos-help] Timer3 in TinyOS
Date: Thu, 17 Nov 2005 10:36:46 +0200
>
>What platform are you on? If you could attach your interrupt code,
>it would be easier to figure something out. How are you
>distinguishing between the two situations when you enter the int
>routine? Is it possible that you accidentally restart the timer when
>it should just be read? I'm assuming it's the same interrupt which
>causes both start and read.
>
>Regards,
>
> Harri
>
>At 10:30 PM 11/16/2005 +0000, Lima GANSE Kenneth wrote:
>>Hi TinyOS team,
>>
>>I have spent the greater part of a month trying to solve a problem
>>without much success. These are the scenarios i have:
>>
>>Scenario 1
>>
>>1. Start two timers (SingleTimer - Timer1) and also Timer3
>>(SIG_INTERRUPT).
>>2. After 500 ms when timer1 fires, read the value of TCNT3L, to
>>make sure that timer3 worked
>> correctly.
>>3. The results are perfect since TCNT3L reads a value of about
>>15300, which matches 500ms.
>>
>>Scenario 2
>>
>>1. Now instead of two timers, use a hardware interrupt
>>(SIG_INTERRUP4) and Timer3.
>>2. When the first interrupt is detected, start timer3.
>>3. 500 ms after the first interrupt was detected, send another
>>interrupt to the mote and then
>> read the value of TCNT3L immediately.
>>4. The result makes no sense, since TCNT3L has a value between 1
>>and 5, which is a lot
>> less than 500ms.
>>
>>Is this a tinyos scheduling problem, or there is something
>>diffeerent that has to be done with interrupts on tinyos?
>>
>>Thanks
>>Kenneth
>>_______________________________________________
>>Tinyos-help mailing list
>>[email protected]
>>https://mail.millennium.berkeley.edu/cgi-bin/mailman/listinfo/tinyos-help
>
_______________________________________________ Tinyos-help mailing list [email protected] https://mail.millennium.berkeley.edu/cgi-bin/mailman/listinfo/tinyos-help
