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(tastenichtgedrückt);
ändern in:
1
if(tastenichtgedrü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
@ 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