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
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?
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
Hallo, schau dir am besten mal interrupts und Timer an. Damit kannst das Problem lösen. Bei sprut.de findest du viele Information dazu.
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.
Du mußt dich mit Multitasking befassen Hier wird das Prinzip Multitasking ganz anschaulich mit Beispielen erklärt. http://www.mikrocontroller.net/articles/Multitasking
vielen dank für die schnellen Antworten, nun weiß ich woran ich arbeiten muss...
900ss D. schrieb: > Du mußt dich mit Multitasking befassen Gehts noch ??? Multitasking für LED Blinklicht ??? Troll !!!
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.
da ist ein Beispiel: http://www.mikrocontroller.net/articles/Absolute_Beginner-AVR_Steckbrettprojekte
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
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 ;)
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
@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
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.
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
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. ;-)
@ 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
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.
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?
Lothar Miller schrieb: > Viele haben beim Autofahren Probleme damit, den 2. Gang einzulegen... Danke, sehr schön dargestellt :-)
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.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.