Anbei mal der Code:
/*
Flackernde LED-Flamme für ATtiny12
LEDs werden über Soft-PWM gedimmt, PWM-Frequenz ca 73Hz, 5 Kanäle (PB0 bis PB4), 64 Stufen.
PWM-Werte werden nach 5 Zyklen zufällig neu bestimmt.
*/
.include “tn12def.inc” ; Definitionsdatei für den Prozessortyp einbinden
.def temp = r16
.def Counter = r17
.def Counter2 = r18
.def Random = r19
.def PWM1 = r21
.def PWM2 = r22
.def PWM3 = r23
.def PWM4 = r24
.def PWM5 = r25
.equ channel1 = 0x01 ; Kanal1: PB0
.equ channel2 = 0x02 ; Kanal2: PB1
.equ channel3 = 0x04 ; Kanal3: PB2
.equ channel4 = 0x08 ; Kanal4: PB3
.equ channel5 = 0x10 ; Kanal5: PB4
.org 0x0000
rjmp main ; Reset Handler
.org OVF0addr
rjmp timer0_overflow ; Timer Overflow Handler
;============
; Main
;============
main:
ldi PWM1, 0x30 ; Startwerte für PWM, maximal 0x3F
ldi PWM2, 0x30
ldi PWM3, 0x30
ldi PWM4, 0x30
ldi PWM5, 0x30
ldi Random, 0x10 ; Initialwert für Zufallsgenerator
; Port initialisieren
ldi temp, 0xFF
out DDRB, temp ; Alles Ausgang
ldi temp, 0x00
out PORTB, temp ; Alles Low
;Timer initialisieren
ldi temp, 0x01
out TCCR0, r16 ; Prescaler 1
ldi temp, 0x02
out TIMSK, r16 ; Timer Interrupt Enabled
sei ; Interrupts global aktivieren
; Haupt(Endlos)schleife
loop:
rjmp loop
;============
; ISR
;============
; Bei jedem Timer-Overflow Counter inkrementieren
timer0_overflow:
inc Counter
ldi temp, 0
; Wenn Zähler > PWM-Wert → Ausgang auf 1 (LED aus)
cp Counter, PWM1 ; Counter und PWM vergleichen
brlo weiter ; Überspringen wenn Zähler < PWM
ori temp, channel1
weiter:
; Zweiter Kanal
cp Counter, PWM2 ; Counter und PWM2 vergleichen
brlo weiter2 ; Überspringen wenn Zähler < PWM2
ori temp, channel2
weiter2:
; Dritter Kanal
cp Counter, PWM3 ; Counter und PWM3 vergleichen
brlo weiter3 ; Überspringen wenn Zähler < PWM3
ori temp, channel3
weiter3:
; Vierter Kanal
cp Counter, PWM4 ; Counter und PWM4 vergleichen
brlo weiter4 ; Überspringen wenn Zähler < PWM4
ori temp, channel4
weiter4:
; Fünfter Kanal
cp Counter, PWM5 ; Counter und PWM5 vergleichen
brlo weiter5 ; Überspringen wenn Zähler < PWM5
ori temp, channel5
weiter5:
out PORTB, temp
; Wenn Zähler = 63 → Zurücksetzen und von vorne
cpi Counter, 0x3F
brne weiter6; Überspringen wenn Counter != 0x3F
ldi temp, 0x00
out PORTB, temp ; Alle Kanäle auf 0 setzen
clr Counter
inc Counter2
weiter6:
; Wenn Zähler2 voll → neuen zufälligen PWM-Wert setzen
cpi Counter2, 0x05 ; Nach 5 Intervallen neuen PWM-Wert
brne weiter7;
mov PWM1, Random ; neuen Zufallswert als PWM-Vergleichswert für Kanal1
andi PWM1, 0x3F ; maximal 63
; neue Zufallszahl generieren
rcall LFSR
mov PWM2, Random ; neuen Zufallswert als PWM-Vergleichswert für Kanal2
andi PWM2, 0x3F ; maximal 63
; neue Zufallszahl generieren
rcall LFSR
mov PWM3, Random ; neuen Zufallswert als PWM-Vergleichswert für Kanal3
andi PWM3, 0x3F ; maximal 63
; neue Zufallszahl generieren
rcall LFSR
mov PWM4, Random ; neuen Zufallswert als PWM-Vergleichswert für Kanal4
andi PWM4, 0x3F ; maximal 63
; neue Zufallszahl generieren
rcall LFSR
mov PWM5, Random ; neuen Zufallswert als PWM-Vergleichswert für Kanal5
andi PWM5, 0x3F ; maximal 63
clr Counter2
weiter7:
reti
;============
; Funktionen
;============
LFSR:
clr temp
sbrc Random,7
inc temp
sbrc Random,5
inc temp
sbrc Random,4
inc temp
sbrc Random,3
inc temp
ror temp
rol Random
brne lfsrx
ldi Random,128
lfsrx:
ret
Ok, habe gerade gesehen daß das Programm in Atmel Studio geschrieben worden ist. Als ich es installieren wollte, meckert Atmel das ich 2 Updates installieren soll die aber bereits installiert sind.