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