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

Software e Hardware para uC da Qualcomm, NXP, FreeScale e Motorola

Moderadores: 51, guest2003

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

Mensagempor Msconfig » 11 Dez 2006 20:58

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?
Avatar do usuário
Msconfig
Byte
 
Mensagens: 116
Registrado em: 18 Nov 2006 16:11

Mensagempor Fábio Pereira » 11 Dez 2006 22:57

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é +
Fábio Pereira
embeddedsystems.io
Avatar do usuário
Fábio Pereira
Word
 
Mensagens: 674
Registrado em: 16 Out 2006 09:07
Localização: Kitchener, ON

Mensagempor Msconfig » 12 Dez 2006 08:42

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...
Avatar do usuário
Msconfig
Byte
 
Mensagens: 116
Registrado em: 18 Nov 2006 16:11

Mensagempor Msconfig » 12 Dez 2006 08:45

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.
Avatar do usuário
Msconfig
Byte
 
Mensagens: 116
Registrado em: 18 Nov 2006 16:11

Mensagempor ddkks » 12 Dez 2006 10:44

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.
;)
ddkks
Bit
 
Mensagens: 14
Registrado em: 26 Out 2006 12:50
Localização: Sao Paulo

Mensagempor Msconfig » 12 Dez 2006 20:59

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...
Avatar do usuário
Msconfig
Byte
 
Mensagens: 116
Registrado em: 18 Nov 2006 16:11

Mensagempor Msconfig » 06 Jul 2008 21:46

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.
Avatar do usuário
Msconfig
Byte
 
Mensagens: 116
Registrado em: 18 Nov 2006 16:11

Mensagempor Fábio Pereira » 07 Jul 2008 08:08

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+
Fábio Pereira
embeddedsystems.io
Avatar do usuário
Fábio Pereira
Word
 
Mensagens: 674
Registrado em: 16 Out 2006 09:07
Localização: Kitchener, ON

Mensagempor Msconfig » 07 Jul 2008 11:42

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.
Avatar do usuário
Msconfig
Byte
 
Mensagens: 116
Registrado em: 18 Nov 2006 16:11

Mensagempor Fábio Pereira » 07 Jul 2008 14:15

Experimente declarar como unsigned near char ...

T+
Fábio Pereira
embeddedsystems.io
Avatar do usuário
Fábio Pereira
Word
 
Mensagens: 674
Registrado em: 16 Out 2006 09:07
Localização: Kitchener, ON

Mensagempor Msconfig » 12 Jul 2008 23:12

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!
Avatar do usuário
Msconfig
Byte
 
Mensagens: 116
Registrado em: 18 Nov 2006 16:11

Mensagempor msamsoniuk » 14 Jul 2008 02:27

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.
Avatar do usuário
msamsoniuk
Dword
 
Mensagens: 2935
Registrado em: 13 Out 2006 18:04


Voltar para NXP (ex-FreeScale (ex-Motorola))

Quem está online

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

x