Salvar na Flash + CW10 + display 2x16

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

Moderadores: 51, guest2003

Salvar na Flash + CW10 + display 2x16

Mensagempor egipts » 17 Set 2018 15:28

Olá.
Estou fazendo um programa para MC9s08PA32 com o CodeWarrior 10, em C, e usando display 2x16 com apenas 4 linhas de dados. O circuito funcionou como esperado e consegui usar e configurar os I/Os, timers e display, porém não consegui fazer o display exibir corretamente as mensagens que usam as variáveis salvas na flash. Usei a seguinte sentença para definir os campos:

const unsigned char txtL01[16] @0x8000 = " INCENDIO L01 ";

O compilador dá a seguinte mensagem de exclamação:

C3401 Resulting String is not zero terminated

Consegui corrigir a falha que dá na execução mudando pouca coisa no programa (usei o exemplo do livro do Fabio Pereira - HCS08 Unleashed - p. 356):

void LCD_write_string (char *c)
{
unsigned char count_16 = 16; //
while (*c)
{
LCD_write_char(*c);
c++;
count_16--; //
if(!count_16) break; //
}
}

Basicamente o programa parou de identificar o tamanho da string, então forcei ele a parar no caracter 16 (acrescentei os 3 comandos com comentários). Gostaria de saber qual a forma correta para definir as variáveis salvas na flash de forma que o compilador consiga fazer o programa passar corretamente o tamanho da string.


Outra dúvida é de com configuro o NV_FPROT, coloquei apenas " NV_FPROT = 0b00111000 " e não funcionou...

Por fim, não consegui ler o FIFO do ADC. Não é somente executar n leituras repetidas, de acordo com o tamanho escolhido? Estou usando 8b de resolução..
// mediax = ADC_R; // media do FIFO
// media_4.valor16 = mediax; // 1º level
// mediax = ADC_R; // media do FIFO
// media_4.valor16 = media_4.valor16+mediax; // 2º level
// mediax = ADC_R; // media do FIFO
// media_4.valor16 = media_4.valor16+mediax; // 3º level
// mediax = ADC_R; // media do FIFO
// media_4.valor16 = media_4.valor16+mediax; // 4º level
// media_4.valor16 = media_4.valor16/4; // total
// adc_media = media_4.valor8b; // union com os 8 LSB

Grato.
egipts
Byte
 
Mensagens: 318
Registrado em: 22 Out 2006 01:43
Localização: Mairiporã - SP

Re: Salvar na Flash + CW10 + display 2x16

Mensagempor egipts » 17 Set 2018 15:35

OUtra coisa, como faço para limpar uma Struct com esta a seguir, mas sem ser bit a bit? Tem como apagar o byte todo se fazer uma union?

struct rtc_func_ // registrador de configuração das funções do RTC (real time clock)
{
char bat_charge : 1;
char bat_nok : 1;
char sem_bat : 1; //
char incendio : 1;
char sirene_stat : 1;
char open_load : 1;
char falta_rede : 1;
char rede_nok : 1;
} rtc_func;
egipts
Byte
 
Mensagens: 318
Registrado em: 22 Out 2006 01:43
Localização: Mairiporã - SP

Re: Salvar na Flash + CW10 + display 2x16

Mensagempor cfreund » 17 Set 2018 17:22

egipts escreveu:const unsigned char txtL01[16] @0x8000 = " INCENDIO L01 ";

O compilador dá a seguinte mensagem de exclamação:

C3401 Resulting String is not zero terminated


A string tem 16 caracteres, logo o array deve ser definido para 17 caracteres.

Deixe isso por conta do compilador:

Código: Selecionar todos
const unsigned char txtL01[] @0x8000 = "  INCENDIO L01  "; 



egipts escreveu:Consegui corrigir a falha que dá na execução mudando pouca coisa no programa (usei o exemplo do livro do Fabio Pereira - HCS08 Unleashed - p. 356):

void LCD_write_string (char *c)


O erro está na string, não na função. Corrija o tamanho para acomodar o NULL no final da string e faça:

Código: Selecionar todos
void LCD_write_string (char *c)
{
   while (*c)
     LCD_write_char(*c++);
}
Cláudio F
Avatar do usuário
cfreund
Word
 
Mensagens: 672
Registrado em: 14 Out 2006 14:02
Localização: São Paulo

Re: Salvar na Flash + CW10 + display 2x16

Mensagempor cfreund » 17 Set 2018 17:24

egipts escreveu:OUtra coisa, como faço para limpar uma Struct com esta a seguir, mas sem ser bit a bit? Tem como apagar o byte todo se fazer uma union?

struct rtc_func_ // registrador de configuração das funções do RTC (real time clock)
{
char bat_charge : 1;
char bat_nok : 1;
char sem_bat : 1; //
char incendio : 1;
char sirene_stat : 1;
char open_load : 1;
char falta_rede : 1;
char rede_nok : 1;
} rtc_func;


Código: Selecionar todos
memset(&rtc_func, 0, sizeof(rtc_func) / sizeof(char));


Outra forma é utilizando enum, coloque um variável do tamanho da struct.
Cláudio F
Avatar do usuário
cfreund
Word
 
Mensagens: 672
Registrado em: 14 Out 2006 14:02
Localização: São Paulo

Re: Salvar na Flash + CW10 + display 2x16

Mensagempor cfreund » 17 Set 2018 17:54

egipts escreveu:Por fim, não consegui ler o FIFO do ADC. Não é somente executar n leituras repetidas, de acordo com o tamanho escolhido? Estou usando 8b de resolução..


https://www.nxp.com/docs/en/application-note/AN4587.pdf
Editado pela última vez por cfreund em 17 Set 2018 18:04, em um total de 1 vez.
Cláudio F
Avatar do usuário
cfreund
Word
 
Mensagens: 672
Registrado em: 14 Out 2006 14:02
Localização: São Paulo

Re: Salvar na Flash + CW10 + display 2x16

Mensagempor cfreund » 17 Set 2018 18:01

egipts escreveu:Outra dúvida é de com configuro o NV_FPROT, coloquei apenas " NV_FPROT = 0b00111000 " e não funcionou...


Página 86 @ https://www.nxp.com/docs/en/reference-m ... _Rev.1.pdf

"During the reset
sequence, the FPROT register is loaded with the contents of the flash protection byte in
the flash configuration field at global address 0xFF7C in flash memory. "

Exemplo está no rodapé da página 13: https://www.nxp.com/docs/en/application-note/AN4570.pdf
Cláudio F
Avatar do usuário
cfreund
Word
 
Mensagens: 672
Registrado em: 14 Out 2006 14:02
Localização: São Paulo

Re: Salvar na Flash + CW10 + display 2x16

Mensagempor egipts » 17 Set 2018 18:59

cfreund escreveu:
egipts escreveu:const unsigned char txtL01[16] @0x8000 = " INCENDIO L01 ";

O compilador dá a seguinte mensagem de exclamação:

C3401 Resulting String is not zero terminated


A string tem 16 caracteres, logo o array deve ser definido para 17 caracteres.

Deixe isso por conta do compilador:

Código: Selecionar todos
const unsigned char txtL01[] @0x8000 = "  INCENDIO L01  "; 



egipts escreveu:Consegui corrigir a falha que dá na execução mudando pouca coisa no programa (usei o exemplo do livro do Fabio Pereira - HCS08 Unleashed - p. 356):

void LCD_write_string (char *c)


O erro está na string, não na função. Corrija o tamanho para acomodar o NULL no final da string e faça:

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



Você acertou na mosca: são 17 bytes... Mas como eu não sabia e havia deixado espaço menor entre os arrays(16), o compilador dava erro na hora de gravar..
const unsigned char txtL01[] @0x8000 = " INCENDIO L01 ";
const unsigned char txtL02[] @0x8010 = " INCENDIO L02 ";
const unsigned char txtL03[] @0x8020 = " INCENDIO L03 ";
...
Sendo o correto:
const unsigned char txtL01[] @0x8000 = " INCENDIO L01 "; // ARRAY COM 17 BYTES
const unsigned char txtL02[] @0x8011 = " INCENDIO L02 ";
const unsigned char txtL03[] @0x8022 = " INCENDIO L03 ";

Dessa forma a função LCD_write_string funcionou perfeitamente...

Muito obrigado!!!

Vou verificar as demais respostas... Grato.
egipts
Byte
 
Mensagens: 318
Registrado em: 22 Out 2006 01:43
Localização: Mairiporã - SP

Re: Salvar na Flash + CW10 + display 2x16

Mensagempor egipts » 17 Set 2018 19:39

cfreund escreveu:
egipts escreveu:Por fim, não consegui ler o FIFO do ADC. Não é somente executar n leituras repetidas, de acordo com o tamanho escolhido? Estou usando 8b de resolução..


https://www.nxp.com/docs/en/application-note/AN4587.pdf


Vou analisar...
Eu estava seguindo pelo AN4347... mas ainda estou confuso
na página 56 dele tem a sentença a seguir, que pelo que entendi ela lê o ADC_R até limpar o flag FEMPTY, correto?

while( !ADC_SC2_FEMPTY )
{
uiADC_Result[ucCount++] = ADC_R;
}

O resultado é o total das somas e não a média, correto?
egipts
Byte
 
Mensagens: 318
Registrado em: 22 Out 2006 01:43
Localização: Mairiporã - SP

Re: Salvar na Flash + CW10 + display 2x16

Mensagempor cfreund » 17 Set 2018 20:07

egipts escreveu:Eu estava seguindo pelo AN4347... mas ainda estou confuso
na página 56 dele tem a sentença a seguir, que pelo que entendi ela lê o ADC_R até limpar o flag FEMPTY, correto?

while( !ADC_SC2_FEMPTY )
{
uiADC_Result[ucCount++] = ADC_R;
}

O resultado é o total das somas e não a média, correto?


Está sendo salvo todas as leituras no vetor uiADC_Result.

Para média, pode ser feito:
Código: Selecionar todos
int soma, i;

for (soma = 0, i = 0; i < ucCount; ++i)
{
    soma += uiADC_Result[i];
}

media = soma / ucCount;
Cláudio F
Avatar do usuário
cfreund
Word
 
Mensagens: 672
Registrado em: 14 Out 2006 14:02
Localização: São Paulo

Re: Salvar na Flash + CW10 + display 2x16

Mensagempor egipts » 17 Set 2018 20:14

cfreund escreveu:
egipts escreveu:Eu estava seguindo pelo AN4347... mas ainda estou confuso
na página 56 dele tem a sentença a seguir, que pelo que entendi ela lê o ADC_R até limpar o flag FEMPTY, correto?

while( !ADC_SC2_FEMPTY )
{
uiADC_Result[ucCount++] = ADC_R;
}

O resultado é o total das somas e não a média, correto?


Está sendo salvo todas as leituras no vetor uiADC_Result.

Para média, pode ser feito:
Código: Selecionar todos
int soma, i;

for (soma = 0, i = 0; i < ucCount; ++i)
{
    soma += uiADC_Result[i];
}

media = soma / ucCount;


Obrigado!
É bem melhor dessa forma, pois assim não é necessário alterar a função quando se altera o tamanho do FIFO...
egipts
Byte
 
Mensagens: 318
Registrado em: 22 Out 2006 01:43
Localização: Mairiporã - SP

Re: Salvar na Flash + CW10 + display 2x16

Mensagempor egipts » 17 Set 2018 20:15

cfreund escreveu:
egipts escreveu:Outra dúvida é de com configuro o NV_FPROT, coloquei apenas " NV_FPROT = 0b00111000 " e não funcionou...


Página 86 @ https://www.nxp.com/docs/en/reference-m ... _Rev.1.pdf

"During the reset
sequence, the FPROT register is loaded with the contents of the flash protection byte in
the flash configuration field at global address 0xFF7C in flash memory. "

Exemplo está no rodapé da página 13: https://www.nxp.com/docs/en/application-note/AN4570.pdf


Obrigado!
Ficou assim:
const byte flash_security_FSEC @0xFF7F = 0x01000001; // NV_FSEC
//const byte flash_security_FOPT @0xFF7E = 0x; // NV_FOPT
const byte flash_security_FPROT @0xFF7C = 0b00111000; // NV_FPROT
const byte flash_security_EEPROT @0xFF7D = 0b10000000; // NV_EEPROT

Só um detalhe a salientar, no MC9S08PA60RM_Rev.1.pdf ele se refere como NVM_FPROT mas o correto, conforme mc9s08pa32.h, é NV_FPROT (sem o M em todos eles).

Usando esta configuração (0b00111000) no FPROT eu fico com 1k liberado na Flash (0x8000-8400), correto? [ Scenario 2, p. 87 do MC9S08PA60RM_Rev.1.pdf ]

Grato.
egipts
Byte
 
Mensagens: 318
Registrado em: 22 Out 2006 01:43
Localização: Mairiporã - SP

Re: Salvar na Flash + CW10 + display 2x16

Mensagempor egipts » 17 Set 2018 20:23

egipts escreveu:
cfreund escreveu:
egipts escreveu:const unsigned char txtL01[16] @0x8000 = " INCENDIO L01 ";

O compilador dá a seguinte mensagem de exclamação:

C3401 Resulting String is not zero terminated


A string tem 16 caracteres, logo o array deve ser definido para 17 caracteres.

Deixe isso por conta do compilador:

Código: Selecionar todos
const unsigned char txtL01[] @0x8000 = "  INCENDIO L01  "; 



egipts escreveu:Consegui corrigir a falha que dá na execução mudando pouca coisa no programa (usei o exemplo do livro do Fabio Pereira - HCS08 Unleashed - p. 356):

void LCD_write_string (char *c)


O erro está na string, não na função. Corrija o tamanho para acomodar o NULL no final da string e faça:

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



Você acertou na mosca: são 17 bytes... Mas como eu não sabia e havia deixado espaço menor entre os arrays(16), o compilador dava erro na hora de gravar..
const unsigned char txtL01[] @0x8000 = " INCENDIO L01 ";
const unsigned char txtL02[] @0x8010 = " INCENDIO L02 ";
const unsigned char txtL03[] @0x8020 = " INCENDIO L03 ";
...
Sendo o correto:
const unsigned char txtL01[] @0x8000 = " INCENDIO L01 "; // ARRAY COM 17 BYTES
const unsigned char txtL02[] @0x8011 = " INCENDIO L02 ";
const unsigned char txtL03[] @0x8022 = " INCENDIO L03 ";

Dessa forma a função LCD_write_string funcionou perfeitamente...

Muito obrigado!!!

Vou verificar as demais respostas... Grato.


O alerta na definição das variáveis sumiu, mas o da LCD_write_string continua (mas funciona... rs):
C1825 Indirection to different types ('const unsigned char *' insted of 'unsigned char *')

Tenho que montar outra LCD_write_string com outra configuração de parâmetro (const)?

Grato.
egipts
Byte
 
Mensagens: 318
Registrado em: 22 Out 2006 01:43
Localização: Mairiporã - SP

Re: Salvar na Flash + CW10 + display 2x16

Mensagempor egipts » 17 Set 2018 20:28

cfreund escreveu:
A string tem 16 caracteres, logo o array deve ser definido para 17 caracteres.

Deixe isso por conta do compilador:

Código: Selecionar todos
const unsigned char txtL01[] [color=#FF0000][b]@0x8000[/b] [/color]= "  INCENDIO L01  "; 




Como faço para que o compilador calcule o espaço entre as variáveis sozinho?
const unsigned char txtL02[] @0x8011 = " INCENDIO L02 ";
const unsigned char txtL03[] @0x8022 = " INCENDIO L03 ";
const unsigned char txtL04[] @0x8033 = " INCENDIO L04 ";
const unsigned char txtL05[] @0x8044 = " INCENDIO L05 ";
egipts
Byte
 
Mensagens: 318
Registrado em: 22 Out 2006 01:43
Localização: Mairiporã - SP

Re: Salvar na Flash + CW10 + display 2x16

Mensagempor cfreund » 17 Set 2018 20:29

egipts escreveu:O alerta na definição das variáveis sumiu, mas o da LCD_write_string continua (mas funciona... rs):
C1825 Indirection to different types ('const unsigned char *' insted of 'unsigned char *')

Tenho que montar outra LCD_write_string com outra configuração de parâmetro (const)?

Grato.


Sim: void LCD_write_string (const char *c)
Cláudio F
Avatar do usuário
cfreund
Word
 
Mensagens: 672
Registrado em: 14 Out 2006 14:02
Localização: São Paulo

Re: Salvar na Flash + CW10 + display 2x16

Mensagempor egipts » 17 Set 2018 20:32

cfreund escreveu:
egipts escreveu:OUtra coisa, como faço para limpar uma Struct com esta a seguir, mas sem ser bit a bit? Tem como apagar o byte todo se fazer uma union?

struct rtc_func_ // registrador de configuração das funções do RTC (real time clock)
{
char bat_charge : 1;
char bat_nok : 1;
char sem_bat : 1; //
char incendio : 1;
char sirene_stat : 1;
char open_load : 1;
char falta_rede : 1;
char rede_nok : 1;
} rtc_func;


Código: Selecionar todos
memset(&rtc_func, 0, sizeof(rtc_func) / sizeof(char));


Outra forma é utilizando enum, coloque um variável do tamanho da struct.


Não entendi direito, mas vou pesquisar estes comandos...
Muito obrigado!
egipts
Byte
 
Mensagens: 318
Registrado em: 22 Out 2006 01:43
Localização: Mairiporã - SP

Próximo

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

Quem está online

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

cron

x