Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Para el desarrollo de programas para microcontroladores se tiene 2 alternativas en cuanto al tipo de lenguaje de programacin: Lenguaje de bajo nivel (ensamblador) Lenguaje de alto nivel (BASIC, C, ) El uso del lenguaje ensamblador tiene 3 ventajas fundamentales: Aprovechamiento ms eficiente de los recursos del microcontrolador. Depende del programador el obtener un cdigo optimizado tanto en nmero de instrucciones como en velocidad de ejecucin. Los microcontroladores PIC cuentan slo con 35 instrucciones las cuales pueden llegar a dominarse son relativa facilidad. En ocasiones el desarrollo de programas en lenguaje ensamblador se hace especialmente tedioso y requiere demasiado esfuerzo y tiempo. Este es el caso de los programas con cierta complejidad en los que, por ejemplo, se realizan determinado clculos matemticos. Una alternativa al lenguaje ensamblador es el uso de lenguajes de alto nivel para la programacin de los microcontroladores. En estos apuntes se describen algunas particularidades de la programacin en lenguaje C del los PIC de gama media y el uso del compilador PICC de HI-TECH.
Tipos de datos
Tipo Bit Char Unsingned char Short Unsigned short Int Unsigned int Long Unsigned long Flota Double Tamao (bits) 1 8 8 16 16 16 16 32 32 24 24 o 32 aritmtica Bolean Con o sin signo Entera sin signo Entera con signo Entera sin signo Entera con signo Entera sin signo Entera con signo Entera sin signo real Real
Formato de representacin numrica (Radix): Radix Binario Octal Decimal Hexadecimal Formato 0bnmero 0nmero nmero 0xnmero Ejemplo 0b00001011 0562 185 0xF3
Tipo bit:
Las variables de tipo bit slo puede almacenar los valores 0 1. Con ellas se puede hacer un uso eficiente de la memoria al permitir definir banderas que no consumen gran cantidad de memoria RAM. Para declarar una variable tipo bit se utiliza la palabra bit, por ejemplos: bit init_flag; static bit fin_flag;
Las variables tipo bit no pueden ser parmetro se una funcin, pero una funcin si puede retornar un valor en una variables de tipo bit. No se pueden definir punteros a variables de tipo bit ni inicializar estticamente este tipo de variables. Para que una variable tipo bit tenga un valor determinado se ha de inicializar explcitamente en el cdigo del programa. Cuando se asigna una variable de otro tipo a una tipo bit slo se asigna el bit menos significativo. Para asignar a una varible tipo bit el valor 0 1 dependiendo si en valor de una variable es cero o no se debe usar lo siguiente: Bit_varible = otra_varible = 0 A una variable de tipo bit se le puede asociar una direccin absoluta. Por ejemplos, para declarar una variable de tipo bit que sea el bit 13 de una variable de tipo int (16 bits): int var_nombre; bit var_nombre @ 13; Otro ejemplo: Definir una variable PD de tipo bit que permita acceder al bit 27 del registro STATUS: static unsigned char STATUS @ 0x03; static bit PD @ (unsigned)&STATUS*8+3; Esta ltima forma es la que se utiliza en los archivos de cabecera (.h) para definir los bits de los distintos registros. Esto permite hacer referencia a estos bits directamente. Por ejemplo: En pic1684.h el RB5 est definido como el bit 5 del registro PORTB, static volatile bit RB5 @ (unsigned)&PORTB*8+5; el GIE est definido como el bit 7 de INCONT static volatile bit GIE el RP0 el 5 bit del registro STATUS: static volatile bit
@ (unsigned)&INTCON*8+7;
RP0
@ (unsigned)&STATUS*8+5;
Tipo chart
Pude ser sin signo (por defecto) o consigno (opcin de compilacinSIGNED_CHAR al PIC C). El tipo char es el ms pequeo (8 bit) para la representacin de enteros. En los PIC este tipo de dato puede ser usado para almacenar enteros, para almacenar cdigo ASCII o para acceder a las localizaciones de entrada/salida.
El tipo de dato unsigned char es el que de forma natural manejan las instrucciones del PIC, por lo que se aconseja su uso siempre que sea posible ya que esto maximiza el rendimiento y minimiza el tamao del cdigo obtenido durante la compilacin.
donde: Sign: bit de signo: (-1)^sign Exponent: almacena el exponente con un exceso de 127 (exponente 0 se almacena como 127). Mantissa: mantissa El valor del nmero representado se calcula como Valor = (-1)^sign * 2^(biased_exponent-127) * 1.mantissa Un valor de 0 se indica con un exponent igual a cero. Ejemplos:
El procedimiento para el clculo en coma flotante se presenta mediante el ejemplo 1 de la tabla anterior: El bit de signo es cero. El biased_exponent es 251, por lo tanto el exponente es 251-127 = 124. Coger el nmero binario a la derecha del punto en la mantisa. Convertirlo a decimal y dividirlo por 2^23 donde 23 es en nmero de bits que representan la mantisa. Esto da 0.302447676659. El valor del nmero en coma flotante es: (-1)^0*2^124*1.302447676659 = 2.77000e+37
Variables absolutas
Una variable global o esttica puede ser localizada en una direccin absoluta si en su declaracin se usa el operador @ seguido de la direccin que se desea asignar a la variable. Ejemplo: volatile unsigned char Portvar @ 0x06 es la declaracin de la variable llamada charPortvar en la direccin 0x06. La lnea de ensamblador que genera el compilador para la declaracin anterior es: _Portvar equ 0x06 Ni el compilador ni el enlazador realizan un chequeo para comprobar el solapamiento de variables absolutas en la memoria. Esto es total responsabilidad del programador. Esta forma de localizacin de variables se utiliza en los archivos de definicin de smbolos (.h) para asociar identificadores de C con las direcciones los registros del PIC.
Estructuras y uniones
Se soportan los tipos struct y union de cualquier tamao a partir de 1 byte, as como punteros a estos tipos. Pueden se parmetros de entrada o salida de funciones
En la estructura siguiente entre los campos de tipo bit hi y lo se dejan 6 bits sin referencia: es el resultado de no poner nombre en la declaracin de un campo. struct{ unsigned hi : 1; unsigned : 6; unsigned lo : 1; } foo @ 0x10
Cadenas de caracteres
Una cadena constante siempre se localiza en la memoria ROM y es accesible slo mediante un puntero constante. En el siguiente ejemplo la cadena Hola a todos se almacena en la ROM : #define HOLA Hola a todos . SendBuff (HOLA); Un arreglo no constante inicializado con una cadena se almacena en la RAM, por ejemplo: char saludo[] = Hola a todos; produce un arreglo en la RAM el cual se inicializa con la cadena Hola a todos (copiado desde la ROM). Si el arreglo es constante, entonces se crea en la ROM. Para pasar una cadena constante como parmetro de una funcin, o asignar esta a un puntero, este ha de ser un const char *, por ejemplo: void SendBuff(const char * ptr)
Tambin deben declararse volatile las variables que pueden ser modificadas por la rutina de interrupcin.
Persistent
Una variable persistent no pierde su valor al apagar el microcontrolador. Estas variables se almacenan en zonas de memoria no voltil (nvram).
Punteros
El formato usado por los punteros depende de PIC. Para los microcontroladores de gama media, como el 16f877 las caractersticas son las siguientes:
Punteros a RAM:
Son de 8 bits, apuntan a la RAM usando el registro ndice FSR. Slo se tiene acceso 256 localizaciones, por tanto nicamente se tiene acceso a los bancos bank0 y bank1 de memoria.
Tipo que por defecto tienen las variables locales a una funcin. Ms adelante se ver en detalle.
Punteros a constantes:
Son de 16 bits. Con ellos se accede a la RAM o a la ROM. Si el MSB es 1, el puntero apounta a la RAM (a cualquiera de los bancos). Estos punteros permiten la lectura de pero no la escitura en la RAM. Si el MSB es 0 el puntero accede al espacio de memoria ROM.
Punteros a funciones:
La funcin se llama usando la direccin asignada al puntero.
Puntero a constante
Se usan para acceder a objetos que han sido declarados usando en modificador const. Los punteros a constante se comportan de forma similae al rerto de punteros excepto que no est permitido la escritura a traver de estos punteros, esto es lgico ya que estos referecian a valores constantes. De esta manera, dada la declaracin: const char * cptr; la siguiente lnea es correcta: ch = *cptr; pero es incorrecto: *cptr = ch; En los microcontroladores de gama media los punteros constante puede acceder a la ROM o a la RAM.
Manejo de interrupciones
El compilador permite el manejo de las interrupciones sin necesidad de escribir cdigo en ensamblador. El modificador interrupt puede ser aplicado a una funcin para indicar al compilador que se trata de una rutina de atencin a interrupcin. El compilador procesa este tipo de funcin de forma diferente a las otras funciones que no tiene es modificador interrupt, generando el cdigo para salvar y restrestaurar el valor de los registros usador y retornar de la funcin con una instruccin RETFIE, en vez de con un RETURN o RETLW. Una funcin de tipo interrup puede ser declarada de tipo interrrupt void y no tener parmetros. La llamada a una funcin interrup no se produce desde el cdigo del programa, sino por la ocurrencia de una interrupcin por por hardware. La funcin de atencin a interrupcin puede si puede llamar a otras funciones, sujeta a ciertas limitaciones.
Recuperacin de contexto
Todos los registros salvados en la pila durante la llamada a la funcin de atencin a interrupcin son automaticamente recuperados cuando finaliza dicha funcin y antes de retornar al punto del programa donde se produjo la interrupcin.
Habilitacin de interrupciones
Existen dos macros para habilitar y deshabilitar las interrupciones: ei( ) habilita todas las interrupciones. di( ) deshabilita todas las interrupciones. En los PIC de gama media estas macros afectan al bit GIE del registro INTCON. Las macros debe ser usadas una vez activados los bits de mascara de las insterrupciones que se quieren habilitar. Por ejemplo: ADIE = 1; PEIE = 1; ei(); . di(); // habilita la interrupcin por fin de conversin A/D // habilita todas las interrupciones de perisfricos //habilita todas las interrupciones //deshabilita todas las interrupciones
Variables locales
C soporta dos clases de viables locales a una funcin: las variables auto y las static.
Variables auto
Es el tipo por defecto de las variables locales. Al menos que explcitamente se declare que una variable es de la clase static, esta ser auto. A diferencia de los parmetros de la funcin, estas variables no son localizadas en memoria en el mismo orden en que han sido declaradas. La mayora de los modificadores de tipo no pueden ser usados para esta clase de variables, a excepcin de const y volatile. Todas las variables auto so localizadas en el banco 0. Los modificadores de banco (bankx) no pueden ser usados en este tipo de variables.
Variables static
Las variables static no inicializadas mantienen su valor entre llamadas a la funcin en la que han sido declaradas. Adems a ellas se puede acceder para leer o modificar su contenido desde otras funciones por medio de punteros. La inicializacin de una variables static solo se realiza una vez durante la ejecucin de programa. Por tanto es preferible su uso al de variables auto inicializadas, cuya inicializacin se realiza cada vez que el bloque (funcin) donde se define es ejecutado.
donde: Processor Type: es pic Processor Range es 2 para los de gama baja, 3 para los de media y 7 para los de gama alta. n es el nmero de bancos de memoria ROM. m es el nmero de bancos de memoria RAM. Double Type: es - para la representacin 24 bits y d para representacin en 32 bits. Library Type: es c para bibliotecas estndares, l para libreras que contienen funciones relacionadas con printf con soporte adicional para tipo de datos tipo long, es f para libreras que contienen funciones relacionadas con printf con soporte adicional para tipo de datos tipo long y float.
Por ejemplo, el fichero con nombre PIC401DC.LIB contiene la librera de tipo estandar (C) con soporte para el tipo de datos double de 32 bits (D) de un PIC de gama media (4) con 1 banco de memoria RAM y ningn banco de memoria ROM. En estas bibliotecas existen funciones para: Clculo matemtico (sin, cos, exp, eval_poly, log,.) Manejo de memoria (memchr, memcpy, memmove,) Operaciones con cadenas (strchr, strcat, strcpm,)
Una descripcin detallada de las funciones disponibles y su uso se puede consultar en la gua de usuario del compilador PIC C (Users guide PIC ANSI C compiler). Para hacer uso de las funciones disponibles en las BE se ha de incluir el archivo .h donde se declara las funciones a usar. Ejemplo: archivo en que se define una funcin para el clculo del cos-1 (x). La primera lnea del programa incluye el fichero math.h donde se declara la funcin asin().
Header file for the Microchip PIC 16F870 PIC 16F871 PIC 16F872 chip PIC 16F873 chip PIC 16F874 chip PIC 16F876 chip PIC 16F877 chip Midrange Microcontroller
#if defined(_16F874) || defined(_16F877) || defined(_16F871) #define __PINS_40 #endif static volatile unsigned char TMR0 @ 0x01; static volatile unsigned char PCL @ 0x02; static volatile unsigned char STATUS @ 0x03; static unsigned char FSR @ 0x04; static volatile unsigned char PORTA @ 0x05; static volatile unsigned char PORTB @ 0x06; static volatile unsigned char PORTC @ 0x07; #ifdef __PINS_40 static volatile unsigned char PORTD @ 0x08; static volatile unsigned char PORTE @ 0x09; #endif static unsigned char PCLATH @ 0x0A; static volatile unsigned char INTCON @ 0x0B; static volatile unsigned char PIR1 @ 0x0C; static volatile unsigned char PIR2 @ 0x0D; static volatile unsigned char TMR1L @ 0x0E; static volatile unsigned char TMR1H @ 0x0F; static volatile unsigned char T1CON @ 0x10; static volatile unsigned char TMR2 @ 0x11; static volatile unsigned char T2CON @ 0x12; #if !defined(_16F870) && !defined(_16F871) static volatile unsigned char SSPBUF @ 0x13; static volatile unsigned char SSPCON @ 0x14; #endif static volatile unsigned char CCPR1L @ 0x15; static volatile unsigned char CCPR1H @ 0x16; static volatile unsigned char CCP1CON @ 0x17; #ifndef _16F872 static volatile unsigned char RCSTA @ 0x18; static volatile unsigned char TXREG @ 0x19; static volatile unsigned char RCREG @ 0x1A; #if !defined(_16F870) && !defined(_16F871)
static volatile unsigned char static volatile unsigned char static volatile unsigned char #endif #endif static volatile unsigned char static volatile unsigned char
ADRESH ADCON0
@ 0x1E; @ 0x1F;
/* bank 1 registers */ static unsigned char bank1 OPTION static volatile unsigned char bank1 TRISA static volatile unsigned char bank1 TRISB static volatile unsigned char bank1 TRISC #ifdef __PINS_40 static volatile unsigned char bank1 TRISD static volatile unsigned char bank1 TRISE #endif static volatile unsigned char bank1 PIE1 static volatile unsigned char bank1 PIE2 static volatile unsigned char bank1 PCON #if !defined(_16F870) && !defined(_16F871) static volatile unsigned char bank1 SSPCON2 #endif static volatile unsigned char bank1 PR2 #if !defined(_16F870) && !defined(_16F871) static volatile unsigned char bank1 SSPADD static volatile unsigned char bank1 SSPSTAT #endif #ifndef _16F872 static volatile unsigned char bank1 TXSTA static volatile unsigned char bank1 SPBRG #endif static vo latile unsigned char bank1 ADRESL static volatile unsigned char bank1 ADCON1 /* bank 2 registers */ static volatile unsigned char bank2 static volatile unsigned char bank2 static volatile unsigned char bank2 static volatile unsigned char bank2
@ 0x81; @ 0x85; @ 0x86; @ 0x87; @ 0x88; @ 0x89; @ 0x8C; @ 0x8D; @ 0x8E; @ 0x91; @ 0x92; @ 0x93; @ 0x94;
/* bank 3 registers */ static volatile unsigned char bank3 EECON1 static volatile unsigned char bank3 EECON2 /* STATUS bits static volatile bit static volatile bit static volatile bit static volatile bit static volatile bit static volatile bit
@ 0x18C; @ 0x18D;
*/ IRP @ (unsigned)&STATUS*8+7; RP1 @ (unsigned)&STATUS*8+6; RP0 @ (unsigned)&STATUS*8+5; TO @ (unsigned)&STATUS*8+4; PD @ (unsigned)&STATUS*8+3; ZERO @ (unsigned)&STATUS*8+2;
static volatile bit static volatile bit /* PORTA bits static volatile bit static volatile bit static volatile bit static volatile bit static volatile bit static volatile bit /* PORTB bits static volatile bit static volatile bit static volatile bit static volatile bit static volatile bit static volatile bit static volatile bit static volatile bit /* PORTC bits static volatile bit static volatile bit static volatile bit static vo latile bit static volatile bit static volatile bit static volatile bit static volatile bit /* PORTD bits #ifdef __PINS_40 static volatile bit static volatile bit static volatile bit static volatile bit static volatile bit static volatile bit static volatile bit static volatile bit /* PORTE bits static volatile bit static volatile bit static volatile bit #endif /* INTCON bits static volatile bit static volatile bit static volatile bit
DC @ (unsigned)&STATUS*8+1; CARRY @ (unsigned)&STATUS*8+0; */ RA5 RA4 RA3 RA2 RA1 RA0 */ RB7 RB6 RB5 RB4 RB3 RB2 RB1 RB0 */ RC7 RC6 RC5 RC4 RC3 RC2 RC1 RC0 */ RD7 RD6 RD5 RD4 RD3 RD2 RD1 RD0 */ RE2 RE1 RE0 @ (unsigned)&PORTD*8+7; @ (unsigned)&PORTD*8+6; @ (unsigned)&PORTD*8+5; @ (unsigned)&PORTD*8+4; @ (unsigned)&PORTD*8+3; @ (unsigned)&PORTD*8+2; @ (unsigned)&PORTD*8+1; @ (unsigned)&PORTD*8+0;
static volatile bit static volatile bit static volatile bit static volatile bit static volatile bit
INTE @ (unsigned)&INTCON*8+4; RBIE @ (unsigned)&INTCON*8+3; T0IF @ (unsigned)&INTCON*8+2; INTF @ (unsigned)&INTCON*8+1; RBIF @ (unsigned)&INTCON*8+0;
/* PIR1 bits */ #ifdef __PINS_40 static volatile bit PSPIF @ (unsigned)&PIR1*8+7; #endif static volatile bit ADIF @ (unsigned)&PIR1*8+6; #ifndef _16F872 static volatile bit RCIF @ (unsigned)&PIR1*8+5; static volatile bit TXIF @ (unsigned)&PIR1*8+4; #endif #if !defined(_16F870) && !defined(_16F871) static volatile bit SSPIF @ (unsigned)&PIR1*8+3; #endif static volatile bit CCP1IF @ (unsigned)&PIR1*8+2; static volatile bit TMR2IF @ (unsigned)&PIR1*8+1; static volatile bit TMR1IF @ (unsigned)&PIR1*8+0; /* PIR2 bits */ static volatile bit EEIF @ (unsigned)&PIR2*8+4; #if !defined(_16F870) && !defined(_16F871) static volatile bit BCLIF @ (unsigned)&PIR2*8+3; #ifndef _16F872 static volatile bit CCP2IF @ (unsigned)&PIR2*8+0; #endif #endif /* T1CON bits static volatile bit static volatile bit static volatile bit static volatile bit static volatile bit static volatile bit /* T2CON bits static volatile bit static volatile bit static volatile bit static volatile bit static volatile bit static volatile bit static volatile bit */ T1CKPS1 T1CKPS0 T1OSCEN T1SYNC TMR1CS TMR1ON */ TOUTPS3 TOUTPS2 TOUTPS1 TOUTPS0 TMR2ON T2CKPS1 T2CKPS0
/* SSPCON bits */ #if !defined(_16F870) && !defined(_16F871) static volatile bit WCOL @ (unsigned)&SSPCON*8+7; static volatile bit SSPOV @ (unsigned)&SSPCON*8+6;
static volatile bit SSPEN static volatile bit CKP static volatile bit SSPM3 static volatile bit SSPM2 static volatile bit SSPM1 static volatile bit SSPM0 #endif /* CCP1CON bits */ static volatile bit CCP1X static volatile bit CCP1Y static volatile bit CCP1M3 static volatile bit CCP1M2 static volatile bit CCP1M1 static volatile bit CCP1M0 /* RCSTA bits #ifndef _16F872 static volatile bit static volatile bit static volatile bit static volatile bit static volatile bit static volatile bit static volatile bit static volatile bit #endif */ SPEN RX9 SREN CREN ADDEN FERR OERR RX9D
/* CCP2CON bits */ #if !defined(_16F870) && !defined(_16F871) && !defined(_16F872) static volatile bit CCP2X @ (unsigned)&CCP2CON*8+5; static volatile bit CCP2Y @ (unsigned)&CCP2CON*8+4; static volatile bit CCP2M3 @ (unsigned)&CCP2CON*8+3; static volatile bit CCP2M2 @ (unsigned)&CCP2CON*8+2; static volatile bit CCP2M1 @ (unsigned)&CCP2CON*8+1; static volatile bit CCP2M0 @ (unsigned)&CCP2CON*8+0; #endif /* ADCON0 bits */ static volatile bit ADCS1 static volatile bit ADCS0 static volatile bit CHS2 static volatile bit CHS1 static volatile bit CHS0 static volatile bit ADGO static volatile bit ADON /* OPTION bits static bank1 bit static bank1 bit static bank1 bit static bank1 bit static bank1 bit */ RBPU INTEDG T0CS T0SE PSA
/* TRISA bits */ static volatile bank1 bit static volatile bank1 bit static volatile bank1 bit static volatile bank1 bit static volatile bank1 bit static volatile bank1 bit /* TRISB bits */ static volatile bank1 bit static volatile bank1 bit static volatile bank1 bit static volatile bank1 bit static volatile bank1 bit static volatile bank1 bit static volatile bank1 bit static volatile bank1 bit /* TRISC bits */ static volatile bank1 bit static volatile bank1 bit static volatile bank1 bit static volatile bank1 bit static volatile bank1 bit static volatile bank1 bit static volatile bank1 bit static volatile bank1 bit #ifdef __PINS_40 /* TRISD bits */ static volatile bank1 bit static volatile bank1 bit static volatile bank1 bit static volatile bank1 bit static volatile bank1 bit static volatile bank1 bit static volatile bank1 bit static volatile bank1 bit /* TRISE bits */ static volatile bank1 bit static volatile bank1 bit static volatile bank1 bit static volatile bank1 bit static volatile bank1 bit static volatile bank1 bit static volatile bank1 bit
#endif /* PIE1 bits */ #ifdef __PINS_40 static volatile bank1 bit #endif static volatile bank1 bit #ifndef _16F872 static volatile bank1 bit static volatile bank1 bit #endif static volatile bank1 bit static volatile bank1 bit static volatile bank1 bit static volatile bank1 bit /* PIE2 bits */ static volatile bank1 bit static volatile bank1 bit #ifndef _16F872 static volatile bank1 bit #endif /* PCON bits */ static volatile bank1 bit static volatile bank1 bit
POR BOR
@ (unsigned)&PCON*8+1; @ (unsigned)&PCON*8+0;
/* SSPCON2 bits */ #if !defined(_16F870) && !defined(_16F871) static volatile bank1 bit GCEN @ (unsigned)&SSPCON2*8+7; static volatile bank1 bit ACKSTAT @ (unsigned)&SSPCON2*8+6; static volatile bank1 bit ACKDT @ (unsigned)&SSPCON2*8+5; static volatile bank1 bit ACKEN @ (unsigned)&SSPCON2*8+4; static volatile bank1 bit RCEN @ (unsigned)&SSPCON2*8+3; static volatile bank1 bit PEN @ (unsigned)&SSPCON2*8+2; static volatile bank1 bit RSEN @ (unsigned)&SSPCON2*8+1; static volatile bank1 bit SEN @ (unsigned)&SSPCON2*8+0; #endif /* SSPSTAT bits */ #if !defined(_16F870) && !defined(_16F871) static volatile bank1 bit STAT_SMP static volatile bank1 bit STAT_CKE static volatile bank1 bit STAT_DA static volatile bank1 bit STAT_P static volatile bank1 bit STAT_S static volatile bank1 bit STAT_RW static volatile bank1 bit STAT_UA static volatile bank1 bit STAT_BF #endif /* TXSTA bits */
#ifndef _16F872 static volatile bank1 bit static volatile bank1 bit static volatile bank1 bit static volatile bank1 bit static volatile bank1 bit static volatile bank1 bit static volatile bank1 bit #endif /* ADCON1 bits */ static volatile bank1 bit static volatile bank1 bit static volatile bank1 bit static volatile bank1 bit static volatile bank1 bit /* EECON1 bits */ static volatile bank3 bit static volatile bank3 bit static volatile bank3 bit static volatile bank3 bit static volatile bank3 bit
/* macro versions of EEPROM write and read */ #define EEPROM_WRITE(addr, while(WR)continue;EEADR=(addr);EEDATA=(value);GIE=0;WREN=1;\ EECON2=0x55;EECON2=0xAA;WR=1;WREN=0 #define EEPROM_READ(addr) ((EEADR=(addr)),(EEPGD=0),(RD=1),EEDATA) /* library function versions */ extern void eeprom_write(unsigned char addr, unsigned char value); extern unsigned char eeprom_read(unsigned char addr); #define CONFIG_ADDR #define FOSC0 #define FOSC1 #define WDTE #define PWRTE #define CP0 #define CP1 #define BODEN #define LVP #define CPD #define WRT #define BKBUG #define UNPROTECT #define PROTECT 0x2007 0x01 0x02 0x04 0x08 0x1010 0x2020 0x40 0x80 0x100 0x200 0x800 (CP0 | CP1) 0x0000
value)
#if !defined(_16F870) && !defined(_16F871) #define PROTECT_TOP CP1 /* protects top 256 bytes, 1F00h to 1FFFh */ #define PROTECT50 CP0 /* protects upper half of address space */ /* 1000h to 1FFFh (pic16f887/876) */ /* 0800h to 0FFFh (pic16f874/873) */ #endif