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
00043 #ifndef __pic_utils_h
00044 #define __pic_utils_h
00045
00046 #include <system.h>
00047 #include "config.h"
00048
00049
00050 #ifdef GPIO
00051 #define NUMBER_PORTS 1
00052 #endif
00053 #ifdef PORTB
00054 #define NUMBER_PORTS 2
00055 #endif
00056 #ifdef PORTC
00057 #undef NUMBER_PORTS
00058 #define NUMBER_PORTS 3
00059 #endif
00060 #ifdef PORTD
00061 #undef NUMBER_PORTS
00062 #define NUMBER_PORTS 4
00063 #endif
00064 #ifdef PORTE
00065 #undef NUMBER_PORTS
00066 #define NUMBER_PORTS 5
00067 #endif
00068 #ifdef PORTF
00069 #undef NUMBER_PORTS
00070 #define NUMBER_PORTS 6
00071 #endif
00072 #ifdef PORTG
00073 #undef NUMBER_PORTS
00074 #define NUMBER_PORTS 7
00075 #endif
00076
00077
00078
00079 #define int8 char
00080 #define uns8 unsigned char
00081 #define uns16 unsigned int
00082 #define int16 int
00083 #define uns32 unsigned long
00084 #define int32 long
00085
00086
00087
00088
00089
00090 #ifdef _PIC16
00091 extern uns8 port_shadow[NUMBER_PORTS];
00092 #ifdef GPIO
00093 volatile uns8 port_array[NUMBER_PORTS] @GPIO;
00094 volatile uns8 tris_array[NUMBER_PORTS] @TRISIO;
00095 #else
00096 volatile uns8 port_array[NUMBER_PORTS] @PORTA;
00097 volatile uns8 tris_array[NUMBER_PORTS] @TRISA;
00098 #endif
00099 #endif
00100 #ifdef _PIC18
00101 volatile uns8 port_in_array[NUMBER_PORTS] @PORTA;
00102 volatile uns8 port_array[NUMBER_PORTS] @LATA;
00103 volatile uns8 tris_array[NUMBER_PORTS] @TRISA;
00104 #endif
00105
00106
00107
00108
00109
00110
00111
00112
00113 #ifdef _PIC16F88
00114 #define turn_analog_inputs_off() ansel = 0
00115 #elif _PIC16F876A
00116 #define turn_analog_inputs_off() adcon1 = 6
00117 #elif _PIC16F877A // Note - 16F877a unverified
00118 #define turn_analog_inputs_off() adcon1 = 6
00119 #elif _PIC18F4520
00120 #define turn_analog_inputs_off() adcon1 = 15
00121 #elif _PIC18F452
00122 #define turn_analog_inputs_off() adcon1 = 6
00123 #elif _PIC18F2620
00124 #define turn_analog_inputs_off() adcon1 = 15
00125 #elif _PIC18F4550
00126 #define turn_analog_inputs_off() adcon1 = 15
00127 #elif _PIC18F67J50
00128 #define turn_analog_inputs_off() clear_bit(adcon0, ADON);
00129 #elif _PIC18F26K20
00130 #define turn_analog_inputs_off() ansel = 0; anselh = 0;
00131 #elif _PIC18F25K20
00132 #define turn_analog_inputs_off() ansel = 0; anselh = 0;
00133 #elif _PIC18F14K50
00134 #define turn_analog_inputs_off() ansel = 0; anselh = 0;
00135 #elif _PIC12F609
00136
00137 #define turn_analog_inputs_off()
00138 #else
00139 #error "ERROR !!! - See pic_utils.h for turning off analog inputs on your pic"
00140 #endif
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 #ifdef _PIC16
00177 #ifdef GPIO
00178 #define set_pin(port, pin) \
00179 set_bit(port_shadow[port - GPIO], pin); \
00180 port_array[port - GPIO] = port_shadow[port - GPIO];
00181
00182 #define clear_pin(port, pin) \
00183 clear_bit(port_shadow[port - GPIO], pin); \
00184 port_array[port - GPIO] = port_shadow[port - GPIO];
00185
00186 #define toggle_pin(port, pin) \
00187 port_shadow[port - GPIO] ^= (1 << (pin)); \
00188 port_array[port - GPIO] = port_shadow[port - GPIO];
00189
00190
00191 #define test_pin(port, pin) \
00192 ((port_array[port - GPIO] & (1 << pin)) != 0)
00193
00194 #define change_pin(port, pin, value) \
00195 if (value) { \
00196 set_pin(port, pin); \
00197 } else { \
00198 clear_pin(port, pin); \
00199 }
00200 #else
00201
00202 #define set_pin(port, pin) \
00203 set_bit(port_shadow[port - PORTA], pin); \
00204 port_array[port - PORTA] = port_shadow[port - PORTA];
00205
00206 #define clear_pin(port, pin) \
00207 clear_bit(port_shadow[port - PORTA], pin); \
00208 port_array[port - PORTA] = port_shadow[port - PORTA];
00209
00210 #define toggle_pin(port, pin) \
00211 port_shadow[port - PORTA] ^= (1 << (pin)); \
00212 port_array[port - PORTA] = port_shadow[port - PORTA];
00213
00214
00215 #define test_pin(port, pin) \
00216 ((port_array[port - PORTA] & (1 << pin)) != 0)
00217
00218 #define change_pin(port, pin, value) \
00219 if (value) { \
00220 set_pin(port, pin); \
00221 } else { \
00222 clear_pin(port, pin); \
00223 }
00224 #endif
00225 void set_pin_var(uns8 port, uns8 pin);
00226 void clear_pin_var(uns8 port, uns8 pin);
00227 void toggle_pin_var(uns8 port, uns8 pin);
00228 #define test_pin_var(port, pin) test_pin(port, pin)
00229 void change_pin_var(uns8 port, uns8 pin, bit value);
00230
00231
00232 #else
00233
00234
00235 #define set_pin(port, pin) \
00236 set_bit(port_array[port - PORTA], pin);
00237
00238 #define clear_pin(port, pin) \
00239 clear_bit(port_array[port - PORTA], pin);
00240
00241 #define toggle_pin(port, pin) \
00242 port_array[port - PORTA] ^= (1 << (pin));
00243
00244
00245 #define test_pin(port, pin) \
00246 ((port_in_array[port - PORTA] & (1 << pin)) != 0)
00247
00248 #define test_output_pin(port, pin) \
00249 ((port_array[port - PORTA] & (1 << pin)) != 0)
00250
00251 #define change_pin(port, pin, value) \
00252 if (value) { \
00253 set_pin(port, pin); \
00254 } else { \
00255 clear_pin(port, pin); \
00256 }
00257
00258 #define set_pin_var(port, pin) \
00259 set_pin(port, pin)
00260 #define clear_pin_var(port, pin) \
00261 clear_pin(port, pin)
00262 #define toggle_pin_var(port, pin) \
00263 toggle_pin(port, pin)
00264 #define test_pin_var(port, pin) test_pin(port, pin)
00265 #define change_pin_var(port, pin, value) \
00266 change_pin(port, pin, value)
00267
00268
00269 #endif
00270
00271
00272
00273
00274
00275
00276
00277
00278 #define make_output(port, pin) clear_bit(tris_array[port - PORTA], pin)
00279 #define make_input(port, pin) set_bit(tris_array[port - PORTA], pin)
00280
00281 #define turn_peripheral_ints_on() set_bit(intcon, PEIE)
00282 #define turn_peripheral_ints_off() clear_bit(intcon, PEIE)
00283
00284 #define turn_global_ints_on() set_bit(intcon, GIE)
00285 #define turn_global_ints_off() clear_bit(intcon, GIE)
00286
00287
00288 #define kill_interrupts() clear_bit(intcon, GIE); \
00289 nop(); \
00290 nop(); \
00291 nop(); \
00292 nop()
00293
00294
00295 #define start_crit_sec() \
00296 bit store_gie = intcon.GIE; \
00297 kill_interrupts()
00298
00299
00300 #define end_crit_sec() \
00301 intcon.GIE = store_gie
00302
00303
00304 #if PLATFORM_CLOCK == 64000000
00305 #pragma CLOCK_FREQ 64000000
00306 #define GOT_CLOCK
00307 #endif
00308
00309 #if PLATFORM_CLOCK == 48000000
00310 #pragma CLOCK_FREQ 48000000
00311 #define GOT_CLOCK
00312 #endif
00313
00314 #if PLATFORM_CLOCK == 40000000
00315 #pragma CLOCK_FREQ 40000000
00316 #define GOT_CLOCK
00317 #endif
00318
00319 #if PLATFORM_CLOCK == 20000000
00320 #pragma CLOCK_FREQ 20000000
00321 #define GOT_CLOCK
00322 #endif
00323
00324
00325 #if PLATFORM_CLOCK == 16000000
00326 #pragma CLOCK_FREQ 16000000
00327 #define GOT_CLOCK
00328 #endif
00329
00330 #if PLATFORM_CLOCK == 12000000
00331 #pragma CLOCK_FREQ 12000000
00332 #define GOT_CLOCK
00333 #endif
00334
00335
00336 #if PLATFORM_CLOCK == 8000000
00337 #pragma CLOCK_FREQ 8000000
00338 #define GOT_CLOCK
00339 #endif
00340
00341 #if PLATFORM_CLOCK == 4000000
00342 #pragma CLOCK_FREQ 4000000
00343 #define GOT_CLOCK
00344 #endif
00345
00346
00347
00348 #ifndef GOT_CLOCK
00349 #warning "Don't know about your clock. See pic_utils.h"
00350 #endif
00351
00352 #ifdef _PIC16
00353 #define boostbloader() \
00354 kill_interrupts(); \
00355 delay_ms(250); \
00356 delay_ms(250); \
00357 delay_ms(250); \
00358 delay_ms(250); \
00359 asm bcf _pclath,3 \
00360 asm bcf _pclath,4 \
00361 asm data 0x2000
00362 #endif
00363
00364
00365 #ifdef _PIC18
00366 #define boostbloader() \
00367 kill_interrupts(); \
00368 delay_ms(250); \
00369 delay_ms(250); \
00370 delay_ms(250); \
00371 delay_ms(250); \
00372 asm reset
00373 #endif
00374
00375 #define MAGIC_BOOSTBLOADER_REQUEST 4
00376
00377
00378 #endif