Dúvida EEPROM

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

Dúvida EEPROM

Mensagempor gilliard » 20 Nov 2009 12:18

: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
Avatar do usuário
gilliard
Byte
 
Mensagens: 121
Registrado em: 26 Ago 2008 13:32

Mensagempor Djalma Toledo Rodrigues » 20 Nov 2009 13:24

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

.
Avatar do usuário
Djalma Toledo Rodrigues
Dword
 
Mensagens: 2334
Registrado em: 03 Ago 2008 13:22

Mensagempor gilliard » 20 Nov 2009 15:05

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 ?!?!?
Avatar do usuário
gilliard
Byte
 
Mensagens: 121
Registrado em: 26 Ago 2008 13:32

Mensagempor tcpipchip » 20 Nov 2009 16:13

O ponteiro da DDRAM é AUTO INCREMENT, entao, repita a função de Impressão.
Avatar do usuário
tcpipchip
Dword
 
Mensagens: 6560
Registrado em: 11 Out 2006 22:32
Localização: TCPIPCHIPizinho!

Mensagempor gilliard » 20 Nov 2009 17:02

Exemplo....
Avatar do usuário
gilliard
Byte
 
Mensagens: 121
Registrado em: 26 Ago 2008 13:32

Mensagempor gilliard » 20 Nov 2009 19:36

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 ?!?!?
Avatar do usuário
gilliard
Byte
 
Mensagens: 121
Registrado em: 26 Ago 2008 13:32

Mensagempor Djalma Toledo Rodrigues » 20 Nov 2009 21:56

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

.
Avatar do usuário
Djalma Toledo Rodrigues
Dword
 
Mensagens: 2334
Registrado em: 03 Ago 2008 13:22

Mensagempor gilliard » 20 Nov 2009 22:49

: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 ?!?!?
Avatar do usuário
gilliard
Byte
 
Mensagens: 121
Registrado em: 26 Ago 2008 13:32

Mensagempor gilliard » 21 Nov 2009 09:40

: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
Avatar do usuário
gilliard
Byte
 
Mensagens: 121
Registrado em: 26 Ago 2008 13:32

Mensagempor Djalma Toledo Rodrigues » 21 Nov 2009 09:52

Pare de nos chamar de Galera . rs

Coloque a "Subrotina" aqui.

mas, Var. global / local ?
.
Avatar do usuário
Djalma Toledo Rodrigues
Dword
 
Mensagens: 2334
Registrado em: 03 Ago 2008 13:22

Mensagempor gilliard » 21 Nov 2009 10:17

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 **********//

Avatar do usuário
gilliard
Byte
 
Mensagens: 121
Registrado em: 26 Ago 2008 13:32

Mensagempor gilliard » 21 Nov 2009 13:00

Pessoal, me ajudem ......
Avatar do usuário
gilliard
Byte
 
Mensagens: 121
Registrado em: 26 Ago 2008 13:32

Mensagempor Jozias del Rios » 21 Nov 2009 13:27

trocando a penultima linha de

Lcd_custom_out(1,1,valor_3);

por

Lcd_custom_out(1,1,0x30);

o que acontece?
Os vencedores são aqueles que sabem o que fazer se perderem.
Os perdedores são aqueles que não sabem o que fazer se ganharem.
Avatar do usuário
Jozias del Rios
Byte
 
Mensagens: 279
Registrado em: 31 Out 2009 03:36
Localização: SJCampos-SP

Mensagempor Djalma Toledo Rodrigues » 21 Nov 2009 14:53

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 ?

.
Editado pela última vez por Djalma Toledo Rodrigues em 21 Nov 2009 15:52, em um total de 2 vezes.
Avatar do usuário
Djalma Toledo Rodrigues
Dword
 
Mensagens: 2334
Registrado em: 03 Ago 2008 13:22

Mensagempor gilliard » 21 Nov 2009 15:02

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 ?!?!?
Avatar do usuário
gilliard
Byte
 
Mensagens: 121
Registrado em: 26 Ago 2008 13:32

Próximo

Voltar para PIC

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante

x