Hallo,
möchte nur mal wieder eine kleine Rückmeldung geben, da der Code jetzt geändert wurde und funktioniert. Genaueres werde ich zu einem späteren Zeitpunkt bekannt geben.
Evtl. habe ich den Grund für die unregelmäßigen Aufrufe der OC0A-ISR gefunden, bin mir aber nicht sicher, da ich dies wiedermal nicht verstehe. Leider ist dieser Teil nicht übersetzt worden und gilt für den ATmega8, was aber nicht das Problem ist ( Siehe dort Systemtakt und Takteinstellungen -> Systemtakt-Vorteiler ) :
https://www-user.tu-chemnitz.de/~heh.../ATmegaX8.chm/
" The ripple counter that implements the prescaler runs at the frequency of the undivided clock, which may be faster than the CPU's clock frequency. Hence, it is not possible to determine the state of the prescaler - even if it were readable, and the exact time it takes to switch from one clock division to the other cannot be exactly predicted. From the time the CLKPS values are written, it takes between T1 + T2 and T1 + 2 * T2 before the new clock frequency is active. In this interval, 2 active clock edges are produced. Here, T1 is the previous clock period, and T2 is the period corresponding to the new prescaler setting. "
" Der Welligkeitszähler, der den Vorteiler implementiert, läuft mit der Frequenz des ungeteilten Takts, die möglicherweise schneller als die Taktfrequenz der CPU ist.
Daher ist es nicht möglich, den Zustand des Vorteilers zu bestimmen - selbst wenn er lesbar wäre, und die genaue Zeit, die zum Umschalten von einer Taktteilung zur
anderen benötigt wird, kann nicht genau vorhergesagt werden. Ab dem Zeitpunkt, an dem die CLKPS-Werte geschrieben werden, dauert es zwischen T1 + T2 und T1 + 2 * T2,
bis die neue Taktfrequenz aktiv ist. In diesem Intervall werden 2 aktive Taktflanken erzeugt. Hier ist T1 die vorherige Taktperiode und T2 die Periode, die der neuen
Prescaler-Einstellung entspricht. "
Ist jetzt aber nicht mehr wichtig, da die Periodendauern der einzelnen Elemente ( 0, 1, f, Sync ) auch nicht konstant sind.
Deshalb war es keine gute Idee immer den gleichen Abstand von Bit zu Bit zu wählen. Hier sieht man dass es bei Bit13 & 19 schon recht knapp wird mit der
Erkennung des richtigen Pegels.
https://www.edv-dompteur.de/forum/in...tachmentID=817
Deshalb habe ich eine neue Strategie ausgearbeitet und bei jeder steigenden Flanke eines Datenelementes einen INT0-IRQ ausgelöst, wo jedesmal der TCNT0 neu geladen wurde.
Beim Testen habe ich festgestellt, dass Taste B+C gleichzeitig gedrückt, den Code der Taste A wiedergibt. Dies sei nur am Rande erwähnt.
Bernd_Stein
Lesezeichen