Peter schrieb:
> Wie oben schon
> gefragt, ob man es nicht einfach direkt im Interrupt so übertragen kann
> oder ob da was schiefgehen kann?
Nö, was soll groß schiefgehen? Schlimmer als zu Beginn kann's nicht
werden.
Die ISR vom Aufruf über den Interruptvektor bis zum Übertragen von temp
nach OCR0A wird 20-30 Takte dauern, die ISR insgesamt geschätzte 40-50.
Die Aufrufrate der ISR mal benötigte Takte darf (@8MHz) 8.000.000
Takte/s nicht überschreiten, geteilt durch 50 für die ISR wären 160.000
Aufrufe/s. Da der Portpin toggelt, wird's die Hälfte, also OC0A 80kHz
max. Der Tiny85 ist dann bei 100% Auslastung, die Hauptschleife wird
nicht mehr abgearbeitet, weil nach dem vorigen Interrupt gleich der
nächste kommt.
Wenn die angenommenen 50 Takte unterschritten würden, also Prescaler 1
und OCR0A 30, dann kommt Verhau raus, weil die ISR stets "nachhinkt" und
einen neuen OCR0A-Wert nur mehr zufällig zum richtigen Zeitpunkt setzt.
Daraus ergibt sich:
1) Die ISR-Methode belastet mehr als die Hauptschleifen-Methode
2) Die ISR-Methode sollte bei einem Prescaler >= 64 mit Werten >= 0 für
TOP arbeiten. Bei TOP = 0 müsste man u.U. aufpassen, ob laufendes
Schreiben von 0 auf OCR0A in der ISR zu einem Problem führt.
3) Bei der Hauptschleifen-Methode kommt's nur auf die Latenz der paar
Zeilen Code an, optimal übersetzt würde das zur Opcode-Sequenz: SBI, IN,
ANDI, BRNE & OUT. Ergibt unter Annahme des ungünstigsten Zeitpunktes in
dem Timer0 das OCF0A setzt, ein TOP von 9 bei Prescaler 1 = 400kHz.