byte pinState = LOW;
void setup()
{
// initialize Timer1
cli();
TCCR1A = 0x00; // Reset to default
TCCR1B = 0x00; // Reset to default
TCNT1 = 0; // Reset Timer Count to 0
TIFR1 = 0x00; // Timer1 INT Flag Reg: Clear Timer Overflow Flag
//TIMSK1 = (1 << TOIE1); // Timer/Counter1 Overflow Interrupt Enable
TCCR1B |= (1 << CS01); //No prescaler
OCR1A = 60000; // Match value to fire overflow;
//TIMSK1 = (1 << OCIE1A); // Timer/Counter1 Output CompareA Match Interrupt Enable
//
// mode, WGMn3, WGMn2,WGMn1,WGMn30
//15 1 1 1 1 Fast PWM OCRnA BOTTOM TOP
// Counting from 0 to OCRnA, then automatically set TOVn and reset counter
TCCR1B |= (1 << WGM13);
TCCR1B |= (1 << WGM12);
TCCR1B |= (1 << WGM11);
TCCR1B |= (1 << WGM10);
sei();
pinState = bitRead(PIND, PD2);
Serial.begin(115200);
Serial.println("Capturing edge without interrupt");
}
//ISR(TIMER1_OVF_vect) {
//do nothing
//}
void loop() {
delay(1000);
int d = 0;
TCNT1 = 0;
TCCR1B |= (1 << CS10); // run counter1
uint16_t t1 = TCNT1;
pinState = bitRead(PIND, PD2);
boolean overflow = false;
boolean pinToggle = false;
TCNT1 = 0;
uint16_t t2 = TCNT1;
uint32_t us = micros();
volatile int i = 10;
while (i--)
{
TIFR1 = 0x00;
TCNT1 = 0;
while (1)
{
if ((TIFR1 & bit(TOV1)) )
{
overflow = true;
break;
}
/*
else
if (pinState != bitRead(PIND, PD2))
{
pinToggle = true;
break;
}
*/
/*
Serial.print("TCNT1:");
Serial.println(TCNT1);
Serial.print("OCR1A: ");
Serial.println(OCR1A);
Serial.print("OCR1B: ");
Serial.println(OCR1B);
*/
}
}
uint16_t t3 = TCNT1;
TCCR1B &= ~(1 << CS10); // stop counter
us = micros() - us;
Serial.print("t1= ");
Serial.println(t1);
Serial.print("t2= ");
Serial.println(t2);
Serial.print("t3= ");
Serial.println(t3);
if (pinToggle)
Serial.println("Toggle");
if (overflow)
Serial.println("Overflow");
Serial.println(us);
if (pinState == HIGH)
Serial.println("HIGH");
else
Serial.println("LOW");
Serial.println("--");
}