home *** CD-ROM | disk | FTP | other *** search
/ Acorn User 9 / AU_CD9.iso / Cover_Discs / Back_Issues / 1998_12 / Regulars / RTR / Serial3 < prev    next >
Text File  |  1998-09-23  |  6KB  |  213 lines

  1. PIC 16C84 Assembler V1.4 by Mike Cook
  2. File:- ADFS::Square.$.Develop.SerialPIC.SerialIO
  3. Assembled on :- Thu,02 Jul 1998 at 17:02:31
  4.  
  5. ;Serial I/O User Port
  6. ;For an 10 MHz clock
  7. ;A0 - Serial out
  8. ;A1 - Serial in
  9. ;A2 - CTS allows serial input
  10. ;A3 - RTS output held until this is low
  11. ;A4 - I/O mode 0 = Input mode   1 = Output mode
  12.  
  13. ;Note for 16F84 invert the state of the PWRTE
  14.               list   P=16C84
  15.  
  16.  
  17.        C             equ 0          
  18.        PCL           equ 2          
  19.        Z             equ 2          
  20.        PORTB         equ 6          
  21.        PORTA         equ 5          
  22.        TRISB         equ 86H          
  23.        TRISA         equ 85H          
  24.        EECON1        equ 88H          
  25.        EEDATA        equ 8          
  26.        EEADR         equ 9          
  27.        STATUS        equ 3          
  28.        RP0           equ 5          
  29.        INC           equ 1          
  30.        cts           equ 2          
  31.        rts           equ 3          
  32.        sBuf          equ 0ch          ;Serial send buffer
  33.        Scount        equ 0dh          ;Tempory Counter
  34.        Cdown         equ 0eh          ;Time delay countdown
  35.        rBuf          equ 0fh          ;Recieve buffer
  36.  
  37. ;
  38.               org    0
  39. 0000   2833   goto   Start          
  40.  
  41. ;Recieve a serial byte
  42. Rx:
  43.  
  44. 0001   1105   bcf    PORTA,cts      ;Allow for incomming data
  45. 0002   3008   movlw  8              ;Number of data bits to get
  46. 0003   008D   movwf  Scount         
  47. Sb:
  48. 0004   1885   btfsc  PORTA,1        ;Hold until start bit
  49. 0005   2804   goto   Sb             
  50. 0006   1505   bsf    PORTA,cts      ;Stop any more incomming
  51. 0007   2028   call   hDelay         ;Half a baud delay
  52. Rnb:
  53. 0008   1003   bcf    STATUS,C       ;Clear the carry bit
  54. 0009   0C8F   rrf    rBuf,f         ;Prepare for next bit  
  55. 000A   202B   call   rDelay         ;Full baud delay for recieve
  56. 000B   1885   btfsc  PORTA,1        ;Test input
  57. 000C   178F   bsf    rBuf,7         ;Set if needed
  58. 000D   0B8D   decfsz Scount,f       ;See if finished
  59. 000E   2808   goto   Rnb            ;Round again if not
  60. 000F   202B   call   rDelay         ;Allow for stop bit to start
  61. 0010   0008   return                
  62.  
  63.  
  64. ;Send a serial byte
  65. Send:
  66.  
  67. 0011   1985   btfsc  PORTA,rts      ;Only proceed when rts is low
  68. 0012   2811   goto   Send           
  69. 0013   3009   movlw  9              ;Number of data bits to send
  70. 0014   008D   movwf  Scount         
  71. 0015   1005   bcf    PORTA,0        ;Start bit
  72. 0016   2025   call   cDelay         ;Extra delay compensation
  73. Sloop:
  74. 0017   202E   call   Delay          
  75. 0018   180C   btfsc  sBuf,0         ;Set the next bit
  76. 0019   1405   bsf    PORTA,0        
  77. 001A   1C0C   btfss  sBuf,0         
  78. 001B   1005   bcf    PORTA,0        
  79. 001C   0C8C   rrf    sBuf,f         ;Shift for next time
  80. 001D   0B8D   decfsz Scount,f       
  81. 001E   2817   goto   Sloop          ;Round until finished
  82. 001F   1405   bsf    PORTA,0        ;Stop bit
  83. 0020   2025   call   cDelay         ;Extra delay compensation
  84. 0021   202E   call   Delay          
  85. 0022   202E   call   Delay          
  86. 0023   2025   call   cDelay         ;For good measure
  87. 0024   0008   return                
  88.  
  89. cDelay:
  90.  
  91. 0025   3009   movlw  9              ;Small delay at end of send
  92. 0026   008E   movwf  Cdown          
  93. 0027   2830   goto   Dloop          
  94.  
  95. hDelay:
  96.  
  97. 0028   3015   movlw  21             ;half delay for serial recieve 10MHz clock
  98. 0029   008E   movwf  Cdown          ; 19,200 Baud rate
  99. 002A   2830   goto   Dloop          
  100.  
  101. rDelay:
  102.  
  103. 002B   3026   movlw  38             ;Delay for serial recieve 10MHz clock
  104. 002C   008E   movwf  Cdown          ; 19,200 Baud rate
  105. 002D   2830   goto   Dloop          
  106.  
  107. Delay:
  108.  
  109. 002E   3027   movlw  39             ;Delay for serial send 10MHz clock
  110. 002F   008E   movwf  Cdown          ; 19,200 Baud rate
  111. Dloop:
  112. 0030   0B8E   decfsz Cdown,f        
  113. 0031   2830   goto   Dloop          
  114. 0032   0008   return                
  115.  
  116.  
  117. Start:
  118.  
  119. 0033   1683   bsf    STATUS,RP0     ;SELECT REGISTER BANK 1
  120. 0034   301A   movlw  1Ah            ;Bits 4,3 & 2 inputs
  121. 0035   0085   movwf  TRISA^80H      
  122. 0036   1283   bcf    STATUS,RP0     ;SELECT REGISTER BANK 0
  123. 0037   1A05   btfsc  PORTA,4        ;See if in input or output mode
  124. 0038   2846   goto   InLoop         
  125.  
  126. 0039   1683   bsf    STATUS,RP0     ;SELECT REGISTER BANK 1
  127.  
  128. 003A   3000   movlw  0              ;All port B to outputs
  129. 003B   0086   movwf  TRISB^80H      
  130. 003C   1283   bcf    STATUS,RP0     ;SELECT REGISTER BANK 0
  131.  
  132. 003D   1405   bsf    PORTA,0        ;Serial at Mark
  133.  
  134. 003E   1505   bsf    PORTA,cts      ;CTS disabled
  135.  
  136.  
  137. outMain:
  138.  
  139. 003F   2001   call   Rx             ;Get byte to output
  140. 0040   080F   movf   rBuf,w         ;Byte to send
  141. 0041   0086   movwf  PORTB          ;Output it
  142. 0042   0806   movf   PORTB,w        ;Get output state
  143. 0043   008C   movwf  sBuf           ;Ready to output it
  144. 0044   2011   call   Send           ;Send it back to computer
  145. 0045   283F   goto   outMain        
  146.  
  147. InLoop:
  148.  
  149.  
  150. 0046   1683   bsf    STATUS,RP0     ;SELECT REGISTER BANK 1
  151.  
  152. 0047   30FF   movlw  0ffh           ;All port B to inputs
  153. 0048   0086   movwf  TRISB^80H      
  154. 0049   1381   bcf    1,7            ;Enable pull up resistors
  155. 004A   1283   bcf    STATUS,RP0     ;SELECT REGISTER BANK 0
  156.  
  157. 004B   1405   bsf    PORTA,0        ;Serial at Mark
  158.  
  159. 004C   1505   bsf    PORTA,cts      ;CTS disabled
  160.  
  161.  
  162. inMain:
  163.  
  164. 004D   2001   call   Rx             ;Get byte to initiate read
  165. 004E   0806   movf   PORTB,w        ;Get input state
  166. 004F   008C   movwf  sBuf           ;Ready to output it
  167. 0050   2011   call   Send           ;Send it back to computer
  168. 0051   284D   goto   inMain         
  169.  
  170. end
  171.  
  172. Memory Usage Map ('X' = Used, '-' = Unused)
  173.  
  174. 0000   : XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX
  175. 0040   : XXXXXXX-XXXXXXXX XX-------------- ---------------- ----------------
  176.  
  177. 33 Lables & Constants:-
  178. Hex    Name
  179. 0000   C
  180. 0002   PCL
  181. 0002   Z
  182. 0006   PORTB
  183. 0005   PORTA
  184. 0086   TRISB
  185. 0085   TRISA
  186. 0088   EECON1
  187. 0008   EEDATA
  188. 0009   EEADR
  189. 0003   STATUS
  190. 0005   RP0
  191. 0001   INC
  192. 0002   cts
  193. 0003   rts
  194. 000C   sBuf
  195. 000D   Scount
  196. 000E   Cdown
  197. 000F   rBuf
  198. 0001   Rx
  199. 0004   Sb
  200. 0008   Rnb
  201. 0011   Send
  202. 0017   Sloop
  203. 0025   cDelay
  204. 0028   hDelay
  205. 002B   rDelay
  206. 002E   Delay
  207. 0030   Dloop
  208. 0033   Start
  209. 003F   outMain
  210. 0046   InLoop
  211. 004D   inMain
  212.  
  213. 0 Errors