Bauplan Schaltplan LED Dimmer mit Soft On / Off
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 LED's mittels Pulsweitenmodulation dimmen kann. Gleichzeitig wurde eine SoftON/Off Funktion implementiert, um ein für das Auge angenehmes sanftes Ein/Ausschaltverhalten zu erzielen. 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.

Das ASM-File zum Download gibts hier, fertig programmierte Controller auf Anfrage.

Das Programm selbst ist recht einfach, aber es verwendet eine Reihe von Techniken, welche auch in grösseren Projekten benötigt werden, z.B.

Lesen und Schreiben des EEPROMs

Timer-Interrupt

Software-Counter

In der Hauptroutine des Programms wird lediglich das PWM Signal erzeugt. Über den Timer Interrupt wird der Taster abgefragt und je nach Taster-Status die Helligkeit geändert bzw. der Dimmer ein / ausgeschaltet.

Dabei sind folgende Funktionen impementiert:

Taster kurz drücken (Als Eingang für einen Taster dient PB0,die LED's werden an PB1 und PB2 angeschlossen)

Die LED's werden EIN bzw. AUS geschaltet.

wurde vorher die Helligkeit geändert, wird der neue Wert dauerhaft abgespeichert.

Taster lange drücken:

Die Helligkeit ändert sich langsam von 0 auf 100% und zurück. ist die gewünschte Helligkeit erreicht, Taster wieder loslassen. Die Helligkeit ändert sich dabei nicht linear, sondern in mehreren Geschwindigkeiten, um der logarithmischen Empfindlichkeit des Auges gerecht zu werden.

Taster während dem RESET gedrückt halten:

Damit kann festgelegt werden, ob die LED's nach einem Reset an oder aus sind.

Das Programm wurde mit AVR Studio 4.10 erstellt.

Beim Programmieren bitte den OSCCAL-Wert in die EEPROM-Zelle $3f speichern!

;;Dimmer Soft ON/OFF

;(c) 2004 Markus Vohburger

;Gewerbliche Nutzung untersagt!


;Definitionen für Tiny12 Laden

.include "tn12def.inc"



.def temp1 = r16

.def temp2 = r17

.def output = r18

.def swcount0 = r19

.def output = r20

.def pwmcount = r21

.def swcount1 = r22

.def conbuf = r23

.def direction = r25

.def control=r26

.def pwmvalue = r27

.def dirty = r28

.def onoff = r29

.EQU EE_OSCCAL = $3f;




;reset handler

.org $0000

rjmp main


;timer overflow interrut handler

.org OVF0Addr

rjmp OVF0Handler

.org $0010

main:

;stack setup



;read osccal byte

ldi temp1,EE_OSCCAL

rcall readeeprom

out osccal,temp1




;port setup

;port b input with pullups

ldi temp1,$01e

out ddrb,temp1


;port b output off, pullups on

ldi temp1,$1f

out portb,temp1

ldi temp1,$1e

out ddrb,temp1

;Einstellungen aus EEProm laden

ldi temp1,$00

rcall readsettings

mov conbuf,temp1




ldi direction,$00

ldi dirty,$00

ldi temp1,$01

rcall readeeprom

mov onoff,temp1

andi onoff,$01


;Dimmer An/Aus nach Reset umschalten, wenn Taste gedrückt

sbic pinb,0

rjmp notoggle

ldi temp1,$01

eor onoff,temp1

;ins EEProm schreiben

waittoggle:

sbic eecr,eewe

rjmp waittoggle

out eedr,onoff

sbi eecr,eemwe

sbi eecr,eewe

notoggle:




;

;Timer zurücksetzen

ldi temp1,$00

out tcnt0,temp1


;Timer interrupts an

ldi temp1,(1<<toie0)

out timsk,temp1


;Timer starten

ldi temp1,$03

out tccr0,temp1


ldi swcount0, $00

ldi swcount1,$00

ldi pwmcount,$00

ldi pwmvalue,$00


sei


;Hauptprogrammschleife, macht nur PWM

loop:

;leds aus

ldi output,$1f


cp pwmcount,pwmvalue

brsh writeoutput

;leds an

ldi output,$01

writeoutput:

out portb,output

inc pwmcount

rjmp loop





;Timer Interrupt Handler

OVF0Handler:

;Status sichern

in r1,sreg

;SoftON bzw. Off abhandeln

mov control,conbuf

cpi onoff,$01

breq nooff

ldi control,$00

nooff:

cp pwmvalue,control

breq endcontrol

brlo doinc

dec pwmvalue

rjmp endcontrol

doinc:

inc pwmvalue



;wenn taster gedrückt, dann pressedhandler

endcontrol:

sbis pinb,0

rjmp pressedhandler

;war taster zu kurz gedrückt?

cpi swcount0,$02

brlo exitreleasehandler

;helligkeit wurde geändert

cpi swcount0,$1f

brsh exitreleasehandler


;turn on / Off

;und einstellungen abspeichern

ldi temp1,$01

eor onoff,temp1

rcall writesettings

rjmp exitreleasehandler



exitreleasehandler:

ldi swcount0,$00

exit_ovf0Handler:

out sreg,r1

reti

;zähler nur bis zum maximum erhöhen

pressedhandler:

cpi swcount0,$20

brsh noinc

inc swcount0

noinc:

cpi swcount0,$20

brlo exit_ovf0handler


inc swcount1

cpi swcount1,$08

brne exit_ovf0handler

clr swcount1


rcall updown

rjmp exit_ovf0handler



;Änderungsgeschwindigkeit je nach Helligkeit anpassen

updown:

mov pwmvalue,conbuf

;merken, dass sich was geändert hat

ldi dirty,$ff

;heller oder dunkler werden ?

sbrs direction,0

rjmp uphandler

ldi temp1,$01

cpi conbuf,$f0

brsh more1

ldi temp1,$02

cpi conbuf,$e8

brsh more1

ldi temp1,$08

more1:

clc

sub conbuf,temp1

brcc exitsub

ldi conbuf,$00

cbr direction,1

rjmp exitsub


uphandler:

ldi temp1,$01

cpi conbuf,$f0

brsh more2

ldi temp1,$02

cpi conbuf,$e8

brsh more2

ldi temp1,$08


more2:

clc

add conbuf,temp1

brcc exitsub

ldi conbuf,$ff

sbr direction,1

exitsub:

ret

;die aktuelle helligkeit aus EEprom lesen

readsettings:

ldi temp1,$00

rcall readeeprom

mov conbuf,temp1

ret


writesettings:

;eeprom-Schonen!

;nur schreiben, wenn sich was geändert hat

..

..

..

Den Vollständigen Quellcode gibts hier zum Download,

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. 1211887