PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Unterbrechung eines Interrupts



stardust19322
31.10.2014, 12:46
Hallo BASCOM-Spezialisten.

Ich arbeite derzeit an einer PWM-Steuerung für RGB-LEDstreifen. Farbwechsel sowie Auf-/Abdimmen sind kein Problem, sowohl im Hardware als auch im Software-PWM-Modus.
Da die Programmstruktur im Hardware-PWM-Modus (Register OCR1 sowie Pwm1a und Pwm1b) weitaus einfacher, übersichtlicher und besser zu handlen ist, arbeite ich auch damit lieber als mit der Software-Variante.
Allerdings habe ich das Problem, dass ich ausgelöste Interrupt-Routinen nicht unterbrechen kann.
Hat ein Farbwechsel bzw. eine Auf- und Abdimmstufe einmal begonnen, so kann diese nichts unterbrechen. Auch eine Logik, die zum Auslösen dieser Routine führte, wird in dieser Zeit nicht mehr abgefragt, um das Programm unterbrechen zu können.

Mein Ziel ist es, einen RGB-Streifen in verschiedenen Farben auf- und abzudimmen, trotzdem aber gern die Möglichkeit zum Wechseln der Farbe haben möchte.
Gibt es also eine Möglichkeit, einen Interrupt zu unterbrechen?


Als 2ten Punkt habe ich über die Möglichkeit gelesen, ein EXCEL-Dokument auf den Controller zu laden, in welchem bestimmte Wertzustände zum Auf- und Abdimmen hinterlegt werden können. Dadurch wird das Auf- und Abdimmen viel "weicher" (LED ist beim Aufdimmen schon recht schnell "zu hell" und im weiteren Verlauf sieht man kaum noch Änderungen). Wie genau muss diese EXCEL-Tabelle ausschauen und wie lade ich diese hoch bzw. wie geht das von Statten? Habe nicht viel darüber gefunden.


Danke schon einmal im Voraus.


LG - Maik

peterfido
31.10.2014, 13:43
Interrupt eines Interrupts ist nicht vorgesehen. Die Möglichkeiten über Reset oder Spannungsunterbrechung bringen Dich da auch nicht weiter :)

Die Routinen können aber kurz gehalten werden und müssen sich halt selbst "merken", wo sie grad waren, wenn sie wieder aufgerufen werden. Wenn Du allerdings komplette "Farbwechsel bzw. eine Auf- und Abdimmstufe" in einem Interrupt durchführst, dass man es sogar sehen kann, ist da noch Verbesserungspotenzial im Programm ;)

Klingt für mich nach klassichen RGB-Strefien, wo alle LED´s die gleiche Farbe haben. Oder geht es hier um WS28xx LED-Streifen?

Besserwessi
31.10.2014, 20:32
Zur Not kann man einen Interrupt unterbrechen. Man muss dabei aber schon genau wissen was man tut. Außerdem braucht das in BASCOM sher viel Platz auf den Stack, weil die Register 2 mal gesichert werden. Es ist also nicht zu empfehlen.

Der Beschreibung nach zu urteilen ist jetzt noch zu viel in der einen Interruptroutine. Normal sollte nur recht kurz sein, so dass es in aller Regel nicht stört, wenn man auf das Ende der Interruptroutine warten muss. Wenn man das Dimmen mit Interrupts lösen will, dann doch eher so, das man in einem Timer interrupt den PWM Wert einmal anpasst. Wenn man das Dimmen Abbrechen will, deaktiviert man den Interrupt für das Dimmen einfach, so ähnlich wie man es am Ende des Dimmens auch machen würde. Ggf. einfach mal das Programm Zeigen.

Mit der Excel Tabell ist vermutlich gemeint, dass das nichtlineare Helligkeitsempfinden des Auges durch eine Kurve berücksichtigt werden soll. So etwas macht in Grenzen Sinn, weil für das Auge der Schritt von PWM Werte von z.B. 0% nach 10% wie größer erscheint als von 90% zu 100%. Man könnte also noch so eine Art Umrechnungstabelle dazwischen schalten, so dass man sich von 0-50% mehr Zeit nimmt als von 50-100%. Man muss es auch nicht unbedingt mit einer Tabelle machen, man kann es auch berechnen, etwa indem man die Wartezeit bis zum nächsten Schritt beim Dimmen mit 1/(PWM-Wert +2) skaliert . Die Konstante "2" kann auch einen anderen Wert (z.B. 1 - 10) haben.

oberallgeier
01.11.2014, 09:14
Hallo Maik,

für Deine Frage bin ich nur halb kompetent - ich bin kein Bascom-Spezialist. Es geht aber um Interrupts - die habe ich einigermassen im Griff. Allerdings sind die obigen Einwände gravierend - zeitlich und codemässig (zu) lange Interruptroutinen sind unschön, oft schädlich für den Programmablauf oder für den Controller sogar ein Grund ins Koma zu fallen.


... Gibt es also eine Möglichkeit, einen Interrupt zu unterbrechen ...Ja, die Möglichkeit gibt es. Ich zitiere Dir mal das Datenblatt des mega328 als Beispiel. Dieser Abschnitt gilt für alle mir bekannten Atmelcontroller :

...
6.7 Reset and Interrupt Handling
...
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...

Das heißt: jede InterruptServiceRoutine verbietet nach ihrem Aufruf weitere Interrupts. Die werden im Normalfall mit Ende der ISR wieder erlaubt : es wird der Befehl RETI ausgeführt, der setzt das I-Bit (automatisch) . Die Interrupts kannst Du per eigenem Programmbefehl >>sofort, innerhalb der laufenden ISR<< erlauben, wenn Du innerhalb dieser ISR (nennen wir die mal ISR-X) den Interrupt wieder global erlaubst. In C heißt der Befehl sei(); - Set Enable Interrupt. Sinnvoll kann nun sein diese ISR-X jetzt so aufzubauen, dass sie mehrfach gestartet werden kann weil das u.U. eben passieren kann: ISR-X(a) startet-und-läuft, ISR-X(b) startet-und-läuft, ISR-X(c) startet-und-läuft ... und erst dann ist (nur beispielhaft) die ISR-X(a) wieder zu Ende. Auch hier wieder die Möglichkeit ein Koma des Controllers zu provozieren.

Ansonsten wie von den Vorgängern beschrieben - viel Platz für Stack vorsehen. Ich habe Routinen mit nested Interrupts in einigen Controllern problemlos in Betrieb.

stardust19322
01.11.2014, 22:08
Uff - danke euch, insbesondere dir, Oberallgeier.
Serh viel Input - das muss ich erst einmal verarbeiten und ausprobieren.

Mein Programm, eine Steuerung von RGB-Led-Streifen funktioniert jetzt bis auf einen ganz kleinen Schönheitsfehler tadellos. Ich kann mir nach Einschalten des Controllers per Taster 1 die Farbe aussuchen (8 Farbstufen) und mich dann entscheiden, ob nach Drücken von Taster2 diese kontinuierlich auf- und abdimmen soll. In einer neunten Farbstufe rotieren dann alle Farben langsam nacheinander durch.

Ich würde gern noch weitere Features in das Programm einbauen, jedoch reichen da die 4kB nicht für aus.
Da ich in diesem Programm nun keine Interupts verwende, sondern nur einfache Hardware-PWM und For-To-Next Schleifen, kann ich das Farbwechsel- oder Fading-Programm an jeder Stelle unterbrechen und zum Auswahlmenü zurückkehren.

Wenn gewünscht, poste ich morgen den Code, denn für meine Belange funktioniert er echt gut. Ist halt nur noch etwas zu einfach, denn ich kann mit den komplizierteren Begriffen noch nicht umgehen.

Gesendet von meinem Tablet.


LG - maik