Forum: Mikrocontroller und Digitale Elektronik Timer0 Compare A Interrupt


von Steffen (Gast)


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

von Jörg Wunsch (Gast)


Lesenswert?

> Ich brauche einen Interrupt, der mit 250 kHz aufgerufen wird.
...
> Takt: 8Mhz

Puh!  Mit 32 Takten pro ISR hast Du damit eine Prozessorauslastung von
100 %.

von Steffen (Gast)


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

von Steffen (Gast)


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

von Jörg Wunsch (Gast)


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.

von Steffen (Gast)


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

von Jörg Wunsch (Gast)


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.

von Steffen (Gast)


Lesenswert?

Ah - ok. Gut danke.

Ich werde das morgen probieren und mich dann wieder melden.

Danke für deine schnelle Hilfe !!

Grüße
Steffen

von Jörg Wunsch (Gast)


Lesenswert?

Ähem, sag mal, SPI wäre nicht eventuell angebrachter für Dich?

von Thomas Oly (Gast)


Lesenswert?

Hallo,

@Steffen: Darf man fragen was du baust?

von Steffen (Gast)


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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.