Hi,
ich benötige mal eure Hilfe ich bin gerade dabei eine Hintergrundbeleuchtung für mein TFT zu bauen das alles mit rot,blau und grünen Leds.
Jetzt brauch ich nur noch einen guten PWM Code sodass es alle Farben langsam durchwechselt. Am besten wäre ein Software PWM und das der Übergang der Farben auch ohne Quarz nicht zu sehr ruckelt. Ich benutze ein Attiny2313. Hoffe mir kann jemand helfen.
Falls das ohne Quarz nicht möglich ist dann bitte ich um ein Bild der Fusebits in Ponyprog sodass der externe Quarz aktiviert ist.
RGB Quelltext mit Software PWM
Moderator: T.Hoffmann
Online Tool für die Fusebits
SoftwarePWM-Beispiel von Pehu
Musst dann die Zeile $regfile = "m8def.dat" ändern und an deine Prozessortyp anpassen.
Und vielleicht ein paar Pinbelegungen ändern.
mFg Martin
SoftwarePWM-Beispiel von Pehu
Musst dann die Zeile $regfile = "m8def.dat" ändern und an deine Prozessortyp anpassen.
Und vielleicht ein paar Pinbelegungen ändern.
mFg Martin
Hallo Timm,
wieso willst du denn unbedingt Software-PWM verwenden?
Der ATtiny2313 hat 4! Hardware-PWM Ausgänge (OCR0A, OCR0B, OCR1A und OCR1B), also kannst du locker eine RGB-Kette damit steuern. Der Vorteil wären eindeutig die besseren Übergänge und kein Stottern bzw. Flackern. Ausserdem würdest du so auch eine Menge Code sparen, du musst ja praktisch die PWM-Werte nur in die richtigen Register schreiben, der Rest läuft automatisch. Du musst ja auch nicht unbedingt die ganze Hue-Saturation-Sache von mir übernehmen, du kannst auch direkt mit den R-, G- und B-Werten arbeiten.
Aber vielleicht hast du ja einen besonderen Grund, warum du Software-PWM verwenden willst?
Gruss
Neni
wieso willst du denn unbedingt Software-PWM verwenden?
Der ATtiny2313 hat 4! Hardware-PWM Ausgänge (OCR0A, OCR0B, OCR1A und OCR1B), also kannst du locker eine RGB-Kette damit steuern. Der Vorteil wären eindeutig die besseren Übergänge und kein Stottern bzw. Flackern. Ausserdem würdest du so auch eine Menge Code sparen, du musst ja praktisch die PWM-Werte nur in die richtigen Register schreiben, der Rest läuft automatisch. Du musst ja auch nicht unbedingt die ganze Hue-Saturation-Sache von mir übernehmen, du kannst auch direkt mit den R-, G- und B-Werten arbeiten.
Aber vielleicht hast du ja einen besonderen Grund, warum du Software-PWM verwenden willst?
Gruss
Neni
Ich habe hier mal schnell meinen RGB-Code für den ATtiny2313 angepasst. Also es wird mittels Hardware-PWM von 2kHz einfach ein Regenbogen-Verlaufs-Effekt erzeugt, welchen man mit einer Speed-taste in 8 Schritten (3 sek. bis 6.5 min.) in der Geschwindigkeit einstellen kann. Mit der Stop-Taste kann man die Farbe einfrieren bzw. wieder weiterlaufen lassen. Auch habe ich den pwm_mode_jumper mit übernommen, so dass man den PWM auf invertierend oder nicht-invertierend einstellen kann (siehe auch den Beitrag zum RGB Moodulator für weitere Erklärungen). Helligkeit und Sättigung und die EEPROM-Speicherung habe ich hier weggelassen. Der Code belegt 'bloss' 44% des ATtiny2313 Flashs, also etwas weniger als 1kB. Die Pinnummern der Anschlüsse (Tasten, Jumper und die drei PWM-Kanäle) sind im Kommentar angegeben. Ich habe hier auch noch eine spezielle Library von BASCOM verwendet (mcsbyteint.lbx), welche 'nur' Bit, Byte und Integer bzw. Word als Datentypen unterstützt, weil diese weniger Code-Overhead produziert:
Gruss
Neni
Code: Alles auswählen
$regfile = "attiny2313.dat"
$crystal = 8000000
$hwstack = 32
$swstack = 16
$framesize = 24
$lib "mcsbyteint.lbx"
'$sim
Red_pwm Alias Ocr0a 'Pin 14
Green_pwm Alias Ocr1al 'Pin 15
Blue_pwm Alias Ocr1bl 'Pin 16
Speed_button Alias Pind.2 'Pin 06
Stop_button Alias Pind.3 'Pin 07
Pwm_mode_jumper Alias Pind.6 'Pin 11
Config Debounce = 30
Dim Stepper As Word
Dim Speed As Byte
Dim Count As Byte
Dim Stopping As Bit
Dim Temp_b As Byte
Declare Sub Color_set(byval Curr_step As Word)
' Input/Output Ports initialization
' Port B initialization
' Func7=In Func6=In Func5=In Func4=Out Func3=Out Func2=Out Func1=In Func0=In
' State7=P State6=P State5=P State4=1 State3=1 State2=1 State1=P State0=P
Portb = &HFF
Ddrb = &H0E
' Port A initialization
' Func2=In Func1=In Func0=In
' State2=P State1=P State0=P
Porta = &HFF
Ddra = &H00
' Port D initialization
' Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
' State6=P State5=P State4=P State3=P State2=P State1=P State0=P
Portd = &HFF
Ddrd = &H00
' Selects PWM-Mode
If Pwm_mode_jumper = 0 Then
Temp_b = &HA1 'non-inverted mode
Else
Temp_b = &HF1 'inverted mode
End If
' Timer/Counter 0 initialization
' Clock source: System Clock
' Clock value: 1000.000 kHz -> PWM-Freq ca. 2000Hz
' Mode: Phase correct PWM top=FFh
Tccr0a = Temp_b
Tccr0b = &H02
Tcnt0 = &H00
Ocr0a = &H00
Ocr0b = &H00
' Timer/Counter 1 initialization
' Clock source: System Clock
' Clock value: 1000.000 kHz -> PWM-Freq ca. 2000Hz
' Mode: Ph. correct PWM top=00FFh
' Noise Canceler: Off
' Input Capture on Falling Edge
' Timer 1 Overflow Interrupt: Off
' Input Capture Interrupt: Off
' Compare A Match Interrupt: Off
' Compare B Match Interrupt: Off
Tccr1a = Temp_b
Tccr1b = &H02
Tcnt1h = &H00
Tcnt1l = &H00
Icr1h = &H00
Icr1l = &H00
Ocr1ah = &H00
Ocr1al = &H00
Ocr1bh = &H00
Ocr1bl = &H00
Stepper = 0
Count = 1
Speed = 1
Stopping = 0
Do
If Stopping = 0 And Count >= Speed Then
Call Color_set(stepper)
Incr Stepper
If Stepper > 1529 Then Stepper = 0
Count = 1
End If
If Stopping = 0 Then Incr Count
If Count > 128 Then Count = 1
Debounce Speed_button , 0 , Set_speed , Sub 'Speed button
Debounce Stop_button , 0 , Set_stop , Sub 'Stop/Start button
Waitms 2
Loop
Set_speed:
If Stopping = 0 Then
Count = 1
Rotate Speed , Left , 1
End If
Return
Set_stop:
Toggle Stopping
Return
Sub Color_set(byval Curr_step As Word)
If Curr_step < 255 Then
Temp_b = Curr_step
Red_pwm = 255
Green_pwm = Temp_b
Blue_pwm = 0
Elseif Curr_step < 510 Then
Temp_b = 510 - Curr_step
Red_pwm = Temp_b
Green_pwm = 255
Blue_pwm = 0
Elseif Curr_step < 765 Then
Temp_b = Curr_step - 510
Red_pwm = 0
Green_pwm = 255
Blue_pwm = Temp_b
Elseif Curr_step < 1020 Then
Temp_b = 1020 - Curr_step
Red_pwm = 0
Green_pwm = Temp_b
Blue_pwm = 255
Elseif Curr_step < 1275 Then
Temp_b = Curr_step - 1020
Red_pwm = Temp_b
Green_pwm = 0
Blue_pwm = 255
Else
Temp_b = 1530 - Curr_step
Red_pwm = 255
Green_pwm = 0
Blue_pwm = Temp_b
End If
End Sub
Neni
Also der Regenbogen soll einfach nur durchfaden aber ich hab jetzt festgestellt das das soweiso nicht funktioniert ich hab ein Programm geschireben mit 12 Programmen die mit einem Taster anwählbar sind und die sich solang wiederholen bis der Taster erneut gedrückt wird. Eines der Programme soll ein RGB-Fader Programm sein. Das problem der Speicher des 2313 ist einfach zu klein für alles