Forum: Mikrocontroller und Digitale Elektronik Allgemeine Frage zur _delay_ms() Funktion


von Christian D. (t1000hh)


Lesenswert?

Hallo zusammen,
ich habe eine allgemeine Frage zur _delay_ms() Funktion.

wenn ich zum Beispiel eine LED blinken lassen mit:

...
LED(an);
_delay_ms(2000);
LED(aus);
_delay_ms(2000);
...

ist ja jeweils 2 mal für 2 Sekunden der Microcontroller "eingefroren"
ind dieser Zeit würde der Controller ja nicht auf einen taster oder 
Sensor reagieren. Meien Frage ist geht es das man dies umgehen kann, 
sprich das ich ein blinken der LED ermöglichen kann, wo jederzeit ein 
abbruch ermöglicht wird?

Ich bin Neuling in der Programmierung und würde mich über verständliche 
und FREUNDLICHE Antworten oder Anregungen freuen

danke im Vorraus

von Klaus (Gast)


Lesenswert?

Christian Dopatka schrieb:
> Ich bin Neuling in der Programmierung und würde mich über verständliche
> und FREUNDLICHE Antworten

Jetzt willst du also bestimmen, ob ich freundlich oder angemessen 
antworten darf, oder wie?

von Benjamin U. (utzus)


Lesenswert?

So und hier nun ne Hilfreiche Aussage:

Ja, das geht aber nur über Interrupts (Unterbrechungen).

Ganz grob würde man dazu eine Timer parametrieren, der alle 2 Sekunden 
einen interrupt auslöst, welcher dann die LED umschaltet. Danach hat der 
Mikrocontoller fast 2 Sekunden zeit, etwas anderes zu tun, denn der 
Zähler zählt von alleine.

Nachdem du nicht gesagt hast, womit du programmierst, hier mal was zur 
erläuterung:

http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Programmieren_mit_Interrupts

Grüße,
Benni

von Chris (Gast)


Lesenswert?

Hallo,

schau dir am besten mal interrupts und Timer an. Damit kannst das 
Problem lösen. Bei sprut.de findest du viele Information dazu.

von Uwe N. (ex-aetzer)


Lesenswert?

Hallo Christian,

ja, das geht im Prinzip mit einem Timer-Interrupt. "Im Prinzip" deshalb, 
weil die AVRs nur mit 8 oder 16 Bit Zählern/ Timer ausgestattet sind, 
d.h. du musst im Zweifelsfall mehrfach (bei jedem Überlauf) in die ISR 
springen um den (Software-)Zähler zu erhöhen.

Wie oft das geschehen muss, hängt von deinem Takt und der gewünschten 
Zeitspanne ab.

von 900ss (900ss)


Lesenswert?

Du mußt dich mit Multitasking befassen

Hier wird das Prinzip Multitasking ganz anschaulich mit Beispielen 
erklärt.
http://www.mikrocontroller.net/articles/Multitasking

von Christian D. (t1000hh)


Lesenswert?

vielen dank für die schnellen Antworten, nun weiß ich woran ich arbeiten 
muss...

von soundso (Gast)


Lesenswert?

900ss D. schrieb:
> Du mußt dich mit Multitasking befassen

Gehts noch ??? Multitasking für LED Blinklicht ???

Troll !!!

von 900ss (900ss)


Lesenswert?

soundso schrieb:
> Gehts noch ???

Warum so patzig?

> Multitasking für LED Blinklicht ???

Schade dass du den Eröffnungspost nicht genau gelesen hast. Da will er 
nicht nur die LEDs blinken lassen sondern andere Dinge nebenher machen. 
Wenn man mehrere Dinge gleichzeitig macht auf einem Prozessor nennt man 
das Multitasking. Egal wie einfach die Aufgabe dabei ist. Das nur um es 
dir genau zu erklären.

Deshalb habe ich den Link auf den Artikel erwähnt, den ich im übrigen 
recht gut finde.

soundso schrieb:
> Troll !!!

Ich hoffe es geht dir jetzt besser.

von ich (Gast)


Lesenswert?


von Manfred G. (magroma)


Lesenswert?

auch ohne Interrupt geht das. Mann muss nur die Pause kleiner machen und 
dafür mit einer For-Next Schleife mehrfach ausführen und in der Schleife 
immer wieder ein Portbit abfragen. Die Laufzeitverlängerung durch die 
zusätzliche Abfrage des Ports ist bei 2 sek. unkrittisch.
So kann man auch bei längeren Pausen trotzdem auf Taste reagieren.

mgf Manfred

von Michael (Gast)


Lesenswert?

Manfred G. schrieb:
> auch ohne Interrupt geht das. Mann muss nur die Pause kleiner machen und
> dafür mit einer For-Next Schleife mehrfach ausführen und in der Schleife
> immer wieder ein Portbit abfragen. Die Laufzeitverlängerung durch die
> zusätzliche Abfrage des Ports ist bei 2 sek. unkrittisch.
> So kann man auch bei längeren Pausen trotzdem auf Taste reagieren.

Sicher, kann man so machen aber warum sollte man wenn man es mit 
Interrupts so schön lösen kann? Außerdem neigt dein Vorschlag zu 
unschönen Bastellösungen denen man später immer noch verfallen könnte. 
Lieber gleich richtig machen ;)

von Manfred G. (magroma)


Lesenswert?

Michael schrieb:
> Sicher, kann man so machen aber warum sollte man wenn man es mit
> Interrupts so schön lösen kann? Außerdem neigt dein Vorschlag zu
> unschönen Bastellösungen denen man später immer noch verfallen könnte.
> Lieber gleich richtig machen ;)

Wenn man sowiso mit Interrupt arbeitet, dann ist das klar. Viele haben 
aber Schwierigkeiten Interupts fehlerfrei zu programieren oder haben 
damit überhaupt nichts am Hut. Dann geht es eben auch Ohne bei kleinen 
einfachen Programmen.

Gruß Manfred

von roy (Gast)


Lesenswert?

@900s:

>Wenn man mehrere Dinge gleichzeitig macht auf einem Prozessor nennt man
>das Multitasking. Egal wie einfach die Aufgabe dabei ist. Das nur um es
>dir genau zu erklären.


BTW: Multitasking gaukelt dir nur vor, dass zwei Task parallel ablaufen. 
Für eine simple LED-Steuerung erscheint es mir ein bisschen übertrieben 
einen Scheduler selbst zu implementieren geschweige denn ein 
Betriebssystem (ev. RTOS) einzusetzen.
Der Einsatz eines Interrupt erscheint mir bei dieser Aufgabe als 
sinnvoll (auch als Übung).

cya

von Willi W. (Gast)


Lesenswert?

roy schrieb:
> BTW: Multitasking gaukelt dir nur vor, dass zwei Task parallel ablaufen.
> Für eine simple LED-Steuerung erscheint es mir ein bisschen übertrieben
> ...
Unbestreitbarer Vorteil gegenüber Polling ist aber, dass nicht durch 
jede Schwankung irgendwelcher Verarbeitungszeiten das Gesamttiming 
verzerrt wird und aus dem Tritt gerät. Bestes Beispiel ist eine Uhr.

von Manfred G. (magroma)


Lesenswert?

Willi W. schrieb:
> Unbestreitbarer Vorteil gegenüber Polling ist aber, dass nicht durch
> jede Schwankung irgendwelcher Verarbeitungszeiten das Gesamttiming
> verzerrt wird und aus dem Tritt gerät. Bestes Beispiel ist eine Uhr.

Es ging ja eigentlich erst mal um das Blinken einer LED. Bei 2 Sek. ist 
es wurscht, wenn die Schleifendauer um 10ms schwankt. Wenns genau werden 
soll dann Timerinterrupt.

mfg Manfred

von Johnny B. (johnnyb)


Lesenswert?

roy schrieb:
> BTW: Multitasking gaukelt dir nur vor, dass zwei Task parallel ablaufen.
> Für eine simple LED-Steuerung erscheint es mir ein bisschen übertrieben
> einen Scheduler selbst zu implementieren geschweige denn ein
> Betriebssystem (ev. RTOS) einzusetzen.

Beim Wort "Multitasking" braucht ja nicht gleich das grosse Muffensausen 
einzutreten. Multitasking verlangt ja kein Betriebssystem, sondern sagt 
nur aus, dass mehrere Dinge quasi gleichzeitig erledigt werden können. 
Also sobald jemand mit Interrupts arbeitet, betreibt er bereits 
Multitasking.

Für die Frage; Also ich würde die LED natürlich auch mittels eines 
Timerinterrupts blinken lassen.
Aber im Prinzip könnte man die Delays auch drin lassen und für die 
Tastendrücke Interrupts verwenden. Entprellen sollte man dann allerdings 
per Hardware (RC-Glied) machen.
Also doch besser gleich mit Timerinterrupt. ;-)

von Falk B. (falk)


Lesenswert?

@  Johnny B. (johnnyb)

>Beim Wort "Multitasking" braucht ja nicht gleich das grosse Muffensausen
>einzutreten. Multitasking verlangt ja kein Betriebssystem, sondern sagt
>nur aus, dass mehrere Dinge quasi gleichzeitig erledigt werden können.

Eben. Aber mal den Artikel Multitasking zu lesen ist ja zuviel 
verlangt.

MFG
Falk

von 900ss (900ss)


Lesenswert?

roy schrieb:
> BTW: Multitasking gaukelt dir nur vor, dass zwei Task parallel ablaufen.

Ja.

> Für eine simple LED-Steuerung erscheint es mir ein bisschen übertrieben
> einen Scheduler selbst zu implementieren geschweige denn ein
> Betriebssystem (ev. RTOS) einzusetzen.

Wo habe ich denn geschrieben, dass ein Scheduler oder gar ein RTOS 
eingesetzt werden soll? Ich habe lediglich auf einen Artikel verwiesen 
der genau dieses einfache Problem schön darstellt und wie man es (ohne 
Scheduler) lösen kann. Scheduler und RTOS werden auch erwähnt aber die 
Beispiele im Artikel zielen auf diese einfache Anwendung ab.



Manfred G. schrieb:
> Es ging ja eigentlich erst mal um das Blinken einer LED.

Nein, lese das Eröffnungsposting nochmal.

Johnny B. schrieb:
> Beim Wort "Multitasking" braucht ja nicht gleich das grosse Muffensausen
> einzutreten. Multitasking verlangt ja kein Betriebssystem, sondern sagt
> nur aus, dass mehrere Dinge quasi gleichzeitig erledigt werden können.
> Also sobald jemand mit Interrupts arbeitet, betreibt er bereits
> Multitasking.

Genau. Und der Artikel Multitasking beschreibt das von Grund auf recht 
gut.

Falk Brunner schrieb:
> Aber mal den Artikel Multitasking zu lesen ist ja zuviel
> verlangt.

Leider ist das wohl der Fall. Da gibt es einen guten Artikel für das 
Thema und es ist zuviel ihn zu lesen. Im Artikel werden die Grundlagen 
gut vermittelt indem ein konkretes Beispiel step by step (ohne 
Scheduler, RTOS  und IRQs übrigens) aufgebaut wird. Besser geht es doch 
garnicht. Da "frickeln" die Leute lieber weiter mit Delays und 
Interrupts u.s.w. rum.

Für die die es doch genauer und besser wissen möchten,der letzte Link im 
Artikel "Get by Without an RTOS" schildert das auskommen ohne RTOS auch 
sehr gut.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Manfred G. schrieb:
> Viele haben aber Schwierigkeiten Interupts fehlerfrei zu programieren...
Das ist ein blödes Argument und hört sich an wie:
Viele haben beim Autofahren Probleme damit, den 2. Gang einzulegen...

Sollen sie dann im immer im 1. Gang fahren?
Oder wäre es langfristig nicht besser, das Schalten zu lernen?

von 900ss (900ss)


Lesenswert?

Lothar Miller schrieb:
> Viele haben beim Autofahren Probleme damit, den 2. Gang einzulegen...

Danke, sehr schön dargestellt :-)

von Nerd (Gast)


Lesenswert?

Und warum empfehlen alle erfahrenen Schlaumeier hier dem OP, von null 
auf Multitasking zu schalten? Es ist auch möglich, in einer simplen 
Schleife eine 7-Segment-Anzeige anzusteuern und "gleichzeitig" eine 
Tastenmatrix abzufragen. Warum sollte man für solch einfache Dinge 
gleich Multitasking einsetzen? Empfehlung an den OP: Probier' das mit 
der for-Schleife. Wenn Du unzufrieden damit bist (Erfahrung erfolgreich 
gesammelt), schau Dir (Timer-)Interrupts an und wenn Du dann immer noch 
unzufrieden bist, mach's mit Multitasking.

von Klaus (Gast)


Lesenswert?

Nerd schrieb:
> Und warum empfehlen alle erfahrenen Schlaumeier hier dem OP, von null
> auf Multitasking zu schalten? Es ist auch möglich, in einer simplen
> Schleife eine 7-Segment-Anzeige anzusteuern und "gleichzeitig" eine
> Tastenmatrix abzufragen. Warum sollte man für solch einfache Dinge
> gleich Multitasking einsetzen? Empfehlung an den OP: Probier' das mit
> der for-Schleife. Wenn Du unzufrieden damit bist (Erfahrung erfolgreich
> gesammelt), schau Dir (Timer-)Interrupts an und wenn Du dann immer noch
> unzufrieden bist, mach's mit Multitasking.

Warum liest du vor dem Antworten den Thread nicht erst durch?

Und wie kommst du auf die blöde Idee, Multitasking bedeutet gleich einen 
Scheduler oder ein RTOS zu programmieren, oder sowas.

Johnny B. schrieb:
> Beim Wort "Multitasking" braucht ja nicht gleich das grosse Muffensausen
> einzutreten. Multitasking verlangt ja kein Betriebssystem, sondern sagt
> nur aus, dass mehrere Dinge quasi gleichzeitig erledigt werden können.
> Also sobald jemand mit Interrupts arbeitet, betreibt er bereits
> Multitasking.

von 900ss (900ss)


Lesenswert?

Nerd schrieb:
> Und warum empfehlen alle erfahrenen Schlaumeier hier dem OP, von null
> auf Multitasking zu schalten? Es ist auch möglich, in einer simplen
> Schleife eine 7-Segment-Anzeige anzusteuern und "gleichzeitig" eine
> Tastenmatrix abzufragen.

Das was du vorschlägst ist Multitasking.

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.