Bauplan Schaltplan RGB Dimmer
LED's sind gerade auf breiter Front dabei, sich für Beleuchtungszwecke zu etablieren. Meistens werden die LED's dabei jedoch nur einfach ein oder ausgeschaltet. Im folgenden Projekt wird eine Software für den Atmel Tiny12 Controller vorgestellt, welche 3 LED's getrennt mittels Pulsweitenmodulation dimmen kann. Aufgebaut mit z.B. dieser Schaltung, erhält man eine winzige Platine, die sich leicht in eine Vielzahl von Anwendungen zur Beleuchtung integrieren lässt.

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.

Bauteile für dieses Projekt - Anzeigen:
Aktive Bauelemente

Passive Bauelemente


Weitere Informationen,Grundlagen,Bauanleitung,Schaltplan, Links zum Thema
Anzeigen:

Neueste Artikel
Anzeigen:
Aktuelle Newsbeiträge
Sie sind Besucher Nr. 1212571