Code:
.NOLIST
.INCLUDE <tn12def.inc>
.LIST
.CSEG
.def tmp = r16 ;arbeitsregister
.def t_tmp = r22 ;hilfsregister
.def sreg_store=r23 ;zum Statusregister sichern
.def cnt1 = r17 ;Helligkeit LED1
.def cnt2 = r18 ;Helligkeit LED2
.def cnt3 = r19 ;Helligkeit LED3
.def cnt4 = r20 ;Helligkeit LED4
.equ led1 = 1 ;Bit an PortB
.equ led2 = 2 ;Bit an PortB
.equ led3 = 3 ;Bit an PortB
.equ led4 = 4 ;Bit an PortB
.equ waittime = 140 ;Timer preload, Geschwindigkeit
.def dir = r21 ;Flag für Auf/Abblenden
;------------------------------------------------------
; Start Adresse 0000
;------------------------------------------------------
.org 0000
RESET:
rjmp INIT
;------------------------------------------------------
; ISR VECTORS
;------------------------------------------------------
.org OVF0addr
rjmp Timer
.ORG INT_VECTORS_SIZE
INIT:
;PortB konfigurieren
ldi tmp,(1<<1)| (1<<2)| (1<<3)| (1<<4) ;binär 00011110, Leds auf Ausgang, Taster als Eingang
out DDRB,tmp ;DDRB setzen
sbi PORTB,0 ;Pullup für PB0, Taster schaltet gegen GND
;Timer konfigurieren
ldi tmp,(1<<CS00) | (1<<CS02) ; prescaler 1024
out TCCR0,tmp
ldi tmp,(1<<TOIE0) ; IRQ anschalten
out TIMSK,tmp
ldi tmp,waittime
out tcnt0,tmp
ldi cnt1,255 ;starthelligkeit für LED1
ldi cnt2,195 ;starthelligkeit für LED2
ldi cnt3,127 ;starthelligkeit für LED3
ldi cnt4,63 ;starthelligkeit für LED4
ldi dir,0 ;
sei
MAIN:
ldi tmp,255 ;zähler für Soft-PWM auf Maximum
loop1:
cp tmp,cnt1 ;Zähler mit Helligkeit vergleichen
brlo led1_off ;wenn kleiner, dann led ausschalten
sbi portb,led1 ;ansonsten LED einschalten
rjmp skip1 ;und weiter mit Soft-PWM
led1_off:
cbi portb,led1 ;Led ausschalten, nur tmp < cnt1
skip1:
dec tmp ;tmp - 1
brne loop1 ;solange, bis tmp = 0
ldi tmp,255
loop2:
cp tmp,cnt2
brlo led2_off
sbi portb,led2
rjmp skip2
led2_off:
cbi portb,led2
skip2:
dec tmp
brne loop2
ldi tmp,255
loop3:
cp tmp,cnt3
brlo led3_off
sbi portb,led3
rjmp skip3
led3_off:
cbi portb,led3
skip3:
dec tmp
brne loop3
ldi tmp,255
loop4:
cp tmp,cnt4
brlo led4_off
sbi portb,led4
rjmp skip4
led4_off:
cbi portb,led4
skip4:
dec tmp
brne loop4
rjmp main
Timer:
in sreg_store,sreg
_Led1:
mov t_tmp,dir
andi t_tmp,(1<<Led1)
breq _inc1a
dec cnt1
brne _Led2
ldi t_tmp,(1<<Led1)
eor dir,t_tmp
rjmp _Led2
_inc1a:
inc cnt1
brne _Led2
ori dir,(1<<Led1)
_Led2:
mov t_tmp,dir
andi t_tmp,(1<<Led2)
breq _inc2a
dec cnt2
brne _Led3
ldi t_tmp,(1<<Led2)
eor dir,t_tmp
rjmp _Led3
_inc2a:
inc cnt2
brne _Led3
ori dir,(1<<Led2)
_Led3:
mov t_tmp,dir
andi t_tmp,(1<<Led3)
breq _inc3a
dec cnt3
brne _Led4
ldi t_tmp,(1<<Led3)
eor dir,t_tmp
rjmp _Led4
_inc3a:
inc cnt3
brne _Led4
ori dir,(1<<Led3)
_Led4:
mov t_tmp,dir
andi t_tmp,(1<<Led4)
breq _inc4a
dec cnt4
brne t_end
ldi t_tmp,(1<<Led4)
eor dir,t_tmp
rjmp t_end
_inc4a:
inc cnt4
brne t_end
ori dir,(1<<Led4)
t_end:
ldi t_tmp,waittime
out tcnt0,t_tmp
out sreg,sreg_store
reti
/edit: Grmpfl. Mein USBTinyISP wahr Schuld, der mag diese Schaltung nicht so richtig und hat den Controller nicht richtig programmiert.... Das ganze über 'nen klasischen Parallelportprogrammer mit 'nem 74hct244 und Ponyprog, und schon gehts... Naja, fast zumindest, ich muß wohl nochmal meine Schleifen feintunen,da es bei den Maximal und Minimalwerten zu einem unschönen 'blitzen' kommt, hier ein aktuelles Video :
Lesezeichen