Zwei kleine Fragen zu Bascom Do Loop Schleife

Gast #2294496
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
#2294512
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 :)
Gast #2294529
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
Gast #2294553
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 ?
Persönliche Seite #2294581
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
#2294588
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.
Persönliche Seite #2294592
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
Gast #2294594
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
Gast #2294629
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
#2294638
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
Gast #2294653
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
Gast #2294657
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.
Gast #2294663
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
#2294680
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.
Gast #2294689
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
#2294707
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?
Gast #2294709
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 !
Persönliche Seite #2294717
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
#2294730
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? :-)
Gast #2294732
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
#2294743
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
Gast #2294752
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...............
Persönliche Seite #2294784
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
#2294846
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.
Gast #2294867
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]
Gast #2294893
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
#2294894
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?
#2294897
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.
Gast #2294909
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
Persönliche Seite #2294910
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
Gast #2294912
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
#2294915
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.
Persönliche Seite #2294918
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
#2294921
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!
Gast #2294922
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
#2294925
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.
Gast #2294930
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 !!!!
Persönliche Seite #2294932
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
Persönliche Seite #2294942
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
Gast #2294945
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..
Gast #2294953
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
Gast #2294957
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 !!
#2294966
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!
Gast #2294970
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 !!
Persönliche Seite #2294989
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
Persönliche Seite #2295003
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
Gast #2295008
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]
Persönliche Seite #2295014
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.
Gast #2295018
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
Gast #2295049
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
Persönliche Seite #2295054
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
Gast #2295058
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
Gast #2295076
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 ?
Persönliche Seite #2295142
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
Gast #2295146
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...
Gast #2295360
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.
Gast #2295494
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
Gast #2295543
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
Gast #2295562
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...
Gast #2295579
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
#2295669
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.
Gast #2295670
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
Persönliche Seite #2295678
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
Gast #2295739
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.
Gast #2295773
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.
Gast #2295830
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.
Gast #2295965
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
#2296550
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 ...
Gast #2296600
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 ?
#2296625
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.
Gast #2296645
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.
#2297120
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren