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