TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: andros en 07 de Junio de 2006, 15:01:14
-
Hola a todos, espero estén bien:
Estoy usando la comunicación i2c con el compilador C18 de microchip, en esta oportunidad estoy haciendo uso de la librería sw_i2c.h, es decir, por software, ya que requiero el puerto c de mi PIC (18f252) para otras cosas. La cuestión es la siguiente:
* Ya uso efectivamente las funciones (trasnmisión, recepción, etc) cuando la libreria está configurada por defecto, más precisamente usando los pines SDA (RC4) y SCL (RC3).
* He leido el pdf de las librerías del compilador C18 en donde se indica que a través del simple uso de unas macros al interior de la librería sw_i2c.h, puedo cambiar los pines de transmisión (Datos, SDA) y el de sincronización (reloj, SCL). En efecto hago lo que me dicen; aquí muestro una porción de los cambios para usar los pines en el puerto A (obviamente he deshabilitado el ADC del PIC para estos pines):
#define DATA_LOW TRISAbits.TRISA4 = 0; // define macro for data pin output
#define DATA_HI TRISAbits.TRISA4 = 1; // define macro for data pin input
#define DATA_LAT LATAbits.LATA4 // define macro for data pin latch
#define DATA_PIN PORTAbits.RA4 // define macro for data pin
#define CLOCK_LOW TRISAbits.TRISA3 = 0; // define macro for clock pin output
#define CLOCK_HI TRISAbits.TRISA3 = 1; // define macro for clock pin input
#define SCLK_LAT LATAbits.LATA3 // define macro for clock pin latch
#define SCLK_PIN PORTAbits.RA3 // define macro for clock pin
Mi problema es sencillo de definir.... !no me funciona!, jeje, siendo más específico guardo las modificaciones de la librería y la incluyo en el proyecto del MPLAB (eso dicen que debe hacerce en el pdf); sin embargo probando en el proteus veo que no se transmite dato alguno por estos pines, en contraste, coloco el I2C debugger (Proteus) en los pines por defecto (RC4, RC3) y !transmite!, lo que me indica que el compilador o lo que sea no me hizo efectivos los cambios de la librería.
No se como hacer que el compilador me haga efectivos estos cambios, probablemente mi traducción del pdf es incorrecta o algo así, o no entiendo bien lo que me quieren decir.
Si alguien sabe como hacer que el I2C funcione con otros pines, o simplemente como hacer que el compilador me tome los cambios en la librería lo agradeceré mucho..... A continuación pongo el fragmento de texto del pdf donde dice como hacer los cambios efectivos (si es por mi problema de traducción, jejeje):
"After these definitions have been made, the user must recompile the I2C routines and
then use the updated files in the project. This can be accomplished by adding the library
source files into the project or by recompiling the library files using the provided batch
files". MPLAB® C18 C COMPILER LIBRARIES pag: 108
De antemano muchas gracias..
Saludos
Andros!
-
hola como esta
no creo tener la respuesta as u pregunta y swiendo esta la frecha de la respuesta creo que ya lo resolvio, lo que pasa es que yo tambien estoy trabajando con i2c y logra la comunicacion entre un master y tres esclavos pero no he podido hacer que el esclavo le envie datos al master, podria por favor ayudarme.
mil gracias
yohan
-
hola como esta
no creo tener la respuesta as u pregunta y swiendo esta la frecha de la respuesta creo que ya lo resolvio, lo que pasa es que yo tambien estoy trabajando con i2c y logra la comunicacion entre un master y tres esclavos pero no he podido hacer que el esclavo le envie datos al master, podria por favor ayudarme.
mil gracias
yohan
Yoscape, ¿estas hablando de i2c por software?
andros es una pena, no vi tu post, probablemente te hubiera podido echar una mano.
-
jajaja!
pasaba por aquí y me emcuentro con esto!, si, es verdad, ha pasado bastante tiempo desde entonces..., aquella me ví obligado a usar los pines designados por hardware porque en realidad hice de todo y no me funcionó, así que ya estaba perdiendo demasiado tiempo.... Así que maunix, tus sugerencias son bienvenidas así ya haya terminado ese proyecto..., porque eso sí quedé con la espina (y la rabia) de no haber podido hacer funcionar las "maravillosas" macros de configuración del I2C por otros pines!
Saludos
Andros!
-
jajaja!
pasaba por aquí y me emcuentro con esto!, si, es verdad, ha pasado bastante tiempo desde entonces..., aquella me ví obligado a usar los pines designados por hardware porque en realidad hice de todo y no me funcionó, así que ya estaba perdiendo demasiado tiempo.... Así que maunix, tus sugerencias son bienvenidas así ya haya terminado ese proyecto..., porque eso sí quedé con la espina (y la rabia) de no haber podido hacer funcionar las "maravillosas" macros de configuración del I2C por otros pines!
Saludos
Andros!
Bueno, la técnica suele consistir en copiar todas las funciones del C18 en tu proyecto. Sí, así como lo lees ;)
Luego las referencias del C18 haciendo el include del .h de las mismas, el cual debes enmarcar con comillas "" para indicar que no busque en el path por defecto sino en el directorio actual del proyecto.
En ese archivo .h que incluiste y está tu código, en ese mismo archivo debes modificar los bits.
En el de microchip editas el código pero como están compilados en librerias, es de ahí de donde se saca el código al final por eso que tus cambios no se veían reflejados. Para que no te veas obligado a hacer una librería del LCD (.lib) es que te sugiero que copies y pegues el código en tu proyecto y lo modifiques ahí.
Esto te debiera funcionar.
Cualquier cosa, me vuelves a preguntar.
Saludos
-
good!
Andros
-
He realizado los pasos que se dicen y aun no logro hechar a andar el protocolo de comunicacion i2c por software.... alguna otra sugerencia?
Saludos
-
alguien ha obtenido una solucion??? a mi no me sale aún =(
-
Tienen que agregar los .asm al proyecto
-
Tienen que agregar los .asm al proyecto
A mi me pasa lo mismo, podrías explicar esto que dices Suky.
gracias
-
Solo tienes que agregar al proyecto los archivos fuente de la librería: \src\pmc_common\SW_I2C
Saludos!
-
Vale, eso ya lo tenía hecho pero sigue sin funcionar, los pines los reasigno en el puerto B poniendo
#define SW_I2C_IO_VI
esto los define el los pines B4 y B3 pero ni caso, siguen saliendo por los pines C3 y C4,
he probado a borrar de la librería las definiciones de los pines y forzarlo a los que yo designo pero ni caso.
he probado a poner el código en varias secciones diferentes del proyecto y nada.
¿alguna sugerencia?
-
Pues ya está solucionado, y explico como es:
Yo lo que hago es lo que ha dicho suky pero con otras cosillas más.
Copio la carpeta SW_I2C que se encuentra en el directorio donde se instala el c18, en la ruta src/pmc_common a la carpeta donde está mi proyecto.
También copio el driver del protocolo (sw_i2c.h) que se encuentra en la carpeta h dentro de la carpeta de instalación del c18, a la carpeta de mi proyecto.
Todos esos archivos los añado a la ventana de proyecto de mi proyecto, quedaría de ésta manera:
(http://img841.imageshack.us/img841/9941/ventanaproyecto.jpg) (http://imageshack.us/photo/my-images/841/ventanaproyecto.jpg/)
Ahora tenemos que indicarle al compilador que queremos trabajar con los puertos que nosotros queramos, para ello tenemos que editar el archivo fuente del protocolo i2c, ósea en el archivo sw_i2c.h.
Tenemos dos opciones, o en la cabecera del archivo ponemos la definición de los puertos a utilizar.
Ejemplo:
#define SW_I2C_IO_V1
O incluimos el define en un archivo de cabecera y lo llamamos tal que así:
(http://img6.imageshack.us/img6/4947/cdigofuente.jpg) (http://imageshack.us/photo/my-images/6/cdigofuente.jpg/)
Espero que esto le sea útil a alguien como me lo ha sido para mi, saludos