und mit And statt AND
Ich weiss nicht ob Bascom casesensitive ist?
Manchmal frage ich mich, wieso meine Generation Geräte ohne Simulation entwickeln konnte?
Groß- und Kleinschreibung ist bei Bascom glaube ich ziemlich egal.
Was definitiv ein Problem zu sein scheint, sind die Klammern. Bascom meckert nämlich auch schon bei einer einfachen, unverschachtelten AND-Verknüpfung, wenn man sie in Klammern setzt. Da die Klammern ja aber aufgrund der Verschachtelung nötig wären, kann man das Problem lösen, indem man die beiden Verknüpfungen mit einem Hilfs-Bit nacheinander ausführen lässt:
Code:Dim Taste_old As Bit Dim Taste_new As Bit Dim X As Bit Dim Modus As Byte Do X = Taste_old Xor Taste_new X = X And Taste_new If X = 1 Then Incr Modus Loop
Dieser Code wird bei mir jedenfalls anstandslos kompiliert.
Und @ Bow-Hunter: Ganz einfach kann man einen Tastendruck erkennen, wenn man den Taster einen Interrupt auslösen lässt, indem der Taster einen Pegelwechsel am Interrupt-Eingangspin bewirkt. Dann braucht man die ganze "Merkerei" mit Taste_old und Taste_new nicht...
So Leute, das ist jetzt die Finale Version von mir. Jetzt funktioniert alles.
Bei Stromzufuhr ist alles aus.
Beim ersten und zweiten schalten blinkt es unterschiedlich.
Beim dritten schalten geht alles wieder aus.
So wollte ich das haben.
Jetzt ein paar Fragen zum Code.
Was bedeutet Dim - As Bit?
und Dim - As Integer?
und Xor?
Diese Begriffe sagen mir noch nichts.
Und wieso muss ich ca. ne halbe Sekunde den Taster drücken bis der Attiny13 reagiert?
Code:$regfile = "attiny13.dat" $crystal = 1200000 $hwstack = 10 $swstack = 10 $framesize = 10 Config Portb.1 = Output Config Portb.2 = Output Config Portb.3 = Output Config Portb.4 = Output Config Pinb.0 = Input Dim Modus As Integer Dim Anzahlmodi As Integer Dim Taste_old As Bit Dim Taste_new As Bit Dim X As Bit Modus = 1 Anzahlmodi = 3 Taste_new = 0 Do Taste_old = Taste_new Taste_new = Pinb.0 X = Taste_old Xor Taste_new X = X And Taste_new If X = 1 Then Incr Modus If Modus > Anzahlmodi Then Modus = 1 Select Case Modus Case 1 Gosub Lichteffekt1 Case 2 Gosub Lichteffekt2 Case 3 Gosub Lichteffekt3 End Select Loop End Lichteffekt1: Portb.1 = 0 Portb.2 = 0 Portb.3 = 0 Portb.4 = 0 Return Lichteffekt2: Portb.1 = 1 Portb.2 = 0 Portb.3 = 1 Portb.4 = 0 Waitms 100 Portb.3 = 0 Portb.4 = 1 Waitms 100 Portb.3 = 1 Portb.4 = 0 Waitms 100 Portb.1 = 0 Portb.2 = 1 Portb.3 = 0 Portb.4 = 1 Waitms 100 Portb.3 = 1 Portb.4 = 0 Waitms 100 Portb.3 = 0 Portb.4 = 1 Waitms 100 Return Lichteffekt3: Portb.1 = 1 Portb.2 = 1 Portb.3 = 1 Portb.4 = 1 Waitms 100 Portb.1 = 0 Portb.2 = 0 Portb.3 = 0 Portb.4 = 0 Waitms 100 Portb.1 = 1 Portb.2 = 1 Portb.3 = 1 Portb.4 = 1 Waitms 100 Portb.1 = 0 Portb.2 = 0 Portb.3 = 0 Portb.4 = 0 Waitms 100 Portb.1 = 1 Portb.2 = 1 Portb.3 = 1 Portb.4 = 1 Waitms 100 Portb.1 = 0 Portb.2 = 0 Portb.3 = 0 Portb.4 = 0 Waitms 100 Return
Hallo Bow-Hunter,
das was du in dem Code jetzt tust nennt sich "pollen" - das bedeutet so viel wie : du fragst den Taster im Hauptprogramm in einem Duchlauf der Hauptschleife ab. Der Grund, warum das jetzt ca 500ms oder etwas genauer sogar ca 600ms dauert, der sollte dir bewußt werden wenn du dir mal überlegst was passiert wenn du eine Unterroutione (gosub) anlegst und dann mit dem Tasterinput dort hin verzweigst? Zeit unempfindlicher wäre ein Interrupt der etwas weiter oben schon vorgeschlagen wurde. Ich empfehle einmal mit dem Cursor auf "Dim" zu gehen und dann F1 zu drücken -> Bascom Hilfe. Zusaätzlich verweise ich mal auf diese Seite (klick mich) - hier findest du unter anderem auch was informatives zum Interrupt.
Viele Grüße
Jörg
Okay, also das mit den 600ms hab ich wohl verstanden. Hätte ich eine Längere Schleife (Loop) so müsste ich halt immer das Ende von ihr abwarten. Bis die Taste Reagiert. Ich werd mich die Tage mal etwas genauer Informieren und versuch dann den Code mal umzubasteln, so das er sofort reagiert.
Danke für die schnellen Antworten.
Naja, fast - wichtig ist hier zu verstehen und auseinander zuhalten was wo passiert. Deine do-loop ist eine Schleife - Die Hauptschleife. Deine Unterroutinen, die du mit Gosub anwählst sind genau genommen nicht mehr Bestandteil diese Schleife. Der Zeitverlust entsteht in diesem Fall nicht in der Hauptschleife, sondern in der Unterroutine - allein zu sehen an den "6x waitms 100" - und natürlich fehlt der Interrupt. Diese Zeitverzögerung die du bemerkst ist also der Moment in dem sich Dein Programm in einer (langen) Unterroutine befindet. Damit hast du übrigens auch den schlechten Nebeneffekt vom pollen direkt bemerkt.
Manche Programme kann man durchaus damit laufen lassen, wenn es aber mal direkt gehen soll dann ist dieser Weg eher schlecht, weil man je nach dem wie lang eine Unterroutine ist dementsprechend warten - bzw den richtigen Moment der Tasterabfrage erwischen muss. Natürlich ist aber die Zeit die der µC benötigt um einmal die do-loop Schleife abzuarbeiten inklusiver der Unterroutinen die angewählt werden. Da kommt es dann eben noch drauf an was in ihnen passiert.
Beim "Case 1" passiert dir das übrigens auch, nur nicht so extrem auffällig weil keine waits drin sind und der Zeitverzug einfach für "uns" nicht direkt wahrnehmbar ist.
Viele Grüße
Jörg
Geändert von HeXPloreR (23.09.2014 um 20:39 Uhr)
Lesezeichen