Matriz com 288 elementos

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

Matriz com 288 elementos

Mensagempor Mersin » 25 Mar 2007 14:33

Pessoal,

Estou precisando de uma Matriz de [6][48] = 288bytes, mas não consigo fazer com que o CCS aceite isso.

Estou usando o 16F877A em linguagem C.

Alguem poderia me dar alguma idéia de como conseguir isso?

Valeu!
Mersin
Mersin
Byte
 
Mensagens: 121
Registrado em: 22 Out 2006 13:07
Localização: Goiânia

Mensagempor ivan » 25 Mar 2007 14:58

Assim serve?

Código: Selecionar todos
int matriz[] = {"aqui entram os 48 bytes",..., "repete 48 bytes 6(seis) vêzes"};
int elem, *ptr = &matriz;

for(i=0;i<6;i++)
   for(j=0;j<48;j++)
     elem = *(ptr+i+j);          //visita o elemento matriz[i][j]
     *(ptr+i+j) = newConteudo;   //atualiza o elemento matriz[i][j]
   }
}


OBS: A inicialização de matriz está em PSEUDO-C, OK?
"A mente que se abre a uma nova idéia jamais volta ao seu tamanho original." (Albert Einstein).
Avatar do usuário
ivan
Word
 
Mensagens: 618
Registrado em: 12 Out 2006 21:27

Mensagempor Mersin » 25 Mar 2007 15:23

Pois é Ivan,

Deu não.... :(

vem a mensagem de erro: "Not enough RAM for all variables"

mas não sei por que se pelos cálculos, serão gastos apenas 288bytes dos 368 de RAM (General Purpose Registers)...?

Como será possível eu armazenar meus 288bytes?
Mersin
Mersin
Byte
 
Mensagens: 121
Registrado em: 22 Out 2006 13:07
Localização: Goiânia

Mensagempor ivan » 25 Mar 2007 16:12

É, 288 bytes de espaço ocupado só pela matriz. E as variáveis do restante do seu pgm?
Código: Selecionar todos
  368(total RAM)
- 288(matriz)
--------------------
 = 60 bytes(para outras variáveis)


O seu prob não é limitação do C, como pensei inicialmente, e sim do espaço ocupado por todas as suas variáveis de um pgm em C. Bem, que tal uma memória externa?
"A mente que se abre a uma nova idéia jamais volta ao seu tamanho original." (Albert Einstein).
Avatar do usuário
ivan
Word
 
Mensagens: 618
Registrado em: 12 Out 2006 21:27

Mensagempor Mersin » 25 Mar 2007 17:02

Mas aí é que tá a dúvida,

Fora os 288 bytes, só ocupo mais uns 20 bytes para as outras variáveis, mesmo assim não estou conseguindo essa memória...?

Estou tentando usar o #reserve no Banco 0, 2 e 3 (96 bytes cada), mas tá dando erro para o banco 0.

Ainda estou na tentativa...
Mersin
Mersin
Byte
 
Mensagens: 121
Registrado em: 22 Out 2006 13:07
Localização: Goiânia

Mensagempor ivan » 25 Mar 2007 17:52

A principio, coloca o trecho de código em q vc declara todas as suas variáveis, inclusive a matriz[288]. Só por desencargo de consciência.
Editado pela última vez por ivan em 25 Mar 2007 18:13, em um total de 1 vez.
"A mente que se abre a uma nova idéia jamais volta ao seu tamanho original." (Albert Einstein).
Avatar do usuário
ivan
Word
 
Mensagens: 618
Registrado em: 12 Out 2006 21:27

Mensagempor Mersin » 25 Mar 2007 18:08

Ivan,

Resumindo: Preciso criar um sistema com +/-300 bytes de dados em variáveis, dentre as quais existe uma com 288 bytes (o que pretendia eu colocar dentro de uma matriz 6x48, que seria o ideal), porém o CCS não está conseguindo me dar essa matriz.

Olhando o mapa de memória do 16F877A, vejo que no banco 0 existem 96 bytes disponíveis + 80 no banco 1 + 96 no Banco 2 + 96 Banco3. Escolhi então reservar os 96 dos bancos 0, 2 e 3 que me dariam um total de 288bytes conforme preciso e planejo jogar minhas outras variáveis para o banco 1.

Só não estou conseguindo fazer isso, pois quando tento reservar os bancos conforme abaixo, recebo uma mensagem de que o banco 0 já está sendo utilizado pelo compilador para as outras variáveis:

#reserve 0x20:0x7a -> Não está aceitando
#reserve 0x110:0x16f -> Aceita OK
#reserve 0x190:0x1ef -> Aceita OK

Como posso "Configurar" o CCS que utilize as outras variáveis somente no banco 1?

Outra solução seria tentar utilizar uma RAM externa, mas acho um grande e grande disperdício já que tenho esses bytes na RAM interna e com muito mais rapidez.

Alguem já passou por isso?
Mersin
Mersin
Byte
 
Mensagens: 121
Registrado em: 22 Out 2006 13:07
Localização: Goiânia

Mensagempor Fábio Pereira » 25 Mar 2007 21:05

Olá Mersin,

Acho que você não vai conseguir o que deseja.

Se você estudar a arquitetura do PIC em questão verá que os últimos 16 endereços de cada banco de memória são espelhados entre si, ou seja, são comuns a todos os bancos. O compilador normalmente irá utilizá-los para armazenar parâmetros de funções e variáveis globais.

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 Mersin » 26 Mar 2007 00:15

É Fábio,

Também estou com essa impressão, mas até então eu consegui o que queria dividindo minha matriz [6][48] em tres matrizes [6][16] e as coloquei conforme abaixo:

static int Mtrz1[6][16];
#locate DsplTela1=0xa0 // Banco 1

static int Mtrz2[6][16];
#locate DsplTela2=0x110 // Banco 2

static int Mtrz3[6][16];
#locate DsplTela3=0x190 // Banco 3

Dessa forma, confirmei que o CCS colocou as outras variáveis a partir do endereço 0x28 (Banco 0) e parece estar tudo bem até agora, vamos ver amanhã quando eu ir mais adiante...

Se não der, terei que partir para a solução da memória RAM externa tipo 62xxx da vida...

Muito obrigado!
Mersin
Mersin
Byte
 
Mensagens: 121
Registrado em: 22 Out 2006 13:07
Localização: Goiânia

Mensagempor Mersin » 26 Mar 2007 00:24

ah, mais uma coisa,

Realmente confirmei que o mC espelha os últimos 16 bytes dos bancos 1, 2 e 3, onde no MAPA de memória no Datasheet está denominado área "accesses" (na verdade não sei ao certo o que quer dizer accesses...

o Fato é que só precisei utilizar essa área no banco 1 e nas demais eu não utilizo para nada, então, acho eu, que se o CCS não mudar nada sozinho nessa área, eu então consegui o que queria!

Voi confirmar amanhã no decorrer do desenvolvimento...

Inté!
Mersin
Mersin
Byte
 
Mensagens: 121
Registrado em: 22 Out 2006 13:07
Localização: Goiânia

Mensagempor proex » 26 Mar 2007 11:20

Mersin, talvez vc escolheu o chip errado para sua aplicaçao.

Que tal experimentar o PIC18F44J10, ele tem 16K de programa e 1024 de dados. Possui os mesmos periféricos que o 877 com a vantagem de nao ter paginaçao de memoria e custar u$1.18 FOB.
proex
Dword
 
Mensagens: 2101
Registrado em: 11 Out 2006 14:05
Localização: São Paulo

Mensagempor Fábio Pereira » 26 Mar 2007 20:26

Proex,

Onde é que você fez esta cotação do PIC ?

No site da Microchip o mais barato que eu encontrei foi US$ 1,73 para quantidades acima de 10000 peças ...

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 Ander_sil » 27 Mar 2007 14:11

O problema é por causa da paginação da linha 16F, como você sabe tem 4 bancos de 96bytes. Mas quando você cria uma matriz no "C" o compilador vai alocar a memoria sequencialmente e não pode quebrar a matriz parte em um banco e outra parte em outro banco, por isso acontece esse problema.
O correto é partir para linha 18F que não tem esse problema, mesmo que você consiga fazer no 16F, mas vai ficar no limite com poucas possibilidades de updates no futuro.

at.
Anderson Chrispim da Silva
chrispimdasilva@gmail.com
Ander_sil
Byte
 
Mensagens: 368
Registrado em: 30 Out 2006 09:58
Localização: Campinas - SP

Mensagempor proex » 29 Mar 2007 15:05

Olá Fabio, seu preço esta correto. Eu que havia me enganado nos centavos.

O 877 custa 3.71 FOB e o 44J10, 1,73.

Veja que em qualquer quantidade que vc compare os preços, havera uma considerável diferença.

Para quantidades de 500 peças, vc consegue comprar o 44j10 aqui no Brasil por U$3,50 aproximadamente enquanto o 877 custará u$7,50.
proex
Dword
 
Mensagens: 2101
Registrado em: 11 Out 2006 14:05
Localização: São Paulo

Mensagempor Mersin » 31 Mar 2007 08:38

Amigos,

Resumindo a conversa até agora, ficou o seguinte:

1) Realmente para se criar uma matriz o CCS tenta alocar posições sequanciais na memória RAM, ou seja, os elementos de uma mesma matriz tem que estar em sequência dentro de um bloco contínuo de bytes;

2) Bom, a minha aplicação, possibilitou a divisão da matriz de 288 elementos em outras 4 matrizes, sendo uma utilizando os 96 bytes do banco 2, outra os 96 do banco 3, e outras duas contendo 48 bytes que ficam respectivamente no bloco 0 e 1; Dessa forma resolvi o meu problema.

3) Quanto à área de memória denominada "accesses memory" equivalentes aos 16 últimos bytes dos bancos 1, 2 e 3, realmente não garantem integridade dos dados colocados lá, pois representa uma espécie de "lixo" para muita coisa que o mC faz, tipo, o comando setup_timer por exemplo, utiliza uma ou duas posições dessa parte, já outras funções, utilizam outros desses bytes, de maneira que se colocarmos algum dado lá, devemos saber que este poderá ser mudado a qualquer momento.

Em fim, graças à fragmentação de minha matriz, não precisei de trocar de mC ou mesmo de utilizar RAM externa, agradeço a TODOS os que me ajudaram nesse tópico... e aqui deixo minha mensagem,,,

"não desanimem não!!!! tem que ter fé!!!"

Abraços!
Mersin
Mersin
Byte
 
Mensagens: 121
Registrado em: 22 Out 2006 13:07
Localização: Goiânia

Próximo

Voltar para PIC

Quem está online

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

x