passando valores a função por referência

Enviado:
18 Out 2006 09:45
por drauto
Buenas, tenho tentado, sem sucesso, passar um ponteiro para uma matriz de clarada da seguinte forma:
byte const mensagem [5]={
0B0000000,
0B0000000,
0B0000000,
0B0000000,
0B0000000,
0B0000000};
minha função é assim;
mostra(byte *P)
{...}
e chamo assim
mostra(mensagem);
Acho que está tudo ok, pois tirando o "const" da matriz funciona, só que daí usa a ram, como faço para mandar um ponteiro para uma posição da memória de programa?
desde já grato.
drauto

Enviado:
18 Out 2006 09:51
por Fábio Pereira
Aí é que está o problema: nos PICs, existe muita diferença entre se armazenar dados na FLASH ou na RAM.
Para armazenar dados na FLASH, só utilizando tabelas com instruções RETLW (nos PICs da série 16).
Por isso, quando uma matriz é definida como CONST (e portanto armazenada na FLASH) o acesso a mesma é feito de forma bastante diferente e a passagem por referência não funciona.
Você poderia declarar a matriz como global e somente passar o índice do elemento que deseja acessar.
Até +

Enviado:
18 Out 2006 10:07
por KrafT
Não há problema algum em usar:
- Código: Selecionar todos
x=mensagem [ponteiro];
mostra(x);
Eu uso tabelas de 512 entradas como const e acesso como dito acima sem problema algum.

Enviado:
18 Out 2006 10:08
por Fábio Pereira
Exato,
Mas aí também não é passagem por referência ...
Até +

Enviado:
18 Out 2006 11:34
por Visitante
Obrigado Fábio e Kraft, imaginei que não fosse possível dar o tratamento que eu queria, mas ainda tinha esperanças...
acho que vou fazer como me sugeriste, Kraft.
gracias...
Drauto

Enviado:
18 Out 2006 14:00
por andre_luis
Nao sei se vai ajudar, mas....
Seguinte....Eu uso a seguinte estrutura a seguir, implementada no CCS - para carregar o PWM conforme parametro de entrada :
const unsigned int8 Duty0 [] ={7,15,23,31,38,46,53,61,68,75,82,88,95,101,107,113,118,123,128,133,137,144,147,150,153,155,156,158,159,159,160};
const unsigned int8 Duty1 [] = ...
const unsigned int8 Duty2 [] = ...
...
...
...
const unsigned int8 Duty32 [] = {5,10,15,20,24,29,34,39,43,48,52,57,61,65,69,72,76,79,82,85,88,90,92,95,96,98,99,100,101,102,102,102};
Para eu acessar o valor, faço do seguinte modo :
set_pwm1_duty ( Duty[PWM_counter] ) ;
Creio que a ideia seja a mesma, pois uso também valor de FLASH e nao de RAM.

Enviado:
18 Out 2006 15:31
por drauto
muito grato André, a aplicação é outra, to trabalhando com mensagens para display, mas a idéia é essa mesmo...
valeu...

Enviado:
19 Out 2006 06:59
por a.rairan
O IAR permite ponteiros para a rom... esse seu compilador é o CCS?

Enviado:
19 Out 2006 09:14
por drauto
opa A.Rairan, é o CCS sim, o IAR tem free ?