Página 1 de 2
Matriz com 288 elementos

Enviado:
25 Mar 2007 14:33
por Mersin
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!

Enviado:
25 Mar 2007 14:58
por ivan
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?

Enviado:
25 Mar 2007 15:23
por Mersin
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?

Enviado:
25 Mar 2007 16:12
por ivan
É, 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?

Enviado:
25 Mar 2007 17:02
por Mersin
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...

Enviado:
25 Mar 2007 17:52
por ivan
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.

Enviado:
25 Mar 2007 18:08
por Mersin
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?

Enviado:
25 Mar 2007 21:05
por Fábio Pereira
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é +

Enviado:
26 Mar 2007 00:15
por Mersin
É 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!

Enviado:
26 Mar 2007 00:24
por Mersin
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é!

Enviado:
26 Mar 2007 11:20
por proex
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.

Enviado:
26 Mar 2007 20:26
por Fábio Pereira
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+

Enviado:
27 Mar 2007 14:11
por Ander_sil
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.

Enviado:
29 Mar 2007 15:05
por proex
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.

Enviado:
31 Mar 2007 08:38
por Mersin
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!