RGB Quelltext mit Software PWM

Fragen zu Schaltungen, Elektronik, Elektrik usw.

Moderator: T.Hoffmann

Antworten
Benutzeravatar
Timm
Mega-User
Mega-User
Beiträge: 387
Registriert: So, 25.06.06, 18:53

So, 03.06.07, 16:24

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. :wink:

Falls das ohne Quarz nicht möglich ist dann bitte ich um ein Bild der Fusebits in Ponyprog sodass der externe Quarz aktiviert ist.
Benutzeravatar
Fightclub
Post-Hero
Post-Hero
Beiträge: 5114
Registriert: Mi, 01.03.06, 18:40

So, 03.06.07, 16:26

schau mal im Tutorial-Bereich, da hat synvox einen sehr guten Hardware-PWM-RGB-Modulator gepostet. Läuft allerdings auf einem ATMEGA168, aber sollte machbar sein ;)
Benutzeravatar
Timm
Mega-User
Mega-User
Beiträge: 387
Registriert: So, 25.06.06, 18:53

So, 03.06.07, 17:30

Wie gesagt sollte Software PWM sein und bei dem Code blick ich nicht ganz durch :cry: bin ja noch anfänger in Bascom.
Benutzeravatar
dedicated
Mega-User
Mega-User
Beiträge: 141
Registriert: Do, 04.01.07, 14:18

So, 03.06.07, 19:20

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
synvox
Mega-User
Mega-User
Beiträge: 147
Registriert: Fr, 27.04.07, 04:40
Wohnort: Schweiz

Mo, 04.06.07, 12:00

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? :roll:

Gruss
Neni
synvox
Mega-User
Mega-User
Beiträge: 147
Registriert: Fr, 27.04.07, 04:40
Wohnort: Schweiz

Mo, 04.06.07, 15:13

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:

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
Gruss
Neni
Benutzeravatar
Timm
Mega-User
Mega-User
Beiträge: 387
Registriert: So, 25.06.06, 18:53

Mo, 04.06.07, 15:59

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
Antworten