Página 1 de 2
Usar Flash como EEPROM

Enviado:
11 Fev 2015 08:23
por MSGF2K
Estou usando o tiny88 para aprender a trabalhar com os AVRs, achei legal e já fiz algumas coisas funcionarem perfeitamente como A/D, input capture. Agora eu programava freescale e tinha por costume utilizar a flash como EEPROM, com uma rotina rodando na RAM para fazer a gravação, gostaria de saber como faço para usar a FLASH como EEPROM nos AVRs ?
Re: Usar Flash como EEPROM

Enviado:
12 Fev 2015 09:08
por RobL
Nessa linha não dá para usar flash como eeprom. Dá somente para usar constantes na flash.
A linha ATMega 48, 88, 168, 328 tem eeprom.
Re: Usar Flash como EEPROM

Enviado:
13 Fev 2015 12:13
por MSGF2K
Obrigado Robl, vou dar uma olhada nestes micros.
Re: Usar Flash como EEPROM

Enviado:
18 Fev 2015 05:52
por cfreund
ATtiny tb tem Eeprom. Veja datashhet Pag.23.
É possível escrever na Flash sim, um pouco complicado, pois deverá trabalhar com Assembly. Procure como empregar a instrução "SPM". Veja App Note AVR109.
- Código: Selecionar todos
#include <avr/boot.h>
/* page buffer ---------------------------------------------------- */
uint8_t pagebuffer[SPM_PAGESIZE];
/* address buffer */
uint16_t address;
/* access to flash memory------------------------------------------ */
void write_flash_page()
{
uint16_t i = 0;
eeprom_busy_wait ();
boot_page_erase (address);
boot_spm_busy_wait (); // Wait until the memory is erased.
for (i=0; i<SPM_PAGESIZE; i+=2)
{
// Set up little-endian word.
uint16_t w = *((uint16_t*)(pagebuffer + i));
boot_page_fill (address + i, w);
}
boot_page_write(address); // Store buffer in flash page.
boot_spm_busy_wait(); // Wait until the memory is written.
boot_rww_enable ();
}
Re: Usar Flash como EEPROM

Enviado:
18 Fev 2015 21:05
por RobL
como faço para usar a FLASH como EEPROM nos AVRs ?
Penso que se confundiu.
O que ele quer é usar a flash como EEPROM, ou seja modificar resultados de variáveis armazenadas na eeprom . Se forem constantes, escreveria na flash diretamente.
Não se trata de carregar programa " bootloader" (escrever na flash) e sim usar uma flash especializada como "eeprom" (note aspas), como tem em alguns chips da Freescale (NVRAM ou algo similar).
O ATiny88 (nunca utilizei) tem 64 bytes de eeprom.
Re: Usar Flash como EEPROM

Enviado:
18 Fev 2015 22:06
por cfreund
É isso mesmo RobL.
Utilizar o espaço em branco no final da flash para armazenar dados. Isso é bastante comum e simples de implementar, principalmente quando o circuito tem de ser enxuto.
Hoje, editei meu post e anexei uma parte de um código de bootloader, mas que serve perfeitamente para o caso. Não precisamos desenvolver rotinas de baixo nível para isso, já tem embutido no WinAVR.
Para ler, podemos utilizar pgmspace.h
Tem uma durabilidade 10x menor que a EEPROM interna, é necessário apagar a página inteira (32 words p/ ATt88), porém funciona tão bem quanto.
Re: Usar Flash como EEPROM

Enviado:
18 Fev 2015 22:13
por EvandrPic
Assim como nos PICs, é possível salvar dados na Flash em tempo de execução nos AVRs também...AVR106: C functions for reading and writing to Flash memory http://www.atmel.com/Images/doc2575.pdf
Re: Usar Flash como EEPROM

Enviado:
19 Fev 2015 19:12
por RobL
Não se trata de poder escrever na flash de um AVR via Bootloader e sim usá-la com as características de uma EEPROM na área da flash como nos chips Freescale.
Respondi: Não dá para escrever na flash como nos Freescale, vejam a diferença do que temos na flash da Freescale (no caso exemplo Kinetis freescale) mas é similar em outras linhas da Freescale:
FlexMemory EEE features include:
• Configurability to allow the designer to make
trade-off decisions based on the EEE endurance
required and the total amount of
EEE and flash memory required
• High endurance EEE memory can reach over
100 M cycles (depending on configuration)
• Supports byte, word, and longword accesses
• Fast write times (~100 us for a wr
ite to a pre-erased location, and
1.5 ms for an erase and program)
• EEE functionality across the full operating vol
tage range for the processor (1.71 V – 3.6 V)
Note que neste caso usa-se uma região da flash com características superior as EEPROM.
Já usando SelfProgram (bootloader) é um arranjo possível, mas nada razoavelmente próximo das prorpiedades de uma EEPROM especialmente o caso da FlexMemory da Freescale.
Seria uma super cambalhota para modificar um byte que dependeria da aplicação. Penso que quem quer uma EEPROM não vai se ajeitar com uma escrita na flash em tempo de execução.
Nem a MC e a Atmel teriam EEPROM em seus chips com SelfProgram ou bootloader, no entanto tem eeprom e área para bootloader.
Como disse o cfreud, para um caso de poucas escritas, em situações de baixo custo, fica a critério do artista, tendo a certeza que não haverá colapso com ciclos de escrita na flash ou em processamento.
Re: Usar Flash como EEPROM

Enviado:
19 Fev 2015 21:36
por cfreund
RobL,
Minha intenção não foi estimular essa prática. Não é o ideal, ou melhor, pelo menos não o mais indicado. É um apenas um recurso de grande valia. Devemos ter conhecimento sobre isso.
Estou desenvolvendo um projeto com um SAM4S com 2MB de flash. Vou utilizar essa técnica, pois preciso economizar espaço e grana. Não tenho grande volume de dados, mas tenho grande quantidade. Tenho em mente as limitações implícitas.
Acredito que a intenção do criador do tópico seja isso mesmo: "escrever na flash de um AVR". Esqueça a parte de bootloader, não utilizamos isso para o caso. A escrita na flash não se faz apenas pela região do bootloader. Desde que não tenha queimado fusível de proteção na gravação, poderá gravar onde, de onde e como quiser.
A Freescale pode ter uma química melhor, mas essencialmente o propósito é o mesmo. - respeitando as idiossincrasias de cada arquitetura -
Penso que microcontroladores tem diferentes tipos de memória embutida, pois certas características custam caro. Simples relação custo/benefício.
Re: Usar Flash como EEPROM

Enviado:
19 Fev 2015 21:51
por EvandrPic
Esperemos o MSGF2K dizer se é isso que ele quer... Ele tem 2 participações no Asm51 e as duas estão nessa postagem, então não temos ainda a confirmação se o que ele quer está aí no AN da Atmel.
Acredito que o que ele quer seja isso que consta nessa AN e não há nenhuma cambalhota em usar essas funções em C.
• C functions for accessing Flash memory
- Byte read
- Page read
- Byte write
- Page write
Re: Usar Flash como EEPROM

Enviado:
20 Fev 2015 07:33
por RobL
Claudio, para projetos futuros que venha a necessitar de eeprom até 4K dê uma olhada na linha CM4 Kinetis da Freescale. Veja os que tenha DX no código do chip (MKnnDX.....). Não é uma EEPROM mas similar com tempo de escrita mais rápido, etc. O preço é compatível com os da Atmel. Tenho simpatia pela Atmel mas esta versatilidade da FlexMemo é atraente para aplicações que dependam de uso intensivo da eeprom.
Quanto ao uso da área para bootloader, podemos alterar grande quantidade de dados na flash como se fosse enviado de fora para dentro mas vindo de sua RAM(via algum periférico ou não) sem parar outro trecho de programa. Por isso foi citado bootloader.
EvandrPic:
Quanto a cambalhota, não se trata de dificuldade de se escrever em C ou em Assembler, mas o processamento necessário para alterar um só byte, principalmente se usado com certa frequência, aumentando possibilidade de falha, visto que gravação não é algo muito seguro até mesmo em uma eeprom.
Re: Usar Flash como EEPROM

Enviado:
20 Fev 2015 12:29
por cfreund
4KB de FlexRAM com 256KB de FlexNVM. A Renesas com um brinquedinho com 4MB de CodeFlash + 64KB DataFlash. Atualmente, estou precisando de ~1.5MB. Me permita retificar minha frase, escrevi sem pensar: Tenho grande quantidade de dados, média leitura e pouca escrita.
Bom, acredito que o propósito do tópico foi alcançado. As perguntas respondidas inclusive com exemplos.
Sds,
Re: Usar Flash como EEPROM

Enviado:
26 Fev 2015 08:35
por MSGF2K
Primeiramente gostaria de agradecer os amigos, e desculpas por demorar um pouco para responder (estive fora por um tempo).
Robl tem razão quando diz: "...O que ele quer é usar a flash como EEPROM, ou seja modificar resultados de variáveis armazenadas na eeprom." , exatamente eeprom (que na verdade é uma area reservada da flash) , nos micros da Freescale eu utilizo algumas paginas para armazenar variaveis (Ex: bytes de controles remotos de RF). Cfreund diz: "...Utilizar o espaço em branco no final da flash para armazenar dados. Isso é bastante comum e simples de implementar, principalmente quando o circuito tem de ser enxuto." é isto mesmo Cfreund estarei vendo o codigo que vc postou, obrigado. Estarei vendo o AVR106 obrigado EvandrPic.
Re: Usar Flash como EEPROM

Enviado:
26 Fev 2015 09:28
por cfreund
Re: Usar Flash como EEPROM

Enviado:
26 Fev 2015 09:54
por MSGF2K
Bom dia Claudio, por ter apenas 64bytes.
Estou imaginando uma aplicação onde eu preciso colocar ai uns 500 controles com 3 bytes cada por exemplo, e o target do projeto me obrigue utilizar este micro.