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
hallo welchen controller verwendest du denn? meine glaskugel ist verstaubt :D mfg anm
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.
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
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
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.
@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
"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.
ups sorry crazy horse - hab deinen text falsch interpretiert - tut mir leid :-( :-( hab das echt nicht überzuckert :-) mfg andi
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 ?
hardwareseitig dürfte das kleinste problem sein! willst du nicht in den chat kommen um zu diskutieren? mfg andi
@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
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
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)
Geiler satz: All enabled interrupts can then interrupt the current interrupt routine
Geiler Satz: All enabled interrupts can then interrupt the current interrupt routine
> 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.
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).
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.