⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dec_t15.asm

📁 一个德国人写的基于15各采样点的dcc解码器
💻 ASM
📖 第 1 页 / 共 3 页
字号:
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 + -