Zitat Zitat von Searcher Beitrag anzeigen

Ich finde die XYZ.jpg zum Verr... nicht. Ich will auch nicht mehr danach suchen!
Sorry, XYZ sollte als Platzhalter für die richtigen Namen der zwei Screenshots stehen :

https://www.edv-dompteur.de/forum/index.php?page=Thread&postID=4113#post4113


Zitat Zitat von Searcher Beitrag anzeigen
Im Unterprogramm _loeschen wird der 4,8MHz Systemtakt durch 8 geteilt und OCR0A mit 66 beschrieben.
Da der Timer mit prescaler 1:1 läuft, bedeutet das zu diesem Zeitpunkt ein Timer0 Comparematch nach 111µs wenn er bei 0 beginnt ( 4,8MHz/ 8 =600kHz. (1/600kHz)*(66+1) = 111µs )
Ich freue mich, dass du da durchblickst. Ja, soweit stimmt alles.
Nur ist der interne RC-Oszillator bei mir dermaßen ungenau, dass er statt mit den 600kHz mit ca. 410kHz läuft, wie man im Scrennshot zum 1ten Bit sehen kann ( 550µs ).



Zitat Zitat von Searcher Beitrag anzeigen
In der INT0 ISR wird mit CLKPS2 der 4,8MHz Systemtakt durch 16 geteilt (SYSCLK=300kHz), daß dann ein Comparematch in Timer0 nach der doppelten Zeit, also nach 222µs auslösen würde.
In der PCINT ISR wird Timer0 im CTC gestartet aber OCR0A nicht neu gesetzt; Inhalt immer noch 66. Der erste Comparematch findet demnach nach 222µs statt, nicht nach 550µs!?
Jaaa... nicht ganz, aber auch hier wieder den ungenauen RC-Oszillator beachten. Die 300kHz werden bereits in der INT0-ISR eingestellt und gelten somit für die darauf folgende PCI0-IRQ und schließlich immer für die OC0A-IRQ.
Hier kommt der Trick, denn dass 1te Bit wird wirklich noch mit OCR0A=66 bei 300kHz in der OC0A-ISR erfasst, aber für die restlichen 23 Bits wird OCR0A=192 am Ende der OC0A-ISR gesetzt, so dass diese dann alle 1100µs erfasst werden ( siehe anderen Screenshot ).

Nur eben nicht immer genau im gleichen Abstand, obwohl immer Haargenau die gleichen Codeabläufe stattfinden, was mich ja verwundert.
Diese Werte für OCR0A wurden experimentell ermittelt, so dass es mit den 550µs und 1100µs passte.


Bernd_Stein