mikrocontroller.net

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


Autor: Thomas Berg (djtommyb)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Thomas Berg (djtommyb)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Thomas Berg (djtommyb)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Habs grad umgeschrieben auf

$crystal = 16000000
Also 16MHz

Und es brachte NÜSCHT

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Z8 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Thomas Berg (djtommyb)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Peter Dannegger schrieb:
> An Deiner Hardware und mit den Fusebits.

Und wie mach ich das?

Autor: Thomas Berg (djtommyb)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke habs schon ;)

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

mfg
Tommy

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.