Forum: Mikrocontroller und Digitale Elektronik Schalter per Interrupt einlesen


von Duu (Gast)


Lesenswert?

Hallo,

ich habe eine Verständnisfrage. Ich habe ein C-Programm geschrieben, in 
dem eine AD-Wandlung und mehrere Timer abgearbeitet werden. Nun wird 
irgendwann im Programm ein Schalter betätigt. Wenn der Schalter betätigt 
wird, soll das Programm sofort unterbrochen werden und an eine bestimmte 
Stelle springen. Meine Frage nun: Wie muss der Code aussehen um das 
Schalterproblem zu realisieren? Als weitere Info: Es wird ein AT90CAN128 
verwendet. Vielen Dank schon mal im voraus.

von Karl H. (kbuchegg)


Lesenswert?

Duu schrieb:

> Stelle springen. Meine Frage nun: Wie muss der Code aussehen um das
> Schalterproblem zu realisieren? Als weitere Info: Es wird ein AT90CAN128
> verwendet. Vielen Dank schon mal im voraus.

Schalter oder Taster?

Ansonsten: so wie immer
Schalter bzw. Taster werden durch regelmässiges Polling abgefragt und 
entprellt. Elegant geht das mit einer Entprellung, die in einem 
Timer-Interrupt gemacht wird und Auswertung in der Hauptschleife. Sofern 
eventuelles Prellen auf die Programmausführung einen signifikanten 
Einfluss hat und zu Fehlfunktionen führt. Ist das nicht der Fall, dann 
fragt man einfach den Pin in der Hauptschleife ab und gut ists.

> Wenn der Schalter betätigt wird, soll das Programm sofort
> unterbrochen werden und an eine bestimmte Stelle springen.

Es soll nicht 'an eine bestimmte Stelle springen', sondern es soll in 
der Hauptschleife je nach Schalterstellung einen von 2 Zweigen in einem 
if nehmen.

Ansonsten gilt wie immer:
* gewartet wird auf nix und niemanden (ausser vielleicht ganz kurz)
* _delay_ms ist die Wurzel allen Übels, wenn ein Programm scheinbar 
mehrere Dinge gleichzeitig machen soll.

von Stephan (Gast)


Lesenswert?

Karl Heinz Buchegger schrieb:
> * gewartet wird auf nix und niemanden (ausser vielleicht ganz kurz)

Deswegen renne ich immer zur Straßenbahn :-))

von Stephan (Gast)


Lesenswert?

Spaß bei Seite, was Karl Heinz schrieb:

Karl Heinz Buchegger schrieb:
> * gewartet wird auf nix und niemanden (ausser vielleicht ganz kurz)

stimmt schon, ist von der Formulierung halt etwas unglücklich.

Gewartet wird schon, zB. auf Statusflags von LCD oder AD Wandlern.... 
der gleichen. Halt nur eben nicht in der Hauptschleife auf der Stelle 
treten. Diese läuft immer rund rum.

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

Stephan schrieb:
> stimmt schon, ist von der Formulierung halt etwas unglücklich.

Nee nee, war schon richtig. Gewartet wird nicht und wenn, dann nur ganz 
kurz. Beispielsweise um einen Signalpuls auszugeben, der meinethalben 
5µs lang ist.

Stephan schrieb:
> Gewartet wird schon, zB. auf Statusflags von LCD oder AD Wandlern....
> der gleichen.

Das ist dann aber kein 'warten', sondern nur schauen, ob das Flag gestzt 
ist oder nicht. Ist es gestzt, dann darf/soll das Programm etwas 
ausführen, eine Unterroutine etwa. Ist es nicht gesetzt, wird mit dem 
Rest der Hauptschleife weitergemacht. Da wird kein bisschen gewartet.

von Duu (Gast)


Lesenswert?

von diesem Polling habe ich auch schon gehört. Vielleicht fehlt es mir 
an Controllerlogik, aber wie kann ich einen Schalter abfragen, wenn ich 
an einer völlig anderen Stelle des Programms mich befinde. Soviel ich 
weiß, kann der Controller doch immer nur ein Schritt nacheinander 
abarbeiten.

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

Duu schrieb:
> Soviel ich
> weiß, kann der Controller doch immer nur ein Schritt nacheinander
> abarbeiten.

Ja, aber er kann 1 Million Befehle pro Sekunde abarbeiten, wenn er mit 
1Mhz läuft. Wenn er nur 500x pro Sekunde vorbeischaut, ob Dein 
Schalterzustand sich geändert hat, dürfte das den Controller bei 
halbwegs ordentlicher Programmierung gerade mal zu 0.5% auslasten. Wenn 
Du einen Schalter aber mit extra Pin-Interrupt abfragst, kann beim 
Umschalten durch das Prellen des Schalters/Tasters ein Interrupt-Paket 
ausgelöst werden, welches den Controller für diese Zeit von jeglicher 
anderer Arbeit abhält.

von Karl H. (kbuchegg)


Lesenswert?

Stephan schrieb:
> Spaß bei Seite, was Karl Heinz schrieb:
>
> Karl Heinz Buchegger schrieb:
>> * gewartet wird auf nix und niemanden (ausser vielleicht ganz kurz)
>
> stimmt schon, ist von der Formulierung halt etwas unglücklich.

Angebot: Sagen wir 'drastisch formuliert'. Und wie bei allen drastischen 
Formulierungen stimmen sie halt oft, aber eben nicht immer. Ich habs 
zwar versucht mit einem 'ausser viellecicht ganz kurz' abzumildern, aber 
scheinbar war dir das nicht gemildert genug. Ist ok für mich.

von Karl H. (kbuchegg)


Lesenswert?

Duu schrieb:
> von diesem Polling habe ich auch schon gehört. Vielleicht fehlt es mir
> an Controllerlogik, aber wie kann ich einen Schalter abfragen, wenn ich
> an einer völlig anderen Stelle des Programms mich befinde.

Der spingende Punkt ist, dass dein µC rasend schnell ist. Viel schneller 
als du dir vorstellen kannst. Für den ist es kein Problem, den Taster 
ein paar Zehntausend mal in der Sekunde abzufragen und zwischendurch 
immer wieder mal nach der Waschmaschine zu sehen, ob die schon fertig 
ist. Er macht das einfach dauern abwechselnd: Schalter prüfen - 
Waschmaschine prüfen - Schalter prüfen - Washcmaschine prüfen - SChalter 
prüfen - ....

Und als Mensch schaffst du es nicht in diesen kurzen Zeitspannen 
zwischen den Schalterprüfungen einen Taster zu drücken und wieder 
loszulassen. Aus Sicht des µC bewegst und agierst du in extremer 
Superman-Hyper-Zeitlupe.


Genau genommen hast du natürlich recht. Auch ein µC kann nicht 2 Dinge 
exakt gleichzeitg machen (zumindest nicht dein AVR). Aber er kann so 
schnell zwischen den einzelnen Aufgaben wechseln, dass es für dich als 
Mensch so aussieht, als ob das gleichzeitig wäre. Und ob der Wasserhahn 
der Waschmaschine 1 Zehntausendstel Sekunde nach dem fertigen werden des 
Waschgangs früher oder später abgedreht wird, spielt keine wirkliche 
Rolle. Es darf nicht 2 Stunden später passieren, daber das tuts eh 
nicht. Ob 1 Zehntausendstel Sekunde später oder 2, spielt andererseits 
keine wirkliche praktische Rolle.

von Duu (Gast)


Lesenswert?

ich denke, ich habe eine wage Vorstellung, was gemeint ist. Vielen Dank 
für die Infos

von Stephan H. (stephan-)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Angebot: Sagen wir 'drastisch formuliert'. Und wie bei allen drastischen
> Formulierungen stimmen sie halt oft, aber eben nicht immer. Ich habs
> zwar versucht mit einem 'ausser viellecicht ganz kurz' abzumildern, aber
> scheinbar war dir das nicht gemildert genug. Ist ok für mich.

angenommen. :-))
Es ist halt für Beginner etwas schwer zu verstehen.
Timer/ IRQ lernt man ja nicht im Schlaf. Ich tat mich damit 1983 auch 
schwer.
CTC, SIO igitt

von Falk B. (falk)


Lesenswert?

Siehe Multitaksing und Interrupt.

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.