Den vollständigen Quellcode (für Tiny12/15 oder Tiny13) gibts auf Anfrage.
Mit der RGB-Dimmer-Software sind folgende Funktionen möglich
1 . Drücken Sie den Taster einmal kurz, um die LED’s EIN oder AUS zu schalten.
2. Um eine LED zum Dimmen auszuwählen, drücken Sie den Taster ca 1 Sekunde lang und lassen ihn dann los. Die gewählte LED leuchtet kurz mit maximaler Helligkeit, während die beiden anderen dunkel geschaltet werden. So können Sie die ausgewählte LED leicht identifizieren.
3. Um die Helligkeit der ausgewählten LED zu ändern, halten Sie den Taster dauerhaft gedrückt. Die Helligkeit ändert sich nun langsam Auf und Absteigend zwischen 0% und 100%. Lassen sie den Taster los, sobald die gewünschte Helligkeit erreicht ist.
Wechseln sie nun die LEDs wie unter Punkt 2 beschrieben und stellen für jede LED die Helligkeit entsprechend Ihren Wünschen ein. Dadurch können Sie eine vielzahl von Mischfarben erzeugen.
4. Um die Helligkeitseinstellungen der 3 LED’s dauerhaft abzuspeichern, schalten Sie die LED’s kurz aus und wieder ein, wie unter Punkt 1 beschrieben.
5. Die LED’s können nach dem Anlegen der Betriebsspannung entweder eingeschaltet oder ausgeschaltet sein. Um diesen Zustand umzuschalten, halten Sie den Taster gedrückt, während Sie die Betriebsspannung anlegen.
Alle Funktionen des Modules können über einen einzigen Taster gesteuert werden (PB3/PB4)
;RGB Dimmer Software
;(c) 2004 Markus Vohburger ;Gewerbliche Nutzung untersagt. .include "tn12def.inc"
.def omod = r29
.def temp1 = r16
.def temp2 = r17
.def output = r18
.def swcount0 = r19
.def output = r20
.def pwmcount = r21
.def pwmvalue_red = r22
.def pwmvalue_green = r23
.def pwmvalue_blue = r24
.def direction = r25
.def colorselect = r26
.def pwmvalue = r27
.def dirty = r28
.equ EE_OSCCAL=$3f
.equ EE_PWM_RED=$00
.equ EE_PWM_GREEN=$01
.equ EE_PWM_BLUE=$02
.equ EE_OMOD=$03
.equ timer_value = $80
;reset handler
.org $0000
rjmp main
;timer overflow interrut handler
.org OVF0Addr
rjmp OVF0Handler
.org $0010
main:
;stack setup
;read osccal byte
waitstableosccal:
sbic eecr,eewe
rjmp waitstableosccal
ldi temp1,EE_OSCCAL
out eear,temp1
sbi eecr,eere
in temp1,eedr
out osccal,temp1
;port setup
;port b input with pullups
ldi temp1,$00
out ddrb,temp1
;port b output off, pullups on
ldi temp1,$18
out portb,temp1
setstatus:
sbic eecr,eewe
rjmp setstatus
ldi temp1,EE_OMOD
out eear,temp1
sbi eecr,eere
in temp1,eedr
;Toggle Power On Mode, only onboard-Pushbutton
sbic pinb,3
rjmp notoggle
toggle:
inc temp1
;aktuellen wert lesen
;und sicherstellen, dass er gültig ist
;neuen status schreiben
writeok:
sbic eecr,eewe
rjmp writeok
ldi temp2,EE_OMOD
out eear,temp2
out eedr,temp1
sbi eecr,eemwe
sbi eecr,eewe
notoggle:
sbis pinb,pb3
rjmp notoggle
sbis pinb,pb4
rjmp notoggle
ldi omod,$00
sbrs temp1,1
ldi omod,$07
ldi temp2,$00
sbrs temp1,0
ldi temp2,$07
ldi temp1,$1f
eor temp1,omod
out portb,temp1
out ddrb,temp2
;Timer zurücksetzen
ldi temp1,timer_value
out tcnt0,temp1
;Timer interrupts an
ldi temp1,(1
<<toie0) out timsk,temp1
;Timer starten
ldi temp1,$04
out tccr0,temp1
ldi swcount0, $00
ldi pwmcount,$00
rcall readsettings
ldi colorselect,$00
ldi direction,$00
ldi dirty,$00
sei
loop:
;leds aus
ldi output,$1f
cp pwmvalue_red,pwmcount
brsh check_green
;leds an
cbr output,$01
check_green:
cp pwmvalue_green,pwmcount
brsh check_blue
;leds an
cbr output,$02
check_blue:
cp pwmvalue_blue,pwmcount
brsh writeoutput
;leds an
cbr output,$04
writeoutput:
eor output,omod
out portb,output
inc pwmcount
sbic ddrb,0
rjmp loop
;wenn LED's aus sein sollen, dann auch die Pullups abschalten
ldi output,$18
out portb,output
; warten, bis über Tastendruck die Pullups wieder angeschaltet werden.
waiton:
sbic ddrb,0
rjmp loop
rjmp waiton
OVF0Handler:
in r1,sreg
sbis pinb,4
rjmp pressedhandler
sbis pinb,3
rjmp pressedhandler
cpi swcount0,$02
brlo exitreleasehandler
cpi swcount0,$1f
brsh exitreleasehandler
cpi swcount0,$08
brsh setcolor
;turn on / Off
in temp1,ddrb
ldi temp2,$07
eor temp1,temp2
out ddrb,temp1
rcall writesettings
rjmp exitreleasehandler
setcolor:
;turn on
ldi temp1,$07
out ddrb,temp1
inc colorselect
cpi colorselect,$03
brne showcolor
ldi colorselect,$00
showcolor:
ldi temp1,$1e
cpi colorselect,$00
breq writecolor
ldi temp1,$1d
cpi colorselect,$01
breq writecolor
ldi temp1,$1b
writecolor:
eor temp1,omod
out portb,temp1
ldi temp2,$00
delay:
dec temp1
nop
nop
nop
brne delay
dec temp2
brne delay
exitreleasehandler:
ldi swcount0,$00
exit_ovf0Handler:
out sreg,r1
reti ..... Vollständigen Quellcode auf Anfrage. |
Ursprünglich wurde diese Software auf einem Atmel Tiny12 entwickelt, inzwischen gibt es natürlich wesentlich leistungsfähigere Tiny Controller von Atmel. Insbesondere die höhere Taktfrequenz ermöglicht eine schnellere Pulsweitenmodulation, somit wird die PWM praktisch ohne sichtbares Flackern erzeugt. Auch gibt es inzwischen Atmel Controller im sehr kleinen 6 polien SOT Gehäuse, damit lässt sich die Schaltung extrem miniaturisiert aufbauen, was zusätzlich noch weitere Einsatzgebiete erschliesst.