www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik unterbricht ein zweiter Interrupt einen anderen ?


Autor: Max Kuhn (madget)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Tja wußte nicht so recht wie ichs beschreiben sollte.

Ich möchte in bascom einen timerinterrupt machen der taster ausliest
(ca 5 mal pro sek) und gleichzeitig ein software pwm auch mit
timerinterupt laufen lassen. nun meine frage: kann der pwm interrupt
den interrupt für die taster unterbrechen? denn das möchte ich ja
ansonsten wirds warscheinlich nen bisschen flackern (pwm steuert leds
an).

wäre nett wenn mich da jemand aufklären könnte nach welchen prioritäten
das abgearbeitet wird.(müsste doch in jeder sprache gleich sein, oder
?)

mit nem minimalprogramm hats funkltioniert aber wenn mein programm
größer wird wärs zum programmieren ganz praktisch zu wissen wies genau
funktioniert.

also: bin dankbar für jede antwort

Autor: anm (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo

welchen controller verwendest du denn? meine glaskugel ist verstaubt
:D

mfg anm

Autor: Max Kuhn (madget)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ach ja die glaskugel :)
nen maga8 hab ich

Autor: Max Kuhn (madget)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
nein, natürlich mega8

Autor: Wolle (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Zunächsteinmal sind Interrupts hardwareabhängig. In der Auslegung wird
die Priorität eines Interrupts entschieden.
Bei den AVRs sind alle Interrupts gleichwertig. D.h. alle Interrupts
können andere Interrupts beeinflussen.
Per Software hast du aber die Möglichkeit, generell Interupts zu
verhindern oder auch nur einzelne Interrupts zu unterdrücken. Dazu gibt
es bestimmte Befehle (z.B. sei, cli etc.)
Welcher Interrupt wie ein- oder ausgeschaltet werden kann, steht in der
Befehlsliste der entsprechenden Controller.

Autor: anm (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hmmm mega8 klingt gut!

die interrupts werden immer aneinandergereiht! also immer einer fertig
abgearbeitet und dann der nächste (nach der priorität - siehe
interruptvektoren)....
ich bin mir nicht sicher ob man es umstellen kann! müsste im datenblatt
schaun - aber du könntest mich per icq (163582709) kontaktieren - dann
helf ich dir gerne weiter

mfg andi

Autor: anm (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
folgender auszug aus dem datenblatt vom ATmega8:

When an interrupt occurs, the Global Interrupt Enable I-bit is cleared
and all interrupts
are disabled. The user software can write logic one to the I-bit to
enable nested interrupts.
All enabled interrupts can then interrupt the current interrupt
routine. The I-bit is
automatically set when a Return from Interrupt instruction – RETI – is
executed.

also kannst du das gobale interruptflag in deinem pwm interrupt setzen
und dadurch das taster auslesen aktivieren! aufpassen musst du vor
allem bei den prioritäten!!
vergiss auch nicht den taster zu entprellen, da ansonsten die
interruptroutine zu oftg ausgeführt werden könnte!

mfg andi

Autor: crazy horse (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
es gibt keine Priorität beim AVR - allenfalls in dem Sinne, dass bei
gleichzeitig auftretenden eine Reihenfolge eingehalten wird. Läuft
einmal eine ISR, kann ein anderer Int diese erstmal nicht unterbrechen,
es sei denn, man programmiert dieses explizit, nicht ganz einfach, geht
aber.
Einfacher: Int-Programme kurz halten.

Autor: anm (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@crazy horse: die "niederwertigen" - also die interrupts mit niedriger
adresse werden aber zuerst ausgeführt wenn 2 zugleich auftreten sollten!
ich hab dies einmal mit timern ausprobiert die vollkommen zugleich
übergelaufen sind - immer der mit der niedrigeren adresse hatte
vorrang! und dass es so schwierig geht in einem interrupt einen
weiteren interrupt auszuführen stimmt schon! man muss halt
rücksprungadresse, sreg usw. sichern und dann das globale interruptflag
setzen und sonst noch einiges beachten! möglich ist es aber auch alle
fälle!!

@threateröffner: warum muss der taster alle 5ms ausgelesen werden? dies
"überfordert" den controller ziemlich und ist nicht der sinn von
interrupts! wie wärs wenn du den taster auf steigende flanke triggerst?
dann merkst du wenn der taster gedrückt wird! du könntest sogar dann den
interrupt auf fallende flanke umstellen und dadurch beim loslassen einen
interrupt erhalten! allerdings muss dann der taster super entprellt
sein!

mfg andi

Autor: crazy horse (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
"allenfalls in dem Sinne, dass bei gleichzeitig auftretenden eine
Reihenfolge eingehalten wird" hatte ich geschrieben, lies es dir
nochmal durch :-)
Und zur eigentlichen Frage: hänge doch die Tasterabfrage ans Ende des
Timerints für die Software-PWM und alle Probleme verschwunden.

Autor: anm (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ups sorry crazy horse - hab deinen text falsch interpretiert - tut mir
leid :-( :-(
hab das echt nicht überzuckert :-)

mfg andi

Autor: Max Kuhn (madget)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
tja also erst mal danke für die schnellen antworten. ich werde erst mal
versuchen den interrupt so kurz wie möglich zu halten.

ach ja und der "threateröffner" ;) möchte nicht alle 5ms sondern 5
mal in der sekunde den taster bzw. 3 von der sorte auslesen um eben das
entprellen zu umgehen. wenns nur ein taster wäre wäre das aber wohl die
elegantere lösung den direkt auf nen interrupt zu legen.

wobei, man könnte doch auch alle drei taster mit jeweils dem
interrupteingang und mit nem signaleingang verbinden, oder ? wie kann
ich das denn hardwareseitig  machen ?

Autor: anm (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hardwareseitig dürfte das kleinste problem sein! willst du nicht in den
chat kommen um zu diskutieren?

mfg andi

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Andi

> warum muss der taster alle 5ms ausgelesen werden? dies
> "überfordert" den controller ziemlich und ist nicht der sinn von
> interrupts!

Das ist Quatsch mit Soße.

5ms sind aufm ATMega8 bei 16MHz riesige 80.000 Zyklen !

Ich habe schon auf nem 8051 viel kürzere Interrupts gemacht (30µs mit
DS80C320 bei 24MHz).

Im  Gegenteil, es ist der Sinn eines Interrupts, schnell und oft auf
irgendwas zu reagieren.

5ms ist auch ein sehr guter Wert, um darin die Tastenerkennungs- und
Entprellroutine mit 4-fach Abfrage für bis zu 8 Tasten auszuführen,
kostet etwa 20 Zyklen also 0,025% CPU-Zeit.


Überfordern kann man nur dann, wenn man in Interrupts riesige
Wartezeiten mit einfügt.
Und dann ist es völlig egal ob 30µs, 5ms oder 1s, Wartezeiten in
Interrupts machen Dir jedes Programm kaputt.


Peter

Autor: dunkelmann (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
zum Thema Software PWM und Taster:

Ich hab selbst schon einige Software-PWM mit Taster implementiert (auf
Atmel Tiny12/15 etc.. in Assembler), da sieht man kein flackern wenn
Tasten gedrückt werden.

dkm
www.loetstelle.net

Autor: Thomas K. (thkais)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Abfrage der Taster in die PWM-Routine mit hineinlegen. Da wird er
zwar öfters abgefragt, aber das sollte nicht schaden. (Gilt natürlich
nur, wenns um die reine Abfrage geht - die Auswertung darf nicht im
Interrupt gemacht werden, sondern muß im Hauptprogramm geschehen)

Autor: Looser (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Geiler satz:

All enabled interrupts can then interrupt the current interrupt routine

Autor: Looser (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Geiler Satz:

All enabled interrupts can then interrupt the current interrupt
routine

Autor: Werner B. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> All enabled interrupts can then interrupt the current interrupt
> routine

<joke>
Wobei sich das auch auf die momentan aktive interrupt routine bezieht.
 Sozusagen ein "Rekursiver Interrupt"  ;-)
</joke>

Und "Rekursiver Interrupt"!
Das ist etwas was man in 99,99999% aller Fälle vermeiden will/muss,
sonst ist der stack in lichtgeschwindigkeit übergelaufen.

Autor: ftur (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
klare antwort: JA, wenn der gerade ausgeführte interrupt (der global
interrupts am anfang bekanntlich sperrt) via 'sei' global interrupts
vorzeitig wieder erlaubt hat (was ja sonst erst mit reti der fall ist)
UND die priorität des antragstellers höher ist (avr-interrupts sind
eben NICHT gleichwertig).

Autor: crazy horse (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
das ist schlicht und ergreifend einfach nur falsch.
Wird in einer ISR das I-Bit wieder gesetzt, kann jeder andere Int die
laufende ISR unterbrechen (und tut es auch, Priorität spielt dafür
keine Rolle). Stehen mehrere Ints zum Zeitpunkt der Freigabe an, greift
die Ausführungsreihenfolge (Int0, Int1 usw)
Eine echte Priorisierung geht nach folgendem Schema:
In jeder ISR dürfen nur die Ints freigegeben bleiben, die eine höhere
Priorität haben sollen, alle anderen müssen gesperrt werden, also
Einstellung über GIMSK, TIMSK usw. Anschliessend kann mit sei innerhalb
der ISR freigegeben werden. Vor Ende der ISR müssen dann natürlich die
bis dahin gesperrten, also mit kleinerer Priorität eingestuften, auch
wieder freigeben werden. Dazu zu jeder ISR die entsprechende Sicherung
von SREG und benutzen Registern.
Alles viel Aufwand und fehlerträchtig, lieber die Finger davon lassen,
wenn es nicht unbedingt nötig ist. Meist lässt sich das machen, ich
hatte noch kein3e Anwendung, wo es wirklich unabdingbar gewesen wäre.
Laufzeiten kurz halten, zeitintensive Sachen in die main auslagern, nur
über flags anzeigen, dass dieser Prozess zur Verarbeitung ansteht.

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.