passando valores a função por referência

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

passando valores a função por referência

Mensagempor drauto » 18 Out 2006 09:45

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
drauto
Bit
 
Mensagens: 15
Registrado em: 13 Out 2006 18:02
Localização: PORTO ALEGRE

Mensagempor Fábio Pereira » 18 Out 2006 09:51

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é +
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 KrafT » 18 Out 2006 10:07

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.
Avatar do usuário
KrafT
Dword
 
Mensagens: 2228
Registrado em: 11 Out 2006 14:15
Localização: Blumenau -SC

Mensagempor Fábio Pereira » 18 Out 2006 10:08

Exato,

Mas aí também não é passagem por referência ...

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 Visitante » 18 Out 2006 11:34

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
Visitante
 

Mensagempor andre_luis » 18 Out 2006 14:00

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.
Avatar do usuário
andre_luis
Dword
 
Mensagens: 5447
Registrado em: 11 Out 2006 18:27
Localização: Brasil - RJ

Mensagempor drauto » 18 Out 2006 15:31

muito grato André, a aplicação é outra, to trabalhando com mensagens para display, mas a idéia é essa mesmo...
valeu...
drauto
Bit
 
Mensagens: 15
Registrado em: 13 Out 2006 18:02
Localização: PORTO ALEGRE

Mensagempor a.rairan » 19 Out 2006 06:59

O IAR permite ponteiros para a rom... esse seu compilador é o CCS?
André "Away" Rairan
a.rairan
Byte
 
Mensagens: 192
Registrado em: 11 Out 2006 18:53
Localização: São Caetano do Sul - SP - Brasil

Mensagempor drauto » 19 Out 2006 09:14

opa A.Rairan, é o CCS sim, o IAR tem free ?
drauto
Bit
 
Mensagens: 15
Registrado em: 13 Out 2006 18:02
Localização: PORTO ALEGRE


Voltar para PIC

Quem está online

Usuários navegando neste fórum: Google [Bot] e 1 visitante

x