Gast
#371564
Manchmal reicht die Auflösung der Timer nicht aus. Kein Problem, wozu gibt es denn die Overflowinterrupts. Damit kann man bequem in Software weiterzählen. Es ist auch nicht weiter kompliziert, nur beim Auslesen muß man einiges beachten, damit man ein gültiges Ergebnis erziehlt. Die einfachste Möglichkeit zum korrekten Auslesen ist es, den Timer solange zu stoppen. Blöd nur, wenn dann gerade ein Zählimpuls reinkommt, den verliert man dann. Also ist es besser, den Timer weiterlaufen zu lassen. Für 32 Bit müssen insgesamt 4 Bytes ausgelesen werden, was beim AVR nicht atomar möglich ist. Deshalb disabled man während des Auslesens erstmal die Interrupts. Die nächste Hürde ist dann, wenn gerade dabei ein Overflow auftritt, ist zwar selten, aber es passiert. Mancher, der mal einen Frequenzzähler so aufgebaut hat, wird gemerkt haben, daß bei bestimmten Werten die Anzeige verrückt spielt und große Sprünge macht. Genau das ist dann so ein nicht berücksichtigter Overflow. Man hat also 3 Bytes aus dem Softwarezähler und das Timerbyte. Ist nun ein Overflow aufgetreten konnte ja der Interrupt den Softwarezähler nicht weiterschalten, da ja die Interrupts zum auslesen gesperrt wurden. Bevor nun die Interrupts wieder freigegeben werden, merkt man sich also das Overflowbit. Ist das Overflowbit gelöscht, dann sind alle 4 Bytes gültig und gut. Ist es aber gesetzt, muß man noch feststellen, ob es vor den Lesen des Timerbytes gesetzt wurde und das ist dann der Fall, wenn das Timerbyte 0x00, 0x01 usw. ist. Hätte man es vor dem Overflow gelesen, müßte es ja 0xFF, 0xFE usw. sein. Man testet also noch das höchstwertige Bit 7 und ist es gelöscht, dann hat man nach dem Overflow gelesen und muß noch 256 zum Returnwert addieren. Peter