Benutzung von millis() immer möglich ?

Grundsätzliche Frage:
millis() benutzt meines Wissens Timer0.
Wie schaut es dann bei der Nutzung der diversen Lib's aus, wenn dort Timer0 benutzt wird kann millis() nicht mehr korrekt funktionieren.
Oder ist davon auszugehen, das timer0 für das System reserviert ist und quasi tabu ist ?

Auf Timer0 kann auch PWM laufen und millis() geht immer noch. Den Timer Überlauf oder einen Capture Interrupt kann man immer auswerten. Egal was der Timer sonst noch macht.

Lediglich wenn man den Timer komplett überschreibt wird millis() und delay() deaktiviert. Die aller meisten Libs werden darauf verzichten und statt dessen Timer1 oder Timer2 verwenden. Wenn es anders wäre, sollte es dabeistehen.

Hallo,

ich arbeite gerade bei einem Projekt mit einem
Wavetable Sound Synthesizer. Zu meiner Überraschung lief millis() überhaupt nicht mehr. Es hat mich einige Zeit gekostet, bis ich darauf kam.

So Fit mit den Avr Registern bin ich nicht.
Dazu muss man das Datasheet des Atmega anschauen der hier benutzt wird.
Ich kenne die Registernamen schon in etwa, hier wird Timer0 wohl nicht angefasst ?

void initializeTimer() {
 // Set up PWM  with Clock/256 (i.e.  31.25kHz on Arduino 16MHz;
 // and  phase accurate
 
#if defined(__AVR_ATmega8__)
  // ATmega8 has different registers
  TCCR2 = _BV(WGM20) | _BV(COM21) | _BV(CS20);
  TIMSK = _BV(TOIE2);
#elif defined(__AVR_ATmega1280__)
  TCCR3A = _BV(COM3C1) | _BV(WGM30);
  TCCR3B = _BV(CS30);
  TIMSK3 = _BV(TOIE3);
#else
  TCCR2A = _BV(COM2B1) | _BV(WGM20);
  TCCR2B = _BV(CS20);
  TIMSK2 = _BV(TOIE2);
#endif
  pinMode(PWM_PIN,OUTPUT);
}

Nein.

Die erste Ziffer ist die Nummer des Timers. Die zweite Ziffer ist die Nummer des Registers. z.B. CS30 ist "Clock Select, Timer 3, Register 0", da es 3 CS Bits gibt.
Wenn es nur eine Ziffer da ist, ist das auch die Timer Nummer. TOIE2 ist "Timer 2, Overflow Interrupt Enable"

Oder COM3C1 ist "Compare Output Mode, Timer 3, Kanal C, Bit 1". Es gibt 2 COM3C Bits für 4 Modi ingesamt.

Durch die defines siehst du, dass auf dem UNO und Mega Timer2 verwendet wird

Nein, millis() kann nicht immer verwendet werden. Jede Bibliothek kann und wird das abschalten wenn es ihr in die Quere kommt. Ein Beispiel wäre etwa meine neue dcf77 Bibliothek: DCF77 Library | Blinkenlight. Allerdings ist es üblich darauf hinzuweisen. Wenn ein Autor das trotzdem nicht tut hast Du eben Pech gehabt.

Und es ist nicht richtig, daß dies nur passiert wenn der Timer überschrieben wird. Meine Library stoppt ihn einfach nur weil es Jitter ins System bringt den ich nicht brauchen kann. Ein anderer (untypischer) Grund wäre um bei Speicherknappheit den Stack zu begrenzen. Es kann eben viele Gründe geben warum eine Library die Timer stoppen will.

[quote author=Udo Klein link=topic=223061.msg1617289#msg1617289 date=1393875559]
Und es ist nicht richtig, daß dies nur passiert wenn der Timer überschrieben wird. [/quote]
Das hatte ich auch damit gemeint. Das "komplett" hätte ich vielleicht weglassen sollen.

Wenn man den Timer stoppen will, muss man schließlich auch ein Register (bzw. ein paar Bits) überschreiben, das vom Arduino Code im Hintergrund gesetzt wird.

In einer Interruptroutine funktioniert millis() auch nicht. Es wird nicht weitergezählt.
Grüße Uwe

Auch bleiben die Timer stehen, wenn man den kleinen in den tiefsten Tiefschlaf schickt.