Página 1 de 1

Problema com 'lcd_escreve_string' do Fábio Pereira num JL8

MensagemEnviado: 11 Dez 2006 20:58
por Msconfig
Eu tenho uma constante no CodeWarrior como essa:

unsigned char const Msg1[]={"Digite a senha."};

O CW aloca essa constante no enderço 0xDE48.

Se eu tentar usar a bilbliteca de LCD do livro HC908Q do Fábio Pereira:

Código: Selecionar todos
void lcd_escreve_string (char *c)
{
   while (*c)
   {
      lcd_escreve_char(*c);
      c++;
   }
}


O compliador não repassa o ponteiro certo pra a função.

Tente forcar isso com *far e não deu certo.

A unica forma que consegui foi usar:

Código: Selecionar todos
   lcd_escreve_char(Msg1[0]);
   lcd_escreve_char(Msg1[1]);
   lcd_escreve_char(Msg1[2]);
   lcd_escreve_char(Msg1[3]);
   lcd_escreve_char(Msg1[4]);



Pois nesse caso a rotina do Fábio Pereira não usa ponteiros:

Código: Selecionar todos
void lcd_escreve_char(char c)
// envia um caractere para o display
{
   switch (c)
   {
     case '\f'    :   lcd_envia_byte(0,1);
                 delay_ms(5);
               break;
     case '\n'   :
    case '\r'    :   lcd_pos_xy(1,2);
                 break;
     default   :   lcd_envia_byte(1,c);
   }
}



Mas isso não ficou prático. Como faço para passar o ponteiro de 16 bits para a função lcd_escreve_string?

MensagemEnviado: 11 Dez 2006 22:57
por Fábio Pereira
Não entendi ...

A função escreve string utiliza ponteiros como você mesmo pode constatar ...

Você verificou se o compilador está configurado para guardar variáveis CONST na ROM ?

Até +

MensagemEnviado: 12 Dez 2006 08:42
por Msconfig
O problema é que o endereço da letra 'D' da minha constante é 0xDE48, da letra 'i' da minha constante é 0xDE49 e assim sucessivamente.

Só que a variavel e o ponteiro 'c' da função 'lcd_escreve_string' é só de 8 bits, não podendo dessa forma apontar para o endereço de 16 bits da minha constante.

Aí o LCD escreve só sujeira...

MensagemEnviado: 12 Dez 2006 08:45
por Msconfig
Faltou dizer que eu ví o endereço aonde o compilador jogou minha string, vasculhando a Flah do chip tanto na simulação como no MON8.

MensagemEnviado: 12 Dez 2006 10:44
por ddkks
Isso é um problema no CW que ocorre se vc usar o modelo "tiny"... basta criar o projeto no modelo "small" que irá funcionar.

void lcd_escreve_string (char *c)

char *c define que o ponteiro "apontará" para um tipo char... porém o espaço alocado para c é de 16 bits.

MensagemEnviado: 12 Dez 2006 20:59
por Msconfig
ddkks escreveu:Isso é um problema no CW que ocorre se vc usar o modelo "tiny"... basta criar o projeto no modelo "small" que irá funcionar.


Na mosca! Apenas tenho o aviso: Warning : C1825: Indirection to different types ('const unsigned char *' instead of 'unsigned char *')
na linha lcd_escreve_string(Msg1);

Agora como faço para usar o banco direto?
Como posso saber aonde está alocado o Stack?

Desculpem minha ignorância, mas Freescale não fácil como PIC...

MensagemEnviado: 06 Jul 2008 21:46
por Msconfig
Eu havia desistido do JL8, mas caí no mesmo problema querendo utilizar toda a RAM do GB32.

Utilizei o modelo Small e só consegui utilizar a pagina direta da ram com:
Código: Selecionar todos
#pragma DATA_SEG __DIRECT_SEG MY_ZEROPAGE
static __near char indice;
#pragma DATA_SEG DEFAULT


Mas sem o "static" a variavel "indice" é alocada fora da pagina direta. Nao entendo porque precisa o "static", mas deve ser correto, afinal copiei do livro "HCS08 Unleashed: Designer’s Guide To The HCS08 Microcontrollers"

Observei tambem que utilizando "indice" numa matriz "Texto" fora da pagina direta:
Código: Selecionar todos
  for(indice=0;indice<20;indice++){
    texto=Texto[indice];
  }


Tambem funciona... O duro é levar meio ano para fazer funcionar e mesmo assim nao entender o porque.

MensagemEnviado: 07 Jul 2008 08:08
por Fábio Pereira
Outra forma de utilizar a página direta é instruindo o linker para utilizá-la.

No seu arquivo PRM, inclua a Z_RAM no PLACEMENT da DEFAULT_RAM:

DEFAULT_RAM INTO RAM,Z_RAM;

O problema com este método é que o linker é quem vai determinar quais as variáveis que serão colocadas na página zero e quais ficarão no restante da RAM.

Quanto ao static, ele não é realmente necessário na declaração da variável. De qual exemplo você retirou o fragmento do código?

T+

MensagemEnviado: 07 Jul 2008 11:42
por Msconfig
Tirei do exemplo 9.15

O interessante que minha matriz "Texto" está em 0x100, como desejado, mas "indice" e outras variaveis que eu quero abaixo disso, na pagina direta, se não forem static, o CW joga lá para cima em 0x160 para diante.

MensagemEnviado: 07 Jul 2008 14:15
por Fábio Pereira
Experimente declarar como unsigned near char ...

T+

MensagemEnviado: 12 Jul 2008 23:12
por Msconfig
Fábio Pereira escreveu:Experimente declarar como unsigned near char ...

T+


Foi uma dura luta, mas deu tudo certo, como postei aqui.

Obrigado, Fabio.

Ah , as suas dicas no forum da Freescale são muito úteis!

MensagemEnviado: 14 Jul 2008 02:27
por msamsoniuk
Msconfig escreveu:Agora como faço para usar o banco direto?
Como posso saber aonde está alocado o Stack?

Desculpem minha ignorância, mas Freescale não fácil como PIC...


freescale com certeza eh mais simples, visto que nao possuem bancos, segmentos, paginas ou espacos especiais de enderecamento. tudo esta no mesmo espaco de 64KB, entao, no caso do hc908, ponteiros de 16 bits seriam suficientes.

infelizmente na decada de 70 os caras pensavam um pouco diferente e precisavam de mais performance diminuindo a banda de memoria, entao inventaram os ponteiros de 8 bits, para enderecar os primeiros 256 bytes do espaco de 64KB e economizar um byte nas instrucoes. isso de fato otimiza a performance, em particular se o i/o e ram estao nestes 256 primeiros bytes, mas como o hc908 nao eh orientado a paginas, bancos ou segmentos, isso nao vale para a memoria acima, onde esta o resto da ram e a flash.

entao, se vc tem um mcu com muito mais memoria, nao tem logica manter essa otimizacao e o melhor seria vc *sempre* usar ponteiros de 16 bits, assim ponteiros para io, stack, ram e flash ficam *sempre* validos.

o 68k e coldfires possuem exatamente essa mesma feature, mas francamente nunca vi ninguem usar, parece mais vantagem usar ponteiros do mesmo tamanho para o sistema todo ao inves de perder tempo e consistencia para otimizar uma janela miuda de memoria.