volatile uint16_t ovf = 0;
volatile uint16_t ovf3 = 0;
ISR(TIMER3_OVF_vect)
{
//ovf3++;
ovf++;
//digitalWrite(13, !digitalRead(13));
}
void startTimer1 ()
{
cli();
// Timer 1
TCCR1A = 0;
TCCR1B = 0;
TCNT1 = 0; // reset counter
TIFR1 |= bit (TOV1); // clear overflow flag
//TIFR1 = 0;
//OCR1A = 65535;
//OCR1B = 0;
// start Timer 3
//TCCR3B = bit (CS10) | bit (CS12); // prescaler of 1024
//TCCR1B = bit (WGM12) | bit (CS10); // CTC, no prescaler
//TCCR1B = bit (CS10); // no prescaler
// Timer3
TCCR3A = 0;
TCCR3B = 0;
TCNT3 = 0; // reset counter
TIFR3 |= bit (TOV3); // clear overflow flag
//TIFR1 = 0;
//OCR3A = 15625;
//OCR1B = 0;
// start Timer 1
//TCCR3B = bit (CS30) | bit (CS32); // prescaler of 1024
//TCCR3B = bit (WGM12) | bit (CS10); // CTC, no prescaler
//TCCR3B = bit (CS30); // no prescaler
// TCCR3B = bit (CS30) | bit (CS32); // prescaler of 1024
TIMSK3 |= bit(TOIE3); // | bit(OCIE3);
TCCR3B = bit (CS10) ; // no prescaler
TCCR1B = bit (CS10) ; // no prescaler
sei();
}
uint32_t getTimer1Reading ()
{
uint32_t elapsed = TCNT1;
if (TIFR1 & bit (TOV1))
elapsed += 65536;
return elapsed;
}
void setup ()
{
Serial.begin (1000000);
Serial.print (F("Frequency: "));
Serial.print (F_CPU);
Serial.println (F("Hz"));
Serial.println ("Cycles, ns");
}
void loop ()
{
ovf = 0;
uint32_t us = micros();
//cli();
startTimer1 ();
//delay (7560);
//delay(10);
//delayMicroseconds(1);
// int i = 10000;
// while (i--)
// {
// _NOP();
// }
// 16 x NOP 102 cycles
// 100 x NOP 606 cycles
// 160 x NOP 966 cycles
// 1000 x NOP 6006 cycles
// 1600 x NOP 9606 cycles
// +6 per loop - 6, above some number of loops
// while (1)
// {
// _NOP();
// if (!(--i))
// break;
// }
// -5 per loop and -2 cycle correction for real ATmega2560!
volatile uint32_t i = 1000000;
while (1)
{
//_NOP();
/*
if (TIFR1 & bit (TOV1))
{
TIFR1 |= bit (TOV1); // clear overflow flag
//TIFR1 = 0;
ovf++;
}
*/
if (!(--i))
break;
}
volatile uint16_t cy = TCNT1;
//sei();
us = micros() - us;
volatile uint32_t cy_total = (int32_t)ovf << 16;
cy_total += cy;
// correction on overflow
//if (cy == 65535 && ovf)
//cy_total -= 1;
uint32_t ns10 = cy_total * 625;
Serial.print (ovf);
Serial.write (' ');
Serial.print (cy);
Serial.write (' ');
Serial.print (ns10 / 10);
Serial.write ('.');
Serial.print (ns10 % 10);
Serial.write (' ');
Serial.print (us);
Serial.println ();
Serial.flush ();
delay(1000);
}