📄 motor_28.asm
字号:
BTFSC STATUS,CARRY ; >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<AAA AAAA 5
GOTO SHORTA ; short adress 6-7
XORWF CV17,0 ; 7
BTFSS STATUS,ZERO ; 8
GOTO CHKPROG ; 9-10
MOVF BT2,0 ; 10
XORWF CV18,0 ; 11
BTFSS STATUS,ZERO ; 12
GOTO CHKPROG ; 13
MOVLW 0x2C ; BT3 14
MOVWF FSR ; to 3. byte 15
BTFSS LADRE ; long adress enabled? 16
GOTO CHKPROG ; 17
BTFSC CONSIST ; 18
GOTO CHKPROG ; 19
GOTO CVNEXT ; 20-21
;--------------------------------
GOTO $+1 ; 11-12
GOTO $+1 ; 13-14
BCAST GOTO OVER1 ; 15-16
OVER BTFSC CONSIST ; 15
GOTO START ; 16
OVER1 NOP ; 17
GOTO BCBCK ; 18-19
;--------------------------------
CHKPROG MOVF BT1,0 ;
ANDLW 11110000b ; untere 3bit ausblenden
XORLW 01110000b ; >= 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
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -