Moderadores: andre_luis, 51, guest2003, Renie
Djalma Toledo Rodrigues escreveu:Resumindo:
É numa hora dessa que se vê a falta que faz o ASM
DJ
sei lá, sou contra esse negocio de avatar estilo baratinha, que deixa a gente com uma coisa ruim, com vontade de dar ticão na tela do pc.
após isto esta tentando mandar um start + comando de gravação??
//SDCard icon
const char logo6[]={
0x0,0x0,
0x7,0x3C,
0x8,0x4,
0x15,0x14,
0x15,0x14,
0x15,0x14,
0x10,0x4,
0x10,0x4,
0x10,0x4,
0x10,0x4,
0x10,0x4,
0x1F,0x3C,
};
void GravarImagemEEprom(unsigned int end, char pagina)
{ int x=0, TamanhoImagem;
char BufferEEprom = 0, CrtByte;
if (pagina){ //icone=1
TamanhoImagem = 24; //icone 24 bytes
// Inicio = 0; //Inicio da primeira imagem
CrtByte = 0XA8; //Pagina 1
}
else{ //Logo=0
TamanhoImagem = 2560; //Logo 2560 bytes
// Inicio = 100; //Inicio da primeira imagem
CrtByte = 0XA0; //Pagina 0
}
rw_start_eeprom(end, CrtByte); //Envia Endereço e Byte de controle
for (x=0; x < TamanhoImagem; x++)
{
if (++BufferEEprom>127) //Se o buffer interno da EEprom ficou cheio
{
i2c_stop(); //Avisa EEprom para iniciar a gravação
BufferEEprom = 0; //reinicia contador
while(1) //Aguarda ACK da Memória
{
i2c_start(); //Envia Start
//i2c_repStart();
i2c_waitForIdle(); //Aguarda condição de Idle
i2c_write(CrtByte); //Envia Byte de controle
i2c_waitForIdle(); //Aguarda condição de Idle
if (!ACKSTAT) break; //Se receber acknowledge sai do loop
i2c_stop(); //Envia stop
i2c_waitForIdle(); //Aguarda condição de Idle
}
i2c_repStart();
rw_start_eeprom(end, CrtByte); //Envia Endereço e Byte de controle
//i2c_write(CrtByte);
}
else
{
i2c_write(logo1[x]); //Aqui define qual array vai ser enviado
end++;
}
}
i2c_stop();
}
RobL escreveu:Verifique se seu problema é rollover, pois você fala do tamanho da página em 127 e ela é de 128 bytes. ...
...Seu programa precisa ser capaz de pegar a quantidade de bytes a gravar dividir por 128 e a sobra gravar como página também....
...não existe gravação de um ou poucos bytes nessas eeproms externas, somente páginas. Quando se grava um byte, grava-se uma página.
vtrx escreveu:...Regis,me manda o arquivo texto explicando que bytes voce usa,serve colar os byte neste formato:
barboza escreveu: Cara, estive olhando seu código e acho que pode testar algo assim: ...
lellis escreveu:Se o amigo é adepto da simplicidade e não muito fã dos alternativos e já tem os binários das telas, uma outra opção que sugiro é o bin2hex.exe que deve ter + que 20 anos e já não tem mais proprietário (se é que teve). Tem até fonte. Tem também o hex2bin.exe. Roda no prompt do dos (se souber o que é). google "bin2.hex.exe" e"hex2bin.exe"
regiscruz escreveu:Acho que o problema esta no loop que conta a pagina, vou fazer alguns testes.
if (BufferEEprom++>127) //Se o buffer interno da EEprom ficou cheio
barboza escreveu:Troca para essa linha.
Problemas de precedências....
void GravarImagemEEprom(unsigned int end, char pagina)
{ int x=0, TamanhoImagem;
char BufferEEprom = 0, CrtByte;
if (pagina){ //icone=1
TamanhoImagem = 24; //icone 24 bytes
// Inicio = 0; //Inicio da primeira imagem
CrtByte = 0XA8; //Bloco 1
}
else{ //Logo=0
TamanhoImagem = 2560; //Logo 2560 bytes
// Inicio = 100; //Inicio da primeira imagem
CrtByte = 0XA0; //Bloco 0
}
rw_start_eeprom(end, CrtByte); //Envia Endereço e Byte de controle
for (x=0; x < TamanhoImagem; x++)
{
if (BufferEEprom++>=128) //Se o buffer interno da EEprom ficou cheio
{
i2c_stop(); //Avisa EEprom para iniciar a gravação
while(1) //Aguarda ACK da Memória
{
i2c_start(); //Envia Start
//i2c_repStart();
i2c_waitForIdle(); //Aguarda condição de Idle
i2c_write(CrtByte); //Envia Byte de controle
i2c_waitForIdle(); //Aguarda condição de Idle
if (!ACKSTAT) break; //Se receber acknowledge sai do loop
i2c_stop(); //Envia stop
i2c_waitForIdle(); //Aguarda condição de Idle
}
BufferEEprom = 0; //reinicia contador
i2c_repStart();
x=x-1;
rw_start_eeprom(end, CrtByte);//Envia Endereço e Byte de controle
//i2c_write(CrtByte);
}
else
{
i2c_write(logo1[x]); //Aqui define qual array vai ser enviado
end++;
}
}
i2c_stop();
}
barboza escreveu:Seus dados não devem estar certos. O primeiro byte de cada pagina deve estar errada.
Retira a subtração do x e mantenha a comparação com 127 que você trocou por 128.
void GravarImagemEEprom(unsigned int end, char pagina)
{ int x=0, TamanhoImagem;
char CrtByte;
if (pagina){ //icone=1
TamanhoImagem = 24; //icone 24 bytes
// Inicio = 0; //Inicio da primeira imagem
CrtByte = 0XA8; //Bloco 1
}
else{ //Logo=0
TamanhoImagem = 2560; //Logo 2560 bytes
// Inicio = 100; //Inicio da primeira imagem
CrtByte = 0XA0; //Bloco 0
}
rw_start_eeprom(end, CrtByte); //Envia Endereço e Byte de controle
for (x=0; x < TamanhoImagem; x++)
{
i2c_write(logo1[x]); //Aqui define qual array vai ser enviado
if (!(++end & 0x007F)) //Se o buffer interno da EEprom ficou cheio
{
i2c_stop(); //Avisa EEprom para iniciar a gravação
while(1) //Aguarda ACK da Memória
{
i2c_start(); //Envia Start
//i2c_repStart();
i2c_waitForIdle(); //Aguarda condição de Idle
i2c_write(CrtByte); //Envia Byte de controle
i2c_waitForIdle(); //Aguarda condição de Idle
if (!ACKSTAT) break; //Se receber acknowledge sai do loop
i2c_stop(); //Envia stop
i2c_waitForIdle(); //Aguarda condição de Idle
}
i2c_repStart();
rw_start_eeprom(end, CrtByte);//Envia Endereço e Byte de controle
}
}
i2c_stop();
}
void GravarEEprom(unsigned int end_eeprom, char *end_ram, unsigned int size, char controle)
{
while (size--)
{
rw_start_eeprom(end_eeprom, controle); //Envia Endereço e Byte de controle
i2c_write(*end_ram++); //Aqui define qual array vai ser enviado
if (!(++end_eeprom & 0x007F)) //Se o buffer interno da EEprom ficou cheio
{
i2c_stop(); //Avisa EEprom para iniciar a gravação
while(1) //Aguarda ACK da Memória
{
i2c_start(); //Envia Start
i2c_waitForIdle(); //Aguarda condição de Idle
i2c_write(controle); //Envia Byte de controle
i2c_waitForIdle(); //Aguarda condição de Idle
if (!ACKSTAT)
{
break; //Se receber acknowledge sai do loop
}
i2c_stop(); //Envia stop
i2c_waitForIdle(); //Aguarda condição de Idle
}
}
}
i2c_stop(); //Envia stop
}
GravarEEprom(0x0A00, &logo, 24, 0xA8);
GravarEEprom(0x0A00, &logo, 2560, 0xA0);
barboza escreveu:Seus dados não devem estar certos. O primeiro byte de cada pagina deve estar errada.
Retira a subtração do x e mantenha a comparação com 127 que você trocou por 128.
barboza escreveu:Só não entendi o que é este byte de controle que você tem ai.
CrtByte
regiscruz escreveu:
Poxa barboza, agora você me deixou com a pulga atrás da orelha, dei uma visualizada no que foi gravado na eeprom e aparentemente esta tudo certo. Quero testar estas outras duas versões, parecem mais eficientes especialmente esta última, mas antes vou jogar estas informações da eeprom para o display para vermos o que esta acontecendo com mais clareza.
Me da algumas horas que ja te falo.
regiscruz escreveu:
Neste caso estou usando CrtByte=0XA0, minha eeprom esta configurada para responder ao endereço 0 e as informaçòes estão sendo guardadas no Bloco 0.
void GravarEEprom(unsigned int end_eeprom, char *end_ram, unsigned int size)
{
rw_start_eeprom(end_eeprom, CONST_A0); //Envia Endereço e Byte de controle
while (size--)
{
i2c_write(*end_ram++); //Aqui define qual array vai ser enviado
if (!(++end_eeprom & 0x007F)) //Se o buffer interno da EEprom ficou cheio
{
i2c_stop(); //Avisa EEprom para iniciar a gravação
while(1) //Aguarda ACK da Memória
{
i2c_start(); //Envia Start
i2c_waitForIdle(); //Aguarda condição de Idle
i2c_write(controle); //Envia Byte de controle
i2c_waitForIdle(); //Aguarda condição de Idle
if (!ACKSTAT)
{
break; //Se receber acknowledge sai do loop
}
i2c_stop(); //Envia stop
i2c_waitForIdle(); //Aguarda condição de Idle
}
rw_start_eeprom(end_eeprom, CONST_A0); //Envia Endereço e Byte de controle
}
}
i2c_stop(); //Envia stop
}
Warning [359] D:\Técnico\Projetos\Wifi_Radio\Gravação EEProm\main.c; 516.30 illegal conversion between pointer types
GravarEEprom(0xA00, &logo1[0], 2560);
GravarEEprom(0xA00, &logo1[0], 2560);
GravarEEprom(0xA00, &logo1, 2560);
Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante