; stepper.ASM
; Version: 0        Date: 31. May 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
; 2 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
;--------------------------------------------------------------------
;********************************************************************
; STEPPER zum Ansteuern von Steppermotoren mit zwei Wicklungen
; nach NMRA-Norm - 14 Fahrstufen (intern 30)
; Max 2000 U/min - SPDTAB und Z2TAB in SPEED.XLS Arbeitsblatt
;
; letzte Änderung 31.05.98
;
;********************************************************************
        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        85                ; 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

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        00001000b        ; GP3 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        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

;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

STEP        INCFSZ        Z1,0                ;                                25
        GOTO        ISO                ;                                26-27
        MOVF        Z1LOG,0                ;                                27
        MOVWF        Z1                ;                                28
        NOP                        ;                                29
        NOP                        ;                                30
        CLRW                        ; <--  ab hier wird der         31
        BTFSC        BEFEHL,DIR        ;      Stepper angesteuert        32
        IORLW        00001000b        ; W,3                                33
        BTFSC        GPIO,0                ;                                34
        IORLW        00000010b        ; W,1                                35
        BTFSC        GPIO,1                ;                                36
        IORLW        00000100b        ; W,2                                37
        ADDWF        PC                ; DIR GP1 GP0                        38
        BSF        GPIO,0                ;  0   0   0                        39
        RETLW        0                ;                                40-41
        BSF        GPIO,1                ;  0   0   1
        RETLW        0                ;
        BCF        GPIO,1                ;  0   1   0
        RETLW        0                ;
        BCF        GPIO,0                ;  0   1   1
        RETLW        0                ;
        BSF        GPIO,1                ;  1   0   0
        RETLW        0                ;
        BCF        GPIO,0                ;  1   0   1
        RETLW        0                ;
        BSF        GPIO,0                ;  1   1   0
        RETLW        0                ;
        BCF        GPIO,1                ;  1   1   1
        RETLW        0                ; *********** Ende Stepper *******

ISO        INCFSZ        tmr0,0                ;                                28
        GOTO        INC                ;                                29-30
        MOVLW        DELAY                ;                                30
        MOVWF        tmr0                ;                                31
        MOVF        SOLL,0                ;                                32
        SUBWF        IST,0                ;                                33
        BTFSC        STATUS,ZERO        ;                                34
        GOTO        EQUAL                ; Geschwindigkeit gleich        35-36
        BTFSC        STATUS,CARRY        ;                                36
        DECF        IST,1                ;                                37
        BTFSS        STATUS,CARRY        ;                                38
        INCF        IST,1                ;                                39
        RETLW        0                ;                                40-41

EQUAL        NOP                        ;                                 37
        NOP                        ;                                38
        NOP                        ;                                39
        RETLW        0                ;                                40-41

INC        NOP                        ;                                31
        NOP                        ;                                32
        DECFSZ        Z2,1                ;                                33
        GOTO        INCEXIT                ;                                34-35
        INCF        Z1,1                ;                                35
        MOVF        Z2LOG,0                ;                                36
        MOVWF        Z2                ;                                37
        BTFSC        FUNK,7                ;                                38
        RLF        Z2,1                ; *2                                39
        RETLW        0                ;                                40-41

INCEXIT        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                ; LO+1                                8

;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

;vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
        MOVF        IST                ;                                9
        BTFSC        STATUS,ZERO        ; STOP                                10
        CLRF        Z1                ;                                11
;--------------------------------------
        DECF        BEFEHL,0        ;                                12
        ANDLW        00001111b        ; <- 14 Fahrstufen                13
        BTFSC        STATUS,ZERO        ; NOTHALT                        14
        CLRF        Z1                ;                                15
;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
        NOP                        ;                                16
        NOP                        ;                                17
        NOP                        ;                                18
        NOP                        ;                                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>L<SSSS        Arnold Digital        16
        GOTO        NOLIGHT                ;                                17-18
        BTFSC        BT2,5                ; 01>D<LSSSS                        18
        GOTO        FLIGHT                ;                Front Light        19-20
        GOTO        BLIGHT                ;                 Back Light        20-21
;^^^^^^^^^^^^^^^^^^^^^^^^ Arnold Digital ^^^^^^^^^^^^^^^^^^^^^^^^^^^^

FTION        BTFSC        BT2,6                ;                                4
        GOTO        START7                ; 11                                5-6
        BTFSC        BT2,5                ; 10                                6
        GOTO        FTION1                ; 101                                7-8

        BTFSS        BT2,0                ; F0 off                        8
        BCF        GPIO,2                ;                                9
        BTFSC        BT2,0                ; F0 on                                10
        BSF        GPIO,2                ;                                11

        BTFSS        BT2,1                ; F1 off                        12
        BCF        FUNK,7                ;                                13
        BTFSC        BT2,1                ; F1 on                                14
        BSF        FUNK,7                ;                                15

        BTFSS        BT2,4                ; 100>L<FFFF                        16
        GOTO        NOLIGHT                ;                                17-18
        BTFSC        BEFEHL,5        ; 01>D<LSSSS                        18
        GOTO        FLIGHT                ;                Front Light        19-20
        GOTO        BLIGHT                ;                 Back Light        20-21

FLIGHT        BSF        GPIO,4                ;                                21
        BCF        GPIO,5                ;                                22
        CALL        STEP                ;                                23-24
        GOTO        START1                ;                                42-43

BLIGHT        BCF        GPIO,4                ;                                22
        CALL        STEP                ;                                23-24
        BSF        GPIO,5                ;                                42-43
        GOTO        START3                ;                                1-2

NOLIGHT        BCF        GPIO,4                ;                                19
        BCF        GPIO,5                ;                                20
        NOP                        ;                                21
        NOP                        ;                                22
        CALL        STEP                ;                                23-24
        GOTO        START1                ;                                42-43

;---------
FTION1        BTFSS        BT2,4                ;                                9
        GOTO        START12                ; 1010                                10-11
        BTFSC        BT2,0                ; 1011FFF>F<        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