Yo he hecho otro programam con el I2C y mis dos grandes dudas son:
con los "fuses", que no sé cuáles debo utilizar, y
con el direccionamiento del dispositivo ¿?
por ejemplo, juanelete pone
i2c_write(PIC2);// Direccion dispositivoen mi caso es un convertidor digital analógico que está en la pata PIN_B1 ¿?
¿debo poner algo?
/// Descripcion del programa
/// 1. Comunica con DAC, saca un valor (400) y enciende led correspondiente
/// 2. Espera dos minutos
/// 3. Comunica con DAC, saca un valor (340) y enciende led correspondiente
/// 4. Espera a las entradas: conmutador de tres posiciones (arriba, inicial, abajo)
/// 5. Arriba: Comunica con DAC, saca un valor superior y enciende led correspondiente
/// Abajo: Comunica con DAC, saca un valor inferior y enciende led correspondiente
/// Configuracion ///
#include <16F87.h> // Libreria del pic
#fuses HS,WDT,NOPUT,NOWRT,NOPROTECT,NOLVP,NOBROWNOUT // Fusibles
#use delay(clock=20000000) // Velocidad reloj
#use I2C(MASTER,SDA=PIN_B1,SCL=PIN_B4) // Comunicacion serie
#use fast_io(B) // Da por buena la configuaracion del puerto B
#use fast_io(A) // Da por buena la configuaracion del puerto A
/// Programa Principal ///
void main()
{
// Declaracion de Variables
int nivel;
int const tension[6]={0x1800,0x196A,0x19FD,0x1AAB,0x1B6E,0x1C4F};
// Configura puertos
set_tris_b(0x00); // Puerto B configurado como salida
output_b(0x00); // Limpia B
set_tris_a(0x02); // Puerto A configurado RA6 y RA7 como entrada y el resto como salida
output_a(0x00); // Limpia A
// Inicio
nivel=0x00;
output_low(PIN_B0); // Comunica con DAC
i2c_start();
i2c_write(tension[nivel]>>
; // Escribe la parte alta del dato (400)
i2c_write(tension[nivel]); // Escribe la parte baja del dato (400)
i2c_stop();
output_a(nivel); // Enciende el led rojo de RA0
nivel++;
delay_ms(120000); // Espera 2 minutos
output_low(PIN_B0); // Comunica con DAC
i2c_start();
i2c_write(tension[nivel]>>
; // Escribe la parte alta del dato (340)
i2c_write(tension[nivel]); // Escribe la parte baja del dato (340)
i2c_stop();
output_a(nivel); // Enciende el led amarillo de RB1
while(input(PIN_A6) || input(PIN_A7)); // Espera si el conmutador no está en posición inicial
while(TRUE) // Bucle infinito
{
if((nivel>1) && (input(PIN_A6))) // Si no esta dando el máximo y el conmutador arriba
{
nivel++;
output_low(PIN_B0); // Comunica con DAC
i2c_start();
i2c_write(tension[nivel]>>
; // Escribe la parte alta del dato
i2c_write(tension[nivel]); // Escribe la parte baja del dato
i2c_stop();
output_a(nivel); // Enciende el led amarillo del nivel correspondiente
while(input(PIN_A6)); // Espera a que el conmutador pase a posición inicial
}
if((nivel<5) && (input(PIN_A7))) // Si no esta dando el minimo y el conmutador abajo
{
nivel--;
output_low(PIN_B0); // Comunica con DAC
i2c_start();
i2c_write(tension[nivel]>>
; // Escribe la parte alta del dato
i2c_write(tension[nivel]); // Escribe la parte baja del dato
i2c_stop();
output_a(nivel); // Enciende el led amarillo del nivel correspondiente
while(input(PIN_A7)); // Espera a que el conmutador pase a posición inicial
}
}
}