📄 dec_t15.asm
字号:
CHECKLONG:;lange Adresse
mov TEMP1, ByteA ; pr黤e Adresse
andi Temp1, 0b11000000; auf lange Adresse
cpi Temp1, 0b11000000; wenn nicht gleich dann
brne CHECKFehl ; sind wir nicht gemeint
mov TEMP1, ByteA
cp HIAdresse, TEMP1 ; pr黤e HI-Adresse
brne CHECKFehl
mov TEMP1, ByteB
cp LOAdresse, TEMP1 ; pr黤e LO-Adresse
brne CHECKFehl
mov ByteB, ByteC ; schiebe Bytes
mov ByteC, ByteD
mov ByteD, ByteE
mov ByteE, ByteF
CHECKALL: ; alle Decoder sind angesprochen
CHECKEND: ;Adresse und Pr黤summe OK
;Funktionen
mov TEMP1, ByteB ;Daten sichern
andi TEMP1,0b11100000 ;Datenbits ausblenden
cpi TEMP1, 0b00000000 ;Vergleiche mit Consist Control
breq Consist
cpi TEMP1, 0b00100000 ;Vergleiche mit Advanced Operation
breq Advanced
cpi TEMP1, 0b01000000 ;Vergleiche mit Speed R點kw鋜ts
breq SpeedCalc
cpi TEMP1, 0b01100000 ;Vergleiche mit Speed Vorw鋜ts
breq SpeedCalc
cpi TEMP1, 0b10000000 ;Vergleiche mit Funktionsgruppe F1-F4
breq FGroup1
; cpi TEMP1, 0b10100000 ;Vergleiche mit Funktionsgruppe F5-F8
; cpi TEMP1, 0b11000000 ;Vergleiche mit Future Expansion
; cpi TEMP1, 0b11100000 ;Vergleiche mit CV Access
; breq CVAccess
rjmp MAIN ;Endlosschleife
Consist: rjmp CONCTRL
Advanced: rjmp ADVCTRL
;CVAccess: rjmp CVACC
SpeedCalc:;Speed Berechnung 14 und 28 Fahrstufen
tst ISTSpeed ; schreibe Richtung nur
brne Speed28 ; wenn Speed 0
mov TEMP2, ByteB ; Daten sichern
sbrc DCCReg, RevDir ; wenn Fahrrichtung nicht reversiert
com ByteB ; dann wird Byte nicht gedreht
sbrc FlagReg, CONREV ; wenn Fahrrichtung in Consist nicht reversiert
com ByteB ; dann wird Byte nicht gedreht
bst ByteB, 5 ; hole Richtungsbit
bld DCCReg, DIR ; nach DCC Register
Speed28: clc ;
sbrc TEMP2, 4 ;
sec ;
andi TEMP2, 0b00001111;
rol TEMP2 ;
cpi TEMP2, 0b00000010 ;
brlo STOP ; Stop
cpi TEMP2, 0b00000100 ;
brlo ESTOP ; ESD
subi TEMP2,0b00000011 ;
sbrc DCCReg, F3 ; Rangiergang
rjmp Rangier ;
ldi TEMP1, 9 ; Max-Speed 28*9 = 252
rcall MUL8X8 ;
cp TEMP2, MaxSpeed ;
brsh Limit ;
mov SOLLSpeed, TEMP2 ;
rjmp MAIN ; Endlosschleife
Rangier: ;Rangiergang 14 und 28 Fahrstufen
ldi TEMP1, 3 ; Max-Speed 28*3 = 84
rcall MUL8X8 ;
mov SOLLSpeed, TEMP2 ;
rjmp MAIN ; Endlosschleife
LongSpeed:;Speed Berechnung 128 Fahrstufen
tst ISTSpeed ; schreibe Richtung nur
brne Speed126 ; wenn Speed 0
mov TEMP2, ByteC ; Daten sichern
sbrc DCCReg, RevDir ; wenn Fahrrichtung nicht reversiert
com ByteC ; dann wird Byte nicht gedreht
sbrc FlagReg, CONREV ; wenn Fahrrichtung in Consist nicht reversiert
com ByteC ; dann wird Byte nicht gedreht
bst ByteC, 7 ; hole Richtungsbit
bld DCCReg, DIR ; nach DCC Register
Speed126: andi TEMP2, 0b01111111; blende Richtung aus
cpi TEMP2, 0b00000000;
breq STOP ; Stop
cpi TEMP2, 0b00000001;
breq ESTOP ; ESD
subi TEMP2, 0b00000001; 128 - 1 macht 127 Fahrstufen
sbrc DCCReg, F3 ; Rangiergang
rjmp RangLong ; hier Speed durch 2
ldi TEMP1, 2 ; Max-Speed 126*2 = 252
rcall MUL8X8 ;
RangLong: cp TEMP2, MaxSpeed ;
brsh Limit ;
mov SOLLSpeed, TEMP2 ;
rjmp MAIN ; Endlosschleife
FGroup1: ;Funktionsgruppe 1
mov TEMP2, ByteB ; Daten sichern
andi DCCReg,0b11100000; Funktionen ausblenden
andi TEMP2, 0b00011111; Richtung ausblenden
or DCCReg, TEMP2 ; neue Funktionen speichern
in TEMP1, PortB ;
bst DCCReg, F1 ;
bld TEMP1, PB3 ;
bst DCCReg, F2 ;
bld TEMP1, PB4 ;
out PORTB, TEMP1 ;
rjmp MAIN ; Endlosschleife
Limit: mov SOLLSpeed, MaxSpeed
rjmp MAIN ; Endlosschleife
STOP: clr SOLLSpeed ;
rjmp MAIN ; Endlosschleife
ESTOP: clr SOLLSpeed ;
clr ISTSpeed ;
ldi TEMP1,0b01000101 ; Timer/Counter1 PWM vom
out TCCR1,TEMP1 ; Ausgang trennen
cbi PortB, PB0 ; alles auf Null
rjmp MAIN ; Endlosschleife
CONCTRL: ;Consist Control
mov TEMP1, ByteC ;Daten sichern
andi TEMP1, 0b11110000;LO-Nibble ausblenden
cpi TEMP1, 0b00000000;vergleiche mit Decoder Control
breq DECCON
cpi TEMP1, 0b00010000;vergleiche mit Consist Control
breq CONCON
rjmp MAIN ; Endlosschleife
DECCON: ;Decoder Control
mov TEMP1, ByteC ;Daten sichern
andi TEMP1,0b00001111 ;Hi-Nibble ausblenden
cpi TEMP1, 0b00000000 ;vergleiche mit Reset
breq DECCONReset
cpi TEMP1, 0b00000001 ;vergleiche mit Hard-Reset
breq DECCONHardReset
cpi TEMP1, 0b00001111 ;vergleiche mit Acknowledgement Request
breq DECCONAcc
lsr TEMP1 ;schiebe Bit 0 raus
; cpi TEMP1, 0b00000001 ;vergleiche mit Factory Test
; cpi TEMP1, 0b00000010 ;vergleiche mit Future Use
; cpi TEMP1, 0b00000011 ;vergleiche mit Advanced Acknowledgement
; cpi TEMP1, 0b00000100 ;vergleiche mit Future Use
cpi TEMP1, 0b00000101 ;vergleiche mit Advanced Adressing
breq DECCONAdr
; cpi TEMP1, 0b00000110 ;vergleiche mit Future Use
rjmp MAIN ;Endlosschleife
DECCONReset: rjmp Reset
DECCONHardReset: wdr
DECCONAcc: rjmp PRGACK
DECCONAdr: bst ByteC, 0
bld DCCReg, LongADR
rjmp MAIN ;Endlosschleife
CONCON: ;Consist Control
ldi TEMP3, EECONAdr ; setzte Schreib-Adresse
mov TEMP2, ByteD ; hole Daten
mov TEMP1, ByteC ; Daten sichern
cpi TEMP1, 0b00010010 ; vergleiche mit Consist normal Direction
breq CONDIR
cpi TEMP1, 0b00010011 ; vergleiche mit Consist reverse Direction
breq CONINV
rjmp MAIN ; Endlosschleife
CONDIR: andi TEMP2, 0b01111111; setze Richtung auf Direct
rcall writeEEPROM ; und schreibe ins EEPROM
rjmp Reset ; Decoder Reset f黵 neue Daten黚ernahme
CONINV: ori TEMP2, 0b10000000; setze Richtung auf Reverse
rcall writeEEPROM ; und schreibe ins EEPROM
rjmp Reset ; Decoder Reset f黵 neue Daten黚ernahme
ADVCTRL: ;Advanced Control
mov TEMP1, ByteB ;Daten sichern
andi TEMP1,0b00011111 ;Hi-Nibble ausblenden
cpi TEMP1, 0b00011111 ;128 Speed Step
breq Speed128
cpi TEMP1, 0b00011110 ;Restricted Speed Step
rjmp MAIN ;Endlosschleife
Speed128: rjmp LongSpeed ;Speed Berechnung 128 Fahrstufen
;CVACC: ;CV Access Instuction ( kurze Form )
; mov TEMP1, ByteB ;Daten sichern
; cpi TEMP1, 0b11110010 ;2. Beschleunigungsvariable
; cpi TEMP1, 0b11110011 ;2. Bremsvariable
;CVACCEND: rjmp MAIN ;Endlosschleife
Servicemode:; Programmiermodus CV-Lesen, Schreiben, Bitmanipulation
ldi TEMP1, 0b01111000 ; pr黤e Funktionscode
cp ByteA, TEMP1 ; auf CV Bitmanpulation
breq PRGBITMAN ; Bitmanipulation wird nicht unterst黷zt
ldi TEMP1, 0b01110100 ; pr黤e Funktionscode
cp ByteA, TEMP1 ; auf CV Verify Byte
breq PRGVERIFY ; Verifizierung
ldi TEMP1, 0b01111100 ; pr黤e Funktionscode
cp ByteA, TEMP1 ; auf CV Write Byte
breq PRGWRITE ; Schreiben
;Pr黤ung auf Reset
in TEMP1, TIFR ; hole Timer Interuptflag
sbrs TEMP1, TOV1 ; wenn Resetzeit abgelaufen und kein Programmierbefehl
rjmp MAIN ;
rjmp RUN ; setze Timer auf RUN-Werte
PRGBITMAN:;Bitmanipulation
rjmp main
;ldi Temp1, 0b00010000; Bit-Filter f黵 Write (1) und Verify (0)
;and TEMP1, ByteC ; UND mit Datenbyte
;tst Temp1 ; pr黤e auf 0
;brne BITWRITE ;
;BITVERIFY:;Bitverify
;ldi Temp3, 0b00000111; Bit-Filter f黵 Byteposition
;and Temp3, ByteC ; mit Datenbyte
;rcall BITFILTER
;mov Temp3, Temp1 ; sichere Bitfilter
;mov Temp1, ByteB ; hole Adresse
;rcall readEEPROM ; lese CV
;and Temp2, Temp3 ; Bits ausblenden
;ldi Temp3, 0b00000111; Bit-Filter f黵 Byteposition
;and Temp3, ByteC ; mit Datenbyte
;;rcall BITSETZEN
;cpse Temp1, Temp2 ; Teste ob gleich
;rjmp Main
;rjmp PRGACK ; Acknowlege
;BITWRITE:;BITWRITE
;cpi ByteCNT, 2 ; pr黤e Checkz鋒ler
;brlo BITWRITEEND ; ob Daten mehr als zweimal gleich empfangen
;ldi Temp3, 0b00000111 ; Bit-Filter f黵 Byteposition
;and Temp3, ByteC ; mit Datenbyte
;rcall BITFILTER
;mov Temp3, Temp1 ; sichere Bitfilter
;mov Temp1, ByteB ; hole Adresse
;rcall readEEPROM ; lese CV
;com TEMP3 ; drehe Bitmuster
;and Temp2, Temp3 ; Bit ausblenden
;ldi Temp3, 0b00000111 ; Bit-Filter f黵 Byteposition
;and Temp3, ByteC ; mit Datenbyte
;rcall BITSETZEN
;or Temp2,Temp1 ; Bit mit altem Bitmuster verodern
;mov Temp1, ByteB ; hole Adresse
;rcall writeEEPROM ; Schreibe CV
;clr ByteCNT ; l鰏che Checkz鋒ler
;rjmp PRGACK ; Acknowlege
;BITWRITEEND:rjmp main
PRGVERIFY:mov TEMP1, ByteB ; setze Lese-Adresse
rcall readEEPROM ; lies
cpse TEMP2, ByteC ; und vergleiche
rjmp main ; wenn gleich dann
sbi PortB, PB0 ; setze einen Motorausgang
rjmp PRGACK ; ACK
PRGWRITE: cp PRGCHECK, ByteD ; vergleiche mit vorherigen Daten (XOR-Byte)
brne PRGWRACK ; springe wenn ungleich
mov TEMP1, ByteB ; setzte Schreib-Adresse
mov TEMP2, ByteC ; hole Daten
rcall writeEEPROM ; und schreibe ins EEPROM
PRGWRACK: mov PRGCHECK, ByteD ; Datencheck
sbi PortB, PB1 ; setze einen Motorausgang
PRGACK: ; Acknowledge
cli ; alle Interrupts ausschalten
ldi TEMP1, ACKTime ; lade den Timer/Counter1
ldi TEMP1,0b00001100 ; 1 1 0 0 CK/128 f黵 Resetzeit und ACK
out TCCR1,TEMP1 ;
out TCNT1, TEMP1 ; setze Zeit f黵 Acknowlege
in TEMP1, TIFR ; hole Timer Interuptflag
sbrs TEMP1, TOV1 ; wenn Ackzeit abgelaufen
rjmp PC-2 ; Schleife
ldi TEMP1, 0b00000110; l鰏che Timer Interupts
out TIFR, TEMP1
clr TEMP1
out PortB, TEMP1 ; l鰏che Motorausgang
sei ; alle Interrupts wieder einschalten
rjmp MAIN ; Endlosschleife
;** hier beginnt das EEProm **
.ESEG
.ORG $0000
.db 0x01, 0x00 ; Adresse und StartSpeed
.db 0x80, 0x80 ; IncVAL und DecVal
.db 0x80, 0x71 ; MaxSpeed und OSCCAL
.db 0xFF, 0xFF ; Frei und Frei
.db 0xFF, 0xFF ; Frei und Frei
.db 0xFF, 0xFF ; Frei und Frei
.db 0xFF, 0xFF ; Frei und Frei
.db 0xFF, 0xFF ; Frei und Frei
.db 0xC0, 0x01 ; HI-Byte und LO-Byte
.db 0x00, 0xFF ; Consist und Frei
.db 0xFF, 0xFF ; Frei und Frei
.db 0xFF, 0xFF ; Frei und Frei
.db 0xFF, 0xFF ; Frei und Frei
.db 0xFF, 0xFF ; Frei und Frei
.db 0x00, 0xFF ; Configuration Data und Frei
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -