Página 1 de 1

Tabelas na flash

MensagemEnviado: 03 Jan 2008 08:19
por lafourcade
Alguém sabe como eu faço para determinar o end. de algum dado que eu escrevo na flash usando o hitech?
por exemplo:
unsigned char const teste[4] = {0,1,2,3}; Como eu determino que estes valores vão ser escritos no end. 0x1FFA?
Eu tinha pensado em algo assim:
unsigned char const teste[4] @0x1FFA = {0,1,2,3};
mas o hitech não aceita.
Alguém pode me ajudar?

MensagemEnviado: 03 Jan 2008 08:37
por Maia
Há algum tempo eu fiz coisa parecida assim:

Código: Selecionar todos
unsigned char DADOS @ 0x66;   // Endereço inicial da RAM onde fica armazenada palavra
unsigned char *PP;

// Transf. dados para ram
   PP = &DADOS;
   for (I = 0; I < 0x0a; I++)   // 10 caracteres
   {
     *PP = MENS1[I];
     PP++;
   }


Não sei se é a forma correta de se fazer, mas funcionou.
Abraços,
Maia

MensagemEnviado: 03 Jan 2008 09:11
por fabim
maia. amproveitando o topico, e como nunca precisei usar..

Como e pra que serve ponteiros????

em pascal.
var myvar : ^word;


myvar^ := 5;

tem como você me ispinicar isso? tentei usar pra entender como funciona mais nun entendi.

abraços
fabim

MensagemEnviado: 03 Jan 2008 10:31
por andre_luis
São especialmente úteis quando se trabalha com variáveis de tamnho variável.
Ou quando se deseja executar rotinas, usando o endereço das mesmas como argumento.

+++

MensagemEnviado: 03 Jan 2008 12:07
por lafourcade
e ae, Maia!
Obrigado pela atenção!

Desta forma eu consigo fazer:
unsigned char const DADOS[4] @ 0x1FFA;

O problema é que eu não consigo atribuir valores na criação.
Tipo: unsigned char const DADOS[4] @ 0x1FFA = {0,1,2,3};

para usar como uma tabela, entendeu?

MensagemEnviado: 03 Jan 2008 12:07
por Maia
Dá uma estuda nesse documento:

http://home.netcom.com/~tjensen/ptr/pointers.pdf

Ele é bem explicativo, mas se não ajudar muito fala.
Abraços,
Maia

MensagemEnviado: 03 Jan 2008 12:30
por fabim
vamu ve se eu entendi bem..
Mais em pascal rs.
var b : array[0..9] of byte
j : ^byte;

begin
j := @b(1);
(*o endereço j é o mesmo do meu_array(1), @ é passado como sufixo de endereço e não valor alocado, isso em pascal*)

b[0] := j^;
este procedimento é o memo que eu dizer que
b[0] := b[1];
end;




é isso ?

se for cara, sei não mais só ocupa memória e não presta pra nada.
prefiro
array[0..9] of array[0..9] of byte.
matriz de 100 bytes X é o primeiro sufixo Y e o segundo sufixo.

só essa merdinha de comando aí em cima com ponteiro aumentou em 38bytes o fonte.. cruis credo.. mais bom se for isso mesmo, pelo menos eu aprendi.

abraços
e obrigado pela atenção
fabim

MensagemEnviado: 03 Jan 2008 12:53
por lafourcade
Será que é possivel criar uma tabela na flash com um end conhecido, desta forma?
Tem alguma outra maneira?

MensagemEnviado: 03 Jan 2008 13:08
por fabim
bom tem sim.. inda mais se for pic que le e grava a flash tipo um 16f877 ou a maioria dos 18F.

explique melhor o que voce quer fazer, as vezes a solução é muitissimo mais simples do que voce imagina.

por exemplo em pascal.
const
polinomial : byte[10][2]=((127,118),(261,192).........até a décima casa de 2 bytes.

operação simples pra eu pegar os dois bytes em negrito e colocar em uma var word chamada de TEMP>!
temp := polinomial[2][1];
temp := temp shr(polinomial[2][2])8;

temp agora igual á
MSB 261
LSB 192

tem outras formas tipo usar as funções de read flash e write flsh se precisar de ser rapidinho

fabim

abraços
fabim

MensagemEnviado: 03 Jan 2008 14:22
por lafourcade
Opa!

Na verdade oque eu quero é exatamente isso:
Quando eu trabalhava com o CCS e queria inicializar a eeprom eu escrevia no end 2100h e na compilação inicializava os end da eeprom que eu estava utilizando. Ex:

// set_point senha histerese atuação
#rom 0x2100={ 10,00, 01,02,03,04, 2, 0, 0, 20 }
// end 0, 1, 2, 3, 4, 5, 6, 7, 8, 9

como no hitech a diretiva #rom não existe. Eu pensei em fazer desta maneira:

unsigned char const init_eeprom[4] @ 0x2100 = {1,2,3,4};
porém:

unsigned char const init_eeprom[4] = {1,2,3,4};
isso funciona.
unsigned char const init_eeprom[4] @ 0x2100;
e isso tb.

mas colocar valores nestes end na compilação, desta forma:

unsigned char const init_eeprom[4] @ 0x2100 = {1,2,3,4};
não funciona.

Deve ter alguma maneira de inicializar a eeprom.

Bom, de qualquer forma, outra questão, é como criar uma tabela na flash com um end conhecido.

MensagemEnviado: 03 Jan 2008 14:34
por fabim
no C e pascal da mikroeletronica.
const
bytes_constante : array[0..3] of byte = (20,35,45,55); absolute org $FFF1;

só isso o primeiro byte fica no $FFF1, o segundo no $FFF2.....


procura no qhelp, deve ter alguma coisa em constantes.. como org ou coisa do tipo..

Mais antes de mais nada num sei se esse compilador seu é uma IDE nova, se for a maioria delas tem no tool´s um eeprom mananger ou coida do tipo..

abraços

fabim

MensagemEnviado: 04 Jan 2008 08:45
por Maia
Para colocar dados na EEPROM durante a gravação do PIC veja isso tirado do manual do compilador.

3.2.4.1 EEPROM Access
For those PIC devices that support external programming of their EEPROM data area, the __EEP-
ROM_DATA() macro can be used to place the inital EEPROM data values into the HEX file ready
for programming. The macro is used as follows.
#include <htc.h>
__EEPROM_DATA(0, 1, 2, 3, 4, 5, 6, 7);
The macro accepts eight parameters, being eight data values. Each value should be a byte in size.
Unused values should be specified as a parameter of zero. The macro may be called multiple times
to define the required amount of EEPROM data. It is recommended that the macro be placed outside
any function definitions.
The macro defines, and places the data within, a psect called eeprom_data. This psect is posi-
tioned by a linker option in the usual way.
This macro is not used to write to EEPROM locations during run-time. The macros EEP-
ROM_READ() and EEPROM_WRITE(), and the function versions of these macros, can be called to
read from, and write to, the EEPROM during program execution. For example, to write a byte-size
value to an address in EEPROM memory using the macro version of EEPROM write:


Abraços,
Maia

MensagemEnviado: 04 Jan 2008 09:26
por andre_luis
Só uma dica :

Não é uma boa prática competir com o linker na atribuição de endereços para alocacao de variaveis e/ou constantes.

O melhor a se fazer, é deixar o compilador fazer isso automaticamente ( é mais seguro ) e depois captar o endereço destas variaveis/constantes com o operador ´&´para determinar o endereço a ser apontado .


+++