Sorry Datei hochladen ging nicht. Hab das Assembler Programm mal
reinkopiert.
.include "m8def.inc"
.def temp = r16
.def temp1 = r17
.def temp2 = r18
.def cv1 = r19
.def cv2 = r20
.def cv3 = r21
.def cv4_7 = r22
.def cv11 = r23
.def pwmcount = r24
.org 0x000
rjmp main
.org OVF2addr
rjmp timer2_overflow ;Timer Overflow Handler
.cseg
main:
ldi temp, LOW(RAMEND) ;Stackpointer initialisieren
out SPL, temp
ldi temp, HIGH(RAMEND)
out SPH, temp
ldi temp, $FF
out DDRC, temp ;Port C0,C1,C2 als
Ausgangsregister
rcall readcvdata ;CV Werte aus eeProm lesen und in
SRAM ablegen
main1:
ldi temp, (1<<CS20) ;CS00 setzen Teiler 1
out TCCR2, temp
ldi temp, (1<<TOIE2) ;TOIE0: Interrupt bei Timer
Overflow
out TIMSK, temp
ldi temp, $00
sts srPWMCount, temp ;Zähler Timer Sram am Anfang null
setzen
sei
loop:
rjmp loop
;pwm für portc für C0-C3
timer2_overflow: ;Timer 0 Overflow Handler
lds pwmcount, srPWMCount ;den PWM Zähler aus dem
Speicher holen
inc pwmcount ;den PWM Zähler von 0 bis
127 zählen lassen
cpi pwmcount, 255 ;wurde 255 erreicht?
brne WorkPWM ;NEIN
clr pwmcount ;Ja: Zähler 0 setzen
WorkPWM:
sts srPWMCount, pwmcount ;den PWM Zähler wieder
speichern
ldi temp, 0b11111000 ;0 .. Led an, 1 .. Led aus
lds pwmcount, srPWMCount
lds temp1, srCV2
cp pwmcount, temp1 ;Ist der Grenzwert für Led
1 erreicht
brlo OneOn
ori temp, $01
OneOn:
lds temp1, srCV3
cp pwmcount, temp1 ;Ist der Grenzwert für Led
2 erreicht
brlo TwoOn
ori temp, $02
TwoOn:
lds temp1, srCV11
cp pwmcount, temp1 ;Ist der Grenzwert für Led
3 erreicht
brlo SetBits
ori temp, $04
SetBits: ;Die neue Bitbelegung am
Port ausgeben
out PORTC, temp
reti
;daten der cv werte aus eeprom lesen und im sram ablegen
read_sram1:
sts srCV1, temp1 ; Lade temp in SRAM Stelle srCV1
inc temp2
rcall readcvdata
read_sram2:
sts srCV2, temp1
inc temp2
rcall readcvdata
read_sram3:
sts srCV3, temp1
inc temp2
rcall readcvdata
read_sram4:
sts srCV4_7, temp1
inc temp2
rcall readcvdata
read_sram5:
sts srCV11, temp1
inc temp2
rcall readcvdata
readcvdata:
ldi ZL, LOW(eeCV1) ;Low-Byte der Adresse in
Z-Pointer
ldi ZH, HIGH(eeCV1) ;High-Byte der Adresse in
Z-Pointer
cpi temp2, 0 ;Vergleiche temp2 mit 0
breq EEPROM_read ;Wenn gleich dann EEPROM_read ausführen
cpi temp2, 1
breq read_sram1
ldi ZL, LOW(eeCV2)
ldi ZH, HIGH(eeCV2)
cpi temp2, 2
breq EEPROM_read
cpi temp2, 3
breq read_sram2
ldi ZL, LOW(eeCV3)
ldi ZH, HIGH(eeCV3)
cpi temp2, 4
breq EEPROM_read
cpi temp2, 5
breq read_sram3
ldi ZL, LOW(eeCV4_7)
ldi ZH, HIGH(eeCV4_7)
cpi temp2, 6
breq EEPROM_read
cpi temp2, 7
breq read_sram4
ldi ZL, LOW(eeCV11)
ldi ZH, HIGH(eeCV11)
cpi temp2, 8
breq EEPROM_read
cpi temp2, 9
breq read_sram5
ldi temp1, 0x00
ldi temp2, 0x00
rcall main1
EEPROM_read:
sbic EECR, EEWE ;prüdfe ob der vprherige Schreibzugriff
beendet ist
rjmp EEPROM_read ;NEIN nochmal prüfen
out EEARH, ZH ;Adresse laden
out EEARL, ZL
sbi EECR, EERE ;Lesevorgang aktivieren
in temp1, EEDR
inc temp2
rcall readcvdata
ret
; eeprom daten, hier die Standart CV Werte
.eseg
eeCV1: .db 0x01 ;Adresse der Lok
eeCV2: .db $01 ;Dimmung Ausgang C0 einstellbar
zwischen 0x00 und 0xF7
eeCV3: .db 20 ;Dimmung Ausgang C1 einstellbar
zwischen 0x00 und 0xF7
eeCV4_7: .db 0x01 ;Richtungsabhängige Steuerung,
Abschaltung und Steuerung Unterprogramme
eecv11: .db $FF ;Dimmung Ausgang C3 einstellbar
zwischen 0x00 und 0xF7
;sram daten
.dseg
srPWMCount: .BYTE 1 ;Der PWM Counter (0 bis 127)
srCV1: .BYTE 1 ;5 Bytes für CV Daten
srCV2: .BYTE 1
srCV3: .BYTE 1
srCV4_7: .BYTE 1
srCV11: .BYTE 1