En esta práctica utilizaremos lo que hicimos tanto para hacer la comunicación RS232 con un dispositivo móvil como el protocolo I2C para leer el valor de un acelerómetro.
Vamos a leer los tres ejes del acelerómetro (x, y y z) y lo enviaremos para mostrarlo en nuestro dispositivo, para de esta forma saber la posición en la que se encuentra el sensor de forma remota.
El primer paso será crear prototipos de funciones para cada acción:
void acel_init(); //Función para inicializar el acelerómetro void escritura_acel(unsigned int registro, unsigned int dato); //Función para escribir con I2C int leer_x(); //Función para leer el eje x int leer_y(); //Función para leer el eje y int leer_z(); //Función para leer el eje z
En cada una de esas funciones tendremos que definir los registros o el proceso a realizar, de forma similar a la práctica del acelerómetro, para que de esta forma nuestro programa principal termine más legible, en él lo que realizaremos, será la configuración de los puertos de entrada y salida, llamar las funciones creadas previamente y el envío por RS232 de la información recibida del acelerómetro.
Quedándonos el siguiente código:
Código para PIC C:
#include<18f4550.h> #fuses HSPLL, NOWDT, NOPROTECT, NOLVP, NODEBUG, USBDIV, PLL2, CPUDIV1, VREGEN #use delay (clock=48M) #use I2C(MASTER, SCL=PIN_A1, SDA=PIN_A2) #use RS232(BAUD = 9600, BITS = 8, PARITY = N, XMIT = PIN_C6, RCV = PIN_C7) void acel_init(); //Función para inicializar el acelerómetro void escritura_acel(unsigned int registro, unsigned int dato); //Función para escribir en I2C int leer_x(); //Función para leer eje x int leer_y(); //Función para leer eje y int leer_z(); //Función para leer eje z signed int eje_x, eje_y, eje_z; //Variables para almacenar el valor de los ejes void main(){ //Función principal set_tris_b(0b00000000); //Configurar como salidas acel_init(); //Inicializar acelerómetro while(true){ eje_x = leer_x(); //Lee eje X eje_y = leer_y(); //Lee eje Y eje_z = leer_z(); //Lee eje Z printf("nx %2d, y %2d, z %2d", eje_x,eje_y,eje_z); //Envia los tres ejes delay_ms(200); //Espera 200ms para actualizar los datos } } void acel_init(){ //Inicialización del módulo del acelerómetro escritura_acel(0x0B, 0x01); escritura_acel(0x2A, 0x20); escritura_acel(0x2B, 0x19); escritura_acel(0x2C, 0x02); escritura_acel(0x2D, 0x01); escritura_acel(0x2E, 0x01); escritura_acel(0x2A, 0x21); } void escritura_acel(unsigned int registro, unsigned int dato){ i2c_start(); i2c_write(0x3A); i2c_write(registro); i2c_write(dato); i2c_stop(); } int leer_x(){ int x; i2c_start(); i2c_write(0x3A); i2c_write(0x01); //Registro del eje x del acelerómetro i2c_start(); i2c_write(0x3B); x = i2c_read(0); i2c_stop(); return x; } int leer_y(){ int y; i2c_start(); i2c_write(0x3A); i2c_write(0x03); //Registro del eje y del acelerómetro i2c_start(); i2c_write(0x3B); y = i2c_read(0); i2c_stop(); return y; } int leer_z(){ int z; i2c_start(); i2c_write(0x3A); i2c_write(0x05); //Registro del eje z del acelerómetro i2c_start(); i2c_write(0x3B); z = i2c_read(0); i2c_stop(); return z; }