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
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
> 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?
@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
Habs grad umgeschrieben auf $crystal = 16000000 Also 16MHz Und es brachte NÜSCHT
> 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?
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
offtopic:
>Da sind außerdem noch mehr Fehler
... als Zuverlässig gilt eine Software die beim Berieb keine
Katastrophen
auslöst. (ISO 9126) ;) Z8
Peter Dannegger schrieb:
> An Deiner Hardware und mit den Fusebits.
Und wie mach ich das?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.