I2C en PIC12s usando MPLAB x (win7) y XC8

Tengo experiencia en programación, pero soy muy nuevo en microcontroladores. Perdóneme si esta pregunta es muy básica o no tiene mucho sentido. Estoy tratando de aumentar mis conocimientos y la curva de aprendizaje parece ser empinada en algunas áreas.

Estoy tratando de hacer que I2C funcione con un nuevo IC que compré, el PIC12LF1552. Este IC viene con un módulo I2C, por lo que no debería tener que hacer un bit-bang. Sin embargo, parece que XC8 no es compatible con I2C en la serie PIC12. Parece que MPLAB X no puede encontrar el archivo de inclusión ic2.h (es posible que esto no sea realmente un problema, podría ser que las rutas no estén configuradas correctamente), así que vinculé el archivo con una ruta completa. i2c.h incluye pconfig.h en la línea 32 y pconfig.h incluye p18cxxx.h en la línea 16, lo que parece que no funcionará porque es para una serie de chips diferente.

Entonces, mi pregunta es, ¿qué soporte hay para ejecutar I2C nativo en los circuitos integrados de la serie PIC12?

Respuestas (2)

Depende de lo que entiendas por "soporte". El hecho de que no haya una biblioteca enlatada no significa que no pueda usar el periférico.

Los compiladores XC ofrecen acceso directo a los registros de funciones especiales y capacidades de interrupción del dispositivo de destino. Puede configurar fácilmente los periféricos I2C y las rutinas de manejo en C como lo haría en lenguaje ensamblador. La hoja de datos del dispositivo incluirá todos los detalles para configurar estos periféricos. Simplemente lea la hoja de datos, escriba los valores necesarios en los SFR necesarios y sondee/interrumpa según sea necesario.

(A menudo es más fácil codificar de esta manera, ya que no depende de las bibliotecas de código cerrado que pueden no hacer exactamente lo que anuncian).

Hay una sección importante de la hoja de datos dedicada a las comunicaciones I2C (y SPI). Entiendo cómo funciona I2C, y el código de sondeo/interrupción debería ser bastante sencillo, especialmente con la ampliación del reloj habilitada. Creo que estoy un poco perdido en cuanto a cómo una escritura en un registro generará la salida I2C y cómo funciona todo eso. Voy a leer el resto de la hoja de datos y ver si puedo encontrarle cara o cruz.
Es bastante simple cuando te das cuenta de algunas cosas, como: una de las ubicaciones en las que escribes es el búfer de transmisión, y una de las ubicaciones desde las que lees es el búfer de recepción...
Sí, puedo ver a dónde tiene que ir con eso. Sin embargo, parece interesante que esta sea la forma de hacerlo. Es la programación de escritorio equivalente a tener una variable global en la que se escriben y leen varios subprocesos. ¿Cómo se garantiza la seguridad de los hilos? ¿Manualmente basado en otros registros, supongo? Sin embargo, no creo que realmente haya subprocesos, entonces, ¿cómo se procesa el registro si no estamos llamando a una función?
Los PIC no son de subprocesos múltiples per se, pero generalmente necesita realizar un seguimiento del estado cuando el código salta dentro y fuera de los ISR (declaraciones de variables volátiles, registro de golpes, etc.) De hecho, los SFR son muy parecidos a los globales en el sentido de que re accesible globalmente. El hardware PIC se encarga de 'qué hacer' cuando el software escribe estos registros.

El compilador Microchip XC8 tiene bibliotecas periféricas integradas (incluidas las bibliotecas I2C), pero solo para la familia de micros PIC18F. Los otros micros de 8 bits (PIC10F, PIC12F, PIC16F) no tienen librería de periféricos. Tendrá que escribir su propia implementación/controladores para el periférico I2C manipulando directamente los registros.

Miré la hoja de datos y te dicen qué registros SFR son para I2C. Todavía tengo problemas para encontrar más información sobre esto, por un lado, ¿cómo se llama este proceso? No es un poco ruidoso, porque los registros están haciendo parte del trabajo pesado por ti. Supongo que no soy la primera persona que se ha topado con esto, así que esperaba poder encontrar un ejemplo.
No, no es un golpe de bits. Supongo que puede llamarlo 'escribir su propio controlador para el periférico I2C' :-) Aquí hay algunos ejemplos de código que pueden ayudarlo.