fbpx

Expresate

Si además quieres enviarnos un Artículo para el Blog y redes sociales, pulsa el siguiente botón:

Devantech USB-I2C y...
 
Avisos
Vaciar todo

Devantech USB-I2C y PIC 16F876A

7 Respuestas
4 Usuarios
0 Reactions
3,560 Visitas
xyvy
Respuestas: 50
 XyVy
Topic starter
(@xyvy)
Trusted Member
Registrado: hace 16 años

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);
}
}

Responder
6 respuestas
boops
Respuestas: 1813
(@boops)
Ardero
Registrado: hace 19 años

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?

Responder
xyvy
Respuestas: 50
 XyVy
Topic starter
(@xyvy)
Trusted Member
Registrado: hace 16 años

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.

Responder
joviwap
Respuestas: 301
(@joviwap)
Ardero
Registrado: hace 19 años

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!

Responder
xyvy
Respuestas: 50
 XyVy
Topic starter
(@xyvy)
Trusted Member
Registrado: hace 16 años

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');
}
}

Responder
Página 1 / 2
Compartir: