Autor |
Unterbrechbare Interrupts in AVR-GCC |
|
|
|
|
BID = 378684
photonic Schreibmaschine
Beiträge: 1301 Wohnort: Zürich, Schweiz
|
|
Hallo Zusammen
Ich habe ein kleines Problem mit Interrupts in AVR-GCC. Bei der Verbesserung meiner Brushlessmotoransteuerung fand ich Timingprobleme. Ich habe verschiedene interruptroutinen, die einen sind sehr kritisch was den Ausführungszeitpunkt betrifft. Ein anderer rechenintensiver nicht so, nur die Ausführungsfrequenz ist wichtig, wann genau ist egal.
Ich habe mir nun vorgestellt den nicht kritischen Prozess in eine unterbrechbare Interruptroutine zu setzen damit die anderen ihre Arbeit dann tun können wenn sie sollen.
Gemäss AVR-GCC-Tutorial gibt es das, ich bin allerdings nicht ganz schlau geworden daraus, da dort hauptsächlich die Warnung steht man soll es nur tun wenn man genau weiss was man tut...
hat jemand schonmal so etwas verwendet?
Danke für euere Tipps!
[ Diese Nachricht wurde geändert von: photonic am 17 Okt 2006 23:08 ] |
|
BID = 378691
olfi13 Schreibmaschine
Beiträge: 1077 Wohnort: Wittingen
|
|
Hi!
C kenne ich zwar nicht, aber grundsätzlich:
Setze in der "unterbrechbaren" Routine ein Flag und werte es in der Hauptprogrammschleife aus um die rechenintensive Operation durchzuführen. Dann können die zeitkritischen anderen Int's in dieser Zeit ihre Arbeit machen
Ich hoffe, ich habe dich richtig verstanden.
Gruß, olfi
_________________
Gruß, olfi |
|
BID = 378729
photonic Schreibmaschine
Beiträge: 1301 Wohnort: Zürich, Schweiz
|
Das ist grundsätzlich keine schlechte Idee, aber die Hauptprogrammschleife selbst hat auch noch einiges an unkritischer Arbeit zu tun wie Kommunikation, Drehzahlregelung, etc.
Die Wiederholfrequenz der Hauptschleife ist daher zu gering und zu ungenau definiert für diesen Zweck. Dieser arme Atmega48 hat leider alle Hände voll zu tun...
[ Diese Nachricht wurde geändert von: photonic am 18 Okt 2006 8:32 ]
|
BID = 378735
Ltof Inventar
Beiträge: 9334 Wohnort: Hommingberg
|
Hmm...
weder mit AVR, noch mit C kenne ich mich aus. Aber verschachtelte Interrupts würde ich meiden. Kannst Du vielleicht in der Hauptschleife an mehreren geeigneten Stellen einen bedingten Sprung in die Rechenroutine machen? Die Verzweigungs-Entscheidung muss doch nicht nur ein mal pro Hauptschleifen-Durchlauf geschehen. Ist das Ereignis, welches die Rechenroutine auslöst zu kurz für diese Herangehensweise?
Bei PICs ist es möglich, die Interrupt-Flags auszuwerten, ohne dass diese auch wirklich einen Interrupt auslösen müssen. Selbst, wenn andere Quellen tatsächlich einen Interrupt auslösen. Das ist ganz praktisch. Vielleicht geht das bei AVRs auch?
Gruß,
Ltof
_________________
„Schreibe nichts der Böswilligkeit zu, was durch Dummheit hinreichend erklärbar ist.“
(Hanlon’s Razor)
[ Diese Nachricht wurde geändert von: Ltof am 18 Okt 2006 9:37 ]
|
BID = 378863
Jornbyte Moderator
Beiträge: 7178
|
Um die Interrupts zu sperren kommt da ein _CLI hin.
Die Freigaber erfolg mit _SEI.
_________________
mfg Jornbyte
Es handelt sich bei dem Tipp nicht um eine Rechtsverbindliche Auskunft und
wer Tippfehler findet, kann sie behalten.
|
BID = 378867
Jornbyte Moderator
Beiträge: 7178
|
Ach ja, sollten nur einzelne Ints abgeschaltet werden so muss das IE-Bit gelöscht (Bit =0) werden, Bei er UART währe das RXCIE, dieses Bit auf 0 setzen, genau so gehts im Timer (TIMSK).
_________________
mfg Jornbyte
Es handelt sich bei dem Tipp nicht um eine Rechtsverbindliche Auskunft und
wer Tippfehler findet, kann sie behalten.
|
BID = 378916
photonic Schreibmaschine
Beiträge: 1301 Wohnort: Zürich, Schweiz
|
Die Idee mit dem mehrfachen bedingten Sprung tönt vielversprechend! Ist mir wesentlich sympathischer als verschachtelte Interrupts weil ich da sicher bin dass nichts auf mysteriöse Weise schieflaufen kann. Manchmal sind die einfachsten Lösungen die auf die man nicht kommt...
Bis jetzt funktioniert es damit tip top, viel mehr Rechenaufwand wird nicht mehr dazukommen.
Danke für die Hinweise!
|