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
00058
00059 #if !defined(__MTOUCHCVD_HARDWARE_16F182X_H)
00060 #define __MTOUCHCVD_HARDWARE_16F182X_H
00061
00062 #if !defined(_16F1829) && !defined(_16LF1829)
00063 #if !defined(_16F1828) && !defined(_16LF1828)
00064 #if !defined(_16F1827) && !defined(_16LF1827)
00065 #if !defined(_16F1826) && !defined(_16LF1826)
00066 #if !defined(_16F1825) && !defined(_16LF1825)
00067 #if !defined(_16F1824) && !defined(_16LF1824)
00068 #if !defined(_16F1823) && !defined(_16LF1823)
00069 #if !defined(_12F1822) && !defined(_12LF1822)
00070 #error The current mTouch hardware include file does not support this PIC microcontroller.
00071 #endif
00072 #endif
00073 #endif
00074 #endif
00075 #endif
00076 #endif
00077 #endif
00078 #endif
00079
00080 #if defined(_12F1822) || defined(_12LF1822)
00081 #if CVD_NUMBER_SENSORS > 4
00082 #error The PIC12F/LF1822 is not able to support more than 4 sensors due to pinout limitations.
00083 #endif
00084 #endif
00085 #if defined(_16F1823) || defined(_16LF1823)
00086 #if CVD_NUMBER_SENSORS > 7
00087 #error The PIC16F/LF1823 is not able to support more than 7 sensors due to memory constraints.
00088 #endif
00089 #endif
00090 #if defined(_16F1823) || defined(_16LF1823)
00091 #if CVD_NUMBER_SENSORS > 8
00092 #error The PIC16F/LF1823 is not able to support more than 8 sensors due to pinout limitations.
00093 #endif
00094 #endif
00095 #if defined(_16F1824) || defined(_16LF1824)
00096 #if CVD_NUMBER_SENSORS > 8
00097 #error The PIC16F/LF1824 is not able to support more than 8 sensors due to pinout limitations.
00098 #endif
00099 #endif
00100 #if defined(_16F1825) || defined(_16LF1825)
00101 #if CVD_NUMBER_SENSORS > 8
00102 #error The PIC16F/LF1825 is not able to support more than 8 sensors due to pinout limitations.
00103 #endif
00104 #endif
00105 #if defined(_16F1826) || defined(_16LF1826)
00106 #if CVD_NUMBER_SENSORS > 12
00107 #error The PIC16F/LF1826 is not able to support more than 12 sensors due to pinout limitations.
00108 #endif
00109 #endif
00110 #if defined(_16F1827) || defined(_16LF1827)
00111 #if CVD_NUMBER_SENSORS > 12
00112 #error The PIC16F/LF1827 is not able to support more than 12 sensors due to pinout limitations.
00113 #endif
00114 #endif
00115 #if defined(_16F1828) || defined(_16LF1828)
00116 #if CVD_NUMBER_SENSORS > 12
00117 #error The PIC16F/LF1828 is not able to support more than 12 sensors due to pinout limitations.
00118 #endif
00119 #endif
00120 #if defined(_16F1829) || defined(_16LF1829)
00121 #if CVD_NUMBER_SENSORS > 12
00122 #error The PIC16F/LF1829 is not able to support more than 12 sensors due to pinout limitations.
00123 #endif
00124 #endif
00125
00126 #if defined(CVD_DEBUG) && (CVD_DEBUG == 1)
00127 #warning The mTouch comm module does not automatically set the APFCON# register. The TX pin may be selectable. This warning may be deleted if the APFCON register has been initialized in your application.
00128 #endif
00129
00130 #define CVD_DEBUG_UART_ENABLED
00131
00132 #define CVD_DEBUG_COMM_INIT() \
00133 do { \
00134 TXSTA = CVD_DEBUG_TXSTA; \
00135 RCSTA = CVD_DEBUG_RCSTA; \
00136 BAUDCON = CVD_DEBUG_BAUDCON; \
00137 SPBRGL = CVD_DEBUG_SPBRGL; \
00138 SPBRGH = CVD_DEBUG_SPBRGH; \
00139 } while (0)
00140
00141 #define CVD_DEBUG_COMM_TXIF TXIF
00142 #define CVD_DEBUG_COMM_TXREG TXREG
00143
00144 #define CVD_SET_TMR0IE() TMR0IE = 1
00145 #define CVD_SET_GIE() GIE = 1
00146
00147 #define CVD_SET_ADC_CLK_32MHZ() ADCON1 = 0b10100000 // 32
00148 #define CVD_SET_ADC_CLK_16MHZ() ADCON1 = 0b11010000 // 16
00149 #define CVD_SET_ADC_CLK_8MHZ() ADCON1 = 0b10010000 // 8
00150 #define CVD_SET_ADC_CLK_4MHZ() ADCON1 = 0b11000000 // 4
00151 #define CVD_SET_ADC_CLK_2MHZ() ADCON1 = 0b10000000 // 2
00152 #define CVD_SET_ADC_CLK_1MHZ() ADCON1 = 0b10000000 // 2
00153
00154 #define CVD_UNIMPLEMENTED_AVAILABLE 1
00155
00156 #if defined(CVD_DEBUG) && (CVD_DEBUG == 1)
00157 #if !(CVD_DEBUG_SPEED == 9600 || CVD_DEBUG_SPEED == 115200)
00158 #error CVD_DEBUG_SPEED must be set to either 9600 or 115200 in the configuration file.
00159 #endif
00160 #endif
00161
00162 #if _XTAL_FREQ == 32000000
00163 #define CVD_SET_ADC_CLK() CVD_SET_ADC_CLK_32MHZ()
00164 #define CVD_TAD 1
00165 #if CVD_DEBUG_SPEED == 115200
00166 #define CVD_DEBUG_TXSTA 0b00100100
00167 #define CVD_DEBUG_RCSTA 0b10010000
00168 #define CVD_DEBUG_BAUDCON 0b00001000
00169 #define CVD_DEBUG_SPBRGL 68
00170 #define CVD_DEBUG_SPBRGH 0
00171 #elif CVD_DEBUG_SPEED == 9600
00172 #define CVD_DEBUG_TXSTA 0b00100100
00173 #define CVD_DEBUG_RCSTA 0b10010000
00174 #define CVD_DEBUG_BAUDCON 0b00000000
00175 #define CVD_DEBUG_SPBRGL 207
00176 #define CVD_DEBUG_SPBRGH 0
00177 #endif
00178 #elif _XTAL_FREQ == 16000000
00179 #define CVD_SET_ADC_CLK() CVD_SET_ADC_CLK_16MHZ()
00180 #define CVD_TAD 1
00181 #if CVD_DEBUG_SPEED == 115200
00182 #define CVD_DEBUG_TXSTA 0b00100100
00183 #define CVD_DEBUG_RCSTA 0b10010000
00184 #define CVD_DEBUG_BAUDCON 0b00001000
00185 #define CVD_DEBUG_SPBRGL 33
00186 #define CVD_DEBUG_SPBRGH 0
00187 #elif CVD_DEBUG_SPEED == 9600
00188 #define CVD_DEBUG_TXSTA 0b00100100
00189 #define CVD_DEBUG_RCSTA 0b10010000
00190 #define CVD_DEBUG_BAUDCON 0b00000000
00191 #define CVD_DEBUG_SPBRGL 103
00192 #define CVD_DEBUG_SPBRGH 0
00193 #endif
00194 #elif _XTAL_FREQ == 8000000
00195 #define CVD_SET_ADC_CLK() CVD_SET_ADC_CLK_8MHZ()
00196 #define CVD_TAD 1
00197 #if CVD_DEBUG_SPEED == 115200
00198 #define CVD_DEBUG_TXSTA 0b00100100
00199 #define CVD_DEBUG_RCSTA 0b10010000
00200 #define CVD_DEBUG_BAUDCON 0b00001000
00201 #define CVD_DEBUG_SPBRGL 16
00202 #define CVD_DEBUG_SPBRGH 0
00203 #elif CVD_DEBUG_SPEED == 9600
00204 #define CVD_DEBUG_TXSTA 0b00100100
00205 #define CVD_DEBUG_RCSTA 0b10010000
00206 #define CVD_DEBUG_BAUDCON 0b00001000
00207 #define CVD_DEBUG_SPBRGL 207
00208 #define CVD_DEBUG_SPBRGH 0
00209 #endif
00210 #elif _XTAL_FREQ == 4000000
00211 #define CVD_SET_ADC_CLK() CVD_SET_ADC_CLK_4MHZ()
00212 #define CVD_TAD 1
00213 #if CVD_DEBUG_SPEED == 115200
00214 #define CVD_DEBUG_TXSTA 0b00100100
00215 #define CVD_DEBUG_RCSTA 0b10010000
00216 #define CVD_DEBUG_BAUDCON 0b00001000
00217 #define CVD_DEBUG_SPBRGL 8
00218 #define CVD_DEBUG_SPBRGH 0
00219 #elif CVD_DEBUG_SPEED == 9600
00220 #define CVD_DEBUG_TXSTA 0b00100100
00221 #define CVD_DEBUG_RCSTA 0b10010000
00222 #define CVD_DEBUG_BAUDCON 0b00001000
00223 #define CVD_DEBUG_SPBRGL 103
00224 #define CVD_DEBUG_SPBRGH 0
00225 #endif
00226 #elif _XTAL_FREQ == 2000000
00227 #define CVD_SET_ADC_CLK() CVD_SET_ADC_CLK_2MHZ()
00228 #define CVD_TAD 1
00229 #if CVD_DEBUG_SPEED == 115200
00230 #error The 115.2kbps UART baudrate option cannot be used with a 2MHz Fosc. Please select '9600'.
00231 #elif CVD_DEBUG_SPEED == 9600
00232 #define CVD_DEBUG_TXSTA 0b00100100
00233 #define CVD_DEBUG_RCSTA 0b10010000
00234 #define CVD_DEBUG_BAUDCON 0b00001000
00235 #define CVD_DEBUG_SPBRGL 51
00236 #define CVD_DEBUG_SPBRGH 0
00237 #endif
00238 #elif _XTAL_FREQ == 1000000
00239 #define CVD_SET_ADC_CLK() CVD_SET_ADC_CLK_1MHZ()
00240 #define CVD_TAD 2
00241 #if CVD_DEBUG_SPEED == 115200
00242 #error The 115.2kbps UART baudrate option cannot be used with a 1MHz Fosc. Please select '9600'.
00243 #elif CVD_DEBUG_SPEED == 9600
00244 #define CVD_DEBUG_TXSTA 0b00100100
00245 #define CVD_DEBUG_RCSTA 0b10010000
00246 #define CVD_DEBUG_BAUDCON 0b00001000
00247 #define CVD_DEBUG_SPBRGL 25
00248 #define CVD_DEBUG_SPBRGH 0
00249 #endif
00250 #else
00251 #error _XTAL_FREQ is not set to a valid value for this processor.
00252 #endif
00253
00254
00255 #define CVD_ADCON0_BANK 1
00256 #define CVD_DACCON0_VDD 0xC0
00257 #define CVD_DACCON1_VDD 0x1F
00258 #define CVD_DACCON0_VSS 0x80
00259 #define CVD_DACCON1_VSS 0x00
00260
00261
00262
00263 #define CVD_AD_AN0 0x01
00264 #define CVD_AD_AN1 0x05
00265 #define CVD_AD_AN2 0x09
00266 #define CVD_AD_AN3 0x0D
00267
00268 #if !defined(_12F1822) && !defined(_12LF1822)
00269 #define CVD_AD_AN4 0x11
00270 #define CVD_AD_AN5 0x15
00271 #define CVD_AD_AN6 0x19
00272 #define CVD_AD_AN7 0x1D
00273 #endif
00274
00275 #if defined(_16F1826) || defined(_16LF1826) || defined(_16F1827) || defined(_16LF1827) || defined(_16F1828) || defined(_16LF1828) || defined(_16F1829) || defined(_16LF1829)
00276 #define CVD_AD_AN8 0x21
00277 #define CVD_AD_AN9 0x25
00278 #define CVD_AD_AN10 0x29
00279 #define CVD_AD_AN11 0x2D
00280 #endif
00281
00282 #define CVD_AD_FVR_AND_GO 0x7F // Selects the FVR as the ADC mux option and sets the GO/DONE bit.
00283 #define CVD_AD_DAC_AND_GO 0x7B // Selects the DAC as the ADC mux option and sets the GO/DONE bit.
00284 #define CVD_AD_DAC_NOGO 0x79 // Selects the DAC as the ADC mux option w/o setting the GO/DONE bit.
00285 #define CVD_AD_ISO_AND_GO 0x43 // Selects an unimplemented, isolated ADC mux option and sets the GO/DONE bit.
00286 #define CVD_AD_ISO_NOGO 0x41 // Selects an unimplemented, isolated ADC mux option w/o setting the GO/DONE bit.
00287
00288 #define CVD_SELECT_SENSOR0 __paste(CVD_AD_, CVD_SENSOR0)
00289 #define CVD_SELECT_SENSOR1 __paste(CVD_AD_, CVD_SENSOR1)
00290 #define CVD_SELECT_SENSOR2 __paste(CVD_AD_, CVD_SENSOR2)
00291 #define CVD_SELECT_SENSOR3 __paste(CVD_AD_, CVD_SENSOR3)
00292 #define CVD_SELECT_SENSOR4 __paste(CVD_AD_, CVD_SENSOR4)
00293 #define CVD_SELECT_SENSOR5 __paste(CVD_AD_, CVD_SENSOR5)
00294 #define CVD_SELECT_SENSOR6 __paste(CVD_AD_, CVD_SENSOR6)
00295 #define CVD_SELECT_SENSOR7 __paste(CVD_AD_, CVD_SENSOR7)
00296 #define CVD_SELECT_SENSOR8 __paste(CVD_AD_, CVD_SENSOR8)
00297 #define CVD_SELECT_SENSOR9 __paste(CVD_AD_, CVD_SENSOR9)
00298 #define CVD_SELECT_SENSOR10 __paste(CVD_AD_, CVD_SENSOR10)
00299 #define CVD_SELECT_SENSOR11 __paste(CVD_AD_, CVD_SENSOR11)
00300 #define CVD_SELECT_FVR_AND_GO __paste(CVD_AD_, FVR_AND_GO)
00301 #define CVD_SELECT_DAC_AND_GO __paste(CVD_AD_, DAC_AND_GO)
00302 #define CVD_SELECT_DAC_NOGO __paste(CVD_AD_, DAC_NOGO)
00303 #define CVD_SELECT_ISO_AND_GO __paste(CVD_AD_, ISO_AND_GO)
00304 #define CVD_SELECT_ISO_NOGO __paste(CVD_AD_, ISO_NOGO)
00305 #define CVD_SELECT_REFERENCE __paste(CVD_AD_, CVD_REFERENCE)
00306
00307 #if defined(_16F1826) || defined(_16LF1826) || defined(_16F1827) || defined(_16LF1827)
00308 #define CVD_PIN_AN0 0
00309 #define CVD_PIN_AN1 1
00310 #define CVD_PIN_AN2 2
00311 #define CVD_PIN_AN3 3
00312 #define CVD_PIN_AN4 4
00313 #define CVD_PIN_AN5 6
00314 #define CVD_PIN_AN6 7
00315 #define CVD_PIN_AN7 5
00316 #define CVD_PIN_AN8 4
00317 #define CVD_PIN_AN9 3
00318 #define CVD_PIN_AN10 2
00319 #define CVD_PIN_AN11 1
00320 #endif
00321
00322 #if defined(_16F1823) || defined(_16LF1823) || defined(_12F1822) || defined(_12LF1822) || defined(_16F1828) || defined(_16LF1828) || defined(_16F1825) || defined(_16LF1825) || defined(_16F1829) || defined(_16LF1829) || defined(_16F1824) || defined(_16LF1824)
00323 #define CVD_PIN_AN0 0
00324 #define CVD_PIN_AN1 1
00325 #define CVD_PIN_AN2 2
00326 #define CVD_PIN_AN3 4
00327
00328 #if defined(_16F1823) || defined(_16LF1823) || defined(_16F1824) || defined(_16LF1824) || defined(_16F1828) || defined(_16LF1828) || defined(_16F1825) || defined(_16LF1825) || defined(_16F1829) || defined(_16LF1829)
00329 #define CVD_PIN_AN4 0
00330 #define CVD_PIN_AN5 1
00331 #define CVD_PIN_AN6 2
00332 #define CVD_PIN_AN7 3
00333 #endif
00334
00335 #if defined(_16F1828) || defined(_16LF1828) || defined(_16F1829) || defined(_16LF1829)
00336 #define CVD_PIN_AN8 6
00337 #define CVD_PIN_AN9 7
00338 #define CVD_PIN_AN10 4
00339 #define CVD_PIN_AN11 5
00340 #endif
00341 #endif
00342
00343 #define CVD_PIN_SENSOR0 __paste(CVD_PIN_,CVD_SENSOR0)
00344 #define CVD_PIN_SENSOR1 __paste(CVD_PIN_,CVD_SENSOR1)
00345 #define CVD_PIN_SENSOR2 __paste(CVD_PIN_,CVD_SENSOR2)
00346 #define CVD_PIN_SENSOR3 __paste(CVD_PIN_,CVD_SENSOR3)
00347 #define CVD_PIN_SENSOR4 __paste(CVD_PIN_,CVD_SENSOR4)
00348 #define CVD_PIN_SENSOR5 __paste(CVD_PIN_,CVD_SENSOR5)
00349 #define CVD_PIN_SENSOR6 __paste(CVD_PIN_,CVD_SENSOR6)
00350 #define CVD_PIN_SENSOR7 __paste(CVD_PIN_,CVD_SENSOR7)
00351 #define CVD_PIN_SENSOR8 __paste(CVD_PIN_,CVD_SENSOR8)
00352 #define CVD_PIN_SENSOR9 __paste(CVD_PIN_,CVD_SENSOR9)
00353 #define CVD_PIN_SENSOR10 __paste(CVD_PIN_,CVD_SENSOR10)
00354 #define CVD_PIN_SENSOR11 __paste(CVD_PIN_,CVD_SENSOR11)
00355 #define CVD_PIN_REFERENCE __paste(CVD_PIN_,CVD_REFERENCE)
00356
00357 #if defined(_16F1826) || defined(_16LF1826) || defined(_16F1827) || defined(_16LF1827)
00358 #define CVD_PORT_AN0 _PORTA
00359 #define CVD_PORT_AN1 _PORTA
00360 #define CVD_PORT_AN2 _PORTA
00361 #define CVD_PORT_AN3 _PORTA
00362 #define CVD_PORT_AN4 _PORTA
00363 #define CVD_PORT_AN5 _PORTB
00364 #define CVD_PORT_AN6 _PORTB
00365 #define CVD_PORT_AN7 _PORTB
00366 #define CVD_PORT_AN8 _PORTB
00367 #define CVD_PORT_AN9 _PORTB
00368 #define CVD_PORT_AN10 _PORTB
00369 #define CVD_PORT_AN11 _PORTB
00370 #endif
00371
00372 #if defined(_16F1823) || defined(_16LF1823) || defined(_12F1822) || defined(_12LF1822) || defined(_16F1825) || defined(_16LF1825) || defined(_16F1828) || defined(_16LF1828) || defined(_16F1829) || defined(_16LF1829) || defined(_16F1824) || defined(_16LF1824)
00373 #define CVD_PORT_AN0 _PORTA
00374 #define CVD_PORT_AN1 _PORTA
00375 #define CVD_PORT_AN2 _PORTA
00376 #define CVD_PORT_AN3 _PORTA
00377
00378 #if defined(_16F1823) || defined(_16LF1823) || defined(_16F1824) || defined(_16LF1824) || defined(_16F1825) || defined(_16LF1825) || defined(_16F1828) || defined(_16LF1828) || defined(_16F1829) || defined(_16LF1829)
00379 #define CVD_PORT_AN4 _PORTC
00380 #define CVD_PORT_AN5 _PORTC
00381 #define CVD_PORT_AN6 _PORTC
00382 #define CVD_PORT_AN7 _PORTC
00383 #endif
00384
00385 #if defined(_16F1828) || defined(_16LF1828) || defined(_16F1829) || defined(_16LF1829)
00386 #define CVD_PORT_AN8 _PORTC
00387 #define CVD_PORT_AN9 _PORTC
00388 #define CVD_PORT_AN10 _PORTB
00389 #define CVD_PORT_AN11 _PORTB
00390 #endif
00391 #endif
00392
00393 #define CVD_PORT_SENSOR0 __paste(CVD_PORT_,CVD_SENSOR0)
00394 #define CVD_PORT_SENSOR1 __paste(CVD_PORT_,CVD_SENSOR1)
00395 #define CVD_PORT_SENSOR2 __paste(CVD_PORT_,CVD_SENSOR2)
00396 #define CVD_PORT_SENSOR3 __paste(CVD_PORT_,CVD_SENSOR3)
00397 #define CVD_PORT_SENSOR4 __paste(CVD_PORT_,CVD_SENSOR4)
00398 #define CVD_PORT_SENSOR5 __paste(CVD_PORT_,CVD_SENSOR5)
00399 #define CVD_PORT_SENSOR6 __paste(CVD_PORT_,CVD_SENSOR6)
00400 #define CVD_PORT_SENSOR7 __paste(CVD_PORT_,CVD_SENSOR7)
00401 #define CVD_PORT_SENSOR8 __paste(CVD_PORT_,CVD_SENSOR8)
00402 #define CVD_PORT_SENSOR9 __paste(CVD_PORT_,CVD_SENSOR9)
00403 #define CVD_PORT_SENSOR10 __paste(CVD_PORT_,CVD_SENSOR10)
00404 #define CVD_PORT_SENSOR11 __paste(CVD_PORT_,CVD_SENSOR11)
00405
00406
00407 #define CVD_PORT_REFERENCE __paste(CVD_PORT_,CVD_REFERENCE)
00408
00409 #endif
00410
00411