Jepp,
habt ihr geschafft!
Probiere jetzt erst einmal Daniel´s Idee dann arbeite ich mich zu euren durch!
Vielen Dank!!
Viele Grüße,
P@
Das stimmt, aber auch dafür gäbe es eine Lösung (um den armen p@ty komplett zu verwirren):Schönheitsfehler: Solange die Taste gedrückt ist, wird übriges Programm aufgehalten.
Man konfiguriert den 16-Bit-Timer so, dass er deutlich länger als 6 Sekunden für einen Durchlauf braucht. Z.B. mit einer Taktfrequenz von 1 MHz (die für diese Anwendung ja locker reichen müsste) und einem Prescaler von 1024, macht knapp 1000 Counts pro Sekunde. Der Timer läuft kontinuierlich durch.
Der Taster wird an einem Change-konfigurierten Interrupt-Eingang angeschlossen. Bei fallender Flanke (Beginn Tastendruck) wird der aktuelle Timer-Wert in eine erste Word-Variable übernommen, bei steigender Flanke (Ende Tastendruck) in eine zweite Word-Variable. Zieht man den ersten Wert vom zweiten ab weiß man, wie lange der Taster gedrückt wurde (und zwar auch, wenn der Timer zwischendurch übergelaufen ist). Dann noch ein kleines Flag nach der steigenden Flanke gesetzt, das in der Hauptschleife das Ende des Tastendrucks signalisiert - fertig!
Jepp,
habt ihr geschafft!
Probiere jetzt erst einmal Daniel´s Idee dann arbeite ich mich zu euren durch!
Vielen Dank!!
Viele Grüße,
P@
Hey zusammen,
hab´ Daniel´s Code getestet aber leider kam vom µC keinerlei Reaktion?...
Hier noch der Vollständigkeit halber mein Code mit allen Schaltmöglichkeiten:
Led1 oder Led2 oder Led3,
Led1 und Led2,
Led1 und Led3,
Led2 und Led3,
Led1 und Led2 und Led3.
Der tut´s wenn auch sicherlich nicht sehr effektiv...
Viele Grüße,Code:$regfile = "M168def.dat" $crystal = 16000000 $hwstack = 100 $swstack = 100 $framesize = 100 $baud = 9600 'Pin- Portkonfiguration Outputs Config Portc.0 = Output Led1 Alias Portc.0 Portc.0 = 0 Config Portc.1 = Output Led2 Alias Portc.1 Portc.1 = 0 Config Portb.1 = Output Led3 Alias Portb.1 Portb.1 = 0 'Pin- Portkonfiguration Inputs Config Pind.4 = Input Taster Alias Pind.4 Portd.4 = 1 Dim A As Byte Dim X As Word Declare Sub Lichtszenen(byval B As Byte) 'Hauptprogramm Do If Taster = 0 Then 'Wenn Taster = 0 dann... Incr X 'X incrementieren... Print X 'sonst X = 0 Else X = 0 End If If X >= 200 Then 'Wenn X >= 200ms dann... Gosub Lichtszenen 'Sprung in Unterprozedur Lichtszene End If If A = 1 And Taster = 0 Then 'Wenn Variable A = 1 und Taster = 0 dann... Led1 = 1 'Led1 an Led2 = 0 Led3 = 0 Elseif Taster = 1 And A = 1 Then 'Led1 aus Led1 = 0 Led2 = 0 Led3 = 0 End If If A = 2 And Taster = 0 Then 'Wenn Variable A = 2 und Taster = 0 dann... Led1 = 0 'Led2 an Led2 = 1 Led3 = 0 Elseif Taster = 1 And A = 2 Then 'Led2 aus Led1 = 0 Led2 = 0 Led3 = 0 End If If A = 3 And Taster = 0 Then 'Wenn Variable A = 3 und Taster = 0 dann... Led1 = 0 'Led3 an Led2 = 0 Led3 = 1 Elseif Taster = 1 And A = 3 Then 'Led3 aus ...usw... Led1 = 0 Led2 = 0 Led3 = 0 End If If A = 4 And Taster = 0 Then Led1 = 1 Led2 = 0 Led3 = 1 Elseif Taster = 1 And A = 4 Then Led1 = 0 Led2 = 0 Led3 = 0 End If If A = 5 And Taster = 0 Then Led1 = 0 Led2 = 1 Led3 = 1 Elseif Taster = 1 And A = 5 Then Led1 = 0 Led2 = 0 Led3 = 0 End If If A = 6 And Taster = 0 Then Led1 = 1 Led2 = 1 Led3 = 0 Elseif Taster = 1 And A = 6 Then Led1 = 0 Led2 = 0 Led3 = 0 End If If A = 7 And Taster = 0 Then Led1 = 1 Led2 = 1 Led3 = 1 Elseif Taster = 1 And A = 7 Then Led1 = 0 Led2 = 0 Led3 = 0 End If Loop End 'Unterprozedur Sub Lichtszenen If Taster = 0 Then Incr X 'Wenn Tatser = 0 dann Incrementiere X If X >= 200 Then A = 1 'Wenn X >= 200ms dann Variable A = 1 If A = 1 Then 'Wenn A = 1 dann... Led1 = 1 Led2 = 0 Led3 = 0 End If If X >= 750 Then A = 2 If A = 2 Then 'Wenn X >= 750ms dann Variable A = 2 Led1 = 0 'Wenn A = 2 dann... Led2 = 1 Led3 = 0 End If If X >= 1250 Then A = 3 'Wenn X >= 1250ms dann Variable A = 3 If A = 3 Then 'Wenn A = 3 dann... usw... Led1 = 0 Led2 = 0 Led3 = 1 End If If X >= 1750 Then A = 4 If A = 4 Then Led1 = 1 Led2 = 0 Led3 = 1 End If If X >= 2250 Then A = 5 If A = 5 Then Led1 = 0 Led2 = 1 Led3 = 1 End If If X >= 2750 Then A = 6 If A = 6 Then Led1 = 1 Led2 = 1 Led3 = 0 End If If X >= 3250 Then A = 7 If A = 7 Then Led1 = 1 Led2 = 1 Led3 = 1 End If If Taster = 1 Then 'Wenn Taster losgelassen wird dann... Led1 = 0 Led2 = 0 Led3 = 0 End Sub End If
p@
Hey,
ja bei dem Code handelt es sich auch nur um deinen Code in gekürzter Form
Wirklich Fehler hatte ich da noch nicht drin gesucht :P
Schaut ruhig mal auf meiner Homepage vorbei :
http://kampis-elektroecke.de
Oder folge mir auf Google+:
Daniel Kampert
Es gibt 10 Arten von Menschen. Die einen können Binär, die anderen nicht.
Gruß
Daniel
Hey Daniel,
ach so! Okay, dann war da wohl noch der Wurm drin! ^^
Kannst ja bei Gelegenheit meinen letzten mal aus probieren.
Was ich da noch nicht blicke ist die Geschichte mit dem "declareSub (byval b as Byte)" ...wobei doch "A" die Variable in der Unterprozedur ist...?
Viele Grüße,
P@
Mit dem Declare Sub definierst du ein Unterprogramm. Den Wert den du mit dem Aufruf ins Unterprogramm übergibst, nennst du "b" und er ist vom Typ "Byte".
Innerhalb des Unterprogramms heißt die Variable dann ebenfalls "b" und du kannst diese dann natürlich auch weiter verarbeiten.
Schaut ruhig mal auf meiner Homepage vorbei :
http://kampis-elektroecke.de
Oder folge mir auf Google+:
Daniel Kampert
Es gibt 10 Arten von Menschen. Die einen können Binär, die anderen nicht.
Gruß
Daniel
...okay, dann blicke ich aber immer noch nicht warum mein Programm läuft. Denn von der Variablen b steht nichts in der Unterprozedur...??
Viele Grüße,
p@
Hey,
in dem Unterprogramm greifst du nur auf globale Variablen (A und X zu).
Globale Variablen sind Variablen, die du am Anfang deines Hauptprogrammes deklariert hast. Diese Variablen stehen dann sowohl im Hauptprogramm als auch in jedem Unterprogramm zur Verfügung.
Lokale Variablen sind Variablen die du innerhalb eines Unterprogramms deklariert hast. Diese stehen dem entsprechend nur im Unterprogramm zur Verfügung.
Variablen die beim Funktionsaufruf deklariert werden (dein b) sind Variablen für ein Unterprogramm, also lokale Variablen.
Du kannst z.B schreiben.
schreiben. Damit deklarierst du eine Variable "Variable" = 1 und ein Unterprogramm. Das Unterprogramm rufst du anschließend auf und die Variable "Variable" wird übergeben (eine KOPIE von "Variable" wird übergeben). Der Wert der Variable "Variable" steht dann innerhalb der Funktion unter dem Namen "Test" zur Verfügung (halt der Name den du in der Unterprogrammdeklaration festgelegt hast).Code:Variable1 = 1 Declare Sub MeinUnterprogramm(byval Test as Byte) Do MeinUnterprogramm(Variable) Loop End Sub MeinUnterprogramm(byval Test as Byte) Local NeueVariable as Byte NeueVariable = Test Print NeueVariable End Sub
Innerhalb dieses Unterprogramms wird eine lokale Variable mit Namen "NeueVariable" deklariert und diese Variable bekommt den Inhalt der Variable "Test".
Da "Test" aber nun den Wert von der Variable "Variable" besitzt, besitzt die Variable "NeueVariable" dementsprechend den Wert von "Variable", also 1.
Dieser Wert wird mittels "Print" ausgegeben.
Mit diesem Programm kannst du mal ein bisschen rumspielen um dich mit der Werteübergabe vertraut zu machen. Es (sollte) funktionieren (nicht getestet sondern einfach nur aus dem Kopf aufgeschrieben). Falls nicht -> PM dann schaue ich heute Mittag drüber.
Auf dein Programm übertragen kann man also sagen, dass du den Teil "byval B As Byte" löschen kannst, da du die Variable "b" eh nicht nutzt.
Funktioniert dein Programm den jetzt richtig? Und wenn nicht was funktioniert nicht.
Wollte das heute u.U. mal auf meinem RN-Control nachstellen.
Geändert von Kampi (14.03.2013 um 09:27 Uhr)
Schaut ruhig mal auf meiner Homepage vorbei :
http://kampis-elektroecke.de
Oder folge mir auf Google+:
Daniel Kampert
Es gibt 10 Arten von Menschen. Die einen können Binär, die anderen nicht.
Gruß
Daniel
Hi Daniel,
okay, es wird transparenter!
Ja, das Programm läuft! Wäre klasse wenn Du´s mal testen könntest und mir en´ feedback geben würdest!
Danke schon mal!!
Viele Grüße,
p@
Ok
Ich schau es mir mal an wenn ich Zeit habe
Schaut ruhig mal auf meiner Homepage vorbei :
http://kampis-elektroecke.de
Oder folge mir auf Google+:
Daniel Kampert
Es gibt 10 Arten von Menschen. Die einen können Binär, die anderen nicht.
Gruß
Daniel
Lesezeichen