Forum: Mikrocontroller und Digitale Elektronik Anfängerfrage zum Programablauf


von Wilie (Gast)


Lesenswert?

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

von Alex B. (Firma: Ucore Fotografie www.ucore.de) (alex22) Benutzerseite


Lesenswert?

Die Antwort auf deine Frage sind Interrupts...

Schöne Grüße,
Alex

von Wilie (Gast)


Lesenswert?

Läuft ein Interrupt dann so zu sagen auselhalb des Hauptprogram für sich 
selbst ??
Tschau
Wilie

von Stefanie B. (sbs)


Lesenswert?

Hier

www.gidf.de/Interrupt+AVR
oder hier

www.gidf.de/Programmablauf+AVR

:-D

-stef

von Alex B. (Firma: Ucore Fotografie www.ucore.de) (alex22) Benutzerseite


Lesenswert?

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

von Johannes M. (johnny-m)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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.

von Netbird (Gast)


Lesenswert?

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.

von Wilie (Gast)


Lesenswert?

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

von Wilie (Gast)


Lesenswert?

@ 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ß :-)

von Karl H. (kbuchegg)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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 :-)

von Wilie (Gast)


Lesenswert?

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.

:-(

von Herr M. (herrmueller)


Lesenswert?

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.

von Michael U. (amiga)


Lesenswert?

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

von Wilie (Gast)


Lesenswert?

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 :-)

von Wilie (Gast)


Lesenswert?

Bin kurz weg.......

von Herr M. (herrmueller)


Lesenswert?

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.

von Wilie (Gast)


Lesenswert?

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

von Wegstabenverbuchsler (Gast)


Lesenswert?

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

von Wilie (Gast)


Lesenswert?

Supi.... :-)
Dann gehe ich mal da nerven ;-)

Danke
Wilie

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.