; 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 (+1) cpi led_1,127 ; Ist maximum 127 erreicht ? (abfrage ist led_1 schon 127) breq Grauf ; Geringste Helligkeit - also weiter nach Grauf (Springe wenn der Wert gleich ist ) 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