Einen externen Interrupt verwenden.
Aber wie ich schon gesagt habe, wenn du von der Programmierung noch nicht soviel Ahnung hast und dir ein fertiger Code mehr helfen würde, muss man den genauen Ablauf des Programms kennen.
Sorry hier is der Code:
Nun habe ich leider das Problem, dass ich die Programme nicht mehr sauber abschalten kann. Is ja auch logisch, da er das Programm erst ganz abarbeiten möchte bevor er stoppt. Also muss man genau im richtigen moment stoppen. Jemand ne idee wie ich das lösen kann?Code:$regfile = M8def.dat $crystal = 3638400 Ddrd = &B11100000 Portd = &B00001100 Declare Sub An Declare Sub Aus Declare Sub Prg1 Declare Sub Prg2 Dim T1 As Bit Dim T2 As Bit Do Debounce Pind.2 , 0 , An , Sub Debounce Pind.3 , 0 , Aus , Sub If T1 = 1 Then Gosub Prg1 End If If T2 = 1 Then Gosub Prg2 End If Loop End An: Toggle T1 Return Aus: Toggle T2 Return Prg1: Portd.5 = 1 Waitms 100 Portd.5 = 0 Portd.6 = 1 Waitms 100 Portd.6 = 0 Portd.7 = 1 Waitms 100 Portd.7 = 0 Return Prg2: Portd.5 = 1 Waitms 400 Portd.5 = 0 Portd.6 = 1 Waitms 400 Portd.6 = 0 Portd.7 = 1 Waitms 400 Portd.7 = 0 Return
Einen externen Interrupt verwenden.
Aber wie ich schon gesagt habe, wenn du von der Programmierung noch nicht soviel Ahnung hast und dir ein fertiger Code mehr helfen würde, muss man den genauen Ablauf des Programms kennen.
Der Code ist mein komplettes programm, es geht halt bei mir immoment nur darum die Grundfunktionen kennenzulernen (LED an LED aus, taster usw.)
Die Funktion vom geposteten Code:
Portd.5 & Portd.6 sind LEDs
Pind.2 & Pind.3 sind Taster
Prg1: Leds blinken abwechselnd "Schnell"
Prg2: Leds blinken abwechselnd "Langsam"
Wenn ich Taster1 drücke soll prg1 laufen bis ich den selber Taster nochmal drücke. Das selbe gillt für Taster2 (Blos das dann halt prg2 läuft). Wenn nun prg1 läuft und ich Taster2 drücke soll prg1 aufhören und prg2 anfangen und umgekehrt.
Dann musst du INT0 und INT1 verwenden. Den Syntax findest du in der Hilfe zum Thema Interrupt.
Ein INT unterbricht das laufende Programm und führt das Programm in der SUB zun INT aus.
In deinem Fall könnte da das togglen stehen.
Ich glaube du hast mich etwas falsch verstanden. Als ich davon sprach das man den genauen Ablauf des Programmes kennen müsste, meinte ich damit, den Funktionsablauf. Was soll wann pasieren.
Es bringt ja nicht viel, einen fertigen Code zu sehen, der offentsichtlich Fehler beinhaltet und man frage wo der Fehler ist.
Die, die den Fehler suchen sollen, müssen ja ganz genau wissen, was eigentlich passieren sollte.
Und ganz genau heisst auch wirklich ganz genau. Dazu gehört dann ggf. welche Funktionen oder Taster Vorrang haben sollen und vieles mehr.
Es muss aber doch noch eine andere Lösung geben um ein laufendes "programm" zu unterbrechen als int0 und int1. Was ist denn wenn ich z.B an 8 eingängen Taster habe und die sollen alle eine unterbrechende Funktion haben?
Das ganze ist kein PC!
Wenn du schreibst waitms 300, dann wartet er auch wirklich 300ms und schaut nicht nebenbei was andere Schalter noch so machen. Der läuft sein Programm Schritt für Schritt von oben bis unten ab und verzeigt auf Anweisung ab und zu mal.
Und selbst der PC (außer Intel's HT im Ansatz) macht das so! Da haben die Steckkarten auch alle einen Interrupt der dann weiteres anfordert.
Bei 8 Tastern könnte man alle Taster zusätzlich mit Dioden von einander entkoppelt auf einen INT legen. Und in der SUB des INT wird dann abgefragt, welcher Taster tatsächlich gedrückt wurde.
Sonst geht es nur, wenn die Taster dauerhaft abgefragt werden. Aber dann ist keine Zeit mehr da um das restliche Programm auszuführen.
Es geht nunmal nur mit Interrupts das Programm zu verlassen.
Aber wenn du sagst, "es muss", musst du ja auch wissen wie :P
ok ich geb mich geschlagen, dann muss ich halt anfangen mit interrupts zu arbeiten.
Hi hardstyleroxx,
sorry, aber hier Interrupts zu verwenden ist eine Verschwendung.
Die Funktion die Du haben willst ist die eines RS-Flip-Flop's.
ACHTUNG - In den folgenden Zeilen fehlen mit Sicherheit Semikola u.s.w. es sollte jedoch klar sein, was gemeint ist. 'Merker' ist eine Bitvariable, mit der der Schalterzustand zwischengespeichert wird. Unter Subroutine sind die Zeilen abgelegt, die Du beim Einschalten abarbeiten willst.
If Pind 1.0 = 1 then 'Wenn der Einschalttaster betätigt wird Merker setzen
Merker = 1
If Pind 1.1 = 1 then 'Wenn der Ausschalttaster betätigt wird Merker löschen
Merker = 0
If merker 0 1 then 'Wenn Merker gesetzt ist in Subroutine verzweigen
gosub Subroutine
: Subroutine
hier steht der Code für die Subroutine
End Of Programm
Grüße Klaus
Eine verrückte Idee ist besser als keine
Diese Zeile wird doch aber nur dann abgearbeitet, wenn das Programm grade an dieser Stelle ist.If Pind 1.0 = 1
Wenn das Programm an der Stelle ist wo ein anderer Pin abgefragt wird, wird der erste(zitierte) nicht erkannt.
Somit ist es doch nicht möglich, das eine blinken zu unterbrechen und sofort zum nächsten zu wechseln.
Ich lass mich auch gerne belehren. Bin heute morgen früh aufgestanden und grade erst nach Hause gekommen. Mag sein das ich estwas unkonzentriert gelesen habe.
Hi Marco78,
Ich sehe gerade, das ich zwei Zeilen vergessen habe.
Richtig wäre :
Sinn und Zweck des Ganzen ist folgender.Code:: Anfang 'Anfang der Endlosschleife If Pind 1.0 = 1 then 'Wenn der Einschalttaster betätigt wird -> Merker setzen Merker = 1 If Pind 1.1 = 1 then 'Wenn der Ausschalttaster betätigt wird -> Merker löschen Merker = 0 If merker = 1 then 'Wenn Merker gesetzt ist -> in Subroutine verzweigen gosub Subroutine Goto Anfang 'Rücksprung zum Anfang : Subroutine hier steht der Code für die Subroutine End Of Programm
Zwischen ':Anfang' und 'Goto Anfang' ist der Programmcode, der die Abfrage der Taster vornimmt. In diesem Fall ist es eine Endlosschleife, die sehr schnell abgearbeitet wird, bis ...
... die Bitvariable 'Merker' gesetzt ist. Wenn der Merker gesetzt ist wird in die Subroutine verzweigt. In der Subroutine muss jetzt gewährleistet werden, daß diese so schnell wie möglich abgearbeitet wird. Das ist zwingend notwendig, damit die Taster so oft wie möglich abgefragt werden können. Waitbefehle sollten so klein wie möglich gewählt werden. Die Kombination eines kurzen Waitbefehles mit einem Zähler führt zu einem langen Wartezeitraum. Mit dem 'Select Case' - Befehl kann der Zählerstand und damit die abgelaufene Zeit in der Subroutine verwendet werden. Das hat jetzt aber nichts mehr mit dem Tasterproblem zu tun.
Grüße Klaus
Eine verrückte Idee ist besser als keine
Lesezeichen