Forum: Mikrocontroller und Digitale Elektronik Zwei kleine Fragen zu Bascom Do Loop Schleife


von Bastler (Gast)


Lesenswert?

Hallo Jungs hab mal wieder eine kleine Frage ( Der nicht fragt bleibt 
dumm..)

Wie bereits bekannt sein sollte bastele mit RGBs herum und dazu hätte 
ich mal folgende Frage.

Ich erzeuge hardware PWM Signale mit Bascom die meine RGBs steuern, 
soweit so gut.

Ich habe festgestellt wenn der AVR die Do Loop schleife wieder holt, 
gibt es einen kleine "aussetzter bzw dunkel Phase"

Bsp:

Do
Rot erhöhen
Grün erhöhen
Blau erhöhen
Blau verringern
Grün verringern
Loop

Nun wenn der erster durchlauf beendet wird, geht Rot kurz aus. Frage 
warum ?

Zweite Frage wäre wie kann ich es am besten machen, dass keine Dunkle 
Momente enstehen ? Hoofe habe mich verständlich ausgedrückt.

Danke im Voraus

von Klaus aus der Kasse (Gast)


Lesenswert?

Fehler in Zeile 42

von Helfer (Gast)


Lesenswert?

Hallo Bastler,

Poste mal den ganzen Code, denn an der Do-Loop Schleife allein, liegt es 
nicht.

Evtl. Überlaufen des Compare Registers der roten LED o.ä.

von Bastler (Gast)


Lesenswert?

Klaus aus der Kasse schrieb:
> Fehler in Zeile 42

Danke für den eindeutigen Hinweis

von Weingut P. (weinbauer)


Lesenswert?

Bastler schrieb:
> Klaus aus der Kasse schrieb:
>> Fehler in Zeile 42
>
> Danke für den eindeutigen Hinweis

Da hat er leider recht, ohne den ganzen Code kann man nicht sagen wo der 
Controller Zeit verbummelt oder welche Variablen überlaufen ... die 42 
bezieht sich auf "Per Anhalter durch die Galaxis" wo die Antwort auf das 
Leben, das Universum und alles eben als 42 angegeben ist.

ist ironisch gemeint :)

von Bastler (Gast)


Lesenswert?

Nun der Code

'*********************************************************************** 
********
' Schalter an IntO    High = "Mood-Modus"    Low = "Beleuchtungs-Modus"
' 10k-Poti an PC.0
' LED Rot  an PB.1
' LED Grün an PB.2
' LED Blau an PB.3
'*********************************************************************** 
********

$regfile = "m8def.dat"
$crystal = 16000000
$hwstack = 100
$swstack = 100
$framesize = 100

Config Portd.0 = Input
Config Portd.1 = Input
Portd.0 = 1
Portd.1 = 1

Config Portb.1 = Output                                     'LED Rot
Config Portb.2 = Output                                     'LED Gruen
Config Portb.3 = Output                                     'LED Blau

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 Down , Prescale = 1
Enable Timer1
Enable Timer2
 Start Timer1
 Start Timer2

Config Adc = Single , Prescaler = Auto , Reference = Avcc
 Start Adc

Dim Pause As Word
Dim Speed As Word
Dim Adc0 As Word

Dim S1 As String * 3                                        'Rot 
'
Dim S2 As String * 3                                        'Gruen
Dim S3 As String * 3                                        'Blau
Dim S4 As String * 3                                        'adc0


R Alias Compare1a
G Alias Compare1b
B Alias Ocr2

Config Lcdpin = Pin , Db7 = Portb.0 , Db6 = Portd.7 , Db5 = Portd.6 , _
      Db4 = Portd.5 , E = Portc.4 , Rs = Portc.5
Config Lcd = 16 * 2
Cls
Cursor Off



On Int0 Beleuchtung
Enable Int0
Config Int0 = Low Level
Enable Interrupts


'*********************************************************************** 
********
' Einstellen der Dimm-Geschwindigkeit
'*********************************************************************** 
********

Pause = 2
Speed = 30

'*********************************************************************** 
********
' Mood-Modus         fadet alle Farben durch
'*********************************************************************** 
********

Mood:



Adc0 = Getadc(0)
Speed = Adc0 / 4


Locate 1 , 1
Lcd "   Fading Mode  "
Locate 2 , 1
Lcd "   is running   "


Do
Incr R                                                      'Rot hoch
Waitms Speed
Loop Until R = 255
Waitms Pause


Do
Incr G                                                      'Grün hoch
Waitms Speed
Loop Until G = 255
Waitms Pause


Do
Incr B                                                      'Blau  hoch
Waitms Speed
Loop Until B = 255
Waitms Pause



Do                                                          'Rot runter
Decr R
Waitms Speed
Loop Until R = 0
Waitms Pause

Do                                                          'Grün runter
Decr G
Waitms Speed
Loop Until R = 0
Waitms Pause


Do                                                          'Blau runter
Decr B
Waitms Speed
Loop Until B = 0
Waitms Pause

Do
Incr R                                                      'Rot hoch
Waitms Speed
Loop Until R = 255
Waitms Pause

Return

'*********************************************************************** 
********
' Beleuchtungs-Modus        6 Grundfarben können mittels ADC angewählt 
werden
'*********************************************************************** 
********

Beleuchtung:



Do

Adc0 = Getadc(0)

S1 = Str(r)                                                 'Rot
S1 = Format(s1 , "000")
'----------------------------------
S2 = Str(g)                                                 'Gruen
S2 = Format(s2 , "000")
'------------------------------------
S3 = Str(b)                                                 'Blau
S3 = Format(s3 , "000")
'------------------------------------
S4 = Str(adc0)
S4 = Format(s4 , "000")



Locate 1 , 1
Lcd "ADC0" ; "  " ; Adc0
Locate 2 , 1
Lcd "R:" ; S1 ; "G:" ; S2 ; "B:" ; S3

Select Case Adc0


Case 1 To 50                                                'Rot 100
R = 255
G = 0
B = 0
Case 60 To 100 :                                            'Rot 100 
Grün 50
R = 255
G = 125
B = 0
Case 110 To 200 :                                           'Rot 100 
Grün 100
R = 255
G = 255
B = 0
Case 210 To 300 :                                           'Rot 100 
Grün 100 Blau 125
R = 255
G = 255
B = 125
Case 310 To 400:                                            'Rot 100 
Grün 100 Blau 100
R = 255
G = 255
B = 255
Case 510 To 600:                                            'Rot 50 Grün 
100 Blau  100
R = 125
G = 255
B = 255

Case 610 To 700:                                            'Rot 0 Grün 
100 Blau 100
R = 0
G = 255
B = 255

Case 710 To 800:                                            'Rot 0 Grün 
50 Blau 100
R = 0
G = 125
B = 255

Case 810 To 950:                                            'Rot 0 Grün 
0 Blau 100
R = 0
G = 0
B = 255

End Select

Loop

Return

von Bastler (Gast)


Angehängte Dateien:

Lesenswert?

Und der Plan

von MWS (Gast)


Lesenswert?

Bastler schrieb:
> Nun wenn der erster durchlauf beendet wird, geht Rot kurz aus. Frage
> warum ?

µC bootet neu, weil Return ohne Gosub ausgeführt wird -> Stackunterlauf

Bastler schrieb:
> Enable Timer1
> Enable Timer2

Nimm das raus, Du hast keine ISRs definiert.

von Bastler (Gast)


Lesenswert?

Nach meinem Verständnis habe den Code so erstellt:
( lasse mich gerne belehren und nehme gerne Beispiele an )

Nun wenn an Int0 Eingang eine Veränderung eintritt also der Schalter 
wird umgelegt (Hi-Low) wird das Programm sofort unterbrochen und springt 
zu "sub" und dort wird so lange Do-Loop ausgeführt bis der Schalter 
wieder umgelegt wird. Also auf dem Steckbrett funzt auch soweit. Mit 
dieser Variante habe ich erreicht, im Gegensatz zu if Then Gosub..daß 
der Programmwechsel sofort erfolgt.

Wo fehlt jetzt der Gosub ?

von Weingut P. (weinbauer)


Lesenswert?

aua ... Endlosschleife in ISR, LCD-Ausgabe in ISR ... Getadc in ISR ...
schöner Programmierstil ist das leider nicht ... das gehört alles in 
eine Mainloop und die Tastenabfrage kannst DU dort auch locker per 
debounce machen

von Jonathan S. (joni-st) Benutzerseite


Lesenswert?

Dein Programmkonzept ist recht "merkwürdig"... Du hast keine 
Hauptschleife. Dein µC läuft direkt in die erste ISR rein, verschluckt 
sich am Return und läuft Amok. Das Programmkonzept solltest du nochmal 
überdenken. Ich würde das in etwa so machen (Pseudocode):
1
Timer1 konfigurieren
2
3
Timer1 an
4
Interrupts an
5
6
'Keine Tasteninterrupts definieren!!!
7
8
Do
9
  If Taste1 gedrückt Then
10
    Set ModusFlag
11
  EndIf
12
  If Taste2 gedrückt Then
13
    Clear ModusFlag
14
  EndIf
15
Loop
16
17
Timer1ISR:
18
  'HIER DÜRFEN KEINE (LANGEN / ENDLOS-)SCHLEIFEN VORKOMMEN!!! SONST LÄUFT DEIN µC AMOK!!!
19
  If ModusFlag = 1 Then
20
    Mache einen(!) Schritt von Modus1
21
  Else
22
    Mache einen(!) Schritt von Modus2
23
  EndIf
24
Return

Ganz wichtig: Jeder Code braucht eine Endlosschleife (Hauptschleife), in 
die er direkt nach dem Start läuft und in der das Hauptprogramm steht!!!


Gruß
Jonathan

von Bastler (Gast)


Lesenswert?

Meine aller erste Variante war auch so "etwa" das Problem was ich hatte, 
wenn sehr langsam gefadet wurde, reagierte das programm nicht sofort auf 
Mode wechsel..

von Weingut P. (weinbauer)


Lesenswert?

Du hast eine mood: und eine return Anweisung, aber keinen Einsprung in 
die Mood-Subroutine, was sie nämlich sein muss, da sonst der Return 
nicht funktioniert. Return springt aus einer Subroutine raus, die zuvor 
aufgerufen wurde, nur wohin soll er zurück springen wenn er garnicht 
gesprungen ist??

Das führ unweigerlich dazu dass irgendwann ein Reset ausgeführt wird.

Wenn überhaupt, dann ist der mood-Teil Deine Mainloop, die dann einfach
mit do .... loop in sich geschlossen wird, nicht mit return.

Du kannst aber auch eine Mainloop voranstellen ,
die dann einfach

do
gosub mood
loop

ist.

wesentlich besser wirds dann noch wenn Du

do
  if taster = irgendwas then gosub mood
  if taster = nicht_irgendwas then gosub beleuchtung
loop

in der "beleuchtung dann einfach die endlosschleife raus und den 
interrupt auf den müll und gut ist.

von Jonathan S. (joni-st) Benutzerseite


Lesenswert?

Dann hast Du da was missverstanden. ISR müssen so schnell wie möglich 
abgearbeitet werden. Also bei jedem ISR-Aufruf nur einen Fading-Schritt 
machen. Also etwa so:
1
TimerISR:
2
  'Das hier wird regelmäßig aufgerufen
3
  If Modus = 1 Then
4
    If FadingSchritt = 0 Then
5
      Incr R
6
      If R = 255 Then Incr FadingSchritt
7
    
8
    ElseIf FadingSchritt = 1 Then
9
      Incr G
10
      If G = 255 Then Incr FadingSchritt
11
    
12
    ElseIf FadingSchritt = 2 Then
13
      Incr B
14
      If B = 255 Then Incr FadingSchritt
15
    
16
    ElseIf FadingSchritt = 3 Then
17
      Decr R
18
      If R = 0 Then Incr FadingSchritt
19
    
20
    ElseIf FadingSchritt = 4 Then
21
      Decr G
22
      If G = 0 Then Incr FadingSchritt
23
    
24
    ElseIf FadingSchritt = 5 Then
25
      Decr B
26
      If B = 0 Then FadingSchritt = 0
27
    
28
    EndIf
29
  Else
30
    'FadingModus 2
31
  EndIf
32
Return

So verständlich?


Gruß
Jonathan

von Weingut P. (weinbauer)


Lesenswert?

was den direkten modewechsel angeht, da kannst du einfach in jeder der 
loops in "mood" nen exit loop reinhängen, der per if taste=gedrückt 
ausgelöst wird ... dann rasselt das programm einfach durch die loops 
nahc unten durch bei gedrückter taste.

von Bastler (Gast)


Lesenswert?

Do
  If Taste1 gedrückt Then
    Set ModusFlag
  EndIf
  If Taste2 gedrückt Then
    Clear ModusFlag
  EndIf
Loop
-------------------------------------------------
Möchte mit einem "umschalter" machen

würde so gehen : ?
do
If Mode=1 then
 gosub Mod
end if
If Mode=0 then
gosub Fade
end if
loop

Mod
adc abfragen
Select Case
Return

Fade
Fading routine
Return

Ob es in der Fading routine sauber drinn bleibt bezweifele ich..hmmm

von Jonathan S. (joni-st) Benutzerseite


Lesenswert?

Nein, so wird das nichts. Wenn das Programm erstmal in einer Routine 
drinn ist, reagiert es nicht mehr auf einen Tastendruck. Mach es mal so, 
wie in meinen zwei Beispielcodes :)


Gruß
Jonathan

von Bastler (Gast)


Lesenswert?

Ich probiere, danke...

von Bastler (Gast)


Lesenswert?

Habe folgendes,

so verstanden :

Wenn Der Taster O ist dann geht in den SUB Beleuchtung dort je nach Poti 
leuchtet etwas..

Wenn der Taster ist 1 also auf High, wird festgestellt in der Isr dann 
macht die Fading bis Fadingschritt 0 ist dann wird so lange wiederholt 
bis Modus auf 1 ist sonst geht er raus bzw in den SUB Beleuchtung
1
'*******************************************************************************
2
' Schalter an PD.!    High = "Mood-Modus"    Low = "Beleuchtungs-Modus"
3
' 10k-Poti an PC.0
4
' LED Rot  an PB.1
5
' LED Grün an PB.2
6
' LED Blau an PB.3
7
'*******************************************************************************
8
9
$regfile = "m8def.dat"
10
$crystal = 16000000
11
$hwstack = 100
12
$swstack = 100
13
$framesize = 100
14
15
'Taster Modus
16
Config Pind.1 = Input
17
Portd.1 = 1
18
Modus Alias Pind.1
19
20
Config Portb.1 = Output                                     'LED Rot
21
Config Portb.2 = Output                                     'LED Gruen
22
Config Portb.3 = Output                                     'LED Blau
23
24
Config Timer1 = Timer , Prescale = 1
25
On Timer0 Timer0_isr
26
27
Config Adc = Single , Prescaler = Auto , Reference = Avcc
28
 Start Adc
29
30
Dim Pause As Word
31
Dim Speed As Word
32
Dim Adc0 As Word
33
Dim Fadingschritt As Byte
34
35
36
R Alias Compare1a
37
G Alias Compare1b
38
B Alias Ocr2
39
40
41
Do
42
43
If Modus = 0 Then
44
   Gosub Beleuchtung
45
End If
46
47
48
'Hier kommt dann LCD Ausgabe rein
49
50
51
Loop
52
53
Timer0_isr:
54
55
'Das hier wird regelmäßig aufgerufen
56
  If Modus = 1 Then
57
    If FadingSchritt = 0 Then
58
      Incr R
59
      If R = 255 Then Incr FadingSchritt
60
61
    ElseIf FadingSchritt = 1 Then
62
      Incr G
63
      If G = 255 Then Incr FadingSchritt
64
65
    ElseIf FadingSchritt = 2 Then
66
      Incr B
67
      If B = 255 Then Incr FadingSchritt
68
69
    ElseIf FadingSchritt = 3 Then
70
      Decr R
71
      If R = 0 Then Incr FadingSchritt
72
73
    ElseIf FadingSchritt = 4 Then
74
      Decr G
75
      If G = 0 Then Incr FadingSchritt
76
77
    ElseIf FadingSchritt = 5 Then
78
      Decr B
79
      If B = 0 Then FadingSchritt = 0
80
81
    EndIf
82
  Else
83
    Gosub Beleuchtung
84
  EndIf
85
Return
86
87
Beleuchtung:
88
89
Adc0 = Getadc(0)
90
91
Select Case Adc0
92
93
94
Case 1 To 50                                                'Rot 100
95
R = 255
96
G = 0
97
B = 0
98
Case 60 To 100 :                                            'Rot 100 Grün 50
99
R = 255
100
G = 125
101
B = 0
102
Case 110 To 200 :                                           'Rot 100 Grün 100
103
R = 255
104
G = 255
105
B = 0
106
Case 210 To 300 :                                           'Rot 100 Grün 100 Blau 125
107
R = 255
108
G = 255
109
B = 125
110
Case 310 To 400:                                            'Rot 100 Grün 100 Blau 100
111
R = 255
112
G = 255
113
B = 255
114
Case 510 To 600:                                            'Rot 50 Grün 100 Blau  100
115
R = 125
116
G = 255
117
B = 255
118
119
Case 610 To 700:                                            'Rot 0 Grün 100 Blau 100
120
R = 0
121
G = 255
122
B = 255
123
124
Case 710 To 800:                                            'Rot 0 Grün 50 Blau 100
125
R = 0
126
G = 125
127
B = 255
128
129
Case 810 To 950:                                            'Rot 0 Grün 0 Blau 100
130
R = 0
131
G = 0
132
B = 255
133
134
End Select
135
136
137
Return

von Karl H. (kbuchegg)


Lesenswert?

Bastler schrieb:
> Habe folgendes,
>
> so verstanden :

Dein Grundkonzept sieht jetzt gut aus.
Aber ehe du da jetzt weiter künstelst, bring das jetzt erst mal zum 
Laufen und teste es!
Die beiden schlimmsten Fehler, die man speziell am Anfang machen kann
* zu viel Code auf einmal schreiben, der nicht getestet ist
* an einmal geschriebenem Code sklavisch festhalten und nur ja keine
  Änderung zulassen

von Karl H. (kbuchegg)


Lesenswert?

So
1
Config Timer1 = Timer , Prescale = 1
2
On Timer0 Timer0_isr

wird da nichts faden. Wenn du dich an den Overflow vom Timer 0 hängst, 
dann musst du auch den Timer 0 aktivieren.

Und die Timereinstellungen für Timer 1 und Timer 2, die dann die PWM für 
die LED machen, fehlen auch noch.

von Lehrmann M. (ubimbo)


Lesenswert?

Fhutdhb Ufzjjuz schrieb:
> die 42
> bezieht sich auf "Per Anhalter durch die Galaxis" wo die Antwort auf das
> Leben, das Universum und alles eben als 42 angegeben ist.

Im übrigen auch 7 bit binär: 0101010

von Bastler (Gast)


Lesenswert?

Hatte noch beim Timer Config was übersehen :

trotzdem wird weder gefadet noch Farben verändert wenn Pind.1 high oder 
low ist. Was habe ich übersehen oder falsch verstanden ?

'*********************************************************************** 
********
' Schalter an PD.!    High = "Mood-Modus"    Low = "Beleuchtungs-Modus"
' 10k-Poti an PC.0
' LED Rot  an PB.1
' LED Grün an PB.2
' LED Blau an PB.3
'*********************************************************************** 
********

$regfile = "m8def.dat"
$crystal = 16000000
$hwstack = 100
$swstack = 100
$framesize = 100

'Taster Modus
Config Pind.1 = Input
Portd.1 = 1
Modus Alias Pind.1

Config Portb.1 = Output                                     'LED Rot
Config Portb.2 = Output                                     'LED Gruen
Config Portb.3 = Output                                     'LED Blau

Config Timer0 = Timer , Prescale = 64
On Timer0 Timer0_isr
Enable Interrupts

Config Adc = Single , Prescaler = Auto , Reference = Avcc
 Start Adc

Dim Pause As Word
Dim Speed As Word
Dim Adc0 As Word
Dim Fadingschritt As Byte


R Alias Compare1a
G Alias Compare1b
B Alias Ocr2



Do

If Modus = 0 Then
   Gosub Beleuchtung
End If


'Hier kommt dann LCD Ausgabe rein


Loop

Timer0_isr:

'Das hier wird regelmäßig aufgerufen
  If Modus = 1 Then
    If FadingSchritt = 0 Then
      Incr R
      If R = 255 Then Incr FadingSchritt

    ElseIf FadingSchritt = 1 Then
      Incr G
      If G = 255 Then Incr FadingSchritt

    ElseIf FadingSchritt = 2 Then
      Incr B
      If B = 255 Then Incr FadingSchritt

    ElseIf FadingSchritt = 3 Then
      Decr R
      If R = 0 Then Incr FadingSchritt

    ElseIf FadingSchritt = 4 Then
      Decr G
      If G = 0 Then Incr FadingSchritt

    ElseIf FadingSchritt = 5 Then
      Decr B
      If B = 0 Then FadingSchritt = 0

    EndIf
  Else
    Gosub Beleuchtung
  EndIf
Return

Beleuchtung:

Adc0 = Getadc(0)

Select Case Adc0


Case 1 To 50                                                'Rot 100
R = 255
G = 0
B = 0
Case 60 To 100 :                                            'Rot 100 
Grün 50
R = 255
G = 125
B = 0
Case 110 To 200 :                                           'Rot 100 
Grün 100
R = 255
G = 255
B = 0
Case 210 To 300 :                                           'Rot 100 
Grün 100 Blau 125
R = 255
G = 255
B = 125
Case 310 To 400:                                            'Rot 100 
Grün 100 Blau 100
R = 255
G = 255
B = 255
Case 510 To 600:                                            'Rot 50 Grün 
100 Blau  100
R = 125
G = 255
B = 255

Case 610 To 700:                                            'Rot 0 Grün 
100 Blau 100
R = 0
G = 255
B = 255

Case 710 To 800:                                            'Rot 0 Grün 
50 Blau 100
R = 0
G = 125
B = 255

Case 810 To 950:                                            'Rot 0 Grün 
0 Blau 100
R = 0
G = 0
B = 255

End Select


Return

von Jonathan S. (joni-st) Benutzerseite


Lesenswert?

Hey, das sieht doch schonmal gut aus! Nur das
1
If Modus = 0 Then
2
  Gosub Beleuchtung
3
EndIf
solltest Du weglassen. Das wird doch schon im Timer erledigt! Außerdem 
solltest Du den Timer und die Interrupts noch aktivieren ("Enable ***"). 
Und den Prescaler solltest Du höher wählen.


Gruß
Jonathan

von Bastler (Gast)


Lesenswert?

Ups zwieschendurch habe Leute schon gepostet.

Naja ich muss in den Keller Laufen, wo die Werkstatt ist um etwas zum 
testen.

Der Timer ist nun "denke ich" korrekt konfiguriert, den Vorteiler habe 
ich grösser gemacht, damit schneller läuft, aber läuft momenten nichts.

von Bastler (Gast)


Lesenswert?

'*********************************************************************** 
********
' Schalter an PD.!    High = "Mood-Modus"    Low = "Beleuchtungs-Modus"
' 10k-Poti an PC.0
' LED Rot  an PB.1
' LED Grün an PB.2
' LED Blau an PB.3
'*********************************************************************** 
********

$regfile = "m8def.dat"
$crystal = 16000000
$hwstack = 100
$swstack = 100
$framesize = 100

'Taster Modus
Config Pind.1 = Input
Portd.1 = 1
Modus Alias Pind.1

Config Portb.1 = Output                                     'LED Rot
Config Portb.2 = Output                                     'LED Gruen
Config Portb.3 = Output                                     'LED Blau

Config Timer0 = Timer , Prescale = 64
On Timer0 Timer0_isr
Enable Interrupts

Config Adc = Single , Prescaler = Auto , Reference = Avcc
 Start Adc

Dim Pause As Word
Dim Speed As Word
Dim Adc0 As Word
Dim Fadingschritt As Byte


R Alias Compare1a
G Alias Compare1b
B Alias Ocr2



Do

''If Modus = 0 Then
   'Gosub Beleuchtung
'End If


'Hier kommt dann LCD Ausgabe rein


Loop

Timer0_isr:

'Das hier wird regelmäßig aufgerufen
  If Modus = 1 Then
    If FadingSchritt = 0 Then
      Incr R
      If R = 255 Then Incr FadingSchritt

    ElseIf FadingSchritt = 1 Then
      Incr G
      If G = 255 Then Incr FadingSchritt

    ElseIf FadingSchritt = 2 Then
      Incr B
      If B = 255 Then Incr FadingSchritt

    ElseIf FadingSchritt = 3 Then
      Decr R
      If R = 0 Then Incr FadingSchritt

    ElseIf FadingSchritt = 4 Then
      Decr G
      If G = 0 Then Incr FadingSchritt

    ElseIf FadingSchritt = 5 Then
      Decr B
      If B = 0 Then FadingSchritt = 0

    EndIf
  Else
    Gosub Beleuchtung
  EndIf
Return

Beleuchtung:

Adc0 = Getadc(0)

Select Case Adc0


Case 1 To 50                                                'Rot 100
R = 255
G = 0
B = 0
Case 60 To 100 :                                            'Rot 100 
Grün 50
R = 255
G = 125
B = 0
Case 110 To 200 :                                           'Rot 100 
Grün 100
R = 255
G = 255
B = 0
Case 210 To 300 :                                           'Rot 100 
Grün 100 Blau 125
R = 255
G = 255
B = 125
Case 310 To 400:                                            'Rot 100 
Grün 100 Blau 100
R = 255
G = 255
B = 255
Case 510 To 600:                                            'Rot 50 Grün 
100 Blau  100
R = 125
G = 255
B = 255

Case 610 To 700:                                            'Rot 0 Grün 
100 Blau 100
R = 0
G = 255
B = 255

Case 710 To 800:                                            'Rot 0 Grün 
50 Blau 100
R = 0
G = 125
B = 255

Case 810 To 950:                                            'Rot 0 Grün 
0 Blau 100
R = 0
G = 0
B = 255

End Select


Return

von Karl H. (kbuchegg)


Lesenswert?

Bastler schrieb:

> Der Timer ist nun "denke ich" korrekt konfiguriert, den Vorteiler habe
> ich grösser gemacht, damit schneller läuft

du meinst langsamer.
Je höher der Teiler, desto langsamer

> , aber läuft momenten nichts.

Du hast ja auch die Timer noch nicht aktiviert, die die PWM erzeugen.
Bis jetzt hast du mit dem Timer0 nur die Zeitsteuerung, die sich um das 
Weiterschalten der Steuerwerte für die PWM kümmert. Aber du hast noch 
keine PWM.

von Bastler (Gast)


Lesenswert?

Bin Ein Säckel....

PWM Timer...

aber tortzdem tut sich nicht viel

'*********************************************************************** 
********
' Schalter an PD.!    High = "Mood-Modus"    Low = "Beleuchtungs-Modus"
' 10k-Poti an PC.0
' LED Rot  an PB.1
' LED Grün an PB.2
' LED Blau an PB.3
'*********************************************************************** 
********

$regfile = "m8def.dat"
$crystal = 16000000
$hwstack = 100
$swstack = 100
$framesize = 100

'Taster Modus
Config Pind.1 = Input
Portd.1 = 1
Modus Alias Pind.1

Config Portb.1 = Output                                     'LED Rot
Config Portb.2 = Output                                     'LED Gruen
Config Portb.3 = Output                                     'LED Blau

Config Timer0 = Timer , Prescale = 64
On Timer0 Timer0_isr
Enable Interrupts


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 Down , Prescale = 1
Enable Timer1
Enable Timer2
 Start Timer1
 Start Timer2

Config Adc = Single , Prescaler = Auto , Reference = Avcc
 Start Adc

Dim Pause As Word
Dim Speed As Word
Dim Adc0 As Word
Dim Fadingschritt As Byte


R Alias Compare1a
G Alias Compare1b
B Alias Ocr2



Do

''If Modus = 0 Then
   'Gosub Beleuchtung
'End If


'Hier kommt dann LCD Ausgabe rein


Loop

Timer0_isr:

'Das hier wird regelmäßig aufgerufen
  If Modus = 1 Then
    If FadingSchritt = 0 Then
      Incr R
      If R = 255 Then Incr FadingSchritt

    ElseIf FadingSchritt = 1 Then
      Incr G
      If G = 255 Then Incr FadingSchritt

    ElseIf FadingSchritt = 2 Then
      Incr B
      If B = 255 Then Incr FadingSchritt

    ElseIf FadingSchritt = 3 Then
      Decr R
      If R = 0 Then Incr FadingSchritt

    ElseIf FadingSchritt = 4 Then
      Decr G
      If G = 0 Then Incr FadingSchritt

    ElseIf FadingSchritt = 5 Then
      Decr B
      If B = 0 Then FadingSchritt = 0

    EndIf
  Else
    Gosub Beleuchtung
  EndIf
Return

Beleuchtung:

Adc0 = Getadc(0)

Select Case Adc0


Case 1 To 50                                                'Rot 100
R = 255
G = 0
B = 0
Case 60 To 100 :                                            'Rot 100 
Grün 50
R = 255
G = 125
B = 0
Case 110 To 200 :                                           'Rot 100 
Grün 100
R = 255
G = 255
B = 0
Case 210 To 300 :                                           'Rot 100 
Grün 100 Blau 125
R = 255
G = 255
B = 125
Case 310 To 400:                                            'Rot 100 
Grün 100 Blau 100
R = 255
G = 255
B = 255
Case 510 To 600:                                            'Rot 50 Grün 
100 Blau  100
R = 125
G = 255
B = 255

Case 610 To 700:                                            'Rot 0 Grün 
100 Blau 100
R = 0
G = 255
B = 255

Case 710 To 800:                                            'Rot 0 Grün 
50 Blau 100
R = 0
G = 125
B = 255

Case 810 To 950:                                            'Rot 0 Grün 
0 Blau 100
R = 0
G = 0
B = 255

End Select


Return

von Karl H. (kbuchegg)


Lesenswert?

Bastler schrieb:
> Bin Ein Säckel....
>
> PWM Timer...
>
> aber tortzdem tut sich nicht viel

Was heißt 'nicht viel'?
leuchtet überhaupt irgendwas?

von Karl H. (kbuchegg)


Lesenswert?

Bin zwar kein BASCOM Spezi, aber wenn ich die Konfiguration vom Timer 0
1
Config Timer0 = Timer , Prescale = 64
2
On Timer0 Timer0_isr
3
Enable Interrupts

mit der der beiden anderen beiden Timer
1
Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Up , Compare B Pwm
2
= Clear Up , Prescale = 1
3
Config Timer2 = Pwm , Pwm = On , Compare Pwm = Clear Down , Prescale = 1
4
Enable Timer1
5
Enable Timer2
6
 Start Timer1
7
 Start Timer2

vergleiche, dann fällt mir auf, dass der Timer 0 nicht enabled und auch 
nicht gestartet wird.

Vielleicht etwas sorgfältiger vorgehen?

von Bastler (Gast)


Lesenswert?

alles ist dunkel egal ob Pin 3 high oder Low ist ond egal ob ich am Poti 
drehe..

ich habe kurz noch das "schlechte" Programm kurz reingeladen, das geht, 
also muss noch im Code was faul sein..Schaltung ist OK.

PS: Möchte mich trotzdem für Eure Mühe und hilfsbereitsschaft bedanken !

von Jonathan S. (joni-st) Benutzerseite


Lesenswert?

Aaaalsooo...:

Beim Konfigurieren der PWM-Timer stimmt noch was nicht:
1
Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Up , Compare B Pwm = Clear Up , Prescale = 1
2
Config Timer2 = Pwm , Pwm = On , Compare Pwm = Clear Down , Prescale = 1
sollte besser heißen:
1
Config Timer1 = Pwm, Pwm = 8, Compare A = Clear, Compare B = Clear, Prescale = 1
2
Config Timer2 = Pwm, Compare = Clear, Prescale = 256
Die Hilfe drückt sich da leider etwas unverständlich aus...

Das "Start TimerX" kannst du auch weglassen. Beim Enable werden die 
Timer automatisch gestartet. Und da fehlt noch ein "Enable Timer0"... 
Den Vorteiler von Timer0 solltest du auf 1024 stellen, sonst siehst du 
vom Fading nicht viel...

Außerdem solltest du dir mal angewöhnen, Einrückungen zu benutzen. Das 
macht den Code viel lesbarer.
1
If BlaBla = 1 Then
2
  Tu Irgendwas
3
  BlaBla = 0
4
EndIf


Gruß
Jonathan

von Karl H. (kbuchegg)


Lesenswert?

Jonathan Strobl schrieb:

> Den Vorteiler von Timer0 solltest du auf 1024 stellen, sonst siehst du
> vom Fading nicht viel...

Hab ich auch gedacht, bis ich es nachgerechnet habe.
Bei seinen 16 Mhz sollte zb Rot den Farbverlauf in ca. 4 Sekunden von 
dunkel nach Hell bei einem Vorteiler von 64 durchlaufen.

von Jonathan S. (joni-st) Benutzerseite


Lesenswert?

Ich komme da nicht auf 4 Sekunden, sondern auf 1/4 Sekunde... Da kommen 
Hertz raus :)

16000000Hz : 256 : 64 : 256 = ca. 4Hz

Gruß
Jonathan

von Karl H. (kbuchegg)


Lesenswert?

Jonathan Strobl schrieb:
> Ich komme da nicht auf 4 Sekunden, sondern auf 1/4 Sekunde... Da kommen
> Hertz raus :)
>
> 16000000Hz : 256 : 64 : 256 = ca. 4Hz


:-)
Mir fällt es wie Schuppen von den Haaren. Du hast recht. Weiß auch 
nicht, wie ich von den 4 am Taschenrechner auf 4 Sekunden gekommen bin 
und nicht auf 4 Hz.
Können wir uns auf 4Hz sind auf den LED als hektisches auf und Abblinken 
bemerkbar einigen? :-)

von Bastler (Gast)


Lesenswert?

Hmmm...Grübel....

Die einzige Veränderung, daß alle 3 Leds voll an sind. fedar fading noch 
Mood Modus..

'*********************************************************************** 
********
' Schalter an PD.1    High = "Mood-Modus"    Low = "Beleuchtungs-Modus"
' 10k-Poti an PC.0
' LED Rot  an PB.1
' LED Grün an PB.2
' LED Blau an PB.3
'*********************************************************************** 
********

$regfile = "m8def.dat"
$crystal = 16000000
$hwstack = 100
$swstack = 100
$framesize = 100

'Taster Modus
Config Pind.1 = Input
Portd.1 = 1
Modus Alias Pind.1

Config Portb.1 = Output                                     'LED Rot
Config Portb.2 = Output                                     'LED Gruen
Config Portb.3 = Output                                     'LED Blau

Config Timer0 = Timer , Prescale = 64
On Timer0 Timer0_isr
Enable Interrupts


Config Timer1 = Pwm , Pwm = 8 , Compare A = Clear , Compare B = Clear , 
Prescale = 1
Config Timer2 = Pwm, Compare = Clear, Prescale = 256
Enable Timer1
Enable Timer2


Config Adc = Single , Prescaler = Auto , Reference = Avcc
Start Adc

Dim Pause As Word
Dim Speed As Word
Dim Adc0 As Word
Dim Fadingschritt As Byte


R Alias Compare1a
G Alias Compare1b
B Alias Ocr2



Do

''If Modus = 0 Then
   'Gosub Beleuchtung
'End If


'Hier kommt dann LCD Ausgabe rein


Loop

Timer0_isr:

'Das hier wird regelmäßig aufgerufen
  If Modus = 1 Then
    If FadingSchritt = 0 Then
      Incr R
      If R = 255 Then Incr FadingSchritt

    ElseIf FadingSchritt = 1 Then
      Incr G
      If G = 255 Then Incr FadingSchritt

    ElseIf FadingSchritt = 2 Then
      Incr B
      If B = 255 Then Incr FadingSchritt

    ElseIf FadingSchritt = 3 Then
      Decr R
      If R = 0 Then Incr FadingSchritt

    ElseIf FadingSchritt = 4 Then
      Decr G
      If G = 0 Then Incr FadingSchritt

    ElseIf FadingSchritt = 5 Then
      Decr B
      If B = 0 Then FadingSchritt = 0

    EndIf
  Else
    Gosub Beleuchtung
  EndIf
Return

Beleuchtung:

Adc0 = Getadc(0)

Select Case Adc0


Case 1 To 50                                                'Rot 100
R = 255
G = 0
B = 0
Case 60 To 100 :                                            'Rot 100 
Grün 50
R = 255
G = 125
B = 0
Case 110 To 200 :                                           'Rot 100 
Grün 100
R = 255
G = 255
B = 0
Case 210 To 300 :                                           'Rot 100 
Grün 100 Blau 125
R = 255
G = 255
B = 125
Case 310 To 400:                                            'Rot 100 
Grün 100 Blau 100
R = 255
G = 255
B = 255
Case 510 To 600:                                            'Rot 50 Grün 
100 Blau  100
R = 125
G = 255
B = 255

Case 610 To 700:                                            'Rot 0 Grün 
100 Blau 100
R = 0
G = 255
B = 255

Case 710 To 800:                                            'Rot 0 Grün 
50 Blau 100
R = 0
G = 125
B = 255

Case 810 To 950:                                            'Rot 0 Grün 
0 Blau 100
R = 0
G = 0
B = 255

End Select


Return

von Karl H. (kbuchegg)


Lesenswert?

Der Timer 0 ist immer noch nicht enabled
1
Config Timer0 = Timer , Prescale = 64
2
On Timer0 Timer0_isr
3
Enable Interrupts

"enable Interrupts" ist nicht dasselbe wie "enable Timer0"

von Karl H. (kbuchegg)


Lesenswert?

Und nur um das klarzustellen

Du brauchst beides. Du musst den Timer0 enabeln UND du musst 
selbstverständlich auch die Interrupts freigeben.

Enable Interrupts hat so gesehen an und für sich nichts mit dem Timer an 
sich zu tun. Es gibt global die Bearbeitung von Interrups frei. Wo die 
herkommen ist egal. Das kann der Timer 0 sein, das kann aber auch die 
UART sein oder ....

Die übliche Vorgehensweise ist es, erst mal die ganze Hardware zu 
initialisieren und einzustellen und dann, wenn das alles erledigt ist, 
kommt vor die zentrale Do-Loop das Enable Interrupts

von Bastler (Gast)


Lesenswert?

Ihr seid einfach KLASSE !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

und wie man sagt, ständig unterbezahlt !!!!

jetzt gehts. Ich werde mich um die Finetuning kümmern.

Do Loop ausbauen...

Die Geschwindigkeiten kann ich dann mit Poti regeln, in dem ich

Temp=adc0/4

waitms=Temp

mache...............

von Jonathan S. (joni-st) Benutzerseite


Lesenswert?

Bastler schrieb:
> Die Geschwindigkeiten kann ich dann mit Poti regeln, in dem ich
>
> Temp=adc0/4
>
> waitms=Temp

Nein, das wird nichts. Dein Timer läuft dann doch immernoch so schnell. 
Ab einer bestimmten Wartezeit läuft dann aber dein Controller Amok, da 
er den Interrupts nicht mehr hinterherkommt. Du hast zwei Möglichkeiten, 
eine Frequenzeinstellung zu machen: Entweder du veränderst den 
(Software-)Vorteiler (einfach), oder du benutzt den CTC-Modus (schwer). 
Mach das besser so:
1
'Du musst den Timer0-Prescaler auf 1 stellen!
2
3
Timer-ISR:
4
  Geschwindigkeit = Getadc(0)
5
  Shift Geschwindigkeit, Left, 4 'Mit 16 multiplizieren
6
  
7
  'Nur alle <Geschwindigkeit> Timerinterrupts deine Fading-Routine ausführen
8
  Incr Swprescaler
9
  If Swprescaler = Geschwindigkeit
10
    Swprescaler = 0
11
    
12
    ... 'Dein Fading-Algorithmus
13
  EndIf
14
Return

Je größer "Geschwindigkeit", desto größer der Vorteiler. Bei einem 
ADC-Wert von 1023 gibt das dann eine Fading-Frequenz von:
16000000Hz : 256 [Maximaler Timer-Wert] : 1 [Vorteiler] : (1023 * 16 
[Software-Vorteiler]) : 256 [Fading-Stufen] = 0,015Hz


Gruß
Jonathan

von Bastler (Gast)


Lesenswert?

Jonathan muss ich langsam ein Bier ausgeben !!

Werde deine Variante auch einbauen, bzw genauer anschauen.

Bin gerade in der Do - Loop
 mit der LCD noch beschöftigt ( Balkenanzeige )

von Karl H. (kbuchegg)


Lesenswert?

Was du auf jeden Fall aus dem Thread mitnehmen solltest:

Es gibt ein paar Ausnahmen, aber meistens ist waitms das falsche 
Werkzeug. Du möchtest waitms meiden wie der Teufel das Weihwasser, weil 
es dich so gut wie immer auf die falsche Fährte führt. waitms ist das 
Äquivalent zu: Du bleibst neben der Waschmaschine stehen und wartest bis 
sie fertig ist, anstatt dass du in der Zwischenzeit den Rest deiner 
Hausarbeit machst und ab und zu nachsiehst ob die Maschine fertig ist. 
Das "Ab und zu, allerdings regelmässig" erledigst du mit einem Timer und 
einer Timer-Interrupt-Funktion, die eben vom Timer "ab und zu und 
regelmässig" aufgerufen wird. Dazu brauchst du nur deine Arbeitsweise 
umstrukturieren zu: "Jetzt ist ein bischen Zeit vergangen, was genau 
gibt es jetzt, genau zu diesem Zeitpunkt zu tun". Deine jetzige 
Fading-Funktion zeigt sehr schön, wie sowas ausshen kann.

von Bastler (Gast)


Lesenswert?

Ja sieht schon besser aus , einiges habe auf jedenfall zugelernt !!!

Aber...dies verstehe ich nicht ganz :

Dim Anzeige As String * 16
Dim Geschwindigkeit As Byte
Dim Adc0 As Word
Dim Fadingschritt As Byte
Dim W As Word , Perc As Word , Channel As Byte , I As Byte , Cols As 
Byte
Dim Swprescaler As Byte

----------------------

Timer0_isr:

Geschwindigkeit = Getadc(0)
  Shift Geschwindigkeit, Left, 4 'Mit 16 multiplizieren

  'Nur alle <Geschwindigkeit> Timerinterrupts deine Fading-Routine 
ausführen
  Incr Swprescaler
  If Swprescaler = Geschwindigkeit
    Swprescaler = 0

kriege Compiler fehler

Assigment error [Wprescaler:0 Geschwindigkeit:2]

von Jonathan S. (joni-st) Benutzerseite


Lesenswert?

Hinter'm "If ..." fehlt das "Then" :) Da hab ich wohl gepennt...


Gruß
Jonathan

von skua (Gast)


Lesenswert?

Bastler schrieb:
> Do                                                          'Grün runter
> Decr G
> Waitms Speed
> Loop Until R = 0
> Waitms Pause

sollte da nicht

Loop Until G = 0

stehen

von Bastler (Gast)


Lesenswert?

Hmm..irgendwo ist noch ein Gedankenfehler...

Egal wie ich am Poti drehe, pulst in einer Geschwindigkeit

Config Timer0 = Timer , Prescale = 1
On Timer0 Timer0_isr
Enable Timer0
Enable Interrupts

Timer0_isr:

Geschwindigkeit = Getadc(0)
  Shift Geschwindigkeit, Left, 4 'Mit 16 multiplizieren

  'Nur alle <Geschwindigkeit> Timerinterrupts deine Fading-Routine 
ausführen
  Incr Swprescaler
  If Swprescaler = Geschwindigkeit Then
    Swprescaler = 0
  End If

  If Modus = 1 Then
      Anzeige = "Fader Modus"
    If Fadingschritt = 0 Then
      Incr R
      If R = 255 Then Incr Fadingschritt

    Elseif Fadingschritt = 1 Then
      Incr G
      If G = 255 Then Incr Fadingschritt

von Karl H. (kbuchegg)


Lesenswert?

Eine Frage an Johnathan (der offensichtlich in BASCOM gut drauf ist).

Ist der BASCOM Compiler wirklich so schwach, dass man das hier

   Shift Geschwindigkeit, Left, 4 'Mit 16 multiplizieren

dem doch einprägsameren und leichter verständlichen

   Geschwindigkeit = 16 * Geschwindigkeit


vorziehen sollte?

von Karl H. (kbuchegg)


Lesenswert?

Du hast den Sinn dahinter

  Incr Swprescaler
  If Swprescaler = Geschwindigkeit Then
    Swprescaler = 0


noch nicht verstanden.
Der Sinn besteht darin, dass man nur dann, wenn Swprescaler auf 0 
zurückgesetzt wird, die Arbeit in der ISR macht.

Anders ausgedrückt:

Der Sekundenzeiger deiner Uhr tickt jede Sekunde einmal. Jetzt kannst du 
natürlich bei jedem Tick 1 weiterzählen und bei 5 deine Zählung wieder 
auf 0 zurücksetzen. Aber ein echtes "mach nur alle 5 Sekunden, also 12 
mal in der Minute" wird daraus nur dann, wenn du das was du zu tun hast 
auch an diese 5 Sekunden Zählung koppelst. Wenn du weiterhin jede 
Sekunde deine Arbeit machst, dann wird das deswegen nicht langsamer bzw. 
weniger oft in der Minute ausgeführt.

Also nicht

  Incr Swprescaler
  If Swprescaler = Geschwindigkeit Then
    Swprescaler = 0
  End If

  ... mache die Arbeit


sondern

  Incr Swprescaler
  If Swprescaler = Geschwindigkeit Then
    Swprescaler = 0

    ... mache die Arbeit

  End If


beachte, wo genau das "mache die Arbeit" steht und überlege, wie sich da 
jetzt das Hochzählen von Swprescaler auf die Aufrufhäufigkeit von "mache 
die Arbeit" auswirkt.

von Jonathan S. (joni-st) Benutzerseite


Lesenswert?

Du solltest die Zeile "Shift Geschwindigkeit, left, 4" wieder rausnehmen 
und den Vorteiler von Timer0 auf 64 stellen, ich hatte nämlich nicht 
bedacht, dass sich der Controller bei ganz hoher Geschwindigkeit 
aufhängen würde... Und wie Karl Heinz Buchegger schon geschrieben hat, 
musst du die Fading-Routine in das If-Konstrukt packen.


Gruß
Jonathan

von Bastler (Gast)


Lesenswert?

Stehe echt auf dem Schlauch...Laute Bäume....

Wenn ich am Poti drehe ist nur ein wildes geblinke..

'*********************************************************************** 
********
' Schalter an PD.1    High = "Mood-Modus"    Low = "Beleuchtungs-Modus"
' 10k-Poti an PC.0
' LED Rot  an PB.1
' LED Grün an PB.2
' LED Blau an PB.3
'*********************************************************************** 
********

$regfile = "m8def.dat"
$crystal = 16000000
$hwstack = 100
$swstack = 100
$framesize = 100

'Taster Modus
Config Pind.1 = Input
Portd.1 = 1
Modus Alias Pind.1

Config Portb.1 = Output                                     'LED Rot
Config Portb.2 = Output                                     'LED Gruen
Config Portb.3 = Output                                     'LED Blau

Config Timer0 = Timer , Prescale = 1
On Timer0 Timer0_isr
Enable Timer0
Enable Interrupts


Config Timer1 = Pwm , Pwm = 8 , Compare A = Clear , Compare B = Clear , 
Prescale = 1
Config Timer2 = Pwm , Compare = Clear , Prescale = 256
Enable Timer1
Enable Timer2


Config Adc = Single , Prescaler = Auto , Reference = Avcc
Start Adc

Dim Anzeige As String * 16
Dim Geschwindigkeit As Word
Dim Adc0 As Word
Dim Fadingschritt As Byte
Dim Swprescaler As Byte

R Alias Compare1a
G Alias Compare1b
B Alias Ocr2

Config Lcdpin = Pin , Db7 = Portb.0 , Db6 = Portd.7 , Db5 = Portd.6 , _
      Db4 = Portd.5 , E = Portc.4 , Rs = Portc.5
Config Lcd = 16 * 2
Cls
Cursor Off


Do

'LCD Ausgabe


Loop

Timer0_isr:

Geschwindigkeit = Getadc(0)
  Shift Geschwindigkeit, Left, 4 'Mit 16 multiplizieren

  'Nur alle <Geschwindigkeit> Timerinterrupts deine Fading-Routine 
ausführen
  Incr Swprescaler
  If Swprescaler = Geschwindigkeit Then
    Swprescaler = 0


  If Modus = 1 Then
    If Fadingschritt = 0 Then
      Incr R
      If R = 255 Then Incr Fadingschritt

    Elseif Fadingschritt = 1 Then
      Incr G
      If G = 255 Then Incr Fadingschritt

    Elseif Fadingschritt = 2 Then
      Incr B
      If B = 255 Then Incr Fadingschritt

    Elseif Fadingschritt = 3 Then
      Decr R
      If R = 0 Then Incr Fadingschritt

    Elseif Fadingschritt = 4 Then
      Decr G
      If G = 0 Then Incr Fadingschritt

    Elseif Fadingschritt = 5 Then
      Decr B
      If B = 0 Then Fadingschritt = 0
    End If
    End If
  Else
    Gosub Beleuchtung
  End If
Return

Beleuchtung:

Adc0 = Getadc(0)

Select Case Adc0


Case 1 To 50                                                'Rot 100
R = 255
G = 0
B = 0
Case 60 To 100 :                                            'Rot 100 
Grün 50
R = 255
G = 125
B = 0
Case 110 To 200 :                                           'Rot 100 
Grün 100
R = 255
G = 255
B = 0
Case 210 To 300 :                                           'Rot 100 
Grün 100 Blau 125
R = 255
G = 255
B = 125
Case 310 To 400:                                            'Rot 100 
Grün 100 Blau 100
R = 255
G = 255
B = 255
Case 510 To 600:                                            'Rot 50 Grün 
100 Blau  100
R = 125
G = 255
B = 255

Case 610 To 700:                                            'Rot 0 Grün 
100 Blau 100
R = 0
G = 255
B = 255

Case 710 To 800:                                            'Rot 0 Grün 
50 Blau 100
R = 0
G = 125
B = 255

Case 810 To 950:                                            'Rot 0 Grün 
0 Blau 100
R = 0
G = 0
B = 255

End Select


Return

von Jonathan S. (joni-st) Benutzerseite


Lesenswert?

Karl Heinz Buchegger schrieb:

>Eine Frage an Johnathan (der offensichtlich in BASCOM gut drauf ist).
>
>Ist der BASCOM Compiler wirklich so schwach, dass man das hier
>
>   Shift Geschwindigkeit, Left, 4 'Mit 16 multiplizieren
>
>dem doch einprägsameren und leichter verständlichen
>
>   Geschwindigkeit = 16 * Geschwindigkeit
>
>
>vorziehen sollte?

Ja, tatsächlich... Ich hatte es eben nochmal getestet...


Gruß
Jonathan

von Bastler (Gast)


Lesenswert?

Hmmm..Scheibenkleister...Es wird schlimmer wie vorher..Wenn ich am Poti 
drehen hat mit Fading nichts mehr zu tun..Wirres geblinke..

'*********************************************************************** 
********
' Schalter an PD.1    High = "Mood-Modus"    Low = "Beleuchtungs-Modus"
' 10k-Poti an PC.0
' LED Rot  an PB.1
' LED Grün an PB.2
' LED Blau an PB.3
'*********************************************************************** 
********

$regfile = "m8def.dat"
$crystal = 16000000
$hwstack = 100
$swstack = 100
$framesize = 100

'Taster Modus
Config Pind.1 = Input
Portd.1 = 1
Modus Alias Pind.1

Config Portb.1 = Output                                     'LED Rot
Config Portb.2 = Output                                     'LED Gruen
Config Portb.3 = Output                                     'LED Blau

Config Timer0 = Timer , Prescale = 64
On Timer0 Timer0_isr
Enable Timer0
Enable Interrupts


Config Timer1 = Pwm , Pwm = 8 , Compare A = Clear , Compare B = Clear , 
Prescale = 1
Config Timer2 = Pwm , Compare = Clear , Prescale = 256
Enable Timer1
Enable Timer2


Config Adc = Single , Prescaler = Auto , Reference = Avcc
Start Adc

Dim Anzeige As String * 16
Dim Geschwindigkeit As Word
Dim Adc0 As Word
Dim Fadingschritt As Byte
Dim Swprescaler As Byte

R Alias Compare1a
G Alias Compare1b
B Alias Ocr2

Config Lcdpin = Pin , Db7 = Portb.0 , Db6 = Portd.7 , Db5 = Portd.6 , _
      Db4 = Portd.5 , E = Portc.4 , Rs = Portc.5
Config Lcd = 16 * 2
Cls
Cursor Off


Do

'LCD Ausgabe


Loop

Timer0_isr:

Geschwindigkeit = Getadc(0)
  Incr Swprescaler
  If Swprescaler = Geschwindigkeit Then
    Swprescaler = 0


  If Modus = 1 Then
    If Fadingschritt = 0 Then
      Incr R
      If R = 255 Then Incr Fadingschritt

    Elseif Fadingschritt = 1 Then
      Incr G
      If G = 255 Then Incr Fadingschritt

    Elseif Fadingschritt = 2 Then
      Incr B
      If B = 255 Then Incr Fadingschritt

    Elseif Fadingschritt = 3 Then
      Decr R
      If R = 0 Then Incr Fadingschritt

    Elseif Fadingschritt = 4 Then
      Decr G
      If G = 0 Then Incr Fadingschritt

    Elseif Fadingschritt = 5 Then
      Decr B
      If B = 0 Then Fadingschritt = 0
    End If
    End If
  Else
    Gosub Beleuchtung
  End If
Return

Beleuchtung:

Adc0 = Getadc(0)

Select Case Adc0


Case 1 To 50                                                'Rot 100
R = 255
G = 0
B = 0
Case 60 To 100 :                                            'Rot 100 
Grün 50
R = 255
G = 125
B = 0
Case 110 To 200 :                                           'Rot 100 
Grün 100
R = 255
G = 255
B = 0
Case 210 To 300 :                                           'Rot 100 
Grün 100 Blau 125
R = 255
G = 255
B = 125
Case 310 To 400:                                            'Rot 100 
Grün 100 Blau 100
R = 255
G = 255
B = 255
Case 510 To 600:                                            'Rot 50 Grün 
100 Blau  100
R = 125
G = 255
B = 255

Case 610 To 700:                                            'Rot 0 Grün 
100 Blau 100
R = 0
G = 255
B = 255

Case 710 To 800:                                            'Rot 0 Grün 
50 Blau 100
R = 0
G = 125
B = 255

Case 810 To 950:                                            'Rot 0 Grün 
0 Blau 100
R = 0
G = 0
B = 255

End Select


Return

von Karl H. (kbuchegg)


Lesenswert?

Jonathan Strobl schrieb:
> Du solltest die Zeile "Shift Geschwindigkeit, left, 4" wieder rausnehmen
> und den Vorteiler von Timer0 auf 64 stellen, ich hatte nämlich nicht
> bedacht, dass sich der Controller bei ganz hoher Geschwindigkeit
> aufhängen würde...

Ich würde das Auslesen das ADC überhaupt in die Hauptschleife verlagern. 
Es gibt keinen Grund warum das in der ISR sein muss.

von Jonathan S. (joni-st) Benutzerseite


Lesenswert?

Du hast das "EndIf" immernoch falsch plaziert. So sollte es stimmen:
1
Timer0_isr:
2
3
Geschwindigkeit = Getadc(0)
4
  Shift Geschwindigkeit, Left, 4 'Mit 16 multiplizieren
5
6
  'Nur alle <Geschwindigkeit> Timerinterrupts deine Fading-Routine
7
ausführen
8
  Incr Swprescaler
9
  If Swprescaler = Geschwindigkeit Then
10
    Swprescaler = 0
11
    If Modus = 1 Then
12
      If Fadingschritt = 0 Then
13
        Incr R
14
        If R = 255 Then Incr Fadingschritt
15
  
16
      Elseif Fadingschritt = 1 Then
17
        Incr G
18
        If G = 255 Then Incr Fadingschritt
19
20
      Elseif Fadingschritt = 2 Then
21
        Incr B
22
        If B = 255 Then Incr Fadingschritt
23
24
      Elseif Fadingschritt = 3 Then
25
        Decr R
26
        If R = 0 Then Incr Fadingschritt
27
28
      Elseif Fadingschritt = 4 Then
29
        Decr G
30
        If G = 0 Then Incr Fadingschritt
31
32
      Elseif Fadingschritt = 5 Then
33
        Decr B
34
        If B = 0 Then Fadingschritt = 0
35
      End If
36
    Else
37
      Gosub Beleuchtung
38
    End If
39
  EndIf
40
Return

Und wie schon gesagt: Nimm das "Shift Geschwindigkeit, Left, 4" raus und 
setze den Vorteiler von Timer0 auf 64.


Gruß
Jonathan

von Jonathan S. (joni-st) Benutzerseite


Lesenswert?

>Ich würde das Auslesen das ADC überhaupt in die Hauptschleife verlagern.
>Es gibt keinen Grund warum das in der ISR sein muss.

Stimmt. Oder den ADC im Freerunning-Modus betreiben.


Gruß
Jonathan

von Karl H. (kbuchegg)


Lesenswert?

Bastler schrieb:
> Hmmm..Scheibenkleister...Es wird schlimmer wie vorher..Wenn ich am

An diese Stelle zeigt sich die Wichtigkeit von richtigem Einrücken. 
Schau dir deinen Code nochmal genau an und überlege welches End if bzw. 
noch wichtiger welches else zu welchem if gehört!

Sauberes Code Einrücken ist kein Selbstzweck sondern hilft 
Schachtelungs-Fehler zu vermeiden. Also tu es! Jetzt!

von Bastler (Gast)


Lesenswert?

Sory Das Ergebnis wie gerade beschrieben, bloss Copy Paste war falsch.

'*********************************************************************** 
********
' Schalter an PD.1    High = "Mood-Modus"    Low = "Beleuchtungs-Modus"
' 10k-Poti an PC.0
' LED Rot  an PB.1
' LED Grün an PB.2
' LED Blau an PB.3
'*********************************************************************** 
********

$regfile = "m8def.dat"
$crystal = 16000000
$hwstack = 100
$swstack = 100
$framesize = 100

'Taster Modus
Config Pind.1 = Input
Portd.1 = 1
Modus Alias Pind.1

Config Portb.1 = Output                                     'LED Rot
Config Portb.2 = Output                                     'LED Gruen
Config Portb.3 = Output                                     'LED Blau

Config Timer0 = Timer , Prescale = 64
On Timer0 Timer0_isr
Enable Timer0
Enable Interrupts


Config Timer1 = Pwm , Pwm = 8 , Compare A = Clear , Compare B = Clear , 
Prescale = 1
Config Timer2 = Pwm , Compare = Clear , Prescale = 256
Enable Timer1
Enable Timer2


Config Adc = Single , Prescaler = Auto , Reference = Avcc
Start Adc

Dim Anzeige As String * 16
Dim Geschwindigkeit As Word
Dim Adc0 As Word
Dim Fadingschritt As Byte
Dim Swprescaler As Byte

R Alias Compare1a
G Alias Compare1b
B Alias Ocr2

Config Lcdpin = Pin , Db7 = Portb.0 , Db6 = Portd.7 , Db5 = Portd.6 , _
      Db4 = Portd.5 , E = Portc.4 , Rs = Portc.5
Config Lcd = 16 * 2
Cls
Cursor Off


Do

'LCD Ausgabe


Loop

Timer0_isr:

Geschwindigkeit = Getadc(0)
  Incr Swprescaler
  If Swprescaler = Geschwindigkeit Then
    Swprescaler = 0


  If Modus = 1 Then
    If Fadingschritt = 0 Then
      Incr R
      If R = 255 Then Incr Fadingschritt

    Elseif Fadingschritt = 1 Then
      Incr G
      If G = 255 Then Incr Fadingschritt

    Elseif Fadingschritt = 2 Then
      Incr B
      If B = 255 Then Incr Fadingschritt

    Elseif Fadingschritt = 3 Then
      Decr R
      If R = 0 Then Incr Fadingschritt

    Elseif Fadingschritt = 4 Then
      Decr G
      If G = 0 Then Incr Fadingschritt

    Elseif Fadingschritt = 5 Then
      Decr B
      If B = 0 Then Fadingschritt = 0
    End If
    End If
  Else
    Gosub Beleuchtung
  End If
Return

Beleuchtung:

Adc0 = Getadc(0)

Select Case Adc0


Case 1 To 50                                                'Rot 100
R = 255
G = 0
B = 0
Case 60 To 100 :                                            'Rot 100 
Grün 50
R = 255
G = 125
B = 0
Case 110 To 200 :                                           'Rot 100 
Grün 100
R = 255
G = 255
B = 0
Case 210 To 300 :                                           'Rot 100 
Grün 100 Blau 125
R = 255
G = 255
B = 125
Case 310 To 400:                                            'Rot 100 
Grün 100 Blau 100
R = 255
G = 255
B = 255
Case 510 To 600:                                            'Rot 50 Grün 
100 Blau  100
R = 125
G = 255
B = 255

Case 610 To 700:                                            'Rot 0 Grün 
100 Blau 100
R = 0
G = 255
B = 255

Case 710 To 800:                                            'Rot 0 Grün 
50 Blau 100
R = 0
G = 125
B = 255

Case 810 To 950:                                            'Rot 0 Grün 
0 Blau 100
R = 0
G = 0
B = 255

End Select


Return

von Karl H. (kbuchegg)


Lesenswert?

Ich wiederhole mich, weil es möglicherweise untergeht:

Sauberes Code Einrücken ist kein Selbstzweck sondern hilft
Schachtelungs-Fehler zu vermeiden. Also tu es! Jetzt!

Und ich unterstreiche das ... 2 mal und in Rot!

Es sind immer diejenigen, die keine konsequente Einrückstruktur haben, 
die über ihre eigenen Füsse stolpern und Code produzieren, der wegen 
lächerlicher Schachtelungsfehler nicht funktioniert. Jede Codezeile am 
linken Rand anfangen zu lassen hat nun mal nichts mit vernünftiger 
Codeformatierung zu tun.

von Bastler (Gast)


Lesenswert?

Ups....

Timer0_isr:

Geschwindigkeit = Getadc(0)
  Incr Swprescaler
  If Swprescaler = Geschwindigkeit Then
    Swprescaler = 0
    If Modus = 1 Then

    If Fadingschritt = 0 Then
      Incr R
         If R = 255 Then Incr Fadingschritt
      Elseif Fadingschritt = 1 Then
      Incr G
    If G = 255 Then Incr Fadingschritt
      Elseif Fadingschritt = 2 Then
      Incr B
    If B = 255 Then Incr Fadingschritt
      Elseif Fadingschritt = 3 Then
      Decr R
    If R = 0 Then Incr Fadingschritt
      Elseif Fadingschritt = 4 Then
      Decr G
    If G = 0 Then Incr Fadingschritt
      Elseif Fadingschritt = 5 Then
      Decr B
    If B = 0 Then Fadingschritt = 0
   End If
  End If
  Else
    Gosub Beleuchtung
  End If
Return

Bitte nicht schlagen !!!!

von Jonathan S. (joni-st) Benutzerseite


Lesenswert?

Karl Heinz Buchegger schrieb:
> Ich wiederhole mich, weil es möglicherweise untergeht:
>
> Sauberes Code Einrücken ist kein Selbstzweck sondern hilft
> Schachtelungs-Fehler zu vermeiden. Also tu es! Jetzt!
>
> Und ich unterstreiche das ... 2 mal und in Rot!

Und ich markiere es nochmal mit grünem Neon-Marker! Einrücken ist 
wirklich wichtig! Sonst wäre ich im 2500-Zeilen-Quälcode meiner 
Spielekonsole (mit nem Mega1284P @ 20MHz und Bytecode-Interpreter xD) 
längst untergegangen!
Wenn du das dann eingerückt hast, wirst du deinen Fehler wahrscheinlich 
sofort finden...


Gruß
Jonathan

von Jonathan S. (joni-st) Benutzerseite


Lesenswert?

Bastler schrieb:
> Bitte nicht schlagen !!!!

Ähm... Ok, ich halte mich mal zurück xD


Also... Grundkurs: Wie rückt man ein?

Einrückungen sind äußerst wichtig, damit man bereits beim ersten Blick 
erkennen kann, welcher Befehl welchem untergeordnet ist. Die 
übergeordneten Befehle, die unabhängig sind, schreibt man weiter links, 
als die untergeordneten Befehle.
Beispiel:
1
If V1 = 1 Then
2
  TuWas
3
EndIf

Beispiel 2:
1
If V1 = 1 Then
2
  TuWas
3
ElseIf V1 = 2 Then
4
  TuWasAnderes
5
Else
6
  TuIrgendwasAlternatives
7
EndIf

If...EndIf, If...Else...EndIf und If...ElseIf...Else...EndIf sind die 
übergeordneten Konstrukte, da von ihnen die Ausführung der 
eingeschlossenen Befehle abhängt. Deshalb stehen sie weiter links. 
Ebenso sind "Do...Loop", "Select...Case...EndSelect" und Routinen mit 
abschließendem Return übergeodnete Konstrukte.
Beispiel:
1
Do
2
  TuWasImmerWieder
3
Loop

Wann immer ein Befehl von einem anderen Befehlskonstrukt abhängig ist, 
wird er eingerückt.



Gruß
Jonathan

von Bastler (Gast)


Lesenswert?

Es ist keine Bestechung oder sonstwas was ich sagen möchte, aber 
Jonathna hat echt viel Geduld als Dankeschön, wenn das Proggi so funzt 
wie ich mir vorgestellt habe möchte ich Dir 6 Blaue 7 Segmentanzeigen 
schneken, falls brauchst ist kein Witz !!!

PS: habe schon versucht so einzurücken wie ich gedacht habe, siehe 
oben,,aber hilft nicht wirklich weiter...Mehr praxis ...mehr praxis..

von Bastler (Gast)


Lesenswert?

OK, ich versuche nochmal...

von Jonathan S. (joni-st) Benutzerseite


Lesenswert?

Ach, keine Ursache :). Ich helfe dir doch gerne!
Les' dir aber mal meinen "Grundkurs: Einrücken" durch und mach' die 
Einrückungen dann nochmal wie beschrieben.


Gruß
Jonathan



(Hmmm, 7-Segment-Anzeigen könnte ich durchaus gebrauchen... Ich überleg' 
mal :) )

von Bastler (Gast)


Lesenswert?

So :

Timer0_isr:

Geschwindigkeit = Getadc(0)
Incr Swprescaler
   If Swprescaler = Geschwindigkeit Then
   Swprescaler = 0

If Modus = 1 Then
   If Fadingschritt = 0 Then
      Incr R
   If R = 255 Then Incr Fadingschritt
   Elseif Fadingschritt = 1 Then
      Incr G
   If G = 255 Then Incr Fadingschritt
   Elseif Fadingschritt = 2 Then
      Incr B
   If B = 255 Then Incr Fadingschritt
   Elseif Fadingschritt = 3 Then
      Decr R
   If R = 0 Then Incr Fadingschritt
   Elseif Fadingschritt = 4 Then
      Decr G
   If G = 0 Then Incr Fadingschritt
   Elseif Fadingschritt = 5 Then
      Decr B
   If B = 0 Then Fadingschritt = 0
   End If
  End If
  Else
    Gosub Beleuchtung
End If
Return

von Jonathan S. (joni-st) Benutzerseite


Lesenswert?

Hm, nicht ganz. Schau dir mal jedes If-Konstrukt einzeln an. Also erst 
das größte, dann die kleineren im großen usw..


Gruß
Jonathan

von Bastler (Gast)


Lesenswert?

Besser ?

PS: Ich wollte mit der Anzeige nur sagen, daß ich Deine Mühe unheimlich 
schätze und ich war/bin nie geizig gewesen !

Nixie ? VDF Röhren ?

Möchte aber vom Kernproblem jetzt nicht wegommen !!

von Jonathan S. (joni-st) Benutzerseite


Lesenswert?

Und schreib' deinen Code bitte in Codetags, das Forum entfernt gerne 
Leerzeichen usw..

So (ohne die Unterstriche):

[_code]
[_/code]


Gruß
Jonathan

von Jonathan S. (joni-st) Benutzerseite


Lesenswert?

Bastler schrieb:
> PS: Ich wollte mit der Anzeige nur sagen, daß ich Deine Mühe unheimlich
> schätze und ich war/bin nie geizig gewesen !

Wie gesagt, keine Ursache. Die 7-Segment-Displays brauchst du mir aber 
nicht zu schicken :)


Gruß
Jonathan

von Karl H. (kbuchegg)


Lesenswert?

Das kann schon mal so nicht stimmen. Gehen wirs durch

Timer0_isr:

Geschwindigkeit = Getadc(0)
Incr Swprescaler
   If Swprescaler = Geschwindigkeit Then


Wieso steht das Incr in der Zeile darüber am linken Rand und das if 
nicht? Dazwischen war nichts, was eine Einrückung vom if verursachen 
würde. Das if steht auf derselben logischen Ebene wie das incr


Nach diesem then hast du die davon abhängige Anweisung in die nächste 
Zeile geschrieben. Gut so!

   Swprescaler = 0

hier ist sie


If Modus = 1 Then

Huch. Wieso steht dieses if schon wieder am linken Rand? Das 
vorhergehende if wurde noch nicht mit einem end if abgeschlossen, also 
hänbgt diese Anweisung von diesem if ab und wird natürlich genauso 
eingerückt, wie alle Anweisungen die von diesem vorherge4henden if 
abhängen.

Die Idee hinter der Einrückung ist es, dass ALLE Anweisungen, die von zb 
einem IF abhängen auf derselben Einrückungsstufe stehen.ö


   If Fadingschritt = 0 Then
      Incr R
   If R = 255 Then Incr Fadingschritt


bei allen vorhergehenden if war es so, dass die vom if abhängige 
Anweisung (also die im then Zweig) auf einer neuen Zeile eingterückt 
war. Hier ist es nicht so! Warum? Mach die Dinge immer gleich!

von Bastler (Gast)


Lesenswert?

Nächster Versuch :

Geschwindigkeit = Getadc(0)
Incr Swprescaler
   If Swprescaler = Geschwindigkeit Then
   Swprescaler = 0

If Modus = 1 Then
   If Fadingschritt = 0 Then
      Incr R
         If R = 255 Then
            Incr Fadingschritt
         Elseif Fadingschritt = 1 Then
            Incr G
         If G = 255 Then
            Incr Fadingschritt
         Elseif Fadingschritt = 2 Then
            Incr B
         If B = 255 Then
            Incr Fadingschritt
         Elseif Fadingschritt = 3 Then
            Decr R
         If R = 0 Then
            Incr Fadingschritt
         Elseif Fadingschritt = 4 Then
            Decr G
         If G = 0 Then
            Incr Fadingschritt
         Elseif Fadingschritt = 5 Then
            Decr B
         If B = 0 Then Fadingschritt = 0
      End If
  End If
Else
    Gosub Beleuchtung
End If
Return

kurz essen, dann gehts weiter ..smile !!

von Bastler (Gast)


Lesenswert?

Jonathan Strobl schrieb:
> Die 7-Segment-Displays brauchst du mir aber
> nicht zu schicken :)

Warum nicht ?

Ich tu es gerne !! Du hilfst mir, dafür mächte mich auf dieser Weise 
mich auch bedanken !!

von Jonathan S. (joni-st) Benutzerseite


Lesenswert?

Ach nein, die brauchst du mir nicht zu schicken... Ich helfe dir doch 
gerne :)

So, und jetzt zurück zum Thema. Dein jetziger Versuch ist schon besser, 
aber immernoch nicht so gut. Übung macht den Meister :)

Hier noch ein kleines Beispiel:
1
Incr V1 'Logische Ebene 0
2
If V1 = 16 Then 'Hier beginnt die logische Ebene 1
3
  
4
  If V2 = 10 Then 'Hier beginnt die logische Ebene 2
5
    TuWas
6
    V2 = 0
7
  Else 'Dies hier ist nicht untergeordnet, da es zum If-Konstrukt gehört!
8
    TuWasAnderes
9
  EndIf 'Hier ist die logische Ebene 2 zu Ende!
10
  
11
  TuNochwas 
12
  V1 = 0
13
  
14
Else 'Dies hier ist nicht untergeordnet (If-Konstrukt)!
15
  
16
  TuNochwasAnderes
17
18
EndIf 'Hier ist die logische Ebene 1 zu Ende!
19
20
Lcd V1

Ich hoffe, jetzt ist es verständlicher :)


Gruß
Jonathan

von Bastler (Gast)


Lesenswert?

Probiere nochmal, klar es muss sauber struktiert sein...aber das 
Programm spinnt immernoch..

Muss in den Bastellkeller..

von Jonathan S. (joni-st) Benutzerseite


Lesenswert?

Damit dein Programm zumindest schon mal funktioniert, kannst du deine 
ISR mal hier durch ersetzen:
1
Timer0_isr:
2
3
Geschwindigkeit = Getadc(0)
4
  Shift Geschwindigkeit, Left, 4 'Mit 16 multiplizieren
5
6
  'Nur alle <Geschwindigkeit> Timerinterrupts deine Fading-Routine
7
ausführen
8
  Incr Swprescaler
9
  If Swprescaler = Geschwindigkeit Then
10
    Swprescaler = 0
11
    If Modus = 1 Then
12
      If Fadingschritt = 0 Then
13
        Incr R
14
        If R = 255 Then Incr Fadingschritt
15
  
16
      Elseif Fadingschritt = 1 Then
17
        Incr G
18
        If G = 255 Then Incr Fadingschritt
19
20
      Elseif Fadingschritt = 2 Then
21
        Incr B
22
        If B = 255 Then Incr Fadingschritt
23
24
      Elseif Fadingschritt = 3 Then
25
        Decr R
26
        If R = 0 Then Incr Fadingschritt
27
28
      Elseif Fadingschritt = 4 Then
29
        Decr G
30
        If G = 0 Then Incr Fadingschritt
31
32
      Elseif Fadingschritt = 5 Then
33
        Decr B
34
        If B = 0 Then Fadingschritt = 0
35
      End If
36
      'EndIf 'Das hier war falsch...
37
    Else
38
      Gosub Beleuchtung
39
    End If
40
  EndIf '...und gehört eigentlich hier hin!
41
Return

Aber danach üben wir nochmal das Einrücken, OK? So lassen sich solche 
Fehler nämlich gleich vermeiden.


Gruß
Jonathan

von Bastler (Gast)


Lesenswert?

hm....

[_code]
Timer0_isr:

Geschwindigkeit = Getadc(0)

Incr Swprescaler                                            'Ebene 1
   If Swprescaler = Geschwindigkeit Then
   Swprescaler = 0

If Modus = 1 Then
   If Fadingschritt = 0 Then                                'Ebene 2
      Incr R
      If R = 255 Then
         Incr Fadingschritt
      Elseif Fadingschritt = 1 Then
         Incr G
      If G = 255 Then
         Incr Fadingschritt
      Elseif Fadingschritt = 2 Then
         Incr B
      If B = 255 Then
         Incr Fadingschritt
      Elseif Fadingschritt = 3 Then
         Decr R
      If R = 0 Then
         Incr Fadingschritt
      Elseif Fadingschritt = 4 Then
         Decr G
      If G = 0 Then
         Incr Fadingschritt
      Elseif Fadingschritt = 5 Then
         Decr B
      If B = 0 Then Fadingschritt = 0
   End If                                                   'Ende Ebene 
2
  End If
Else
   Gosub Beleuchtung
End If
Return

[_/code]

von Jonathan S. (joni-st) Benutzerseite


Lesenswert?

Hm, immer noch nicht... Bei dem
1
If G = 255 Then
2
  Incr Fadingschritt
muss es eigentlich
1
If G = 255 Then Incr Fadingschritt
oder
1
If G = 255 Then
2
  Incr Fadingschritt
3
EndIf
heißen (und bei den anderen auch). Sonst funktioniert es nicht richtig. 
Schau dir mein Beispiel noch mal genau an.


Gruß
Jonathan



P.S.: Codetags schreibt man ohne das "_", das habe ich nur dazugemacht, 
damit das nicht als Codetag interpretiert wird.

von Bastler (Gast)


Lesenswert?

Schade...es geht weder Fading noch feste Farbe, alle 3 LEDs sind an ...
1
'*******************************************************************************
2
' Schalter an PD.1    High = "Mood-Modus"    Low = "Beleuchtungs-Modus"
3
' 10k-Poti an PC.0
4
' LED Rot  an PB.1
5
' LED Grün an PB.2
6
' LED Blau an PB.3
7
'*******************************************************************************
8
9
$regfile = "m8def.dat"
10
$crystal = 16000000
11
$hwstack = 100
12
$swstack = 100
13
$framesize = 100
14
15
'Taster Modus
16
Config Pind.1 = Input
17
Portd.1 = 1
18
Modus Alias Pind.1
19
20
Config Portb.1 = Output                                     'LED Rot
21
Config Portb.2 = Output                                     'LED Gruen
22
Config Portb.3 = Output                                     'LED Blau
23
24
Config Timer0 = Timer , Prescale = 64
25
On Timer0 Timer0_isr
26
Enable Timer0
27
Enable Interrupts
28
29
30
Config Timer1 = Pwm , Pwm = 8 , Compare A = Clear , Compare B = Clear , Prescale = 1
31
Config Timer2 = Pwm , Compare = Clear , Prescale = 256
32
Enable Timer1
33
Enable Timer2
34
35
36
Config Adc = Single , Prescaler = Auto , Reference = Avcc
37
Start Adc
38
39
Dim Anzeige As String * 16
40
Dim Geschwindigkeit As Word
41
Dim Adc0 As Word
42
Dim Fadingschritt As Byte
43
Dim Swprescaler As Byte
44
45
R Alias Compare1a
46
G Alias Compare1b
47
B Alias Ocr2
48
49
Config Lcdpin = Pin , Db7 = Portb.0 , Db6 = Portd.7 , Db5 = Portd.6 , _
50
      Db4 = Portd.5 , E = Portc.4 , Rs = Portc.5
51
Config Lcd = 16 * 2
52
Cls
53
Cursor Off
54
55
56
Do
57
58
'LCD Ausgabe
59
60
61
Loop
62
63
Timer0_isr:
64
65
Geschwindigkeit = Getadc(0)
66
  Shift Geschwindigkeit, Left, 4 'Mit 16 multiplizieren
67
68
  'Nur alle <Geschwindigkeit> Timerinterrupts deine Fading-Routine ausführen
69
  Incr Swprescaler
70
  If Swprescaler = Geschwindigkeit Then
71
    Swprescaler = 0
72
    If Modus = 1 Then
73
      If Fadingschritt = 0 Then
74
        Incr R
75
        If R = 255 Then Incr Fadingschritt
76
77
      Elseif Fadingschritt = 1 Then
78
        Incr G
79
        If G = 255 Then Incr Fadingschritt
80
81
      Elseif Fadingschritt = 2 Then
82
        Incr B
83
        If B = 255 Then Incr Fadingschritt
84
85
      Elseif Fadingschritt = 3 Then
86
        Decr R
87
        If R = 0 Then Incr Fadingschritt
88
89
      Elseif Fadingschritt = 4 Then
90
        Decr G
91
        If G = 0 Then Incr Fadingschritt
92
93
      Elseif Fadingschritt = 5 Then
94
        Decr B
95
        If B = 0 Then Fadingschritt = 0
96
      End If
97
      'EndIf 'Das hier war falsch...
98
    Else
99
      Gosub Beleuchtung
100
    End If
101
  EndIf '...und gehört eigentlich hier hin!
102
Return
103
104
Beleuchtung:
105
106
Adc0 = Getadc(0)
107
108
Select Case Adc0
109
110
111
Case 1 To 50                                                'Rot 100
112
R = 255
113
G = 0
114
B = 0
115
Case 60 To 100 :                                            'Rot 100 Grün 50
116
R = 255
117
G = 125
118
B = 0
119
Case 110 To 200 :                                           'Rot 100 Grün 100
120
R = 255
121
G = 255
122
B = 0
123
Case 210 To 300 :                                           'Rot 100 Grün 100 Blau 125
124
R = 255
125
G = 255
126
B = 125
127
Case 310 To 400:                                            'Rot 100 Grün 100 Blau 100
128
R = 255
129
G = 255
130
B = 255
131
Case 510 To 600:                                            'Rot 50 Grün 100 Blau  100
132
R = 125
133
G = 255
134
B = 255
135
136
Case 610 To 700:                                            'Rot 0 Grün 100 Blau 100
137
R = 0
138
G = 255
139
B = 255
140
141
Case 710 To 800:                                            'Rot 0 Grün 50 Blau 100
142
R = 0
143
G = 125
144
B = 255
145
146
Case 810 To 950:                                            'Rot 0 Grün 0 Blau 100
147
R = 0
148
G = 0
149
B = 255
150
151
End Select
152
153
154
Return

von Jonathan S. (joni-st) Benutzerseite


Lesenswert?

Was passiert, wenn du beim ADC den Prescaler anstatt auf "Auto" auf "4" 
stellst? Und den Modus anstatt auf "Single" auf "Free"?


Gruß
Jonathan

von Jonathan S. (joni-st) Benutzerseite


Lesenswert?

Ich kann darin keinen Fehler mehr finden... Hmmmm...

von Jonathan S. (joni-st) Benutzerseite


Lesenswert?

Mach das "Shift Geschwindigkeit, left, 4" nochmal weg...


Gruß
Jonathan

von Bastler (Gast)


Lesenswert?

Der einziger Unterschied ist :

Wenn der Schalter High ist dann läuchten alle lege ich auf LOW geht Rot 
aus

wenn ich am Poti drehe ändert sich nicht..Nicht so prickelnd..((

von Jonathan S. (joni-st) Benutzerseite


Lesenswert?

Bei dem ersten "Case" im "Select-Käse-EndSelect" fehlt noch ein 
Doppelpunkt... Das "Config LCDPin, ..." solltest du in einer Zeile 
schreiben...
grübel
nicht-weiß-was-da-los-ist


Gruß
Jonathan

von Bastler (Gast)


Lesenswert?

Sift habe ich raus..

Also Schalter auf Low , ADC0 klein.
Rot aus Grün blau an...drehe am Poti nichts...

Schalter High. AdcO klein
Alle 3 Farben an, drehe am Poti tut sich nichts..

von Jonathan S. (joni-st) Benutzerseite


Lesenswert?

Hast du bereits probiert, was passiert, wenn du bei der 
ADC-Initialisierung
1
Config ADC = Free, Prescaler = 4, Reference = AVCC
schreibst?


Gruß
Jonathan

von Jonathan S. (joni-st) Benutzerseite


Lesenswert?

So - ich hole jetzt mein Steckbrett, einen ATMega8 und ein bisschen 
Kleinkram und teste, was da nicht geht... Das will ich jetzt einfach mal 
wissen. Es kann doch nicht sein, dass so ein kleines Progrämmchen nicht 
geht...


Gruß
Jonathan

von Bastler (Gast)


Lesenswert?

Schalter Low, AdcO klein = Grün und Blau an Adc gross tut sich nichts

Schalter High Adc klein = alle an keine Reaktion auf Poti
1
'*******************************************************************************
2
' Schalter an PD.1    High = "Mood-Modus"    Low = "Beleuchtungs-Modus"
3
' 10k-Poti an PC.0
4
' LED Rot  an PB.1
5
' LED Grün an PB.2
6
' LED Blau an PB.3
7
'*******************************************************************************
8
9
$regfile = "m8def.dat"
10
$crystal = 16000000
11
$hwstack = 100
12
$swstack = 100
13
$framesize = 100
14
15
'Taster Modus
16
Config Pind.1 = Input
17
Portd.1 = 1
18
Modus Alias Pind.1
19
20
Config Portb.1 = Output                                     'LED Rot
21
Config Portb.2 = Output                                     'LED Gruen
22
Config Portb.3 = Output                                     'LED Blau
23
24
Config Timer0 = Timer , Prescale = 64
25
On Timer0 Timer0_isr
26
Enable Timer0
27
Enable Interrupts
28
29
30
Config Timer1 = Pwm , Pwm = 8 , Compare A = Clear , Compare B = Clear , Prescale = 1
31
Config Timer2 = Pwm , Compare = Clear , Prescale = 256
32
Enable Timer1
33
Enable Timer2
34
35
36
Config Adc = Free , Prescaler = 4 , Reference = Avcc
37
Start Adc
38
39
Dim Anzeige As String * 16
40
Dim Geschwindigkeit As Word
41
Dim Adc0 As Word
42
Dim Fadingschritt As Byte
43
Dim Swprescaler As Byte
44
45
R Alias Compare1a
46
G Alias Compare1b
47
B Alias Ocr2
48
49
Config Lcdpin = Pin , Db7 = Portb.0 , Db6 = Portd.7 , Db5 = Portd.6 , Db4 = Portd.5 , E = Portc.4 , Rs = Portc.5
50
Config Lcd = 16 * 2
51
Cls
52
Cursor Off
53
54
55
Do
56
57
'LCD Ausgabe
58
59
60
Loop
61
62
Timer0_isr:
63
64
Geschwindigkeit = Getadc(0)
65
66
  'Nur alle <Geschwindigkeit> Timerinterrupts deine Fading-Routine ausführen
67
  Incr Swprescaler
68
  If Swprescaler = Geschwindigkeit Then
69
    Swprescaler = 0
70
    If Modus = 1 Then
71
      If Fadingschritt = 0 Then
72
        Incr R
73
        If R = 255 Then Incr Fadingschritt
74
75
      Elseif Fadingschritt = 1 Then
76
        Incr G
77
        If G = 255 Then Incr Fadingschritt
78
79
      Elseif Fadingschritt = 2 Then
80
        Incr B
81
        If B = 255 Then Incr Fadingschritt
82
83
      Elseif Fadingschritt = 3 Then
84
        Decr R
85
        If R = 0 Then Incr Fadingschritt
86
87
      Elseif Fadingschritt = 4 Then
88
        Decr G
89
        If G = 0 Then Incr Fadingschritt
90
91
      Elseif Fadingschritt = 5 Then
92
        Decr B
93
        If B = 0 Then Fadingschritt = 0
94
      End If
95
      'EndIf 'Das hier war falsch...
96
    Else
97
      Gosub Beleuchtung
98
    End If
99
  End If                                                    '...und gehört eigentlich hier hin!
100
Return
101
102
Beleuchtung:
103
104
Adc0 = Getadc(0)
105
106
Select Case Adc0
107
108
109
Case 1 To 50 :                                              'Rot 100
110
R = 255
111
G = 0
112
B = 0
113
Case 60 To 100 :                                            'Rot 100 Grün 50
114
R = 255
115
G = 125
116
B = 0
117
Case 110 To 200 :                                           'Rot 100 Grün 100
118
R = 255
119
G = 255
120
B = 0
121
Case 210 To 300 :                                           'Rot 100 Grün 100 Blau 125
122
R = 255
123
G = 255
124
B = 125
125
Case 310 To 400:                                            'Rot 100 Grün 100 Blau 100
126
R = 255
127
G = 255
128
B = 255
129
Case 510 To 600:                                            'Rot 50 Grün 100 Blau  100
130
R = 125
131
G = 255
132
B = 255
133
134
Case 610 To 700:                                            'Rot 0 Grün 100 Blau 100
135
R = 0
136
G = 255
137
B = 255
138
139
Case 710 To 800:                                            'Rot 0 Grün 50 Blau 100
140
R = 0
141
G = 125
142
B = 255
143
144
Case 810 To 950:                                            'Rot 0 Grün 0 Blau 100
145
R = 0
146
G = 0
147
B = 255
148
149
End Select
150
151
152
Return

von Jonathan S. (joni-st) Benutzerseite


Lesenswert?

Probier' das mal:
1
'*******************************************************************************
2
' Schalter an PD.1    High = "Mood-Modus"    Low = "Beleuchtungs-Modus"
3
' 10k-Poti an PC.0
4
' LED Rot  an PB.1
5
' LED Grün an PB.2
6
' LED Blau an PB.3
7
'*******************************************************************************
8
9
$regfile = "m8def.dat"
10
$crystal = 16000000
11
$hwstack = 100
12
$swstack = 100
13
$framesize = 100
14
15
'Taster Modus
16
Config Pind.1 = Input
17
Portd.1 = 1
18
Modus Alias Pind.1
19
20
Config Portb.1 = Output                                     'LED Rot
21
Config Portb.2 = Output                                     'LED Gruen
22
Config Portb.3 = Output                                     'LED Blau
23
24
Config Timer0 = Timer , Prescale = 64
25
On Timer0 Timer0_isr
26
Enable Timer0
27
Enable Interrupts
28
29
30
Config Timer1 = Pwm , Pwm = 8 , Compare A = Clear , Compare B = Clear , Prescale = 1
31
Config Timer2 = Pwm , Compare = Clear , Prescale = 256
32
Enable Timer1
33
Enable Timer2
34
35
36
Config Adc = Free , Prescaler = 4 , Reference = Avcc
37
Start Adc
38
39
Dim Anzeige As String * 16
40
Dim Geschwindigkeit As Word
41
Dim Adc0 As Word
42
Dim Fadingschritt As Byte
43
Dim Swprescaler As Word
44
45
R Alias Compare1a
46
G Alias Compare1b
47
B Alias Compare2
48
49
'Config Lcdpin = Pin , Db7 = Portb.0 , Db6 = Portd.7 , Db5 = Portd.6 , Db4 = Portd.5 , E = Portc.4 , Rs = Portc.5
50
'Config Lcd = 16 * 2
51
'Cls
52
'Cursor Off
53
54
55
Do
56
57
'LCD Ausgabe
58
59
60
Loop
61
62
Timer0_isr:
63
64
  Geschwindigkeit = Getadc(0)
65
66
  'Nur alle <Geschwindigkeit> Timerinterrupts deine Fading-Routine ausführen
67
  Incr Swprescaler
68
  If Modus = 1 Then
69
    Is Swprescaler = Geschwindigkeit Then
70
      Swprescaler = 0
71
      If Fadingschritt = 0 Then
72
        Incr R
73
        If R = 255 Then Incr Fadingschritt
74
75
      Elseif Fadingschritt = 1 Then
76
        Incr G
77
        If G = 255 Then Incr Fadingschritt
78
79
      Elseif Fadingschritt = 2 Then
80
        Incr B
81
        If B = 255 Then Incr Fadingschritt
82
83
      Elseif Fadingschritt = 3 Then
84
        Decr R
85
        If R = 0 Then Incr Fadingschritt
86
87
      Elseif Fadingschritt = 4 Then
88
        Decr G
89
        If G = 0 Then Incr Fadingschritt
90
91
      Elseif Fadingschritt = 5 Then
92
        Decr B
93
        If B = 0 Then Fadingschritt = 0
94
      End If
95
    End If
96
  Else
97
    Gosub Beleuchtung
98
  End If
99
Return
100
101
Beleuchtung:
102
103
Adc0 = Getadc(0)
104
105
Select Case Adc0
106
107
108
Case 1 To 50 :                                              'Rot 100
109
R = 255
110
G = 0
111
B = 0
112
Case 60 To 100 :                                            'Rot 100 Grün 50
113
R = 255
114
G = 125
115
B = 0
116
Case 110 To 200 :                                           'Rot 100 Grün 100
117
R = 255
118
G = 255
119
B = 0
120
Case 210 To 300 :                                           'Rot 100 Grün 100 Blau 125
121
R = 255
122
G = 255
123
B = 125
124
Case 310 To 400:                                            'Rot 100 Grün 100 Blau 100
125
R = 255
126
G = 255
127
B = 255
128
Case 510 To 600:                                            'Rot 50 Grün 100 Blau  100
129
R = 125
130
G = 255
131
B = 255
132
133
Case 610 To 700:                                            'Rot 0 Grün 100 Blau 100
134
R = 0
135
G = 255
136
B = 255
137
138
Case 710 To 800:                                            'Rot 0 Grün 50 Blau 100
139
R = 0
140
G = 125
141
B = 255
142
143
Case 810 To 950:                                            'Rot 0 Grün 0 Blau 100
144
R = 0
145
G = 0
146
B = 255
147
148
End Select
149
150
151
Return

Ich hatte mich mit nem Datentyp vertan... Außerdem habe ich die ISR noch 
etwas "verschönert".


Gruß
Jonathan

von Bastler (Gast)


Lesenswert?

Ich flasche nochmal mein altes Code..

Also diese Version geht relativ gut, also Fading und Dimmen..nicht ganz 
perfekt..
1
'*******************************************************************************
2
' Schalter an PD.3    High = "Mood-Modus"    Low = "Beleuchtungs-Modus"
3
' 10k-Poti an PC.0
4
' LED Rot  an PB.1
5
' LED Grün an PB.2
6
' LED Blau an PB.3
7
'*******************************************************************************
8
9
$regfile = "m8def.dat"
10
$crystal = 16000000
11
$hwstack = 100
12
$swstack = 100
13
$framesize = 100
14
15
Config Portb.1 = Output                                     'LED Rot
16
Config Portb.2 = Output                                     'LED Gruen
17
Config Portb.3 = Output                                     'LED Blau
18
19
Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Up , Compare B Pwm = Clear Up , Prescale = 1
20
Config Timer2 = Pwm , Pwm = On , Compare Pwm = Clear Down , Prescale = 1
21
Enable Timer1
22
Enable Timer2
23
 Start Timer1
24
 Start Timer2
25
26
Config Adc = Single , Prescaler = Auto , Reference = Avcc
27
 Start Adc
28
29
Dim Pause As Word
30
Dim Speed As Word
31
Dim Adc0 As Word
32
33
Dim S1 As String * 3                                        'Rot                                  '
34
Dim S2 As String * 3                                        'Gruen
35
Dim S3 As String * 3                                        'Blau
36
Dim S4 As String * 3                                        'adc0
37
38
39
40
41
R Alias Compare1a
42
G Alias Compare1b
43
B Alias Ocr2
44
45
Config Lcdpin = Pin , Db7 = Portb.0 , Db6 = Portd.7 , Db5 = Portd.6 , _
46
      Db4 = Portd.5 , E = Portc.4 , Rs = Portc.5
47
Config Lcd = 16 * 2
48
Cls
49
Cursor Off
50
51
52
53
On Int0 Beleuchtung
54
Enable Int0
55
Config Int0 = Low Level
56
Enable Interrupts
57
58
59
60
'*******************************************************************************
61
' Einstellen der Dimm-Geschwindigkeit
62
'*******************************************************************************
63
64
Pause = 2
65
Speed = 30
66
67
'*******************************************************************************
68
' Mood-Modus         fadet alle Farben durch
69
'*******************************************************************************
70
71
Mood:
72
73
74
75
Adc0 = Getadc(0)
76
Speed = Adc0 / 4
77
78
79
Locate 1 , 1
80
Lcd "   Fading Mode  "
81
Locate 2 , 1
82
Lcd "   is running   "
83
84
85
Do
86
Incr R                                                      'Rot hoch
87
Waitms Speed
88
Loop Until R = 255
89
Waitms Pause
90
91
92
Do
93
Incr G                                                      'Grün hoch
94
Waitms Speed
95
Loop Until G = 255
96
Waitms Pause
97
98
99
Do
100
Incr B                                                      'Blau  hoch
101
Waitms Speed
102
Loop Until B = 255
103
Waitms Pause
104
105
106
107
Do                                                          'Rot runter
108
Decr R
109
Waitms Speed
110
Loop Until R = 0
111
Waitms Pause
112
113
Do                                                          'Grün runter
114
Decr G
115
Waitms Speed
116
Loop Until R = 0
117
Waitms Pause
118
119
120
Do                                                          'Blau runter
121
Decr B
122
Waitms Speed
123
Loop Until B = 0
124
Waitms Pause
125
126
Do
127
Incr R                                                      'Rot hoch
128
Waitms Speed
129
Loop Until R = 255
130
Waitms Pause
131
132
Return
133
134
'*******************************************************************************
135
' Beleuchtungs-Modus        6 Grundfarben können mittels ADC angewählt werden
136
'*******************************************************************************
137
138
Beleuchtung:
139
140
141
142
Do
143
144
S1 = Str(r)                                                 'Rot
145
S1 = Format(s1 , "000")
146
'----------------------------------
147
S2 = Str(g)                                                 'Gruen
148
S2 = Format(s2 , "000")
149
'------------------------------------
150
S3 = Str(b)                                                 'Blau
151
S3 = Format(s3 , "000")
152
'------------------------------------
153
S4 = Str(adc0)
154
S4 = Format(s4 , "000")
155
156
157
Adc0 = Getadc(0)
158
If Adc0 >= 1000 Then
159
Adc0 = 999
160
End If
161
162
Locate 1 , 1
163
Lcd "Farbwert:" ; "    " ; S4
164
Locate 2 , 1
165
Lcd "R:" ; S1 ; "G:" ; S2 ; "B:" ; S3
166
167
Select Case Adc0
168
169
170
Case 1 To 50                                                'Rot 100
171
R = 255
172
G = 0
173
B = 0
174
Case 60 To 100 :                                            'Rot 100 Grün 50
175
R = 255
176
G = 125
177
B = 0
178
Case 110 To 200 :                                           'Rot 100 Grün 100
179
R = 255
180
G = 255
181
B = 0
182
Case 210 To 300 :                                           'Rot 100 Grün 100 Blau 125
183
R = 255
184
G = 255
185
B = 125
186
Case 310 To 400:                                            'Rot 100 Grün 100 Blau 100
187
R = 255
188
G = 255
189
B = 255
190
Case 510 To 600:                                            'Rot 50 Grün 100 Blau  100
191
R = 125
192
G = 255
193
B = 255
194
195
Case 610 To 700:                                            'Rot 0 Grün 100 Blau 100
196
R = 0
197
G = 255
198
B = 255
199
200
Case 710 To 800:                                            'Rot 0 Grün 50 Blau 100
201
R = 0
202
G = 125
203
B = 255
204
205
Case 810 To 950:                                            'Rot 0 Grün 0 Blau 100
206
R = 0
207
G = 0
208
B = 255
209
210
Case 960 To 999                                             'Rot 0 Grün 100 Blau 0
211
R = 0
212
G = 255
213
B = 0
214
215
End Select
216
217
Loop
218
219
Return

von Jonathan S. (joni-st) Benutzerseite


Lesenswert?

Die Version, die ich eben geposted habe, MUSS gehen. Ich habe den Fehler 
nämlich gefunden ("Swprescaler" würde "Geschwindigkeit" nie 
erreichen)... Geht es?


Gruß
Jonathan

von Bastler (Gast)


Lesenswert?

Also zu Deinem Code...

Entweder extrem langsam..( AdcO ist ca 0 ) oder weiss nicht

Im Colour modus läuft nicht so "rund" wei meine, ca in der Mitte (adc 
500 ) ist ein Loch..alle aus..

Hast mal meine angeguckt ?

von Jonathan S. (joni-st) Benutzerseite


Lesenswert?

Also das "Loch" kommt wahrscheinlich vom
1
R = 255
2
G = 255
3
B = 255
, wenn die LEDs gegen VCC geschaltet sind. Dass da kein "Loch" ist, 
liegt wahrscheinlich an den Fehlern in deinem Programm... Bei der 
Fading-Geschwindigkeit sind mir 2 Fehler unterlaufen. Bitte ersetze die 
Zeile
1
    Is Swprescaler = Geschwindigkeit Then
mit
1
    If Swprescaler >= Geschwindigkeit Then


Gruß
Jonathan

von Helfer (Gast)


Lesenswert?

@ Jonathan: du musst deine Timer Konfiguration so machen wie es 
"Bastler" macht.

Du Schreibst immer: Compare A = Clear, Compare B = Clear....
Richtig ist aber: Compare A PWM = Clear UP oder Down , Compare B PWM = 
Clear Up oder Down...

von Jonathan S. (joni-st) Benutzerseite


Lesenswert?

Nein, Compare A = Clear ist richtig. Die Bascom-Hilfe drückt sich da 
etwas komisch aus. Compare X setzt/löscht/trennt den OCnX-Pin, während 
Compare X Pwm die Aktion beim erreichen des maximalen Zählerstandes 
angibt.


Gruß
Jonathan

von Bastler (Gast)


Lesenswert?

Danke nochmal werde gleich morgen Vormittag "testen"

Aber mein LED Angebot steht noch und da ich Dich für ein Experte halte, 
alternativ könnte ich Dir 6 Stück IV-17 Röhren hinterlassen

http://i.ebayimg.com/03/!B7vOgKQ!Wk~$%28KGrHqJ,!iIEzNIFsk%28PBM1Fkf5WFQ~~0_35.JPG

von Jonathan S. (joni-st) Benutzerseite


Lesenswert?

Nein... Du brauchst mir nichts dafür zu geben... :)


Gruß
Jonathan

von Bastler (Gast)


Lesenswert?

Jonathan
schicke mir Deine Daten an

lombok2008@web.de

Gruss

von Jonathan S. (joni-st) Benutzerseite


Lesenswert?

Nein.

von Bastler (Gast)


Lesenswert?

Ok, trotzdem Danke für Deine Bemühungen, hätte ich auch gerne gemacht, 
ohne Hintergedanke !!

von Jonathan S. (joni-st) Benutzerseite


Lesenswert?

Wie gesagt: Keine Ursache! Ich helfe dir doch gerne.


Gruß
Jonathan

von MWS (Gast)


Lesenswert?

Jonathan Strobl schrieb:
> Nein, Compare A = Clear ist richtig. Die Bascom-Hilfe drückt sich da
> etwas komisch aus.

Falsch. Bascom erlaubt jedoch beide Schreibarten und verwendet sie in 
etwa gleichwertig. "In etwa" deshalb, weil ein Clear UP ein Setzen des 
Pins beim einem Compare Match beim Hochzählen entspricht, während es 
beim Clear DOWN genau umgekehrt ist. Das sollte ein Bug in Bascom sein.

> Compare X setzt/löscht/trennt den OCnX-Pin, während Compare X Pwm die
> Aktion beim erreichen des maximalen Zählerstandes angibt.

Das hat mit dem maximalen Zählerstand gar nix zu tun, Set/Clear oder 
Clear UP/Clear DOWN bezieht sich allein auf den Vorgang des Compare 
Match.

Der Grund für die unterschiedliche Syntax bei der Verwendung 
Timer/Clear/Set versus PWM/Clear UP/Clear DOWN ergibt sich aus dem 
Datenblatt, dort wird beim Timermode von Clear/Set gesprochen, während 
es beim Phase Correct PWM Mode Clear UP/Clear Down heißt.
Bascom verwendet für PWM immer den Phase Correct Mode.

Jonathan Strobl schrieb:
> Enable Timer1
> Enable Timer2

Es ist keine ISR für Timer1 oder Timer2 im Code enthalten, darum gibt's 
auch keine Notwendigkeit diese Interrupts zu erlauben. Nimm den Unsinn 
raus.

Abgesehen davon ist sowohl der Originalcode als auch Dein Code 
schlichtweg grauselig. Das würde man am Besten mit einem 
Zustandsautomat, auch "State Machine" genannt machen, in der Timer0-ISR 
würde man lediglich ein Flag, z.B. ein ms_Tic setzen und das dann in der 
State Machine auswerten und zurücksetzen.

In dieser State Machine wäre auch problemlos jegliche Schalterabfrage zu 
erledigen, dafür braucht man keinen eigenen Interrupt.

Sollte der Begriff State Machine nicht bekannt sein, das Internet und 
ich denke auch MC.net sollte erschöpfend Auskunft geben können.

von Jonathan S. (joni-st) Benutzerseite


Lesenswert?

Ich weiß, dass man das besser mit Flags gemacht hätte. Aber ich wollte 
"Bastler" nicht noch durch Flags verwirren... Bei dem "Enable Timern" 
hatte ich mich schlichtweg vertan. Danke, dass du mich da aufgeklärt 
hast :)


Gruß
Jonathan

von Bastler (Gast)


Lesenswert?

Hallo Jonathan, also habe Deine Version geflasht :

Spannend, glaubst nicht !

Also die feste Farben Modus geht soweit,ohne "loch" ich muss auch sagen, 
war ich mit der Aussage nicht ganz einverstanden.

Du hast gesagt :
R=255
G=225
B=255

würde nicht gehen, weil gegen +5 geschaltet wird.

Warum gehen dann die andere Kombinationen ?

R=255
G=0
B=255 ?

Nun zum Code habe also geflasht egal wie der Poti steht fadet nicht.

Blau Grün an. Nochmal der Code :
1
'*******************************************************************************
2
' Schalter an PD.1    High = "Mood-Modus"    Low = "Beleuchtungs-Modus"
3
' 10k-Poti an PC.0
4
' LED Rot  an PB.1
5
' LED Grün an PB.2
6
' LED Blau an PB.3
7
'*******************************************************************************
8
9
$regfile = "m8def.dat"
10
$crystal = 16000000
11
$hwstack = 100
12
$swstack = 100
13
$framesize = 100
14
15
'Taster Modus
16
Config Pind.1 = Input
17
Portd.1 = 1
18
Modus Alias Pind.1
19
20
Config Portb.1 = Output                                     'LED Rot
21
Config Portb.2 = Output                                     'LED Gruen
22
Config Portb.3 = Output                                     'LED Blau
23
24
Config Timer0 = Timer , Prescale = 64
25
On Timer0 Timer0_isr
26
Enable Timer0
27
Enable Interrupts
28
29
30
Config Timer1 = Pwm , Pwm = 8 , Compare A = Clear , Compare B = Clear , Prescale = 1
31
Config Timer2 = Pwm , Compare = Clear , Prescale = 256
32
Enable Timer1
33
Enable Timer2
34
35
36
Config Adc = Free , Prescaler = 4 , Reference = Avcc
37
Start Adc
38
39
Dim Anzeige As String * 16
40
Dim Geschwindigkeit As Word
41
Dim Adc0 As Word
42
Dim Fadingschritt As Byte
43
Dim Swprescaler As Word
44
45
R Alias Compare1a
46
G Alias Compare1b
47
B Alias Compare2
48
49
'Config Lcdpin = Pin , Db7 = Portb.0 , Db6 = Portd.7 , Db5 = Portd.6 , Db4 = Portd.5 , E = Portc.4 , Rs = Portc.5
50
'Config Lcd = 16 * 2
51
'Cls
52
'Cursor Off
53
54
55
Do
56
57
'LCD Ausgabe
58
59
60
Loop
61
62
Timer0_isr:
63
64
  Geschwindigkeit = Getadc(0)
65
66
  'Nur alle <Geschwindigkeit> Timerinterrupts deine Fading-Routine ausführen
67
  Incr Swprescaler
68
  If Modus = 1 Then
69
    If Swprescaler >= Geschwindigkeit Then
70
      Swprescaler = 0
71
      If Fadingschritt = 0 Then
72
        Incr R
73
        If R = 255 Then Incr Fadingschritt
74
75
      Elseif Fadingschritt = 1 Then
76
        Incr G
77
        If G = 255 Then Incr Fadingschritt
78
79
      Elseif Fadingschritt = 2 Then
80
        Incr B
81
        If B = 255 Then Incr Fadingschritt
82
83
      Elseif Fadingschritt = 3 Then
84
        Decr R
85
        If R = 0 Then Incr Fadingschritt
86
87
      Elseif Fadingschritt = 4 Then
88
        Decr G
89
        If G = 0 Then Incr Fadingschritt
90
91
      Elseif Fadingschritt = 5 Then
92
        Decr B
93
        If B = 0 Then Fadingschritt = 0
94
      End If
95
    End If
96
  Else
97
    Gosub Beleuchtung
98
  End If
99
Return
100
101
Beleuchtung:
102
103
Adc0 = Getadc(0)
104
105
Select Case Adc0
106
107
108
Case 1 To 50 :                                              'Rot 100
109
R = 255
110
G = 0
111
B = 0
112
Case 60 To 100 :                                            'Rot 100 Grün 50
113
R = 255
114
G = 125
115
B = 0
116
Case 110 To 200 :                                           'Rot 100 Grün 100
117
R = 255
118
G = 255
119
B = 0
120
Case 210 To 300 :                                           'Rot 100 Grün 100 Blau 125
121
R = 255
122
G = 255
123
B = 125
124
Case 310 To 400:                                            'Rot 100 Grün 100 Blau 100
125
R = 255
126
G = 255
127
B = 255
128
Case 510 To 600:                                            'Rot 50 Grün 100 Blau  100
129
R = 125
130
G = 255
131
B = 255
132
133
Case 610 To 700:                                            'Rot 0 Grün 100 Blau 100
134
R = 0
135
G = 255
136
B = 255
137
138
Case 710 To 800:                                            'Rot 0 Grün 50 Blau 100
139
R = 0
140
G = 125
141
B = 255
142
143
Case 810 To 950:                                            'Rot 0 Grün 0 Blau 100
144
R = 0
145
G = 0
146
B = 255
147
148
End Select
149
150
151
Return

von Bastler (Gast)


Lesenswert?

Ich habe langsam überhaupt keine Erklärung, warum diese ISR Variante 
nicht geht und meine alte Int0 "besser" geht....Rätsel ( Also an der 
Schaltung bzw Hardware, AVR kann es nicht liegen )

von Matthias K. (mkeller)


Lesenswert?

Da du offenbar ein LCD dran hast, lass dir doch mal den ADC Wert und die 
Modusvariable ausgeben.

Bin leider kein BASCOM Anwender und

von Gerhard K. (mikros)


Lesenswert?

Ich hätte da eine Erklärung:

Siehe Bascom Hilfe zu Config ADC.
Schön aufmerksam durchlesen, und es wird Klick machen.

Mfg

von Bastler (Gast)


Lesenswert?

Bringt wahrscheinlich nicht viel, LCD ist noch nicht in der Do-Loop 
eingebunden und das Programm schein in der ISR irgendwo hängen...

von Bastler (Gast)


Lesenswert?

bezüglich ADC :

Diese Variante hatte ich schon benutzt :

Config Adc = Single , Prescaler = Auto , Reference = Avcc
Start Adc

Mit dieser Variante ist die geplante ISR Variante auch nicht sauber 
gelaufen.

Nun hat Johannes folgendes Vorgeschlagen :

Config Adc = Free , Prescaler = 4 , Reference = Avcc
Start Adc

von Helfer (Gast)


Lesenswert?

>Ich habe langsam überhaupt keine Erklärung, warum diese ISR Variante
nicht geht....

Deine Timer0_Isr wird alle 1024 µS oder ca. 1 mS aufgerufen. Überlege 
mal was du da alles in die Interrupt Routine packst...?!?

Allein die ADC Wandlung nimmt schon etwa >= 260µS in anspruch, rund ein 
viertel deiner verfügbaren Zeit...

von Alex W. (a20q90)


Lesenswert?

Ich würde die Lücken im Case schließen:

>Case 1 To 50 :                                              'Rot 100
>Case 60 To 100 :                                            'Rot 100 Grün
>Case 110 To 200 :

Case 1 To 50 :                                              'Rot 100
Case 51 To 100 :                                            'Rot 100 
Grün Case 101 To 200 :

Oder Du rechnest den 10Bit ADC-Wert in einen 8Bit um.

von Gerhard K. (mikros)


Lesenswert?

Hallo!

@Bastler:
Nur damit ichs richtig verstehe:
In der ISR funktioniert das Poti nicht, währendessen es beim
Beleuchtungsmodus funktioniert?

MfG

von Bastler (Gast)


Lesenswert?

Kann es wirklich sein, das das ganze Programm Konstrukt von Jonathan 
doch nicht für die Anwendung passt ?

Gerhard : Ja das Poti funktioniert nicht in der Fading ( okay faden tut 
allgemein nicht ) aber in der Select Case Anwendung Ja

von Karl H. (kbuchegg)


Lesenswert?

Ich würde erst mal identifizieren, ob es der ADC oder die PWM ist, die 
da Probleme macht.
Dazu würde ich den ADC erst mal stilllegen.

zb so

anstelle von
1
Timer0_isr:
2
3
  Geschwindigkeit = Getadc(0)
4
5
  'Nur alle <Geschwindigkeit> Timerinterrupts deine Fading-Routine ausführen
6
  Incr Swprescaler

würde ich den ADC Wert mal als fixe Konstante vorgeben
1
Timer0_isr:
2
3
  'Geschwindigkeit = Getadc(0)
4
  Geschwindigkeit = 0
5
6
  'Nur alle <Geschwindigkeit> Timerinterrupts deine Fading-Routine ausführen
7
  Incr Swprescaler


Wenn jetzt immer noch nichts fadet, dann liegt das Problem irgendwo in 
den PWM bzw. den Timer Konfigurationen.

Wenn es aber fadet, dann habe ich eine Theorie. Und die hängt damit 
zusammen, welchen Wertebereich das ADC Ergebnis hat. Da können Werte von 
0 bis 1023 auftreten. Und 1023 mal den Fadingschritt auslassen bis dann 
endlich mal um 1 hochgesetzt wird, das kann schon dauern.

Aber erst mal: nachsehen ob das Fading an sich funktioniert! Dazu den 
ADC stilllegen und mit einem bekannten konstanten Wert operieren.

von Bastler (Gast)


Lesenswert?

Dieser Code warum aich immer funktioniert, wie ich wollte. Fadet sauber, 
die Farben kann ich einstellen und das display macht auch was ich wollt 
:

1
'*******************************************************************************
2
' Schalter an PD.3    High = "Mood-Modus"    Low = "Beleuchtungs-Modus"
3
' 10k-Poti an PC.0
4
' LED Rot  an PB.1
5
' LED Grün an PB.2
6
' LED Blau an PB.3
7
' Bastler-Mood - Fader V5
8
'*******************************************************************************
9
10
$regfile = "m8def.dat"
11
$crystal = 16000000
12
$hwstack = 100
13
$swstack = 100
14
$framesize = 100
15
16
Config Portb.1 = Output                                     'LED Rot
17
Config Portb.2 = Output                                     'LED Gruen
18
Config Portb.3 = Output                                     'LED Blau
19
20
Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Up , Compare B Pwm = Clear Up , Prescale = 1
21
Config Timer2 = Pwm , Pwm = On , Compare Pwm = Clear Down , Prescale = 1
22
Enable Timer1
23
Enable Timer2
24
 Start Timer1
25
 Start Timer2
26
27
Config Adc = Single , Prescaler = Auto , Reference = Avcc
28
 Start Adc
29
30
Dim Pause As Word
31
Dim Speed As Word
32
Dim Adc0 As Word
33
34
Dim S1 As String * 3                                        'Rot                                  '
35
Dim S2 As String * 3                                        'Gruen
36
Dim S3 As String * 3                                        'Blau
37
Dim S4 As String * 3                                        'adc0
38
39
40
41
42
R Alias Compare1a
43
G Alias Compare1b
44
B Alias Ocr2
45
46
Config Lcdpin = Pin , Db7 = Portb.0 , Db6 = Portd.7 , Db5 = Portd.6 , _
47
      Db4 = Portd.5 , E = Portc.4 , Rs = Portc.5
48
Config Lcd = 16 * 2
49
Cls
50
Cursor Off
51
52
53
54
On Int0 Beleuchtung
55
Enable Int0
56
Config Int0 = Low Level
57
Enable Interrupts
58
59
60
61
'*******************************************************************************
62
' Einstellen der Dimm-Geschwindigkeit
63
'*******************************************************************************
64
65
Pause = 2
66
Speed = 30
67
68
'*******************************************************************************
69
' Mood-Modus         fadet alle Farben durch
70
'*******************************************************************************
71
72
Mood:
73
74
Do
75
76
Adc0 = Getadc(0)
77
Speed = Adc0 / 4
78
79
80
Locate 1 , 1
81
Lcd "   Fading Mode  "
82
Locate 2 , 1
83
Lcd "Speed"
84
Locate 2 , 13
85
Lcd Speed
86
87
88
Do
89
Incr R                                                      'Rot hoch
90
Waitms Speed
91
Loop Until R = 255
92
Waitms Pause
93
94
95
Do
96
Incr G                                                      'Grün hoch
97
Waitms Speed
98
Loop Until G = 255
99
Waitms Pause
100
101
102
Do
103
Incr B                                                      'Blau  hoch
104
Waitms Speed
105
Loop Until B = 255
106
Waitms Pause
107
108
109
110
Do                                                          'Rot runter
111
Decr R
112
Waitms Speed
113
Loop Until R = 0
114
Waitms Pause
115
116
Do                                                          'Grün runter
117
Decr G
118
Waitms Speed
119
Loop Until G = 0
120
Waitms Pause
121
122
123
Do                                                          'Blau runter
124
Decr B
125
Waitms Speed
126
Loop Until B = 125
127
Waitms Pause
128
129
Do
130
Incr G                                                      'Grün hoch
131
Waitms Speed
132
Loop Until G = 255
133
Waitms Pause
134
135
Loop
136
137
Return
138
139
'*******************************************************************************
140
' Beleuchtungs-Modus        6 Grundfarben können mittels ADC angewählt werden
141
'*******************************************************************************
142
143
Beleuchtung:
144
145
146
147
Do
148
149
S1 = Str(r)                                                 'Rot
150
S1 = Format(s1 , "000")
151
'----------------------------------
152
S2 = Str(g)                                                 'Gruen
153
S2 = Format(s2 , "000")
154
'------------------------------------
155
S3 = Str(b)                                                 'Blau
156
S3 = Format(s3 , "000")
157
'------------------------------------
158
S4 = Str(adc0)
159
S4 = Format(s4 , "000")
160
161
162
Adc0 = Getadc(0)
163
If Adc0 >= 1000 Then
164
Adc0 = 999
165
End If
166
167
Locate 1 , 1
168
Lcd "Farbwert:" ; "    " ; S4
169
Locate 2 , 1
170
Lcd "R:" ; S1 ; "G:" ; S2 ; "B:" ; S3
171
172
Select Case Adc0
173
174
175
Case 1 To 50:                                               'Rot 100
176
R = 255
177
G = 0
178
B = 0
179
Case 51 To 100 :                                            'Rot 100 Grün 50
180
R = 255
181
G = 125
182
B = 0
183
Case 101 To 200 :                                           'Rot 100 Grün 100
184
R = 255
185
G = 255
186
B = 0
187
Case 201 To 300 :                                           'Rot 100 Grün 100 Blau 125
188
R = 255
189
G = 255
190
B = 125
191
Case 301 To 400:                                            'Rot 100 Grün 100 Blau 100
192
R = 255
193
G = 255
194
B = 255
195
Case 401 To 500:                                            'Rot 50 Grün 100 Blau  100
196
R = 125
197
G = 255
198
B = 255
199
200
Case 501 To 600:                                            'Rot 0 Grün 100 Blau 100
201
R = 0
202
G = 255
203
B = 255
204
205
Case 601 To 700:                                            'Rot 0 Grün 50 Blau 100
206
R = 0
207
G = 125
208
B = 255
209
210
Case 701 To 800:                                            'Rot 0 Grün 0 Blau 100
211
R = 0
212
G = 0
213
B = 255
214
215
Case 801 To 900:                                            'Rot 0 Grün 100 Blau 0
216
R = 0
217
G = 0
218
B = 125
219
220
Case 901 To 1000:
221
R = 125
222
G = 0
223
B = 125
224
225
End Select
226
227
Loop
228
229
Return

von Jonathan S. (joni-st) Benutzerseite


Lesenswert?

Veruche es doch mal ohne das "Enable Timer1" und "Enable Timer2"... Und 
probiere das mal:
1
'*******************************************************************************
2
' Schalter an PD.1    High = "Mood-Modus"    Low = "Beleuchtungs-Modus"
3
' 10k-Poti an PC.0
4
' LED Rot  an PB.1
5
' LED Grün an PB.2
6
' LED Blau an PB.3
7
'*******************************************************************************
8
9
$regfile = "m8def.dat"
10
$crystal = 16000000
11
$hwstack = 100
12
$swstack = 100
13
$framesize = 100
14
15
'Taster Modus
16
Config Pind.1 = Input
17
Portd.1 = 1
18
Modus Alias Pind.1
19
20
Config Portb.1 = Output                                     'LED Rot
21
Portb.1 = 1
22
Waitms 1000
23
Config Portb.2 = Output                                     'LED Gruen
24
Config Portb.3 = Output                                     'LED Blau
25
26
Config Timer0 = Timer , Prescale = 64
27
Start Timer0
28
On Timer0 Timer0_isr
29
Enable Timer0
30
Enable Interrupts
31
32
33
Config Timer1 = Pwm , Pwm = 8 , Compare A = Clear , Compare B = Clear , Prescale = 1
34
Config Timer2 = Pwm , Compare = Clear , Prescale = 256
35
Start Timer1
36
Start Timer2
37
38
39
Config Adc = Free , Prescaler = 4 , Reference = Avcc
40
Start Adc
41
42
Dim Anzeige As String * 16
43
Dim Geschwindigkeit As Word
44
Dim Adc0 As Word
45
Dim Fadingschritt As Byte
46
Dim Swprescaler As Word
47
Dim R_fading As Byte
48
Dim G_fading As Byte
49
Dim B_fading As Byte
50
51
R Alias Compare1a
52
G Alias Compare1b
53
B Alias Compare2
54
55
Config Lcdbus = 4
56
Config Lcdpin = Pin , Db7 = Portb.0 , Db6 = Portd.7 , Db5 = Portd.6 , Db4 = Portd.5 , E = Portc.4 , Rs = Portc.5
57
Config Lcd = 16 * 2
58
Cls
59
Cursor Off
60
61
62
Do
63
64
'LCD Ausgabe
65
66
67
Loop
68
69
Timer0_isr:
70
71
  Geschwindigkeit = Getadc(0)
72
73
  'Nur alle <Geschwindigkeit> Timerinterrupts deine Fading-Routine ausführen
74
  Incr Swprescaler
75
  If Modus = 1 Then
76
    If Swprescaler = Geschwindigkeit Then
77
      Swprescaler = 0
78
      If Fadingschritt = 0 Then
79
        Incr R_fading
80
        If R_fading = 255 Then Incr Fadingschritt
81
82
      Elseif Fadingschritt = 1 Then
83
        Incr G_fading
84
        If G_fading = 255 Then Incr Fadingschritt
85
86
      Elseif Fadingschritt = 2 Then
87
        Incr B_fading
88
        If B_fading = 255 Then Incr Fadingschritt
89
90
      Elseif Fadingschritt = 3 Then
91
        Decr R_fading
92
        If R_fading = 0 Then Incr Fadingschritt
93
94
      Elseif Fadingschritt = 4 Then
95
        Decr G_fading
96
        If G_fading = 0 Then Incr Fadingschritt
97
98
      Elseif Fadingschritt = 5 Then
99
        Decr B_fading
100
        If B_fading = 0 Then Fadingschritt = 0
101
      End If
102
103
      R = R_fading
104
      G = G_fading
105
      B = B_fading
106
    End If
107
  Else
108
    Gosub Beleuchtung
109
  End If
110
Return
111
112
113
Beleuchtung:
114
115
Adc0 = Getadc(0)
116
117
Select Case Adc0
118
119
120
Case 1 To 59 :                                              'Rot 100
121
R = 255
122
G = 0
123
B = 0
124
Case 60 To 109 :                                            'Rot 100 Grün 50
125
R = 255
126
G = 125
127
B = 0
128
Case 110 To 209 :                                           'Rot 100 Grün 100
129
R = 255
130
G = 255
131
B = 0
132
Case 210 To 309 :                                           'Rot 100 Grün 100 Blau 125
133
R = 255
134
G = 255
135
B = 125
136
Case 310 To 409:                                            'Rot 100 Grün 100 Blau 100
137
R = 255
138
G = 255
139
B = 255
140
Case 410 To 509:                                            'Rot 50 Grün 100 Blau  100
141
R = 125
142
G = 255
143
B = 255
144
145
Case 510 To 609:                                            'Rot 0 Grün 100 Blau 100
146
R = 0
147
G = 255
148
B = 255
149
150
Case 610 To 709:                                            'Rot 0 Grün 50 Blau 100
151
R = 0
152
G = 125
153
B = 255
154
155
Case 710 To 809:                                            'Rot 0 Grün 0 Blau 100
156
R = 0
157
G = 0
158
B = 255
159
160
Case 810 To 909:
161
R = 168
162
G = 128
163
B = 128
164
165
Case 910 To 1023:
166
R = 0
167
G = 0
168
B = 0
169
170
End Select
171
172
173
Return


Gruß
Jonathan

von Bastler (Gast)


Lesenswert?

Hallo Jonathan,

schlechte Nachrichten ...

Also faden..tut sich nichts..

habe meine Version nochmal in den gleichen AVR geflascht, tut ohne 
Probleme.

verstehe ich nicht.

von MWS (Gast)


Lesenswert?

Jonathan Strobl schrieb:
> $crystal = 16000000
> Config Adc = Free , Prescaler = 4 , Reference = Avcc

Ein ADC-Clock von 4MHz ist jenseits von Gut und Böse. Ist auch völlig 
unnötig, denn wenn der ADC mit "Free" konfiguriert wird, so wartet 
Bascom bei GetADC() nicht bis zum Ende einer neuen Wandlung, sondern 
holt nur das aktuelle Ergebnis aus ADCL/ADCH ab.

Der ADC kann damit also so langsam wie möglich eingestellt werden, bzw. 
auf AUTO gesetzt werden.

von Bastler (Gast)


Lesenswert?

Habe Jonathan Version mit meinem ADC Config geflasht

Config Adc = Single , Prescaler = Auto , Reference = Avcc
 Start Adc

Fading ist gleich = 0

von MWS (Gast)


Lesenswert?

Tausche:
1
If Swprescaler = Geschwindigkeit Then
gegen
1
If Swprescaler > Geschwindigkeit Then
und konfiguriere:
1
Config Adc = Free , Prescaler = Auto , Reference = Avcc

Der ADC schwankt immer ein wenig und somit ist es recht wahrscheinlich 
daß der ADC-Wert sich ändert und ein Vergleich per "=" nicht zutrifft. 
Dann dauert es mehr als eine Minute, bis Swprescaler übergelaufen ist 
und sich wieder im Bereich < 1024 befindet.

Testen kann man auch, indem man Geschwindigkeit fest setzt und nicht per 
ADC zuweist.

von Jonathan S. (joni-st) Benutzerseite


Lesenswert?

Versuch mal "Config ADC = Free, Prescaler = 128, Reference = AVCC"...


Gruß
Jonathan

von Jonathan S. (joni-st) Benutzerseite


Lesenswert?

MWS schrieb:
> Tausche:
1
If Swprescaler = Geschwindigkeit Then
>gegen
1
If Swprescaler > Geschwindigkeit Then

Huch, das hatte er bereits gemacht - ist wohl irgendwie 
verlorengegangen...


Gruß
Jonathan

von Bastler (Gast)


Lesenswert?

Also Jungs ich weiss nicht, was da los ist,

Ich denke so langsam ich bleibe bei meiner Variante, irgendwie funzt 
alles nicht mal annähernd so wie mein schlechtes Programm...

Meine ADC Config habe ich schon bestimt 5 mal in andere Schaltungen 
verwendet

Diese stammt Ursprünglich von Halvar ( Habe am Anfang ausfühlich die 
Seite studiert)und einige Beispiele mit ADC habe ich im Forum Ledstyles 
bzw. Roboternetz auch gesehen. Ich meine jetzt nicht von komplexen 
Anwendungen, sondern so ganz einfache wie meine.

von Helfer (Gast)


Lesenswert?

Hallo zusammen,

ich habe die Schaltung mal schnell selber auf einem Steckbrett gebaut.

Ich habe nur Atmega 168 bei mir umliegen aber das ist im Prinzip kein 
groér unterschied...

Jonathan's Code funktioniert soweit ich habe nur die Konfiguration des 
Timer1 und timer2 angepasst....
1
'*******************************************************************************
2
' Schalter an PD.1    High = "Mood-Modus"    Low = "Beleuchtungs-Modus"
3
' 10k-Poti an PC.0
4
' LED Rot  an PB.1
5
' LED Grün an PB.2
6
' LED Blau an PB.3
7
'*******************************************************************************
8
9
$regfile = "m8def.dat"
10
$crystal = 16000000
11
$hwstack = 100
12
$swstack = 100
13
$framesize = 100
14
'$sim
15
16
'Taster Modus
17
Config Pind.1 = Input
18
'Portd.1 = 1
19
Modus Alias Pind.1
20
21
Config Portb.1 = Output                      'LED Rot
22
Config Portb.2 = Output                                     'LED Gruen
23
Config Portb.3 = Output                                     'LED Blau
24
25
Config Timer0 = Timer , Prescale = 64
26
Start Timer0
27
On Timer0 Timer0_isr
28
Enable Timer0
29
Enable Interrupts
30
31
32
Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Up , Compare B Pwm = Clear Up , Prescale = 1
33
Config Timer2 = Pwm , Compare Pwm = Clear Up , Prescale = 1
34
Start Timer1
35
Start Timer2
36
37
38
Config Adc = Free , Prescaler = Auto , Reference = Avcc
39
Start Adc
40
41
Dim Anzeige As String * 16
42
Dim Geschwindigkeit As Word
43
Dim Adc0 As Word
44
Dim Fadingschritt As Byte
45
Dim Swprescaler As Word
46
Dim R_fading As Byte
47
Dim G_fading As Byte
48
Dim B_fading As Byte
49
50
R Alias Compare1a
51
G Alias Compare1b
52
B Alias Compare2
53
54
Config Lcdbus = 4
55
Config Lcdpin = Pin , Db7 = Portb.0 , Db6 = Portd.7 , Db5 = Portd.6 , Db4 = Portd.5 , E = Portc.4 , Rs = Portc.5
56
Config Lcd = 16 * 2
57
Cls
58
Cursor Off
59
60
61
Do
62
63
'LCD Ausgabe
64
65
66
Loop
67
68
Timer0_isr:
69
70
  Geschwindigkeit = Getadc(0)
71
72
  'Nur alle <Geschwindigkeit> Timerinterrupts deine Fading-Routine ausführen
73
  Incr Swprescaler
74
  If Modus = 1 Then
75
    If Swprescaler > Geschwindigkeit Then
76
      Swprescaler = 0
77
      If Fadingschritt = 0 Then
78
        Incr R_fading
79
        If R_fading = 255 Then Incr Fadingschritt
80
81
      Elseif Fadingschritt = 1 Then
82
        Incr G_fading
83
        If G_fading = 255 Then Incr Fadingschritt
84
85
      Elseif Fadingschritt = 2 Then
86
        Incr B_fading
87
        If B_fading = 255 Then Incr Fadingschritt
88
89
      Elseif Fadingschritt = 3 Then
90
        Decr R_fading
91
        If R_fading = 0 Then Incr Fadingschritt
92
93
      Elseif Fadingschritt = 4 Then
94
        Decr G_fading
95
        If G_fading = 0 Then Incr Fadingschritt
96
97
      Elseif Fadingschritt = 5 Then
98
        Decr B_fading
99
        If B_fading = 0 Then Fadingschritt = 0
100
      End If
101
102
      R = R_fading
103
      G = G_fading
104
      B = B_fading
105
    End If
106
  Else
107
    Gosub Beleuchtung
108
  End If
109
Return
110
111
112
Beleuchtung:
113
114
Adc0 = Getadc(0)
115
116
Select Case Adc0
117
118
119
Case 1 To 59 :                                              'Rot 100
120
R = 255
121
G = 0
122
B = 0
123
Case 60 To 109 :                                            'Rot 100 Grün 50
124
R = 255
125
G = 125
126
B = 0
127
Case 110 To 209 :                                           'Rot 100 Grün 100
128
R = 255
129
G = 255
130
B = 0
131
Case 210 To 309 :                                           'Rot 100 Grün 100 Blau 125
132
R = 255
133
G = 255
134
B = 125
135
Case 310 To 409:                                            'Rot 100 Grün 100 Blau 100
136
R = 255
137
G = 255
138
B = 255
139
Case 410 To 509:                                            'Rot 50 Grün 100 Blau  100
140
R = 125
141
G = 255
142
B = 255
143
144
Case 510 To 609:                                            'Rot 0 Grün 100 Blau 100
145
R = 0
146
G = 255
147
B = 255
148
149
Case 610 To 709:                                            'Rot 0 Grün 50 Blau 100
150
R = 0
151
G = 125
152
B = 255
153
154
Case 710 To 809:                                            'Rot 0 Grün 0 Blau 100
155
R = 0
156
G = 0
157
B = 255
158
159
Case 810 To 909:
160
R = 168
161
G = 128
162
B = 128
163
164
Case 910 To 1023:
165
R = 0
166
G = 0
167
B = 0
168
169
End Select
170
171
172
Return

von MWS (Gast)


Lesenswert?

Bastler,

nenn' mal die Bascom-Version, die Du verwendest.

von Bastler (Gast)


Lesenswert?

Ich  benutze Bascom 1.11.9.8 Demo Version

von Weingut P. (weinbauer)


Lesenswert?

Leute ... das ganze Gerümpel in eine ISR zu packen ist nix und bleibt 
nix, sow wie modellierter Mist eben Mist bleibt, nur schöner ...

fangt nochmal von vorne an, erst die Timers configurieren, dann den ADC,
dann Tastenabfrage, dann eine Mainloop bauen mit nem Flag und die
Subroutinen die je nach Schalterstellung angesprungen werden.

Schritt für Schritt ...

von Bastler (Gast)


Lesenswert?

Habe ich auch schon überlegt, daß es so nicht wird.

Interresant finde ich was wirklich in meiner Lösung ( Schalter löst 
interrupt aus ) wirklich schlecht ist ?

Was macht wirklich einen Sinn "millionen mal " im Code hin un her zu 
springen ?

von Weingut P. (weinbauer)


Lesenswert?

ja, macht es, wenn Du z.B. den Schalter auf nem Interrupt lässt und nen 
Timer für Timings verwendest, die auch wieder interrupt basieren, dann 
sperrt der Taster-Int den Timer-Int und umgekehrt. Wenn das programm nun 
endlos in einem Int hängt gehen keine anderen mehr.
Außerdem kann es noch Probleme mit Highlevelbefehlen von Bascom geben, 
hab da vor langer Zeit mal die Beobachtung gemacht, da das Subroutinen 
sind die aus dem Int angesprungen werden und wieder zurück in die 
Interruptroutine. Keine Ahnung ob die Probleme mittlerweile behoben 
sind, aber in früheren Versionen konnte es passieren, dass in der 
Interruptroutine die Ints wieder aktiviert wurden, wodurch ein Int im 
Int  im Int usw. usw. ausgelöst werden konnte ... gabe sehr merkwürdige 
Programmabläufe ... wie gesagt, kann, muss nicht und möglicherweise auch 
schon gefixt.
Das hin und her springen ist dem Controller wurst, kost keinen Cent 
extra, gibt aber sauberen Code.

von MWS (Gast)


Lesenswert?

Fhutdhb Ufzjjuz schrieb:
> Leute ... das ganze Gerümpel in eine ISR zu packen ist nix und bleibt
> nix, sow wie modellierter Mist eben Mist bleibt, nur schöner ...

'Ne Schönheit find' ich den Code auch nicht. Dennoch spricht nix 
dagegen, daß es funktioniert. Obwohl die ISR etwas "länglich" aussieht, 
so benötigt sie nicht mehr als 500 Takte, bei einer Aufrufrate der ISR 
von 976/s sind das gerade mal 3% der verfügbaren Rechenleistung.

Es ist auch unwichtig, ob die ISR optisch lang aussieht, wesentlich sind 
die Schritte, in der sie durch ist. Vor allem ob sie glatt durchläuft, 
ob irgendwelche Loops drin sind oder sonstwas blockierend wirkt, wie 
z.B. GetADC(), das auf das Ende der Wandlung wartet. Ist aber hier alles 
nicht der Fall.

Was in den beiden letzten Codes nicht passt, ist Config Lcdbus = 4, das 
hat dort nix zu suchen.

Mal den nachfolgenden, modifizierter Code von Jonathan ausprobieren, da 
ist die ADC-Geschichte anders gelöst.
1
'*******************************************************************************
2
' Schalter an PD.1    High = "Mood-Modus"    Low = "Beleuchtungs-Modus"
3
' 10k-Poti an PC.0
4
' LED Rot  an PB.1
5
' LED Grün an PB.2
6
' LED Blau an PB.3
7
'*******************************************************************************
8
9
$regfile = "m8def.dat"
10
$crystal = 16000000
11
$hwstack = 100
12
$swstack = 100
13
$framesize = 100
14
$sim
15
16
'Taster Modus
17
Config Pind.1 = Input
18
Portd.1 = 1
19
Modus Alias Pind.1
20
21
Config Portb.1 = Output                                     'LED Rot
22
Portb.1 = 1
23
'Waitms 1000
24
Config Portb.2 = Output                                     'LED Gruen
25
Config Portb.3 = Output                                     'LED Blau
26
27
Config Timer0 = Timer , Prescale = 64
28
Start Timer0
29
On Timer0 Timer0_isr
30
Enable Timer0
31
Enable Interrupts
32
33
34
Config Timer1 = Pwm , Pwm = 8 , Compare A = Clear , Compare B = Clear , Prescale = 64
35
Config Timer2 = Pwm , Compare = Clear , Prescale = 64
36
Start Timer1
37
Start Timer2
38
39
40
Config Adc = Single , Prescaler = Auto , Reference = Avcc
41
Start Adc
42
Dim DummyVal As Word
43
DummyVal = GetADC(0)                                        ' ADMUX setzen
44
45
Dim Anzeige As String * 16
46
Dim Geschwindigkeit As Word
47
Dim Adc0 As Word
48
Dim Fadingschritt As Byte
49
Dim Swprescaler As Word
50
Dim R_fading As Byte
51
Dim G_fading As Byte
52
Dim B_fading As Byte
53
54
R Alias Compare1a
55
G Alias Compare1b
56
B Alias Compare2
57
58
Config Lcdpin = Pin , Db7 = Portb.0 , Db6 = Portd.7 , Db5 = Portd.6 , Db4 = Portd.5 , E = Portc.4 , Rs = Portc.5
59
Config Lcd = 16 * 2
60
61
Cls
62
Cursor Off
63
64
65
Do
66
67
'LCD Ausgabe
68
69
Loop
70
71
Timer0_isr:
72
73
  Geschwindigkeit = ADC : ADCSRA.ADSC = 1
74
75
  'Nur alle <Geschwindigkeit> Timerinterrupts deine Fading-Routine ausführen
76
  Incr Swprescaler
77
  If Modus = 1 Then
78
    If Swprescaler > Geschwindigkeit Then
79
      Swprescaler = 0
80
      If Fadingschritt = 0 Then
81
        Incr R_fading
82
        If R_fading = 255 Then Incr Fadingschritt
83
84
      Elseif Fadingschritt = 1 Then
85
        Incr G_fading
86
        If G_fading = 255 Then Incr Fadingschritt
87
88
      Elseif Fadingschritt = 2 Then
89
        Incr B_fading
90
        If B_fading = 255 Then Incr Fadingschritt
91
92
      Elseif Fadingschritt = 3 Then
93
        Decr R_fading
94
        If R_fading = 0 Then Incr Fadingschritt
95
96
      Elseif Fadingschritt = 4 Then
97
        Decr G_fading
98
        If G_fading = 0 Then Incr Fadingschritt
99
100
      Elseif Fadingschritt = 5 Then
101
        Decr B_fading
102
        If B_fading = 0 Then Fadingschritt = 0
103
      End If
104
105
      R = R_fading
106
      G = G_fading
107
      B = B_fading
108
    End If
109
  Else
110
    Gosub Beleuchtung
111
  End If
112
Return
113
114
115
Beleuchtung:
116
117
Adc0 = ADC
118
119
Select Case Adc0
120
121
122
Case 1 To 59 :                                              'Rot 100
123
R = 255
124
G = 0
125
B = 0
126
Case 60 To 109 :                                            'Rot 100 Grün 50
127
R = 255
128
G = 125
129
B = 0
130
Case 110 To 209 :                                           'Rot 100 Grün 100
131
R = 255
132
G = 255
133
B = 0
134
Case 210 To 309 :                                           'Rot 100 Grün 100 Blau 125
135
R = 255
136
G = 255
137
B = 125
138
Case 310 To 409:                                            'Rot 100 Grün 100 Blau 100
139
R = 255
140
G = 255
141
B = 255
142
Case 410 To 509:                                            'Rot 50 Grün 100 Blau  100
143
R = 125
144
G = 255
145
B = 255
146
147
Case 510 To 609:                                            'Rot 0 Grün 100 Blau 100
148
R = 0
149
G = 255
150
B = 255
151
152
Case 610 To 709:                                            'Rot 0 Grün 50 Blau 100
153
R = 0
154
G = 125
155
B = 255
156
157
Case 710 To 809:                                            'Rot 0 Grün 0 Blau 100
158
R = 0
159
G = 0
160
B = 255
161
162
Case 810 To 909:
163
R = 168
164
G = 128
165
B = 128
166
167
Case 910 To 1023:
168
R = 0
169
G = 0
170
B = 0
171
172
End Select
173
174
175
Return

Fhutdhb Ufzjjuz schrieb:
> Keine Ahnung ob die Probleme mittlerweile behoben
> sind, aber in früheren Versionen konnte es passieren, dass in der
> Interruptroutine die Ints wieder aktiviert wurden, wodurch ein Int im
> Int  im Int usw. usw. ausgelöst werden konnte ...

Das fällt jetzt unter Mythen und Märchen.

von Weingut P. (weinbauer)


Lesenswert?

> Fhutdhb Ufzjjuz schrieb:
>> Keine Ahnung ob die Probleme mittlerweile behoben
>> sind, aber in früheren Versionen konnte es passieren, dass in der
>> Interruptroutine die Ints wieder aktiviert wurden, wodurch ein Int im
>> Int  im Int usw. usw. ausgelöst werden konnte ...
>
> Das fällt jetzt unter Mythen und Märchen.

Ich gäbe Dir Recht, hätte ich selbst derlei Effekte nicht schon 
beobachtet, leider, das Suchen des Fehler gestaltete sich auch äußerst 
mühsam und erst die Begutachtung des Hex im AVR-Studio lieferte damals, 
wie gesagt schon ne Weile her, Aufschluss.

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.