Advertisement
Guest User

Untitled

a guest
Mar 17th, 2017
96
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pic 16 12.13 KB | None | 0 0
  1. ;====================================================================
  2. ; Main.asm file generated by New Project wizard
  3. ;
  4. ; Created:   Thu Jan 5 2017
  5. ; Processor: PIC12F675
  6. ; Compiler:  MPASM (MPLAB)
  7. ;====================================================================
  8.  
  9.             list p=12F675, b=8, c= 102, n=71, t=on, st=off, f=inhx32
  10.             #include    <p12f675.inc>
  11.             errorlevel  -302
  12.             radix dec
  13.             #define     BUFLEN 6
  14.             CBLOCK      0x22            ; first 2 bytes assigned for macro.inc
  15.             buffer:BUFLEN
  16.             TXCNT, TXVAR, RXCNT, RD_PTR, WR_PTR, Reg4W
  17.             RXCHAR, FSRTMP, PTRL, PTRH, ticks, x, i, flags
  18.             y:2, timer0:2, timer1:2, mpos:2
  19.             pos_X:2, pos_Y:2, oldenc, newenc, Reg0W:2
  20.             Reg1W:2, Reg2W:2, Reg3W:2, Reg5W:2
  21.             F_ISR, P_ISR, W_TEMP, STATUS_TEMP, GPIO_shadow, flags2
  22.             ENDC
  23.  
  24.             __CONFIG _WDT_OFF & _INTRC_OSC_NOCLKOUT & _MCLRE_OFF
  25.  
  26.             #define     timer_state0 flags,0
  27.             #define     zeroX flags2,0
  28.             #define     moved flags2,1
  29.             #define     ONECHARIN flags2,3
  30.             #define     timer_state1 flags,1
  31.             #define     turnON flags,2
  32.             #define     zeros flags,3
  33.             #define     RXFLAG flags,4
  34.             #define     TXFLAG flags,5
  35.             #define     PORT0 flags,6   ; flag to set the output on GP0
  36.             #define     PORT1 flags,7   ; flag to set the output on GP1
  37.             #define     TICKSVAL 2
  38.             #define     halfbit -d'52'+d'5'
  39.             #define     onebit -d'104'+2
  40. ; interrupt on timer1 will occur every half second
  41. ; corrections may be required
  42.             #define     settmr1H  11    ; preset for timer1 MSB register
  43.             #define     settmr1L  220   ; preset for timer1 LSB register
  44.             #define     RXPIN 1         ; input pin for Serial
  45.             #define     TXPIN 0         ; input pin for Serial
  46.             #define     IN0PIN 2
  47.             #define     IN1PIN 3
  48.             #define     OUT0PIN 4       ; output pin number
  49.             #define     OUT1PIN 5       ; output pin number
  50.             #define     IN0 GPIO,IN0PIN
  51.             #define     IN1 GPIO,IN1PIN
  52.             #define     OUT0 GPIO,OUT0PIN
  53.             #define     OUT1 GPIO,OUT1PIN
  54. ;           DEFINE to allow to operate with an encoder as input
  55.             #define     ENCODER
  56.  
  57. _Print      macro       str
  58.             local       String, Print
  59.             movlw       low String
  60.             movwf       PTRL
  61.             movlw       high String
  62.             movwf       PTRH
  63.             goto        Print
  64. String      dt          str,0
  65. Print       call        PutString       ; print string
  66.             endm
  67.  
  68.             org         0x0000
  69.  
  70.             clrf        STATUS
  71.             movlw       b'00000111'
  72.             movwf       CMCON           ; comparator off, digital I/O
  73.             goto        Main
  74.  
  75.             org         0x0004
  76.  
  77.             movwf       W_TEMP          ; save W-reg
  78.             swapf       STATUS,W        ; doesn't change STATUS bits
  79.             movwf       STATUS_TEMP     ; save STATUS reg
  80.             clrf        STATUS          ; bank 0
  81.             movf        PCLATH,W        ; get PCLATH
  82.             movwf       P_ISR           ; save PCLATH
  83.             movf        FSR,W           ; get FSR
  84.             movwf       F_ISR           ; save FSR
  85.  
  86.             btfss       INTCON,GPIF     ; IOC "start bit" interrupt?
  87.             goto        ISR_SET         ; no, branch
  88.             btfss       IN0             ; check input pins
  89.             goto        $+3             ; if in0 is low, something is happened
  90.             btfsc       IN1             ; is in1 changed ?
  91.             goto        ISR_RCV
  92.             bsf         moved           ; signalize the inputs have changed
  93. ; CONDITIONAL COMPILATION
  94.             ifdef ENCODER
  95.             movlw       1 << IN1PIN | 1 << IN0PIN
  96.             andwf       GPIO,W
  97.             movwf       newenc          ; save it
  98.             endif
  99. ;       END
  100. ISR_RCV     movf        GPIO,W          ; yes, read GPIO
  101.             bcf         INTCON,GPIF     ; clear IOC interrupt flag
  102.             btfsc       GPIO,RXPIN      ; RXPIN low (start bit)?
  103.             goto        ISR_SET         ; no, wrong polarity, branch
  104.             bsf         RXFLAG          ; indicate RX in progress
  105.             movlw       d'10'           ; (1 start + 8 data + 1 stop)
  106.             movwf       RXCNT           ; initialize RX bit counter
  107. ;
  108.             bcf         INTCON,T0IF     ; clear TMR0 interrupt flag
  109.             movlw       halfbit         ; 1/2 bit time (52-usecs)
  110.             movwf       TMR0
  111.             bcf         IOC,RXPIN       ; turn off RXPIN IOC
  112.             goto        ISR_XIT
  113.  
  114. ISR_SET     btfss       INTCON,T0IF     ; is the timer0 interrupt ?
  115.             goto        ISR_XIT         ; check for timer1
  116.             bcf         INTCON,T0IF     ; clear TMR0 interrupt flag
  117.             movlw       onebit          ; setup for next 104-usec int
  118.             addwf       TMR0,F
  119.  
  120. ISR_TX      btfss       TXFLAG          ; TX in progress?
  121.             goto        ISR_RX          ; no, branch
  122.             movf        TXCNT,W         ; get TX bit count
  123.             bnz         ISR_TX0         ; no, branch, send next bit
  124.             movlw       d'10'           ; 10 bits (start + 8 data + st
  125.             movwf       TXCNT           ; initialize TX bit counter
  126.             goto        ISR_TX1         ; send the start bit
  127. ISR_TX0     rrf         TXVAR,F         ; shift lsb into C
  128.             bsf         TXVAR,7         ; set bit 7 for stop bits
  129.             skpnc                       ; skip if C=0
  130.             bsf         GPIO,TXPIN      ; set TX pin
  131.             skpc                        ; skip if C=1
  132. ISR_TX1     bcf         GPIO,TXPIN      ; clr TX pin
  133.             decfsz      TXCNT,F         ; last bit shifted out?
  134.             goto        ISR_XIT         ; no, branch
  135.             bcf         TXFLAG          ; yes, indicate end of TX
  136.             goto        ISR_XIT         ; no, branch
  137. ISR_RX      btfss       RXFLAG          ; RX in progress?
  138.             goto        ISR_XIT         ; no, branch, else
  139.             clrc                        ; clear Carry, assume data = 0
  140.             btfsc       GPIO,RXPIN      ; TRPIN = 0 ?
  141.             setc                        ; no, set Carry, data = 1
  142.             rrf         RXCHAR,F        ; shift bit into our character
  143.             decfsz      RXCNT,F         ; all 10 bits?
  144.             goto        ISR_XIT         ; no, branch
  145.             rlf         RXCHAR,F        ; yes, get rid of the stop bit
  146.             bcf         RXFLAG          ; clear the rx progress
  147.             bsf         ONECHARIN
  148. ISR_XIT     bcf         STATUS,RP0      ; select bank 0
  149.             btfss       PIR1,TMR1IF     ; If TMR1IF is set Then
  150.             goto        $+8             ; no, then return
  151.             call        reloadTMR1      ; reload the Timer1
  152.             bcf         PIR1,TMR1IF     ; PIR1.TMR1IF = 0
  153.             decfsz      ticks,F         ; if ticks zero
  154.             goto        $+4             ; no, then return
  155.             bsf         zeroX           ; signalize reached zero count
  156.             movlw       TICKSVAL        ; reload ticks
  157.             movwf       ticks
  158.             movf        F_ISR,W
  159.             movwf       FSR             ; restore FSR
  160.             movf        P_ISR,W
  161.             movwf       PCLATH          ; restore PCLATH
  162.             swapf       STATUS_TEMP,W
  163.             movwf       STATUS          ; restore STATUS
  164.             swapf       W_TEMP,F        ; don't screw up STATUS
  165.             swapf       W_TEMP,W        ; restore W-reg
  166.             retfie                      ; return from interrupt
  167.  
  168. Put232      btfsc       TXFLAG          ; TX in progress?
  169.             goto        Put232          ; yes, branch and wait
  170.             movwf       TXVAR           ; stuff character
  171.             bsf         TXFLAG          ; initiate TX
  172.             return
  173.  
  174. Get232      btfss       ONECHARIN       ; RX in progress?
  175.             goto        $-1
  176.             bcf         ONECHARIN
  177.             movf        FSR,W           ; get and save FSR
  178.             movwf       FSRTMP
  179.             movf        RD_PTR,W
  180.             movwf       FSR             ; setup indirect address
  181.             movf        RXCHAR,W        ; load the received character
  182.             movwf       INDF            ; save it into buffer
  183.             movf        FSRTMP,W
  184.             movwf       FSR             ; restore FSR
  185.             incf        RD_PTR,W        ; increment RD_PTR
  186.             andlw       h'027'          ; keep it in range 20..27
  187.             movwf       RD_PTR
  188.             movf        RXCHAR,W        ; get receive character
  189.             bsf         IOC,RXPIN
  190.             return
  191.  
  192. ;==============================================================================
  193. ;                       initialization
  194. ;==============================================================================
  195.  
  196. init        call        0x3FF           ; load calibration bits
  197.             banksel OSCCAL              ; select the correct bank
  198.             movwf       OSCCAL          ; save them
  199.             clrf        flags           ; clear all flags
  200.             clrf        flags2          ; clear all flags
  201.             clrf        TXCNT           ; init TXCNT variable
  202.             banksel TRISIO              ; bank 1
  203.             movlw       1<<RXPIN | 1<<IN0PIN | 1<<IN1PIN
  204.                                         ; inputs on 543, and outputs on 210
  205.             movwf       TRISIO
  206.             movlw       b'10001010'     ; no weak pull-ups and 1:8
  207.             movwf       OPTION_REG      ; prescaler for TMR0
  208.                                         ; setting timer0, general and port interrupts
  209.             movlw       1<<GIE | 1<<GPIE | 1<<T0IE
  210.             movwf       INTCON
  211.             banksel ANSEL
  212.             CLRF        ANSEL
  213.             CLRF        VRCON           ; VRCON = 0
  214.             banksel GPIO
  215.             clrf        GPIO
  216.             movf        GPIO,W
  217.             movwf       newenc
  218.             movwf       oldenc
  219.             bsf         GPIO,TXPIN      ; put TXPIN in idle state
  220.             movlw       b'00101001'     ; Timer1 enabled
  221.             movwf       T1CON
  222.             bsf         PIR1,TMR1IE
  223.             movlw       7               ; comparators off
  224.             movwf       CMCON
  225.             movlw       TICKSVAL        ; reload ticks
  226.             movwf       ticks
  227. reloadTMR1  movlw       settmr1H        ; set for timer1H MSB register
  228.             banksel TMR1H               ; reset to right bank if recalled
  229.             movwf       TMR1H
  230.             movlw       settmr1L        ; set for timer1L LSB register
  231.             movwf       TMR1L
  232.             return                      ; return
  233.  
  234. PutString
  235.             call        GetTable        ; get a table character
  236.             andlw       255
  237.             skpnz                       ; 00 byte, last character?
  238.             return                      ; yes, return
  239.             call        Put232          ; else,output character
  240.             incfsz      PTRL,F          ; increment pointer
  241.             goto        PutString
  242.             incf        PTRH,F
  243.             goto        PutString
  244. GetTable
  245.             movf        PTRH,W
  246.             movwf       PCLATH
  247.             movf        PTRL,W
  248.             movwf       PCL
  249.  
  250. Main        _Print "System Ready\r\n"
  251.             call        init
  252.             banksel IOC                 ; allowing input on RX pin
  253.             bsf         IOC,RXPIN       ; turn on RXPIN IOC and input pins
  254.             bsf         IOC,IN1PIN      ; enabling IN1 interrupt
  255.             bsf         IOC,IN0PIN      ; enabling IN0 interrupt
  256. resume      movlw       buffer          ; RX circular buffer address
  257.             movwf       RD_PTR          ; init circular buffer RD ptr
  258.             movwf       WR_PTR          ; init circular buffer WR ptr
  259. main_loop   bcf         moved
  260.  
  261.             call        Get232          ; receive character
  262.             call        Put232          ; echo character back
  263.             goto        main_loop       ; loop forever
  264.  
  265.             end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement