TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: jeremylf en 18 de Diciembre de 2007, 20:51:52
-
Hola a todos.
Me surge una duda, espero puedan ayudarme.
Libreria para la Eeprom 24LC512
#ifndef EEPROM_SDA
#define EEPROM_SDA PIN_B1
#define EEPROM_SCL PIN_B0
#endif
#use i2c(master, sda=EEPROM_SDA, scl=EEPROM_SCL)
#define EEPROM_ADDRESS long int
#define EEPROM_SIZE 65535
void init_ext_eeprom()
{
output_float(EEPROM_SCL);
output_float(EEPROM_SDA);
}
void write_ext_eeprom(long int address, BYTE data)
{
short int status;
i2c_start();
i2c_write(0xa0);
i2c_write(address>>8);
i2c_write(address);
i2c_write(data);
i2c_stop();
i2c_start();
status=i2c_write(0xa0);
while(status==1)
{
i2c_start();
status=i2c_write(0xa0);
}
}
BYTE read_ext_eeprom(long int address) {
BYTE data;
i2c_start();
i2c_write(0xa0);
i2c_write(address>>8);
i2c_write(address);
i2c_start();
i2c_write(0xa1);
data=i2c_read(0);
i2c_stop();
return(data);
}
Una opcion al configurar el I2C:
STREAM=id
Associates a stream identifier with this I2C port. The identifier may then be used in functions like i2c_read or i2c_write.
Una opcion al usar una funcion del I2C:
stream - specify the stream defined in #USE I2C
Y bueno mi duda es que en la libreria de la Eeprom, exactamente en la funcion de lectura (read_ext_eeprom), usa una funcion del I2C (i2c_read) que en sus parametros incluye un 0; esto es para el stream, lo se. Pero, ¿porque? En la ultima cita que puse dice que especifica el stream definido en la configuracion del I2C (#USE..) pero en esta libreria no se a especificado nada y pues no entiendo entonces porq pone ese 0 en la funcion de lectura y/o porque no lo hace tambien en la de escritura, inicializacion, etc (yaq en todas las funciones se peude especificar el STREAM) :? Acaso hay un valor por default al no configurar manualmente el STREAM o algo asi ?
Por profundisar un poco mas, podrian explicarle porfavor para que sirve establer el STREAM en la configuracion inicial del I2C ?
Gracias.
salu2 8)
-
yo te explico....yo!!!! :-/
Hola a todos.
Y bueno mi duda es que en la libreria de la Eeprom, exactamente en la funcion de lectura (read_ext_eeprom), usa una funcion del I2C (i2c_read) que en sus parametros incluye un 0; ¿porque?
suce de que si revisas el help del CCS te aparece esto:
Syntax:
data = i2c_read();
or
data = i2c_read(ack);
Parameters:
ack -Optional, defaults to 1.
0 indicates do not ack.
1 indicates to ack.
y si revisas la trama de lectura para una memoria i2c:
(http://img257.imageshack.us/img257/7843/79513550nv7.jpg)
entonces cuando realizas una lectura tienes que terminar con un bit "NO ACK" antes de enviar el bit de "STOP". es por eso que la rutina read_i2c(0) lleva un cero.
pd: lo del stream no te entiendo bien :?
-
Hola Henry. Tengo el CCS 4.023 y spuestamente tu tb :-)
En la ayuda me aparece esto:
Syntax:
data = i2c_read();
data = i2c_read(stream);
data = i2c_read(stream, ack);
Ocea q si quisiera usar el parametro ack, tendria que usar 1ro el parametro stream. Bueno almenos es eso lo q yo entiendo al ver eso, por eso mi pregunta iva dirigida al Stream.
Ahora si me equivoco, entonces tu respuesta sobre que la funcion i2c_read() envia un 0 (si se indica) por falta de NOACK, me surgeria otras preguntas... El "ack" significa entonces que esta en espera de un 1? Entonces el i2c_write() aparte de enviar algu dato envia por finalizado un 1 siempre? porq despues del CONTROL BYTE dice (abajito) ACK :?
Gracias por respnder mcadave :P
salu2 8)
-
uyyyyyyy que mala suerte yo tengo el 3.0249 :(
-
Jaja entonces mi primera duda sige en pie :D Porfa alguien ??
Gracias de todas maneras Hnry!
salu2 8)
-
me parece que ese STREAM ID sirve para identificar distintas funciones i2c de lectura o escritura para distintos dispositivos con dicho protocolo. De seguro la gente que tienen dicho compilador te dara más luces al respecto. saludos! :-/
-
El stream es un identificador de tipo, para diferenciar entre varios dispositivos.
Esto ocurre por ejemplo con la comunicación 232.
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7,PC)
#use rs232(baud=9600, xmit=PIN_C4, rcv=PIN_C5,RF)
Donde PC y RF son dos dispositivos distintos conectados en nuestro micro en patillas distintas, además como bien sabes puedes conectar un LCD al micro de forma muy sencilla, imagina que quieres enviar datos al LCD.
printf(lcd_putc,"%s",datos); printf es una función para sacas datos del pic, donde le estamos diciendo que los saque por el stream lcd.
imagina que lo quires hacer por el a través de la UART de PC.
printf(PC,"%s",datos);
o por RF
printf(RF,"%s",datos);
Lo mismo ocurre con el i2c.
Espero que tu duda sobre que es el stream y para que sirve se te haya solucionado.
Un saludete.
-
era como lo deduci, gracias c4_esp_VR. :-/
-
Si!, muchas gracias c4_esp_VR. Pero dime, esos identificadores (PC, RF) son unicos? o solo le has puesto un nombre por poner? Ah y no es: Stream = PC? o es lo mismo ?
Por otro lado, en la libreria del 24LC512 cuando usa: i2c_read(0) el 0 se refiere al stream ? o al ack ? :?
Muchas gracias.
salu2 8)
-
el 0 es al ack jeremy
el stream es una cadena que el usuario puede colocar.
-
Pero el orden que me da la ayuda del CCS en los parametros del i2c_read es incorrecto si fuera como dices. :?
Bueno de todos modos tiene q ser asi verdad? ademas e estado leyendo mas del I2C y es necesario enviar del PIC ese reconocimiento (ACK) antes de dejar el bus libre (stop) 8) jaja
Gracias Henry por tu tiempo. A ti tb c4_esp_VR.
saludts! 8)
-
fuera incorrecto si lo hubieses definido previamente en la directiva #use i2c(....), pero sino lo has definido entonces el 0 referiria drirectamente a generar el NO_ACK
-
Tienes razon. No lo veia asi, esq el primer lenguaje en C q use no me daba esta facilidad.
Muchas gracias!
salu2 8)
-
RF y PC son stream de ejemplo como si quieres puedes ponerlo friki y todopic :D :D :D :D :D
Un saludete.
-
jaja aora si ya entnedi lo del STREAM. :P
Gracias!
salu2 8)