viernes, 21 de septiembre de 2012

Primer proyecto en XC8 (Parte 2) - Código para el Led intermitente

Continúa de Primer proyecto en XC8 (Parte 1) - Creación de proyecto

Agregando código a nuestro proyecto

En la parte 1 quedamos con la siguiente pantalla que muestra nuestro proyecto vacío recién creado:

Figura 1
A este proyecto le agregaremos la siguiente estructura de archivos de base:

Header Files:

  • system.h : Macros y funciones para configurar el sistema.
  • user.h: Macros y funciones específicas de la aplicación.
Source Files:
  • configuration_bits.c: Programación de los bits de configuración del sistema.
  • system.c: Funciones que configuran el sistema (Por ejemplo el Oscilador)
  • main.c: Programa principal
  • user.c: Algoritmos de la aplicación.


Para agregar un archivo ".h" hacemos click derecho en Header Files y seleccionamos "New/ C Header File...". En la siguiente pantalla escribimos el nombre del archivo y luego finalizar:

Ej.: system.h:

Figura 2
Figura 3

Para agregar un archivo ".c" hacemos click derecho en Source Files y seleccionamos "New/ C Source File...". En la siguiente pantalla escribimos el nombre del archivo y luego finalizar:

Figura 4

Figura 5
En system.h escribimos lo siguiente:

/* 
 * File:   system.h
 * Author: Julián Quiroga
 */
/*******************************************************/
/* System Level #define Macros                         */
/*******************************************************/
/**
 * Indica que el pic funcionará a 8MHz.
 * Este macro es necesario para las funciones de delay.
 */
#define _XTAL_FREQ       8000000

/*******************************************************/
/* System Function Prototypes                          */
/*******************************************************/
/**
 * Función que debe configurar el Oscilador
 */
void ConfigureOscillator(void);

En user.h por ahora lo dejaremos vacío:

/* 
 * File:   user.h
 * Author: Julián Quiroga
 */
/*******************************************************/
/* System Level #define Macros                         */
/*******************************************************/

/*******************************************************/
/* System Function Prototypes                          */
/*******************************************************/

En "configuration_bits.c" agregaremos lo que hablé en esta entrada "Configuración básica del PIC en XC8":
/**
 * File:        configuration_bits.c
 * PIC:         PIC16F88
 * Author:      Julián Quiroga
 *
 * Descripción: Configura el pic para que utilice
 *              el oscilador interno y el pin 4
 *              como Reset
 */
#include <xc.h>

__CONFIG(MCLRE_ON & CP_OFF & CPD_OFF & LVP_OFF & BOREN_OFF &
         WDTE_OFF & FOSC_INTOSCIO & PWRTE_OFF);
__CONFIG(IESO_OFF & FCMEN_OFF);

En "system.c" escribiremos lo siguiente:

/**
 * File:        system.c
 * PIC:         PIC16F88
 * Author:      Julián Quiroga
 *
 * Descripción: Funciones base del sistema
 */
#include <xc.h>
#include <stdint.h>        /* For uint8_t definition */
#include <stdbool.h>       /* For true/false definition */

#include "system.h"

/**
 * Configurar todo lo necesario para que funcione el oscilador interno 
 * a 8Mhz.
 */
void ConfigureOscillator(void) {
    // Configura el Oscilador interno a 8Mhz
    OSCCONbits.IRCF = 0b111;
}

Ahora sólo nos queda crear main.c:

/* 
 * File:        main.c
 * PIC:         PIC16F88
 * Author:      Julián Quiroga
 *
 * Descripción: Programa que enciende y apaga un LED de forma
 *              intermitente en RB0.
 */
#include <xc.h>
#include <stdio.h>
#include <stdint.h>
#include <stdbool.h>

#include "system.h"
#include "user.h"


#define LED     PORTBbits.RB0 // El Led se encuentra conectado en RB0
#define posLED  0             // Posición en la que se encuentra el Led

/**
 * Programa principal
 */
void main(void) {

    // Configura el oscilador
    ConfigureOscillator();
    
    // Configura un 0 en la posición que le corresponde al LED
    // y un 1 a todas las demás.
    // 0 = Salida, 1 = entrada
    TRISB = ~(1 << posLED);
    // La línea anterior es equivalente a 
    // TRISB = 0b11111110;

    // Bucle principal
    while(true) {

        LED = 1;    // Setea en estado alto (High) el LED
        
        __delay_ms(500); // Se queda esperando 500 milisegundos
        
        LED = 0;    // Setea en estado bajo (Low) el LED
        
        __delay_ms(500);

    }
}

El código anterior define 2 macros: LED y posLED. Estos macros permiten que podamos cambiar de lugar en led haciendo mínimos cambios en el código.

LED indica el lugar en el que se seteará un 1.
posLed indica la posición del LED en el puerto B.

La instrucción: "1 << posLED" hace que el "1" de la izquierda se mueva tantos lugares a la izquierda como los que indica posLED. En este caso, como es "0", el resultado es un "1" que no se movió de lugar.

Luego, la instrucción "~" hace que todo lo que esté dentro del paréntesis quede negado, es decir, en bits, con el valor opuesto. Entonces en lugar de quedar todos ceros y un uno, ahora quedan todos unos y un cero: "0b11111110".

Ahora sólo nos queda compilar nuestro proyecto y ver que no tenga errores. Para hacer eso, hacemos click en el ícono que muestra un martillo, llamado "Build Main Proyect".


Si no hubo errores, el resultado de la compilación nos dirá algo similar a esto:

BUILD SUCCESSFUL (total time: 5s)

Ahora que ya tenemos nuestro primer proyecto compilado correctamente tenemos 2 opciones para probarlo, ejecutarlo en modo simulador o grabarlo en el PIC y probarlo en nuestro circuito.

En la parte 3 (Primer proyecto en XC8 (Parte 3) - Probando el código) de este tutorial les enseñaré como hacer esto.

Saludos!

2 comentarios:

  1. porfavor necesito que escribes bien porque algunos archivos me confunden como .c y .h

    ResponderEliminar
  2. Olle puedes explicarme cómo funciona el archivo configuration_bits.c ?
    En qué momento es llamado dentro de la funcion principal ?
    Por qué configuration_bits.c no es uno con extensión .h ?
    Los archivos .h que creas son diferentes a los que crea el asistente de Mplab, son así: Cuál es la diferencia.
    #ifndef USUARIO_H
    #define USUARIO_H

    #ifdef __cplusplus
    extern "C" {
    #endif

    #ifdef __cplusplus
    }
    #endif

    #endif /* USUARIO_H */

    Gracias por el aporte

    ResponderEliminar

Related Posts Plugin for WordPress, Blogger...