Lagere die zwei unterschiedlichen Routinen in Unterroutinen aus. Also mit sub, gosub usw. Dann wirds übersichtlicher!
Hey,
mein myAVR Board ist da und ich finde es bis jetzt echt serh gut, gab noch keine Probleme.
Habe schon ein paar lauflichter und solche spielereien gebastelt und hänge nun bei der Funktion einen Taster als Schalter zu benutzen.
Ich möchte das wenn ich den Taster an Pind.2 drücke das eine Programm läuft und wenn ich den Taster an Pind.3 drücke das andere. Am besten wäre es dann noch das wenn ich beide taster gleichzeitig drücke kein programm mehr läuft.
Code:$regfile = "m8def.dat" ' Prozessortyp ATmega8 $crystal = 3686400 ' Taktrate Ddrd = &B11100000 ' PD5-PD7 auf Ausgang Portd = &B00001100 ' alle LEDs off, PullUP von PinD2 & 3 An Do ' Beginn Mainloop If Pind.2 = 0 Then ' Wenn Taster 1 gedrückt.. Portd.5 = 1 Waitms 100 Portd.5 = 0 Portd.6 = 1 Waitms 100 Portd.6 = 0 Portd.7 = 1 Waitms 100 Portd.7 = 0 Portd.6 = 1 Waitms 100 Portd.6 = 0 Portd.5 = 1 Waitms 100 Else ' sonst... Portd.5 = 0 Portd.6 = 0 Portd.7 = 0 End If If Pind.3 = 0 Then ' wenn Taster 2 gedrückt... Portd.5 = 1 Portd.7 = 1 Waitms 300 Portd.5 = 0 Portd.7 = 0 Portd.6 = 1 Waitms 300 Portd.6 = 0 Else ' sonst... Portd.5 = 0 Portd.6 = 0 Portd.7 = 0 End If Loop ' Ende Mainloop End ' Programmende '----------------------------------------------------------
Lagere die zwei unterschiedlichen Routinen in Unterroutinen aus. Also mit sub, gosub usw. Dann wirds übersichtlicher!
MfG Xtreme
RP6 Test - alles zum Nachfolger des bekannten RP5 im neuen RP6 Forum!
Könntest du mir das bitte mal an einem Beispiel erklären? Verstehe das nämlich nicht so ganz und die Bascom hilfe verwirrt mich gerade nur ...
Und wie mache ich das denn nun mit der Taster als Schalter Funktion? Ich muss ja irgentwie den zustand vom taster speichern.
Do
If Pind.2 = 0 Then Gosub Test
Loop
Test:
Portd.5 = 1
Waitms 100
Portd.5 = 0
Portd.6 = 1
Waitms 100
und so weiter
Return
$Crystal usw...
Dim T1 as Bit
Dim T2 as Bit
Do
If Pind.2 = 0 then toggle T1
If Pind.3 = 0 then toggle T2
If T1 = 1 then Gosub Taster1
If T2 = 1 then Gosub Taster2
Loop
Taster1:
'hier das Programm für Taster1
Return
Taster2:
'hier das Program für Taster2
Return
Da in den Unterprogrammen selbst schon Wartezeiten eingebaut sind ist das entprellen der Taster nicht notwendig.
Aber die Unterprograme laufen voll durch. Durch drücken eines Tasters wird das Programm nicht abgebrochen!
Um beide als Reset zu verwenden müsste man die Schaltung etwas umbauen. (Und das Progamm anpassen)
Mit GOSUB wird in ein Unterprogramm gesprungen. Mit RETURN geht es wieder dahin zurück von wo aus gesprungen wurde.
TOGGLE schaltet den Zustand um. 0 wird 1, 1 wird 0.
Das Programm ist so noch nicht perfekt. Es wird immer ein Unterprogramm ausgeführt, bis man zufällig zu der Zeit einen Taster drückt, wenn sie abgefragt werden.
Aber da ich deinen gewünschten Ablauf nicht kenne, kann ich es nicht ändern.
Irgentwie bin ich gerade zu dumm. Sitze hier nun 2 Stunden und bekomme es einfach nicht hin eine LED an und aus zu tooglen mitm Taster.
Wäre sehr nett wenn jemand mal gucken kann was in meinem Code falsch ist oder wie es einfacher geht.
Code:$regfile = M8def.dat $crystal = 3686400 Ddrd = &B10000000 ' PD7 auf Ausgang Portd = &B00000100 ' PullUP von PinD2 An Dim T1 As Bit Do ' Beginn Mainloop If Pind.2 = 0 Then ' Wenn Taster1 gedrückt, dann.. Waitms 200 ' 200ms warten If Pind.2 = 0 Then Toggle T1 ' Wenn taster1 immer noch gedrückt, dann Toogle T1 If T1 = 1 Gosub An ' wenn T1 = 1, gehe zum Unterprogramm An Else Gosub Aus ' sonst gehe zum Unterprogramm Aus End If Loop An: Portd.7 = 1 Return Aus: Portd.7 = 0 Return End
hast du es schon mal mit dem befehl: DEBOUNCE versucht?
DEBOUNCE
Action
Debounce a port pin connected to a switch.
Syntax
DEBOUNCE Px.y , state , label [ , SUB]
Remarks
Px.y A port pin like PINB.0 , to examine.
State 0 for jumping when PINx.y is low , 1 for jumping when PINx.y is high
Label The label to GOTO when the specified state is detected
SUB The label to GOSUB when the specified state is detected
Ich bekomme das einfach nicht hin ...
Kann mir mal bitte jemand den ganzen Code sagen, damit die LED an Portd.7 angeht wenn ich den Taster an Pind.2 drücke. Wenn ich nochmal drücke soll sie ausgehen.
Danke schonmal.
Habs schon alleine hinbekommen !
Und wir müssen jetzt dumm sterben und werden den fertigen Code nie seh'n
Er könnte ja den nächsten helfen, die auch das Problem haben und zufällig mal die Suche benutzt haben. Dann müssen die keinen neuen Beitrag eröffnen.
Ich denke das Hauptproblem in deinem Code war die IF-Abfrage.
Schau dir den Syntax für IF mal in der Hilfe genau an.
Entweder:
IF ... THEN ... ELSE
Else kann auch wegfallen.
Oder:
IF...
THEN...
ELSE ...
END IF
auch hier kann Else entfallen. Das wichtige ist das End If! Unter THEN können auch noch viele weitere Befehle stehen.
IF Pind.1 = 0
THEN A=1
B=X
C="Hallo"
ELSE
Y=0
H="H"
END IF
Lesezeichen