; motor_28.ASM - only 28 speed step with 20kHz PWM, no additional speed modifications ; Version: 2 Date: 03 March 2002 ; Copyright (C) 1999 Georg Ziegler ; Calibration routine changed ; information about OSCCAL in pdf file rong!! ; linear speed increase if OSCCAL increment! ; BTFSS PC_OFFSET,EE_OK ;(BTFSC STATUS,ZERO) ERROR? ; NMRA-DCC decoder for core less motors based on PIC12CE519 with si9986 H-Bridge ; >18kHz PWM and 28us timestep for polling of DCC signal ; 14/28 speed step ; direct, paged and register mode programming ; EEPROM read/write routine from MICROCHIP PIC12CE519 documentation ; 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 ;-------------------------------------------------------------------- ; 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 ;-------------------------------------------------------------------- LIST P=12CE519, R=DEC INCLUDE __CONFIG _MCLRE_OFF & _CP_OFF & _WDT_ON & _IntRC_OSC ;-------------------------------------------------------------------- #DEFINE DCCIN 3 ; DCC input pin (GPIO,3 only input) #DEFINE MOTOR1 00000001b ; motor #DEFINE MOTOR2 00000010b ; output #DEFINE LIGHT1 4 ; light #DEFINE LIGHT2 5 ; output #DEFINE LED 2 ; redlight, flickering firebox ;-------------------------------------------------------------------- CV8 EQU 0x0D ; Home Made Decoder CV7 EQU 2 ; Version No. XX00 0000 ;-------------------------------------------------------------------- INDF EQU 0x00 ; indirect adressing tmr0 EQU 0x01 PC EQU 0x02 STATUS EQU 0x03 ; Status Register FSR EQU 0x04 ; OSCCAL EQU 0x05 GPIO EQU 0x06 ; ;-------------------------------------------------------------------- GPIOOUT EQU 0x07 ; 0=DIR 1=CONSIST 2=STEPOK/NOCV 5=FS126 6=BITHI 7=FLAG CONFIG EQU 0x08 ; SOLL EQU 0x09 ; speed to go BT1 EQU 0x0A ; FSR auf 0x09 BT2 EQU 0x0B ; BT3 EQU 0x0C ; BT4 EQU 0x0D ; BT5 EQU 0x0E ; BT6 EQU 0x0F ; FSR auf 0x10 ;-------------------- ; EQU 0x10 ; ; EQU 0x11 ; ACC EQU 0x12 ; DEC EQU 0x13 ; PWM_ON EQU 0x14 ; PWM EQU 0x15 ; PWM1 EQU 0x16 ; PWM2 EQU 0x17 ; XOR EQU 0x18 ; NOADR EQU 0x19 ; ; EQU 0x1A ; F1F8SET EQU 0x1B ; ; EQU 0x1C ; PRE EQU 0x1D ; Preample 12 BIT LO EQU 0x1E ; low bit counter HI EQU 0x1F ; hi bit counter ;-------------------- CV1 EQU 0x30 ; Primary Adress CV2 EQU 0x31 ; Vstart CV3 EQU 0x32 ; Acceleration Rate CV4 EQU 0x33 ; Deceleration Rate CV29 EQU 0x34 ; 0=DIR 1=14/28 2=PWRSRC 3=ADVACK 4=SPDTAB 5=LADRE 6= 7=ACCDEC MAPCV EQU 0x35 ; rom CV's copied to here CV5 EQU 0x36 ; Vhigh CV6 EQU 0x37 ; Vmid CV17 EQU 0x38 ; Extended Adress Low Byte CV18 EQU 0x39 ; Extended Adress High Byte CV19 EQU 0x3A ; Consist Adress CV49 EQU 0x3B ; Output F1-F8 to GP2 (CV49-64) CV50 EQU 0x3C ; reserved for FL/RL to map F1-8 CV51 EQU 0x3D ; space (page register) CV55 EQU 0x3E ; Vmax 2 CV64 EQU 0x3F ; configuration byte ;-------------------- #DEFINE FLOFF CV64,0 ; front light switch with cv50 (GP4) #DEFINE RANGIER CV64,0 ; low activ, mapped with FLOFF #DEFINE BLOFF CV64,1 ; back light switch with cv51 (GP5) #DEFINE SPEED2 CV64,1 ; low activ, mapped with BLOFF #DEFINE RDLTON CV64,2 ; red light on (back light) #DEFINE BRKON CV64,3 ; brake light on #DEFINE HI2LOFS CV64,4 ; convert 126FS to 28FS with Vmin/Vmid/Vmax #DEFINE FLACKON CV64,5 ; flickering firebox #DEFINE LITAUTO CV64,6 ; firebox open/close automatically #DEFINE REDLT CV64,7 ; is set by program ;--------------------- CARRY EQU 0 ZERO EQU 2 SEITE EQU 5 #DEFINE DIR CONFIG,0 ; #DEFINE CONSIST CONFIG,1 ; #DEFINE STEPOK? CONFIG,2 ; #DEFINE NOCV CONFIG,2 ; is mapped with STEPOK? #DEFINE ROMCV CONFIG,3 ; is mapped with FLACKER #DEFINE FLACKER CONFIG,3 ; #DEFINE BRAKE CONFIG,4 ; #DEFINE FS126 CONFIG,5 ; #DEFINE BITHI CONFIG,6 ; #DEFINE FLAGS2 CONFIG,7 ; #DEFINE LITOPEN FLAG,6 ; for lit open/close (copy from CV64) #DEFINE DIRINV CV29,0 ; direction inverted (+light) #DEFINE FS28 CV29,1 ; 14/28 speed step #DEFINE LIINV CV29,2 ; light inverted (PWRSRC never used) #DEFINE STAB CV29,4 ; speedtab / CV2,CV5&CV6 #DEFINE LADRE CV29,5 ; long adress enable #DEFINE PROGBIT CV29,6 ; #DEFINE PROGBT1 CV29,7 ; #DEFINE ACKBIT STATUS,6 ; never overwriten ;-------------------------------------------------------------------- ORG 0 ; Reset Vector INIT MOVLW 00000000b ; start value (information about OSCCAL in pdf file rong!! linear speed increase!) MOVWF OSCCAL ; write calibration value MOVLW 11010001b ; no wakeup, no pullup, T0 int., hightolow, T0, 1:4 OPTION ;..................................................................... CALI BTFSS GPIO,DCCIN ;----------------- GOTO CALI ; Anfang CALI1 BTFSC GPIO,DCCIN ; finden GOTO CALI1 ;----------------- CLRF tmr0 ; Timer auf 0 CALI2 BTFSS GPIO,DCCIN ; GOTO CALI2 ;----------------- MOVF tmr0,0 ; Timer MOVWF BT5 ; sichern MOVLW 34 ;----------------- SUBWF BT5,0 ; LOW BTFSC STATUS,CARRY ; BIT GOTO CALI ;----------------- MOVLW 30 ; <- Schleife + 2 SUBWF BT5,0 ; BTFSC STATUS,CARRY ; Hi BIT > 28? GOTO CALEX ;----------------- MOVLW 00001000b ; ADDWF OSCCAL,1 ; GOTO CALI ;----------------- ;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ; ----------------------------------- CALEX COMF XOR,0 ; inverted stored for reset conditions (all zero) XORWF SOLL,0 ; for brown out to start XORWF GPIOOUT,0 ; with same speed BTFSC STATUS,ZERO ; all Bytes ok? GOTO START ; ----------------------------------- CLRF LO ; CLRF HI ; CLRF GPIOOUT ; CLRF PWM ; CLRF PWM1 ; CLRF PWM2 ; CLRF CONFIG ; test ; EEPROM ............................................................ LOADREG MOVLW 0x30 ; MOVWF FSR ; Pointer for indirect Adressing CLRF EEADDR ; EEREAD BSF STATUS,SEITE ; set to 200H begin EEPROM CALL READ_RANDOM ; BCF STATUS,SEITE ; auf ROM seite 0 BTFSS PC_OFFSET,EE_OK ;(BTFSC STATUS,ZERO) ERROR? GOTO EEREAD ; MOVF EEDATA,0 ; MOVWF INDF ; MOVLW 0x3F ; XORWF FSR,0 ; ANDLW 00111111b ; BTFSC STATUS,ZERO ; GOTO EEEXIT ; INCF FSR,1 ; INCF EEADDR ; GOTO EEREAD ; EEEXIT MOVF CV3,0 ; BTFSC STATUS,ZERO ; IORLW 1 ; XORLW 0xFF ; complement W BCF FSR,5 ; rampage back to 0x10.. MOVWF ACC ; BSF FSR,5 ; rampage to 0x30.. MOVF CV4,0 ; BTFSC STATUS,ZERO ; IORLW 1 ; XORLW 0xFF ; complement W BCF FSR,5 ; rampage back to 0x10.. MOVWF DEC ; ;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ;SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS ANALOG MOVLW 00111111b ; all Input TRIS GPIO ; tristate port GPIO START MOVLW 0xFF ; 15 MOVWF BT4 ; 16 MOVWF BT5 ; 17 MOVWF BT6 ; 18 ;.PWM2................................................................ MOVF PWM2,0 ; 19 MOVWF GPIO ; 20 ;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ CLRF HI ; 21 CLRWDT ; WatchDog Timer zurücksetzen 22 MOVLW 0x09 ; Pointer für ind. Adressierung 23 MOVWF FSR ; 24 MOVLW 11 ; 25 MOVWF PRE ; PRE auf 10 Bit für Preample 26 ;------------- INTEST CALL IN ; 27-28 BTFSC STEPOK? ; 4. GOTO STEPOK ; 5.-6 ;...................................................................... #INCLUDE PWM.INC ; 6-28 ;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ BTFSC GPIO,DCCIN ; ########### input ########## 1 (29) BSF BITHI ; 2-3 GOTO $+1 ; 3-4 GOTO $+1 ; 5-6 STEPOK NOP ; 7 MOVLW 11111100b ; FF-03 8 MOVF HI,1 ; 9 BTFSC STATUS,ZERO ; 0? 10 GOTO LOWBIT ; low half of bit 11-12 ADDWF HI,1 ; BIT im Carry 12 CLRF HI ; 13 DECFSZ PRE,1 ; Pre=0? 14 GOTO PRETEST ; 15-16 NOP ; 16 NOP ; 17 NOP ; 18 ;.PWM2................................................................ MOVF PWM2,0 ; 19 MOVWF GPIO ; 20 ;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ BTFSC STATUS,CARRY ; warte auf 0 21 GOTO BYTE ; Preample erfüllt! 22-23 BCF STEPOK? ; 23 INCF PRE,1 ; 24 PREBACK GOTO INTEST ; nächstes Bit 25-26 PRETEST NOP ; 17 NOP ; 18 ;.PWM2................................................................ MOVF PWM2,0 ; 19 MOVWF GPIO ; 20 ;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ NOP ; 21 BTFSS STATUS,CARRY ; 22 GOTO PREBACK ; 23-24 GOTO START26 ; Preample nicht erfüllt! 24-25 LOWBIT NOP ; 13 NOP ; 14 NOP ; 15 NOP ; 16 BTFSC BITHI ; 17 INCF HI ; 18 ;.PWM2................................................................ MOVF PWM2,0 ; 19 MOVWF GPIO ; 20 ;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ NOP ; 21 BCF BITHI ; 22 NOP ; 23 INCFSZ LO,1 ; 24 GOTO INTEST ; 25-26 GOTO ANALOG ; >10000uS 26 PWMTAB ;.............................................................. #INCLUDE PWM.INC ; 6-28 RETLW 0 ; 1-2 ;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ IN BTFSS GPIO,DCCIN ; ########### input ########## 1. (29) RETLW 0 ; 2.-3. INCF HI ; 3. CLRF LO ; 4. BSF STEPOK? ; 5. ;...................................................................... #INCLUDE PWM.INC ; 6-28 ;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ BTFSS GPIO,DCCIN ; ########### input ########## 1 (29) RETLW 0 ; FF-03 2-3 INCF HI ; 3 NOP ; ----------------------------- 4 MOVF GPIOOUT,0 ; for brown out 5 XORWF SOLL,0 ; to start with 6 MOVWF XOR ; same speed 7 COMF XOR,1 ; ----------------------------- 8 NOP ; 9 NOP ; 10 NOP ; 11 NOP ; 12 NOP ; 13 NOP ; 14 NOP ; 15 NOP ; 16 NOP ; 17 NOP ; 18 ;.PWM2................................................................ MOVF PWM2,0 ; 19 MOVWF GPIO ; 20 ;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ NOP ; 21 NOP ; 22 NOP ; 23 NOP ; 24 BCF STEPOK? ; 25 INCFSZ HI,0 ; 26 GOTO IN ; 27-28 GOTO ANALOG ; 28-1 ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ;..................................................................... NEXT RLF INDF,1 ; 1.Byte zusammenbauen 17 NOP ; 18 ;.PWM2................................................................ MOVF PWM2,0 ; 19 MOVWF GPIO ; 20 ;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ NOP ; 21 NOP ; 22 NOP ; 23 BCF STEPOK? ; 24 GOTO INTEST1 ; nächstes Bit 25-26 ;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ LOWBIT1 MOVLW 0x10 ; ----------------------------- 13 SUBWF FSR,0 ; 14 ANDLW 00000111b ; mehr als 6 BYTE gelesen 15 BTFSC STATUS,ZERO ; neu beginnen! 16 GOTO START19 ; ----------------------------- 17-18 BCF STEPOK? ; 18 ;.PWM2................................................................ MOVF PWM2,0 ; 19 MOVWF GPIO ; 20 ;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ BTFSC BITHI ; 21 INCF HI ; 22 BCF BITHI ; 23 INCFSZ LO,1 ; 24 GOTO INTEST1 ; 25-26 GOTO ANALOG ; 26-27 BYTE MOVLW 9 ; PRE auf 8 Bit für 1.Byte 24 MOVWF PRE ; 25 INCF FSR,1 ; Pointer für ind. Adressierung 26 INTEST1 CALL IN ; 27-28 BTFSC STEPOK? ; 4. GOTO STEPOK1 ; 5.-6 ;...................................................................... #INCLUDE PWM.INC ; 6-28 ;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ BTFSC GPIO,DCCIN ; ########### input ########## 1 (29) BSF BITHI ; 2 NOP ; 3 NOP ; 4 NOP ; 5 NOP ; 6 STEPOK1 NOP ; 7 MOVLW 11111100b ; FF-03 8 MOVF HI,1 ; 9 BTFSC STATUS,ZERO ; 0? 10 GOTO LOWBIT1 ; low half of bit 11-12 ADDWF HI,1 ; BIT im Carry 12 CLRF HI ; 13 DECFSZ PRE,1 ; Pre=0? 14 GOTO NEXT ; 15-16 NOP ; 16 NOP ; 17 NOP ; 18 ;.PWM2................................................................ MOVF PWM2,0 ; 19 MOVWF GPIO ; 20 ;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ BTFSC STATUS,CARRY ; 21 GOTO BYTE ; 9.Bit=0 22-23 COMF BT1,1 ; 9.Bit=1 (BYTE invertieren) 23 COMF BT2,1 ; (BYTE invertieren) 24 COMF BT3,1 ; (BYTE invertieren) 25 COMF BT4,1 ; (BYTE invertieren) 26 COMF BT5,1 ; (BYTE invertieren) 27 COMF BT6,1 ; (BYTE invertieren) 28 MOVLW (1<27 13 GOTO PWM28 ; 14-15 GOTO $+1 ; 15-16 GOTO $+1 ; 17-18 ;.PWM2................................................................ MOVF PWM2,0 ; 19 MOVWF GPIO ; 20 ;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ MOVF GPIOOUT,0 ;......PWM.....PWM1....PWM2.....21 MOVWF PWM1 ; ON 22 MOVWF PWM2 ; ON 23 IORLW (MOTOR1|MOTOR2) ; 24 MOVWF PWM ; OFF 25 NOP ;011____________________________26 GOTO EXOR ; 27-28 ;--------------------------------------------------------------------- PWM1_19 MOVLW 00001101b ; (10+3) 8 SUBWF SOLL,0 ; 9 BTFSS STATUS,CARRY ; <10 10 GOTO PWM1_9 ; 11-12 BTFSC STATUS,ZERO ; 12 GOTO PWM10 ; 13-14 MOVWF PWM_ON ; timer 14 DECF PWM_ON ; 15 GOTO $+1 ; 16-17 NOP ; 18 ;.PWM2................................................................ MOVF PWM2,0 ; 19 MOVWF GPIO ; 20 ;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ MOVF GPIOOUT,0 ;......PWM.....PWM1....PWM2.....21 MOVWF PWM ; ON 22 MOVWF PWM1 ; ON 23 IORLW (MOTOR1|MOTOR2) ; 24 MOVWF PWM2 ; OFF 25 NOP ;110____________________________26 GOTO EXOR ; 27-28 ;--------------------------------------------------------------------- PWM1_9 MOVLW 00000011b ; (1+2) 13 SUBWF SOLL,0 ; 14 BTFSS STATUS,CARRY ; 15 GOTO STOP ; 16-17 MOVWF PWM_ON ; timer 17 NOP ; 18 ;.PWM2................................................................ MOVF PWM2,0 ; 19 MOVWF GPIO ; 20 ;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ MOVF GPIOOUT,0 ;......PWM.....PWM1....PWM2.....21 MOVWF PWM ; ON 22 IORLW (MOTOR1|MOTOR2) ; 23 MOVWF PWM1 ; OFF 24 MOVWF PWM2 ; OFF 25 NOP ;100____________________________26 GOTO EXOR ; 27-28 ;--------------------------------------------------------------------- PWM10 GOTO $+1 ; 15-16 GOTO $+1 ; 17-18 ;.PWM2................................................................ MOVF PWM2,0 ; 19 MOVWF GPIO ; 20 ;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ MOVF GPIOOUT,0 ;......PWM.....PWM1....PWM2.....21 MOVWF PWM1 ; ON 22 IORLW (MOTOR1|MOTOR2) ; 23 MOVWF PWM ; OFF 24 MOVWF PWM2 ; OFF 25 NOP ;100____________________________26 GOTO EXOR ; 27-28 ;--------------------------------------------------------------------- PWM28 NOP ; 16 GOTO $+1 ; 17-18 ;.PWM2................................................................ MOVF PWM2,0 ; 19 MOVWF GPIO ; 20 ;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ MOVF GPIOOUT,0 ;......PWM.....PWM1....PWM2.....21 MOVWF PWM ; ON 22 MOVWF PWM1 ; ON 23 MOVWF PWM2 ; ON 24 GOTO $+1 ;111____________________________25-26 GOTO EXOR ; 27-28 ;--------------------------------------------------------------------- STOP NOP ; 18 ;.PWM2................................................................ MOVF PWM2,0 ; 19 MOVWF GPIO ; 20 ;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ MOVF GPIOOUT,0 ;......PWM.....PWM1....PWM2.....21 BTFSS SOLL,1 ; 22 IORLW (MOTOR1|MOTOR2) ; <-STOP 23 BTFSC SOLL,1 ; 24 ANDLW (255-(MOTOR1|MOTOR2)) ;11111100b ; <-BREAK 25 MOVWF PWM ; OFF 26 MOVWF PWM1 ; OFF 27 MOVWF PWM2 ; OFF 28 ;000____________________________ ;--------------------------------------------------------------------- EXOR NOP ; 1. GOTO $+1 ; 2.-3. ;..................................................................... CALL PWMTAB ; 4.-2 ;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ MOVF BT1,0 ; 3 XORWF BT2,0 ; 4 XORWF BT3,0 ; 5 XORWF BT4,0 ; 6 XORWF BT5,0 ; 7 XORWF BT6,0 ; 8 BTFSS STATUS,ZERO ; all Bytes ok? 9 GOTO START12 ; 10-11 DECF FSR,1 ; auf vorletztes Byte 11 GOTO $+1 ; 12-13 GOTO $+1 ; 14-15 GOTO $+1 ; 16-17 NOP ; 18 ;.PWM2................................................................ MOVF PWM2,0 ; 19 MOVWF GPIO ; 20 ;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ;-------------------------------- wait for PWM ----------------------- MOVLW 3 ; 21 MOVWF BT6 ; help register 22 LOOP2 DECFSZ BT6,1 ; 23 26 1. GOTO LOOP2 ; 24-25 27-28 2. NOP ; 3. ;..................................................................... CALL PWMTAB ; 4.-2 ;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ;.................................................................... CV BSF FSR,5 ; rampage to 0x30.. 3 ;-------------------------------- MOVF BT1,0 ; 4 BTFSS BT1,7 ; >0= 120 (120=CV1 121=CV2 ...) BTFSS STATUS,ZERO ; GOTO START ; BSF STATUS,SEITE ; GOTO PROG ; register mode (CV1-CV8) ;-------------------------------- SHORTA BTFSC STATUS,ZERO ; address = 0 8 GOTO BCAST ; 9-10 BTFSS LADRE ; long Adress enabled? 10 XORWF CV1,0 ; 11 BTFSC STATUS,ZERO ; 12 GOTO OVER ; 13-14 MOVF CV19,0 ; 14 ANDLW 0 ;01111111b ; bugfix: cv19 deactivated !!! 15 BCF CONSIST ; 16 BTFSS STATUS,ZERO ; 17 BSF CONSIST ; 18 XORWF BT1,0 ; consist? 19 BCBCK BTFSS STATUS,ZERO ; 20 GOTO CHKPROG ; 21-22 MOVLW 0x2B ; BT2 + FSR,5 22 MOVWF FSR ; to 2. byte 23 CVNEXT BCF FSR,5 ; 24 ;.PWM2................................................................ MOVF PWM2,0 ; 19 MOVWF GPIO ; 20 ;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ BSF FSR,5 ; rampage to 0x30.. 21 BSF STATUS,SEITE ; 22 GOTO DECOD ; 23-24 ;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ;..................................................................... START1. NOP ; 1. START2. NOP ; 2. START3. NOP ; 3. ;..................................................................... START4. CALL PWMTAB ; 4.-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 NOP ; 14 START15 NOP ; 15 START16 NOP ; 16 START17 GOTO START ; 17 START18 BCF FSR,5 ; 18 ;PWM2 ................................................................ START19 MOVF PWM2,0 ; 19 MOVWF GPIO ; 20 ;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ;..................................................................... START21 NOP ; 21 INCF NOADR ; for IB with M* 22 BTFSS NOADR,7 ; counts if no 23 GOTO START26 ; DCC signal is 24 GOTO INIT ; readable 25 ;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ START26 NOP ; 26 START27 GOTO START1. ; 27-28 ;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ;******************************************************************* ORG 0200h TITLE "PIC with EEPROM Data Memory Interface" LIST P=12CE519 SCL EQU 0x07 ; EEPROM Clock, SCL (I/O bit 7) SDA EQU 0x06 ; EEPROM Data, SDA (I/O bit 6) OK EQU 1 NO EQU 0 EE_OK EQU 7 ; Bit 7 in PC_OFFSET used as OK flag for EE PC_OFFSET EQU 0x35 ; PC offset register (low order 4 bits), ; value based on operating mode of EEPROM. ; Also, bit 7 used for EE_OK flag COUNTER EQU 0x08 ; Bit counter for serial transfer EEBYTE EQU 0x09 ; Byte sent to or received from ; EEPROM (control, address, or data) EEADDR EQU 0x0A ; EEPROM Address EEDATA EQU 0x0F ; EEPROM Data ;********************** Set up EEPROM control bytes ************************ READ_CURRENT MOVLW B'10000100' ; PC offset for read current addr. EE_OK bit7='1' MOVWF PC_OFFSET ; Load PC offset GOTO INIT_READ_CONTROL WRITE_BYTE MOVLW B'10000000' ; PC offset for write byte. EE_OK: bit7 = '1' GOTO INIT_WRITE_CONTROL READ_RANDOM MOVLW B'10000011' ; PC offset for read random. EE_OK: bit7 = '1' INIT_WRITE_CONTROL MOVWF PC_OFFSET ; Load PC offset register, value preset in W MOVLW B'10100000' ; Control byte with write bit, bit 0 = '0' START_BIT BCF GPIO,SDA ; Start bit, SDA and SCL preset to '1' ;******* Set up output data (control, address, or data) and counter ******** PREP_TRANSFER_BYTE MOVWF EEBYTE ; Byte to transfer to EEPROM already in W MOVLW 8 ; Counter to transfer 8 bits MOVWF COUNTER ;************ Clock out data (control, address, or data) byte ************ OUTPUT_BYTE BCF GPIO,SCL ; Set clock low during data set-up RLF EEBYTE,1 ; Rotate left, high order bit into carry bit BCF GPIO,SDA ; Set data low, if rotated carry bit is BTFSC STATUS,CARRY ;(SKPNC) a '1', then: BSF GPIO,SDA ; reset data pin to a one, otherwise leave low NOP NOP ; extra NOP NOP ; extra NOP BSF GPIO,SCL ; clock data into EEPROM DECFSZ COUNTER,1 ; Repeat until entire byte is sent GOTO OUTPUT_BYTE NOP ; Needed to meet Timing (Thigh=4000nS) NOP ; extra NOP NOP ; extra NOP ;************************** Acknowkedge Check ***************************** BCF GPIO,SCL ; Set SCL low, 0.5us < ack valid < 3us NOP ; Needed to meet Timing (Tlow= 4700nS) NOP ; extra NOP NOP ; extra NOP BSF GPIO,SDA NOP ; Necessary for SCL Tlow at low voltage, NOP ; extra NOP NOP ; extra NOP NOP ; Tlow=4700nS BSF GPIO,SCL ; Raise SCL, EEPROM acknowledge still valid BTFSC GPIO,SDA ; Check SDA for acknowledge (low) BCF PC_OFFSET,EE_OK ; If SDA not low (no ack), set error flag BCF GPIO,SCL ; Lower SCL, EEPROM release bus BTFSS PC_OFFSET,EE_OK ; If no error continue, else stop bit GOTO STOP_BIT ;***** Set up program counter offset, based on EEPROM operating mode ***** MOVF PC_OFFSET,0 ANDLW B'00001111' ADDWF PC GOTO INIT_ADDRESS ;PC offset=0, write control done, send address GOTO INIT_WRITE_DATA ;PC offset=1, write address done, send data GOTO STOP_BIT ;PC offset=2, write done, send stop bit GOTO INIT_ADDRESS ;PC offset=3, write control done, send address GOTO INIT_READ_CONTROL ;PC offset=4, send read control GOTO READ_BIT_COUNTER ;PC offset=5, set counter and read byte GOTO STOP_BIT ;PC offset=6, random read done, send stop ;********** Initalize EEPROM data (address, data, or control) bytes ****** INIT_ADDRESS INCF PC_OFFSET,1 ; Increment PC offset to 2 (write) or to 4 (read) MOVF EEADDR,W ; Put EEPROM address in W, ready to send to EEPROM GOTO PREP_TRANSFER_BYTE INIT_WRITE_DATA INCF PC_OFFSET,1 ; Increment PC offset to go to STOP_BIT next MOVF EEDATA,0 ; Put EEPROM data in W, ready to send to EEPROM GOTO PREP_TRANSFER_BYTE INIT_READ_CONTROL BSF GPIO,SCL ; Raise SCL NOP ; extra NOP NOP ; extra NOP BSF GPIO,SDA ; raise SDA INCF PC_OFFSET,1 ; Increment PC offset to go to READ_BIT_COUNTER next MOVLW B'10100001' ; Set up read control byte, ready to send to EEPROM GOTO START_BIT ; bit 0 = '1' for read operation ;************************** Read EEPROM data ***************************** READ_BIT_COUNTER BSF GPIO,SDA ; set data bit to 1 so we're not pulling bus down. NOP NOP ; extra NOP NOP ; extra NOP BSF GPIO,SCL MOVLW 8 ; Set counter so 8 bits will be read into EEDATA MOVWF COUNTER READ_BYTE BSF GPIO,SCL ; Raise SCL, SDA valid. SDA still input from ack SETC ; Assume bit to be read = 1 BTFSS GPIO,SDA ; Check if SDA = 1 BCF STATUS,CARRY ;(CLRC) if SDA not = 1 then clear carry bit RLF EEDATA,1 ; rotate carry bit (=SDA) into EEDATA; BCF GPIO,SCL ; Lower SCL bsf GPIO,SDA ; reset SDA DECFSZ COUNTER,1 ; Decrement counter GOTO READ_BYTE ; Read next bit if not finished reading byte BSF GPIO,SCL NOP NOP ; extra NOP NOP ; extra NOP BCF GPIO,SCL ;****************** Generate a STOP bit and RETURN *********************** STOP_BIT BCF GPIO,SDA ; SDA=0, on TRIS, to prepare for transition to '1' BSF GPIO,SCL ; SCL = 1 to prepare for STOP bit GOTO $+1 ; equivalent 4 NOPs neccessary for I2C spec Tsu:sto = 4.7us GOTO $+1 NOP ; extra NOP NOP ; extra NOP BSF GPIO,SDA ; Stop bit, SDA transition to '1' while SCL high BTFSS PC_OFFSET,EE_OK ; Check for error RETLW NO ; if error, send back NO RETLW OK ; if no error, send back OK ;************************ End EEPROM Subroutines ************************** ;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX ;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX ;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX ;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX ;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX ;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX ;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX ;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX PWMTAB1;.............................................................. BCF FSR,5 ; 5. #INCLUDE PWM.INC ; 6.-28 BSF FSR,5 ; 1 RETLW 0 ; 2-3 ;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ;..................................................................... DECOD SWAPF INDF,0 ; 25 MOVWF BT6 ; 26 RRF BT6,0 ; 27 ANDLW 00000111b ; 28 ADDWF PC ; 29 GOTO DECCON ; 000 1.-2. GOTO ADVAN ; 001 GOTO FORWARD ; 010 GOTO REVERSE ; 011 GOTO FTION ; 100 GOTO FTION1 ; 101 GOTO TELNEW ; 110 MOVF BT2,0 ;-------------------------------- XORLW 11111001b ; old acknowledge mode BTFSC STATUS,ZERO ; GOTO OLDACK ;-------------------------------- MOVF INDF,0 ; OTM mode -copy bytes MOVWF BT1 ; INCF FSR,1 ; MOVF INDF,0 ; CV to pogram MOVWF BT2 ; INCF FSR,1 ; DATA for cv MOVF INDF,0 ; INDF looks to data MOVWF BT3 ; GOTO PROGOTM ; 111 ;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ;..................................................................... BITMAN MOVWF FSR ; MOVLW 00000111b ; ANDWF BT3,0 ; CALL BITPOS ; BTFSS BT3,4 ; GOTO VBIT ; verify bit BTFSC BT3,3 ; IORWF INDF,1 ; set bit XORLW 0XFF ; BTFSS BT3,3 ; ANDWF INDF,1 ; clear bit MOVF FSR,0 ; EEADDR GOTO EEPROG ; write complete byte ;-------------------------------- VBIT ANDWF INDF,0 ; BTFSC STATUS,ZERO ; GOTO BITCLR ; NOP ; BITSET BTFSC BT3,3 ; GOTO ACKNOW ; =1 GOTO HOPP ; BITCLR BTFSS BT3,3 ; GOTO ACKNOW ; =0 GOTO HOPP ; ;-------------------------------- BITPOS ADDWF PC ; RETLW 00000001b ; 0 RETLW 00000010b ; 1 RETLW 00000100b ; 2 RETLW 00001000b ; 3 RETLW 00010000b ; 4 RETLW 00100000b ; 5 RETLW 01000000b ; 6 RETLW 10000000b ; 7 ;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ;..................................................................... DECCON BTFSC INDF,4 ; 000>0D< moved to carry ANDLW 00000111b ; ADDWF PC ; GOTO RESET ; 000 reset / hard reset GOTO HOPP ;FTEST ; 001 factory test instruction GOTO HOPP ; 010 GOTO HOPP ;ADVACK ; 011 advance acknowl. CV29,3 GOTO HOPP ; 100 GOTO HOPP ;ADVADR ; 101 advance adressing CV29,5 GOTO HOPP ; 110 GOTO HOPP ;ACKREQ ; 111 acknowledge request ;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ;..................................................................... LIGHT BTFSS INDF,4 ; 1 GOTO NOLIGHT ; 2-3 BTFSC DIR ; direction invert? 3 GOTO BLIGHT ; 4-5 NOP ; 5 FLIGHT BTFSC LIINV ; light invert? (PWRSRC) 6 GOTO BLI ; 7-8 FLI BSF GPIOOUT,LIGHT1 ; 8 BCF GPIOOUT,LIGHT2 ; 9 RETLW 0 ; 10-11 BLIGHT BTFSC LIINV ; light invert? (PWRSRC) 6 GOTO FLI ; 7-8 BLI BCF GPIOOUT,LIGHT1 ; 8 BSF GPIOOUT,LIGHT2 ; 9 RETLW 0 ; 10-11 NOLIGHT BCF GPIOOUT,LIGHT1 ; 4 BCF GPIOOUT,LIGHT2 ; 5 NOP ; 6 NOP ; 7 NOP ; 8 NOP ; 9 RETLW 0 ; 10-11 ;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ;.................................................................... FINDCV BCF NOCV ; BCF ROMCV ; XORLW (1-1) ; CV1 BTFSC STATUS,ZERO ; RETLW CV1 ; Primary Adress XORLW (1-1)^(17-1) ; CV17 BTFSC STATUS,ZERO ; RETLW CV17 ; Extended Adress Low Byte XORLW (17-1)^(18-1) ; CV18 BTFSC STATUS,ZERO ; RETLW CV18 ; Extended Adress High Byte XORLW (18-1)^(19-1) ; CV19 BTFSC STATUS,ZERO ; RETLW CV19 ; Consist Adress XORLW (19-1)^(29-1) ; CV29 BTFSC STATUS,ZERO ; RETLW CV29 ; 0=DIR 1=14/28 2=PWSRC 3=ADVACK 4=SPEEDTAB 5=LADRE 6= 7=ACCDEC XORLW (29-1)^(49-1) ; CV49 BTFSC STATUS,ZERO ; RETLW CV49 ; Output F1-F8 to GP2 XORLW (49-1)^(50-1) ; CV50 BTFSC STATUS,ZERO ; RETLW CV50 ; front light switch with F1-F8 XORLW (50-1)^(51-1) ; CV51 BTFSC STATUS,ZERO ; RETLW CV51 ; back light switch with F1-F8 XORLW (51-1)^(64-1) ; CV64 BTFSC STATUS,ZERO ; RETLW CV64 ; configuration byte BSF ROMCV ; XORLW (64-1)^(7-1) ; CV7 BTFSC STATUS,ZERO ; RETLW CV7 ; Version No XORLW (7-1)^(8-1) ; CV8 BTFSC STATUS,ZERO ; RETLW CV8 ; Manufacturer BCF ROMCV ; BSF NOCV ; RETLW 0xFF ; no CV's to program ;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ;.................................................................... PROG MOVF FSR,0 ; ANDLW 00001111b ; XORLW BT3 ; BTFSS STATUS,ZERO ; GOTO PROGREG ; 3 byte command PROGOTM MOVF BT2,0 ; CALL FINDCV ; BTFSC NOCV ; GOTO HOPP ; BTFSC ROMCV ; BTFSS BT1,3 ; write/verify bit GOTO ROMNEXT ; MOVWF MAPCV ; MOVLW MAPCV ; ROMNEXT BTFSS BT1,2 ; GOTO BITMAN ; bit manipulation BTFSS BT1,3 ; write/verify bit GOTO EEVERI ; ;-------------------------------- EEPROG ANDLW 00001111b ; MOVWF EEADDR ; READ CALL READ_RANDOM ; BTFSS PC_OFFSET,EE_OK ;(BTFSC STATUS,ZERO) ERROR? GOTO READ CLRF CONFIG MOVF INDF,0 ; XORWF EEDATA,0 ; BTFSC STATUS,ZERO ; BCF STATUS,SEITE ; auf ROM seite 0 BTFSC STATUS,ZERO ; GOTO LOADREG ; MOVF INDF,0 ; MOVWF EEDATA ; BTFSC PROGBIT ; GOTO EEIN ; BSF PROGBIT ; 2x prog GOTO PROGEX ; EEIN CALL WRITE_BYTE ; BTFSS PC_OFFSET,EE_OK ;(BTFSC STATUS,ZERO) ERROR? GOTO EEIN ; CLRF CONFIG BCF STATUS,SEITE ; auf ROM seite 0 BCF PROGBIT ; GOTO INIT ; ;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ;.................................................................... OLDACK MOVF BT1,0 ;------ for old DCC-Programmer ------ MOVWF INDF ; save loco adress CLRW ; CV1 CLRF MAPCV ; for old acknowledge GOTO OACK ; EEVERI BTFSC ROMCV ; GOTO RDROMCV ; ANDLW 00001111b ; OACK MOVWF EEADDR ; READ2 CALL READ_RANDOM ; BTFSS PC_OFFSET,EE_OK ;(BTFSC STATUS,ZERO) ERROR? GOTO READ2 CLRF CONFIG MOVF INDF,0 ; XORWF EEDATA,0 ; VERIBK BTFSS STATUS,ZERO ; BCF STATUS,SEITE ; to ROM page 0 BTFSS STATUS,ZERO ; GOTO START ; ACKNOW BTFSC ACKBIT ; GOTO ACKNOW1 ; BSF ACKBIT ; 2x verify GOTO PROGEX ; ACKNOW1 MOVLW MOTOR1|(1<1LGP3 23 BTFSC STATUS,ZERO ; 24 GOTO FOFF ; 25-26 NOP ; 26 FON BTFSC FLACKON ; 27 BSF FLACKER ; 28 BSF GPIOOUT,LED ; 1. GOTO FT50 ; 2.-3. FOFF BTFSC LITAUTO ; 27 GOTO FT50 ; 28 BTFSC FLACKON ; 1. BCF FLACKER ; 2. BCF GPIOOUT,LED ; 3. ;-------------------------------- FT50 CALL PWMTAB1 ; 3.-3 MOVF BT6,0 ; 4 ANDWF CV50,0 ; 5 BTFSC STATUS,ZERO ; 6 GOTO NXFT50A ; 7-8 BSF REDLT ; 8 BTFSC RDLTON ; 9 GOTO FT51 ; 10-11 BTFSC RANGIER ; low activ 11 GOTO NXFT50 ; 12-13 BSF GPIOOUT,LIGHT2 ; 13 NXFT50 BSF GPIOOUT,LIGHT1 ; 14 NOP ; 15 GOTO FT51 ; 16-17 NXFT50A GOTO $+1 ; 9-10 GOTO $+1 ; 11-12 GOTO $+1 ; 13-14 BTFSC RANGIER ; low activ 15 BCF GPIOOUT,LIGHT1 ; 16 BCF REDLT ; 17 ;-------------------------------- ;.PWM2................................................................ FT51 BCF FSR,5 ; 18 MOVF PWM2,0 ; 19 MOVWF GPIO ; 20 BSF FSR,5 ; 21 ;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ MOVF BT6,0 ; 22 ANDWF CV51,0 ; 23 BTFSC STATUS,ZERO ; 24 GOTO NXFT51 ; 25-26 BTFSC SPEED2 ; low activ 26 BSF GPIOOUT,LIGHT2 ; 27 BTFSS SPEED2 ; low activ 28 BSF FLAGS2 ; 1. GOTO HOPP3 ; 2.-3. NXFT51 BTFSC SPEED2 ; low activ 27 BCF GPIOOUT,LIGHT2 ; 28 BCF FLAGS2 ; 1. GOTO HOPP3 ; 2.-3. ;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ;..................................................................... FORWARD CALL PWMTAB1 ; 3.-3 BCF DIR ; 4 GOTO SPEED ; 5-6 REVERSE CALL PWMTAB1 ; 3.-3 BSF DIR ; 4 NOP ; 5 NOP ; 6 SPEED MOVF GPIOOUT,0 ;---------- Direction --------- 7 ANDLW (255-(MOTOR1|MOTOR2)) ;11111100b ; Motor out = 0 8 BTFSC DIR ; 9 IORLW MOTOR1 ; forward 10 BTFSS DIR ; 11 IORLW MOTOR2 ; reverse 12 BTFSC CV29,0 ; CV29,0 (DIR) invert? 13 XORLW (MOTOR1|MOTOR2) ; invert Motor out 14 BTFSC CV19,7 ; CV19,7 (DIR) invert? 15 XORLW (MOTOR1|MOTOR2) ; invert Motor out 16 MOVWF GPIOOUT ;------------------------------ 17 ;-------------------------------------------------------------------- ;.PWM2................................................................ BCF FSR,5 ; 18 MOVF PWM2,0 ; 19 MOVWF GPIO ; 20 BSF FSR,5 ; 21 ;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ BCF FS126 ; 22 RLF INDF,0 ; 01DSSSSS 23 ANDLW 00011110b ; xx04321x 24 MOVWF SOLL ; 1D04321x 25 BTFSC INDF,4 ; 01D>S