Forum: Mikrocontroller und Digitale Elektronik Mehrere Dinge mit dem uC erledigen


von hagbrain (Gast)


Lesenswert?

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

von Bastler (Gast)


Lesenswert?

>>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...

von Matthias L. (Gast)


Lesenswert?

>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

von Heinz (Gast)


Lesenswert?

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.

von Uwe (de0508)


Lesenswert?

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.

von Peter D. (peda)


Lesenswert?

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

von Timm T. (Gast)


Lesenswert?

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.

von Falk B. (falk)


Lesenswert?

@  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

von Joachim (Gast)


Lesenswert?

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ß

von Falk B. (falk)


Lesenswert?

@  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

von Peter D. (peda)


Lesenswert?

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

von Joachim (Gast)


Lesenswert?

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...

von Falk B. (falk)


Lesenswert?

@  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

von Volker S. (volkerschulz)


Lesenswert?

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

von Peter D. (peda)


Lesenswert?

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

von Volker S. (volkerschulz)


Lesenswert?

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

von Stefan (Gast)


Lesenswert?

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.

von Falk B. (falk)


Lesenswert?

@  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

von Volker S. (volkerschulz)


Lesenswert?

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

von hacker-tobi (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.