///////////////////////////////////////////////////////////////////////////
//// (C) Copyright 1996,2003 Custom Computer Services ////
//// This source code may only be used by licensed users of the CCS C ////
//// compiler. This source code may only be distributed to other ////
//// licensed users of the CCS C compiler. No other use, reproduction ////
//// or distribution is permitted without written permission. ////
//// Derivative programs created using this software in object code ////
//// form are not restricted in any way. ////
///////////////////////////////////////////////////////////////////////////
#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 32768
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);
}
Hola amigos!
¿Alguien puede decirme si el "driver" incluido en CCS (24256.C) cuyo codigo incluyo mas abajo funciona en PICs que no tienen i2c implementado por hardware?
Gracias! :)
Realmente es absurdo que los PIC no tengan integradas esas resistencias pull-up en su propio core.
Marcos, el temas de las resistencias pullup estan bajo la órbita de las leyes de murphy: "Si puedes olvidar de poner las resistencias pullup, seguramente no las pondras", o algo asi. :)
Servicio Nocturno de Rediseños de PCB's de Urgencia:D :D :D :D :D
int tabla[8]; //={0x3C,0x42,0x81,0xa5,0x81,0x99,0x42,0x3c};
int fila[8]={254,253,251,247,239,223,191,127};
.
.
.
.
void fDibujoPantalla(long int imagen, int efecto) {
int i=0,j=0, aux, tiempo;
//Cargo en la tabla los valores de la EEPROM
for (aux=0;aux<=20;aux++){ //Este bucle simula las 20 lecturas......
for (i=0;i<=7;i++) {
tabla[i] = read_ext_eeprom ((long int)imagen*9+i); //Esta es la "cuenta" que menciono en el post.
}
}
tiempo = 40;
//Bucle que muestra la imagen "tiempo" veces
for (i=1;i<=tiempo;i++) {
for (j=0;j<8;j++) {
PORTB = 255; //Filas apagadas.
//escribo registro desplazamiento
for (aux=0;aux<=20;aux++){
fRDD_send_byte1(tabla[j]);
}
//Enciendo la fila correspondiente
PORTB = fila[j];
delay_ms(3);
}
PORTB = 255; //Filas apagadas.
}
}
Como consejo queda decirte que podrias utilizar la interrupcion para marcar los tiempos exactos, y leer los bytes de EEPRM mientras ocurre el muestreo...
int8 dato[];
int16 direcion_inicial = 0, direcion_final = 100;
i2c_start();
i2c_write(0xa0);
i2c_write(direcion_inicial >> 8);
i2c_write(direcion_inicial);
i2c_start();
i2c_write(0xa1);
for (direcion_inicial; direcion_inicial <= direcion_final; direcion_inicial++)
{
dato[direcion_inicial] = i2c_read(0);
}
i2c_stop();
¿Y no puedes leer de la eeprom los 20 caracteres de una tacada para luego ir mostrándolos?, en otras palabras, vuelca el contenido de la eeprom a la ram y trabaja con esta última.
No entiendo porq tienes q hacer 21 lecturas! oO!
for (aux=0;aux<=20;aux++){ //Este bucle simula las 20 lecturas......
for (i=0;i<=7;i++) {
tabla[i] = read_ext_eeprom ((long int)imagen*9+i); //Esta es la "cuenta" que menciono en el post.
}