; step4.ASM ; Version: 0 Date: 07. July 1998 ; Copyright (C) 1998/99 Georg Ziegler ; NMRA-DCC decoder for stepper motor with 2 coil based on PIC12C509 ; 14 speed step mode (internal 30) and two internal speed curves ; no programming implemented, only short fixed adresses ; Max 2000 U/min - SPDTAB and Z2TAB in SPEED.XLS worksheet ; 4 I/O Ports used for stepper ; This program is free software; you can redistribute it and/or ; modify it under the terms of the GNU General Public License as ; published by the Free Software Foundation; either version 2 of ; the License, or (at your option) any later version. ; This program is distributed in the hope that it will be useful, ; but WITHOUT ANY WARRANTY; without even the implied warranty of ; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ; General Public License for more details. ; You should have received a copy of the GNU General Public License ; along with this program; if not, write to the Free Software ; Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. ; Contact : ; Georg Ziegler ; Zwehrener Weg 23a ; 34121 Kassel ; g.zi@gmx.de ;-------------------------------------------------------------------- LIST P=12C509, R=DEC INCLUDE __CONFIG _MCLRE_OFF & _CP_OFF & _WDT_ON & _IntRC_OSC ;-------------------------------------------------------------------- ; 0AAA AAAA 01DL SSSS -> Lok Adress Direction Light & Speed ; 0AAA AAAA 100D DDDD -> Lok Function F1-F4 & FL ; 0AAA AAAA 1011 DDDD -> Lok Function F5-F8 ; 0000 0000 -> Broadcast Adress for all Lok Decoder ; 10AA AAAA 1AAA CDDD -> 9 Bit Accessory on/off F1-F8 ; 1011 1111 1000 CDDD -> Broadcast Command for all Accessory Decoder ; 1111 1111 0000 0000 -> Idle Packet for all Decoder ADDR EQU 03 ; 10AA AAAA DELAY EQU 0x20 ; 255- INDF EQU 0x00 ; indirekte Adressierung tmr0 EQU 0x01 PC EQU 0x02 STATUS EQU 0x03 ; Status Register FSR EQU 0x04 ; OSCCAL EQU 0x05 GPIO EQU 0x06 ; Register definitions PRE EQU 0x07 ; Preample 12 BIT BT1 EQU 0x08 BT2 EQU 0x09 BT3 EQU 0x0A BT4 EQU 0x0B BT5 EQU 0x0C BT6 EQU 0x0D HI EQU 0x0E LO EQU 0x0F ZL EQU 0x10 ZH EQU 0x11 Z1 EQU 0x10 Z2 EQU 0x11 IST EQU 0x12 SOLL EQU 0x13 BEFEHL EQU 0x14 FUNK EQU 0x15 Z1LOG EQU 0x16 Z2LOG EQU 0x17 LASTGP EQU 0x18 CARRY EQU 0 ZERO EQU 2 SEITE EQU 5 DIR EQU 5 POL EQU 6 ROMPAGE EQU 5 ORG 1 ; Reset Vector ;-------------------------------------------------------------------- Init MOVWF OSCCAL ; write calibration value MOVLW 00101000b ; GP3 & GP5 Input TRIS GPIO ; tristate port GPIO MOVLW PRE ; Pointer für indirekte Adressierung MOVWF FSR ; MOVLW 10000111b ; no wakeup, pullup, T0 int., lowtohigh, T0, 1:256 OPTION MOVLW 1 ; Z1 auf 1 setzen, damit MOVWF Z1 ; STEPPER nicht aufgerufen wird MOVWF Z2 ; CLRF IST ;0 CLRF SOLL ;0 CLRF BEFEHL ;0 CLRF FUNK ;0 CLRWDT ; WatchDog Timer zurücksetzen CLRF GPIO ;-------------------------------------------------------------------- ; GOTO START ; Überspringt Routine, nur zum TEST ;next call INLO ; call STEP ; nur zum TEST ; goto next ; nur zum TEST ;-------------------------------------------------------------------- ; Positive oder Negative Bits auf der Schiene? CLRF ZL CLRF ZH MOVLW 0xF0 BEGIN BTFSS GPIO,3 ; GOTO BEGIN ; BEGIN1 BTFSC GPIO,3 ; GOTO BEGIN1 ; TESTL INCF ZL ;-- 1 BTFSS GPIO,3 ; 2 GOTO TESTL ;__ 3-4 ADDWF ZL,1 ; 4 BTFSC STATUS,CARRY ; 5 GOTO TESTH1 ; L0 6-7 CLRF ZH ; L1 7 TESTH INCF ZH ;-- 1 BTFSC GPIO,3 ; 2 GOTO TESTH ;__ 3-4 ADDWF ZH,1 ; 4 BTFSC STATUS,CARRY ; 5 GOTO POS ; H0 6-7 CLRF ZL ; H1 7 GOTO TESTL ; 8-9 TESTH1 CLRF ZH ; 9 TESTH2 INCF ZH ;-- 1 BTFSC GPIO,3 ; 2 GOTO TESTH2 ;__ 3-4 ADDWF ZH,1 ; 4 BTFSS STATUS,CARRY ; 5 GOTO POS ; H1 6-7 CLRF ZL ; H0 7 TESTL1 INCF ZL ;-- 1 BTFSS GPIO,3 ; 2 GOTO TESTL1 ;__ 3-4 ADDWF ZL,1 ; 4 BTFSS STATUS,CARRY ; 5 GOTO NEG ; L1 6-7 GOTO TESTH1 ; L0 7-8 POS BCF STATUS,POL ; GOTO START ; NEG BSF STATUS,POL ; GOTO START ; ;vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv SPDTAB MOVF IST,0 ;11 ADDWF PC ;12 RETLW 255 ;13-14 RETLW 211 ; RETLW 3 ; 1 RETLW 20 ; 2 RETLW 44 ; 3 RETLW 71 ; 4 RETLW 96 ; 5 RETLW 119 ; 6 RETLW 39 ; 7 RETLW 90 ; 8 RETLW 125 ; 9 RETLW 149 ; 10 RETLW 168 ; 11 RETLW 182 ; 12 RETLW 193 ; 13 RETLW 201 ; 14 RETLW 208 ; 15 RETLW 214 ; 16 RETLW 218 ; 17 RETLW 222 ; 18 RETLW 226 ; 19 RETLW 229 ; 20 RETLW 231 ; 21 RETLW 233 ; 22 RETLW 235 ; 23 RETLW 237 ; 24 RETLW 238 ; 25 RETLW 239 ; 26 RETLW 240 ; 27 RETLW 241 ; 28 RETLW 242 ; 29 RETLW 243 ; 30 Z2TAB MOVF IST,0 ;18 ADDWF PC ;19 RETLW 255 ;20-21 RETLW 255 ; RETLW 132 ; 1 RETLW 13 ; 2 RETLW 6 ; 3 RETLW 4 ; 4 RETLW 3 ; 5 RETLW 2 ; 6 RETLW 1 ; 7 RETLW 1 ; 8 RETLW 1 ; 9 RETLW 1 ; 10 RETLW 1 ; 11 RETLW 1 ; 12 RETLW 1 ; 13 RETLW 1 ; 14 RETLW 1 ; 15 RETLW 1 ; 16 RETLW 1 ; 17 RETLW 1 ; 18 RETLW 1 ; 19 RETLW 1 ; 20 RETLW 1 ; 21 RETLW 1 ; 22 RETLW 1 ; 23 RETLW 1 ; 24 RETLW 1 ; 25 RETLW 1 ; 26 RETLW 1 ; 27 RETLW 1 ; 28 RETLW 1 ; 29 RETLW 1 ; 30 ;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ CLRF GPIO ; Stepper 29us on 25 STEP INCFSZ Z1,0 ; 26 GOTO ISO ; 27-28 MOVF Z1LOG,0 ; 28 MOVWF Z1 ; 29 MOVF LASTGP,0 ; 30 ANDLW 00000110b ; 31 BTFSC BEFEHL,DIR ; 32 IORLW 00001000b ; 33 ADDWF PC ; DIR GP2 GP1 34 MOVLW 00010010b ; 0 0 0 35 GOTO STEPEND ; 36-37 MOVLW 00000110b ; 0 0 1 GOTO STEPEND ; MOVLW 00010001b ; 0 1 0 GOTO STEPEND ; MOVLW 00000101b ; 0 1 1 GOTO STEPEND ; MOVLW 00000101b ; 1 0 0 GOTO STEPEND ; MOVLW 00010001b ; 1 0 1 GOTO STEPEND ; MOVLW 00000110b ; 1 1 0 GOTO STEPEND ; MOVLW 00010010b ; 1 1 1 GOTO STEPEND ; STEPEND NOP ; 38 MOVWF LASTGP ; 39 MOVWF GPIO ; 40 RETLW 0 ; ****** Ende Stepper ****** 41-42 ISO INCFSZ tmr0,0 ; 29 GOTO INC ; 30-31 MOVLW DELAY ; 31 MOVWF tmr0 ; 32 MOVF SOLL,0 ; 33 SUBWF IST,0 ; 34 BTFSC STATUS,ZERO ; 35 GOTO EQUAL ; Geschwindigkeit gleich 36-37 BTFSC STATUS,CARRY ; 37 DECF IST,1 ; 38 BTFSS STATUS,CARRY ; 39 INCF IST,1 ; 40 RETLW 0 ; 41-42 EQUAL NOP ; 38 NOP ; 39 NOP ; 40 RETLW 0 ; 41-42 INC MOVF LASTGP,0 ; 32 MOVWF GPIO ; 33 DECFSZ Z2,1 ; 34 GOTO INCEXIT ; 35-36 INCF Z1,1 ; 36 MOVF Z2LOG,0 ; 37 MOVWF Z2 ; 38 BTFSC FUNK,7 ; 39 RLF Z2,1 ; *2 40 RETLW 0 ; 41-42 INCEXIT NOP ; 37 NOP ; 38 MOVF LASTGP,0 ; 39 MOVWF GPIO ; 40 RETLW 0 ; 41-42 ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ INLO BTFSS STATUS,POL ; 1 GOTO INLO1 ; positiv 2-3 NOP ; negativ 3 BTFSS GPIO,3 ; ########### input ########## 4 GOTO INHI ; 5-6 GOTO LONEXT ; 6-7 INLO1 BTFSC GPIO,3 ; ########### input ########## 4 GOTO INHI ; 5-6 NOP ; 7 LONEXT INCF LO ; LO+1 8 ; CLRF GPIO ; Stepper 12us on ;vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv CALL SPDTAB ; 9-10 MOVWF Z1LOG ; 15 CALL Z2TAB ; 16-17 MOVWF Z2LOG ; 22 ;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ CALL STEP ; 23-24 GOTO INLO ; 2 cycles 42-43 ;------------- INHI MOVF LO,1 ; Zero test 4 BTFSS STATUS,ZERO ; 5 RETLW 0 ; 6-7 INCF HI ; HI+1 8 ; CLRF GPIO ; Stepper 12us on ;vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv MOVF IST ; 9 BTFSC STATUS,ZERO ; STOP 10 CLRF Z1 ; 11 BTFSC STATUS,ZERO ; 12 CLRF LASTGP ; 13 ;-------------------------------------- DECF BEFEHL,0 ; 14 ANDLW 00001111b ; <- 14 Fahrstufen 15 BTFSC STATUS,ZERO ; NOTHALT 16 CLRF Z1 ; 17 BTFSC STATUS,ZERO ; 18 CLRF LASTGP ; 19 ;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ NOP ; 20 NOP ; 21 NOP ; 22 CALL STEP ; 23-24 GOTO INLO ; 42-43 ;SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS START CLRWDT ; 16 CLRF HI ; 17 CLRF LO ; 18 MOVLW PRE ; Pointer für ind. Adressierung 19 MOVWF FSR ; 20 MOVLW 11 ; 21 MOVWF PRE ; PRE auf 10 Bit für Preample 22 ;------------- INTEST CALL STEP ; 23-24 CALL INLO ; 42-43 MOVF HI,0 ; 8 ADDWF LO,1 ; HI+LO 9 MOVLW 4 ; ___ < 3 10 SUBWF LO,0 ; BIT im Carry 11 CLRF LO ; 12 CLRF HI ; 13 INCF HI ; 14 DECFSZ PRE,1 ; Pre=0? 15 GOTO PRETEST ; 16-17 BTFSC STATUS,CARRY ; warte auf 0 17 GOTO BYTE ; Preample erfüllt! 18-19 INCF PRE,1 ; 19 NOP ; 20 PREBACK GOTO INTEST ; nächstes Bit 21-22 PRETEST BTFSS STATUS,CARRY ; 18 GOTO PREBACK ; 19-20 GOTO START22 ; Preample nicht erfüllt! 20-21 BYTE MOVLW 9 ; PRE auf 8 Bit für 1.Byte 20 MOVWF PRE ; 21 INCF FSR,1 ; Pointer für ind. Adressierung 22 INTEST1 CALL STEP ; 23-24 CALL INLO ; 42-43 MOVF HI,0 ; 8 ADDWF LO,1 ; HI+LO 9 MOVLW 4 ; ___ < 3 10 SUBWF LO,0 ; BIT im Carry 11 CLRF LO ; 12 CLRF HI ; 13 INCF HI ; 14 DECFSZ PRE,1 ; Pre=0? 15 GOTO NEXT ; 16-17 BTFSC STATUS,CARRY ; 9.Bit=0? 17 GOTO BYTE ; 18-19 GOTO EXOR ; Letztes BIT=1 19-20 NEXT RLF INDF,1 ; 1.Byte zusammenbauen 18 NOP ; 19 NOP ; 20 GOTO INTEST1 ; nächstes Bit 21-22 ;-------------------------------------------------------------------- ; Maximal 100 us für Befehle (2x 1Bit in PREAMPLE) EXOR NOP ; 21 NOP ; 22 CALL STEP ; 23-24 MOVLW 6 ; 42 SUBWF FSR,0 ; 43 BTFSS STATUS,ZERO ; 1 GOTO EXOR3 ; 3 BYTE Befehl 2-3 MOVLW 8 ; 3 SUBWF FSR,0 ; 4 BTFSC STATUS,ZERO ; 5 GOTO EXOR5 ; 5 BYTE Befehl 6-7 MOVLW 9 ; 7 SUBWF FSR,0 ; 8 BTFSC STATUS,ZERO ; 9 GOTO EXOR6 ; 6 BYTE Befehl 10-11 GOTO START13 ; 11-12 ;-------------------------------------------------------------------- EXOR3 COMF BT1,1 ; BYTE invertieren 4 COMF BT2,1 ; BYTE invertieren 5 COMF BT3,1 ; BYTE invertieren 6 MOVF BT1,0 ; 7 XORWF BT2,0 ; 8 XORWF BT3,0 ; 9 BTFSS STATUS,ZERO ; Bytes vollständig angekommen? 10 GOTO START13 ; 11-12 MOVF BT1,0 ; 12 XORLW ADDR ; 13 BTFSS STATUS,ZERO ; Adresse gleich ? 14 GOTO BCAST ; 15-16 BCASTBK BTFSC BT2,7 ; 01DLSSSS 1 GOTO FTION ; 1 2-3 BTFSS BT2,6 ; 3 GOTO START6 ; 00 4-5 MOVF BT2,0 ; 01DLSSSS 5-6 MOVWF BEFEHL ; 6 RLF BT2,0 ; 7 ANDLW 00011110b ; 8 MOVWF SOLL ; 9 NOP ; 10 NOP ; 11 NOP ; 12 NOP ; 13 NOP ; 14 NOP ; 15 ;vvvvvvvvvvvvvvvvvvvvvvvv Arnold Digital vvvvvvvvvvvvvvvvvvvvvvvvvvvv ; BTFSS BT2,4 ; 01D>LDLDF< F4-F7 11 GOTO FON4 ; 12-13 BCF GPIO,2 ; 13 GOTO START ; 14-15 FON4 BSF GPIO,2 ; 14 GOTO START17 ; 15-16 ;--------- BCAST MOVF BT1,0 ; 17 XORLW 0 ; Broadcast for Lok-Decoder 18 BTFSS STATUS,ZERO ; Adresse gleich ? 19 GOTO START22 ; 20-21 NOP ; 21 NOP ; 22 CALL STEP ; 23-24 GOTO BCASTBK ; 42-43 ;-------------------------------------------------------------------- EXOR5 GOTO START10 ; 8-9 ;-------------------------------------------------------------------- EXOR6 GOTO START14 ; 12-13 ;-------------------------------------------------------------------- START1 NOP ; 1 START2 NOP ; 2 START3 NOP ; 3 START4 NOP ; 4 START5 NOP ; 5 START6 NOP ; 6 START7 NOP ; 7 START8 NOP ; 8 START9 NOP ; 9 START10 NOP ; 10 START11 NOP ; 11 START12 NOP ; 12 START13 NOP ; 13 START14 GOTO START ; 14-15 START15 NOP ; 15 NOP ; 16 START17 NOP ; 17 START18 NOP ; 18 START19 NOP ; 19 START20 NOP ; 20 START21 NOP ; 21 START22 NOP ; 22 START23 CALL STEP ; 23-24 GOTO START1 ; 42-43 ;-------------------------------------------------------------------- ORG 03FFh MOVLW 0x70 ; für OSCCAL END