Si además quieres enviarnos un Artículo para el Blog y redes sociales, pulsa el siguiente botón:
Hola señores... sigo enfrascado en mi peculiar lucha con el PIC 16F876A, ahora retomando de nuevo el tema de i2c.
Estoy usando un modulo USB-i2c de la empresa Devantech, el cual me permite comunicar mediante USB con un dispositivos i2c, en mi caso la idea es comunicarme con un PIC 16F876A haciendo de esclavo y el modulito este haciendo de maestro.
¿Alguien ha trabajado con este módulo?
El caso es que sigo al pie de la letra lo que indica el manual del módulo, consigo encender y apagar una lucecita que tiene correctamente, pero cuando me pongo a enviar comandos que tiene que hacer llegar al esclavo i2c (PIC), resulta que obtengo un error según la documentación si bien es cierto que al intentar leer no obtengo el resultado esperado.
Por otro lado he probado el programita del PIC en el ISIS y parece que va bien usando el II2C Debugger, luego asumo que hay algo que hago mal, o bien el ISIS está mintiendo... Otra cosa a tener en cuenta es que he leido bastantes mensajes en el foro de que i2c esclavo en C (parece ser que no va fino del todo) pero no sé como atacar el problema.
Os dejo la rutina por si me sugerís algún cambio.
#include <16F876A>
#device adc=8
#FUSES WDT //No Watch Dog Timer (Inicialmente)
#FUSES XT //Crystal osc <= 4mhz
#FUSES PUT //Power Up Timer (Delay para que la tensión se estabilice)
#FUSES NOPROTECT //Code not protected from reading
#FUSES NODEBUG //No Debug mode for ICD
#FUSES BROWNOUT //No brownout reset previene que ligeras bajadas de tensión
// reseteen el PIC
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD //No EE protection
#FUSES NOWRT //Program memory not write protected
#use delay(clock=4000000,RESTART_WDT)
#byte port_b=0x06
#use rs232(baud=9600, parity=N, xmit=PIN_C6, rcv=PIN_C7, bits=8, restart_wdt, stream=PC)
// Usaremos C4 y C3 para crear un puerto serial con el que comunicarnos con el MIMO Analyzer
#use i2c(Slave, Slow, sda=PIN_C4, scl=PIN_C3, force_hw, address=0xA0)
#define LED_STOP PIN_B2
BYTE comando;
BYTE dato1;
#INT_SSP
void i2c_isr()
{
char dato;
BYTE state;
// Recibimos el estado del i2c
state = i2c_isr_state();
if (state<0x80>1) {
dato1=dato;
printf("drn");
}
} else if (state>=0x80) {
printf("ern");
i2c_write('1');
}
}
void main()
{
port_b=0;
enable_interrupts(GLOBAL);
enable_interrupts(INT_SSP);
while (1) {
restart_wdt();
output_toggle(LED_STOP);
delay_ms(500);
}
}
XyVy, Mi experiencia con ISIS me dice que te miente, y mucho...
¿Puedes sacar por una pantalla o puerto serie lo que lee por i2c?
Pues si te fijas en el código tengo ahora mismo conectado el puerto serie al Hyperterminal y en la rutina de atención a la interrupción de i2c, tengo varios printfs, tal cual está ahora mismo no sale nada por pantalla.
Sobre lo de ISIS me lo imaginaba por varios post que he leido al respecto que comentaban algo parecido.
Gracias.
Me parece que tienes un error en tu código, que se supone que quieres hacer con estas lineas?if (state<0x80>1) {
dato1=dato;
printf("drn");
}
La comparación que haces en el if no es correcta. El if no deberia ser así?if(state < 0x80){
dato1=dato;
printf("drn");
}
Un saludo!
Pues lo pegué bien pero resulta que por lo visto si dejo activado los Smileis y el HTML aparece mal... lo vuelvo pegar HTML y smilies desactivados...
#INT_SSP
void i2c_isr()
{
char dato;
BYTE state;
// Recibimos el estado del i2c
state = i2c_isr_state();
if (state<0x80) {
dato=i2c_read();
if (state==1) {
comando=dato;
} else if (state>1) {
dato1=dato;
printf("drn");
}
} else if (state>=0x80) {
printf("ern");
i2c_write('1');
}
}