CAPTULO IV DESARROLLO
4.2 Entorno de trabajo con el microcontrolador
Previamente a mostrar el código y una explicación de este, resulta imprescindible una pequeña introducción al entorno de trabajo del microcontrolador.
Como compilador es utilizado el programa CSS v4.114 ya que ofrece una gran facilidad en el uso de las librerías USB.
El entorno de trabajo del CCS permite compilar y también suministra una gran variedad de herramientas auxiliares. En la figura 33 se muestran los distintos elementos básicos del entorno de trabajo. Existen 2 formas de iniciar una sesión: abriendo un fichero de código fuente o creando un proyecto.
4.2.1 Programación del Firmware para el microcontrolador
Como primeras líneas de código en el microcontrolador se encuentran las siguientes:
#include <18F4550.h> // Definición de registros internos del PIC18F4550. #DEVICE ADC=10 // CAD a 10 bits, justificación a la derecha.
#fuses
NOMCLR,HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5, CPUDIV1,VREGEN,NOPBADEN
// Usamos una frecuencia de trabajo de 48Mhz. #use delay(clock=48000000)
En la primera línea se agrega al programa la definición de registros internos del PIC18F4550, que es el microcontrolador usado en este proyecto. Con esto se indica al compilador que se trabajará con él, y que use el modo PCH (compilador para microcontroladores de 16 bits).
En la segunda línea se indica al compilador que se trabajará con el CAD (convertidor analógico - digital) con 10 bits de resolución y justificación a la derecha (los bits más
significativos del registro ADRESH, son leídos como “0”).
Los “fuses” (o mejor dicho palabra de configuración) son muy importantes ya que
determinan muchos parámetros del microcontrolador. Los que se encuentran ordenados en la figura anterior tienen las siguientes funciones:
- NOMCLR: No se usará el pin MCLR, se utilizara “reset” por software.
- HSPLL: No se utiliza un cristal de alta velocidad en conjunto con el PLL.
- NOWDT: El perro guardián no está habilitado.
- NOPROTECT: No se protege la memoria contra lecturas.
- NOLVP: Programación con bajo voltaje no habilitada.
- USBDIV: El reloj del módulo USB se tomará de la salida del PLL\2. En este caso 96Mhz \ 2 = 48Mhz (Frecuencia de trabajo).
- PLL5: Prescaler dividirá en 5 la frecuencia del oscilador principal para obtener los 4Mhz necesarios en la entrada del PLL. Como estamos usando un cristal de
20Mhz….20Mhz \ 5 = 4Mhz.
- CPUDIV1: La frecuencia del PLL se dividirá en 2 para obtener la frecuencia de
trabajo del CPU: 48Mhz.
- VREGEN: Regulador interno de 3.3v del módulo USB se encuentra habilitado.
- NOPBADEN: Todo el puerto B como entradas/salidas digitales.
En la última línea es declarada la frecuencia de trabajo para que el compilador pueda calcular los retardos en las funciones de delay.
// Incluimos librerías utilizadas por la aplicación.
#include <pic18_usb.h> // Driver's USB del PIC18F4550. #include <DECLARACIONES.h> // Definición de funciones y hardware utilizado en el programa.
#include <Descriptor_easyHID.h> // Descriptores HID del proyecto. #include <USB.c> // Funciones del USB.
Usando la directiva #include se agregan todas las librerías necesarias para gestionar la comunicación USB. Las más importantes son 2 de ellas:
- APLICACIÓN_HID.h
- Descriptor_easyHID.h
En la primera es donde se almacenan todas las definiciones de hardware, constantes, declaración y documentación de funciones, etc.
// Constantes hardware:
#define SW1 PIN_B0 // Pulsador Nº 1.
#define SW2 PIN_B1 // Pulsador Nº 2.
#define SW3 PIN_B2 // Pulsador Nº 3.
#define SW4 PIN_B3 // Pulsador Nº 4.
#define SW5 PIN_B4 // Pulsador Nº 5.
#define SW6 PIN_B5 // Pulsador Nº 6.
#define SW7 PIN_B6 // Pulsador Nº 7.
#define SW8 PIN_B7 // Pulsador Nº 8.
A través del uso de etiquetas #define es añadido los nombres a las entradas y salidas para poder facilitar la programación y recordar donde se ubican los diferentes componentes.
// Constantes varias:
#define USB_CONFIG_HID_TX_SIZE 16 // Definición del tamaño del endpoint de salida.
#define USB_CONFIG_HID_RX_SIZE 16 // Definición del tamaño del endpoint de entrada.
El tamaño que debe tener el endpoint de entrada y de salida, en este caso el valor
“32” nos indica que recibirá 32 bytes desde el host y transmitirá 32 bytes hacia el
host.
Significado de endpoint: "Los dispositivos (o mejor dicho, las funciones) tienen asociados unos canales lógicos unidireccionales (llamados pipes) que conectan al host (PC) controlador con una entidad lógica en el dispositivo (PIC) llamada endpoint. Los datos son enviados en paquetes de largo variable (potencia de 2). Típicamente estos paquetes son de 64, 128 o más bytes. Estos endpoints (y sus respectivos pipes) son numerados del 0 al 15 en cada dirección, por lo cual un dispositivo puede tener hasta 32 endpoints (16 de entrada y 16 de salida). La dirección se considera siempre desde el punto de vista del host controlador. Así un endpoint de salida será un canal que transmite datos desde el host controlador al dispositivo. Un endpoint
solo puede tener una única dirección. El endpoint 0 (en ambas direcciones) está reservado para el control del bus."
// Comandos de entrada.
#define ACTIVA_SALIDAS 0x0A // Comando para activar LED'S.
#define LED_1 0x10 // Cambia de estado el LED 1.
#define LED_2 0x20 // Cambia de estado el LED 2.
#define LED_3 0x30 // Cambia de estado el LED 3.
#define LED_4 0x40 // Cambia de estado el LED 4.
#define LED_5 0x50 // Cambia de estado el LED 1.
#define LED_6 0x60 // Cambia de estado el LED 1.
#define LED_7 0x70 // Cambia de estado el LED 1.
#define LED_8 0x80 // Cambia de estado el LED 1.
Estas definiciones está íntimamente ligadas con las funciones de control que se encuentran en la aplicación de Visual C#.
// Función para prender y apagar led's.
#define LED_ON output_high // Función para encender el LED.
#define LED_OFF output_low // Función para apagar el LED.
Estos macros son usados para el control de las salidas digitales para no tener que usar las funciones predefinidas que son más complejas. Ayudan al desarrollo del programa. Luego hay 2 funciones más, pero su explicación es redundante ya que están muy bien documentadas en la librería.