Bei den älteren Einsatzfahrzeugen kommen jedoch rotierende Blaulichter zum Einsatz, die einen pulsierenden Lichteindruck erzeugen. So etwas gab es für den Modellbau bisher nicht.
So entstand also diese kleine Software für Atmel 12 Microcontroller.
Sie benutzt Pulsweitenmodulation, um ein Rotierendes Blaulicht nachzuahmen.
Das besondere an dieser Software ist die Verwendung einer Nachschlagetabelle, um, den Helligkeitsverlauf zu steuern. Das ist praktisch eine Wavetable-Synthese für Helligkeitsverläufe.
Über die Einträge in den beiden LPM-Tabellen wird der Helligkeitsverlauf festgelegt. Somit sind nahezu beliebige Lichtprofile erzeugbar,
Die beiden LED's benutzen dabei unterschiedliche Tabellen , die zudem mit unterschiedlichen Geschwindigkeiten ausgelesen werden, was die anzahl der möglichen Effekte noch weiter erhöht.
Eingesetzt werden kann sie z.B. mit dieser kleinen Platine
;PWM Rotationsblinklicht auf PB1 und PB2
(c) 2005 Markus Vohburger Verwendung nur zum privaten Gebrauch gestattet.
.include "tn12def.inc"
.def temp1=r16
.def pwmvalue1 = r17
.def pwmvalue2 = r18
.def pwmcount = r19
.def output = r20
.def swcount1 = r21
.def swcount2 = r22
.equ EE_OSCCAL = $3f
.org $0000
rjmp reset
;timer overflow interrut handler
.org OVF0Addr
rjmp OVF0Handler
reset:
;set Clock frequency
ldi temp1,EE_OSCCAL
rcall readeeprom
cpi temp1,$00
breq ignoreosccal
cpi temp1,$ff
breq ignoreosccal
out osccal,temp1
ignoreosccal:
ldi temp1,$07
out ddrb,temp1
;Timer zurücksetzen
clr temp1
out tcnt0,temp1
;Timer interrupts an
ldi temp1,(1 <<toie0)
out timsk,temp1
;Timer starten
ldi temp1,0b00000011
out tccr0,temp1
ldi pwmcount,$00
ldi pwmvalue1,$ff
ldi pwmvalue2,$ff
clr swcount1
ldi swcount2,$10
sei
loop:
ldi output,$07
inc pwmcount
cp pwmvalue1,pwmcount
brsh makeoutput2
andi output,$04
makeoutput2:
cp pwmvalue2,pwmcount
brsh writeoutput
andi output,$02
writeoutput:
out portb,output
rjmp loop
OVF0Handler:
in r1,sreg
ldi zh,high(lpmtable1 <<1)
ldi zl,low(lpmtable1 <<1)
add zl,swcount1
ldi temp1,$00
adc zh,temp1
lpm
com r0
mov pwmvalue1,r0
ldi zh,high(lpmtable2 <<1)
ldi zl,low(lpmtable2 <<1)
add zl,swcount2
ldi temp1,$00
adc zh,temp1
lpm
com r0
mov pwmvalue2,r0
inc swcount1
cpi swcount1,$3f
brne noreset1
clr swcount1
noreset1:
inc swcount2
cpi swcount2,$3e
brne noinc
clr swcount2
noinc:
exitovf0handler:
out sreg,r1
reti
readeeprom:
sbic eecr,eewe
rjmp readeeprom
out eear,temp1
sbi eecr,eere
in temp1,eedr
ret
lpmtable1:
.db $01,$02,$04,$08,$10,$20,$40,$80
.db $ff,$ff,$f0,$80,$20,$10,$ff,$80
.db $60,$50,$40,$30,$20,$10,$08,$07
.db $04,$02,$01,$00,$00,$00,$00,$00
.db $00,$00,$00,$00,$00,$00,$00,$00
.db $00,$00,$00,$00,$00,$00,$00,$00
.db $00,$00,$00,$00,$00,$00,$00,$00
.db $00,$00,$00,$00,$00,$00,$00,$00
lpmtable2:
.db $01,$02,$04,$08,$10,$20,$40,$80
.db $ff,$b0,$ff,$80,$20,$80,$b0,$80
.db $60,$50,$40,$30,$20,$10,$08,$07
.db $04,$02,$01,$00,$00,$00,$00,$00
.db $00,$00,$00,$00,$00,$00,$00,$00
.db $00,$00,$00,$00,$00,$00,$00,$00
.db $00,$00,$00,$00,$00,$00,$00,$00
.db $00,$00,$00,$00,$00,$00,$00,$00
|