I2C no envía datos en PIC16F887

1

Soy relativamente nuevo con los microcontroladores PIC y el compilador MPLAB XC8.

Quiero comunicar dos PIC16F887 usando I2C. Usé este tutorial (https: //   electrosome .com / i2c- pic-microcontroller-mplab-xc8 /) como mi introducción a este protocolo, pero aunque mi código se compila, mi simulación de proteus no hace nada. El objetivo es enviar el conteo de 0 a 3 a través de I2C desde el maestro a un Esclavo, y el esclavo debe mostrar ese número en 2 LED en PORTB.

DebugeoelprogramaenelladomaestroyparecequeelprogramaseatascadentrodemifunciónI2C_Master_Wait(),realmentetratodeentenderquésucededentrodeestafunción,peronoobtengoningúnresultadodesdehacemuchosdías.

voidI2C_Master_Wait(){while((SSPSTAT&0x04)||(SSPCON2&0x1F));}

Esperoquealguienpuedaayudarmeconunmejortutorialoalgunaexplicaciónsobreloqueestásucediendoenesafunciónyquizásotraformadehacerlo.Adjunto aquí la carpeta con el código del maestro y el esclavo y la simulación de Proteus.

¡Gracias!

    
pregunta Arturo Rosete

1 respuesta

1

Antes de comenzar, si desea trabajar con comunicaciones digitales como I2C, SPI, I2S, CAN, etc., le recomiendo que invierta dinero en un analizador lógico. Estos protocolos no requieren una velocidad de muestreo rápida, por lo que es muy probable que pueda encontrar un dispositivo asequible. En cualquier caso, le ahorrará un tiempo valioso. Personalmente utilizo los dispositivos Saleae .

Comprensión de los registros

Para comprender el pequeño fragmento de código que compartiste, tendremos que determinar un poco cómo funcionan los microprocesadores y cómo interactúan con el hardware. Supongo que es consciente de cómo funcionan los punteros en C / C ++; apuntan a una dirección de memoria. Lo que probablemente no sepa es que no solo apuntan a una ubicación de memoria, sino que también pueden apuntar a un registro de hardware. Cuando lea o escriba en una variable, su procesador colocará esa dirección en bus de direcciones y leerá o escribirá el contenido en el bus de datos .

Como dije, no todas las direcciones se refieren a una ubicación de memoria. Si observa la hoja de datos PIC16F887 , encontrará muchos registros ubicados entre la dirección 000h-1FFh. Puedes leer o escribir su contenido. En algún momento estarán disponibles solo para uno u otro, que se especificará en la hoja de datos.

Estos registros se utilizan para  1) Configuración de su periférico (como un transmisor I2C)  2) Pasar datos al dispositivo (como los datos que desea enviar / recibir con I2c)

Las piezas de código que le diste están leyendo estos registros. SSPSTAT (0x94) y SSPCON2 (0x91) son dos constantes definidas en un archivo de encabezado que viene junto con su compilador. Básicamente son punteros, y el código está haciendo operación bitwise para obtener el valor de un bit específico dentro de este registro. En otras palabras, su programa está esperando mientras SSPSTAT bit 2 o SSPCON2 bits 8 a 0 estén en alto. Esto parece que no funcionará porque SSPCON2 contiene bits de configuración, como el bit 7: GCEN. Si establece este bit en alto, las interrupciones están habilitadas para I2C y este bit no cambiará.

tu problema

En cuanto a dónde está el problema, el cableado parece correcto. Los problemas podrían ser:

  1. mala configuración de registro
  2. El esclavo nunca se transmite (ahí es donde el analizador lógico se vuelve práctico)
  3. La lógica de recepción no es buena. El que tienes me parece extraño.

Creo que para la recepción, debería estar mirando SSPSTAT bit0 (BF). Este bit se vuelve alto cuando el búfer de recepción está lleno.

Buena suerte

    
respondido por el Pier-Yves Lessard

Lea otras preguntas en las etiquetas