Timer0 Compare A Interrupt

Gast #98549
Lesenswert?

Hallo!

Ich hab ein kleines Problem mit dem Timer0 Compare A Interrupt.

Ich brauche einen Interrupt, der mit 250 kHz aufgerufen wird.

Prozessor: AT90S8515
Takt: 8Mhz

Clear after Compare match angeschaltet
Prescaler auf 8
OCR1AL auf 4 gesetzt
Und den Interrupt aktiviert.

Es funktioniert relativ gut. Problem ist folgendes:
zwischen einem und dem nächsten Timeraufruf liegen 3,87 us zwischen dem
nächsten und dem übernächsten dann 4.13 us. Also auf zwei Interrupts
gesehen stimmt die Frequenz dann auch. Aber eben zwischen den beiden
Aufrufen nicht.

Was mache ich falsch?

Danke.
Steffen
Gast #98551
Lesenswert?

Ja - das ist mir bewusst. Ich werde einen Mega8515 einsetzen und auf 16
MHz takten ...

Während er den Timer ausführt soll es nur einen counter erhöhen und
einen pin toggeln oder ihn nicht toggeln (also mit 150 kHz). Die daten,
wie lang er ihn toggeln soll, bekommt er aus einem externen sram.

Ich hoffe das geht ...

Aber wo liegt jetzt in obigem der Fehler? Die 125 khz (also alle zwei
perioden sind exakt) - nur die zwischen drin stimmen net. Und ich hab
in den Routinen nix drin stehen ... (also nur, dass ein Pin auf h und
wieder auf l gesetzt wird).

Grüße
Steffen
Gast #98552
Lesenswert?

Ich hab gerade getestet.
Das selbe Phämonen tritt auch auf, wenn ich die Frequenz des Timers zum
Beispiel auf 47 kHz herunterdrehe. Also denke ich eher, dass es ein
Fehler meinerseits ist.

Was hab ich da falsch eingestellt?

Grüße
Steffen
Gast #98553
Lesenswert?

Was heißt ,,dasselbe Phänomen'' in dem Falle?  ± 1 Prozessortakt in
der Interruptannahme?

Ansonsten ist das sicher ohne Sourcecode schwer zu sagen.

Ich würde das Ganze wahrscheinlich komplett anders lösen.  Die
Impulsgenerierung mit einem output compare von der Hardware auslösen
lassen, dabei vorbereitend für das nächste output compare event
festlegen, wie mit dem OC-Ausgang zu verfahren ist sowie den OCR-Wert
eintragen, bei dem das nächste Event passiert.  Damit löst das event
selbst sofort automatisch die entsprechende Hardware-Aktion aus (also
ggf. den Flankenwechsel) -- ohne jitter in der Interruptbearbeitung.
Die Interruptroutine hat dann massig (:-) Zeit zu reagieren, da sie
nur noch das nächste Event vorbereiten muß (OCR neu setzen und die
nächste Flanke berechnen), damit ist sie relativ unkritisch.
Gast #98554
Lesenswert?

Tja - das waren Frequenzunterschiede von 47,3 bis 47,7 Hz soweit ich das
richtig in Erinnerung habe.

Die Flanken müssen immer zur selben Zeit kommen, also alle 1 / 250000
Sekunden einmal. Das einzige was man regeln können muss (auf einene
Impuls genau) ist an und aus. Also zum Beispiel 10 pulse und dann 5
'pulsenlange' pausen...

wie soll man das vorbereiten? kann man mit dem OC Ausgang gleichzeitig
toggeln und einen Interrupt aufrufen ?!?

Grüße
Steffen
Gast #98555
Lesenswert?

Nein, Du solltest Dir mal die Funktion von output compare genauer
angucken.  Du änderst den OC-Ausgang nie mehr manuell, sondern läßt
das jeweils vom output compare event erledigen.  Das output compare
event ,,tickt'' hardwaremäßig exakt (sobald der Zähler den Wert des
OCR-Registers erreicht) und führt dann die programmierte Änderung
(oder eben nicht-Änderung) des OC-Ausgangs aus.  Außerdem löst es
einen Interrupt aus, und den nutzt Du, um den nächsten OCR-Wert zu
setzen sowie die nächste Hardwareaktion beim Eintreffen dieses
OC-events zu programmieren.
Gast #98559
Lesenswert?

Hallo zusammen.

Nein - SPI kann ich leider nicht verwenden.

Es halndelt sich um eine Ansteuerung eines Chips. Mehr kann ich leider
(aus betrieblichen Gründen) nicht sagen.

Ich werds jetzt mal so ausprobieren, wie Jörg vorgeschlagen hat.

Grüße
Steffen

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren