Full Version : Voltage Controlled RGB LED (ASM)
avr >>ASSMBLER ROUTINES >>Voltage Controlled RGB LED (ASM)


AVR_Admin- 04-16-2006

Voltage Controlled RGB LED Tiny15A voltage applied to the A/D Input of a Tiny15 controls 3 Channels of PWM for one RGB LED.

Ideally suited for monitoring purposes.

6 Modes of Operation selectable via Pushbutton


CODE
;Voltage Control RGB
;(C) 2004 Markus Vohburger
;Gewrbliche Nutzung untersagt

;Definitionen für Tiny15
.include "tn15def.inc"



;Programmvariablen
.def pwmcount = r01
.def pwmvalue_1 = r02
.def pwmvalue_2 = r03
.def pwmvalue_3 = r04
.def mode_1=r05
.def mode_2=r06
.def mode_3=r07
.def omod=r08
.def sbuffer=r09
.def temp1 = r16
.def temp2 = r17
.def output = r18
.def swcount=r19
.def mode=r20




;movin' average filter
.def adcold1 = r23
.def adcold2 = r24
.def adcold3 = r25


.equ EE_MODE = $00
.equ EE_OMOD = $01
.equ EE_OSCCAL = $3f



.equ timer_value = $80

;reset handler
.org $0000
rjmp main


;timer overflow interrut handler
.org T0OVAddr
rjmp T0OVHandler

.org $0010
main:

;read osccal byte
ldi temp1,EE_OSCCAL
rcall readeeprom
out osccal,temp1


ldi temp1,$07
out ddrb,temp1

;port b output LED's Off,, pullup on pb3
ldi temp1,$0f
out portb,temp1



ldi temp1,EE_MODE
rcall readeeprom
cpi temp1,$06
brlo mode_ok
ldi temp1,$00

mode_ok:
mov mode,temp1

rcall readsettings


ldi temp1,EE_OMOD
rcall readeeprom
cpi temp1,$00
breq omod_ok
cpi temp1,$07
breq omod_ok
ldi temp1,$00


omod_ok:
mov omod,temp1



;Taster an PB3 überprüfen
sbic pinb,pb3
rjmp no_omod_change

ldi temp1,$07
eor omod,temp1
;Mode umschalten
ldi temp1,EE_OMOD
mov temp2,omod
rcall writeeeprom






;port setup

;port pb0,1,2 outputs

no_omod_change:



notoggle:
;Timer zurücksetzen
ldi temp1,timer_value
out tcnt0,temp1


;Timer interrupts an
ldi temp1,(1<<toie0)
out timsk,temp1


;Timer starten
ldi temp1,0b00000100
out tccr0,temp1

rcall init_adc

clr swcount


sei


;Hauptschleife für PWM

loop:

;leds aus
ldi output,$0f



cp pwmvalue_1,pwmcount
brsh check_green
;leds an
and output,mode_1



check_green:
cp pwmvalue_2,pwmcount
brsh check_blue
;leds an
and  output,mode_2

check_blue:
cp pwmvalue_3,pwmcount
brsh  writeoutput
;leds an
and output,mode_3




writeoutput:
eor output,omod
out portb,output

inc pwmcount
brne loop
inc pwmcount
rjmp loop



;Timer Interrupt

T0OVHandler:

;Status sichern
in sbuffer,sreg

;AD-Wandler lesen
in temp1,adch

;dividieren
lsr temp1
lsr temp1
lsr temp1

;Moving Average Filter
mov temp2,temp1

add temp1,adcold1
adc temp1,adcold2
adc temp1,adcold3

mov adcold3,adcold2
mov adcold2,adcold1
mov adcold1,temp2


lsr temp1
lsr temp1




;pwm-Wert aus Tabelle lesen

clr r0
ldi zl,low(table_pwm_1<<1)
ldi zh,high(table_pwm_1<<1)
add zl,temp1
adc zh,r0
lpm
com r0
mov pwmvalue_1,r0

clr r0
ldi zl,low(table_pwm_2<<1)
ldi zh,high(table_pwm_2<<1)
add zl,temp1
adc zh,r0
lpm
com r0
mov pwmvalue_2,r0

clr r0
ldi zl,low(table_pwm_3<<1)
ldi zh,high(table_pwm_3<<1)
add zl,temp1
adc zh,r0
lpm
com r0

mov pwmvalue_3,r0



;Taster abfragen

sbic pinb,pb3
rjmp releasehandler

cpi swcount,$20
brsh exit_ovf0Handler
inc swcount

exit_ovf0Handler:
out sreg,sbuffer
reti


;wenn längere Zeit gedrückt, dann modus speichern
releasehandler:
cpi swcount,$20
breq writemode

;kurze Impulse ignorieren
cpi swcount,$02
brsh key_valid
clr swcount
rjmp exit_ovf0handler

key_valid:
clr swcount
inc mode
cpi mode,$06
brlo nomodrrollover
ldi mode,$00

nomodrrollover:
mov temp1,mode
rcall readsettings
rjmp exit_ovf0handler



writemode:
clr swcount


mov temp2,mode
ldi temp1,EE_MODE
rcall writeeeprom

rjmp exit_ovf0handler



;adc Wandler initialisieren
init_adc:
;ADC internaql Reference 2.5v, Left Align,PB4 Single ended input
ldi temp1,0b10100011
out admux,temp1

;adc enable,fee running,start conversion,clock/128
ldi temp1,0b11100111
out adcsr,temp1
ret



readsettings:
lsl temp1
lsl temp1

rcall getmode
mov mode_1,r0

inc temp1

rcall getmode
mov mode_2,r0

inc temp1
rcall getmode
mov mode_3,r0
ret



;aktuellen Modus holen

getmode:

clr r0
ldi zl,low(table_mode<<1)
ldi zh,high(table_mode<<1)
add zl,temp1
adc zh,r0
lpm
ret


;in  eeprom-Zelle Schreiben
writeeeprom:
sbic eecr,eewe
rjmp writeeeprom

out eear,temp1
out eedr,temp2
sbi eecr,eemwe
sbi eecr,eewe
ret



;aus eeprom Zelle Lesen
readeeprom:
sbic eecr,eewe
rjmp readeeprom
out eear,temp1
sbi eecr,eere
in temp1,eedr
ret

;Mode-Tabellen für die Farbumschaltung
table_mode:

.db 0b11111110,0b11111011,0b11111101,0b00000000
.db 0b11111110,0b11111101,0b11111011,0b00000000

.db 0b11111101,0b11111110,0b11111011,0b00000000
.db 0b11111101,0b11111011,0b11111110,0b00000000

.db 0b11111011,0b11111101,0b11111110,0b00000000
.db 0b11111011,0b11111110,0b11111101,0b00000000





;Gewichtete Tabelle für PWM-Ausgabe
table_pwm_1:
.db $ff,$f0,$e0,$d0,$c0,$b0,$a0,$80
.db $40,$20,$10,$08,$04,$03,$02,$01
.db $00,$00,$00,$00,$00,$00,$00,$00
.db $00,$00,$00,$00,$00,$00,$00,$00


table_pwm_2:
.db $00,$01,$02,$03,$04,$08,$10,$20
.db $40,$80,$a0,$b0,$c0,$d0,$e0,$f0
.db $ff,$f0,$e0,$d0,$c0,$b0,$a0,$80
.db $40,$20,$10,$08,$04,$02,$01,$00



table_pwm_3:
.db $00,$00,$00,$00,$00,$00,$00,$00
.db $00,$00,$00,$00,$00,$00,$00,$00
.db $01,$02,$03,$04,$08,$10,$20,$40
.db $80,$a0,$b0,$c0,$d0,$e0,$f0,$ff

.exit






Forumer™ is Voted #1 Free Forum Hosting provider
Build your own community today with the largest message board hosting company.