Página 1 de 3

Dúvida EEPROM

MensagemEnviado: 20 Nov 2009 12:18
por gilliard
:D Fala Feras !!!! tranquilo ?!?!? :D

Pessoal, mais uma vez tive que fazer um projeto no MikroC, e me deparei com um problema besta, mas que eu não consegui resolver, é o seguinte:

Eu gravei o numero 0 na EEPROM, na posição 0x34.

Dai dentro do void main tentei exibir o valor gravado na posição 0x34 da EEPROM no LCD.

Mas o problema é que ela exibe o conteudo da EEPROM posição 0x34, mas é um caractere estranho, não o numero 0.

Vejam:

:arrow: Imagem do Problema:

Imagem

:arrow: Codigo do Programa:

Código: Selecionar todos
//********** inicio da configuração da gravação da EEPROM **********//

void grava(){

Eeprom_Write(0x34,0);   // Grava na memória 0x34 o numero 0

}

//********** Fim da configuração da gravação da EEPROM **********//

//********** Inicio da configuração do LCD 16x4 **********//

void config_lcd(void){

   Lcd_custom_Config(&PORTD,7,6,5,4,&PORTE,2,0,1);   // Configura portas

   Lcd_custom_Cmd(Lcd_Clear);                        // Limpa o LCD 16x4

   Lcd_custom_Cmd(LCD_BLINK_CURSOR_ON);              // Apaga o cursor

   delay_ms (100);                                   // Duração 100 ms

}

//********** Fim da configuração do LCD 16x4 **********//

//********** Inicio do programa principal **********//

void main() {

unsigned int valor_3;

  adcon1 = 0x06;        // define pinos AD como I/O de uso geral

  trisd = 0;            // Define portd como saida
  trise = 0;            // Define porte como saida
 
  config_lcd();         // Inicia a configuração do LCD

  valor_3 = Eeprom_read(0x34);       // Lê a memória 0x34

  Lcd_custom_Cmd(Lcd_Clear);         // Limpa o LCD 16x4

  Lcd_custom_out(1,1,valor_3);       // Exibe o valor da posição 0x34

  Delay_ms(20);                      // Duração 20 ms

}

//********** Fim da programa principal **********//



:D Galera, toda ajuda será muuuuuuuuuuito bem vinda !!!! :D

:D Desde já, muuuuito obrigado a todos :D

MensagemEnviado: 20 Nov 2009 13:24
por Djalma Toledo Rodrigues
Oi Gilliard

Esta tudo certo faltou apenas um detalhe no LCD código ASCII e

Zero em ASCII é 0x30 Decimal 48
Hum -----> 0x31 ------> Decimal 49

Aqui a Tabela ASCII com Códigos Imprimíveis e os 'nem tanto'.

http://pt.wikipedia.org/wiki/ASCII

.

MensagemEnviado: 20 Nov 2009 15:05
por gilliard
Digamos que eu salvei a letra C na posição 0x35 e a letra A na posiçao 0x36.

Como eu faria para exibir essas duas letras em sequencia no LCD ?!?!?

MensagemEnviado: 20 Nov 2009 16:13
por tcpipchip
O ponteiro da DDRAM é AUTO INCREMENT, entao, repita a função de Impressão.

MensagemEnviado: 20 Nov 2009 17:02
por gilliard
Exemplo....

MensagemEnviado: 20 Nov 2009 19:36
por gilliard
Galera, eu segui a dica do nosso colega DJalma em colocar o numero em hexadecimal, então tentei gravar assim na EEPROM:

Código: Selecionar todos
Eeprom_Write(0x34,0x31);   // Grava na memória 0x34 o numero 0


Mas no LCD, continua mostrando o mesmo caractere estranho !!!!

Oque eu devo fazer galera ?!?!?

MensagemEnviado: 20 Nov 2009 21:56
por Djalma Toledo Rodrigues
Testa enviando o Byte direto ao LCD .
Depois cuida da EEPROM

Configura o LCD

Cursor Home

Envia Byte ASCII (Um ou mais)

while (1) // loop infinito

.

MensagemEnviado: 20 Nov 2009 22:49
por gilliard
:D Galera descobri algo alarmante :D

Quando eu efetuo a gravação e a leitura dentro do VOID MAIN ele funciona.

Mas quando eu crio uma SUB ROTINA chamada grava(); e chamado essa sub rotina dentro do void main. dai para de funcionar.

só funciona, quando tanto a gravação como a leitura, esteja dentro do void main.

E agora ?!?!? Oque pode ser ?!?!?

MensagemEnviado: 21 Nov 2009 09:40
por gilliard
:arrow: Galera, eu acho que descobri um BUG do MikroC !!!!

Eu fiz alguns testes, e descobri o seguinte .....

Quando eu gravo e leio a EEPROM dentro do próprio void main, funciona normalmente, mesmo eu gravando em decimal em vez de hexadecimal, assim:

Código: Selecionar todos
void main() {

unsigned int valor_3;

  adcon1 = 0x06;        // define pinos AD como I/O de uso geral

  trisd = 0;            // Define portd como saida
  trise = 0;            // Define porte como saida
 
  config_lcd();         // Inicia a configuração do LCD

  Eeprom_Write(0x34,0);   // Grava na memória 0x34 o numero 0

  Delay_ms(40);

  valor_3 = Eeprom_read(0x34);       // Lê a memória 0x34

  Lcd_custom_Cmd(Lcd_Clear);         // Limpa o LCD 16x4

  Lcd_custom_out(1,1,valor_3);       // Exibe o valor da posição 0x34

  Delay_ms(20);                      // Duração 20 ms


Mas se eu criar uma subrotina para gravar na EEPROM, e eu chamar essa subrotina dentro do void main, ai da aquele problema, do caractere estranho..... Será que é BUG, ou é algum problema na minha sub rotina...

Galera, me ajudem a descobrir essa falha, até mesmo para os demais usuários desse forum, é de grande ajuda a todos fanáticos pelo MikroC, se acontecer com alguem, já tem a solução aqui no forum...

Me ajudem .....

Desde já agradeço ao meu irmão DJalma, que vem me ajudando bastante, e ao tcpipchip, valew maninhos

MensagemEnviado: 21 Nov 2009 09:52
por Djalma Toledo Rodrigues
Pare de nos chamar de Galera . rs

Coloque a "Subrotina" aqui.

mas, Var. global / local ?
.

MensagemEnviado: 21 Nov 2009 10:17
por gilliard
Desculpe, não sabia que chamar vocês de Galera, ofendia !!!!

:arrow: Subrotina

Código: Selecionar todos

void grava(){

Eeprom_Write(0x34,0);   // Grava na memória 0x34 o numero 0

}



:arrow: Programa Principal

Código: Selecionar todos


//********** Inicio da configuração do LCD 16x4 **********//

void config_lcd(void){

   Lcd_custom_Config(&PORTD,7,6,5,4,&PORTE,2,0,1);   // Configura portas

   Lcd_custom_Cmd(Lcd_Clear);                        // Limpa o LCD 16x4

   Lcd_custom_Cmd(LCD_BLINK_CURSOR_ON);              // Apaga o cursor

   delay_ms (100);                                   // Duração 100 ms

}

//********** Fim da configuração do LCD 16x4 **********//

//********** Inicio do programa principal **********//

void main() {

  unsigned int valor_3;

  adcon1 = 0x06;        // define pinos AD como I/O de uso geral

  trisd = 0;            // Define portd como saida
  trise = 0;            // Define porte como saida

  grava();               // Chama rotina grava()
 
  config_lcd();         // Inicia a configuração do LCD

  valor_3 = Eeprom_read(0x34);       // Lê a memória 0x34

  Lcd_custom_Cmd(Lcd_Clear);         // Limpa o LCD 16x4

  Lcd_custom_out(1,1,valor_3);       // Exibe o valor da posição 0x34

  Delay_ms(20);                      // Duração 20 ms

}

//********** Fim da programa principal **********//


MensagemEnviado: 21 Nov 2009 13:00
por gilliard
Pessoal, me ajudem ......

MensagemEnviado: 21 Nov 2009 13:27
por Jozias del Rios
trocando a penultima linha de

Lcd_custom_out(1,1,valor_3);

por

Lcd_custom_out(1,1,0x30);

o que acontece?

MensagemEnviado: 21 Nov 2009 14:53
por Djalma Toledo Rodrigues
Gilliard
Mas, você tem que colaborar . :D

Quando se tem problema em coisa complexa , no seu caso, EEPROM LCD

Agende divide o problema .

:arrow: Subrotina

Código: Selecionar todos

void grava(){

Eeprom_Write(0x34,0);   // Grava na memória 0x34 o numero 0

}


Aqui por exemplo deveria ter após Escrito na EEPROM fazer a leitura e confirmar,
comparando com o que foi Gravado, se igual.

Depois de resolvido remove essas instruções adicionais, lógico

---------------------------------------------------

Agora faça, como disse o Jozias del Rios :
Código: Selecionar todos
Lcd_custom_out(1,1,0x30);


você vai escrever direto no LCD, sem envolver a EEPROM

Entendeu ?

.

MensagemEnviado: 21 Nov 2009 15:02
por gilliard
Colegas, eu estou ajudando, vocês que não estão entendendo.

Eu disse anteriormente, que EU fiz alguns TESTE, incluindo esse de por 030, e como disse, esse não é o problema. Eu disse que o problema só aparece, quando ele é " executado " fora do void main.

Dentro do void main, funciona sendo hexadecimal, decimal, octal , enfim......

O problema não é esse de gravar em hexadecimal, ja testei inumeras vezes, e funciona normalmente, quando rodado dentro do void main.

Entendeu agora Djalma ?!?!?