Quando você inclui o seguinte código em uma fonte do AVR C, aparentemente pode programar diretamente os fusíveis, sem a necessidade de um comando extra ou arquivo .hex:
#include <avr/io.h>
FUSES = {
.low = LFUSE_DEFAULT ,
.high = HFUSE_DEFAULT ,
.extended = EFUSE_DEFAULT ,
};
Existe um truque semelhante para programar valores na EEPROM?
Verifiquei /usr/lib/avr/include/avr/fuse.h
onde posso encontrar alguns comentários sobre uma macro, mas não consigo encontrar um comentário semelhante /usr/lib/avr/include/avr/eeprom.h
e interpretar o material do pré-processador está um pouco fora do meu alcance.
Seria realmente útil se eu pudesse incluir valores EEPROM padrão no código-fonte C. Alguém sabe como fazer isso?
edit1:
Esse truque do FUSES é executado apenas no tempo do ISP, não no tempo de EXECUÇÃO. Portanto, não há fusíveis sendo programados no código de montagem resultante no controlador. Em vez disso, o programador passa automaticamente por um ciclo de programação extra do FUSES.
edit2:
Eu uso as ferramentas avr-gcc e avrdude no Linux.
Respostas:
Com o avr-gcc, a
EEMEM
macro pode ser usada na definição de uma variável, consulte oslibc
documentos e um exemplo aqui :declara que a matriz de caracteres reside em uma seção chamada ".eeprom" que, após a compilação, informa ao programador que esses dados devem ser programados na EEPROM. Dependendo do software do programador, pode ser necessário fornecer explicitamente o nome do arquivo ".eep" criado durante o processo de compilação ao programador, ou ele pode ser implicitamente encontrado sozinho.
fonte
avr-objcopy -j .eeprom --set-section-flags=.eeprom="alloc,load" --change-section-lma .eeprom=0 ihex $(src).elf $(src).eeprom.hex
avrdude -p$(avrType) -c$(programmerType) -P$(programmerDev) -b$(baud) -v -U eeprom:w:$(src).eeprom.hex
Sim, você pode gravar manualmente os dados padrão na EEPROM no código-fonte. Primeiro, confira este guia incrível sobre a EEPROM com o AVR: Tutorial do AVR EEPROM de Dean. Além disso, devo acrescentar que é uma idéia melhor criar um arquivo .eep contendo os dados da EEPROM usando o makefile que será programado no dispositivo junto com o código-fonte. No entanto, se você não estiver familiarizado com várias operações de makefile e vinculador, isso ainda poderá ser feito no seu arquivo de código-fonte - isso acontecerá assim que o circuito for ligado, interrompendo a operação inicial do programa.
No início do programa (antes de qualquer tipo de loop principal), você poderia fazer algo assim:
A função "update" verifica primeiro se esse valor já existe, para economizar gravações desnecessárias, preservando a vida útil da EEPROM. No entanto, fazer isso em muitos locais pode demorar um pouco. Talvez seja melhor verificar um único local. Se esse for o valor desejado, o restante das atualizações poderá ser ignorado completamente. Por exemplo:
Se você deseja atualizar grandes quantidades de dados, tente usar outras funções, como
eeprom_update_block(...)
. E definitivamente leia esse tutorial; está bem escrito.Você pode colocar todas as instruções de atualização da EEPROM em uma única instrução condicional do pré-processador. Isso é muito simples de fazer:
Esse bit de código nem será compilado, a menos que você faça o seguinte:
Você pode deixar isso como um comentário e, em seguida, descomentar se precisar alterar os valores padrão da EEPROM. Para obter mais informações sobre o pré-processador C, consulte este manual online . Acho que você pode estar mais interessado nas seções sobre macros e declarações condicionais.
fonte
Ch. 7 Setting Initial Values
.EEMEM
variáveis, o compilador cuida do gerenciamento de qual variável reside onde está na EEPROM. Dessa forma, você opera apenas em ponteiros (constantes, gerados pelo compilador) para variáveis ao acessar os dados. Se, por outro lado, você definir explicitamente o endereço em que cada variável reside, terá que cuidar desses endereços, inclusive assegurando que nenhuma variável ocupe acidentalmente o mesmo endereço, substituindo-se; ou recalcular todos os endereços, caso o tamanho de armazenamento de uma variável seja alterado no futuro etc.