Allgemeine Frage zur _delay_ms() Funktion

OP #2167253
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
#2167273
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
#2167285
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.
#2167542
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.
#2167783
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
Gast #2167902
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 ;)
#2168629
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
Gast #2168667
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
Gast #2168691
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.
#2168711
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
#2168712
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. ;-)
#2168791
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
#2168823
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.
Gast #2168907
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.
Gast #2168914
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren