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