www.mikrocontroller.net

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


Autor: hardstyleroxx (Gast)
Datum:

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

Autor: Mike Köppl (helimike0705)
Datum:
Angehängte Dateien:

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

Autor: Mike Köppl (helimike0705)
Datum:

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

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.