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);
}
}
Lo único que se me ocurre es que si utilizar la usart por software te esté entreteniendo demasiado al pic en la interrupción y se te pasen bytes.
En principio el código tiene buena pinta. Yo también estoy trabajando ahora con i2c y la verdad es que el pic a veces hace cosas rarillas.
Que version de CCS usas?
Yo tengo el mismo problema con el mismo codigo los datos enviados son leidos en el esclavo pero en la variable state siempre vale 0 made a leer o escribir. ¿puede ser por la versión del ccs?
