Timer 2 OVF Probleme

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)