mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Timer0 Compare A Interrupt


Autor: Steffen (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jörg Wunsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 %.

Autor: Steffen (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Steffen (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jörg Wunsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Steffen (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jörg Wunsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Steffen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ah - ok. Gut danke.

Ich werde das morgen probieren und mich dann wieder melden.

Danke für deine schnelle Hilfe !!

Grüße
Steffen

Autor: Jörg Wunsch (Gast)
Datum:

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

Autor: Thomas Oly (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

@Steffen: Darf man fragen was du baust?

Autor: Steffen (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.