Hallo an alle hier. Ich komme gleich mal zur Sache. Also es geht mir nicht um Multitasking. Die Frage die sich mir stellt und die ich im Kopf nicht klar bekomme, ist folgende. Nehmen wir mal an das ich eine Temperatur auslesen will und je nach Temp. einen Ausgang schalten will. Nebenbei soll ein Menü(etwas das ich auch überhaupt nicht verstehe wie man das realisieren soll auf nem LCD)ausgegeben werden und auch durchwählbar sein. Des Weiteren sollen Taster abgefragt werden und je nach Zustand mehrere Ausgänge schalten. Zusätzlich soll noch auf Schalter X gewartet werden und dann was passieren. So wenn jetzt auf Schalter X gewartet wird kann nix anderes gemacht werden oder nicht? Ich habe schon was von Taskmanagern für nen uC gelesen, aber das kann es doch nicht sein oder? Ist ein uC eher für andere Dinge gedacht? Der uC geht ja immer wieder die Schleife durch die nie endet. Also quasi wie ne SPS(nur als vergleich) xD Gibt es irgendwo ein Tut das erklärt wie man ein Prog so aufbaut das man es beliebig erweitern kann ohne alles neu schreiben zu müssen? Beispiele also, die zeigen wie man ein Programm struckturiert aufbaut und man verhindert das man sich das Programm verbaut? Ich hoffe ihr versteht was ich meine und ich danke schon einmal fürs Lesen. Ansonsten noch einen schönen Abend. MFG hag
>>So wenn jetzt auf Schalter X gewartet wird kann nix anderes gemacht >>werden oder nicht? Du wartest auch nicht an deiner Haustür wann jemand vorbei kommt. Du unterbrichst deine Arbeit wenn es klingelt...
>Der uC geht ja immer wieder die Schleife durch die nie endet.
Richtig. Und jetzt stell dir die Schleife mal so vor:
(Pseudocode)
while(1)
{
Aufgabe_1();
Aufgabe_2();
Aufgabe_3();
...
}
und jede Aufgabe sieht etwa so aus:
Aufgabe_X
{
gehe, abhängig von Variable Zustand in folgenden Programmteil:
Zustand 0
Prüfe Taster1 ob gedrückt, wenn nein, dieses Programm beenden
Wenn ja, dann setze Zustand=1 und beenden
Zustand 1
Setze Ausgang und prüfe Taster2, wenn nicht gedrückt, Prg-Ende.
Wenn ja, dann setze Zustand=2 und beenden
Zustand 2
...
}
Statt Taster gedrückt, könnte auch Temperatur>23Grad dastehen oder
sowas...
Stichwort: Schrittketten, Zustandsautomaten
hagbrain schrieb: > Also es geht mir nicht um Multitasking. Doch, genau darum gehts dir. > Ich habe schon was von Taskmanagern für nen uC > gelesen, aber das kann es doch nicht sein oder? Doch.
Hallo Hag !? einer der schönsten Ideen, einen Task Schedulder effektiv zu programmieren ist die von PeDa: - Beitrag "Wartezeiten effektiv (Scheduler)" Den verwende ich auch immer wieder gerne und man sollte sich die Funktion klar machen, das wird dir Helfen deine Programme neue zu organisieren. Hier ist noch ein komplettes Programm mit dem Task Schedulder: - Beitrag "Re: 3fach Timer (einschaltverzögerung)" Taster fragt bzw. wertet deren Zustände wieder mit einem Code von PeDa aus: Ich habe das alles hier zusammen getragen: - Beitrag "Re: LED Programm" Die anderen werden auch noch etwas schreiben, deshalb ist hier jetzt mal Schluss.
Man muß sein Denken etwas umstellen. Muß irgendwo auf ein Ereignis gewartet werden, dann bleibt die Task da nicht bis zum st. Nimmerleinstag stehen, sondern geht einfach zurück zum Main. Dadurch wird die Mainloop sehr schnell durchlaufen, sodaß der Benutzer den Eindruck hat, der MC macht alles parallel. Also:
1 | while( taste nicht gedrückt ); |
ändern in:
1 | if( taste nicht gedrückt ) |
2 | return; |
Damit eine Funktion nun beim nächsten mal weiß, wo sie gerade auf etwas gewartet hatte, merkt sie sich das mit einer Variable. Diese kann man z.B. mit einem Switch/Case auswerten. Peter
Erstmal: Geht alles, ist alles kein Problem. Wichtig: Programmiere nicht linear. Hab ich am Anfang auch falsch gemacht, immer einen Teilschritt abarbeiten und dabei nix anderes können. Ist doof. Aufgaben: Aufteilen in einzelne Aufgabenbereiche (Temp einlesen, Taster einlesen, Schalter abfragen, Menu navigieren, Display schreiben). Grundstruktur: Ein Hauptprogramm, das in einer Endlosschleife läuft. Am besten getaktet durch einen Timer. Die Aufgaben in Unterprogramme auslagern. Die Unterprogramme nacheinander aufrufen. Hat den Vorteil, dass Du das Programm nach und nach ausbauen kannst.
@ hagbrain (Gast) >Ich komme gleich mal zur Sache. Also es geht mir nicht um Multitasking. Wie kommst du zu dieser irrigen Annahme? Lies den Artikel Multitasking. >Gibt es irgendwo ein Tut das erklärt wie man ein Prog so aufbaut das man >es beliebig erweitern kann ohne alles neu schreiben zu müssen? siehe oben. MfG Falk
Es hilft auch immer sich zu überlegen, wie wichtig die jeweiligen Teilaufgaben sind. Im Folgenden mal ein Beispiel mit beispielhaften Zahlen und Zeiten: Die Ausgabe auf dem LCD: die Kommunikation ist total lahm, dein Auge und deine Reaktionszeit ist auch total lahm. Gibt also keinen Grund das LCD schneller als 2x pro Sekunde an zu sprechen. Noch besser wäre es du sprichst es nur an, wenn sich das, was angezeigt werden soll, auch verändert hat. Das LCD verschafft dir also schonmal viel Zeit für wichtigere Dinge... Als nächstes die Temperaturmessung: thermisch Prozesse sind auch (meist) recht langsam. Kein Grund als die Sensoren öffter als z.B. 2x pro Sekunde aus zu lesen. Angenommen du hast 5 Sensoren, dann macht das 10 Auslesungen pro Sekunde. Je nach Sensor kann das eine halbe Ewigkeit sein... Also immer noch ganz viel Zeit übrig: hey, der Notaus ist ja voll wichtig! In der Zwischenzeit von der LCD-Ausgabe und den Sensoren kann ich ja den Notaus abfragen! Das kann dann recht schnell vonstatten gehen! Und das ist bisher noch ohne Interrupts ;) ... Gruß
@ Joachim (Gast) >Also immer noch ganz viel Zeit übrig: hey, der Notaus ist ja voll >wichtig! In der Zwischenzeit von der LCD-Ausgabe und den Sensoren kann >ich ja den Notaus abfragen! Das kann dann recht schnell vonstatten >gehen! Notaus wirkt nie per Software! Bestenfalls die Anzeige. MfG Falk
Falk Brunner schrieb: > Notaus wirkt nie per Software! Das war früher einmal. Heutzutage gibt es z.B. zugelassene Notaus-Taster mit CAN-Bus. In großen Anlagen ist das auch garnicht anders möglich. Es ist einfacherer und sicherer ein Stück Softare zuverlässig zu schreiben, anstatt einen riesen Wust an einzelnen Kabeln zu verlegen und zu verschalten. Was nützt der robusteste Notaus-Taster, wenn das Kabel irgendwo eingeklemmt wurde und einen Kurzschluß hat. Peter
Falk Brunner schrieb: >>Also immer noch ganz viel Zeit übrig: hey, der Notaus ist ja voll >>wichtig! In der Zwischenzeit von der LCD-Ausgabe und den Sensoren kann >>ich ja den Notaus abfragen! Das kann dann recht schnell vonstatten >>gehen! > > Notaus wirkt nie per Software! Bestenfalls die Anzeige. Mann, das war beispielhaft für etwas, was wichtiger ist, als die Anzeige auf dem LCD! Ist doch in Ordnung, du weißt natürlich, wie es richtig ist. Wenn es dem TO hilft, können wir meinen vollkommen zusammenhanglosen Text oben gern noch bis ins letzte Detail zerflücken, bis das letzte sicherheitsrelevante Glied in der Kausalkette endlich geschlossen ist! seufz...
@ Peter Dannegger (peda) >> Notaus wirkt nie per Software! >Das war früher einmal. Als noch alles besser war . . . >Heutzutage gibt es z.B. zugelassene Notaus-Taster mit CAN-Bus. Mag sein, aber dort wird EINIGES an Aufwand betrieben, um das sicher zu machen. Allein CAN treibt einen Riesenaufwand, um Daten sicher und schnell zu übertragen. >In großen Anlagen ist das auch garnicht anders möglich. Jain. >Es ist einfacherer und sicherer ein Stück Softare zuverlässig zu >schreiben, anstatt einen riesen Wust an einzelnen Kabeln zu verlegen und >zu verschalten. Naja, wir reden nicht über 1000 Notaustaster, auch nicht in großen Anlagen. >Was nützt der robusteste Notaus-Taster, wenn das Kabel irgendwo >eingeklemmt wurde und einen Kurzschluß hat. Wenig. Aber die schmeißt man ja auch nicht einfach irgendwo hin. MfG Falk
Joachim schrieb: > [...] > Mann, das war beispielhaft für etwas, was wichtiger ist, als die Anzeige > auf dem LCD! [...] können wir meinen vollkommen > zusammenhanglosen Text oben gern noch bis ins letzte Detail zerflücken, > bis das letzte sicherheitsrelevante Glied in der Kausalkette endlich > geschlossen ist! Ok.. Warum nicht doch einen Interrupt fuer den Not-Aus-Taster? ;) Falk Brunner schrieb: >>Was nützt der robusteste Notaus-Taster, wenn das Kabel irgendwo >>eingeklemmt wurde und einen Kurzschluß hat. > > Wenig. Aber die schmeißt man ja auch nicht einfach irgendwo hin. Koennte man ja neben die Leitung vom CAN-Bus legen! ;) Volker
Volker Schulz schrieb: > Ok.. Warum nicht doch einen Interrupt fuer den Not-Aus-Taster? ;) Ganz schlecht. Jemand benutzt sein Handy in der Nähe des Tasters und die ganze Anlage fährt runter. Peter
Peter Dannegger schrieb: > Volker Schulz schrieb: >> Ok.. Warum nicht doch einen Interrupt fuer den Not-Aus-Taster? ;) > > Ganz schlecht. > Jemand benutzt sein Handy in der Nähe des Tasters und die ganze Anlage > fährt runter. Was hat denn das Handy mit dem Interrupt zu tun? Volker
Hier sei nochmal auf einen kleinen Taskmanager in C++ für AVRs hingewiesen: Beitrag "Einfacher Scheduler und Timer in C++ für ATMega" So kann man sehr übersichtlich Tasks nebeneinander laufen lassen.
@ Volker Schulz (volkerschulz) >>> Ok.. Warum nicht doch einen Interrupt fuer den Not-Aus-Taster? ;) >> Ganz schlecht. >> Jemand benutzt sein Handy in der Nähe des Tasters und die ganze Anlage >> fährt runter. >Was hat denn das Handy mit dem Interrupt zu tun? Ganz einfach, EMV. Handies strahlen mit bis zu 2W, da kann man bisweilen schonmal ein Eingangspin zum wackeln bringen, wenn es recht hochohmig beschaltet ist. Besser wäre ein periodisches Abfragen (Pollen) im Timer Interrupt, da kann man auch entprellen. MFG Falk
Falk Brunner schrieb: >>Was hat denn das Handy mit dem Interrupt zu tun? > > Ganz einfach, EMV. Handies strahlen mit bis zu 2W, da kann man bisweilen > schonmal ein Eingangspin zum wackeln bringen, wenn es recht hochohmig > beschaltet ist. Besser wäre ein periodisches Abfragen (Pollen) im Timer > Interrupt, da kann man auch entprellen. Entprellen koennte man auch im Interrupt. Und bei sicherheitskritischen Aufgaben wird auch das LCD so lange warten koennen. Stellt sich aber die generelle Frage ob das sinnvoll waere einen Not-Aus-Taster zu entprellen. Ausreichend kleiner Pull-Up-Widerstand und gut is. Volker
Hi, vor einiger Zeit hab ich auch mal ein kleines OS für atmels veröffentlicht, inkl. Multitasking und Message Queues. Damit kannst du per Task deine Temperaturen auslesen, und das LCD aktualisieren. Da das System den Umgang mit Interrupts beherrscht, wäre es auch kein Problem, die Taster per Interrupt oder in einem weiteren Task abzufragen. Download: www.sourceforge.net/projects/nanoos Diskussion dazu (achtung, nicht von dort downloaden, alte Version) Beitrag "NeuesOS für AVR Mikrocontroller" gruß tobi
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.