; motor509.ASM ; Version: 0 Date: 27. Dec. 1998 ; Copyright (C) 1998/99 Georg Ziegler ; NMRA-DCC decoder for iron core motors based on PIC12C509 with si9986 H-Bridge ; 14/28 speed step mode, two internal speed curves ; no programming implemented, only short fixed adresses ; 44us timestep full bit for polling of DCC signal ; SPDTAB in LINSPEED.XLS worksheet ; 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 ;-------------------------------------------------------------------- ; 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 43 ; 10AA AAAA DELAY EQU 0xF0 ; 255- KICK EQU 0x90 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 Z1LOG EQU 0x15 NOADR EQU 0x16 FLAG EQU 0x17 ; 1=F1 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 PRE ; Pointer für indirekte Adressierung MOVWF FSR ; MOVLW 11010111b ; no wakeup, no pullup, T0 int., hightolow, T0, 1:256 OPTION MOVLW 1 ; Z1 auf 1 setzen, damit MOVWF Z1 ; STEPPER nicht aufgerufen wird MOVWF Z2 ; CLRF ZH ;Z2 CLRF ZL ;Z1 CLRF HI ;0 CLRF LO ;0 CLRF IST ;0 CLRF SOLL ;0 CLRF FLAG ;0 CLRF BEFEHL ;0 CLRF NOADR ;0 ;-------------------------------------------------------------------- ; GOTO START ; Überspringt Routine, nur zum TEST ;next call INLO ; call STEP ; nur zum TEST ; goto next ; nur zum TEST ;-------------------------------------------------------------------- ANALOG MOVLW 00111111b ; all Input TRIS GPIO ; tristate port GPIO CLRF GPIO BEGIN CLRWDT ; WatchDog Timer zurücksetzen CLRF ZL CLRF ZH MOVLW 0xF0 BEGIN1 BTFSS GPIO,3 ; GOTO BEGIN1 ; BEGIN2 BTFSC GPIO,3 ; GOTO BEGIN2 ; ; Positive oder Negative Bits auf der Schiene? 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 0 ;13-14 RETLW 0 ; RETLW 1 ; 1 RETLW 1 ; 2 RETLW 2 ; 3 RETLW 2 ; 4 RETLW 3 ; 5 RETLW 3 ; 6 RETLW 4 ; 7 RETLW 5 ; 8 RETLW 6 ; 9 RETLW 8 ; 10 RETLW 10 ; 11 RETLW 12 ; 12 RETLW 14 ; 13 RETLW 17 ; 14 RETLW 20 ; 15 RETLW 24 ; 16 RETLW 29 ; 17 RETLW 34 ; 18 RETLW 40 ; 19 RETLW 47 ; 20 RETLW 56 ; 21 RETLW 65 ; 22 RETLW 75 ; 23 RETLW 87 ; 24 RETLW 102 ; 25 RETLW 118 ; 26 RETLW 140 ; 27 RETLW 170 ; 28 RETLW 210 ; 29 RETLW 250 ; 30 SPDTAB1 MOVF IST,0 ;11 ADDWF PC ;12 RETLW 0 ;13-14 RETLW 0 ; RETLW 1 ; 1 RETLW 2 ; 2 RETLW 3 ; 3 RETLW 4 ; 4 RETLW 5 ; 5 RETLW 6 ; 6 RETLW 7 ; 7 RETLW 8 ; 8 RETLW 9 ; 9 RETLW 10 ; 10 RETLW 11 ; 11 RETLW 12 ; 12 RETLW 13 ; 13 RETLW 14 ; 14 RETLW 15 ; 15 RETLW 16 ; 16 RETLW 17 ; 17 RETLW 18 ; 18 RETLW 19 ; 19 RETLW 20 ; 20 RETLW 21 ; 21 RETLW 22 ; 22 RETLW 23 ; 23 RETLW 24 ; 24 RETLW 25 ; 25 RETLW 26 ; 26 RETLW 27 ; 27 RETLW 28 ; 28 RETLW 29 ; 29 RETLW 30 ; 30 ;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ INC DECFSZ Z1,1 ; 28 GOTO MOTOR ; 29-30 BSF GPIO,0 ; 30 BSF GPIO,1 ; 31 MOVF IST,0 ; 32 BTFSC STATUS,ZERO ; STOP 33 CLRF Z1 ; 34 BTFSC STATUS,ZERO ; STOP 35 INCF Z1,1 ; 36 NOP ; 37 NOP ; 38 NOP ; 39 RETLW 0 ; 40-41 MOTOR MOVF Z1,0 ; 31 SUBWF Z1LOG,0 ; 32 BTFSC BEFEHL,DIR ; BTFSC Vorwärts <-> Rückwärts 33 GOTO REVERSE ; 34-35 NOP ; 35 BTFSC STATUS,CARRY ; 36 BCF GPIO,0 ; Z1LOG >= Z1 37 BTFSS STATUS,CARRY ; 38 BSF GPIO,0 ; Z1LOG < Z1 39 RETLW 0 ; 40-41 REVERSE BTFSC STATUS,CARRY ; 36 BCF GPIO,1 ; Z1LOG >= Z1 37 BTFSS STATUS,CARRY ; 38 BSF GPIO,1 ; Z1LOG < Z1 39 RETLW 0 ; 40-41 STEP INCFSZ tmr0,0 ;ISO 25 GOTO INC ; 26-27 MOVLW DELAY ; 27 MOVWF tmr0 ; 28 MOVF SOLL,0 ; 29 SUBWF IST,0 ; 30 BTFSC STATUS,ZERO ; 31 GOTO EQUAL ; Geschwindigkeit gleich 32-33 BTFSC STATUS,CARRY ; 33 DECF IST,1 ; 34 BTFSS STATUS,CARRY ; 35 INCF IST,1 ; 36 NOP ; 37 NOP ; 38 NOP ; 39 RETLW 0 ; 40-41 EQUAL NOP ; 34 NOP ; 35 NOP ; 36 NOP ; 37 NOP ; 38 NOP ; 39 RETLW 0 ; 40-41 ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 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,1 ; LO+1 8 ;vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv BTFSC BEFEHL,DIR ;<- 9 CALL SPDTAB ; 10-11 BTFSS BEFEHL,DIR ;<- 11 16 CALL SPDTAB1 ; 12-13 17 MOVWF Z1LOG ; 18 ; BTFSS FLAG,1 ;<- 9 ; CALL SPDTAB ; 10-11 ; BTFSC FLAG,1 ;<- 11 16 ; CALL SPDTAB1 ; 12-13 17 ; MOVWF Z1LOG ; 18 ;------------- BCF STATUS,CARRY ; 19 BTFSC FLAG,1 ; wenn F1 20 RRF Z1LOG,1 ; dann 1/2 Fahrstufe 21 CLRWDT ; 22 ; MOVF HI,0 ; 19 ; ADDWF LO,0 ; 20 ; BTFSC STATUS,CARRY ; 21 ; GOTO ANALOG ; > 10000uS 22-23 ;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 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,1 ; HI+1 8 ;vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv DECF BEFEHL,0 ; 9 ANDLW 00001111b ; <- 14 Fahrstufen 10 BTFSC STATUS,ZERO ; NOTHALT 11 CLRF Z1 ; 12 BTFSC STATUS,ZERO ; NOTHALT 13 INCF Z1 ; 14 ;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ NOP ; 15 NOP ; 16 NOP ; 17 NOP ; 18 NOP ; 19 NOP ; 20 NOP ; 21 CLRWDT ; 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 MOVLW 00001000b ; GP3 input, rest output 21 TRIS GPIO ; set port GPIO 22 CALL STEP ; 23-24 MOVLW 6 ; 42 SUBWF FSR,0 ; 43 BTFSS STATUS,ZERO ; 1 GOTO EXOR3 ; 3 BYTE Befehl 2-3 MOVLW 7 ; 3 SUBWF FSR,0 ; 4 BTFSS STATUS,ZERO ; 5 GOTO EXOR4 ; 4 BYTE Befehl 6-7 MOVLW 8 ; 7 SUBWF FSR,0 ; 8 BTFSC STATUS,ZERO ; 9 GOTO EXOR5 ; 5 BYTE Befehl 10-11 MOVLW 9 ; 11 SUBWF FSR,0 ; 12 BTFSC STATUS,ZERO ; 13 GOTO EXOR6 ; 6 BYTE Befehl 14-15 GOTO START17 ; 15-16 ;-------------------------------------------------------------------- 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 ; <- 14 Fahrstufen 8 MOVWF SOLL ; 9 NOP ; 10 NOP ; 11 NOP ; 12 NOP ; 13 NOP ; 14 CLRF NOADR ; 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 BTFSC STATUS,ZERO ; 19 GOTO BEXIT ; Adresse gleich 20-21 DECFSZ NOADR ; 21 GOTO START22 ; 22 GOTO BEGIN ; kein blip 23-24 ; GOTO ANALOG ; 255 * keine Adresse 23-24 BEXIT NOP ; 22 CALL STEP ; 23-24 GOTO BCASTBK ; 42-43 ;-------------------------------------------------------------------- EXOR4 GOTO START10 ; 8-9 ;-------------------------------------------------------------------- EXOR5 GOTO START14 ; 12-13 ;-------------------------------------------------------------------- EXOR6 GOTO START18 ; 16-17 ;-------------------------------------------------------------------- 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