http://ww1.microchip.com/downloads/en/AppNotes/00510e.pdf

AN510
Implementation of an Asynchronous Serial I/O
Author:
Amar Palacherla
Microchip Technology Inc.
INTRODUCTION
The PIC16C5X series from Microchip Technology Inc.,
are 8-bit, high-speed, EPROM-based microcontrollers.
This application note describes an implementation of
an asynchronous serial I/O using a PIC16C5X microcontroller. These microcontrollers can operate at very
high speeds with a minimum cycle time of 200 ns
@ 20 MHz input clock. Many microcontroller applications require chip-to-chip serial data communications.
Since the PIC16C5X series has no on-chip serial ports,
serial communication has to be performed in software.
For many cost-sensitive high volume applications,
implementation of a serial I/O through software provides a more cost effective solution than dedicated
logic. This application note provides code for the
PIC16C5X to simulate a serial port using two I/O pins
(one as input for reception and the other as output for
transmission).
 1997 Microchip Technology Inc.
IMPLEMENTATION
Two programs are provided in this application note.
One program (Appendix B) simulates full duplex
RS-232 communication and the other (Appendix A)
provides implementation of half-duplex communication.
Using half-duplex, baud rates up to 19200 can be
implemented using an 8 MHz input clock. For
full-duplex, the software can handle up to 9600 baud at
8 MHz and 19200 baud at 20 MHz, one or two stop bits,
eight or seven data bits, no Parity and can transmit or
receive with either LSb first (normal mode) or MSb first
(CODEC-like mode). It should be noted that the higher
the input clock the better the resolution. These options
should be set up during assembly time and not during
run time. The user simply has to change the header file
for the required communication options. The software
does not provide any handshaking protocols. With
minor modifications, the user may incorporate software
handshaking using XON/XOFF. To implement hardware handshaking, an additional two digital I/O pins
may be used as RTS (ready to send) and CTS (clear to
send) lines.
DS00510E-page 1
AN510
Figure 1 shows a flowchart for serial transmission and
Figure 2 shows a flowchart for reception. The
flowcharts show case transmission/reception with LSb
first and eight data bits. For reception, the data receive
pin, DR, is polled approximately every B/2 seconds (52
µs for 9600 baud) to detect the start bit, where B is the
time duration of one bit (B = 1/Baud). If a start bit is
found, then the first data bit is checked for after 1.25B
seconds. From then on, the other data bits are checked
every B seconds (104 µs for 9600 baud).
FIGURE 2:
RECEPTION FLOWCHART
Input
Test Pin DR
No
In the case of transmission, first a start bit is sent by setting the transmit data pin, DX, to zero for B seconds,
and from then on the DX pin is set/cleared
corresponding to the data bit every B seconds.
Assembly language code corresponding to the
following flowcharts is given in Example 1 and
Example 2.
FIGURE 1:
Is DR = 0?
Yes
Start Bit Detected
R - Count = 8
Rcv Reg = 0
TRANSMISSION FLOWCHART
Input
Delay
Load Xmit Reg
Clear Carry bit
X-Count = 8
Right Shift Rcv Reg
DX pin = 0
Test Pin DR
Delay
Is DR = 1?
No
Right Shift Xmt reg
Yes
Set MSb of Rcv Reg
Is Carry = 1?
No
DX pin = 0
R-Count = R-Count - 1
Yes
DX pin = 1
X-Count = X-Count - 1
No
Is R-Count
= 0?
Yes
Stop
No
Is X-Count
= 0?
Yes
Transmission Over
DS00510E-page 2
 1997 Microchip Technology Inc.
AN510
EXAMPLE 1:
TRANSMIT ASSEMBLY CODE (CORRESPONDING TO FIGURE 1)
;********************* Transmitter*****************************
Xmtr
movlw
8
; Assume XmtReg contains data to be Xmted
movwf
XCount
; 8 data bits
bcf
Port_A,DX
; Send Start Bit
X_next call
Delay
; Delay for B/2 Seconds
rrf
XmtReg
btfsc
STATUS,CARRY ; Test the bit to be transmitted
bsf
Port_A,DX
; Bit is a one
btfss
STATUS,CARRY
bcf
Port_A,DX
; Bit is zero
decfsz
Count
; If count = 0, then transmit a stop bit
goto
X_next
; transmit next bit
;
X_Stop call
Delay
bsf
Port_A,DX
; Send Stop Bit
X_Over goto
X_Over
EXAMPLE 2:
RECEIVE ASSEMBLY CODE (CORRESPONDING TO FIGURE 2)
;****************
Receiver *********************
;
Rcvr
btfsc
Port_A,DR
; Test for Start Bit
goto
Rcvr
; Start Bit not found
movlw
8
; Start Bit Detected
movwf
RCount
; 8 Data Bits
clrf
RcvReg
; Receive Data Register
R_next call
Delay
; Delay for B/2 Seconds, B=Time duration of
; 1bit
bcf
STATUS,CARRY
; Clear CARRY bit
rrf
RcvReg
; to set if MSB first or LSB first
btfsc
Port_A,DR
; Is the bit a zero or one ?
bsf
RcvReg,MSB
; Bit is a one
call
Delay
decfsz RCount
goto
R_next
R_Over goto
R_Over
; Reception done
The software is organized such that the communication
software acts as a Real-Time Operating System
(RTOS) which gives control to the user routine for a certain time interval. After this predetermined time slot, the
user must give back control to the Operating System.
This is true only in the case of full-duplex implementation. Timing considerations are such that the user gets
control for approximately half the time of the bit rate and
the rest of the time is used up by the Operating System
(and software delays). Please refer to Table 1 for the
delay constants and the time the user gets using an 8
MHz input clock. Delay constants and the time that the
user gets at 20 MHz and 4 MHz input clock speeds are
given in the source code listing of the full-duplex routine. At frequencies other than 4, 8, or 20 MHz, the
delay constants and the time the user gets can be computed from the equations given in Equation 1.
 1997 Microchip Technology Inc.
FIGURE 3:
FULL-DUPLEX BLOCK
DIAGRAM
Xmtr
RTOS
User
Rcur
DS00510E-page 3
AN510
EQUATION 1:
EQUATIONS FOR DELAY
CONSTANTS
Note: CLKOUT = FOSC/4
Baud_Cycles = Clkout/Baud;
User_time = Baud_Cycles • (float) 0.5;
K0 = (1.25 • Baud_Cycles - 2.0 • User_time - 89)/3.0; IF (K0 < 0)
{
K0 = 0.0;
User_time = 0.50 • (1.25 • Baud_Cycles - 89.0) ;
}
K1 = (1.25 • Baud_Cycles - User_time - 59.0 - 3 • K0)/3.0 ;
K2 = (Baud_Cycles - User_time - 41.0 - 3 • K0)/3.0 ;
K3 = (Baud_Cycles - User_time - 61.0 - 3 • K0)/3.0 ;
K4 = (Baud_Cycles - User_time - 55.0 - 3 • K0)/3.0 ;
K5 = (Baud_Cycles - User_time - 55.0 - 3 • K0)/3.0 +1.0 ;
K6 = 0.0;
K7 = (1.25 • Baud_Cycles - User_time - 39.0 - 3 • K0)/3.0 ;
TABLE 1:
DELAY CONSTANTS AT 8 MHZ
INPUT CLOCK
Constant
19200
K0
K1
K2
K3
K4
K5
K6
K7
User Cycles
-
TABLE 2:
9600 4800 2400 1200
0
39
27
21
23
24
0
45
86
5
80
51
44
46
47
0
86
208
39
150
86
80
82
83
0
156
416
109
288
155
148
150
151
0
295
832
DELAY CONSTANTS AT 20 MHZ
INPUT CLOCK
Constant
19200
K0
K1
K2
K3
K4
K5
K6
K7
User Cycles
0
49
34
27
29
30
0
56
118
9600 4800 2400 1200
13
98
60
53
55
56
0
104
260
57
184
103
96
98
99
0
190
521
143
317
358
705
191
364
184
357
186
359
187
360
0
0
365
712
1042 2083
For example, if the baud rate selected is 9600 bps
(@ 8 MHz), then the total time frame for one bit is
approximately 104 µs. Out of this 104 µs, 61 µs are
used by the Operating System and the other 43 µs are
available to the user. It is the user’s responsibility to
return control to the Operating System exactly after the
time specified in Table 1. For very accurate timing (with
resolution up to one clock cycle) the user may set up
Timer0 with the Prescaler option for calculating the
real-time. With TMR0 configured to increment on internal CLKOUT (500 ns @ 8 MHz CLKIN) and the prescaler assigned to it, very accurate and long timing delay
loops may be assigned. This method of attaining accu-
DS00510E-page 4
rate delay loops is not used in the RS-232 code
(RTOS), so that Timer0 is available to the user for other
important functions. If Timer0 is not used for other functions, the user may modify the code to replace the software delay loops by counting TMR0. For an example of
using TMR0 counting for exact timing delays, refer to
the “user” routine in Full Duplex code (Appendix B).
The software uses minimal processor resources. Only
six data RAM locations (File Registers) are used. The
RTOS uses one level of stack, but it is freed once control is given back to the user. The Watchdog Timer
(WDT) and Timer0 are not used. The user should clear
the WDT at regular intervals, if the WDT is enabled.
The usage of the program is described in the following
sections. The user should branch to location "Op_Sys"
exactly after the time specified in Table 1 or as computed from equations in Equation 1.
Whereas, the transmission is totally under user control,
the Reception is under the control of the Operating System. As long as the user does not set the X_flag, no
transmission occurs. On the other hand the Operating
System is constantly looking for a start bit and the user
should not modify the R_done flag or the RcvReg.
TRANSMISSION
Transmit Data is output on the DX pin (bit0 of PORTA).
In the user routine, the user should load the data to be
transmitted in the XmtReg and set the X_flag (bsf kwn
FlagRX,X_flag). This flag gets cleared after the
transmission. The user should check this flag (X_flag)
to see if a transmission is in progress. Modifying
XmtReg when the X_flag is set will cause erroneous
data to be transmitted.
RECEPTION
Data is received on pin DR (bit1 of PORTA). The user
should constantly check the “R_done” flag to see if the
reception is over. If a reception is in progress, the
R_flag is set. If the reception is over, the “R_done” flag
is set. The “R_done” flag gets cleared when the next
start bit is detected. The user should constantly check
the R_done flag, and if set, then the received word is in
Register “RcvReg”. This register gets cleared when a
new start bit is detected. It is recommended that the
RcvReg, be copied to another register after the R_done
flag is set. The R_done flag also gets cleared when the
next start bit is detected.
The user may modify the code to implement an N deep
buffer (limited to the number of Data RAM locations
available) for receive. Also, if receiving at high speeds,
and if the N deep buffer is full, an XOFF signal (HEX 13)
may be transmitted. When ready to receive more data,
an XON signal (HEX 11) should be transmitted.
 1997 Microchip Technology Inc.
AN510
SUMMARY
The PIC16C5X family of microcontrollers allow users to
implement half or full duplex RS-232 communication in
software.
 1997 Microchip Technology Inc.
DS00510E-page 5
AN510
Please check the Microchip BBS for the latest version of the source code. Microchip’s Worldwide Web Address:
www.microchip.com; Bulletin Board Support: MCHIPBBS using CompuServe® (CompuServe membership not
required).
APPENDIX A:
ASSEMBLY LANGUAGE FOR HALF DUPLEX
MPASM 01.40 Released
LOC OBJECT CODE
VALUE
000001FF
00000001
00000007
00000001
00000001
00000001
00000001
00000000
00000005
00000006
00000000
00000001
00000044
00000043
00000022
00000056
00000042
00000042
DS00510E-page 6
HALF_DUP.ASM
1-16-1997
11:48:17
PAGE
1
LINE SOURCE TEXT
00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00001
00002
00224
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
LIST
P = 16C54, n = 66
;
;*********************************************************************
;
RS-232 Communication With PIC16C54
;
;
Half Duplex Asynchronous Communication
;
;
This program has been tested at Bauds from 1200 to 19200 Baud
;
( @ 8,16,20 Mhz CLKIN )
;
;
As a test, this program will echo back the data that has been
;
received.
;
;
Program:
HALF_DUP.ASM
;
Revision Date:
;
1-13-97
Compatibility with MPASMWIN 1.40
;
;********************************************************************
;
INCLUDE
<P16C5X.INC>
LIST
; P16C5X.INC Standard Header File, Ver. 3.30 Microchip Technology, Inc.
LIST
PIC54
Same
MSB
equ 1FFH ; Define Reset Vector
equ 1
equ
7
;***************** Communication Parameters
**********************
;
X_MODE equ 1 ; If ( X_MODE==1) Then transmit LSB first
; if ( X_MODE==0) Then transmit MSB first (CODEC like)
R_MODE equ 1 ; If ( R_MODE==1) Then receive LSB first
; if ( X_MODE==0) Then receive MSB first (CODEC like)
X_Nbit equ 1 ; if (X_Nbit==1) # of data bits (Transmission is 8 else 7
R_Nbit equ 1 ; if (R_Nbit==1) # of data bits (Reception) is 8 else 7
;
Sbit2
equ 0 ; if Sbit2 = 0 then 1 Stop Bit else 2 Stop Bits
;
;********************************************************************
X_flag equ PA0 ; Bit 5 of F3 ( PA0 )
R_flag equ PA1 ; Bit 6 of F3 ( PA1 )
;
DX
equ 0
; Transmit Pin ( Bit 0 of Port A )
DR
equ 1
; Reciive Pin ( Bit 1 of Port A )
;
;
BAUD_1 equ .68 ; 3+3X = CLKOUT/Baud
BAUD_2 equ .67 ; 6+3X = CLKOUT/Baud
BAUD_3 equ .34 ; 3+3X = 0.5*CLKOUT/Baud
BAUD_4 equ .86 ; 3+3X = 1.25*CLKOUT/Baud
BAUD_X equ .66 ; 11+3X = CLKOUT/Baud
BAUD_Y equ .66 ; 9 +3X = CLKOUT/Baud
 1997 Microchip Technology Inc.
AN510
0008
0008
0009
000A
000B
0000
0000
0001
0002
0003
0068
0625
0A30
0923
0004
0004 0C08
0005 002A
0006 0403
0007 0328
0008 0625
0009 05E8
000A 091F
000B 02EA
000C 0A06
000D 0208
000E 0029
000F
000F 0C08
0010 002A
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114
00115
00116
 1997 Microchip Technology Inc.
;
;************************ Data RAM Assignments *********************
;
ORG 08H
; Dummy Origin
;
RcvReg RES 1
; Data received
XmtReg RES 1
; Data to be transmitted
Count
RES 1
; Counter for #of Bits Transmitted
DlyCnt RES 1
;***************************************************************
;
ORG
0
;
Talk
clrf
RcvReg
; Clear all bits of RcvReg
btfsc
PORTA,DR
; check for a Start Bit
goto
User
; delay for 104/2 uS
call
Delay4
; delay for 104+104/4
;***************************************************************
;
Receiver
;
Rcvr
IF
R_Nbit
movlw
8
; 8 Data bits
ELSE
movlw
7
; 7 data bits
ENDIF
;
movwf
Count
R_next bcf
STATUS,C
IF
R_MODE
rrf
RcvReg,Same
; to set if MSB first or LSB first
ELSE
rlf
RcvReg,Same
ENDIF
btfsc
PORTA,DR
;
IF
R_MODE
IF
R_Nbit
bsf
RcvReg,MSB
; Conditional Assembly
ELSE
bsf
RcvReg,MSB-1
ENDIF
ELSE
bsf
RcvReg,LSB
ENDIF
;
call
DelayY
decfsz Count,Same
goto
R_next
;****************************************************
R_over movf
RcvReg,0
; Send back What is Just Received
movwf
XmtReg
;****************************************************
;
Transmitter
;
Xmtr
IF
X_Nbit
movlw
8
ELSE
movlw
7
ENDIF
movwf
Count
;
IF
X_MODE
ELSE
IF
X_Nbit
DS00510E-page 7
AN510
0011 0405
0012 0925
0013 0403
0014 0329
0015
0016
0017
0018
0019
001A
001B
001C
001D
0603
0505
0703
0405
0921
02EA
0A13
0505
0925
001E 0A00
001F
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
002A
002B
0C42
0A28
0C42
0A28
0C56
0A28
0C44
0A28
0C43
002B
02EB
0A29
0800
002C 0C0E
002D 0005
002E 0525
002F 0A00
0030
0031
0032
0033
0034
0C22
002B
02EB
0A32
0A00
01FF
01FF 0A2C
DS00510E-page 8
00117
00118
00119
00120
00121
00122
00123
00124
00125
00126
00127
00128
00129
00130
00131
00132
00133
00134
00135
00136
00137
00138
00139
00140
00141
00142
00143
00144
00145
00146
00147
00148
00149
00150
00151
00152
00153
00154
00155
00156
00157
00158
00159
00160
00161
00162
00163
00164
00165
00166
00167
00168
00169
00170
00171
00172
00173
00174
00175
00176
00177
00178
00179
00180
00181
00182
ELSE
rlf
XmtReg,Same
ENDIF
ENDIF
;
X_next
;
bcf
call
bcf
PORTA,DX
Delay1
STATUS,C
IF
rrf
ELSE
rlf
ENDIF
X_MODE
XmtReg,Same
btfsc
bsf
btfss
bcf
call
decfsz
goto
bsf
call
STATUS,C
PORTA,DX
STATUS,C
PORTA,DX
DelayX
Count,Same
X_next
PORTA,DX
Delay1
IF
bsf
call
ENDIF
Sbit2
PORTA,DX
Delay1
; Send Start Bit
; Conditional Assembly
; to set if MSB first or LSB first
XmtReg,Same
;
; Send Stop Bit
;
;
goto
Talk
;
;
End of Transmission
;
DelayY movlw
BAUD_Y
goto
save
DelayX movlw
BAUD_X
goto
save
Delay4 movlw
BAUD_4
goto
save
Delay1 movlw
BAUD_1
goto
save
Delay2 movlw
BAUD_2
save
movwf
DlyCnt
redo_1 decfsz DlyCnt,Same
goto
redo_1
retlw
0
;
main
movlw
0EH
tris
PORTA
bsf
PORTA,DR
;
goto
Talk
;
;
User
movlw
BAUD_3
movwf
DlyCnt
redo_2 decfsz DlyCnt,Same
goto
redo_2
goto
Talk
;
;
ORG
PIC54
goto
main
;
END
; Back To Reception & Transmision
; 104 uS for 9600 baud
; Bit 0 of Port A is Output
; Set PORTA.0 as output ( DX )
; Loop Until Start Bit Found
 1997 Microchip Technology Inc.
AN510
MEMORY USAGE MAP (‘X’ = Used,
‘-’ = Unused)
0000 : XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXX----------01C0 : ---------------- ---------------- ---------------- ---------------X
All other memory blocks unused.
Program Memory Words Used:
Program Memory Words Free:
Errors
:
Warnings :
Messages :
0
0 reported,
0 reported,
 1997 Microchip Technology Inc.
54
458
0 suppressed
0 suppressed
DS00510E-page 9
AN510
Please check the Microchip BBS for the latest version of the source code. Microchip’s Worldwide Web Address:
www.microchip.com; Bulletin Board Support: MCHIPBBS using CompuServe® (CompuServe membership not
required).
APPENDIX B:
ASSEMBLY LANGUAGE LISTING FOR FULL DUPLEX
MPASM 01.40 Released
LOC OBJECT CODE
VALUE
00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
DS00510E-page 10
RS232.ASM
1-16-1997
12:12:09
PAGE
1
LINE SOURCE TEXT
LIST
P = 16C54, n = 66
;
;************************************************************
TITLE
“RS232 Communication Using PIC16C54”
;
;
Comments :
;
(1) Full Duplex
;
(2) Tested from 1200 to 9600 Baud( @ 8 Mhz )
;
(3) Tested from 1200 to 19200 Baud(@ 16 & 20 Mhz)
;
;
The User gets a total time as specified by the User Cycles
;
in the table ( or from equations ). The user routine has to
;
exactly use up this amount of time. After this time the User
;
routine has to give up the control to the Operating System.
;
If less than 52 uS is used, then the user should wait in a
;
delay loop, until exactly 52 uS.
;
;
Transmission :
;
Transmit Data is output on DX pin (Bit DX of PORTA).
;
In the user routine, the user should load the
;
data to be transmitted in the XmtReg and Set the
;
X_flag ( bsf FlagRX,X_flag ). This flag gets cleared
;
after the transmission.
;
;
Reception :
;
Data is received on pin DR ( bit DR of PORTA ).
;
The User should constantly check the “R_done” flag
;
to see if reception is over. If the reception is
;
in progress, R_flag is set to 1.
;
If the reception is over, “R_done” flag is set to 1.
;
The “R_done” flag gets reset to zero when a next start
;
bit is detected. So, the user should constantly check
;
the R_done flag, and if SET, then the received word
;
is in Register “RcvReg”. This register gets cleared
;
when a new start bit is detected.
;
;
Program Memory :
;
Total Program Memory Locations Used ( except initialization
;
in “main” & User routine ) = 132 locations.
;
;
Data Memory :
;
Total Data memory locations (file registers used) = 6
;
2 File registers to hold Xmt Data & Rcv Data
;
1 File registers for Xmt/Rcv flag test bits
;
3 File registers for delay count & scratch pad
;
;
Stack :
;
Only one level of stack is used in the Operating System/RS232
;
routine. But this is freed as soon as the program returns to
;
the user routine.
;
;
Timer0 :
Not Used
;
WDT :
Not Used
;
;
Program:
RS232.ASM
 1997 Microchip Technology Inc.
AN510
000001FF
00000001
00000007
00000001
00000001
00000001
00000001
00000000
00000000
00000002
00000003
00000004
00000005
00000006
00000001
00000000
00000000
00000001
0008
0008
0009
000A
000B
000C
000D
00056
00057
00058
00059
00060
00061
00001
00002
00224
00062
00063
00064
00065
00066
00067
00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
;
Revision Date:
;
1-16-97
Compatibility with MPASMWIN 1.40
;
;*********************************************************************
;
INCLUDE
<P16C5X.INC>
LIST
; P16C5X.INC Standard Header File, Ver. 3.30 Microchip Technology, Inc.
LIST
PIC54
Same
MSB
equ
equ
equ
1FFH
1
7
; Define Reset Vector
INCLUDE
<RS232.H>
;****************************************************************
;
RS232 Communication Parameters
;
;
X_MODE equ 1 ; If (X_MODE==1) Then transmit LSB first
; if (X_MODE==0) Then transmit MSB first (CODEC like)
R_MODE equ 1 ; If (R_MODE==1) Then receive LSB first
; if ( R_MODE==0) Then receive MSB first (CODEC like)
X_Nbit equ 1 ; if (X_Nbit==1)#of data bits (Transmission) is 8 else 7
R_Nbit equ 1 ; if (R_Nbit==1) # of data bits (Reception) is 8 else 7
;
SB2
equ 0 ; if SB2 = 0 then 1 Stop Bit
;
; if SB2 = 1 then 2 Stop Bit
;****************************************************************
;
Transmit & Receive Test Bit Assignments
;
X_flag equ 0 ; Bit 0 of FlagRX
R_flag equ 2 ; Bit 1 of FlagRX
S_flag equ 3 ; Bit 2 of FlagRX
BitXsb equ 4 ; Bit 3 of FlagRX
A_flag equ 5
S_bit
equ 6 ; Xmt Stop Bit Flag( for 2/1 Stop bits )
;
R_done equ 1 ; When Reception complete, this bit is SET
X_done equ X_flag ; When Xmission complete, this bit is Cleared
;
DX
equ 0 ; Transmit Pin ( Bit 0 of Port A )
DR
equ 1 ; Receive Pin ( Bit 1 of Port A )
;
;************************ Data RAM Assignments *********************
;
ORG
08H
; Dummy Origin
;
RcvReg RES
1
; Data received
XmtReg RES
1
; Data to be transmitted
Xcount RES
1
; Counter for #of Bits Transmitted
Rcount RES
1
; Counter for #of Bits to be Received
DlyCnt RES
1
; Counter for Delay constant
FlagRX RES
1
; Transmit & Receive test flag hold register
;______________________________________________________________
;
Constants
19200
9600
4800
2400
1200
; ( @ 20 Mhz )
;______________________________________________________________
;
K0
0
13
57
143
317*
;
K1
49
98
184
358*
705*
;
K2
34
60
103
191
364*
;
K3
27
53
96
184
357*
;
K4
29
55
98
186
359*
;
K5
30
56
99
187
360*
;
K6
0
0
0
0
0
;
K7
56
104
190
365*
712*
 1997 Microchip Technology Inc.
DS00510E-page 11
AN510
00000000
00000027
0000001B
00000015
00000017
00000018
00000000
0000002D
0000
0000
0001
0002
0003
0004
0C01
002C
02EC
0A02
0800
DS00510E-page 12
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
;
;
User Cycles
118
260
521
1042
2083
; *************************************************************
;
;
;______________________________________________________________
;
Constants
19200
9600
4800
2400
1200
; ( @ 8 Mhz )
;______________________________________________________________
;
K0
-0
5
39
109
;
K1
-39
80
150
288*
;
K2
-27
51
86
155
;
K3
-21
44
80
148
;
K4
-23
46
82
150
;
K5
-24
47
83
151
;
K6
-0
0
0
0
;
K7
-45
86
156
295*
;
;
User_Cycles
-86
208
416
832
; *************************************************************
;
;______________________________________________________________
;
Constants
19200
9600
4800
2400
1200
; ( @ 4 Mhz )
;______________________________________________________________
;
K0
--0
5
39
;
K1
--39
80
150
;
K2
--27
51
86
;
K3
--21
44
80
;
K4
--23
46
82
;
K5
--24
47
83
;
K6
--0
0
0
;
K7
--45
86
156
;
;
User_Cycles
--86
208
416
; *************************************************************
;
; The constants marked “ * “ are >255. To implement these constants
; in delay loops, the delay loop should be broken into 2 or more loops.
; For example, 357 = 255+102. So 2 delay loops, one with 255 and
; the other with 102 may be used.
;********************************************************************
;
Set Delay Constants for 9600 Baud @ CLKIN = 8 Mhz
;
K0
EQU
.0
K1
EQU
.39
K2
EQU
.27
K3
EQU
.21
K4
EQU
.23
K5
EQU
.24
K6
EQU
.0
K7
EQU
.45
;
;********************************************************************
;
ORG
0
;********************************************************************
;
Delay
movlw
K0+1
movwf
DlyCnt
; Total Delay = 3K+6
redo
decfsz DlyCnt,Same
goto
redo
retlw
0
;
 1997 Microchip Technology Inc.
AN510
0005
0006
0007
0008
002C
02EC
0A06
0A8D
0009
000A
000B
000C
002C
02EC
0A0A
0A67
000D
000E
000F
0010
0011
0012
0013
0625
0A17
042D
054D
078D
05AD
0068
0014 0C08
0015 002B
0016 0A78
0017
0018
0019
001A
078D
0A78
054D
0A78
001B 0403
001C 0328
001D 0625
001E 05E8
001F
0020
0021
0022
0023
0024
02EB
0A78
044D
056D
052D
0A78
0025 0405
0026 0C08
0027 002A
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114
00115
00116
00117
00118
00119
00120
00121
00122
00123
00124
00125
00126
00127
00128
00129
00130
00131
00132
00133
00134
00135
00136
00137
00138
00139
00140
00141
00142
00143
Delay1
redo_1
;
Delay2
redo_2
;
R_strt
;
ShellY
;
R_next
;
;
;
X_strt
 1997 Microchip Technology Inc.
movwf
decfsz
goto
goto
DlyCnt
DlyCnt,Same
redo_1
User
movwf
decfsz
goto
goto
DlyCnt
DlyCnt,Same
redo_2
User_1
btfsc
goto
bcf
bsf
btfss
bsf
clrf
IF
movlw
ELSE
movlw
ENDIF
movwf
goto
PORTA,DR
ShellY
FlagRX,R_done
FlagRX,R_flag
FlagRX,BitXsb
FlagRX,A_flag
RcvReg
R_Nbit
8
;
;
;
;
7
; 7 data bits
Rcount
Shell
; delay for 104+104/4
btfss
goto
bsf
goto
FlagRX,BitXsb
Shell
FlagRX,R_flag
Shell
bcf
IF
rrf
ELSE
rlf
ENDIF
btfsc
IF
IF
bsf
ELSE
bsf
ENDIF
ELSE
bsf
ENDIF
decfsz
goto
bcf
bsf
bsf
goto
STATUS,C
R_MODE
RcvReg,Same
;
; Delay =
= 260 Cycles
check for a Start Bit
delay for 104/2 uS
Reset Receive done flag
Set flag for Reception in Progress
; A_flag is for start bit detected in R_strt
; Clear all bits of RcvReg
; 8 Data bits
; to set if MSB first or LSB first
RcvReg,Same
PORTA,DR
R_MODE
R_Nbit
RcvReg,MSB
; Conditional Assembly
RcvReg,MSB-1
RcvReg,LSB
Rcount,Same
Shell
FlagRX,R_flag
FlagRX,S_flag
FlagRX,R_done
Shell
Reception Done
bcf
IF
movlw
ELSE
movlw
ENDIF
movwf
IF
ELSE
IF
ELSE
PORTA,DX
X_Nbit
8
; Send Start Bit
7
Xcount
X_MODE
X_Nbit
DS00510E-page 13
AN510
0028 0A50
0029 0403
002A 0329
002B
002C
002D
002E
002F
0030
0603
0505
0703
0405
00EA
0A52
0031
0032
0033
0034
0035
040D
0C09
002A
0505
0A60
0036 0505
0037 04CD
0038 0A60
0039
003A
003B
003C
003D
003E
076D
0A8D
046D
0900
0C2E
0A05
003F
003F 0900
0040 0C28
0041 002C
0042 0C08
0043
0044
0045
0046
0047
018B
0643
0A06
0C1C
0A05
0048
0048
0049
004A
004B
004C
004D
004E
0C09
008A
0643
0A25
022A
0743
0A29
DS00510E-page 14
00144
00145
00146
00147
00148
00149
00150
00151
00152
00153
00154
00155
00156
00157
00158
00159
00160
00161
00162
00163
00164
00165
00166
00167
00168
00169
00170
00171
00172
00173
00174
00175
00176
00177
00178
00179
00180
00181
00182
00183
00184
00185
00186
00187
00188
00189
00190
00191
00192
00193
00194
00195
00196
00197
00198
00199
00200
00201
00202
00203
00204
00205
00206
00207
00208
00209
rlf
XmtReg,Same
ENDIF
ENDIF
goto
X_SB
;
X_next
;
X_SB_1
;
X_SB_2
bcf
IF
rrf
ELSE
rlf
ENDIF
btfsc
bsf
btfss
bcf
decf
goto
STATUS,C
X_MODE
XmtReg,Same
bcf
movlw
movwf
bsf
goto
FlagRX,X_flag
9
Xcount
PORTA,DX
X_Stop
bsf
bcf
goto
PORTA,DX
FlagRX,S_bit
X_Stop
; Conditional Assembly
; to set if MSB first or LSB first
XmtReg,Same
STATUS,C
PORTA,DX
STATUS,C
PORTA,DX
Xcount,Same
X_Data
;
;
End of Transmission
;
R0_X0
btfss
FlagRX,S_flag
goto
User
bcf
FlagRX,S_flag
call
Delay
movlw
K7+1
goto
Delay1
;
R1_X0
call
Delay
movlw
K1+1
movwf
DlyCnt
IF
R_Nbit
movlw
8
ELSE
movlw
7
ENDIF
xorwf
Rcount,W
btfsc
STATUS,Z
goto
redo_1
movlw
K2+1
goto
Delay1
;
R1_X1
R0_X1
movlw
9
subwf
Xcount,W
btfsc
STATUS,Z
goto
X_strt
movf
Xcount,Same
btfss
STATUS,Z
goto
X_next
IF
SB2
btfsc FlagRX,S_bit
goto X_SB_2
bsf
FlagRX,S_bit
goto X_SB_1
ELSE
; Xmt flag = 0 -- transmission over
; Send Stop Bit
; delay for 1st bit is 104+104/4
; 8 Data bits
; 7 data bits
; same as R0_X1
; to check if All data bits Xmted
 1997 Microchip Technology Inc.
AN510
004F 0A31
0050 0A51
0051 0A52
0052
0053
0054
0055
0056
0057
0058
06AD
0A59
068D
0A5D
0900
0C16
0A09
0059
005A
005B
005C
04AD
0900
0C18
0A09
005D 048D
005E 0900
005F 0A67
0060
0060
0061
0062
0063
0064
0065
0066
06AD
0A59
068D
0A5D
0900
0C19
0A09
0067
0068
0069
006A
006B
006C
006D
006E
006F
0070
064D
0A77
066D
0A74
0625
0A77
042D
044D
058D
0068
0071 0C08
0072 002B
0073 0A8D
0074 046D
0075 0C01
0076 0A05
0077
0077 0A8D
0078
0079
007A
007B
007C
007D
064D
0A7D
060D
0A48
0A39
060D
00210
00211
00212
00213
00214
00215
00216
00217
00218
00219
00220
00221
00222
00223
00224
00225
00226
00227
00228
00229
00230
00231
00232
00233
00234
00235
00236
00237
00238
00239
00240
00241
00242
00243
00244
00245
00246
00247
00248
00249
00250
00251
00252
00253
00254
00255
00256
00257
00258
00259
00260
00261
00262
00263
00264
00265
00266
00267
00268
00269
00270
00271
00272
00273
00274
00275
goto
ENDIF
;
;
X_SB
cycle4
;
X_Data
;
SbDly
;
ABC
X_SB_1
goto
goto
cycle4
X_Data
btfsc
goto
btfsc
goto
call
movlw
goto
FlagRX,A_flag
SbDly
FlagRX,BitXsb
ABC
Delay
K3+1
Delay2
bcf
call
movlw
goto
FlagRX,A_flag
Delay
K4+1
Delay2
bcf
call
goto
FlagRX,BitXsb
Delay
User_1
btfsc
goto
btfsc
goto
call
movlw
goto
FlagRX,A_flag
SbDly
FlagRX,BitXsb
ABC
Delay
K5+1
Delay2
btfsc
goto
btfsc
goto
btfsc
goto
bcf
bcf
bsf
clrf
IF
movlw
ELSE
movlw
ENDIF
movwf
goto
FlagRX,R_flag
Sync_1
FlagRX,S_flag
Sync_3
PORTA,DR
Sync_2
FlagRX,R_done
FlagRX,R_flag
FlagRX,BitXsb
RcvReg
R_Nbit
8
bcf
movlw
goto
FlagRX,S_flag
K6+1
Delay1
;
X_Stop
;
User_1
;
Sync_3
7
; Reception already in progress
; check for a Start Bit
; No Start Bit - goto User routine
; Reset Receive done flag
; Set flag for Reception in Progress
; Clear all bits of RcvReg
; 8 Data bits
; 7 data bits
Rcount
User
;
Sync_1
Sync_2 goto
User
;
;********************************************************************
;
Shell
btfsc
FlagRX,R_flag
goto
Chek_X
btfsc
FlagRX,X_flag
goto
R0_X1
goto
R0_X0
; Case for R0_X0
Chek_X btfsc
FlagRX,X_flag
 1997 Microchip Technology Inc.
DS00510E-page 15
AN510
007E 0A48
007F 0A3F
0080 074D
0081 0A0D
0082 0A1B
0083 0C0E
0084 0005
0085
0086
0087
0088
0505
0C09
002A
006D
0089 04CD
008A 0C1F
008B 0002
008C 0A80
00000030
008D
008E
008F
0090
0091
0092
0093
0094
0095
0096
0C30
0021
062D
0A97
060D
0A9C
0C41
0029
050D
0A9C
0097
0097
0098
0099
009A
009B
0C5A
0188
0643
0A91
0A9B
009C 07E1
009D 0A9C
009E 0A80
01FF
01FF 0A83
DS00510E-page 16
00276
00277
00278
00279
00280
00281
00282
00283
00284
00285
00286
00287
00288
00289
00290
00291
00292
00293
00294
00295
00296
00297
00298
00299
00300
00301
00302
00303
00304
00305
00306
00307
00308
00309
00310
00311
00312
00313
00314
00315
00316
00317
00318
00319
00320
00321
00322
00323
00324
00325
00326
00327
00328
00329
00330
00331
00332
00333
00334
00335
00336
00337
00338
00339
00340
00341
goto
goto
R1_X1
R1_X0
;
;
;********************************************************************
;
Operating System
; The User routine after time = B/2, should branch Here
;
Op_Sys btfss
FlagRX,R_flag
goto
R_strt
goto
R_next
;
;********************************************************************
;
main
movlw
0EH
; Bit 0 of Port A is Output
tris
PORTA
; Set PORTA.0 as output ( DX )
;
& PORTA.1 is input ( DR )
bsf
PORTA,DX
movlw
9
movwf
Xcount
; If Xcount == 9, Then send start bit
clrf
FlagRX
; Clear All flag bits.
IF
SB2
bsf
FlagRX,S_bit ; Set Xmt Stop bit flag(2 Stop Bits)
ELSE
bcf
FlagRX,S_bit ; Clear Xmt Stop bit flag
ENDIF
movlw
1FH
; Prescaler = 4
OPTION
; Set TMR0 increment on internal Clock
goto
Op_Sys
;
;********************************************************************
;
;
******************* User Routine ***************
; The User routine should use up time exactly = User time as given
; in the Constants Table ( or by Equations for constants ).
; At 9600, this 86 Clock Cycles. TMR0 timer is used here to count
; upto 86 cycles ( From 128-86 To 0 ) by examining Bit 7 of TMR0.
;
K_user equ
.128+.6-.86
;
User
movlw
K_user
movwf
TMR0
btfsc
FlagRX,R_done
goto
ErrChk
SetXmt btfsc
FlagRX,X_flag
goto
Op
movlw
41H
movwf
XmtReg
bsf
FlagRX,X_flag
; Enable Xmission
goto
Op
;
ErrChk
movlw
“Z”
xorwf
RcvReg,W
btfsc
STATUS,Z
goto
SetXmt
err1
goto
err1
; Received word is not “Z”
;
Op
btfss
TMR0,MSB
; Test for TMR0 bit 7
goto
Op
; If Set, Then TMR0 has incremented
Oflow
goto
Op_Sys
; to 128.
;
; ***********************************************************
;
ORG
PIC54
goto
main
 1997 Microchip Technology Inc.
AN510
00342
00343
END
MEMORY USAGE MAP (‘X’ = Used,
0000
0040
0080
01C0
:
:
:
:
XXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXX
----------------
‘-’ = Unused)
XXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXX----------------
XXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXX
-------------------------------
XXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXX
------------------------------X
All other memory blocks unused.
Program Memory Words Used:
Program Memory Words Free:
Errors
:
Warnings :
Messages :
0
0 reported,
0 reported,
 1997 Microchip Technology Inc.
160
352
0 suppressed
0 suppressed
DS00510E-page 17
Note the following details of the code protection feature on PICmicro® MCUs.
•
•
•
•
•
•
The PICmicro family meets the specifications contained in the Microchip Data Sheet.
Microchip believes that its family of PICmicro microcontrollers is one of the most secure products of its kind on the market today,
when used in the intended manner and under normal conditions.
There are dishonest and possibly illegal methods used to breach the code protection feature. All of these methods, to our knowledge, require using the PICmicro microcontroller in a manner outside the operating specifications contained in the data sheet.
The person doing so may be engaged in theft of intellectual property.
Microchip is willing to work with the customer who is concerned about the integrity of their code.
Neither Microchip nor any other semiconductor manufacturer can guarantee the security of their code. Code protection does not
mean that we are guaranteeing the product as “unbreakable”.
Code protection is constantly evolving. We at Microchip are committed to continuously improving the code protection features of
our product.
If you have any further questions about this matter, please contact the local sales office nearest to you.
Information contained in this publication regarding device
applications and the like is intended through suggestion only
and may be superseded by updates. It is your responsibility to
ensure that your application meets with your specifications.
No representation or warranty is given and no liability is
assumed by Microchip Technology Incorporated with respect
to the accuracy or use of such information, or infringement of
patents or other intellectual property rights arising from such
use or otherwise. Use of Microchip’s products as critical components in life support systems is not authorized except with
express written approval by Microchip. No licenses are conveyed, implicitly or otherwise, under any intellectual property
rights.
Trademarks
The Microchip name and logo, the Microchip logo, FilterLab,
KEELOQ, microID, MPLAB, PIC, PICmicro, PICMASTER,
PICSTART, PRO MATE, SEEVAL and The Embedded Control
Solutions Company are registered trademarks of Microchip Technology Incorporated in the U.S.A. and other countries.
dsPIC, ECONOMONITOR, FanSense, FlexROM, fuzzyLAB,
In-Circuit Serial Programming, ICSP, ICEPIC, microPort,
Migratable Memory, MPASM, MPLIB, MPLINK, MPSIM,
MXDEV, PICC, PICDEM, PICDEM.net, rfPIC, Select Mode
and Total Endurance are trademarks of Microchip Technology
Incorporated in the U.S.A.
Serialized Quick Turn Programming (SQTP) is a service mark
of Microchip Technology Incorporated in the U.S.A.
All other trademarks mentioned herein are property of their
respective companies.
© 2002, Microchip Technology Incorporated, Printed in the
U.S.A., All Rights Reserved.
Printed on recycled paper.
Microchip received QS-9000 quality system
certification for its worldwide headquarters,
design and wafer fabrication facilities in
Chandler and Tempe, Arizona in July 1999. The
Company’s quality system processes and
procedures are QS-9000 compliant for its
PICmicro® 8-bit MCUs, KEELOQ® code hopping
devices, Serial EEPROMs and microperipheral
products. In addition, Microchip’s quality
system for the design and manufacture of
development systems is ISO 9001 certified.
 2002 Microchip Technology Inc.
M
WORLDWIDE SALES AND SERVICE
AMERICAS
ASIA/PACIFIC
Japan
Corporate Office
Australia
2355 West Chandler Blvd.
Chandler, AZ 85224-6199
Tel: 480-792-7200 Fax: 480-792-7277
Technical Support: 480-792-7627
Web Address: http://www.microchip.com
Microchip Technology Australia Pty Ltd
Suite 22, 41 Rawson Street
Epping 2121, NSW
Australia
Tel: 61-2-9868-6733 Fax: 61-2-9868-6755
Microchip Technology Japan K.K.
Benex S-1 6F
3-18-20, Shinyokohama
Kohoku-Ku, Yokohama-shi
Kanagawa, 222-0033, Japan
Tel: 81-45-471- 6166 Fax: 81-45-471-6122
Rocky Mountain
China - Beijing
2355 West Chandler Blvd.
Chandler, AZ 85224-6199
Tel: 480-792-7966 Fax: 480-792-7456
Microchip Technology Consulting (Shanghai)
Co., Ltd., Beijing Liaison Office
Unit 915
Bei Hai Wan Tai Bldg.
No. 6 Chaoyangmen Beidajie
Beijing, 100027, No. China
Tel: 86-10-85282100 Fax: 86-10-85282104
Atlanta
500 Sugar Mill Road, Suite 200B
Atlanta, GA 30350
Tel: 770-640-0034 Fax: 770-640-0307
Boston
2 Lan Drive, Suite 120
Westford, MA 01886
Tel: 978-692-3848 Fax: 978-692-3821
Chicago
333 Pierce Road, Suite 180
Itasca, IL 60143
Tel: 630-285-0071 Fax: 630-285-0075
Dallas
4570 Westgrove Drive, Suite 160
Addison, TX 75001
Tel: 972-818-7423 Fax: 972-818-2924
Detroit
Tri-Atria Office Building
32255 Northwestern Highway, Suite 190
Farmington Hills, MI 48334
Tel: 248-538-2250 Fax: 248-538-2260
Kokomo
2767 S. Albright Road
Kokomo, Indiana 46902
Tel: 765-864-8360 Fax: 765-864-8387
Los Angeles
18201 Von Karman, Suite 1090
Irvine, CA 92612
Tel: 949-263-1888 Fax: 949-263-1338
China - Chengdu
Microchip Technology Consulting (Shanghai)
Co., Ltd., Chengdu Liaison Office
Rm. 2401, 24th Floor,
Ming Xing Financial Tower
No. 88 TIDU Street
Chengdu 610016, China
Tel: 86-28-6766200 Fax: 86-28-6766599
China - Fuzhou
Microchip Technology Consulting (Shanghai)
Co., Ltd., Fuzhou Liaison Office
Unit 28F, World Trade Plaza
No. 71 Wusi Road
Fuzhou 350001, China
Tel: 86-591-7503506 Fax: 86-591-7503521
China - Shanghai
Microchip Technology Consulting (Shanghai)
Co., Ltd.
Room 701, Bldg. B
Far East International Plaza
No. 317 Xian Xia Road
Shanghai, 200051
Tel: 86-21-6275-5700 Fax: 86-21-6275-5060
China - Shenzhen
150 Motor Parkway, Suite 202
Hauppauge, NY 11788
Tel: 631-273-5305 Fax: 631-273-5335
Microchip Technology Consulting (Shanghai)
Co., Ltd., Shenzhen Liaison Office
Rm. 1315, 13/F, Shenzhen Kerry Centre,
Renminnan Lu
Shenzhen 518001, China
Tel: 86-755-2350361 Fax: 86-755-2366086
San Jose
Hong Kong
Microchip Technology Inc.
2107 North First Street, Suite 590
San Jose, CA 95131
Tel: 408-436-7950 Fax: 408-436-7955
Microchip Technology Hongkong Ltd.
Unit 901-6, Tower 2, Metroplaza
223 Hing Fong Road
Kwai Fong, N.T., Hong Kong
Tel: 852-2401-1200 Fax: 852-2401-3431
New York
Toronto
6285 Northam Drive, Suite 108
Mississauga, Ontario L4V 1X5, Canada
Tel: 905-673-0699 Fax: 905-673-6509
India
Microchip Technology Inc.
India Liaison Office
Divyasree Chambers
1 Floor, Wing A (A3/A4)
No. 11, O’Shaugnessey Road
Bangalore, 560 025, India
Tel: 91-80-2290061 Fax: 91-80-2290062
Korea
Microchip Technology Korea
168-1, Youngbo Bldg. 3 Floor
Samsung-Dong, Kangnam-Ku
Seoul, Korea 135-882
Tel: 82-2-554-7200 Fax: 82-2-558-5934
Singapore
Microchip Technology Singapore Pte Ltd.
200 Middle Road
#07-02 Prime Centre
Singapore, 188980
Tel: 65-6334-8870 Fax: 65-6334-8850
Taiwan
Microchip Technology Taiwan
11F-3, No. 207
Tung Hua North Road
Taipei, 105, Taiwan
Tel: 886-2-2717-7175 Fax: 886-2-2545-0139
EUROPE
Denmark
Microchip Technology Nordic ApS
Regus Business Centre
Lautrup hoj 1-3
Ballerup DK-2750 Denmark
Tel: 45 4420 9895 Fax: 45 4420 9910
France
Microchip Technology SARL
Parc d’Activite du Moulin de Massy
43 Rue du Saule Trapu
Batiment A - ler Etage
91300 Massy, France
Tel: 33-1-69-53-63-20 Fax: 33-1-69-30-90-79
Germany
Microchip Technology GmbH
Gustav-Heinemann Ring 125
D-81739 Munich, Germany
Tel: 49-89-627-144 0 Fax: 49-89-627-144-44
Italy
Microchip Technology SRL
Centro Direzionale Colleoni
Palazzo Taurus 1 V. Le Colleoni 1
20041 Agrate Brianza
Milan, Italy
Tel: 39-039-65791-1 Fax: 39-039-6899883
United Kingdom
Arizona Microchip Technology Ltd.
505 Eskdale Road
Winnersh Triangle
Wokingham
Berkshire, England RG41 5TU
Tel: 44 118 921 5869 Fax: 44-118 921-5820
03/01/02
 2002 Microchip Technology Inc.