Forum: Mikrocontroller und Digitale Elektronik Wo liegt der Fehler? (LED Leiste PWM)


von hardstyleroxx (Gast)


Lesenswert?

Hallo,

ich bin gerade dabei mir eine LED leiste zu bauen. Die ansteuerung will 
ich mit einem ATmega/Tiny machen.

Es geht darum RGB Leds zu dimmen und somit viele Farben zu erzeugen.

Die PWM erzeugung funktioniert bei mir wunderbar. Es wird immer 
automatisch von Dunkel auf Hell gedimmt und umgekehrt.
Mein Problem liegt jetzt dadrin, das die LEDs nicht alle gleichzeitig an 
und ausgehen sollen, sondern nacheinander.

Ich habe mir überlegt, dass ich einfach immer ein Byte um 1 erhöhe wenn 
einmal von Hell auf Dunkel gefadet wurde. Wenn das byte 3 ist, dann wird 
es wieder auf 1 gesetzt.

Dann habe ich jeder Farbe einen Wert vom Byte zugeordnet.
Also kann z.B Rot erst angehen wenn Blau wieder aus ist. Grün kann dann 
erst angehen wenn Rot wieder aus ist usw.

Aber irgentwie will das Programm nicht so wie ich. Wäre nett wenn jemand 
mal einen Blick raufwerfen kann um mir zu sagen wo da mein Denkfehler 
liegt.



$regfile = "m8def.dat"
$crystal = 8000000                                          'Interner 
8mhz Quarz


'#####Ausgänge#####

Config Portb = Output

Rot Alias Portb.5                                           'Grüne LED 
an Portb.5
Blau Alias Portb.4                                          'Rote LED an 
Portb.4
Gruen Alias Portb.3                                         'Blaue LED 
an Portb.3



'#####Deklarationen#####

Dim Zurueck As Bit                                          'PWM 
rückwärts Bit
Dim Helligkeit As Byte 
'Helligkkeitswert
Dim Weiter As Byte                                          'Byte für 
die nächste LED

'###Hilfsbits und -bytes###

Dim Ro1 As Bit
Dim Bl1 As Bit
Dim Gr1 As Bit


'#####Timer#####

Enable Interrupts

Enable Timer0
On Timer0 Int_timer0
Config Timer0 = Timer , Prescale = 256


Enable Timer1
On Timer1 Int_timer1
Config Timer1 = Timer , Prescale = 8

Const Timervorgabe = 45536                                  'Vorgabewert 
von RNAVR Berechnet


'#####Grundstellung bei Anlage Ein#####

Weiter = 1
Helligkeit = 3
Zurueck = 0
Ro1 = 0
Bl1 = 0
Gr1 = 0

'#####Hauptschleife#####


Do

If Weiter = 1 Then
 Set Bl1
 Else
 Reset Bl1
End If

If Weiter = 2 Then
 Set Ro1
 Else
 Reset Ro1
End If

If Weiter = 3 Then
 Set Gr1
 Else
 Reset Gr1
End If




Loop

'#####Hauptschleife Ende#####





'#####Timer0 isr#####

Int_timer0:


'###Blau###


If Bl1 = 1 Then Toggle Blau

If Blau = 1 Then
 Timer0 = 256 - Helligkeit
Else
 Timer0 = Helligkeit
End If


'###Rot###

If Ro1 = 1 Then Toggle Rot

If Rot = 1 Then
 Timer0 = 256 - Helligkeit
Else
 Timer0 = Helligkeit
End If


'###Gruen###

If Gr1 = 1 Then Toggle Gruen

If Gruen = 1 Then
 Timer0 = 256 - Helligkeit
Else
 Timer0 = Helligkeit
End If


Return



'#####Timer1 isr#####

Int_timer1:

Timer1 = Timervorgabe 
'Timervorgabewert von RNAVR berechnet

If Weiter = 4 Then Weiter = 1

If Helligkeit = 3 Then
Reset Zurueck
Incr Weiter
End If

If Zurueck = 0 Then Incr Helligkeit

If Helligkeit = 255 Then Set Zurueck

If Zurueck = 1 Then Decr Helligkeit


Return

End

von Mike K. (helimike0705)


Angehängte Dateien:

Lesenswert?

habe es auch im roboter-net ein gestellt.
sehe selbst.hat mich 2 tage lernen gekostet,aber hat was gebracht.
mache ja mit bascom erst ein paar tage.ist bestimmt noch verbesserungs-
fähig aber läuft.

$regfile = "2313def.dat"
$crystal = 4000000

Config Portb = Output

'*************************************
Enable Interrupts

Enable Timer0
Config Timer0 = Timer , Prescale = 64
On Timer0 Ontimer0

Enable Timer1
Config Timer1 = Timer , Prescale = 1
On Timer1 Ontimer1
Const Timervorgabe = 45536

Dim Zurueck As Bit
Dim Helligkeit As Byte
Dim I As Byte

Helligkeit = 255
I = 0

'***************************************
Do

If I = 8 Then I = 0
 If Helligkeit = 2 Then
  Waitms 50
   Incr I
End If

Loop

'***************************************
Ontimer0:

Toggle Portb.i
 If Portb.i = 1 Then
  Timer0 = 255 - Helligkeit
   Else
    Timer0 = Helligkeit
     End If

Return

'***************************************
Ontimer1:
Timer1 = Timervorgabe
If Helligkeit = 255 Then
 Set Zurueck
  End If

If Helligkeit = 1 Then
 Reset Zurueck
  End If

If Zurueck = 0 Then
 Incr Helligkeit
  End If

If Zurueck = 1 Then
 Decr Helligkeit
  End If

Return

End

von Mike K. (helimike0705)


Lesenswert?

noch etwas, da du ja rgb-leds dimmen willst bzw das farbspektum
durchlaufen soll,dafür ist es nicht geeignet.aber so habe ich es
aus deinem eingestelltem prog herausgelesen (text und code).

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