Capítulo 4. Acabando el "hola mundo" Vamos a poner el código final para que si pusiesemos 3 leds (cada uno junto con su resistencia de 330 ohmnios por ejemplo) en las patas del puerto C 15, 14 y 13, se encendiesen la 15 y la 14 y la 13 se quedase apagada (que está justo en medio, podéis ver que el puerto C se encuentra en las patas 14, 15 y 16 en la imagen anterior):
#include <p30f4013.h> /* fichero dónde se encuentran definidos los puertos
; y palabras claves del microprocesador usado
_FOSC(CSW_FSCM_OFF & XT_PLL16) /* ;Turn off clock switching and
;fail-safe clock monitoring and
;use the External Clock as the
;system clock
_FWDT( WDT_OFF) // ;Turn off Watchdog Timer
_FBORPOR(PBOR_ON & BORV_27 & PWRT_16 & MCLR_EN);
// ;Set Brown-out Reset voltage and
// ;and set Power-up Timer to 16msecs
_FGS(CODE_PROT_OFF) // ;Set Code Protection Off for the
// ;General Segment
/* Definir constantes aquí, ejemplo: */
/*#define CONSTANT1 10
/* Definir arrays de la siguiente manera */
/*int mivector[]tamañoquequiera _XBSS(32);
/* int mivector2[34] _YBSS(32);
/* Definir variables */
/* int mivariable; usaremos preferentemente variables enteras, ya que corresponden a 16 bits
int main(void) */ EL PROGRAMA PRINCIPAL VA A AQUÍ:
{
TRISC=0x0000 ; */configuramos todas las patas del puerto C como salidas
PORTC=0xA000 ; */ es decir: 1010 0000 0000 0000 con lo que las patas 15 y 13
*/ las pondremos a 1, 5 voltios en el mundo real y por tanto
*/ se encenderán los leds
}
Como véis el código es muy corto y simple, ya que estamos haciendo bien poco, os he puesto también como se definirían variables, arrays y constantes entre comentarios (las líneas que véis después de */ o // son comentarios y serán ignorados por el compilador; se ponen a gusto del programador para especificar que se hace en cada línea) aunque no vamos a usar ninguna.
Vamos a explicar las primeras líneas de configuración del micro:
#include <p30f4013.h>
/* fichero dónde se encuentran definidos los puertos
; y palabras claves del microprocesador usado /dicho fichero nos viene con MPLAB al instalarlo (no recuerdo en que directorio pero está por ahí Es decir, en este fichero tenemos definido palabras por PORTC y LATC, entendiéndolos de manera adecuada el compilador. _FOSC(CSW_FSCM_OFF & XT_PLL16)
/* ;Turn off clock switching and
;fail-safe clock monitoring and
;use the External Clock as the
;system clock Aquí estamos usando una macro para configurar dos cosas: el clock switching y el fail-safe por un lado, y el reloj que usaremos. La primera cosa no recuerdo muy bien de que se trataba, tiene pinta/creo recordar que era por cuestiones de seguridad de si el reloj no funciona por cualquier cosa haga algo... en cualquier manera no nos importa de momento. El segundo parámetro es la configuración del reloj. El microcontrolador funciona con un cristal de cuarzo que le da una señal cuadrada que es la que usa como reloj, a más velocidad de esa señal cuadrada, más Hz y más veloz será el microcontrolador. Hay multitud de configuraciones (ver el datasheet del 30f4013);
aquí vamos a usar esta: con un reloj de 6 Mhz utilizaremos la PLL (wikipedia para ver que es una PLL) para multiplicar su frecuencia por 16, obteniendo un reloj de 96 Mhz, más que suficiente en principio para nuestros propósitos.
_FWDT( WDT_OFF)
// ;Turn off Watchdog Timer El watchdog es una característica que tienen muchos micros para vigilar que si el sistema se cuelgue se resetee. ¿Cómo funciona? Es una especie de contador contínuo, que si llega a un número determinado se va a resetear (un millón por ejemplo), entonces por programa, cada x líneas deberíamos de poner el contador a cero para evitar que nunca llegue a ese millón, si por cualquier cosa se queda colgado el programa dicho contador seguiría contando y llegaría a su tope produciendo el reset del sistema. En principio resulta muy útil en muchas aplicaciones, pero por contra hay que introducir líneas en el código para borrarlo con la ejecución normal del programa, así que
por simplicidad lo desactivamos.
_FBORPOR(PBOR_ON & BORV_27 & PWRT_16 & MCLR_EN);
// ;Set Brown-out Reset voltage to 2.7 V and
// ;and set Power-up Timer to 16msecs Aquí especificamos que el voltaje mínimo en el que
se produciría el reset sería 2.7 voltios, lo cual quiere decir que si en algún momento nuestra alimentación cae de los 5v normales a 2.7 por lo que sea, el micro se resetearía. Por otra parte damos un
tiempo de encendido del dispositivo de 16 msecs.
_FGS(CODE_PROT_OFF)
// ;Set Code Protection Off for the
// ;General Segment Finalmente esta línea creo que es para proteger el código que hemos escrito en el microcontrolador y que terceras personas no puedan acceder a él (estos chinos de hoy en día que lo copian todo xD). En principio,
por simplicidad lo desactivaremos.
En el fichero que hemos añadido al código, el
p30f4013.h encontramos definidos todos los parámetros de estas macros, por ejemplo, PWRT_64, y PWRT_4, que nos darían 64 msecs y 4 msecs de tiempo de encendido de nuestro microcontrolador (cuánto más complicada sea nuestra aplicación mejor que se mayor para darle más tiempo a que se inicialice correctamente), así como el resto de parámetros de configuración.
Y finalmente escribiremos nuestro código escrito entre las llaves de
int main(void) {} al igual que se hace en C stándar. Simplemente configuramos el puerto C como salida, y ponemos las salidas a 0 o a 1 como queramos (recordar que del puerto C sólo tiene patas al exterior los bits 15, 14 y 13, sino mirar la tabla 7-1 del anterior post).
Bueno y esto es todo por hoy, sólo nos faltaría compilar el programa con el
MPLAB, y flashearlo en el micro por medio del programador; recomendar por último, de la web de microchip el datasheet
DS70094 dónde encontraremos información que al novato le puede ir muy bien sobre estos primeros pasos con el microcontrolador (56 páginas).
En la próxima entrega empezaremos a hablar de las interrupciones en vistas a usar el Timer del micro para poder hacer parpadear los leds. Una vez llegados a ese punto, podríamos dejar por terminada la introducción al dsPIC para empezar con nuestro reproductor de mp3 propiamente dicho
Un saludo