TINY13 RGB Lampe
von Wolfram Herzog
Eine RGB-Lampe für das Lernpaket Mikrocontroller
Benötigte Bauteile:
1 RGB LED mit gemeinsamer Kathode
2 Widerstände 1 k
1 Widerstand 560 Ohm
Hardware:
Die RGB-LED mit gemeinsamer Kathode wird an die Ausgänge PB0, PB3 und PB4 angeschlossen. Um die RGB-LED im Experimentierboard zu nutzen, muss an den Anschluss der Blauen LED der Widerstand 560 Ohm angelötet werden, die anderen beiden LED werden über 1-k-Widerstand und die Steckfelder K1 und K2 verdrahtet.
Es wurde dann auf einer kleinen Lochrasterplatte eine separate Schaltung aufgebaut. Dazu wird der TINY13 in einer Fassung verbaut, die RGB-LED ist über 3 Widerstande mit dem TINY13 verbunden. BLAU und GRÜN mit einem 180 Ohm Widerstand, ROT mit 270 Ohm. Somit fließt durch jede Farbe in etwa der gleiche Strom von rund 12 mA - und die LED leuchtet sehr hell!
| Ganzen Artikel lesen... |  |
Die Stromversorgung erfolgt über einen kleinen 78L05 Regler und wird aus einer 9V-Blocbatterie oder dem Steckernetzteil eines alten Anrufbeantworters gespeist. Jetzt noch einen Zahnputzbecher aus Mattglas drüber stülpen und die Wellness-Lampe ist fertig!
Software:
Das Programm TINY13RGB steuert eine RGB-LED mit einem softwaremäßig erzeugten PWM-Signal an. Da der TINY13 nur einen PWM-Timer hat, wird das PWM Signal stattdessen softwaremäßig in einer Interrupt-Routine erzeugt und an die drei freien Ports ausgegeben..
Das Programm startet bei main: und initialisiert zunächst den Timer und die Ports. Dann wird der Interrupt freigegeben. In der Hauptschleife wird eine oder zwei LED gedimmt. Eine LED ist immer eingeschaltet, damit die Lampe nicht verlischt.
In der Interruptroutine zählt die Variable PMWCount die Anzahl der Interrupts. Diese werden dann mit den Variablen led_1, led_3 und led_4 verglichen. Wenn beide Werte gleich sind, wird der jeweilige Port gesetzt. Am Schluß wird dann das jeweilige Port-Register geschrieben.
Die Warteschleife warten: steuert die Geschwindigkeit mit der die Farben wechseln.
Download: Quelltext und Hex-File
Listing
;

TINY13RGB
;

Software

PWM

zum

Ansteuern

von

RGB

Led

als

Farbenspiel
;

Version

1.2

30-11-2007


Wolfram

Herzog

www.wherzog.de
;

Für

TINY13

im

Franzis-Board
;

Taktfrequenz

Default
.include

"tn13def.inc"

.def

temp

=

r16


;

Temporäres

Arbeitsregister
.def

PWMCount

=

r17


;

PWM

Pulsbreitenzähler

.def

led_1

=

r18


;

Helligkeitswert

Led1:

0

..

127
.def

led_4

=

r19


;

Helligkeitswert

Led4:

0

..

127
.def

led_5

=

r20


;

Helligkeitswert

Led5:

0

..

127
.def

sicher

=

r21



;

Status

Register

sichern
.equ

HELL

=

0




;

Null

=

maximale

Helligkeit

rjmp

main

;

Reset

Handler
.org

OVF0addr

rjmp

timer0_overflow


;

Timer

Overflow

Handler
;

-------------------------------------------------------------------
main:





;

Initialisierung

ldi


temp,

0xFF


;

Port

B

auf

Ausgang

out


DDRB,

temp

ldi


temp,

0b00000001

;

CS00

setzen:

Teiler

1

out


TCCR0B,

temp

ldi


temp,

0b00000010

;

TOIE0:

Interrupt

bei

Timer

Overflow

out


TIMSK0,

temp

ldi


led_1,

HELL


;

Alle

Lampen

an

ldi


led_4,

HELL


ldi


led_5,

HELL

sei



;

Interrupt

freigeben
;

--------------------------------------------------------------------
Gruenphase:



;

Es

wird

die

Grüne

LED

verdunkelt

rcall

warten

inc


led_1


;

also

hochzählen

cpi


led_1,127



;

Ist

maximum

127

erreicht

?

breq

Grauf


;

Geringste

Helligkeit

-

also

weiter

nach

Grauf

rjmp

Gruenphase
Grauf:

rcall

warten

dec


led_1


;

Helligkeitswert

verringen

->

LED

heller

breq

Rotphase



;

Null

?

Dann

weiter

mit

nächster

Farbe

rjmp

Grauf
Rotphase:

rcall

warten

inc


led_5

cpi


led_5,127

breq

Rrauf

rjmp

Rotphase
Rrauf:

rcall

warten

dec


led_5

breq

Blauphase


rjmp

Rrauf
Blauphase:

rcall

warten

inc


led_4

cpi


led_4,127

breq

Brauf

rjmp

Blauphase
Brauf:

rcall

warten

dec


led_4

breq

GRphase


rjmp

Brauf
GRphase:

rcall

warten

inc


led_1

inc


led_4

cpi


led_4,127

breq

GRrauf

rjmp

GRphase
GRrauf:

rcall

warten

dec


led_1

dec


led_4

breq

RBphase



rjmp

GRrauf
RBphase:

rcall

warten

inc


led_5

inc


led_4

cpi


led_4,127

breq

RBrauf

rjmp

RBphase
RBrauf:

rcall

warten

dec


led_5

dec


led_4

breq

BGphase



rjmp

RBrauf
BGphase:

rcall

warten

inc


led_5

inc


led_1

cpi


led_1,127

breq

BGrauf

rjmp

BGphase
BGrauf:

rcall

warten

dec


led_5

dec


led_1

breq

Schluss


;

Hier

kann

noch

Weissphase

eingefügt

werden

rjmp

BGrauf
/*

Weissphase:

;

Hier

werden

alle

3

LED

gedimmt

rcall

warten



;

es

wird

also

Dunkel

inc


led_5

inc


led_4

inc


led_1

cpi


led_1,127

breq

Wrauf

rjmp

Weissphase
Wrauf:

rcall

warten

dec


led_5

dec


led_4

dec


led_1

breq

Schluss

rjmp

Wrauf
*/




;

Hier

weitere

Farbverläufe

möglich
Schluss:

rjmp

Gruenphase


;

Jetzt

wieder

von

Vorn
;--

Verzögerungsschleife

------------------------

Warten:


Ldi


r24,127

;

250

Warten1:



;äußere

Schleife


Ldi


r25,250

;

250
Warten2:



;innere

Schleife


dec


r25


brne

Warten2


dec


r24


brne

Warten1


ret


;Rücksprung
;--

Interrupt-Routine

-------------------

timer0_overflow:



;

Timer

0

Overflow

ruft

diese

Routine

in


sicher,

SREG



;

Status

Register

sichern

inc


PWMCount



;

den

PWM

Zähler

von

0

bis

cpi


PWMCount,

100


;

100

zählen

lassen

-

hier

pulsweite

einstellbar!

brne

MachPWM

clr


PWMCount

MachPWM:

ldi


temp,

0b11000000


;

0

..

Led

an,

1

..

Led

aus

cp


PWMCount,

led_1



;

Ist

der

Grenzwert

für

Led

1

erreicht

brlt

FourOn

ori


temp,

$01



;

Ja,

dann

Bit0

setzen

FourOn:

cp


PWMCount,

led_4



;

Ist

der

Grenzwert

für

Led

4

erreicht

brlt

FiveOn

ori


temp,

$08



;

Ja,

dann

Bit3

setzen

FiveOn:

cp


PWMCount,

led_5



;

Ist

der

Grenzwert

für

Led

5

erreicht

brlt

SetLeds

ori


temp,

$10



;

Ja,

dann

Bit4

setzen
SetLeds:




;

Die

neue

Bitbelegung

am

Port

ausgeben

out


PORTB,

temp

out


SREG,

sicher


;

Status

Register

wiederherstellen

reti



;

Interrupt

ist

Fertig

Lernen Sie die ganze Vielfalt vom Franzis Buch- und Softwareverlag kennen