; TINY13 ; Colortemp .include "tn13def.inc" .def temp = r16 .def temp2 = r22 .def PWMCount = r17 .def blau = r18 ; Helligkeitswert blaue LED .def gn = r19 ; Helligkeitswert grüne LED .def rot = r20 ; Helligkeitswert rote LED rjmp main ; Reset Handler ; ------------------------------------------------------------------- main: ldi temp,RAMEND ; Stackpointer out SPL,temp ldi temp, 0b00000111 ; Port B Ausgang out DDRB, temp ldi temp,0b00010000 ; Digitaleingang abschalten out DIDR0,temp ; -------------------------------------------------------------------- GET_AD: ldi temp, 0b00000010 ; AD-Wandler starten out ADMUX, temp ldi temp, 0b11000010 out ADCSRA, temp wait_ad: sbic adcsra,6 ; warten bis AD fertig rjmp wait_ad in temp2, adcl in temp, adch ; -------------------------------------------------------------------- update_RGB: cpi temp2, 192 ; 0...60° HSV Farbraum brsh gminus cpi temp2, 128 ; 61...120° brsh rplus cpi temp2, 64 ; 121...180° brsh bminus gplus: ; 181...240° ldi rot,0 ; rote LED bleibt aus ldi blau, 63 ; blau LED bleibt an mov gn, temp2 ; grüne LED erhält AD Wert von 0...63 rjmp end bminus: ldi gn,63 ; grüne LED bleibt an ldi rot, 0 ; rote LED bleibt aus ldi temp, 64 ; vom AD-Wert 64 abziehen sub temp2, temp ; Bits umdrehen com temp2 ldi temp, 0b00111111 ; Bit 7 und 6 löschen Wert von 63...0 and temp2, temp ; an LED übergeben mov blau, temp2 rjmp end rplus: ldi gn,63 ; grüne LED bleibt an ldi blau, 0 ; blaue LED bleibt aus ldi temp, 128 ; vom AD-Wert 128 abziehen sub temp2, temp ldi temp, 0b00111111 ; Bit 7 und 6 löschen and temp2, temp mov rot, temp2 ; rote LED erhält AD Wert von 0...63 rjmp end gminus: ldi rot,63 ; rote LED bleibt an ldi blau, 0 ; blau LED bleibt aus ldi temp, 192 ; vom AD-Wert 192 abziehen sub temp2, temp com temp2 ; Bits umdrehen ldi temp, 0b00111111 ; Bit 7 und 6 löschen Wert von 63...0 and temp2, temp ; an LED übergeben mov gn, temp2 rjmp end end: ; -------------------------------------------------------------------- count: inc PWMCount ; PWM Schleife von 0...64 cpi PWMCount,64 brne Ausgabe clr PWMCount rjmp GET_AD ; wenn fertig neuen AD-Wert holen Ausgabe: ldi temp, 0b11111000 ; LEDs an PB0:2 cp PWMCount, blau ; blau anschalten bis Grenzwert erreicht brlo blauAn ori temp, 0b00000001 ; PB0 =an blauAn: cp PWMCount, gn ; grün anschalten bis Grenzwert erreicht brlo gruenAn ori temp, 0b00000010 ; PB1 =an gruenAn: cp PWMCount, rot ; Ist der Grenzwert für Led 5 erreicht brlo rotAn ori temp, 0b00000100 ; PB2 =an rotAn: out PORTB, temp ; Die neue Bitbelegung am Port ausgeben Schluss: rjmp count ; in PWM Schleife bleiben