Serenifly:
Vergiss das mit dem Timer und schau dir das BlinkWithoutDelay Beispiel an
Dem stimme ich unumwunden zu.
Zu den anderen Fragen:
#include <util/atomic.h>
#define CriticalSection ATOMIC_BLOCK(ATOMIC_RESTORESTATE)
/*
* FCPU/1024=15.625 -> Schritte pro sekunde
* 15.625*300s=4.687.500 Schritte in 5 minuten
* 4.687.500/256= ca. 18.310 OVF in 5 minuten
*/
volatile uint16_t ovf_timer2=0;
void setup()
{
Serial.begin(9600);
CriticalSection
{
TCCR2A = 0;
TCCR2B = _BV(CS22)|_BV(CS21)|_BV(CS20);
TCNT2 = 0; // set counter value to 0
TIMSK2 = _BV(TOIE2); // enable timer overflow interrupt;
}
}
void loop()
{
bool fiveMinutes = false;
uint16_t merker;
CriticalSection
{
if(ovf_timer2 >= 18310U)
{
ovf_timer2 = 0;
fiveMinutes = true;
}
merker = ovf_timer2;
}
if(fiveMinutes)
{
Serial.print(millis());
Serial.println(" 5 Minuten um");
}
// Serial.println(merker);
}
ISR(TIMER2_OVF_vect)
{
ovf_timer2++;
}
Und, die Alternative im meinem Stil:
#include <CombieTimer.h>
Combie::Timer::Pulsator puls(5UL * 60UL * 1000UL);
void setup()
{
Serial.begin(9600);
puls.start(); // mit Pause beginnen
}
void loop()
{
if(puls)
{
// hier Messung starten
Serial.print(millis());
Serial.println(" 5 Minuten um");
}
}
CombieLib.zip (50.9 KB)