Bien amigos, vamos a continuar con nuestra primera experiencia con el VDIP1.
EL CODIGOBien, aqui empezaremos con la parte interesante, ya tenemos el hardware listo para trabajar, asi que sumerjamonos en el codigo. Empecemos!!
Bueno, habiamos dicho que existen 3 formas de comunicarse con el VDIP1: UART, SPI y FIFO
El objetivo de este proyecto es implementar el loggeo de datos por el puerto SPI. Asi que vamos a modificar el codigo que nos da la nota de aplicacion para poder trabajar con SPI en vez de UART.
Lo primero que haremos sera bajarnos lo necesario para empezar a trabajar con el codigo:
Nota de Aplicacion para este Ejemplo (Para los que aun no leyeron el documento oficial)
El Codigo en C (SourceBoost C Compiler) (El codigo fuente en C)
El Compilador: SourceBoost C Compiler (Para trabajar con el codigo fuente y compilarlo)
Nota del AutorBien, la verdad no estoy seguro que tan popular sea este compilador, sinceramente antes de empezar este proyecto no habia oido hablar de el, sin embargo imagino que los señores de VINCULUM lo eligieron basicamente porque es de libre distribucion, lo cual no ocurre con el CCS por ejemplo y sin embargo los propios señores de CCS ofrecen entre sus productos, placas de prototipo basadas en el VNC1L, pero no he encontrado informacion o codigo escrito en CCS para trabajar con el VNC1L.
Asi que no queda mas que darle una mirada a este compilador y acostumbrarse un poco, la verdad no es tan dificil de usar, sin embargo desde mis inicios trabaje con el CCS, por eso se me hace algo dificil algunas veces, como mencione anteriormente, la idea es portar este codigo al CCS, esa es una de mis metas principales, asi que espero me ayuden amigos mios.Sigamos con el Codigo
Una vez descargado el codigo fuente, encontramos varios archivos, dejenme contarles a groso modo que hacen los mismos:
ADC.c : Rutinas y funciones para trabajar con el conversor ADC del PIC
ADC.h : Cabeceras y definiciones referentes al ADC
monitor.c : Rutinas y funciones para trabajar con el VDIP1
monitor.h : Cabeceras y definiciones referentes al monitor
SPI.c : Rutinas y funciones que manejan la comunicacion SPI con el VDIP
SPI.h : Cabeceras y definiciones referentes a la comunicacion SPI
UART.c : Rutinas y funciones que manejan la comunicacion USART con el VDIP
UART.h : Cabeceras y definiciones referentes a la comunicacion SPI
vacq.c : Programa principal que logea datos directamente de un puerto ADC del PIC
vlogger.c : Programa principal que logea datos desde un sensor con interfaz USB.
Bien, esos son todos los archivos, como mencione anteriormente, la idea de este primer ejemplo es trabajar con el logeo de datos directamente desde un canal del PIC, asi que usaremos el archivo de programa principal: VACQ.C, ademas mencionamos que trabajaremos con la interfaz SPI asi que obviamente tambien usaremos estos 2 archivos.
Me gustaria en este punto, explicar un poco la estructura de este codigo, antes de hacer las variaciones al mismo:
El programa principal VACQ.C, es el que hace todo, para comunicarse con el VDIP1 llama a funciones que se encuentran en el MONITOR.C, a su vez, el monitor utiliza la interfaz UART.C para establecer la comunicacion con el modulo. Asi que nuestra primera tarea sera modificar el archivo MONITOR.H para indicarle que usaremos la interfaz SPI en vez de la UART.
Para ello, abrimos el archivo MONITOR.H , en las primeras lineas del codigo encontramos lo siguiente:
// monitor is connected via SPI
//#include "SPI.h"
// monitor is connected via UART
#include "UART.h"
Asi que basta con modificar el codigo para que usemos la interfaz SPI, quedando de la siguiente manera:
//monitor is connected via SPI
#include "SPI.h"
// monitor is connected via UART
//#include "UART.h"
Sencillo, no es cierto? jejeje
Bueno, sigamos, ahora vamos a modificar los pines usados por la interfaz SPI para que correspondan con el Hardware que anteriormente se posteo. Para ello abrimos el archivo SPI.C en el cual encontraremos la siguiente porcion de codigo que define los pines a utilizar:
//***************************************************************************
//
// Pin definitions for SPI
//
//***************************************************************************
// NOTE: pin names are relative to the VDIP2 device
#define PORT_SDI portb.1 // SDI is RB1 (Port B bit 1)
#define TRIS_SDI trisb.1
#define PORT_SDO portb.2 // SDO is RB2 (Port B bit 2)
#define TRIS_SDO trisb.2
#define PORT_SCLK portb.4 // SCLK is RB4 (Port B bit 4)
#define TRIS_SCLK trisb.4
#define PORT_CS portb.3 // CS is RB3 (Port B bit 3)
#define TRIS_CS trisb.3
//***************************************************************************
Todo lo que tenemos que hacer, es modificar los pines, asi que el codigo quedaria de la siguiente forma:
//***************************************************************************
//
// Pin definitions for SPI
//
//***************************************************************************
// NOTE: pin names are relative to the VDIP2 device
#define PORT_SCLK portd.4 // SCLK (on VDIP1) is RD4 (Port D bit 4)
#define TRIS_SCLK trisd.4
#define PORT_SDI portd.5 // SDI (on VDIP1) is RD5 (Port D bit 5)
#define TRIS_SDI trisd.5
#define PORT_SDO portd.6 // SDO (on VDIP1) is RD6 (Port D bit 6)
#define TRIS_SDO trisd.6
#define PORT_CS portd.7 // CS (on VDIP1) is RD7 (Port D bit 7)
#define TRIS_CS trisd.7
Bien, con eso ya tenemos la comunicacion SPI y los pines definidos, solo nos basta modificar el programa principal para ajustar nuestro led y pulsador, asi como el PIC a utilizar. Para ello abrimos el archivo VACQ.C.
En primer lugar modificaremos los pines del led y pulsador para que correspondan con nuestro hardware, solo basta buscar en el archivo el siguiente pedazo de codigo:
// ACTIVE LED is RB5 (Port B bit 5)
#define PORT_LED_ACTIVE portb.5
#define TRIS_LED_ACTIVE trisb.5
// START BUTTON is RA4 (Port A bit 4)
#define PORT_S1 porta.4
#define TRIS_S1 trisa.4
Y modificarlo, quedando de la siguiente forma:
// ACTIVE LED is RB5 (Port B bit 5)
#define PORT_LED_ACTIVE portb.5
#define TRIS_LED_ACTIVE trisb.5
// START BUTTON is RD1 (Port D bit 1)
#define PORT_S1 portd.1
#define TRIS_S1 trisd.1
Bien, ahora solo nos falta cambiar el PIC a utilizar, recuerden que el codigo originalmente esta escrito para trabajar con el PIC18F1320.
Para ello, veamos la parte inicial del archivo VACQ.C, en la cual nos interesa esta parte del codigo:
// PIC18F1320
#ifdef _PIC18F1320
#pragma DATA _CONFIG1H, _IESO_ON_1H & _FSCM_ON_1H & _INTIO2_OSC_1H; // internal OSC
//#pragma DATA _CONFIG1H, _IESO_ON_1H & _FSCM_ON_1H & _EC_OSC_1H; // external OSC
#pragma DATA _CONFIG2L, _PWRT_OFF_2L & _BOR_OFF_2L & _BORV_27_2L;
#else
#error "Only PIC18F1320 devices supported"
#endif // _PIC18F1320
Bien, aqui trate de buscar otro ejemplo escrito para un PIC18F4550 que es el que tengo a mano, asi que lo unico que hice fue copiar la parte inicial, y reemplazando la que mencione, para que quede de la siguiente forma:
#ifdef _PIC18F4550
#pragma DATA _CONFIG1H, _FOSC_HS_1H
#pragma DATA _CONFIG2H, _WDT_OFF_2H
#pragma DATA _CONFIG4L, _STVREN_OFF_4L & _LVP_OFF_4L & _DEBUG_OFF_4L & _XINST_OFF_4L
#pragma DATA _CONFIG5L, _CP0_OFF_5L & _CP1_OFF_5L & _CP2_OFF_5L & _CP3_OFF_5L
#pragma DATA _CONFIG6L, _WRT0_OFF_6L & _WRT1_OFF_6L & _WRT2_OFF_6L & _WRT3_OFF_6L
#pragma DATA _CONFIG7L, _EBTR0_OFF_7L & _EBTR1_OFF_7L & _EBTR2_OFF_7L & _EBTR3_OFF_7L
#else
#ifdef _PIC18F452
#pragma DATA _CONFIG2L, _BOR_OFF_2L & _PWRT_ON_2L
#pragma DATA _CONFIG4L, _STVR_OFF_4L & _LVP_OFF_4L & _DEBUG_OFF_4L
#pragma DATA _CONFIG5L, _CP0_OFF_5L & _CP1_OFF_5L & _CP2_OFF_5L & _CP3_OFF_5L
#pragma DATA _CONFIG6L, _WRT0_OFF_6L & _WRT1_OFF_6L & _WRT2_OFF_6L & _WRT3_OFF_6L
#pragma DATA _CONFIG7L, _EBTR0_OFF_7L & _EBTR1_OFF_7L & _EBTR2_OFF_7L & _EBTR3_OFF_7L
#else
#error "Only _PIC18F4520 and _PIC18F452 devices supported"
#endif // _PIC18F452
#endif // _PIC18F4550
Bien, pero eso no es todo, el codigo ya esta casi listo, pero nos falta indicarle al compilador con que PIC vamos a trabajar, para ello haremos lo siguiente:
Vamos al menu SETTINGS y dentro de el buscamos la opcion TARGET donde definimos el PIC que deseamos usar.
Ahora si, estamos listos para compilar, al compilar me sale un error, que hasta ahora no entiendo, que tiene que ver con las interrupciones que pueda presentar el MONITOR de comandos, al analizar un poco el codigo, me di cuenta que en realidad esta parte no se utiliza, fue por ello que decidi comentar la parte problematica y listo; para ello buscamos la parte problematica:
//***************************************************************************
// Name: interrupt
//
// Description: Handle interrupts from all sources and call required modules.
//
// Parameters: None.
//
// Returns: None.
//
// Comments: None.
//
//***************************************************************************
void interrupt( void )
{
// handle timer1 interrupt
if (tmr1Interrupt)
{
tmr1InterruptHandler();
}
// handle interrupts (if any) from monitor
if (monInterrupt)
{
monInterruptHandler();
}
// handle interrupts from ADC
if (adcInterrupt)
{
adcInterruptHandler();
}
}
Y lo unico que hacemos es comentar las interrupciones generadas por el MONITOR quedando asi:
//***************************************************************************
// Name: interrupt
//
// Description: Handle interrupts from all sources and call required modules.
//
// Parameters: None.
//
// Returns: None.
//
// Comments: None.
//
//***************************************************************************
void interrupt(void)
{
// handle timer1 interrupt
if (tmr1Interrupt)
{
tmr1InterruptHandler();
}
// handle interrupts (if any) from monitor
/* if (monInterrupt)
{
monInterruptHandler();
}
*/
// handle interrupts from ADC
if (adcInterrupt)
{
adcInterruptHandler();
}
}
Nota del Autor- Esta libertad de comentar esta porcion del codigo me la tome por un pequeño analisis que hice a todo el codigo, no estoy 100% seguro de si esta modificacion afectara otras funcionalidades del codigo, sin embargo en las pruebas realizadas no parece tener algun efecto. Si alguien descubre la importancia de esta interrupcion en este codigo en particular, por favor agradecere mencionarlo.Bueno amigos, eso es todo, una vez mas vamos a compilar el codigo y listo!! Obtenemos con exito los archivos para grabar en nuestro PIC.
Bien, para facilitarles las cosas, aqui les dejo todo el proyecto comprimido, incluidas las modificaciones mencionadas, asi como el archivo listo para grabar en nuestro PIC18F4550 para trabajar con el hardware posteado:
vlogger_V101modificada.rarBien amigos, publicare los resultados de la primera prueba en unas horas, es hora de almorzar!!! Provecho!!!