Hallo, ich habe eine Frage zum Ablauf in einem Mikrocontroller Bevor Ihr mich gleich Hänselt und Grätelt, ja ich habe die Suchfunktion bemüht und nein ich habe leider nix gefunden... Also: Wenn ich ein Program in einem AVR ablaufen lasse, geschieht dies ja von oben nach unten im Program. Ich habe aber gelesen, dass es auch Unterprogramme geben kann, in die das Hauptprogram verzweigt. Ich Frage mich, wenn ich in einem solchen Unterprogram bin, läuft mein Hauptprogram doch nicht weiter ?! Jetzt komme ich zum Kern: Hauptprogram fragt einen Schalter ab Wenn Schalter ein, springe zum Unterprogram und lasse eine LED 100 mal blinken (sagen wir in einer Zeit von 10 sek) Danach wieder zurück ins Hauptprogram und irgend etwas anderes machen. Wenn ich aber nach dem Einschalten des LED blinken gleich einen anderen Schalter eingeschaltet habe, der eine 2te LED anschalten soll (im Hauptprogram), muß ich also 10 sek warten ???? Oder kann ich das Unterprogram "Autonom" vor sich hin werkeln lassen ohne dass es mein Hauptprogram ausbremst ?? Mir ist die Vorgangsweise nicht klar...sorry.... Oder bin ich völlig auf dem Holzweg???? Ich hatte bis jetzt noch nie etwas mit Programierung zu tun und tue mich da sehr schwer.... Tja das ist eigentlich schon alles.. Danke für Eure Hilfe Tschau Wilie
Die Antwort auf deine Frage sind Interrupts... Schöne Grüße, Alex
Läuft ein Interrupt dann so zu sagen auselhalb des Hauptprogram für sich selbst ?? Tschau Wilie
Hier www.gidf.de/Interrupt+AVR oder hier www.gidf.de/Programmablauf+AVR :-D -stef
Du kannst den Mikrocontroller so programmieren, dass er zum Beispiel alle 10ms abfragt, ob gerade eine Taste gedrückt ist, egal ob er gerade in "main()" ist oder in einer anderen Funktion...
Wilie wrote: > Läuft ein Interrupt dann so zu sagen auselhalb des Hauptprogram für sich > selbst ?? Es läuft immer nur ein Prozess ab. Ein Interrupt kann den gerade ablaufenden Prozess (das "normale" Hauptprogramm) unterbrechen (engl. to interrupt -> unterbrechen) und einen anderen "Prozess" (ein spezielles Unterprogramm, sog. Interrupt Handler) starten. Nach der Beendigung des Interrupt Handlers wird dann der unterbrochene Prozess (Hauptprogramm) ab der Stelle weiter abgearbeitet, an der der Interrupt aufgetreten ist.
Wilie wrote: > Hallo, > ich habe eine Frage zum Ablauf in einem Mikrocontroller > Bevor Ihr mich gleich Hänselt und Grätelt, ja ich habe die Suchfunktion > bemüht und nein ich habe leider nix gefunden... > > Also: > Wenn ich ein Program in einem AVR ablaufen lasse, geschieht dies ja von > oben nach unten im Program. > Ich habe aber gelesen, dass es auch Unterprogramme geben kann, in die > das Hauptprogram verzweigt. > Ich Frage mich, wenn ich in einem solchen Unterprogram bin, läuft mein > Hauptprogram doch nicht weiter ?! Richtig > Jetzt komme ich zum Kern: > > Hauptprogram fragt einen Schalter ab > Wenn Schalter ein, springe zum Unterprogram und lasse eine LED 100 mal > blinken (sagen wir in einer Zeit von 10 sek) > Danach wieder zurück ins Hauptprogram und irgend etwas anderes machen. > Wenn ich aber nach dem Einschalten des LED > blinken gleich einen anderen Schalter eingeschaltet habe, der eine 2te > LED anschalten soll (im Hauptprogram), muß ich also 10 sek warten ???? Ganz genau > > Oder kann ich das Unterprogram "Autonom" vor sich hin werkeln lassen > ohne dass es mein Hauptprogram ausbremst ?? So einfach nicht. Das was du hier im letzten Absatz beschreibst läuft dann schon in Richtung 'Multithreading'. Mehrere 'Fäden' (engl. thread) laufen quasi gleichzeitig parallel ab. Das ist aber noch nichts für dich. > Mir ist die Vorgangsweise nicht klar...sorry.... > Oder bin ich völlig auf dem Holzweg???? Im Moment ja. Des Rätsels Lösung liegt in der Hardware begründet. Es gibt sowas wie einen Zeitgeber, einen Timer. Und in regelmässigen Abständen kann dieser Timer deinen normalen Programmfluss unterbrechen. Das nennt man dann einen Interrupt. Ist um Grunde so wie im Büro: Du arbeitest still und leise stundenlag vor dich hin und regelmäßig alle 10 Minuten kommt dein Chef rein und zwingt dich die Lampe ein bzw. auszuschalten. Für jemanden ausserhalb des Gebäudes sieht es dann so aus, als ob du die ganze Zeit damit beschäftigt wärst 10 Minuten abzuwarten und die Lampe umzuschalten. Während du in Wirklichkeit nur ganz wenig Zeit für das Bedienen der Lampe brauchst und an deiner eigentlichen Arbeit arbeiten kannst.
Du könntest aber auch ohne Interrupt bei Betätigung des 2.Schalters durch geeignete Wiederholschleife aus dem Unterprogramm aussteigen und zum Hauptprogramm zurückspringen, dann blinkt's allerdings auch nicht 100 mal.
Ajo..... :-) Dann ist es also Rahtsamer: 1 Schalter ein 2 Eingang 1 abfragen 3 Nö... Schalter ist aus 4 Wenn Schalter ein , weiter 5 Ausgang 1 auf high ------ externer Blinkgeber läuft 6 Engang 2 abfragen 7 Nö...Schalter ist aus 8 jep....schalter 2 ist ein,weiter 9 Ausgang 2 auf high 10 und das ganze wieder von vorne Aber !! Ich muß jetzt weitere Hardware dazubauen um das blinken zu realisieren......das kann es aber doch nicht sein oder ??????? Tschö Wilie
@ Karl Heinz, schönes Beispiel mit dem Chef :-) Was aber wenn kurz nach dem Chef meine Kollegin auch rein kommt und die möchte, dass ich 11 min bei Ihr, sagen wir Kaffee trinke? Dann kommt Chef nach 10 min wieder und ich bin nicht da ?! Das gibt nen fetten Anschiß :-)
Wilie wrote: > Aber !! Ich muß jetzt weitere Hardware dazubauen um das blinken zu > realisieren......das kann es aber doch nicht sein oder ??????? Die Hardware ist in deinem AVR schon eingebaut :-) Du musst sie nur aktivieren und konfigurieren. Kennst du die beiden Tutorial Seiten hier: http://www.mikrocontroller.net/articles/AVR-Tutorial http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial
Wilie wrote: > @ Karl Heinz, > > schönes Beispiel mit dem Chef :-) > > Was aber wenn kurz nach dem Chef meine Kollegin auch rein kommt und die > möchte, dass ich 11 min bei Ihr, sagen wir Kaffee trinke? > Dann kommt Chef nach 10 min wieder und ich bin nicht da ?! > Das gibt nen fetten Anschiß :-) Um bei der Analogie zu bleiben: Sobald du auf einen Kaffe gehst, kriegt dein Chef die Tür nicht mehr auf. Erst wenn du vom Kaffe wieder zurück kommst, kommt der wieder bei dir rein. Und das beste: der merkt noch nicht mal, dass du in der Zwischenzeit nicht da warst. Allerdings verkürzt sich dann das Zeitintervall bis zum nächsten Besuch entsprechend. SO dämlich ist der dann doch wieder nicht. Aber du willst natürlich nicht allzulang Kaffee trinken, damit du den Zeitplan von 10 Minuten wenigstens ungefähr einhalten kannst. Wenn du nur 0.5 Sekunden lang nicht da bist, die Lampe also um diesen Zeitraum zu spät angeht, merkt das da draussen niemand :-)
Ja, ich habe mir auch zwei Bücher besorg eines von W.Trampert - AVR Risc Microcontroller und eines von Kühnel Programieren mit Bascom AVR. Davon bin ich aber noch Galaxien entfernt, was da geschrieben ist. :-(
Interrupt Programmierung ist für den Anfang allerdings nicht so einfach. man könnte es auch ohne machen. 1 Frage BlinkSchalter ab , wenn an, dann Blinkzähler auf 100 Setzen 2 wenn Blinkzähler > 0, dann 1 mal Blinken und Blinkzähler 1 runterzählen 3 Frage Schalter 2 ab , wenn an, dann 2 Led an. 4 ... 5 wieder von vorne damit verkürzt sich die Wartezeit auf 1 mal Blinken. Du könntest auch den Zähler auf 1000 setzten und nur jedes 10te Mal blinken ... Unterprogramme laufen nie alleine nebenher. Sinn: wenn ein Programmteil mehrmals vorkommt, nuss man es nicht jedesmal in das Programm schreiben, sondern nur einmal und es wird dann von verschiedenen Stellen aufgerufen. Das spart Speicher und ist übersichtlicher.
Hallo, @Wilie: naja, dann muß der Chef auch bei Deiner Kollegin nachschauen... Macht er das nicht, wäre also der Interrupt gesperrt, sobald Du Dein Büro verläßt. Du kannst das also ohne weiteres verändern, wenn Du statt des Chefs einen Wecker nimmst, der alle 10 min klingelt und den Du eben immer mitnehmen mußt, dann paßt das auch wieder. Wenn Du jetzt noch dahin erweiterst, daß Du die Lampe an einen anderen Ort bringst, muß Du erst hinlaufen, ein(aus)schalten und wieder zurücklaufen. Dazu bleibt der Wecker aber im Büro (Interrupt gesperrt). Wenn jetzt die Lampe so weit weg steht, daß Du Hin- und Rückweg in den 10 min bis zum nächsten Klingeln nicht mehr schaffst, dann weißt Du auch gleich, warum die Laufzeit der Interruptroutine so kurz wie möglich sein sollte. Ist die Laufzeit (zur Lampe und zurück ;)) länger, schaffst Du dazwischen immer weniger Deiner Arbeit und irgendwann verpaßt Du den nächsten Interrupt... Gruß aus Berlin Michael
Aber wie kann ich jetzt mein kleines Beispiel des LED Blinkers und der 2 Schalter lösen ? Ich brauche kein fertiges Program, sondern nur den Weg, wie man so etwas macht.... Die Befehle usw. lese ich mir selber an, sonst macht es keinen Sinn, vorgekautes gibs genug :-)
Nochmal: 1. Frage BlinkSchalter ab , wenn an, dann Blinkzähler auf 100 Setzen 2. wenn Blinkzähler > 0, dann 1 mal Blinken und Blinkzähler 1 runterzählen 3. Frage Schalter 2 ab , wenn an, dann 2 Led an. 4 ... 5. wieder von vorne damit verkürzt sich die Wartezeit auf 1 mal Blinken. Du könntest auch den Zähler auf 1000 setzten und nur jedes 10te Mal blinken ... - ohne Interrupt - ohne Unterprogramm. Beim programmieren Warteschleifen fürs Blinken nicht vergessen, sonst wirds einem schwindlig, so schnell blinkt es.
hat doch etwas länger gedauert, aber ich finde es klasse, dass Ihr mir alle helft !!!!!! Ich werde morgfen wieder rein schauen und sicher steige ich dann auch hinter die Kulissen... ist ja kein Teufelswerk :-) Bis dann.... n8 Wilie P.S.die letzten 3 Post`s haben sich wohl etwas überschnitten..sorry
@Wilie: Es guibt hier auch einen "Chat" (sieh mal links oben) Wenn die Kundigen grade anwesend sind, dann kannst du ja auch mit dneen CHatte, dann wirds nicht so ein langer getippter thread....
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.