Forum: Mikrocontroller und Digitale Elektronik Ein kleines Projekt für BASCOM Änfänger Vol2


von Thomas Kiss (Gast)


Lesenswert?

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 :
1
$regfile = "m8def.dat"
2
$crystal = 16000000
3
4
Dim Pwm As Byte
5
Dim Rot As Byte
6
Dim Grün As Byte
7
Dim Blau As Byte
8
9
Config Timer0 = Timer , Prescale = 1
10
On Ovf0 Pwm_interrupt
11
Enable Ovf0
12
Enable Interrupts
13
14
Ddrb = &B11111111                                      ' PORTB als Ausgang
15
Ddrc = &B11111111                                      ' PORTC als Ausgang
16
Ddrd = &B11111111                                      ' PORTD als Ausgang
17
18
Portb = 0
19
Portc = 0
20
Portd = 0
21
22
Portb.0 = 0
23
24
25
26
Do
27
28
'Grün ein
29
Do
30
 Incr Grün
31
 Gosub Zeit
32
Loop Until Grün > 254
33
34
'Rot aus
35
Do
36
 Decr Rot
37
 Gosub Zeit
38
Loop Until Rot = 0
39
40
'Blau ein
41
Do
42
 Incr Blau
43
 Gosub Zeit
44
Loop Until Blau > 254
45
46
'Grün aus
47
Do
48
 Decr Grün
49
 Gosub Zeit
50
Loop Until Grün = 0
51
52
'Rot ein
53
Do
54
 Incr Rot
55
 Gosub Zeit
56
Loop Until Rot > 254
57
58
'Blau aus
59
Do
60
 Decr Blau
61
 Gosub Zeit
62
Loop Until Blau = 0
63
64
Loop
65
66
Zeit:
67
Waitms 1                                                   'PWM Counter 
68
Return
69
70
Pwm_interrupt:                                              'PWM Interrupt
71
Incr Pwm
72
73
If Grün > Pwm Then Set Portd.6 Else Reset Portd.6
74
If Grün > Pwm Then Set Portd.3 Else Reset Portd.3
75
If Grün > Pwm Then Set Portd.0 Else Reset Portd.0
76
If Grün > Pwm Then Set Portc.1 Else Reset Portc.1
77
78
If Rot > Pwm Then Set Portd.7 Else Reset Portd.7
79
If Rot > Pwm Then Set Portd.4 Else Reset Portd.4
80
If Rot > Pwm Then Set Portd.1 Else Reset Portd.1
81
If Rot > Pwm Then Set Portc.2 Else Reset Portc.2
82
83
84
If Blau > Pwm Then Set Portd.5 Else Reset Portd.5
85
If Blau > Pwm Then Set Portd.2 Else Reset Portd.2
86
If Blau > Pwm Then Set Portc.3 Else Reset Portc.3
87
If Blau > Pwm Then Set Portc.0 Else Reset Portc.0
88
89
Return

: Verschoben durch User
von Karl H. (kbuchegg)


Lesenswert?

Thomas Kiss schrieb:

> Wäre dankbar wie immer für Eure Tipps.

Der erste Tip lautet:
Fragen nicht in die Codesammlung.
Thread verschoben.

von Karl H. (kbuchegg)


Lesenswert?

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)

von Thomas Kiss (Gast)


Lesenswert?

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 !!!

von Wigbert P. (wigbert) Benutzerseite


Lesenswert?

>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

von Thomas Kiss (Gast)


Lesenswert?

Nicht ganz kapiert...hmmmm

von Kluchscheißernder N. (kluchscheisser)


Lesenswert?

Deinem Konzept kann ich nichts abgewinnen. Taster entprellt man im 
Hintergrund. Schau Dir das mal an:
http://www.roboternetz.de/wissen/index.php/Bascom_Debounce_ISR_in_Assembler

MfG

von Wigbert P. (wigbert) Benutzerseite


Lesenswert?

>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.

von Thomas Kiss (Gast)


Lesenswert?

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...

von Thomas Kiss (Gast)


Lesenswert?

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

von Wigbert P. (wigbert) Benutzerseite


Lesenswert?

>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

von Thomas Kiss (Gast)


Lesenswert?

Gemeint dies hier ?

'Taster1 Mode einstellen
Config Pinc.5 = Input
Portc.5 = 1
Taster1 Alias Pinc.5

LED

Config Pinb.3 = Output               'PWM Output blau Timer2
Config Pinb.2 = Output               'PWM Output grün Timer1
Config Pinb.1 = Output                'PWM Output rot Timer1

Red Alias Ocr2                       'PIN 17 PB3   Blau
Green Alias Ocr1al                   'PIN 16 PB2   Grün
Blue Alias Ocr1bl                    'PIN 15 PB1   Rot

von Wigbert P. (wigbert) Benutzerseite


Lesenswert?

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

von Thomas Kiss (Gast)


Lesenswert?

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

von Wigbert P. (wigbert) Benutzerseite


Lesenswert?

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.

von Thomas Kiss (Gast)


Lesenswert?

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 ?

von Wigbert P. (wigbert) Benutzerseite


Lesenswert?

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

von Thomas Kiss (Gast)


Lesenswert?

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..

von Karl H. (kbuchegg)


Lesenswert?

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.

von Thomas Kiss (Gast)


Lesenswert?

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...

von Wigbert P. (wigbert) Benutzerseite


Lesenswert?

na dann schau Dir mal an, bei welcher Flanke Debounce schaltet
Aus Fader kommst Du auch nicht raus.

Schade um meine letzten Antworten.

Wigbert

von Wigbert P. (wigbert) Benutzerseite


Lesenswert?

was ist den mit Pullup für den Tasterpin

Wigbert

von Karl H. (kbuchegg)


Lesenswert?

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

von Thomas Kiss (Gast)


Lesenswert?

Sorry Wigbert, wollte niemanden beleidigen !!

von Thomas Kiss (Gast)


Lesenswert?

Also ich packe alles ( in diesem Fall ) in die Do loop und frage den 
Tastenwert ab ...

von Karl H. (kbuchegg)


Lesenswert?

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.

von Thomas Kiss (Gast)


Lesenswert?

Ups....grössere Aufgabe...brauche noch Zeit...Melde mich Super Dank an 
ALLE !!

von Thomas Kiss (Gast)


Lesenswert?

Nachtrag : Habe kurz mal den Code "übernommen"..Moduswahl ist wirklich 
gut, aber im Fading Modus, gibt es ein wildes pulsieren...

von Kluchscheißernder N. (kluchscheisser)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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.

von Wigbert P. (wigbert) Benutzerseite


Lesenswert?

@ 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

von Thomas Kiss (Gast)


Lesenswert?

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..

von Karl H. (kbuchegg)


Lesenswert?

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.

von Kluchscheißernder N. (kluchscheisser)


Lesenswert?

Danke!!!

MfG

von Thomas Kiss (Gast)


Lesenswert?

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 ?

von Karl H. (kbuchegg)


Lesenswert?

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 :-)

von Thomas Kiss (Gast)


Lesenswert?

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 
..

von Karl H. (kbuchegg)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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.

von Thomas Kiss (Gast)


Lesenswert?

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

von Thomas Kiss (Gast)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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.

von Thomas Kiss (Gast)


Lesenswert?

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.

von Wigbert P. (wigbert) Benutzerseite


Lesenswert?

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 Thomas Kiss (Gast)


Lesenswert?

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

von Wigbert P. (wigbert) Benutzerseite


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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.

von Thomas Kiss (Gast)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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?)

von Karl H. (kbuchegg)


Lesenswert?

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!

von Thomas Kiss (Gast)


Lesenswert?

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 ?????

von Karl H. (kbuchegg)


Lesenswert?

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.

von Thomas Kiss (Gast)


Lesenswert?

Mein letzter Versuch...

muss ich irgendwo angeben ( SUB )

Fading:
1= incr Rot
2= decr rot
3= incr Grün
4= decr Grün
5= incr Blau
6= decr Blau

 if fading=1 then
    incr Rot
       if rot = 255 then
          fading=fading+1



ich gebe auf....

von Karl H. (kbuchegg)


Lesenswert?

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.

von DrSeltsam (Gast)


Lesenswert?

Mein Gott, jetzt hat er's! ;-)

von Karl H. (kbuchegg)


Lesenswert?

DrSeltsam schrieb:
> Mein Gott, jetzt hat er's! ;-)

Es grünt so grün, wenn Spaniens Fader hochziehn

(OK. holpert ein wenig)

von Thomas Kiss (Gast)


Lesenswert?

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...

von Thomas Kiss (Gast)


Lesenswert?

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

von Wigbert P. (wigbert) Benutzerseite


Lesenswert?

>Meine Nerven...LoL....
wieso Deine Nerven? Alle fiebern seit Stunden mit. Grins.

Zeig mal fürs Protokoll irgendwann Dein Aufbau.

Wigbert

von Paul B. (paul_baumann)


Lesenswert?

>if Ergebnis = Ok than Lob elsif Ergebnis= Nerven Fertig

Diese Zeile ist elementar wichtig für das tadellose Funktionieren des
Programmes.
:-))
MfG Paul

von Karl H. (kbuchegg)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

LOL
1
Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Up , Compare B Pwm
2
= Clear Up , Prescale = 1
3
Enable Timer1
4
Start Timer1
5
Config Timer2 = Pwm , Pwm = On , Compare Pwm = Clear Down , Prescale = 1
6
Enable Timer2
7
Start Timer2
8
9
Rot Alias Compare1a
10
Gruen Alias Compare1b
11
Blau Alias Ocr2

Du Fuchs, du!
Du hast die PWM ja jetzt in Hardware gelegt!

(Schmunzel, gefällt mir)

von Thomas Kiss (Gast)


Lesenswert?

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"...

von Karl H. (kbuchegg)


Lesenswert?

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.

von Thomas Kiss (Gast)


Lesenswert?

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...

von Karl H. (kbuchegg)


Lesenswert?

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.

von Thomas Kiss (Gast)


Lesenswert?

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

von Thomas Kiss (Gast)


Lesenswert?

Mein letztes Projekt war :

http://www.qube-solutions.de/shop/show_product.php?cPath=83&products_id=211

Nun sollten wir hier im Forum gemeinsam eine 8x8x8 RGB Cube entwickeln 
!!

von Wigbert P. (wigbert) Benutzerseite


Lesenswert?

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

von thomaskiss (Gast)


Lesenswert?

Werde gleich LIVE probieren, mal sehen wie die Effekte sind, danach 
kommt tuning..Ich weiss wo man drehen kann, muss...

von Thomas Kiss (Gast)


Lesenswert?

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..

von MWS (Gast)


Lesenswert?

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 ?

von Wigbert P. (wigbert) Benutzerseite


Lesenswert?

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

von MWS (Gast)


Lesenswert?

Hier muss Gruen = 0 gesetzt werden:
1
  Elseif Fading = 4 Then
2
    Decr Gruen
3
    If Gruen = 255 Then
4
    Fading = 5
5
    End If

von Thomas Kiss (Gast)


Lesenswert?

Danke ..

nun der Header: Ist soweit OK ?

$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
Start Timer1
Config Timer2 = Pwm , Pwm = On , Compare Pwm = Clear Up , Prescale = 1
Start Timer2
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

ich gucke jetzt die "farben" an

von MWS (Gast)


Lesenswert?

> 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.

von Thomas Kiss (Gast)


Lesenswert?

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..

von Thomas Kiss (Gast)


Lesenswert?

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

von Wigbert P. (wigbert) Benutzerseite


Lesenswert?

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

von Wigbert P. (wigbert) Benutzerseite


Lesenswert?

Elseif Fading = 4 Then
    Decr Gruen
    If Gruen = 255 Then ????????
    Fading = 5
    End If

ich habs , beim runterzählen schreib mal 0 hin


Wigbert

von MWS (Gast)


Lesenswert?

> 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

von Wigbert P. (wigbert) Benutzerseite


Lesenswert?

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

von Thomas Kiss (Gast)


Lesenswert?

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 )

von Thomas Kiss (Gast)


Lesenswert?

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..

von Thomas Kiss (Gast)


Lesenswert?

irgendwie ist alles Käse...

von MWS (Gast)


Lesenswert?

>>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.

von Thomas Kiss (Gast)


Lesenswert?

Ich habe die Version 1.11.9.8 Demo

Grün ist nicht alleine das Problem, das ganze Fading ist Käse...läuft 
nicht sauber und "weich"....

von MWS (Gast)


Lesenswert?

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.

von Wigbert P. (wigbert) Benutzerseite


Lesenswert?

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

von Thomas Kiss (Gast)


Lesenswert?

Ich glaube ich werde das ganze in die Ecke schmeissen, und mache es 
anders....

von MWS (Gast)


Lesenswert?

> 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.

von Wigbert P. (wigbert) Benutzerseite


Lesenswert?

@ MWS (Gast)

hast Du das aufgebaut, würde mich mal interessieren ob meine
Variante halbwegs hochdimmt.

Wigbert

von MWS (Gast)


Lesenswert?

> 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.

von Wigbert P. (wigbert) Benutzerseite


Lesenswert?

@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

von Thomas Kiss (Gast)


Lesenswert?

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...

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.