'********************************************************************* ' Software PWM einer RGB Led mit Poti Steuerung '********************************************************************* ' Fading aller Farben einer RGB Led mit common Anode (im Code aenderbar) ' auf ATtiny13 an Port PB0 PB1 PB2 durch Soft PWM, da der Tiny13 nur ' zwei Hardware PWM besitzt (OC0A und OC0B). ' Die RGB Led kann natürlich auch durch einzelne Leuchtdioden ersetzt werden. ' Bei mir steuern PB0 - 2 einen ULN2003, der drei 1 Watt Led/250ma befeuert. ' Durch Anschluss eines Potis an PB3 kann die Fading-Geschwindigkeit ' angepasst werden. Bei Vollausschlag des Potis, also ein AD-Wert größer . ' 1000 (eigentlich >= 1023), bleibt die momentane Farbe stehen. ' Die Referenzspannung des AD-Ports ist VCC. '********************************************************************* ' A. Hoppe 14.06.09 '********************************************************************* $regfile "attiny2313.dat" $crystal = 8000000 'divide clock by 8 Fuse = aus $hwstack = 8 $swstack = 10 $framesize = 10 Dim Rfreq As Integer , Gfreq As Integer , Bfreq As Integer Dim Zeit As Integer Dim Zeit2 As Integer Dim N As Integer 'Schleifenzaehler Dim Flimit As Integer 'Schleifen und Zeitzaehler-Begrenzer Dim Ad As Word 'Wert des AD-Poti-Ports Const Timerstartwert = 60 'Wert ab dem bis 256 gezählt, je hoeher, desto schneller laeuft der Interrupt Config Timer0 = Timer , Prescale = 1 'Prescale = beim wievieltem uC-Tick der Timer weiter bis 255 zählt Timer0 = Timerstartwert On Timer0 Ontimer0 'verzweige bei Timer0 überlauf zu SubRoutine Enable Timer0 Enable Interrupts Ledblau Alias Portb.4 'Alias fuer die RGB Ports setzen Ledrot Alias Portb.3 Ledgruen Alias Portb.2 Ledblau2 Alias Portb.1 'Alias fuer die RGB Ports setzen Ledrot2 Alias Portb.0 Ledgruen2 Alias Portd.6 Config Ledrot = Output 'LED Rot Config Ledgruen = Output 'LED Blau Config Ledblau = Output 'LED Gruen Config Ledrot2 = Output 'LED Rot Config Ledgruen2 = Output 'LED Blau Config Ledblau2 = Output Ledrot = 0 '0= an bei RGB-LED Common Anode (Port=Low leuchtet) Ledgruen = 0 'bei Common Kathode Wert auf eins und in der Ledblau = 0 'Timer Subroutine die Zustände umkehren Ledrot2 = 0 '0= an bei RGB-LED Common Anode (Port=Low leuchtet) Ledgruen2 = 0 'bei Common Kathode Wert auf eins und in der Ledblau2 = 0 Flimit = 300 'Schleifen und Zeitzaehler-Begrenzer Zeit = 0 'Vergleichszaehler für Pulsweite im Interrupt Rfreq = 0 'Intensitaet Variablen der Farben bis maximal Flimit Gfreq = 0 Bfreq = 0 Macro R2b 'Fading Rot zu Blau Bfreq = 0 Rfreq = Flimit For N = 1 To Flimit Decr Rfreq Incr Bfreq Gosub Lesead Next N Rfreq = 0 Bfreq = Flimit End Macro Macro B2g 'Fading Blau zu Gruen Gfreq = 0 Bfreq = Flimit For N = 1 To Flimit Decr Bfreq Incr Gfreq Gosub Lesead Next N Bfreq = 0 Gfreq = Flimit End Macro Macro G2r 'Fading Gruen zu Rot Rfreq = 0 Gfreq = Flimit For N = 1 To Flimit Decr Gfreq Incr Rfreq Gosub Lesead Next N Gfreq = 0 Rfreq = Flimit End Macro Macro Nurrot 'Warteschleife fuer Rot, da diese Farbe dunkler als B und G ist Rfreq = Flimit Bfreq = 0 Gfreq = 0 For N = 1 To 75 Gosub Lesead Next N End Macro Macro Nurblau 'Warteschleife fuer Blau beim Wechsel nach Gruen Rfreq = 0 Bfreq = Flimit Gfreq = 0 For N = 1 To 25 Gosub Lesead Next N End Macro Do 'Hauptschleife If Ad < 1000 Then ' R2b Nurblau 'Aufruf der Fading-Makros B2g G2r Nurrot End If Loop End Ontimer0: Incr Zeit 'Bei jedem Interruptueberlauf Zeit um 1 erhöhen If Zeit <= Rfreq Then Ledrot2 = 1 Else Ledrot2 = 0 'Wenn Zeit <= Pulsefrequenz der Farbe, dann LED an If Zeit <= Gfreq Then Ledgruen2 = 1 Else Ledgruen2 = 0 'Bei Common Anode Led AN = 0 If Zeit <= Bfreq Then Ledblau2 = 1 Else Ledblau2 = 0 'Bei Common Kathode Led AN = 1 If Zeit <= Rfreq Then Ledrot = 1 Else Ledrot = 0 'Wenn Zeit <= Pulsefrequenz der Farbe, dann LED an If Zeit <= Gfreq Then Ledgruen = 1 Else Ledgruen = 0 'Bei Common Anode Led AN = 0 If Zeit <= Bfreq Then Ledblau = 1 Else Ledblau = 0 If Zeit >= Flimit Then Zeit = 0 'Zeitzaehler bei erreichen von Flimit zurücksetzen Timer0 = Timerstartwert Return Lesead: 'kommentieren und einen festen Wert fuer Ad eintragen Ad = 3 Waitms Ad Return