Página 1 de 2

Emular EEPROM nos 908Qx em C... (migrado)

MensagemEnviado: 17 Out 2006 16:50
por Fábio Pereira
KrafT
Conselheiro


Brazil
3476 Posts Posted - 13/07/2005 : 22:24:06
--------------------------------------------------------------------------------
Eh phoda achar uma rotina prontinha em C para isso...
Na Freescale tem em asm aos montes...

Baixei 4,44 mega de Freegeek e tambem era em asm... Pqp será que vou ter que deixar a preguiça de lado e fazer eu mesmo?

Ao final de tudo, todas as respostas. Ou, de nada, cessarão todas as perguntas.


budzinski
Professor


Brazil
302 Posts Posted - 14/07/2005 : 07:48:37
--------------------------------------------------------------------------------
Não serve o AN2504?

Ou vc quer gravar/apagar byte a byte?


Vicente


Edited by - budzinski on 14/07/2005 07:48:55

KrafT
Conselheiro


Brazil
3476 Posts Posted - 14/07/2005 : 08:08:36
--------------------------------------------------------------------------------
Meu faz um tempão que tou atras disso e não achava...
Vasculhei o site de Freescale todo...

É do tipo da coisa que tá na tua mão e vc não acha...

Aí como tentativa desesperada eu criei esse tópico... Pq não o fiz logo? hehe....

Valeu Bud!!! Obrigado mesmo!!!

Ao final de tudo, todas as respostas. Ou, de nada, cessarão todas as perguntas.


budzinski
Professor


Brazil
302 Posts Posted - 14/07/2005 : 08:53:00
--------------------------------------------------------------------------------


De nada !!!


Neste AN tem um monte coisas que dá para tirar fora. Pois o camarada pega os dados da serial e grava flash, depois verifica, etc.

Eu utilizo somente as seguintes rotinas nos QT´s: ErasePage, ProgramRange e ReadRange!

É isso Ai!

Vicente Budzinski


KrafT
Conselheiro


Brazil
3476 Posts Posted - 14/07/2005 : 09:18:03
--------------------------------------------------------------------------------
Vc usa "as is" ou fez alguma adaptação?

Para mim tá meio confuso o trem...

Preciso avisar ao CW que não é para alocar dados no meu bloco de EEPROM virtual?

Só quero salvar 1 byte... Com isso nem preciso preservar o antigo...

“Cogito ergo sun” by Descartes.


budzinski
Professor


Brazil
302 Posts Posted - 14/07/2005 : 09:30:33
--------------------------------------------------------------------------------
Segue o modo como eu uso e as devidas rotinas:

/* RAM Constants */
#define RAMSTART 0x80
#define CTRLBYT (*(volatile unsigned char*)(0x88))
#define CPUSPD (*(volatile unsigned char*)(0x89))
#define LADDRH (*(volatile unsigned char*)(0x8A))
#define LADDRL (*(volatile unsigned char*)(0x8B))
#define DATA(X) (*(volatile unsigned char*)(0x8C+X))

/* ROM-resident Routines Constants */
#define GETBYTE() {__asm jsr 0x2800;}
#define RDVRRNG() {__asm jsr 0x2803;}
#define ERARNGE() {__asm jsr 0x2806;}
#define PRGRNGE() {__asm jsr 0x2809;}
#define DELNUS() {__asm jsr 0x280C;}

/* Frequency of operation */
#define OSC 13

volatile unsigned int FAddr=0; //variavel global para indicar o endereço.

void main()
{
.
.
.
.
// Apagar uma pagina
FAddr=0xEC00; // inicio da pagina a ser apagada
ErasePage(&FAddr); // apaga 64 bytes...

// Ler byte(s)
FAddr=0xEC00; // primeiro byte a ser lido
ReadRange(&FAddr,4); // 4==ler endereços EC00,EC01,EC02 e EC03.

// Gravar byte(s)
FAddr=0xEC00; // primeiro byte a ser gravado
DATA(0)=1; // primeito byte a ser gravado
DATA(1)=2; // segundo byte a ser gravado
ProgramRange(&FAddr,2); // grava dois bytes na Flash EC00=1 e EC01=2!
.
.
.
.
.
}



/*
** ===================================================================
** Programa bytes na memória flash
** ===================================================================
*/
ProgramRange(unsigned int *_ini,unsigned char _num)
{
unsigned int _first;

_first=*_ini;
CPUSPD=OSC; // Set Clock Bus Operation speed.
// Define Last Address High & Low
LADDRH=((_first+_num-1) & 0xFF00) >> 8;
LADDRL=((_first+_num-1) & 0x00FF);
__asm ldhx _first; // Define first address.
PRGRNGE(); // Call ROM-resident routine.
}

/*
** ===================================================================
** Apaga uma página (64 bytes) da memória flash
** ===================================================================
*/
ErasePage (unsigned int *_page)
{
unsigned int _address;

_address=*_page;
CPUSPD=OSC;
CTRLBYT&=0xBF;
__asm ldhx _address;
ERARNGE();
}

/*
** ===================================================================
** Lê bytes da memória flash
** ===================================================================
*/
ReadRange(unsigned int *_ini,unsigned char _num)
{
unsigned int _first;

_first=*_ini;
// Define Last Address High & Low
LADDRH=((_first+_num-1) & 0xFF00)>>8;
LADDRL=((_first+_num-1) & 0x00FF);

__asm ldhx _first; // Define first address.
__asm lda #0x01; // Config RDVRRNG() to store in RAM.
RDVRRNG(); // Call ROM-resident routine.
}

Detalhes:
1 - Lembrando que a gravação trata-se de um AND ou seja, se o bit existente na flash for 1 pode-se gravar em cima sem apagar. Caso for 0 tem que apagar a página inteira 64 bytes.

2 - O Retorno da Rotina ReadRange é no DATA(X), ou seja,
(DATA(0),DATA(1),DATA(2)), etc.

3 - O Parametro (dado a ser gravado) da Rotina ProgramRange também é no DATA(X)


É isso Aí !

Vicente Budzinski



Edited by - budzinski on 14/07/2005 09:34:00

KrafT
Conselheiro


Brazil
3476 Posts Posted - 15/07/2005 : 00:18:29
--------------------------------------------------------------------------------
Vicente, vc costuma informar ao compilador para nao alocar nada no segmento? Para evitar de corromper o próprio programa se ele acabar invadindo a Flash que vai ser usada pra EEPROM...

Se sim, como faz isso no CW?

Ou vc olha o quanto tem de espaco depois da compilacao e ajusta a página na mão?

Mais uma vez brigadú!


“Cogito, ergo sum” by Descartes.


Edited by - kraft on 15/07/2005 00:22:12

budzinski
Professor


Brazil
302 Posts Posted - 15/07/2005 : 09:51:51
--------------------------------------------------------------------------------
O ideal é voce deslocar o inicio do programa para baixo no arquivo PRM.

Exemplo no QT4: Se voce for utilizar no máximo uma página (64 bytes) para dados e o resto para programa, como a flash neste micro começa no endereço EE00, no arquivo PRM voce coloca: ROM = READ_ONLY 0xEE40 TO 0xFDFF, ou seja, o programa vai começar a partir do endereço 0xEE40 em vez de 0xEE00.

Outro detalhe que não pode passar despercebido é a proteção da flash contra escrita! verifique o valor a ser gravado para que proteja somente a area de programa e deixa a sua pagina de dados livre.

É Isso Aí!



Edited by - budzinski on 15/07/2005 09:53:18

KrafT
Conselheiro


Brazil
3476 Posts Posted - 16/07/2005 : 01:01:44
--------------------------------------------------------------------------------
Eu sou muito pitoco mesmo... O CW dá o seguinte erro:

Error : C18700: Unknown Opcode Operand Combination: Opc.:LD/Dest.:HX/Source:SP8.
Error : C18701: Unknown Opcode 64


Nas linhas com __asm ldhx _first;


“Cogito, ergo sum” by Descartes.


001
Aspirante


Brazil
141 Posts Posted - 17/07/2005 : 23:18:53
--------------------------------------------------------------------------------
Essa AN é bem interessante, mas eu achei mais fácil fazer direto.

Veja se está claro:


//Variaveis globaisbyte CTRLBYTE @0x88;byte CPUSPD @0x89;unsigned int LSTADDR @0x8A;//variaveis que serao salvas na flashbyte var1 @0x8C;byte var2 @0x8D;//...continua de acordo com a necessidadevoid WriteBytes(){ __asm LDHX #$EE00; //Eu sempre uso a primeira página __asm JSR $2809; //CHAMADA DA FUNÇÃO }void ErasePage(){ CTRLBYTE=0; __asm LDHX #$EE00; __asm JSR $2806;}byte ReadBytes() { __asm LDHX #$EE00; //Eu sempre uso a primeira página __asm LDA #$01; __asm JSR $2803; __asm BCS carry_is_set; return 0; __asm carry_is_set: return 1; }void main(){... LSTADDR=0xEE01; //End final (inicio + n_variaveis - 1 ) //Neste caso 2 posições CPUSPD=20; //Vel cpu, 20mhz neste caso...//Exemplo apenas var1=0x10; var2=0x20; WriteBytes(); if(ReadBytes()) //dados conferem else //dados diferentes}

Lembre-se de deslocar o inicio do programa para 0xEE40;
Antes de regravar, é necessário apagar a página;


Att,


Pedro




KrafT
Conselheiro


Brazil
3476 Posts Posted - 17/07/2005 : 23:45:03
--------------------------------------------------------------------------------
Olha, não é que funcionou de primeira, 001?
Parabéns, primeiro post e superou em 100% minhas expectativas! Afinal, eu só vou salvar um byte...

Eu apanho um pouco dessas coisas de baixo nível pq só programo esses caras em C. Acho o assembler e o hadware tão esquisitos que se tivesse que aprende-los (100%), ficaria só com os PIC...

Obrigado também ao Budzinski, um dia vou entender tanto de Freescale como vc...


“Cogito, ergo sum” by Descartes.


Mrbica
Aspirante


Brazil
193 Posts Posted - 18/07/2005 : 17:16:15
--------------------------------------------------------------------------------
Kraft esse seu post foi muito bom, pois eu estava preterindo os freescale por conta de estar encontrando dificuldades em emular eeprom,

Parebéns ao Pedro (001) e grato ao Budzinski, pela força.

Epero estar postando coisas novas por aqui tbm.

[]s


Marcos Bica
mectronica UNESP
mrbica@gmail.com

KrafT
Conselheiro


Brazil
3476 Posts Posted - 23/07/2005 : 21:08:31
--------------------------------------------------------------------------------
Cá entre nós, não entendí esse 001...

Será uma intervenção divina? Será um de nós disfarçado?

Tou intrigado...

“Cogito, ergo sum” by Descartes.


001
Aspirante


Brazil
141 Posts Posted - 23/07/2005 : 22:12:10
--------------------------------------------------------------------------------
Sou tímido, ok?

mas sempre estou por aqui...

Att,

Pedro.

--->Sim, eu posso ajudar, mas se você quiser prontinho eu tenho para vender!

FENIX3
Professor


Brazil
466 Posts Posted - 24/07/2005 : 04:40:28
--------------------------------------------------------------------------------
Acho que ja sei quem he esse 001....

Att,

Muito bom....

Luis Fenix

Freescale developer

PD
Professor


Brazil
286 Posts Posted - 04/03/2006 : 08:40:44
--------------------------------------------------------------------------------

quote:
--------------------------------------------------------------------------------

Essa AN é bem interessante, mas eu achei mais fácil fazer direto.

Veja se está claro:


//Variaveis globaisbyte CTRLBYTE @0x88;byte CPUSPD @0x89;unsigned int LSTADDR @0x8A;//variaveis que serao salvas na flashbyte var1 @0x8C;byte var2 @0x8D;//...continua de acordo com a necessidadevoid WriteBytes(){ __asm LDHX #$EE00; //Eu sempre uso a primeira página __asm JSR $2809; //CHAMADA DA FUNÇÃO }void ErasePage(){ CTRLBYTE=0; __asm LDHX #$EE00; __asm JSR $2806;}byte ReadBytes() { __asm LDHX #$EE00; //Eu sempre uso a primeira página __asm LDA #$01; __asm JSR $2803; __asm BCS carry_is_set; return 0; __asm carry_is_set: return 1; }void main(){... LSTADDR=0xEE01; //End final (inicio + n_variaveis - 1 ) //Neste caso 2 posições CPUSPD=20; //Vel cpu, 20mhz neste caso...//Exemplo apenas var1=0x10; var2=0x20; WriteBytes(); if(ReadBytes()) //dados conferem else //dados diferentes}

Lembre-se de deslocar o inicio do programa para 0xEE40;
Antes de regravar, é necessário apagar a página;


Att,


Pedro



--------------------------------------------------------------------------------



Pedro ou outro colega que possa me ajudar,

Você sabe me dizer se essa sua rotina funciona para os micros da 908Gx, como GT32 por exemplo, é que estou para iniciar um projeto com ele e seria de grande ajuda se vc puder me ajudar...

Até +...
Paulo D.

A persistênica é o caminho do êxito...

FENIX3
Professor


Brazil
466 Posts Posted - 04/03/2006 : 21:06:06
--------------------------------------------------------------------------------
Ola,
esta rotina so funciona para micros com o programa ROM embutido na flash, bastaria alterar os enderecos de chamadas das rotinas da ROM, que eh diferente para cada chip,

Acredito que o GT32 nao tem os programas em ROM para a gravacao da flash, ai voce deve ver o aplication note que ensina a usar a gravacao na flash atraves de um programa que sera carregado na RAM, veja a lista de AN do chip 908GP32, este de baixo ensina...

http://www.freescale.com/files/microcon ... AN2183.pdf


e este mostra a lista dos chips que tem rotinas em ROM...

http://www.freescale.com/webapp/sps/sit ... 4976638055

Boa sorte...


Luis Fenix

Freescale developer

luisdanilocm
Aprendiz


Brazil
81 Posts Posted - 24/04/2006 : 13:53:19
--------------------------------------------------------------------------------
Pedro, e se eu quero que a função retorne o valor que foi gravado, como eu faço?


001
Aspirante


Brazil
141 Posts Posted - 24/04/2006 : 19:18:46
--------------------------------------------------------------------------------

byte ReadBytes() { __asm LDHX #$EE00; //Eu sempre uso a primeira página __asm LDA #$01; __asm JSR $2803; __asm BCS carry_is_set; return 0; __asm carry_is_set: return 1; }

Essa função vai copiar os dados da flash, neste caso a partir do endereço 0xEE00 para a RAM a partir do end 0x8C. Teste o código como está no post que com certeza funciona.

Lembre-se que estou falando do 908Q...




luisdanilocm
Aprendiz


Brazil
81 Posts Posted - 25/04/2006 : 08:44:25
--------------------------------------------------------------------------------
Pedro, o meu código ta igualzinho a esse seu. Olha, quando simulo no CodeWarrior ele grava e tal, mas quando ligo direto na placa, nada...
Se eu simular até no CodeWarrior até a gravação, e depois pôr o chip na placa, o valor gravado é retornado na função; mas se for desde o início na placa, não funciona. Será que é meu modo de ler as posições gravadas? Olha aí:

for(contador = 50;contador>0;contador--) //mostra o valor da variável no display após ligar o chip
{
decodifica_digito(adr_fecha_valvula);
mostra_display();
}

ErasePage();//apaga página

adr_fecha_valvula = 146; //variável alocada em 0x8C
WriteBytes();//escreve

delay_ms(200);//aguarda 200 mili-segundos

ReadBytes(); agora lê de volta

for(contador = 50;contador>0;contador--)// e mostra o valor gravado
{
decodifica_digito(adr_fecha_valvula);
mostra_display();
}

Pra mostrar, ele sempre retorna 255...


luisdanilocm
Aprendiz


Brazil
81 Posts Posted - 25/04/2006 : 15:32:40
--------------------------------------------------------------------------------
E se meu clock é externo, de 4MHz, devo configurar a CPUSPD como 4?? ou devo manter com o valor do clock interno (13MHz aprox.)?


luisdanilocm
Aprendiz


Brazil
81 Posts Posted - 26/04/2006 : 14:00:53
--------------------------------------------------------------------------------
Disfarça... a proteção contra gravação na FLASH estava ativada...
Mas, de qualquer forma, agradeço pela atenção e pelos posts.



cinetica
Candidato



17 Posts Posted - 04/05/2006 : 11:27:12
--------------------------------------------------------------------------------
Olá Budzinski!

#define CTRLBYT (*(volatile unsigned char*)(0x88))

Desculpa pela ignorância, mas não conhecia este formato de acessar mapear registrador, pelo menos é o que parece. Você poderia explicá-la?

Desde já agradeço!




luisdanilocm
Aprendiz


Brazil
81 Posts Posted - 05/05/2006 : 11:06:09
--------------------------------------------------------------------------------

quote:
--------------------------------------------------------------------------------

Olá Budzinski!

#define CTRLBYT (*(volatile unsigned char*)(0x88))

Desculpa pela ignorância, mas não conhecia este formato de acessar mapear registrador, pelo menos é o que parece. Você poderia explicá-la?

Desde já agradeço!






--------------------------------------------------------------------------------


Cinetica, não sou o Budzinski, mas é isso mesmo... ali vc acessa o endereço 0x88 com o nome CTRLBYT. Se vc quiser atribuir um valor a tal endereço, é só "CTRLBYT = 0x00" [ou qualquer outro valor que a variável do tipo 'char' comporta, ou seja, de 0 a 255 para esse compilador].



luisdanilocm
Aprendiz


Brazil
81 Posts Posted - 05/05/2006 : 11:07:07
--------------------------------------------------------------------------------
Oooops... para o compilador que eu uso. No PIC [CCS], pra ter um valor de 0 a 255, vc tem q usar 'int', né??


KrafT
Conselheiro


Brazil
3476 Posts Posted - 05/05/2006 : 12:08:46
--------------------------------------------------------------------------------
0 a 255 á "unsigned char" no CW. Ou, por default só "char".


luisdanilocm
Aprendiz


Brazil
81 Posts Posted - 05/05/2006 : 14:35:07
--------------------------------------------------------------------------------
Pois é, Kraft... como no CW não tem diferença entre 'char' e 'unsigned char' eu nem citei o 'unsigned'



gibim
Professor


Brazil
275 Posts Posted - 07/05/2006 : 00:58:37
--------------------------------------------------------------------------------
Recentemente utilizando o processor expert, consegui adicionar um Bean de software que grava, apaga e confere a FLASH, tudo em C. Entao para os amigos... Experimentem criar um novo projeto usando o Processor Expert e olhem as facilidades iniciais que todo projeto precisa.

T+

Jaguar Aeroespacial LTDA
LEIN - Lab. Eng. Inercial

Elano
Candidato


Brazil
10 Posts Posted - 14/07/2006 : 18:27:13
--------------------------------------------------------------------------------

quote:
--------------------------------------------------------------------------------

Essa AN é bem interessante, mas eu achei mais fácil fazer direto.

Veja se está claro:


//Variaveis globaisbyte CTRLBYTE @0x88;byte CPUSPD @0x89;unsigned int LSTADDR @0x8A;//variaveis que serao salvas na flashbyte var1 @0x8C;byte var2 @0x8D;//...continua de acordo com a necessidadevoid WriteBytes(){ __asm LDHX #$EE00; //Eu sempre uso a primeira página __asm JSR $2809; //CHAMADA DA FUNÇÃO }void ErasePage(){ CTRLBYTE=0; __asm LDHX #$EE00; __asm JSR $2806;}byte ReadBytes() { __asm LDHX #$EE00; //Eu sempre uso a primeira página __asm LDA #$01; __asm JSR $2803; __asm BCS carry_is_set; return 0; __asm carry_is_set: return 1; }void main(){... LSTADDR=0xEE01; //End final (inicio + n_variaveis - 1 ) //Neste caso 2 posições CPUSPD=20; //Vel cpu, 20mhz neste caso...//Exemplo apenas var1=0x10; var2=0x20; WriteBytes(); if(ReadBytes()) //dados conferem else //dados diferentes}

Lembre-se de deslocar o inicio do programa para 0xEE40;
Antes de regravar, é necessário apagar a página;


Att,


Pedro






--------------------------------------------------------------------------------


Sr. Pedro(001)...tentei usar esta função mas não estou tendo sucesso, vc poderia passar um exemplo de leitura e escrita na flash no main(). Obrigado.


Edited by - elano on 14/07/2006 18:28:26

luisdanilocm
Aprendiz


Brazil
81 Posts Posted - 28/07/2006 : 15:41:53
--------------------------------------------------------------------------------
Faz igual a do Budzinski que dá certo. Mas você deve desproteger a memória FLASH contra escrita.


Rogerio Brasiliense
Professor


Brazil
418 Posts Posted - 28/07/2006 : 17:56:18
--------------------------------------------------------------------------------
Dá de emular EEPROM nos MC68HC908 ? Tenho 2 JK1.
Ou só nos KT/KY tem esta facilidade.
Obrigado.


Edited by - Rogerio Brasiliense on 29/07/2006 00:32:19

budzinski
Professor


Brazil
302 Posts Posted - 28/07/2006 : 19:01:46
--------------------------------------------------------------------------------
Olá Rogério,

Roda sem problemas no JK1.

Veja abaixo os micros que roda:

(esses eu lembro de cabeça, talvez tenha outros)

MC68HC908GR´s
MC68HC908KX´s
MC68HC908JL´s/JK´s
MC68HC908JB´s
MC68HC908QT´s
MC68HC908QY´s


Att.

Vicente Budzinski


luisdanilocm
Aprendiz


Brazil
81 Posts Posted - 09/08/2006 : 07:51:05
--------------------------------------------------------------------------------
E como faço pra armazenar uma variável de 16 ou 32 bits na FLASH?? a função é praticamente a mesma??


budzinski
Professor


Brazil
302 Posts Posted - 09/08/2006 : 10:47:24
--------------------------------------------------------------------------------
Danilo,

Se for int (16 bits) voce vai ter que colocar em dois char.

Não tem como armazenar direto... O processo e o mesmo...

Até +
Vicente

........

MensagemEnviado: 07 Dez 2006 14:12
por mega.rod
No livro do Fabio Pereira diz o seguinte....

Tais blocos são organizados, formando as seguintes faixas de endereçamento: (Para programação)
$xx00 a $xx1F
$xx20 a $xx3F
$xx40 a $xx5F
$xx60 a $xx7F
$xx80 a $xx9F
$xxA0 a $xxBF
$xxC0 a $xxDF
$xxE0 a $xxFF

Então, cada espacamento deste equivale a 32 Bits que devem ser gravados em blocos, mas onde e como posso definir para que o programa venha a ser gravado por exemplo a partir do endereço $xx20...
Mesmo sabendo que acima ouve uma breve descrição sobre isso, ainda tenho duvidas...onde fica este arquivo PRM para acrescentar "ROM = READ_ONLY 0xEE40 TO 0xFDFF"

$xx20 é igual a 0xEE20
e também
$xx40 é o mesmo que 0xEE40 ??

Obrigado pela atenção prestada e aguardo retorno o mais breve possivel...

MensagemEnviado: 07 Dez 2006 14:38
por ddkks
...programa venha a ser gravado por exemplo a partir do endereço $xx20...
Mesmo sabendo que acima ouve uma breve descrição sobre isso, ainda tenho duvidas...onde fica este arquivo PRM para acrescentar "ROM = READ_ONLY 0xEE40 TO 0xFDFF"


Se vc está usando o CodeWarrior, esse aquivo fica na pasta PRM dentro da pasta do projeto.
Na verdade vc deve deslocar o programa para 0xEE40 (64 Bytes) pois é o menor bloco que pode ser apagado.

MensagemEnviado: 07 Dez 2006 16:16
por Rodrigo_P_A
pessoal, decidi disponibilizar a rotina que eu uso ela funciona bem, está escrita em C, e eu usei com o CodeWarrior

http://www.kitmcu.com.br/files/freescale/QY4_eeprom.c

até +

Pergunta...

MensagemEnviado: 12 Dez 2006 13:46
por mega.rod
Pessual !!

Sabendo que cada pagina de memória contem 64 bytes, logo acima foi citado que para deixar uma pagina logo no inicio em branco para que fosse utilizado como unidade de armazenamento deveria ser alterado o arquivo Project.prm para ROM = READ_ONLY 0xEE40 TO 0xFDFF, então não seria correto iniciar a programa apenas em 0xEE64 ? levando em conta que esta pagina inicia em 0xEE00...

Obrigado pela atenção...
Ass: Rodrigo Trainotti

Erro, não escrevi isso.

MensagemEnviado: 12 Dez 2006 14:46
por Rogerio Brasiliense
Faz igual a do Budzinski que dá certo. Mas você deve desproteger a memória FLASH contra escrita.


Rogerio Brasiliense
Professor


Brazil
418 Posts Posted - 28/07/2006 : 17:56:18
-------------------------------------------------------------------------------------
Eu acho que está havendo algum engano.
É meu nome, mas não sei desproteger memoria.
-------------------------------------------------------------------------------------
Na puchada do site tá vindo algo estranho.

MensagemEnviado: 12 Dez 2006 14:47
por Fábio Pereira
Em hexadecimal como está escrito ... NÃO

T+

MensagemEnviado: 29 Dez 2006 07:51
por Budzinski
Fabio,

Como Assim? Hexa Não?

MensagemEnviado: 29 Dez 2006 08:37
por ddkks
Não sou o Fábio, mas.... ele referiu ao post do Rodrigo que estava confundindo as bases decimais com hexa...

MensagemEnviado: 29 Dez 2006 10:13
por Budzinski
Ok,

Obrigado !!!

MensagemEnviado: 23 Mar 2007 11:02
por DaniloCM
Agora é o seguinte:
Preciso guardar um valor de 16 bits na FLASH e não me lembro de como "agrupo" duas variáveis de 8, de forma que juntando as duas, o valor seja o mesmo da variável de 16.

Tipo:
var_high = 0b11110000; //parte mais alta
var_low = 0b10110011; //parte mais baixa

"Juntando" as duas numa de 16:
var = 0b1111000010110011; //variável agrupada

Como posso fazer isso?
Desculpem minha ignorância, mas não me lembro mesmo...

Desde já agradeço.

Abraços

MensagemEnviado: 23 Mar 2007 11:37
por KrafT
union {
unsigned int _dado;
struct {
byte Alta :8;
byte Baixa :8;
} ADSTR;
} AD_UNION;

#define Dado16 AD_UNION._dado

#define Dado8Baixo AD_UNION.ADSTR.Baixa
#define Dado8Alto AD_UNION.ADSTR.Alta

MensagemEnviado: 23 Mar 2007 16:44
por DaniloCM
Valew Kraft!!

Num tava lembrando q declarava a variável dentro do union... mas obrigado mesmo pela ajuda ;]

Duvida estranha !

MensagemEnviado: 15 Ago 2007 00:32
por mega.rod
Alguém sabe o porque que no MCU QY4A a escrita da flash não funciona com a rotina descrita acima ? algum ja teve este problema ?

Ela consegue apagar normalmente a pagina mas não consegue escrever...Ajuda !!!

Fico no aguardo...

MensagemEnviado: 15 Ago 2007 14:01
por mastk
Se não me falha a memoria, o processo de gravação na flash mudou um pouco, dé uma revisada no Ds. E tb, tem grandes diferenças entre o QY e o QYA