Schon wieder: Schleife verlassen

dg2ygq

Neues Mitglied
23. Juli 2007
239
0
0
Bielefeld
Sprachen
:eek: Problem:

Code:
Scan:
   Do
   
   Kanal = Kanal + 1
   If Kanal > 80 Then Kanal = 1
   Gosub Ausgabe
   waitms 300

   Loop until Pina.2 = 0
Return

Ich möchte die Schleife verlassen, wenn ich PinA.2 drücke (0). Machts ja auch so weit.
Wenn ich nun PinA.3 drücke, soll das Programm 5sek anhalten. Ist nach 5sek Pina.3 immer noch gedrückt, soll das Programm die Scan-Routine verlassen.
Ist Pina.3 nicht gedrückt (1) solls weiter laufen.
Wäre auch zum Vorteil, wenn Pina.2 auch noch innerhalb der 5sec abgefragt werden könnte.

Hilft mir doch jemand noch mal auf die Sprünge...
Danke
 
Hallo dg2... !

Deinen Lösungsansatz, für deine Aufgabenstellung, finde ich nicht so gut gelungen.

Ich denke auch, dass du deine Aufgabenstellung nicht mit ein paar Zeilen Programmcode zuverlässig realisieren kannst.
Denke schon, dass du da gedanklich noch mal neu ansetzen musst. ;)

Was deinen jetzigen Code betrifft, sind die "waitms 300" auch nicht so praktisch....
Wenn du genau zu Beginn der 300ms den Taster drückst passiert gar nichts.... bis die 300ms abgelaufen sind.
Wenn du also nur mal eben den Taster betätigst, dann dauert das nie 300ms und wenn du Pech hast drückst du noch zig mal auf den Taster.... aber dummerweise immer innerhalb der 300ms Pause.

Ich würde daher die Taster einzeln abfragen und erst dann in den zugehörigen Programmcode springen (GOSUB) bzw. verzweigen (GOTO).
In dem Moment kannst du auch mit DEBOUNCE oder BITWAIT arbeiten und recht sicher in die Routinen springen.
Eine andere Möglichkeit wären auch die externen Interrupts, oder (je nach AVR-Typ) die PCINT-Pins des Controllers.

Was meinst du dazu? :)

Schöne Grüße,
Cassio
 
Hi Micha, hei Cassio,

.... und außerdem würde ich eine Gosub-Routine immer so programmieren, dass ich sie definiert immer nur an einer Stelle verlasse.

1. GOTO's sind in der Programmierwelt total verschrien weil der entstehende Code absolut nicht pflegbar und zunehmend undurchsichtig ist.
2. Randeffekte bei wilden Sprüngen manchmal nicht nachvollziehbar werden.

Meiner Meinung nach kann man durch entsprechende Programmierung auf solche Notbehelslösungen wie z.B. GOTO verzichten. Vielleicht mit etwas mehr Aufwand und Code dafür sauber und strukturiert.

Außerdem würde ich versuche im gesamten Code WAIT komplett zu vermeiden. WAIT bedeutet blockierten Prozessor und die Rechenzeit bzw. die Kontrolle fehlt wieder an anderer Stelle.

Ich kann nur empfehlen mal in den sauren Apfel zu beißen, eine kleine Timer-Routine zu entwickeln zu zyklisch aufgerufen wird und über Zähler und Flags entsprechende Zeitsteuerungen realisieren. Damit entsteht Luft im Hauptprogramm und das Zeug wird kontrollierbar.

Grüße,
Markus
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)