2.10 Mikroc PRO for PIC
Como ya hemos visto, hay varias divergencias entre los lenguajes mikroC y ANSI C. En este capĂtulo vamos a presentar las caracterĂsticas especĂficas del mikroC con el propĂłsito de facilitar la programaciĂłn de los microcontroladores PIC.
ACCESO A LOS REGISTROS DE FUNCIONES ESPECIALES (SFR)
Como todos los microcontroladores, los de familia PIC tienen los registros de funciones especiales (SFR). Para programar un PIC, es necesario acceder a estos registros (para leerlos o escribir en ellos). Al utilizar el compilador
mikroC PRO for PIC es posible de acceder a cualquier SFR del microcontrolador de cualquier parte del cĂłdigo (los SFR se consideran como variables globales) sin necesidad de declararlo anteriormente. Los registros de funciones especiales se definen en un archivo externo e incluido dentro del compilador (archivo .def). Este archivo contiene todos los SFR del microcontrolador PIC a programar.
TRISB = 0; // todos los pines del puerto PORTB se configuran como salidas
PORTB = 0; // todos los pines del PORTB se ponen a 0
ACCESO A LOS BITS INDIVIDUALES
El compilador
mikroC PRO for PIC le permite acceder a los bits individuales de variables de 8 bits por su nombre o su posiciĂłn en byte:
INTCON.B0 = 0; // Poner a 0 el bit 0 del registro INTCON
ADCON0.F5 = 1; // Poner a 1 el bit 5 del registo ADCON0
INTCON.GIE = 0; // Poner a 0 el bit de interrupciĂłn global (GIE)
Para acceder a un bit individual, se puede utilizar '.FX' asĂ como '.BX' (X es un entero entre 0 y 7 que representa la posiciĂłn de bit).
TIPO SBIT
Si quiere declarar una variable que corresponde a un bit de un SFR, hay que utilizar el tipo
sbit. Una variable de tipo
sbit se comporta como un puntero y se debe declarar como una variable global:
sbit Botón_PARADA at PORTA.B7; // Botón_PARADA está definido
...
void main() { // Cualquier modificación de Botón_PARADA afectará a PORTA.B7
... // Cualquier modificación de PORTA.B7 afectará a Botón_PARADA
}
En este ejemplo, El
Botón_PARADA es una variable declarada por el usuario, mientras que PORTA.B7 (bit 7 del puerto PORTA) será automáticamente reconocido por el compilador.
TIPO BIT
El compilador mikroC PRO for PIC proporciona un tipo de datos bit que se puede utilizar para declarar variables. No se puede utilizar en las listas de argumentos, punteros y los valores devueltos de funciones. Además, no es posible declarar e inicializar una variable de tipo bit en la misma lĂnea. El compilador determina el bit en uno de los registros disponibles para almacenar las variables.
bit bf; // Variable de tipo bit válida
bit *ptr; // Varibale de tipo bit inválida.
// No hay punteros a una variable de tipo bit
bit bg = 0; // ERROR ; declaración con inicialización no está permitida
bit bg;
bg = 0; // Declaración e inicialización válidas
INSERTAR CÓDIGO ASM EN C
A veces el proceso de escribir un programa en C requiere las partes del cĂłdigo escritas en ensamblador. Esto permite ejecutar las partes complicadas del programa de una forma definida con precisiĂłn en un perĂodo de tiempo exacto. Por ejemplo, cuando se necesita que los pulsos muy cortos (de unos microsegundos) aparezcan periĂłdicamente en un pin del microcontrolador. En tales casos la soluciĂłn más simple serĂa utilizar el cĂłdigo ensamblador en la parte del programa que controla la duraciĂłn de pulsos.
Una o más instrucciones en ensamblador están insertadas en el programa escrito en C, utilizando el comando
asm:
asm
{
instrucciones en ensamblador
...
}
Los códigos escritos en ensamblador pueden utilizar constantes y variables anteriormente definidos en C. Por supuesto, como el programa entero está escrito en C, sus reglas se aplican al declarar estas constantes y variables.
unsigned char maximum = 100; // Declarar variables: maximum = 100
asm
{ // Inicio del cĂłdigo ensamblador
MOVF maximum,W // W = maximum = 100
...
} // Final del cĂłdigo ensamblador
FUNCIÓN DE INTERRUPCIÓN
Una interrupciĂłn detiene la ejecuciĂłn normal de un programa para ejecutar las operaciones especĂficas. Una lista de sentencias a ejecutar debe estar escrita dentro de una funciĂłn particular denominada
interrupt(). La sintaxis de una interrupciĂłn en mikroC se parece a lo siguiente:
void interrupt() {
cnt++ ; // Al producirse una interrupciĂłn
// la cnt se incrementa en 1
PIR1.TMR1IF = 0; // Poner a 0 el bit TMR1IF
}
A diferencia de las funciones estándar, no es necesario declarar el prototipo de la función
interrupt(). Además, como la ejecuciĂłn de esta funciĂłn no forma parte de la ejecuciĂłn de programa regular, no se debe llamar de ninguna parte de programa (se ejecutará automáticamente dependiendo de las condiciones que el usuario ha definido en el programa). En el siguiente capĂtulo vamos a dar una clara explicaciĂłn de la ejecuciĂłn y definiciĂłn de subrutinas de interrupciĂłn.
LIBRERĂŤAS
Usted probablemente ha notado que en los ejemplos anteriores hemos utilizado algunas funciones como son 'Delay_ms', 'LCD_out', 'LCD_cmd' etc. Estas funciones están definidas en las librerĂas contenidas en el compilador
mikroC.
Una librerĂa representa un cĂłdigo compilado, anteriormente escrito en mikroC, que contiene un conjunto de variables y funciones. Cada librerĂa tiene un propĂłsito especĂfico. Por ejemplo, la librerĂa LCD contiene funciones de visualizaciĂłn de la pantalla LCD, mientras que
C_math proporciona algunas funciones matemáticas.
Antes de utilizar alguna de ellas en el programa, es necesario comunicárselo al compilador al marcarlas en la lista de las librerĂas del compilador existentes. Si el compilador encuentra una funciĂłn desconocida durante la ejecuciĂłn de programa, primero va a buscar su declaraciĂłn en las librerĂas marcadas.
Aparte de las librerĂas existentes, es posible crear las librerĂas y luego utilizarlas en el programa. El procedimiento de cĂłmo crear librerĂas se describe en detalles en Help (
Ayuda) del compilador.
El compilador mikroC incluye tres tipos de librerĂas:
- librerĂas ANSI C estándar:
| LIBRARĂŤA |
DESCRIPCIÓN |
| ANSI C Ctype Library |
Utilizada principalmente para probar o para convertir los datos |
| ANSI C Math Library |
Utilizada para las operaciones matemáticas de punto flotante |
| ANSI C Stdlib Library |
Contiene las funciones de librerĂas estándar |
| ANSI C String Library |
Utilizada para realizar las operaciones de cadenas y de manipulaciĂłn de memoria |
- librerĂas misceláneas:
| LIBRARĂŤA |
DESCRIPCIÓN |
| Button Library |
Utilizada para desarrollar los proyectos |
| Conversion Library |
Utilizada para la conversiĂłn de tipos de datos |
| Sprint Library |
Utilizada para formatear los datos con facilidad |
| PrintOut Library |
Utilizada para formatear los datos e imprimirlos |
| Time Library |
Utilizada para cálculos de tiempo (formato UNIX time) |
| Trigonometry Library |
Utilizada para la implementación de funciones trigonométricas fundamentales |
| Setjmp Library |
Utilizada para los saltos de programa |
- librerĂas para el hardware:
| LIBRARĂŤA |
DESCRIPCIÓN |
| ADC Library |
Utilizada para el funcionamiento del convertidor A/D |
| CAN Library |
Utilizada para las operaciones con el mĂłdulo CAN |
| CANSPI Library |
Utilizada para las operaciones con el mĂłdulo CAN externo (MCP2515 o MCP2510) |
| Compact Flash Library |
Utilizada para las operaciones con las tarjetas de memoria Compact Flash |
| EEPROM Library |
Utilizada para las operaciones con la memoria EEPROM incorporada |
| EthernetPIC18FxxJ60 Library |
Utilizada para las operaciones con el mĂłdulo Ethernet incorporado |
| Flash Memory Library |
Utilizada para las operaciones con la memoria Flash incorporada |
| Graphic Lcd Library |
Utilizada para las operaciones con el módulo LCD gráfico con resolución 128x64 |
| I2C Library |
Utilizada para las operaciones con el mĂłdulo de comunicaciĂłn serial I2C incorporado |
| Keypad Library |
Utilizada para las operaciones con el teclado (botones de presiĂłn 4x4) |
| Lcd Library |
Utilizada para las operaciones con el LCD (de 2x16 caracteres) |
| Manchester Code Library |
Utilizada para la comunicaciĂłn utilizando el cĂłdigo Manchester |
| Multi Media Card Library |
Utilizada para las operaciones con las tarjetas multimedia MMC flash |
| One Wire Library |
Utilizada para las operaciones con los circuitos utilizando la comunicaciĂłn serial One Wire |
| Port Expander Library |
Utilizada para las operaciones con el extensor de puertos MCP23S17 |
| PS/2 Library |
Utilizada para las operaciones con el teclado estándar PS/2 |
| PWM Library |
Utilizada para las operaciones con el mĂłdulo PWM incorporado |
| RS-485 Library |
Utilizada para las operaciones con los mĂłdulos utilizando la comunicaciĂłn serial RS485 |
| Software I2C Library |
Utilizada para simular la comunicaciĂłn I2C con software |
| Software SPI Library |
Utilizada para simular la comunicaciĂłn SPI con software |
| Software UART Library |
Utilizada para simular la comunicaciĂłn UART con software |
| Sound Library |
Utilizada para generar las señales de audio |
| SPI Library |
Utilizada para las operaciones con el mĂłdulo SPI incorporado |
| SPI Ethernet Library |
Utilizada para la comunicaciĂłn SPI con el mĂłdulo ETHERNET (ENC28J60) |
| SPI Graphic Lcd Library |
Utilizada para la comunicación SPI de 4 bits con el LCD gráfico |
| SPI LCD Library |
Utilizada para la comunicaciĂłn SPI de 4 bits con el LCD (de 2x16 caracteres) |
| SPI Lcd8 Library |
Utilizada para la comunicaciĂłn SPI de 8 bits con el LCD |
| SPI T6963C Graphic Lcd Library |
Utilizada para la comunicación SPI con el LCD gráfico |
| UART Library |
Utilizada para las operaciones con el mĂłdulo UART incorporado |
| USB Hid Library |
Utilizada para las operaciones con el mĂłdulo USB incorporado |