Forum: Mikrocontroller und Digitale Elektronik LED's flakern bei erster µC Schaltung


von Thomas B. (djtommyb)


Lesenswert?

Hi!

Hab mich gestern mal an meine erste µC Schaltung gemacht. Die besteht 
aus:

12 x LED blau
12 x LED grün
12 x LED rot

als RGB Cluster verlschaltet

Zur Steuerung verwende ich nen Atmega 8-16PU.

Nun zum Problem:

Habe nen Fader programmiert, der eben alle Farben durchfadet (hat aber 
auch andere Funktionen). Beim faden der LED's fällt mir auf, dass die 
LED's flakern anfangen.
Wieso das?


Programmiert wurde in Bascom, hier mal das Programm:

$regfile = "m8def.dat"
$crystal = 100000


Config Timer0 = Timer , Prescale = 64
On Ovf0 Fade
Enable Timer0

Config Int0 = Rising
On Int0 Level_change
Enable Int0

Enable Interrupts


Config Pinb.3 = Output
Config Pinb.4 = Output
Config Pinb.5 = Output

Led_red Alias Portb.3
Led_blue Alias Portb.4
Led_green Alias Portb.5

Dim Z_red As Byte
Dim L_red As Byte
Dim Z_green As Byte
Dim L_green As Byte
Dim Z_blue As Byte
Dim L_blue As Byte
Dim Rgb As Byte
Dim Modus As Byte

L_red = 0
L_green = 0
L_blue = 0



Do
If Modus = 0 Then
   L_red = 255
   L_green = 255
   L_blue = 255
End If
If Modus = 2 Then
   L_red = 0
   L_green = 255
   L_blue = 255
End If
If Modus = 3 Then
   L_red = 255
   L_green = 0
   L_blue = 255
End If
If Modus = 4 Then
   L_red = 255
   L_green = 255
   L_blue = 0
End If
If Modus = 5 Then
   L_red = 0
   L_green = 0
   L_blue = 0
End If

If Z_red > L_red Then Led_red = 1 Else Led_red = 0
Z_red = Z_red - 1


If Z_green > L_green Then Led_green = 1 Else Led_green = 0
Z_green = Z_green - 1


If Z_blue > L_blue Then Led_blue = 1 Else Led_blue = 0
Z_blue = Z_blue - 1



Loop

End

Fade:
If Modus = 1 Then
   If Rgb = 0 Then
      If L_red > 0 Then
         L_red = L_red - 1
      End If
      If L_blue < 255 Then
         L_blue = L_blue + 1
      End If
      If L_red = 0 And L_blue = 255 Then
         Rgb = 1
      End If
   End If
   If Rgb = 1 Then
      If L_green > 0 Then
         L_red = L_red + 1
         L_green = L_green - 1
      End If
      If L_red = 255 And L_green = 0 Then
         Rgb = 2
      End If
   End If
   If Rgb = 2 Then
      If L_blue > 0 Then
         L_green = L_green + 1
         L_blue = L_blue - 1
      End If
      If L_green = 255 And L_blue = 0 Then
         Rgb = 0
      End If
   End If
End If
Return

Level_change:
Rgb = 0
If Modus < 5 Then
   Modus = Modus + 1
Else
   Modus = 0
End If

Return




Um das Ganze zu visualisiern gibts n kleines Vid:
http://www.youtube.com/watch?v=R3lKg6HOt-s


Bitte um kleine Hilfe, was ich da falsch gemacht habe.

mfg
Tommy

von Peter D. (peda)


Lesenswert?

Ich sehe da nirgends den Timerinterrupt für die SW-PWM.
Ohne Interrupt wird das nix.

PWM oder Multiplexen in der Main-Loop muß flackern.

Auch ist 100kHz arg wenig, mindestens 8, besser 16MHz.


Peter

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

> Dim Z_red As Byte
> Dim L_red As Byte
> :
> if (Z_red > L_red)
Ohne das Programm genauer analysiert zu haben:
Was passiert hier wohl, wenn L_red mal 255 wird?

von Thomas B. (djtommyb)


Lesenswert?

@Peter:
Timer Interrupt ist doch unterm Config vom Timer:
On Ovf0 Fade

Sind das wirklich "nur" 100kHz? Dachte das wären 1MHz... wie stell ich 
das auf 16MHz um?

einfach

$crystal = 16000000

?

@lothar:
das Programm funktioniert ansonsten einwandfrei, Code stimmt also.

Mfg
Tommy

von Thomas B. (djtommyb)


Lesenswert?

Habs grad umgeschrieben auf

$crystal = 16000000
Also 16MHz

Und es brachte NÜSCHT

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

> Code stimmt also.
Schon klar, mein Programm hat auch keinen Fehler... ;-)

Hast du schon eine Antwort auf die Frage:
>> Was passiert hier wohl, wenn L_red mal 255 wird?

von Peter D. (peda)


Lesenswert?

Thomas Berg schrieb:
> @Peter:
> Timer Interrupt ist doch unterm Config vom Timer:
> On Ovf0 Fade

Aber was Fade Deiner Meinung nach machen soll, steht nirgends.
Im Code von Fade ist keine PWM zu erkennen.
In der Main-Loop sieht es nach PWM aus und das ist Schrott.
Du mußt Deine Programme kommentieren, sonst weiß keiner, wie es 
funktioniert und Du nach ein paar Monaten auch nicht mehr.


> Sind das wirklich "nur" 100kHz? Dachte das wären 1MHz... wie stell ich
> das auf 16MHz um?

An Deiner Hardware und mit den Fusebits.

> $crystal = 16000000

Damit sagst Du nur dem Compiler, auf was Du Deine Hardware eingestellt 
hast.
Er kennt ja Deine Hardware nicht.


> @lothar:
> das Programm funktioniert ansonsten einwandfrei, Code stimmt also.

Prust.
Solange ein Fehler auftritt, kann kein Teil einer Software als 
fehlerfrei bezeichnet werden.

Da sind außerdem noch mehr Fehler (z.B. Entprellen).


Peter

von Z8 (Gast)


Lesenswert?

offtopic:

>Da sind außerdem noch mehr Fehler

... als Zuverlässig gilt eine Software die beim Berieb keine 
Katastrophen
auslöst. (ISO 9126) ;) Z8

von Thomas B. (djtommyb)


Lesenswert?

Peter Dannegger schrieb:
> An Deiner Hardware und mit den Fusebits.

Und wie mach ich das?

von Thomas B. (djtommyb)


Lesenswert?

Danke habs schon ;)

Es gibt ja doch ein Datenblatt das länger ist als 16 Seiten ^^

mfg
Tommy

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.