Forum: Compiler & IDEs Abfrage Taster und Timer


von Achim S. (achims)


Lesenswert?

Hallo
Habe den Ablauf mit dem Timer bekommen. Auch die Abfrage eines Tasters 
(einfach) geht. Dort steht aber noch delay drin.
Wollte jetzt die Abfrage Taster mit dem Timer zusammen nehmen. Komme 
leider mit den Klammern total durcheinander. Mein Code:

if (!get_input_bit(IO_INPUT_1))
   {        // Abfrage S3 Port
     if (wait10_merker == 1)    // Steuerung mit merker
       tast++;
       if ( tast == 2 )   // Einstellung Zeit 10ms mal x
     tast = 0;            // Pause Entprellung 20 ms
       if (!get_input_bit(IO_INPUT_1))
         {      // Abfrage S3 bei loslassen
           while (!get_input_bit(IO_INPUT_1))    // Wiederholung 
Schleife
 {    }        // ohne klammer geht nicht

   }
   }

 {
 IO_LEDS_GREEN_PORT = 0x04;  // Green Port auf ein
 IO_LEDS_RED_PORT = 0x08;  // Red ein
 }
 delay(10);      // noch ersetzen durch Timer
 IO_LEDS_GREEN_PORT = 0x00;  // Green Port auf aus
 IO_LEDS_RED_PORT = 0x00;  // Red Port auf aus

Der Impuls alle 10ms kommt damit:

// Bebinn Timer schleife
if (wait10 == 0xFF) {    // Abfrage wai10 - Merker
    wait10_merker=1;
    wait10=0;    }

Kann mir jemand sagen, was ich falsch mache.
achim

von STK500-Besitzer (Gast)


Lesenswert?

Achim Seeger schrieb:
> Komme
> leider mit den Klammern total durcheinander.

Dann solltest du dir mal aufmalen, was du wann bewirken willst.
Sowas nennt man Struktogramm.

von Karl H. (kbuchegg)


Lesenswert?

Achim Seeger schrieb:

> Kann mir jemand sagen, was ich falsch mache.

Deine Frage lautet im Grunde:

Ich komme völlig durcheinander, wenn ich mein Werkzeug völlig wahllos in 
irgendwelche Schachteln, Schubläden und Regalen verteile. Was soll ich 
tun?

Und die Antwort ist ganz einfach: Halte Ordnung! Dann findest du auch 
dein Zeug wieder.

Und mit den { } ist es ganz genau gleich. Wenn du durcheinanderkommst, 
dann musst du eben anfangen Ordnung zu halten.

Jede { kommt auf eine neue Zeile
Jede weitere Zeile, die innerhalb dieser öffnenden { steht, wird um zb 2 
Leerzeichen eingerückt.
Die jeweils schliessende } steht exakt unter der zugehörigen öffnenden 
{, wird also wieder um die bewussten 2 Leerzeichen ausgerückt.
Am Ende einer Funktion muss daher die letzte { der Funktion wieder am 
linken Bildschirmrand stehen. Ist dem nicht so, dann stimmt in deiner 
Schachtelung was nicht, und du musst suchen, wo du den Fehler gemacht 
hast. Das kann sein, dass du wircklich wo eine { oder } vergessen hast, 
das kann aber auch sein, dass du irgendwo mit den Einrückungen nicht 
konsequent warst.


Und dann klappt das auch mit den { } und du kommst nicht mehr 
durcheinander.
1
void foo()
2
{                          // die öffnende Klammer der Funktionb steht ganz
3
                           // links. Alles was danach kommt wird um 2
4
                           // Leerzeichen eingerückt
5
6
  ....
7
8
  if (!get_input_bit(IO_INPUT_1))
9
  {                        // hier ist wieder eine öffnende Klammer
10
                           // also wird danach um 2 weitere Leerzeichen
11
                           // eingerückt
12
    if (wait10_merker == 1)
13
      tast++;              // hier ist zwar keine {, aber diese Anweisung
14
                           // hängt vom if ab und wird daher ebenfalls
15
                           // um 2 Leerzeichen eingerückt
16
17
    if ( tast == 2 )       // dieses if steht auf derselben logischen Ebene
18
                           // wie das if davor. Die gleich tiefe Einrückung
19
                           // macht das auch optisch sichtbar
20
      tast = 0;
21
22
    if (!get_input_bit(IO_INPUT_1))
23
    {                      // wieder eine {: alles nachfolgende wandert
24
                           // wieder um 2 Leerzeichen nach rechts
25
      while (!get_input_bit(IO_INPUT_1))
26
      {                    // Klammer auf
27
      }                    // die Klamnmer zu steht unter der zueghörigen
28
                           // öffnenden Klammer. Selbst dann, wenn wie hier
29
                           // sich nichts in der Klammer befindet.
30
                           // Konsequent sein!
31
32
    }                      // auch diese } kommt in dieselbe Spalte
33
                           // wie die zugehörige öffnende Klammer
34
35
  }                        // und nochmal:
36
                           // wenn ich wissen will, wo die zugehörige
37
                           // öffnende Klammer ist, was daher alles in
38
                           // diesem Block ist, brauch ich nur den Cursor
39
                           // in diese Spalte setzen und zeilenweise nach
40
                           // oben gehen. Irgendwann stosse ich auf
41
                           // die Klammker. Und da konsequent eingerückt
42
                           // wurde, stimmt das dann auch
43
44
  {                        // es wird immer um den gleichen Betrag eingerückt
45
                           // wenn der 2 Leerezeichen sind, dann sind das
46
                           // auch 2 Leerzeichen!
47
    IO_LEDS_GREEN_PORT = 0x04;  // Green Port auf ein
48
    IO_LEDS_RED_PORT = 0x08;  // Red ein
49
  }
50
51
  delay(10);      // noch ersetzen durch Timer
52
  IO_LEDS_GREEN_PORT = 0x00;  // Green Port auf aus
53
  IO_LEDS_RED_PORT = 0x00;  // Red Port auf aus
54
55
  ...
56
}                           // die letzte } muss wieder am linken Rand sein
57
                            // hier sind also alle öffnenden { auch wieder
58
                            // geschlossen worden

Ein sauber strukturiertrer Source Code ist kein Selbstzweck oder ein 
optisches Gimmick sondern ein Werkzeug um den Überblick im Code zu 
behalten.
Also mach das auch! Jetzt! Nicht irgendwann!


Genauso wie man nicht einmal
1
    tast = 0;

und einmal
1
     wait10_merker=1;
schreibt.

Wenn du vor und hinter dem = Leerzeichen machst (etwas, das ich voll und 
ganz unterstütze) dann mach das auch konsequent!

von Achim S. (achims)


Lesenswert?

Hallo KH
danke für deine Erklärung.
In meinem eigentlichen Prg habe ich es drin. Leider nicht so 
ausführlich, wie du es darstellt. Habe ein Problem damit, was ich so 
nicht lösen kann.
Bei meiner Eingabe eines Codes ist die Zeile ziemlich kurz. Das hat zur 
Folge, das es nicht richtig dargestellt wird. Kommentare passen fasst 
gar nicht rein. Eine Darstelllung, wie du es machst, geht nicht.
Mache ich was falsch bei der Einstellung?
achim

von Achim S. (achims)


Lesenswert?

Hallo
ich muss mal was grundlegendes fragen. Da ich scon seit ein paar Tagen 
versuche Codes von einer normalen Programmierung auf Timer umzustellen, 
ist mir was unklar.
Fangen wir mit der einfachen Tastenabfrage an. Ich kann den Port 
abfragen, keon Problem. Die Verabeitung ist aber anders. Die kurze 
Wartezeit habe ich hier bei eigentlich gar nicht. Durch die Timer 
Funktion läuft das Prg ständig weiter. Dadurch muus das verändert 
werden.
Genau so ist es bei der delay Zeit. Bei dem normalen Ablauf stop dr Prz 
und wartet. Nehme ich einen Timer, geht das Pr weiter. Dadurch muss es 
anders gebaut werden.
Es bezieht sich doch auch aufs ganze Prg. Es müssen viele Sachen 
geändert werden. Sehe ich das richtig oder gibt es von den Experten 
Einwände dazu?
Eine Frage daraus ist auch, wie gestalte ich die Abfrage eines Tasters 
mit Timer?

von STK500-Besitzer (Gast)


Lesenswert?

Achim Seeger schrieb:
> Eine Frage daraus ist auch, wie gestalte ich die Abfrage eines Tasters
> mit Timer?

Guck dir die Entprell-Routine von Peter Dannegger in der Codesammlung 
an!

von STK500-Besitzer (Gast)


Lesenswert?

Hier wäre dann auch der Link:
Beitrag "Entprellen für Anfänger"

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.