Ich melde mich zurück ( hatte ich keine Zeit )
Ich bräuchte mal ein paar Tipps von Euch. Ich möchte für eine meine
Tochter eine kleine Nachttischlampe bauen. es soll eine kleine RGB LED
lampe sein.
Alle Farben sollen durchgedimmt werden.
Funktioniert soweit schon so gut, ist mal wieder ein kleines BASCOm
Anfänger Projekt.
Folgende Frage :
Wenn ich in der SUB Zeit keine Waitms eintrage, läuft alles sehr schnell
ab. Wenn ich Waitms 1 eintrage ist es zu langsam....fading...
Wenn ich an der Precale "schraube", dann flackern die LEDS...
Wo liegt der "Gedankenfehler" ?
Wäre dankbar wie immer für Eure Tipps.
Der Code :
Thomas Kiss schrieb:> Wenn ich in der SUB Zeit keine Waitms eintrage, läuft alles sehr schnell> ab. Wenn ich Waitms 1 eintrage ist es zu langsam....fading...
Zwischen nichts und WAITMS gibt es immer noch WAITUS
Zu finden in der BASCOM Hilfe (wie immer)
Es geht nun weiter, ich bräuchte einige Tipps wie ich folgendes lösen
könnte:
Folgende Aufgabenstellung habe ich mir überlegt :
In der main Schleife ist ein Taster hinterlegt, wenn Taster ist 0 dann
SuB Fader sonst Farbe.
In der SUB Fader, soll mein RGB Fader laufen (PWM), was soweit okay ist,
In der SUB Farbe möchte ich fixe Werte hinterlegen.
Nun kommt es bei mir zu seltsame Flattereffekte...
Die nächste Frage wäre, in der Main habe ich
Do
If Taster then
else
end if
Loop
Fader:
Do
....
loop
Return
Farbe :
Rot=xxx
Blau:YYY
Grün=ZZZ
Return
Wie kann ich es verwirklichen wenn ich in der SUB drin bin, daß ich
wieder, wenn der Taster gedrückt wird,aus der SUB rauskomme ???
Vielen Dank, wie IMMER für Eure gute Tipps !!!
>Wie kann ich es verwirklichen wenn ich in der SUB drin bin, daß ich>wieder, wenn der Taster gedrückt wird,aus der SUB rauskomme ???
Tasterbetätigung mitzählen lassen und Befehle wie While-Wend
verwenden.
Es gibt sicher noch andere Möglichkeiten.
Wigbert
>Nicht ganz kapiert...hmmmm
na dann zeig mal den Code, wo der Taster definiert ist.
Dann könnte man das in der Sim. nehmen.
Ich mach mir gerne kleine Code, um zB. um Tasterfunktionen zu
testen. Les mal den Befehl Debounce in der Bascom Hilfe auch nach.
Wigbert
PS. Der Nachttischlampenaufbau würde mich interessieren.
Wigbert Picht-dl1atw schrieb:> Wigbert>>>> PS. Der Nachttischlampenaufbau würde mich interessieren.
Wenn das Projekt fertig ist, dann poste es hier..
Es wird 2 Varianten geben.
V1 - nur Fader
V2 - mit Eintstellungen
V1 ist vom code her soweit fertig...
So..ganz simple erstemal ohne Debounce als extra sub...
Code nur als "Gerüst" ohne Timer PWM declaration..
***Main
Do
If Taster1 = 0 Then
Gosub Fader
Else
Gosub Farbe
End If
Loop
* SUB Farbe*****************
Farbe:
Gruen = 100
Rot = 100
Blau = 100
Return
***Sub Fader*****************
Fader:
'Grün einfaden
'-------------
Do
Incr Gruen
Loop Until Gruen > 254
'Rot ausfaden
'------------ Do
Decr Rot
Loop Until Rot = 0
Loop
Return
............
Die andere Möglichkeit wäre :
//////////////////////////////
do
Debounce Pind.1 , 0 , Modus , Sub
loop
Modus:
incr Modus
if Modus > 3 then
Modus=1
end if
return
//////////////////////////////
dann in Main
//////////////////////////////
do
if Modus =1 then
gosub Fader
if Modus =2 then
gosub Farbe
loop
>if Modus > 3 then
if Modus >2 (das wäre dann 3)
>incr Modus
incr Tasterzaeler (def. nicht Modus 2x)
if Modus > 3 then
Modus=1
> hier sprigt er nach Fader (beabsichtigt)
Portdeklaration hätten wir gerne gesehen
Wigbert
ach ja, vergessen
>do>if Modus =1 then>gosub Fader> if Modus =2 then>gosub Farbe>loop
das gespringe ist nicht gut,
aus Do-Loop kommste nicht raus.
Poste mal die Tasterfunktion:
Taster= 1 gehe "dorthin"
Taster= 2 gehe "woandershin"
Taster= 3 gehe "irgendwohin"
damit ich den Sinn deines Code kapiere.
Stell mal ein kompletten Code mit Debounce für die Tasterfunktion
hier rein, den ich in der Sim. testen kann. AVR; Pin; Ports....+Code
Fleissigen Nachmittag noch.
Wigbert
Dannnnnnnnnnnnnke..erstmal...ich habe hier im Büro (auch) mal kurz
folgendes gemacht.
meine erste Variante nur Fader habe ich kurz erweitert..
Complette Code :
$regfile = "m8def.dat"
$crystal = 16000000
Dim Pwmctr As Byte '
Dim Rot As Byte
Dim Gruen As Byte
Dim Blau As Byte
Config Timer0 = Timer , Prescale = 1
On Ovf0 Pwm_interrupt
Enable Ovf0
Enable Interrupts
Ddrb = &B11111111
Ddrd = &B11111111
Portb = 0
Portd = 0
Portb.0 = 0
'Taster1 Mode einstellen
Config Pinc.5 = Input
Portc.5 = 1
Taster1 Alias Pinc.5
'*******************
'***Hauptprogramm***
'*******************
Do
If Taster1 = 0 Then
Gosub Fader
Else
Gosub Farbe
End If
Loop
Farbe:
Gruen = 100
Rot = 100
Blau = 100
Return
Fader:
'Grün einfaden
'-------------
Do
Incr Gruen
Gosub Zeit
Loop Until Gruen > 254
'Rot ausfaden
'------------
Do
Decr Rot
Gosub Zeit
Loop Until Rot = 0
'Blau einfaden
'-------------
Do
Incr Blau
Gosub Zeit
Loop Until Blau > 254
'grün ausfaden
'-------------
Do
Decr Gruen
Gosub Zeit
Loop Until Gruen = 0
'Rot einfaden
'------------
Do
Incr Rot
Gosub Zeit
Loop Until Rot > 254
'Blau ausfaden
'-------------
Do
Decr Blau
Gosub Zeit
Loop Until Blau = 0
'Loop
Return
Zeit:
Waitus 100
Return
Pwm_interrupt:
Incr Pwmctr
If Rot > Pwmctr Then Set Portd.7 Else Reset Portd.7
If Rot > Pwmctr Then Set Portd.4 Else Reset Portd.4
If Rot > Pwmctr Then Set Portd.1 Else Reset Portd.1
If Rot > Pwmctr Then Set Portc.2 Else Reset Portc.2
If Gruen > Pwmctr Then Set Portd.6 Else Reset Portd.6
If Gruen > Pwmctr Then Set Portd.3 Else Reset Portd.3
If Gruen > Pwmctr Then Set Portd.0 Else Reset Portd.0
If Gruen > Pwmctr Then Set Portc.1 Else Reset Portc.1
If Blau > Pwmctr Then Set Portd.5 Else Reset Portd.5
If Blau > Pwmctr Then Set Portd.2 Else Reset Portd.2
If Blau > Pwmctr Then Set Portc.3 Else Reset Portc.3
If Blau > Pwmctr Then Set Portc.0 Else Reset Portc.0
Return
/////////////////////////////////////
Nun folgende Probleme :
in der Main muss ich
do
...
Loop
verwenden, damit der Status vom taster abgefragt wird.
im SUB wo der Fader läuft kann ich keine do /loop einbauen (
Auskommentiert )
Deshalb war meine Grundsätzliche Frage wie ich in SUB do Loop machen
kann und zusätzlich einen Schalter auch mit do Loop "Überwachen kann..
Naja bin noch Anfänger, merkt man..
2. Projekt...LoL
noch ganz Kurz:
Du hast doch jetzt den Flag Tasterzaehler.
######################
Hauptprogramm:
Tastenzaehler = 0 (?)
Do
Debounce Pind.1 , 0 , Modus , Sub
Fader
Farbe
Tasterzaehler = 0 (oder in der letzten Sub zurücksetzen)
Loop
######################
meine Subs:
Modus:
Incr Tastenzaehler
return
Sub Fader
if Tastenzaehler = 1 Then
"hier mach was Du willst"
end if
End Sub
Sub Farbe
if Tastenzaehler = 2 then
"buntes Farbenspiel
end if
End sub
######################
jetzt steht das Menu und Du kanst schrittweise mit den
Subs spielen und vervollständigen. Es wird zwar jede Sub
angesprungen, aber der Tastenzaehler sorgt für die bebsichtigte
Sub.
Wo ist eigentlich Aus?
Wigbert
jetzt bin ich aber weg.
Mir ist folgendes eingefallen :
geht es überhaupt ?
in der Fader SUB eine "unter Sub einbauen"...
Variante 1 :
im Klartext, den Taster in die Sub verschieben und dort die Werte
zuweisen ?
Fader :
if taster1=0 then
rot=100
grün=100
Blau=100
exit sub
Variante 2: keine SUB für Fader und Farbe, alles in der Main ?
Natürlich kann man alles ins Hauptprogramm kloppen.
Mit dem Erfolg, das niemand mehr durchsieht und die
Fehlersuche extrem aufwendig ist.
Wenn Du Gosub Zeit meinst, ist der Sprung wohl ein Witz.
wegen Waitus 10 ein Sprung machen, zu faul das mehrmals zu schreiben?
Schade um den Speicherplatz.
Bleib bei Debounce, dann ist der Taster wenigsten entprellt.
Das Rücksetzen von Tasterzaehler ist nicht richtig.
>Tasterzaehler = 0 (oder in der letzten Sub zurücksetzen)
if Tastenzaehler = 3 then
Tastenzaehler = 0
End if
Wigbert
Wo ist der Fehler ?
$regfile = "m8def.dat"
$crystal = 16000000
Dim Pwmctr As Byte '
Dim Rot As Byte
Dim Gruen As Byte
Dim Blau As Byte
Dim Tastenzaehler As Byte
Config Timer0 = Timer , Prescale = 1
On Ovf0 Pwm_interrupt
Enable Ovf0
Enable Interrupts
Ddrb = &B11111111
Ddrd = &B11111111
Portb = 0
Portd = 0
Portb.0 = 0
'Taster
Config Pinc.5 = Input
Portc.5 = 1
Taster Alias Pinc.5
Tastenzaehler = 1
'*******************
'***Hauptprogramm***
'*******************
Do
Debounce Pinc.5 , 0 , Modus , Sub
Modus:
Incr Tastenzaehler
If Tastenzaehler > 3 Then
Tastenzaehler = 1
End If
Return
If Tastenzaehler = 1 Then
Gosub Fader
End If
If Tastenzaehler = 2 Then
Gosub Farbe
End If
If Tastenzaehler = 3 Then
Gosub Full
End If
Loop
Fader:
Do
Do
Incr Gruen
Gosub Zeit
Loop Until Gruen > 254
Do
Decr Rot
Gosub Zeit
Loop Until Rot = 0
Do
Incr Blau
Gosub Zeit
Loop Until Blau > 254
Do
Decr Gruen
Gosub Zeit
Loop Until Gruen = 0
Do
Incr Rot
Gosub Zeit
Loop Until Rot > 254
Do
Decr Blau
Gosub Zeit
Loop Until Blau = 0
Loop
Return
Farbe:
If Tastenzaehler = 2 Then
Gruen = 100
Rot = 100
Blau = 100
End If
Return
Full:
Gruen = 255
Rot = 255
Blau = 255
Return
Zeit:
Waitus 100
Return
Pwm_interrupt:
Incr Pwmctr
If Rot > Pwmctr Then Set Portd.7 Else Reset Portd.7
If Rot > Pwmctr Then Set Portd.4 Else Reset Portd.4
If Rot > Pwmctr Then Set Portd.1 Else Reset Portd.1
If Rot > Pwmctr Then Set Portc.2 Else Reset Portc.2
If Gruen > Pwmctr Then Set Portd.6 Else Reset Portd.6
If Gruen > Pwmctr Then Set Portd.3 Else Reset Portd.3
If Gruen > Pwmctr Then Set Portd.0 Else Reset Portd.0
If Gruen > Pwmctr Then Set Portc.1 Else Reset Portc.1
If Blau > Pwmctr Then Set Portd.5 Else Reset Portd.5
If Blau > Pwmctr Then Set Portd.2 Else Reset Portd.2
If Blau > Pwmctr Then Set Portc.3 Else Reset Portc.3
If Blau > Pwmctr Then Set Portc.0 Else Reset Portc.0
Return
Wenn ich die Schaltung einschalte passiert folgendes :
Taster nicht an GND ( Müsste ganz normal faden )
Blinken die Farben langsam in Takt
Einmal Taster an GND, kurze Pause..blinken alle wieder..
Thomas Kiss schrieb:> Wo ist der Fehler ?
Der ganze Programmaufbau passt nicht
Du denkst noch zusehr in Schleifen und nicht in Zuständen und
Ereignissen.
Hallo Karl Heinz, schön daß Du a bist !!
naja dachte ich mir, ich hatte schon Gedanken gemacht, und vermute daß
das Problem ist, die hin und her Springerei.
Klar wenn ich den Wert Tastenzähler per Hand setze dann funzt ( Bin
erstmal froh, daß ich PWM hinbekommen habe )...Erfolgserlebnis..LoL
Ich sehe es auch ein, daß ich zu schnell Codes eintippe, ( schnell sehen
was passiert und hin und her probieren )
Struktur vom Programm ist falsch..Grübel....Grübel...
Ein Tipp ?..smile...
Thomas Kiss schrieb:> Struktur vom Programm ist falsch..Grübel....Grübel...>> Ein Tipp ?..smile...
OK.
Der Tipp lautet:
Es gibt nur eine einzige Do-Loop
Innerhalb der Loop spielt sich alles ab. Durch Variablen gesteuert
werden bestimmte Programmteile durchlaufen andere nicht. Diese Variablen
fungieren als Anzeiger ob etwas zu tun ist oder nicht, bzw. was zu tun
ist.
In einem Durchlauf durch die Do-Loop wird immer nur ein kleiner Teil der
Aufgabe erledigt.
Anstelle also in einer eigenen Schleife alle Farben durchzuspielen, wird
in der einzigen Do-Loop die Farbe immer nur um 1 Schritt verändert. Beim
nächsten Durchlauf durch die große Do-Loop kommt dann der nächste
Schritt. Oder auch nicht, weil in der Zwischenzeit jemand auf eine Taste
gedrückt hat und so die Variable umgestellt hat, die notwendig wäre,
damit der Fader wieder einen Schritt macht. Durch dieses Umstellen kommt
der daher gar nicht mehr zum Zug, sondern es wird eine konstante Farbe
angezeigt
Thomas Kiss schrieb:> Also ich packe alles ( in diesem Fall ) in die Do loop und frage den> Tastenwert ab ...
Nein.
Du fängst noch einmal neu an :-)
Von dem jetzigen kannst du nicht viel wiederverwenden ausser dem Wissen,
wie gewissen Dinge funktionieren.
Den Timer und seine ISR kannst du lassen wie sie sind, aber im
Hauptprogramm bleibt kein Stein auf dem anderen. Darum hab ich ja auch
gesagt: der ganze Aufbau passt nicht
So ungefähr wird das aufgebaut
1
$regfile = "m8def.dat"
2
$crystal = 16000000
3
4
Dim Pwmctr As Byte '
5
Dim Rot As Byte
6
Dim Gruen As Byte
7
Dim Blau As Byte
8
Dim Tastenzaehler As Byte
9
10
Config Timer0 = Timer , Prescale = 1
11
On Ovf0 Pwm_interrupt
12
Enable Ovf0
13
Enable Interrupts
14
15
Ddrb = &B11111111
16
Ddrd = &B11111111
17
18
Portb = 0
19
Portd = 0
20
Portb.0 = 0
21
22
'Taster
23
Config Pinc.5 = Input
24
Portc.5 = 1
25
Taster Alias Pinc.5
26
27
Tastenzaehler = 1
28
29
Do
30
Debounce Pinc.5 , 0 , Modus , Sub
31
32
' volle Leuchtkraft
33
If Tastenzaehler = 1 Then
34
Gruen = 255
35
Rot = 255
36
Blau = 255
37
End if
38
39
' halbe Leuchtkraft
40
If Tastenzaehler = 2 Then
41
Gruen = 100
42
Rot = 100
43
Blau = 100
44
End If
45
46
' durchfaden, aber immer nur 1 Fadingschritt!
47
If Tastenzaehler = 3 Then
48
Incr Rot
49
If Rot = 255 Then
50
Rot = 0
51
End If
52
WaitUs 100
53
End if
54
Loop
55
56
Modus:
57
Incr Tastenzaehler
58
If Tastenzaehler > 3 Then
59
Tastenzaehler = 1
60
End If
61
Return
62
63
Pwm_interrupt:
64
Incr Pwmctr
65
66
If Rot > Pwmctr Then
67
Set Portd.7
68
Set Portd.4
69
Set Portd.1
70
Set Portc.2
71
Else
72
Reset Portd.7
73
Reset Portd.4
74
Reset Portd.1
75
Reset Portc.2
76
End If
77
78
79
If Gruen > Pwmctr Then
80
Set Portd.6
81
Set Portd.3
82
Set Portd.0
83
Set Portc.1
84
Else
85
Reset Portd.6
86
Reset Portd.3
87
Reset Portd.0
88
Reset Portc.1
89
End If
90
91
If Blau > Pwmctr Then
92
Set Portd.5
93
Set Portd.2
94
Set Portc.3
95
Set Portc.0
96
Else
97
Reset Portd.5
98
Reset Portd.2
99
Reset Portc.3
100
Reset Portc.0
101
End If
102
103
Return
und du lässt dir jetzt was einfallen, wie du mit zusätzlichen Variablen
steuerst, dass nachdem Rot von 0 bis 255 durchgelaufen ist, Grün
anstelle von Rot durchläuft, dann Blau und dann auch wieder alles in die
andere Richtung.
Karl heinz Buchegger schrieb:> Du denkst noch zusehr in Schleifen und nicht in Zuständen und> Ereignissen.
Hallo Karl-Heinz,
hiermit bitte ich um die Lizenz, diesen Satz benutzen zu dürfen. Du
bringtst mit wenigen Worten auf den Punkt, was ich seit Jahren versuche,
anderen Leuten mit (viel zu) vielen Worten zu erklären.
Gruß aus dem (fast) hochwässrigen Flachland...
@Thomas:
Schau Dir das mal an:
http://www.mikrocontroller.net/articles/Multitasking#Ein_einfaches_Beispiel_f.C3.BCr_den_AVR
Auch wenn Du (wie ich) den Programmcode nicht hundertprozentig
nachvollziehen kannst, so hilft Dir der beschreibende Text mit
Sicherheit, Dein Problem aus anderer Sicht zu sehen und Programmcode in
Basic dafür zu schreiben.
MfG
Thomas Kiss schrieb:> Nachtrag : Habe kurz mal den Code "übernommen"..Moduswahl ist wirklich> gut, aber im Fading Modus, gibt es ein wildes pulsieren...
Genauso ist das auch gedacht.
Jetzt bist du drann.
Tip.
Genauso wie es da eine Variable Tastenzaehler gibt, könntest du eine
Variable Fadingzaehler haben, mit dieser Bedeutung
1 Gruen soll um 1 Schritt hochgedimmt werden
2 Rot soll um 1 Schritt runtergedimmt werden
3 Blau soll um 1 Schritt hochgedimmt werden
4 Gruen soll um 1 Schritt runtergedimmt werden
5 Rot soll um 1 Schritt hochgedimmt werden
6 Blau soll um 1 Schritt runtergedimmt werden
Jedesmal wenn der jeweilige Schritt gemacht wurde und damit das Ende der
Dimmstrecke erreicht ist, wird Fadingzaehler auf den nächsten Zustand
gesetzt, damit beim nächsten Durchlauf durch ...
1
' durchfaden, aber immer nur 1 Fadingschritt!
2
If Tastenzaehler = 3 Then
3
4
if Fadingzaehler = 1 Then
5
' Gruen 1 Schritt hoch
6
Incr Gruen
7
if Gruen = 255 then Fadinzaehler = 2
8
9
Else If Fadingzaehler = 2 Then
10
11
... Rot 1 Schritt runter
12
13
Else If Fadingzaehler = 3 Then
14
15
... Blau 1 Schritt hoch
16
17
....
18
19
20
End If
21
22
WaitUs 100
23
24
End if
25
Loop
... der Fadingteil etwas anderes macht. Die Variable Fadingzaehler sagt
dem Code, welche LEDs sich um 1 Schritt verädnern müssen und in welche
Richtung (rauf/runter) dieser Schritt erfolgen soll.
@ Karl heinz Buchegger (kbuchegg) (Moderator)
nur mal aus Neugierde:
wäre jetzt Portc.5 der Pullup für Pinc.5. Ich dachte der Pin wird
auf H gesetzt. Ich mach das immer anders.
Taster Alias Pinc.5 wurde definiert.
Hätte dann nicht
Debounce Taster , 0 , Modus , Sub
auch funktionieren müssen?
Bedanke mich mal schon.
Wigbert
Karl Heinz--- Respekt !!!..Staunen...hmm....
Sagmal wie lange tust schon AVR "hacken" ??? ist absolut beeindruckend
!!!
naja bin seit ca 2 oder 3 Monaten dabei...hmm..
Ich muss erstmal "leider" erstmal die Version fertigmachen, wo es nur
normal gefadet wird, tochter will schon ihre Lampe haben....erstmal also
löten...die Grundversion tut soweit gut...nichts einstellbares...so
gefällt es ihr, als Nachtlampe..
Kluchscheißender Consulter schrieb:> Karl heinz Buchegger schrieb:>> Du denkst noch zusehr in Schleifen und nicht in Zuständen und>> Ereignissen.>> Hallo Karl-Heinz,>> hiermit bitte ich um die Lizenz, diesen Satz benutzen zu dürfen.
LOL, gerne
> Du> bringtst mit wenigen Worten auf den Punkt, was ich seit Jahren versuche,> anderen Leuten mit (viel zu) vielen Worten zu erklären.
Eine andere Metapher die auch gut greift:
Dein Programm muss agieren wie ein Simultanschachspieler, der mit 20
Leuten "gleichzeitig" Schach spielt.
Der spielt auch nicht auf einem Brett eine Partie fertig und geht dann
zum nächsten, sondern er geht reihum von einem Brett (=Problem, Aufgabe)
zum nächsten. Bei jedem Brett bleibt er stehen, sieht sich an ob es
etwas zu tun gibt (=Statusvariable zeigt an), macht seinen Zug
(=bearbeitet den Teil der Aufgabe) und geht weiter zum nächsten Brett.
Und das immer wieder reihum im Kreis. Auch wenn er an jedem Brett immer
nur 1 Zug macht, werden doch alle Partien irgendwann zu Ende gebracht.
Leider ist mir noch kein Beispiel eingefallen, dass von Autos handelt.
Mit Autos kennen wir uns besonders gut aus, damit begreift auch der
Dümmste was Sache ist.
Wie programmiert ihr ?
Ich habe das Problem , wahrscheinlich, daß ich gleich los tippe, dann
hier und mal dort reinfrickele bis nicht mehr geht...
Tut ihr eine Art Programmablaufplan auf dem Papier malen ?
Wie ?
Thomas Kiss schrieb:> Wie programmiert ihr ?
Erfahrung, Erfahrung, Erfahrung
> Tut ihr eine Art Programmablaufplan auf dem Papier malen ?
Wenn es dir hilft, deine Gedanken zu ordnen, dann ist das ok.
Verlier dich aber nicht in Details dabei, es reicht wenn du mit dem
Finger den Ablaufplan nachfahren kannst und in Gedanken (=du bist der
Computer) dein Programm abarbeiten kannst.
> Wie ?
Über das Probelm nachdenken, Lösungen suchen, beobachten wie Menschen
das Problem lösen, mit Papier und Bleistift Verfahren durchdenken und
durchspielen, in seinem Gedächtnis nach Standardalgorithmen suchen, ....
Viel Vorarbeit, ehe es dann an den Rechner geht.
(OK. Meine "echten" Programme sind ein wenig größer als das was man auf
einem µC so typischerweise macht)
Hab ich die wichtigste Zutaten schon erwähnt?
Erfahrung, Üben, Erfahrung, Üben, Erfahrung, Üben.
Und ach ja: Mit Erfahrung und viel üben kommt man auch zum Ziel :-)
Thomas Kiss schrieb:> Sehr schöne Tipps hier, bin froh , dass ich hier im forum bin, werde mal> versuchen meine Gedanke auf dem Papier bringen und bau es dann neu auf> ..
OK.
Allerdings bin ich jetzt ein bischen enttäuscht. Nachdem ich dir schon
soweit vorgearbeitet habe. Ein paar Zeilen Code noch an die richtigen
Stellen eingesetzt, die ich dir sogar noch markiert habe.
Wigbert Picht-dl1atw schrieb:> @ Karl heinz Buchegger (kbuchegg) (Moderator)>> nur mal aus Neugierde:>> wäre jetzt Portc.5 der Pullup für Pinc.5. Ich dachte der Pin wird> auf H gesetzt. Ich mach das immer anders.>> Taster Alias Pinc.5 wurde definiert.> Hätte dann nicht> Debounce Taster , 0 , Modus , Sub> auch funktionieren müssen?>> Bedanke mich mal schon.
Ah. Dieses Posting hab ich übersehen.
Ich machs normal auch anders. Aber ich programmier auch in C :-)
Nicht weitersagen, ich hab von BASCOM eigentlich keine Ahnung. Ich nehm
nur die Teile, von denen fest steht, dass sie der Autor richtig hat,
nehm sie auseinander und setzte sie in der richtigen Reihenfolge wieder
zusammen (dem Prinzip nach).
> wäre jetzt Portc.5 der Pullup für Pinc.5
Ja, wäre er. Weil Pinc.5 auf Eingang geschaltet ist
> Taster Alias Pinc.5 wurde definiert.> Hätte dann nicht> Debounce Taster , 0 , Modus , Sub> auch funktionieren müssen?
Nach meinen rudimentären BASCOM Kentnissen und wenn ich dann fehlendes
BASCOM Wissen aus anderen Sprachen ergänze: ja, müsste genauso gehen.
Ein Alias ist ein Stellvertreter, also im Grunde nur eine andere
Schreibweise. Ob man da jetzt Pinc.5 oder Taster schreibt ist alles das
gleiche.
Hast du sicher schon mal im TV in einem Krimi gehört:
Kurt X, alias Fred Z., alias Hubert Hinterreiter .....
Da kommt auch das Wort 'alias' vor. In genau derselben Bedeutung:
mehrere Namen für ein und dieselbe Person. So auch in
Programmiersprachen: Ein Alias ist einfach nur ein alternativer Namen
für etwas.
Karl-Heinz :
Allerdings bin ich jetzt ein bischen enttäuscht. Nachdem ich dir schon
soweit vorgearbeitet habe. Ein paar Zeilen Code noch an die richtigen
Stellen eingesetzt, die ich dir sogar noch markiert habe.
Ich muss es alles von Anfang an neu aufbauen bzw, nochmal durchkauen und
analysieren...ich wollte keine copy paste machen
Guten Morgen, nun ich habe folgendes ausgedacht ( Bin im Büro, kann
leider nicht LIVE testen )
Grundgedanke ist :
Der Tastenzähler hat die Werte 1,2,3
In der Main frage ich die 3 Zustände mit If then ab. Jeder Zustand hat
also seine eigene Funktion (Fade,Farbe,Aus )
Ein kleiner Nachteil ist, wenn man in der Fade Schleife drin ist, werden
die Änderungen am Taster erst bemerkt, wenn die Schleife durch ist.
Hoffe, habe alles "richtig" gedacht !!!
$regfile = "m8def.dat"
$crystal = 16000000
Config Portb.1 = Output 'Rot Pin15
Config Portb.2 = Output 'Gruen
Pin16
Config Portb.3 = Output 'Blau Pin 17
Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Up , Compare B Pwm
= Clear Up , Prescale = 1
Enable Timer1
Start Timer1
Config Timer2 = Pwm , Pwm = On , Compare Pwm = Clear Down , Prescale = 1
Enable Timer2
Start Timer2
Rot Alias Compare1a
Gruen Alias Compare1b
Blau Alias Ocr2
Dim Warten As Word
Dim Tempo As Word
Dim Tastenzaehler As Byte
'Taster
Config Pinc.5 = Input
Portc.5 = 1
Taster Alias Pinc.5
Rot = 255
Gruen = 0
Blau = 0
Warten = 1000
Tempo = 10
Tastenzaehler = 1
Do
Debounce Taster , 0 , Modus , Sub
If Tastenzaehler = 1 Then
Do
Incr Gruen
Waitms Tempo
Loop Until Gruen = 255
Waitms Warten
Do
Decr Rot
Waitms Tempo
Loop Until Rot = 0
Waitms Warten
Do
Incr Blau
Waitms Tempo
Loop Until Blau = 255
Waitms Warten
Do
Decr Gruen
Waitms Tempo
Loop Until Gruen = 0
Waitms Warten
Do
Incr Rot
Waitms Tempo
Loop Until Rot = 255
Waitms Warten
Do
Decr Blau
Waitms Tempo
Loop Until Blau = 0
Waitms Warten
End If
If Tastenzaehler = 2 Then
Rot = 100
Gruen = 100
Blau = 50
End If
If Tastenzaehler = 3 Then
Rot = 0
Gruen = 0
Blau = 0
End If
Loop
Modus:
Incr Tastenzaehler
If Tastenzaehler > 3 Then
Tastenzaehler = 1
End If
Return
Thomas Kiss schrieb:> Ein kleiner Nachteil ist, wenn man in der Fade Schleife drin ist, werden> die Änderungen am Taster erst bemerkt, wenn die Schleife durch ist.
Kopfschüttel.
Warum denkst du hab ich mir die Mühe gemacht und dir gezeigt, wie man
das Faden so aufteilt, dass es dieses Problem genau nicht gibt. Ganze
Absätze hab ich darüber geschrieben, inklusive einem Programmvorschlag,
den du nur noch ergänzen brauchst.
Beitrag "Re: Ein kleines Projekt für BASCOM Änfänger Vol2"
Und ja.
Ich hab mir gestern noch ein BASCOM downgeloadet, hab die restlichen 5
Fälle ergänzt und es hat auf Anhieb funktioniert. OK. Elseif schreibt
sich im BASCOM als 1 Wort, aber das war auch schon der einzige Fehler.
Oh und in einem Variblennamen hatte ich einen Tippfehler (Fading ist
aber auch blöd zu tippen)
Bis auf insgesammt 10 fehlende Zeilen Code ( 5 mal 2 Zeilen) hab ich dir
vorgearbeitet. Und selbst die gehen allesamt nach Schema, welches ich
für den ersten der 6 Fälle ausgeführt habe. Dazu noch eine Variable
definieren und am Anfang mit einem Wert belegen - aber das fällt dann
schon unter ferner liefen.
Kopfschüttel.
Sorry, ich schätze Deine Bemühungen mehr als Du denkst. Ich suche jetzt
auch keine Entschuldigung.
Meine Hintergedanke war einfach, daß ich den kompletten Code SELBER so
schreiben wollte, daß ich wirklich jede Zeile verstehe. Ich habe das
komplette Problem auf dem Papier gebracht und dann die Zeilen
geschrieben.
Deine Lösungsvariante ist mit 100% Sicherheit, besser, habe seit gestern
evtl. zu wenig analysiert um es 100% zu verstehen.
Hallo,
manchmal sollte man Bewährtes übernehmen. Die gezeigte Struktur war doch
gut, Karl-Heinz hat sich sogar die Mühe gemacht ein fertigen Code
reinzusetzen. Ich verstehe das jetzt auch nicht. Du nimmst doch auch ein
AVR oder willst Du den auch neu erfinden.
Wigbert
Von einer Seite stimmt es....Wenn ich aber seinen Vorschlag oder Idee
bzw. gedanken nicht 100% nachvollziehen kann, verstehe, dann persönlich
nützt es mir nicht viel.
Wenn ich einen Fader bräuchte, gibt es genügend Copy Paste Anwendungen.
Ich habe mir das Ziel gesetzt, es zu erlernen, klar am Anfang gibt es
genügend Fehler.
Es ist ein bisschen kompliziert, wenn ich schon ein Code fertig habe,
mit Fehler, klar..auch ein komplett neues "konzept" umzusteigen, alles
von vorne, aber klar das ist die Erfahrung.
Programmieren ist nicht einfach, ich kann es bereits bei anderen auch
nachvollziehen, wenn ich Beiträge lese, eine LCD an Atmega
anzuschliessen und hallo World schreiben...LoL
Thomas,
na was Verstehst Du denn nicht an Karl-Heinz sein Code.
Hat doch niemand was dagegen nachzufragen.
Wigbert
PS. Ich mach Bascom ca 7 Jahre als Hobby. Ich hätte den lieben Gott
gedankt, wenn ich Profis wie Karl-Heinz in meiner Anfangszeit an die
Strippe gekrigt hätte.
Thomas Kiss schrieb:> Von einer Seite stimmt es....Wenn ich aber seinen Vorschlag oder Idee> bzw. gedanken nicht 100% nachvollziehen kann, verstehe, dann persönlich> nützt es mir nicht viel.
Ich schätze deine Bemühungen das selbst zu erledigen.
Das ist gut und ich steh da voll hinter dir.
Aber: Es gitb Dinge, auf die kommt man von alleine nicht oder nur sehr
langsam oder nur sehr sehr mühsam mit vielen Fehlversuchen (was nicht
schlecht ist. Fehlversuche sind gut, danach weiß man: so gehts nicht).
Aber man kann sie sich bei anderen ansehen. Programmieren lernen
bedeutet nicht nur, dass man für sich selber im stillen Kämmerlein vor
sich hinwerkelt, sondern auch (und vor allen Dingen) dass man fremden
Code analysiert, die Idee die dahinter steckt herausholt. Viele Leute
glauben immer, der Knackpunkt in der Programmierung liegt bei den
Wörtern, die man hinschreibt. Oh, nein. Das sind vielleicht 10%. Die
restlichen 90% sind Algorithmen, Techniken, Verfahren, die man mal
gelernt hat, sich selbst erarbeitet hat, verinnerlicht hat. Da liegt der
Knackpunkt in der Programmierung. Programmieren hat in dieser Hinsicht
viel mit Schachspielen gemeinsam: Die Schlüsselwörter sind die Figuren
und wie sie ziehen können. Aber Schach-'spielen' kann man erst, wenn man
die Züge kombinieren kann. Erst dadurch wird Schach zu dem was es ist.
Wenn du nur den präsentierten Code nimmst, auf den µC brennst und sagst:
"Super, jetzt funktionierts", dann hast du recht. Dabei lernst du
nichts. Aber so blöd bin ich dann auch wieder nicht :-) Ich weiß schon,
dass dieses Vorgehen zu nichts führt. Also geb ich dir den Code nicht
so, dass du ihn einfach nur 1:1 übernehmen kannst. Ich lass Teile weg,
markiere die im Code und sag dir, dass du dort noch ergänzen musst. Und
jetzt kommt der springende Punkt: Du kannst diese Teile nur dann
ergänzen, wenn du das Prinzip verstanden hast. D.h. wenn du die
fehlenden Teile ergänzt hast, hab ich die Gewissheit, dass du dich mit
dem Code beschäftigt hast, das du ihn analysiert hast, dass du
verstanden hast wie die Technik funktioniert.
Und genau das ist mein Ziel. Ich hab schon geschnallt, dass du
lernbereit bist (im Gegensatz zu vielen anderen, die hierher kommen).
ALso versuch ich dir Dinge so zu präsentieren, dass du die
zugrundeliegende Idee, die Technik dahinter, verstehst. Mein Ziel ist es
nicht, dir ein fertiges Programm zu geben, mein Ziel ist es, dass du
eine ganz bestimmte Technik verinnerlichst: Aufteilen.
In einem anderen Thread hab ich es so formuliert:
Dein Programm muss arbeiten wie ein Simultanschachspieler, der gegen 20
Personen gleichzeitig Schach spielt. Der setzt sich auch nicht an 1
Brett und spielt eine Partie durch und geht dann zum nächsten.
Was er statt dessen tut: Er geht an ein Brett (das ist bei dier eines
der Teilprobleme), sieht sich die Situation an (das ist bei dir eine
Flagvariable oder einer der ominösen Zaehler), macht seinen Zug (bei dir
ist das einen kleinen abgeschlossen Schritt zb im Fading) und geht
weiter zum nächsten Brett. Und so geht das immer weiter, reihum, von
Brett zu Brett.
Auch wenn er keine einzige Partie in einem Zug durchgespielt hat (bei
dir ein kompletter Fadingdurchgang), so kommen doch alle Partien
irgendwann zu einem Ende (sind alle LED einmal durchgefadet)
Und natürlich: dein µC kann in Windeseile von einem 'Brett' zum nächsten
gehen.
Du musst nur das Brett (=Problem) identifizieren und überlegen, welche
kleinste Aktion als 'Schach-Zug' durchgehen kann. Möglichst klein, damit
er möglichst wenig Zeit verbraucht. Aber auch nicht zu klein, sonst
bläht sich alles auf.
Und das ist nicht so einfach, wenn man das noch nie gemacht hat. Daher
versuch ich dich in diese Richtung zu lenken, indem ich dir das abnehme,
beschreibe und im Programmcode noch andeute.
Nochmal: Ich habe dir den Code nicht gegeben, damit du ihn 1:1
übernehmen kannst. Das hättest du auch nicht können, weil er nicht
vollständig war. Aber um ihn vollständig zu machen, hättest du dich mit
dem Code beschäftigen müssen. Und dabei hättest du dann gelernt.
Wigbert ( 7 Jahre Bascom...boahhh )
Was ich nicht an Karl-Heint Code verstehe....oder sehe wirklich
"komplizierter" wie mein Code.
Er meinte einen Fadingzähler erzeugen. vom 0 bis 255 (Timer )
ich erkenne den Sinn nicht richtig und es wird komplizierter wie was ich
gedacht habe. 3 If Abfragen...
ausserdem dieser Block ist mir noch ein Rätsel bzw. Total
"unübersichtlich".. ( ich sehe im Code nicht was wann genau passiert )
Wenn Rot grösser ist wie der Zähler, dann Portd.7 setzen mit was ? Was
hängt an Portd.7 welche Farbe...
Pwm_interrupt:
Incr Pwmctr
If Rot > Pwmctr Then
Set Portd.7
Set Portd.4
Set Portd.1
Set Portc.2
Else
Reset Portd.7
Reset Portd.4
Reset Portd.1
Reset Portc.2
End If
If Gruen > Pwmctr Then
Set Portd.6
Set Portd.3
Set Portd.0
Set Portc.1
Else
Reset Portd.6
Reset Portd.3
Reset Portd.0
Reset Portc.1
End If
If Blau > Pwmctr Then
Set Portd.5
Set Portd.2
Set Portc.3
Set Portc.0
Else
Reset Portd.5
Reset Portd.2
Reset Portc.3
Reset Portc.0
End If
Sorry mein Code ist "einfacher" bzw "Verständlicher" ( noch ) für mich.
Config Portb.2 = Output 'Gruen Pin16
Gruen Alias Compare1b
DO
Incr Gruen
Waitms Tempo
Loop Until Gruen = 255
Waitms Warten
Thomas Kiss schrieb:> Wigbert ( 7 Jahre Bascom...boahhh )>> Was ich nicht an Karl-Heint Code verstehe....oder sehe wirklich> "komplizierter" wie mein Code.>> Er meinte einen Fadingzähler erzeugen. vom 0 bis 255 (Timer )
Nein.
Ich meine einen 'Fadinzaehler' (schlechte Bezeichnung)
in völliger Analogie zu deinem 'Tastenzaehler'
Der Tastenzähler zeigt an (durch die Zahl) welche Aktion auszuführen ist
Ist es volle Helligkeit
halbe Helligkeit
Fading
Wenn Fading, dann zeigt der Fadingzaehler analog dazu an, welche
Fadingaktion gerade auszuführen ist
Ist es Rot heller dimmen
Rot dunkler dimmen
Gruen heller dimmen
Gruen dunkler dimmen
Blau heller dimmen
Blau dunkler dimmen
Das ist seine Aufgabe!
Bei jedem Durchlauf durch
do
....
Loop
UND wenn gleichzeitig der Tastenzaehler auf Fading steht, sagt dir die
Variable Fadingzaehler, welche LED wie umgedimmt werden soll.
Das Ziel: Nicht einen Fadingdurchgang komplett über alle 6 LED zu
machen, sondern nur 1 LED faden. Danach geht es weiter durch die grosse
Do-Loop Schleife (damit die Tastenabfrage eine Chance hat, die Tasten
abzufragen). Beim nächsten Durchgang durch die Loop kommt der Code ja
ohnehin wieder beim Faden vorbei und die Variable Fadingzaehler sagt
dann, was es zu tun gibt.
Thomas Kiss schrieb:> ausserdem dieser Block ist mir noch ein Rätsel bzw. Total> "unübersichtlich".. ( ich sehe im Code nicht was wann genau passiert )
Das ist genau der gleiche Code, so wie du ihn zu Anfang auch hattest,
nur etwas anders formatiert.
> Wenn Rot grösser ist wie der Zähler, dann Portd.7 setzen mit was ?
Mit 1
> Was> hängt an Portd.7 welche Farbe...
Offenbar Rot.
Jetzt ist das aber komisch. Den Code hab ich mir aus deinem Programm
geholt und umformatiert.
Bei dir stand
If Rot > Pwmctr Then Set Portd.7 Else Reset Portd.7
If Rot > Pwmctr Then Set Portd.4 Else Reset Portd.4
If Rot > Pwmctr Then Set Portd.1 Else Reset Portd.1
If Rot > Pwmctr Then Set Portc.2 Else Reset Portc.2
bei mir steht
> If Rot > Pwmctr Then> Set Portd.7> Set Portd.4> Set Portd.1> Set Portc.2> Else> Reset Portd.7> Reset Portd.4> Reset Portd.1> Reset Portc.2> End If
Der einzige UNterschied:
Ich mache die Abfrage, ob die LED zu setzen oder rückzusetzen sind, nur
einmal, du machst die Abfrage für jede LED erneut (obwohl die restlichen
3 Abfragen dasselbe Ergebnis bringen müssen, wie die erste Abfrage. Wozu
daher erneut testen?)
Thomas Kiss schrieb:> Sorry mein Code ist "einfacher" bzw "Verständlicher" ( noch ) für mich.
OK.
Akzeptier ich.
Du weißt was du dir damit einhandelst (mämlich dass dein Programm nicht
vernünftig auf Tasteneingaben reagiert). Vielleicht wurmt dich das in
einem halben Jahr und dann siehst du, dass dein jetziger Code gar nicht
so einfach ist, wie du die ganze Zeit gedacht hast.
> Config Portb.2 = Output 'Gruen Pin16>> Gruen Alias Compare1b> DO> Incr Gruen> Waitms Tempo> Loop Until Gruen = 255> Waitms Warten
Jetzt bist du aber im Zusammenhang wieder an eine ganz andere Stelle
gesprungen :-)
Die IF sind in der Interrupt Routine, die die eigentliche LED Ansteurung
machen! Das hat doch mit dem Code der dann Gruen auf einen Wert setzt,
überhaupt nichts zu tun!
JUNGS ICH FINDE EUCH KLASSE, SOVIEL GEDULD !!! ( Ich muss mal ein Bier
Ausgeben )
Acha...Moment..Zusammenfassen :
Kommentar : 1 Fading, 2 Farbe, 3 Aus
Do
Taster-Mode-Auswahl ( Debounce - in Sub Zählen 1-2-3 )
do
if Mode=1 then
incr Gruen
if mode=2 then
gruen=255
if mode=3 then
gruen=0
end if
end if
end if
if Mode=1 then
decr Rot
if mode=2 then
Rot =255
if mode=3 then
Rot=0
end if
end if
end if
Sowas ?????
Thomas Kiss schrieb:> Sowas ?????
Nein, sowas:
Beitrag "Re: Ein kleines Projekt für BASCOM Änfänger Vol2"
(Das ist nur der Fading-Teil!, die anderen beiden Fälle 'LED voll' bzw.
'LED halb' sind da nicht mit drinnen)
wenn Fading eingeschaltet
wenn Rot soll hoch gedimmt werden ' Fadingzaehler gleich 1
Rot um 1 Stufe Hochdimmen
Ist Rot damit beim Maximum angekommen?
Wenn ja, dann umschalten auf (zb) Grün hochdimmen
Der Clou besteht darin, dass jede LED (egal welche) immer nur 1
Fadingschritt macht (also 1 Stufe heller oder dunkler). Danach wird
abgeprüft, ob die LED damit in ihrer Endhelligkeit (entweder voll oder
aus) angekommen ist. Ist das der Fall, dann wird der Fadingzaehler
verändert, so dass beim nächsten Durchlauf durch die Schleife eine
andere LED verändert wird. Ist die wieder in ihrer Endlage angekommen,
dann wird dort der Fadingzaehler wieder auf etwas anderes gestellt,
damit die nächste LED drann kommt.
Thomas Kiss schrieb:> Mein letzter Versuch...>> muss ich irgendwo angeben ( SUB )
Kann man machen. Aber so gross wird der Code dann nicht
> Fading:> 1= incr Rot> 2= decr rot> 3= incr Grün> 4= decr Grün> 5= incr Blau> 6= decr Blau
OK
>> if fading=1 then> incr Rot> if rot = 255 then> fading=fading+1
Jaaaaaaa !
Arbeite an deiner Code-Formatierung. Ding auf gleicher Hierarchieebene
stehen untereinander. Die Einrückung zeigt an, dass es sich um eine neue
Hierarchieebene handelt, die zb ensteht, wenn Ding von einem if
abhängen. Alles was von diesem if abhängig ist, steht rechts von der
Spalte in der das if beginnt.
1
if fading = 1 then
2
incr Rot
3
if rot = 255 then
4
fading = 2 ' wir wissen ja, was rauskommt bei fading + 1
5
end if
6
7
elseif fading = 2 then
8
decr Rot
9
if rot = 0 then
10
fading = 3
11
end if
12
13
elseif fading = 3 then
14
incr Gruen
15
if Gruen = 255 then
16
fading = 4
17
end if
18
19
elseif fading = 4 then
20
21
...
22
23
elseif fading = 6 then
24
decr Blau
25
if Blau = 0 then
26
fading = 1
27
end if
28
29
end if
30
31
' die 1 LED wurde verändert, jetzt noch ein bischen warten
32
' (das koennen wir uns hier schon leisten, ein paar MikroSekunden
33
' sind ok)
34
35
waitus 200
36
37
' und fertig ist das Fading für diesen Durchgang.
38
' beim nächsten Durchgang durch die do-loop gehts weiter
39
' da wird dann der nächste Fading Schritt gemacht.
40
' Irgendeine der LED wird wieder um 1 Schritt heller oder dunkler
41
' Welche LED das ist und ob sie heller oder dunkler werden soll,
42
' sagt uns 'fading'
der Code dimmt jetzt Rot hoch und wieder runter, dann gruen hoch und
wieder runter dann blau hoch und wieder runter und dann beginnt wieder
alles von vorne.
Das muss aber nicht sein.
Du kannst auch
rot hoch, dann grün hoch, dann rot runter, dann grün runter.
Du musst nur bei den jeweiligen Neuzuweisungen an fading die jeweils
richtige Zahl eintragen wie es weiter gehen soll.
Meine Nerven...LoL....
$regfile = "m8def.dat"
$crystal = 16000000
Config Portb.1 = Output 'Rot Pin15
Config Portb.2 = Output 'Gruen
Pin16
Config Portb.3 = Output 'Blau Pin 17
Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Up , Compare B Pwm
= Clear Up , Prescale = 1
Enable Timer1
Start Timer1
Config Timer2 = Pwm , Pwm = On , Compare Pwm = Clear Down , Prescale = 1
Enable Timer2
Start Timer2
Rot Alias Compare1a
Gruen Alias Compare1b
Blau Alias Ocr2
Dim Fading As Byte
Dim Tastenzaehler As Byte
'Taster
Config Pinc.5 = Input
Portc.5 = 1
Taster Alias Pinc.5
Rot = 255
Gruen = 0
Blau = 0
Fading = 1
Do
Debounce Taster , 0 , Modus , Sub
If Fading = 1 Then
incr Rot
If Rot = 255 Then
Fading = 2
end if
Elseif Fading = 2 Then
Decr Rot
If Rot = 0 Then
Fading = 3
end if
Elseif Fading = 3 Then
incr Gruen
If Gruen = 255 Then
Fading = 4
end if
Elseif Fading = 4 Then
Decr Gruen
If Gruen = 255 Then
Fading = 5
End If
Elseif Fading = 5 Then
Incr Blau
If Blau = 255 Then
Fading = 6
End If
Elseif Fading = 6 Then
decr Blau
if Blau = 0 then
fading = 1
end if
End If
Waitus 500
Loop
Modus:
Incr Tastenzaehler
If Tastenzaehler > 3 Then
Tastenzaehler = 1
End If
Return
jetzt kommt die nächste herausforderung, wenn Modus geändert wird..
Tastenzähler=1, Fading 2, Farbe, 3 Alles aus...
Ergebnis ?
///////////////////////////////////////////
$regfile = "m8def.dat"
$crystal = 16000000
Config Portb.1 = Output 'Rot Pin15
Config Portb.2 = Output 'Gruen
Pin16
Config Portb.3 = Output 'Blau Pin 17
Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Up , Compare B Pwm
= Clear Up , Prescale = 1
Enable Timer1
Start Timer1
Config Timer2 = Pwm , Pwm = On , Compare Pwm = Clear Down , Prescale = 1
Enable Timer2
Start Timer2
Rot Alias Compare1a
Gruen Alias Compare1b
Blau Alias Ocr2
Dim Fading As Byte
Dim Tastenzaehler As Byte
'Taster
Config Pinc.5 = Input
Portc.5 = 1
Taster Alias Pinc.5
Rot = 255
Gruen = 0
Blau = 0
Fading = 1
Do
Debounce Taster , 0 , Modus , Sub
If Tastenzaehler = 1 Then
If Fading = 1 Then
incr Rot
If Rot = 255 Then
Fading = 2
end if
Elseif Fading = 2 Then
Decr Rot
If Rot = 0 Then
Fading = 3
end if
Elseif Fading = 3 Then
incr Gruen
If Gruen = 255 Then
Fading = 4
end if
Elseif Fading = 4 Then
Decr Gruen
If Gruen = 255 Then
Fading = 5
End If
Elseif Fading = 5 Then
Incr Blau
If Blau = 255 Then
Fading = 6
End If
Elseif Fading = 6 Then
decr Blau
if Blau = 0 then
fading = 1
end if
End If
End If
If Tastenzaehler = 2 Then
Rot = 150
Gruen = 150
Blau = 50
End If
If Tastenzaehler = 3 Then
Rot = 0
Gruen = 0
Blau = 0
End If
Waitus 500
Loop
Modus:
Incr Tastenzaehler
If Tastenzaehler > 3 Then
Tastenzaehler = 1
End If
Return
/////////////////////////////////////
if Ergebnis = Ok than Lob elsif Ergebnis= Nerven Fertig
>if Ergebnis = Ok than Lob elsif Ergebnis= Nerven Fertig
Diese Zeile ist elementar wichtig für das tadellose Funktionieren des
Programmes.
:-))
MfG Paul
Thomas Kiss schrieb:> Ergebnis ?
Yep.
Sieht gut aus, so beim Drüberscrollen.
Nitpicking.
Das Warten um 500 µS könnte man noch mit ins Fading mit rein nehmen.
Nachdem die LED allesamt auf voll gesetzt werden, braucht man ja nicht
warten.
Aber das ist jetzt irgendwo ein Nebenschauplatz. die 500µs tun auch
niemandem weh.
Und?
Schon geflasht und ausprobiert?
Wahrscheinlich wirst du noch die Reihenfolge der Auf und Abdimmer
verändern, damit immer irgendeine LED voll aufgedreht ist und es nie
dunkel wird.
Wie gesagt:
einfach die Reihenfolge festlegen und dann mit den Weiterschaltwerten
in 'fading' implementieren. Sagt ja kein Mensch, dass der nächste Wert
für 'fading' nach 1 die 2 sein muss. Kann ja auch was anderes sein.
Also erstmal....Tonnen vom Stein ist mir vom Herzen gefallen !!!
Ich habe noch 2 Stunden im Büro, dann schnell nach Hause und flaschen...
Danach wollte ich anfangen die Teile kurz auf Lochraster und in die
kaputte Lampe ( Glaskugel ) einbauen.
Klar wenns fertig ist, dann mache mal Bilder...aber das wichtigste ist..
SUUUUUUUUUUUPPPPPPPPPPPPPPPEEEEEEEEEEEEEEEEEEEEEEEEEEERRRRRRRRRRRRRR
Danke an alle, sehr nette und hilfsbereite Leute, die wirklich genug
nerven und Zeit gehabt haben mir wirklich soviel zu helfen.
Ich hoffe auch , wenn noch hier noch Anfänger sind, daß die dieses
Projekt
vom Anfang bis zum Ende geleen haben...( Mein Uhrprojekt..LCD mit Timer
)
Gleich eine "Vorwarnung"...dieses hier demnächst erweitert :
Poti an ADC....( habe gelesen da bekommt man auch "zahlen"...
Thomas Kiss schrieb:> Ich hoffe auch , wenn noch hier noch Anfänger sind, daß die dieses> Projekt> vom Anfang bis zum Ende geleen haben...( Mein Uhrprojekt..LCD mit Timer> )
Bei diesem Projekt ist das wichtigste die Organisation der Einzelteile,
so dass nirgends viel Zeit verbraten wird. Wenn du dir dieses Konzept
(immer nur einen kleinen Teil der Komplettaufgabe, zusätzliche Variablen
sagen dir welchen Teil) für die Zukunft mitnimmst, dann hast du einen
großen Schritt in deiner Lernkurve gemacht.
>> Poti an ADC....( habe gelesen da bekommt man auch "zahlen"...
Richtig. Aber darüber reden wir, wenns soweit ist.
Karl heinz Buchegger schrieb:> Du Fuchs, du!>> Du hast die PWM ja jetzt in Hardware gelegt!
Gestern habe noch ca 3 Stunden mich mit PWM grundlagen beschäftigt und
habe gesehen dass so einfacher und besser ist wie über "zähler"...
ich habe mal Abgeschaut wie man den Timer als PWM konfiguriert...klaro
die Parameter habe nicht selber erfunden...
Thomas Kiss schrieb:> Karl heinz Buchegger schrieb:>> Du Fuchs, du!>>>> Du hast die PWM ja jetzt in Hardware gelegt!>> Gestern habe noch ca 3 Stunden mich mit PWM grundlagen beschäftigt und> habe gesehen dass so einfacher und besser ist wie über "zähler"...
Das passt schon!
Jetzt kennst du beides.
Hardware und Software. Software PWM könntest du einsetzen, wenn du 10
LED unabhängig voneinander dimmen willst :-)
>> ich habe mal Abgeschaut wie man den Timer als PWM konfiguriert...klaro> die Parameter habe nicht selber erfunden...
Ist schon ok. Musst du auch nicht. Dafür gibts ja Dokus bzw. anderer
Programme an denen man sich Dinge abschauen kann.
Ich werde noch den Code etwas verfeinern, wenn ich die Schaltung fertig
aufgebaut habe, waits usw....reihenfolge etc..mache auch noch Kommentare
dazu..Schaltplan denke nicht notwendig (Eagle ) aber wenn jemand
interesse hat, helfe ich gerne.....dann können wir
"Kleines Projekt für BASCOM Anfänger Vol2 " closen
und nochmal , wirklich super DANKE an ALLE !!!!!! hat nerven gekostet,
aber auch mit viel Spass...
Grüsse aus dem Stuttgarter Raum
Du definierst Timer 1 mit Clear Up und Timer 2 mit Clear Down.
Die beiden Ausgänge das Timer 1 werden synchron laufen H bei Start,
der Ausgang Timer 2 wird erst H nach Überlauf haben. Aber vielleicht
ist das gewollt.
Wigbert
So meine Freunde und Helfer hier..jetzt kommen wir zur Praxis...hmm..
Habe also folgendes geflasht :
$regfile = "m8def.dat"
$crystal = 16000000
Config Portb.1 = Output 'Rot Pin15
Config Portb.2 = Output 'Gruen
Pin16
Config Portb.3 = Output 'Blau Pin 17
Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Up , Compare B Pwm
= Clear Up , Prescale = 1
Enable Timer1
Start Timer1
Config Timer2 = Pwm , Pwm = On , Compare Pwm = Clear Up , Prescale = 1
Enable Timer2
Start Timer2
Rot Alias Compare1a
Gruen Alias Compare1b
Blau Alias Ocr2
Dim Fading As Byte
Dim Tastenzaehler As Byte
'Taster
Config Pinc.5 = Input
Portc.5 = 1
Taster Alias Pinc.5
Rot = 0
Gruen = 0
Blau = 0
Fading = 1
Do
Debounce Taster , 0 , Modus , Sub
If Tastenzaehler = 1 Then
If Fading = 1 Then
Incr Rot
If Rot = 255 Then
Fading = 2
End If
Elseif Fading = 2 Then
Decr Rot
If Rot = 0 Then
Fading = 3
End If
Elseif Fading = 3 Then
Incr Gruen
If Gruen = 255 Then
Fading = 4
End If
Elseif Fading = 4 Then
Decr Gruen
If Gruen = 255 Then
Fading = 5
End If
Elseif Fading = 5 Then
Incr Blau
If Blau = 255 Then
Fading = 6
End If
Elseif Fading = 6 Then
Decr Blau
If Blau = 0 Then
Fading = 1
End If
End If
End If
If Tastenzaehler = 2 Then
Rot = 0
Gruen = 0
Blau = 255
End If
If Tastenzaehler = 3 Then
Rot = 255
Gruen = 255
Blau = 255
End If
Waitms 10
Loop
Modus:
Incr Tastenzaehler
If Tastenzaehler > 3 Then
Tastenzaehler = 1
End If
Return
//////////////////////////////////////
Beim Einschalten passiert folgendes :
Rot und Grün sind an, blau aus.
Frage : Wenn bei der Deklaration folgendes steht :
Rot = 0
Gruen = 0
Blau = 0
dann müssten beim Einschalten alle aus sein.
Dann geht es weiter ( Taster ist nicht betätigt) sollte automatisch mit
Fading anfangen.
Fading =1
Nun kommt der Taster auf GND beginnt zu faden..OK ( Blau ist bisschen
kürzer an wie rot oder grün..)
Taster erneut auf GND alle 3 an..OK
Taster erneut auf GND nur Blau..OK
Moment noch was...
Ich beobachte wie fadet:
1 - rot geht von 0 auf 100
2 - bei 100 Rot kommt grün sofort auf 100
3 - Grün geht dann auf 100
4 - Grün geht kurz bei 100 aus dann wieder an
5 - blau von 0 auf 100
also irgendwie ganz komisch..muss gleich noch gucken..
Die Programmlogik sieht einigermaßen ok aus, aber...
Das ist Unsinn:
Enable Timer1
Enable Timer2
Erlaubt die Overflowinterrupts für beide Timer, es sind aber keine ISRs
deklariert.
Die stack/sw stack/frame Definition fehlt.
> Dann geht es weiter ( Taster ist nicht betätigt) sollte automatisch mit> Fading anfangen.
Tastenzaehler wird nicht initialisiert.
Es gibt 'nen Simulator in Bascom. Schon mal durchlaufen lassen ?
2 - bei 100 Rot kommt grün sofort auf 100
na klar, weil beide PWM den gleichen überlauf haben, Du schaltest nur
die Ports um. Sorge mal dafür, das bei Grün neu gezählt wird.
"Grau ist alle Theorie"
Wigbert
> ich gucke jetzt die "farben" an
Hatt' ich gerade beantwortet :D
Start Timerx kannst Du Dir übrigens auch sparen, denn nach Config
Timerx laufen die automatisch.
Stehe auf dem Schlauch...
$regfile = "m8def.dat"
$crystal = 16000000
$swstack = 100
$framesize = 100
Config Portb.1 = Output 'Rot Pin15
Config Portb.2 = Output 'Gruen
Pin16
Config Portb.3 = Output 'Blau Pin 17
Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Up , Compare B Pwm
= Clear Up , Prescale = 1
Config Timer2 = Pwm , Pwm = On , Compare Pwm = Clear Up , Prescale = 1
Enable Interrupts
Rot Alias Compare1a
Gruen Alias Compare1b
Blau Alias Ocr2
Dim Fading As Byte
Dim Tastenzaehler As Byte
'Taster
Config Pinc.5 = Input
Portc.5 = 1
Taster Alias Pinc.5
Rot = 0
Gruen = 0
Blau = 0
Fading = 1
Tastenzaehler = 1
Do
Debounce Taster , 0 , Modus , Sub
If Tastenzaehler = 1 Then
If Fading = 1 Then
Incr Rot
If Rot = 255 Then
Fading = 2
End If
Elseif Fading = 2 Then
Decr Rot
If Rot = 0 Then
Fading = 3
End If
Elseif Fading = 3 Then
Incr Gruen
If Gruen = 255 Then
Fading = 4
End If
Elseif Fading = 4 Then
Decr Gruen
If Gruen = 255 Then
Fading = 5
End If
Elseif Fading = 5 Then
Incr Blau
If Blau = 255 Then
Fading = 6
End If
Elseif Fading = 6 Then
Decr Blau
If Blau = 0 Then
Fading = 1
End If
End If
End If
If Tastenzaehler = 2 Then
Rot = 0
Gruen = 0
Blau = 255
End If
If Tastenzaehler = 3 Then
Rot = 255
Gruen = 255
Blau = 255
End If
Waitms 10
Loop
Modus:
Incr Tastenzaehler
If Tastenzaehler > 3 Then
Tastenzaehler = 1
End If
Return
fadet "irgendwie" nicht sauber..
Langsam habe ich kein Geduld mehr..
ohne start timer läuft nämlich garnicht !!
sauber fading habe ich auch nicht...shhhhhhhhiiittttt
Simulator habe noch nie richtig zum laufen gebracht...nur mit LCD
nun nicht ungeduldig:
immer bei schreiben was passiert.
Also Rot scheint hoch zu zählen und bei 255 wird Decr rot eingeleitet.
Ich kann allerdings in der Sim nicht PWM sehen
Wigbert
> Langsam habe ich kein Geduld mehr..
Das ist schlecht, Bugs sind sehr geduldig :-)
> ohne start timer läuft nämlich garnicht !!
Dann hast Du noch eine Uralt Bascom Version, da war's tatsächlich so,
die Neueren (hab' ich vorausgesetzt) verhalten sich wie von mir
beschrieben.
> sauber fading habe ich auch nicht...shhhhhhhhiiittttt
Hab' Dir den Fehler schon geschrieben, musst halt auch lesen.
> Simulator habe noch nie richtig zum laufen gebracht...nur mit LCD
Das müsste $SIM an den Anfang rein und das Debounce zum Testen
auskommentiert werden.
> ich habs , beim runterzählen schreib mal 0 hin
Das ist schön, daß Du 5 Posts nach meiner auch drauf gekommen bist :D
in meiner Sim wird rot hoch dann runtergezählt
grün hoch und runter
Blau hoch und runter
und von vorne...
Debounce hatte ich erstmal rausgelanssen auch waitms im Code.
Fadet es nun?
MWS (Gast)
>Das ist schön, daß Du 5 Posts nach meiner auch drauf gekommen bist :D
nicht gelesen, der letzte Code ist immer noch falsch
Wigbert
Faden tut er es gibt rot und grün nach dam 100% ein blink effekt...
$regfile = "m8def.dat"
$crystal = 16000000
$swstack = 100
$framesize = 100
Config Portb.1 = Output 'Rot Pin15
Config Portb.2 = Output 'Gruen
Pin16
Config Portb.3 = Output 'Blau Pin 17
Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Up , Compare B Pwm
= Clear Up , Prescale = 1
Config Timer2 = Pwm , Pwm = On , Compare Pwm = Clear Up , Prescale = 1
Enable Interrupts
Start Timer1
Start Timer2
Rot Alias Compare1a
Gruen Alias Compare1b
Blau Alias Ocr2
Dim Fading As Byte
Dim Tastenzaehler As Byte
'Taster
Config Pinc.5 = Input
Portc.5 = 1
Taster Alias Pinc.5
Rot = 0
Gruen = 0
Blau = 0
Fading = 1
Tastenzaehler = 1
Do
Debounce Taster , 0 , Modus , Sub
If Tastenzaehler = 1 Then
If Fading = 1 Then
Incr Rot
If Rot = 255 Then
Fading = 2
End If
Elseif Fading = 2 Then
Decr Rot
If Rot = 0 Then
Fading = 3
End If
Elseif Fading = 3 Then
Incr Gruen
If Gruen = 255 Then
Fading = 4
End If
Elseif Fading = 4 Then
Decr Gruen
If Gruen = 0 Then
Fading = 5
End If
Elseif Fading = 5 Then
Incr Blau
If Blau = 255 Then
Fading = 6
End If
Elseif Fading = 6 Then
Decr Blau
If Blau = 0 Then
Fading = 1
End If
End If
End If
If Tastenzaehler = 2 Then
Rot = 0
Gruen = 0
Blau = 255
End If
If Tastenzaehler = 3 Then
Rot = 255
Gruen = 255
Blau = 255
End If
Waitms 10
Loop
Modus:
Incr Tastenzaehler
If Tastenzaehler > 3 Then
Tastenzaehler = 1
End If
Return
Teste live ohne sim
Die Beitrage habe ich nicht lesen können weil das Antwortfenster offen
war )
Also mit 3 sep LEDs passiert folgendes :
1 - Rot grün an blau aus
2 - rot runter hoch, grün an
3 - rot an grün aus grün an
4 - Blau geht an..
ich schliesse mal meine RGB an..
>>Das ist schön, daß Du 5 Posts nach meiner auch drauf gekommen bist :D> nicht gelesen, der letzte Code ist immer noch falsch
Er ist nicht automatisch falsch, er geht nur nicht. Feiner Unterschied
;-)
Und das obwohl er nach Logik und auch nach Simulator funktioniert. Aber
wenn noch Start Timer benötigt wird, damit die Timer laufen, dann ist
die Bascom Version älter als 2 Jahre, da würd' ich dringend ein Update
empfehlen, bzw. wenn's eine Demo ist, 'ne neue Demo laden.
Was soll ich sagen, es fadet hier auf dem Steckbrett schön vor sich hin
:-)
Einstellungen der Timer wie folgt:
1
Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down , Prescale = 1
2
Config Timer2 = Pwm , Pwm = On , Compare Pwm = Clear Up , Prescale = 1
Ist ein ATM32, macht aber nix.
Und falls der ATM8 ohne externen Quarz läuft, und in den Fuses noch DIV8
drin ist, dann muss das hier:
1
$crystal = 16000000
angepasst werden. Das hat direkte Auswirkung auf Waitms.
> das ganze Fading ist Käse...läuft nicht sauber und "weich"....
Also dem Code entsprechend tut's das hier, solltest nicht zuviel
erwarten, die Farben faden einzeln auf und ab, aber nicht ineinander
über. Das war aber klar wenn man den Code ansieht. Und wenn Du den
Effekt meinst, der bei dunklerer Led das Faden leicht stufig erscheinen
lässt, das ist die logarithmische Helligkeitsempfindlichkeit des Auges,
das bekommst Du mit einer 8Bit PWM nicht besser hin.
If Fading = 1 Then
For Rot = 0 To 255
'Print "Rot" ; Rot Debugg
waitms 1
Next
If Rot = 255 Then
Fading = 2
End If
Du könntest mal das probieren, macht vielleicht langsamer.
In meiner Sim wird nur Blau ordentlich runtergezählt
Wigbert
> Ich glaube ich werde das ganze in die Ecke schmeissen, und mache es> anders....
Kerzen ?
Also bau' ich hier wieder ab, wenn kein Überprüfungsbedarf mehr besteht.
> hast Du das aufgebaut, würde mich mal interessieren ob meine> Variante halbwegs hochdimmt.
Du meinst mit den 1ms Wait in der Rot Bedingung ? Ich hab's wieder
auseinander gesteckt, siehe Post des TO. µC programmieren klappt nur,
wenn man zäh ist und nicht hinschmeisst.
Aber es hatte mit dem letzen Code bereits wie es sollte funktioniert.
(zusätzlich meiner Config Timer Änderungen). Da gab's nichts dran
auszusetzen, also hab' ich auch nichts Weiteres versucht.
Bei der gegebenen Dimmgeschwindigkeit war auch fast gar nichts von einer
stufigen Dimmung bemerkbar, das ist besser erkennbar, wenn's sehr
langsam dimmt.
Angeschlossen war eine Power RGB Led über Mosfet Treiber, allerdings
nicht mit voller Leistung von 3W, vielleicht ein Zehntel davon.
@MWS (Gast)
>Bei der gegebenen Dimmgeschwindigkeit war auch fast gar nichts von einer>stufigen Dimmung bemerkbar, das ist besser erkennbar, wenn's sehr>langsam dimmt
das hatte ich fast befürchtet.
Wigbert
Nun habe es FERTIG !!!!
Diese Version läuft so wie ich erwartet habe.
Bin zurück auf meinen alten Timer...habe wieder PWR_interrupt Sub
genommen
und habe ich Modus erstmal rausgeschmissen....also ich habe jetzt eine
Variante die sauber fadet...
Habe gerade auf dem Steckbrett..
$regfile = "m8def.dat"
$crystal = 16000000
$swstack = 100
$framesize = 100
Dim Pwmctr As Byte
Dim Rot As Byte
Dim Gruen As Byte
Dim Blau As Byte
Config Timer0 = Timer , Prescale = 1
On Ovf0 Pwm_interrupt
Enable Ovf0
Enable Interrupts
Ddrb = &B11111111 ' PORTB as
output
Ddrc = &B11111111 ' PORTC as
output
Ddrd = &B11111111 ' PORTD as
output
Portb = 0
Portc = 0
Portd = 0
Portb.0 = 0
Do
'Grün einfaden
'-------------
Do
Incr Gruen
Gosub Zeit
Loop Until Gruen > 254
'Rot ausfaden
'------------
Do
Decr Rot
Gosub Zeit
Loop Until Rot = 0
'Blau einfaden
'-------------
Do
Incr Blau
Gosub Zeit
Loop Until Blau > 254
'grün ausfaden
'-------------
Do
Decr Gruen
Gosub Zeit
Loop Until Gruen = 0
'Rot einfaden
'------------
Do
Incr Rot
Gosub Zeit
Loop Until Rot > 254
'Blau ausfaden
'-------------
Do
Decr Blau
Gosub Zeit
Loop Until Blau = 0
Loop
Zeit:
Waitus 100
Return
Pwm_interrupt:
Incr Pwmctr
If Rot > Pwmctr Then Set Portd.7 Else Reset Portd.7
If Rot > Pwmctr Then Set Portd.4 Else Reset Portd.4
If Rot > Pwmctr Then Set Portd.1 Else Reset Portd.1
If Rot > Pwmctr Then Set Portc.2 Else Reset Portc.2
If Gruen > Pwmctr Then Set Portd.6 Else Reset Portd.6
If Gruen > Pwmctr Then Set Portd.3 Else Reset Portd.3
If Gruen > Pwmctr Then Set Portd.0 Else Reset Portd.0
If Gruen > Pwmctr Then Set Portc.1 Else Reset Portc.1
If Blau > Pwmctr Then Set Portd.5 Else Reset Portd.5
If Blau > Pwmctr Then Set Portd.2 Else Reset Portd.2
If Blau > Pwmctr Then Set Portc.3 Else Reset Portc.3
If Blau > Pwmctr Then Set Portc.0 Else Reset Portc.0
Return
So ist erstmal die Lampe fertig, später werde ich nochmal ummodeln...