

Mehr Bilder befinden sich im Album!
//########################### ###############################
// RGB Lampe V2 (13.02.2009)
//
// Rot PinB0, Gr?n PinB1, Blau PinB2
// Poti PinB3, Schalter PinB4
//
// Schalterstellung 0 => Automatischer Wechsel:
//______- Potistell. gibt Wechselgeschwindigkeit an
// Schaltestellung 1 => Manueller Wechsel:
//______- Potistell. gibt Farbe an
//########################### ###############################
.include "tn13def.inc"
.org $000
___rjmp Ini
___
___
Ini:
___// Stack
___ldi r16, low(RAMEND)
___out SPL, r16
___// IO (PinB 0 1 2 als Ausgang)
___ldi r16, 0b00000111_________
___out DDRB, r16
___// ADC f?r Geschwindigkeitssteuerung
___ldi r16, 0b00100011
___out ADMUX, r16___// Vcc als Vref, Links, PinB3
___ldi r16, 0b10000011
___out ADCSRA, r16 // ADC an, Interrupt aus, Presc. 16
___// Startwerte der Farben und Z?hler
___ldi r18, 0xff
___ldi r19, 0x00
___ldi r20, 0x00
___ldi r25, 0x01___// Z?hler f?r Geschwindigkeit der Farb?nderung
___ldi r27, 0x00___// Z?hler f?r Auswahl der Teilfunktion
___ldi r26, 0x00___// Z?hler f?r Schritt in Teilfunktion
Haupt:___
___rcall SoftPWM___
___
___in r16, PINB
___andi r16, 0b00010000
___brne Manuell
Automatisch:
___// Automatischer Farbverlauf mit Geschwindigkeit ?ber Poti
___// bei Schalterstellung 0___
___subi r25, 1
___brsh Haupt // Jede r25te Schritt nur Farbe ?ndern (Geschw.)
___rcall Farbverlauf___
___
___rcall ADC_Wert // neue "Geschwindigkeit" abfragen
___mov r25, r16
___
___rjmp Haupt
Manuell:
___// Manuelle Farbwahl mit Poti
___// bei Schalterstellung 1
___//
___// 3 MSB f?r Auswahl der Teilfunktion
___// 7 LSB f?r Schritt in Zeilfunktion
___rcall ADC_Wert
___mov r27, r16
___mov r26, r16
___// ADCH und ADCL entsprechend schieben
___lsr r17
___lsr r17
___lsr r17
___lsr r17
___lsr r17
___lsr r27
___lsr r27
___lsr r27
___lsr r27
___lsr r27
___lsl r26
___lsl r26
___lsl r26
___or r26, r17___//5 LSB von ADCH mit 2 MSB von ADCL vereinen
___rcall Farbverlauf
___rjmp Haupt___
ADC_Wert:
___// lie?t ADC Wert ein
___// schreibt HighByte in r16
___// und LowByte in r17
___sbi ADCSRA, ADSC___// ADC starten
ADC_Warte:
___sbic ADCSRA, ADSC
___rjmp ADC_Warte______// warten bis ADC fertig
___in r17, ADCL
___in r16, ADCH
___ret
Farbverlauf:
___// Erzeugt Farbwert anhand von Z?hlschritt
___// alte Farben m?ssen in r18, r19 und r20 ?bergeben werden
___// Farbe = f( Farbe^-1 & Z?hler r27 )
___push r16
___cpi r27, 0x00
___brne ZE1
___mov r19, r26
___inc r26
___cpi r19, 0xff
___brne FarbZurueckNah
___inc r27
___ldi r26, 0x00
___rjmp FarbZurueckNah
FarbZurueckNah:
___// nochmal oben, weil Sprung sonst zu weit nach unten
___pop r16
___ret
______
ZE1:
___cpi r27, 0x01
___brne ZE2
___ldi r18, 0xff
___sub r18, r26
___inc r26
___cpi r18, 0x00
___brne FarbZurueck
___inc r27
___ldi r26, 0x00
___rjmp FarbZurueck
ZE2:
___cpi r27, 0x02
___brne ZE3
___mov r20, r26
___inc r26
___cpi r20, 0xff
___brne FarbZurueck
___inc r27
___ldi r26, 0x00
___rjmp FarbZurueck
ZE3:
___cpi r27, 0x03
___brne ZE4
___ldi r19, 0xff
___sub r19, r26
___inc r26
___cpi r19, 0x00
___brne FarbZurueck
___inc r27
___ldi r26, 0x00
___rjmp FarbZurueck
ZE4:
___cpi r27, 0x04
___brne ZE5
___mov r18, r26
___inc r26
___cpi r18, 0xff
___brne FarbZurueck
___inc r27
___ldi r26, 0x00
___rjmp FarbZurueck
ZE5:
___cpi r27, 0x05
___brne ZE6
___ldi r20, 0xff
___sub r20, r26
___inc r26
___cpi r20, 0x00
___brne FarbZurueck
___inc r27
___ldi r26, 0x00
___rjmp FarbZurueck
ZE6:
___// ab hier Zusatz
___// (Lila) -> Rot -> Wei? -> Rot -> (Gelb)
___cpi r27, 0x06
___brne ZE7
___mov r19, r26
___mov r20, r26
___inc r26
___cpi r20, 0xff
___brne FarbZurueck
___inc r27
___ldi r26, 0x00
___rjmp FarbZurueck
ZE7:
___ldi r20, 0xff
___ldi r19, 0xff
___sub r20, r26
___sub r19, r26
___inc r26
___cpi r19, 0x00
___brne FarbZurueck
___ldi r27, 0x00
___ldi r26, 0x00
___rjmp FarbZurueck
FarbZurueck:
___pop r16
___ret
SoftPWM:
___// Software PWM f?r PortB 0 - 2
___// 00 = 0% / ff = 100%
___// Pulsl?ngen m?ssen ?bergeben werden
___// => Rot in r18 / Gr?n in r19 / Blau in r20
___push r18
___push r19
___push r20
___push r16
___push r17
___push r21
___ldi r16, 0xff___//Schleifenz?hler
Loop_PWM:
___ldi r21, 0b00000111___//Wert f?r Ausgabe
___tst r18
___brne RotOK
___andi r21, 0b11111110 // Rot ausmaskieren wenn 0
RotOK:
___tst r19
___brne GruenOK
___andi r21, 0b11111101 // Gruen ausmaskieren wenn 0
GruenOK:
___tst r20
___brne BlauOK
___andi r21, 0b11111011 // Blau ausmaskierenn wenn 0
BlauOK:
___out PORTB, r21___// Ausgeben
___rcall PausePWM___// Werte halten___
___tst r18_________// Farbwerte dekrementieren
___breq rotAus______// wenn gr??er als 0
___subi r18, 1______
rotAus:____________
___tst r19
___breq gruenAus
___subi r19, 1
gruenAus:
___tst r20
___breq blauAus
___subi r20, 1
blauAus:
___subi r16, 1
___brne Loop_PWM___//solange r16 != 0 springen______
___pop r21
___pop r17
___pop r16
___pop r20
___pop r19
___pop r18
___ret
PausePWM:
___// Pause um Werte f?r Zeit zu halten
___// => "PWM" Frequenz
___push r16
___ldi r16, 0x60
LoopPause:
___subi r16, 1
___brne LoopPause
___pop r16
___ret


