RGB Lampe Version 2
Verfasst von piwy am 13.02.2009

Funktionsprinzip

folgt...










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

.
Kommentare:

Keine Kommentare vorhanden.






Impressum
. Login


Automatisch einloggen

Registrieren!

. Projekte
RGB Lampe Version 2...
vom 13.02.2009
Car-PC: Start/Shutdown Contr...
vom 10.02.2009
Maplestory-Bot...
vom 10.02.2009
Car-PC (Stand 2005)...
vom 31.12.2005

. Besucher
3 Online



LADE...