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