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.
Karl Heinz Buchegger schrieb: > * gewartet wird auf nix und niemanden (ausser vielleicht ganz kurz) Deswegen renne ich immer zur Straßenbahn :-))
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.
ich denke, ich habe eine wage Vorstellung, was gemeint ist. Vielen Dank für die Infos
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
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.