Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ;====================================================================
- ; Main.asm file generated by New Project wizard
- ;
- ; Created: Thu Jan 5 2017
- ; Processor: PIC12F675
- ; Compiler: MPASM (MPLAB)
- ;====================================================================
- list p=12F675, b=8, c= 102, n=71, t=on, st=off, f=inhx32
- #include <p12f675.inc>
- errorlevel -302
- radix dec
- #define BUFLEN 6
- CBLOCK 0x22 ; first 2 bytes assigned for macro.inc
- buffer:BUFLEN
- TXCNT, TXVAR, RXCNT, RD_PTR, WR_PTR, Reg4W
- RXCHAR, FSRTMP, PTRL, PTRH, ticks, x, i, flags
- y:2, timer0:2, timer1:2, mpos:2
- pos_X:2, pos_Y:2, oldenc, newenc, Reg0W:2
- Reg1W:2, Reg2W:2, Reg3W:2, Reg5W:2
- F_ISR, P_ISR, W_TEMP, STATUS_TEMP, GPIO_shadow, flags2
- ENDC
- __CONFIG _WDT_OFF & _INTRC_OSC_NOCLKOUT & _MCLRE_OFF
- #define timer_state0 flags,0
- #define zeroX flags2,0
- #define moved flags2,1
- #define ONECHARIN flags2,3
- #define timer_state1 flags,1
- #define turnON flags,2
- #define zeros flags,3
- #define RXFLAG flags,4
- #define TXFLAG flags,5
- #define PORT0 flags,6 ; flag to set the output on GP0
- #define PORT1 flags,7 ; flag to set the output on GP1
- #define TICKSVAL 2
- #define halfbit -d'52'+d'5'
- #define onebit -d'104'+2
- ; interrupt on timer1 will occur every half second
- ; corrections may be required
- #define settmr1H 11 ; preset for timer1 MSB register
- #define settmr1L 220 ; preset for timer1 LSB register
- #define RXPIN 1 ; input pin for Serial
- #define TXPIN 0 ; input pin for Serial
- #define IN0PIN 2
- #define IN1PIN 3
- #define OUT0PIN 4 ; output pin number
- #define OUT1PIN 5 ; output pin number
- #define IN0 GPIO,IN0PIN
- #define IN1 GPIO,IN1PIN
- #define OUT0 GPIO,OUT0PIN
- #define OUT1 GPIO,OUT1PIN
- ; DEFINE to allow to operate with an encoder as input
- #define ENCODER
- _Print macro str
- local String, Print
- movlw low String
- movwf PTRL
- movlw high String
- movwf PTRH
- goto Print
- String dt str,0
- Print call PutString ; print string
- endm
- org 0x0000
- clrf STATUS
- movlw b'00000111'
- movwf CMCON ; comparator off, digital I/O
- goto Main
- org 0x0004
- movwf W_TEMP ; save W-reg
- swapf STATUS,W ; doesn't change STATUS bits
- movwf STATUS_TEMP ; save STATUS reg
- clrf STATUS ; bank 0
- movf PCLATH,W ; get PCLATH
- movwf P_ISR ; save PCLATH
- movf FSR,W ; get FSR
- movwf F_ISR ; save FSR
- btfss INTCON,GPIF ; IOC "start bit" interrupt?
- goto ISR_SET ; no, branch
- btfss IN0 ; check input pins
- goto $+3 ; if in0 is low, something is happened
- btfsc IN1 ; is in1 changed ?
- goto ISR_RCV
- bsf moved ; signalize the inputs have changed
- ; CONDITIONAL COMPILATION
- ifdef ENCODER
- movlw 1 << IN1PIN | 1 << IN0PIN
- andwf GPIO,W
- movwf newenc ; save it
- endif
- ; END
- ISR_RCV movf GPIO,W ; yes, read GPIO
- bcf INTCON,GPIF ; clear IOC interrupt flag
- btfsc GPIO,RXPIN ; RXPIN low (start bit)?
- goto ISR_SET ; no, wrong polarity, branch
- bsf RXFLAG ; indicate RX in progress
- movlw d'10' ; (1 start + 8 data + 1 stop)
- movwf RXCNT ; initialize RX bit counter
- ;
- bcf INTCON,T0IF ; clear TMR0 interrupt flag
- movlw halfbit ; 1/2 bit time (52-usecs)
- movwf TMR0
- bcf IOC,RXPIN ; turn off RXPIN IOC
- goto ISR_XIT
- ISR_SET btfss INTCON,T0IF ; is the timer0 interrupt ?
- goto ISR_XIT ; check for timer1
- bcf INTCON,T0IF ; clear TMR0 interrupt flag
- movlw onebit ; setup for next 104-usec int
- addwf TMR0,F
- ISR_TX btfss TXFLAG ; TX in progress?
- goto ISR_RX ; no, branch
- movf TXCNT,W ; get TX bit count
- bnz ISR_TX0 ; no, branch, send next bit
- movlw d'10' ; 10 bits (start + 8 data + st
- movwf TXCNT ; initialize TX bit counter
- goto ISR_TX1 ; send the start bit
- ISR_TX0 rrf TXVAR,F ; shift lsb into C
- bsf TXVAR,7 ; set bit 7 for stop bits
- skpnc ; skip if C=0
- bsf GPIO,TXPIN ; set TX pin
- skpc ; skip if C=1
- ISR_TX1 bcf GPIO,TXPIN ; clr TX pin
- decfsz TXCNT,F ; last bit shifted out?
- goto ISR_XIT ; no, branch
- bcf TXFLAG ; yes, indicate end of TX
- goto ISR_XIT ; no, branch
- ISR_RX btfss RXFLAG ; RX in progress?
- goto ISR_XIT ; no, branch, else
- clrc ; clear Carry, assume data = 0
- btfsc GPIO,RXPIN ; TRPIN = 0 ?
- setc ; no, set Carry, data = 1
- rrf RXCHAR,F ; shift bit into our character
- decfsz RXCNT,F ; all 10 bits?
- goto ISR_XIT ; no, branch
- rlf RXCHAR,F ; yes, get rid of the stop bit
- bcf RXFLAG ; clear the rx progress
- bsf ONECHARIN
- ISR_XIT bcf STATUS,RP0 ; select bank 0
- btfss PIR1,TMR1IF ; If TMR1IF is set Then
- goto $+8 ; no, then return
- call reloadTMR1 ; reload the Timer1
- bcf PIR1,TMR1IF ; PIR1.TMR1IF = 0
- decfsz ticks,F ; if ticks zero
- goto $+4 ; no, then return
- bsf zeroX ; signalize reached zero count
- movlw TICKSVAL ; reload ticks
- movwf ticks
- movf F_ISR,W
- movwf FSR ; restore FSR
- movf P_ISR,W
- movwf PCLATH ; restore PCLATH
- swapf STATUS_TEMP,W
- movwf STATUS ; restore STATUS
- swapf W_TEMP,F ; don't screw up STATUS
- swapf W_TEMP,W ; restore W-reg
- retfie ; return from interrupt
- Put232 btfsc TXFLAG ; TX in progress?
- goto Put232 ; yes, branch and wait
- movwf TXVAR ; stuff character
- bsf TXFLAG ; initiate TX
- return
- Get232 btfss ONECHARIN ; RX in progress?
- goto $-1
- bcf ONECHARIN
- movf FSR,W ; get and save FSR
- movwf FSRTMP
- movf RD_PTR,W
- movwf FSR ; setup indirect address
- movf RXCHAR,W ; load the received character
- movwf INDF ; save it into buffer
- movf FSRTMP,W
- movwf FSR ; restore FSR
- incf RD_PTR,W ; increment RD_PTR
- andlw h'027' ; keep it in range 20..27
- movwf RD_PTR
- movf RXCHAR,W ; get receive character
- bsf IOC,RXPIN
- return
- ;==============================================================================
- ; initialization
- ;==============================================================================
- init call 0x3FF ; load calibration bits
- banksel OSCCAL ; select the correct bank
- movwf OSCCAL ; save them
- clrf flags ; clear all flags
- clrf flags2 ; clear all flags
- clrf TXCNT ; init TXCNT variable
- banksel TRISIO ; bank 1
- movlw 1<<RXPIN | 1<<IN0PIN | 1<<IN1PIN
- ; inputs on 543, and outputs on 210
- movwf TRISIO
- movlw b'10001010' ; no weak pull-ups and 1:8
- movwf OPTION_REG ; prescaler for TMR0
- ; setting timer0, general and port interrupts
- movlw 1<<GIE | 1<<GPIE | 1<<T0IE
- movwf INTCON
- banksel ANSEL
- CLRF ANSEL
- CLRF VRCON ; VRCON = 0
- banksel GPIO
- clrf GPIO
- movf GPIO,W
- movwf newenc
- movwf oldenc
- bsf GPIO,TXPIN ; put TXPIN in idle state
- movlw b'00101001' ; Timer1 enabled
- movwf T1CON
- bsf PIR1,TMR1IE
- movlw 7 ; comparators off
- movwf CMCON
- movlw TICKSVAL ; reload ticks
- movwf ticks
- reloadTMR1 movlw settmr1H ; set for timer1H MSB register
- banksel TMR1H ; reset to right bank if recalled
- movwf TMR1H
- movlw settmr1L ; set for timer1L LSB register
- movwf TMR1L
- return ; return
- PutString
- call GetTable ; get a table character
- andlw 255
- skpnz ; 00 byte, last character?
- return ; yes, return
- call Put232 ; else,output character
- incfsz PTRL,F ; increment pointer
- goto PutString
- incf PTRH,F
- goto PutString
- GetTable
- movf PTRH,W
- movwf PCLATH
- movf PTRL,W
- movwf PCL
- Main _Print "System Ready\r\n"
- call init
- banksel IOC ; allowing input on RX pin
- bsf IOC,RXPIN ; turn on RXPIN IOC and input pins
- bsf IOC,IN1PIN ; enabling IN1 interrupt
- bsf IOC,IN0PIN ; enabling IN0 interrupt
- resume movlw buffer ; RX circular buffer address
- movwf RD_PTR ; init circular buffer RD ptr
- movwf WR_PTR ; init circular buffer WR ptr
- main_loop bcf moved
- call Get232 ; receive character
- call Put232 ; echo character back
- goto main_loop ; loop forever
- end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement