Hello together,
I tested the proposal from ballistics and made some changes. Now it seems to work. Nice code
Andreas
//
// http://arduino.cc/forum/index.php/topic,97451.0.html
//
#include <io.h>
#include <interrupt.h>
volatile uint16_t T1Ovs1, T1Ovs2; //OVERFLOW COUNTERS
volatile uint16_t Capt1, Capt2, Capt3; //VARIABLES TO HOLD TIMESTAMPS
volatile uint8_t Flag; //CAPTURE FLAG
float deltatime;
#define icpPin 8 // PB0 ICP D8 Interrupt input
/*--------------------------------------------------------------------------------------------------
INTIALIZING TIMER
---------------------------------------------------------------------------------------------------*/
void InitTimer1(void)
{
TCNT1=0; //SETTING INTIAL TIMER VALUE
TCCR1B|=(1<<ICES1); //SETTING FIRST CAPTURE ON RISING EDGE ,(TCCR1B = TCCR1B | (1<<ICES1)
TIMSK1|=(1<<ICIE1)|(1<<TOIE1); //ENABLING INPUT CAPTURE AND OVERFLOW INTERRUPTS
}
/*--------------------------------------------------------------------------------------------------
STARTING TIMER
---------------------------------------------------------------------------------------------------*/
void StartTimer1(void)
{
// TCCR1B|=(1<<CS11)|(1<<CS10); //STARTING TIMER WITH PRESCALER 64
TCCR1B|=(1<<CS12); //STARTING TIMER WITH PRESCALER 256
// TCCR1B|=(1<<CS12)|(1<<CS10); //STARTING TIMER WITH PRESCALER 1024
sei(); //ENABLING GLOBAL INTERRUPTS
}
/*--------------------------------------------------------------------------------------------------
CAPTURE ISR
---------------------------------------------------------------------------------------------------*/
ISR(TIMER1_CAPT_vect)
{
// TCNT1 = 0;
if (Flag==0)
{
Capt1=ICR1; //SAVING CAPTURED TIMESTAMP
TCCR1B&=~(1<<ICES1); //CHANGE CAPTURE ON FALLING EDGE
T1Ovs2=0; //RESETING OVERFLOWS
//digitalWrite(13, HIGH); // set the LED on
//delay(100); // wait for a second
}
if (Flag==1)
{
Capt2=ICR1; //SAVING CAPTURED TIMESTAMP
TCCR1B|=(1<<ICES1); //CHANGING CAPTURE ON RISING EDGE
T1Ovs1=T1Ovs2; //SAVING FIRST OVERFLOW COUNTER
//digitalWrite(13, LOW); // set the LED off
//delay(100); // wait for a second
}
if (Flag==2)
{
Capt3=ICR1; //SAVING CAPTURED TIMESTAMP
TIMSK1&=~((1<<ICIE1)|~(1<<TOIE1)); //STOP INPUT CAPTURE AND OVERFLOW INTERRUPTS
//digitalWrite(13, HIGH); // set the LED on
//delay(100); // wait for a second
}
Flag++; //INCREMENTING FLAG
}
/*--------------------------------------------------------------------------------------------------
OVERFLOW ISR
---------------------------------------------------------------------------------------------------*/
ISR(TIMER1_OVF_vect)
{
T1Ovs2++;//INCREMENTING OVERFLOW COUNTER
}
/*--------------------------------------------------------------------------------------------------
MAIN FUNCTION
---------------------------------------------------------------------------------------------------*/
int main(void)
{
volatile uint8_t FINALTIME; //VARIABLE TO HOLD THE FINAL TIME
pinMode(icpPin,INPUT);
digitalWrite(icpPin,HIGH); //pull up
// pinMode(13, OUTPUT);
InitTimer1(); //CALLING FUNCTION INITTIMER1 TO INITIALIZE TIMER 1
StartTimer1(); //CALLING FUNCTION STARTTIMER1 TO START TIMER 1
while(1)
{
//calculate duty cycle if all timestamps captured
if (Flag==3)
{
Serial.begin(115200);
Serial.print("\r");
Serial.print(" <Capture1>:");
Serial.print(Capt1);
Serial.print(" <Capture2>:");
Serial.print(Capt2);
Serial.print(" <Capture3>:");
Serial.print(Capt3);
Serial.print(" <OVL1>:");
Serial.print(T1Ovs1);
Serial.print(" <OVL2>:");
Serial.print(T1Ovs2);
Serial.print("\n");
Serial.print("<FINAL TIME>:");
// deltatime = (Capt3-Capt1)*0.004; // Prescaler 64
deltatime = (Capt3-Capt1)*0.016; // Prescaler 256
Serial.print((float)deltatime);
Serial.print(" Millisecond");
Serial.print("\n");
Flag=0; //CLEARING FLAG
T1Ovs1=0; //CLEARING OVERFLOW COUNTERS
T1Ovs2=0;
TIFR1=(1<<ICF1)|(1<<TOV1); //CLEARING INTERRUPT FLAGS TO AVOID ANY PENDING INTERRUPTS
TIMSK1|=(1<<ICIE1)|(1<<TOIE1); //ENABLING INPUT CAPTURE AND OVERFLOW INTERRUPTS
TCNT1 = 0;
}
}
}
Moderator edit:
</mark> <mark>[code]</mark> <mark>
</mark> <mark>[/code]</mark> <mark>
tags added.