Saat Anda memasukkan kode berikut dalam sumber AVR C, Anda dapat langsung memprogram sekering, tanpa perlu perintah tambahan atau file .hex:
#include <avr/io.h>
FUSES = {
.low = LFUSE_DEFAULT ,
.high = HFUSE_DEFAULT ,
.extended = EFUSE_DEFAULT ,
};
Apakah ada trik yang mirip dengan nilai-nilai program di EEPROM?
Saya telah memeriksa di /usr/lib/avr/include/avr/fuse.h
mana saya dapat menemukan beberapa komentar tentang makro, tetapi saya tidak dapat menemukan komentar serupa di dalam /usr/lib/avr/include/avr/eeprom.h
dan menafsirkan hal-hal preprosesor sedikit keluar dari liga saya.
Akan sangat berguna jika saya dapat memasukkan nilai EEPROM default dalam kode sumber C. Adakah yang tahu bagaimana mencapainya?
edit1:
Trik FUSES ini hanya dijalankan pada waktu ISP, bukan pada waktu RUN. Jadi tidak ada sekering yang diprogram dalam kode rakitan yang dihasilkan di controller. Alih-alih, programmer secara otomatis menggilir siklus pemrograman FUSES tambahan.
edit2:
Saya menggunakan avr-gcc dan avrdude toolchain di Linux.
Jawaban:
Dengan avr-gcc,
EEMEM
makro dapat digunakan pada definisi variabel, lihatlibc
dokumen dan contoh di sini :mendeklarasikan array karakter untuk berada di bagian bernama ".eeprom" yang setelah kompilasi memberitahu programmer bahwa data ini akan diprogram ke EEPROM. Bergantung pada perangkat lunak programmer Anda, Anda mungkin perlu secara eksplisit memberikan nama file ".eep" yang dibuat selama proses build ke programmer, atau mungkin secara implisit menemukannya dengan sendirinya.
sumber
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
Ya, Anda dapat secara manual menulis data default ke EEPROM dalam kode sumber. Pertama, lihat panduan luar biasa ini pada EEPROM dengan AVR: Tutorial AVR EEPROM dari Dean. Juga, saya harus menambahkan bahwa itu adalah ide yang lebih baik untuk membuat file .eep yang berisi data EEPROM menggunakan makefile yang akan diprogram ke perangkat bersama dengan kode sumber. Namun, jika Anda tidak terbiasa dengan berbagai operasi makefile dan linker, itu masih dapat dilakukan dari dalam file kode sumber Anda - itu hanya akan terjadi segera setelah rangkaian diaktifkan, menghentikan operasi program awal.
Di awal program (sebelum loop utama), Anda dapat melakukan sesuatu seperti ini:
Fungsi "pembaruan" memeriksa terlebih dahulu untuk melihat apakah nilai itu sudah ada di sana, untuk menghemat penulisan yang tidak perlu, mempertahankan umur EEPROM. Namun, melakukan ini untuk lokasi yang sangat banyak dapat memakan waktu yang cukup lama. Mungkin lebih baik untuk memeriksa satu lokasi. Jika ini adalah nilai yang diinginkan, maka pembaruan lainnya dapat dilewati sepenuhnya. Sebagai contoh:
Jika Anda ingin memperbarui data dalam jumlah besar, coba gunakan fungsi lain seperti
eeprom_update_block(...)
. Dan pasti baca tutorial itu; itu ditulis dengan baik.Anda bisa meletakkan semua pernyataan pembaruan EEPROM dalam satu pernyataan bersyarat preprocessor tunggal. Ini sangat mudah dilakukan:
Sedikit kode ini bahkan tidak akan dikompilasi kecuali jika Anda melakukan hal berikut:
Anda dapat meninggalkan ini di sana sebagai komentar, lalu batalkan komentar jika Anda perlu mengubah nilai EEPROM default. Untuk informasi lebih lanjut tentang preprosesor C, lihat manual online ini . Saya pikir Anda mungkin paling tertarik pada bagian tentang makro dan pernyataan kondisional.
sumber
Ch. 7 Setting Initial Values
.EEMEM
variabel, kompiler menangani pengelolaan variabel mana yang berada di EEPROM. Dengan cara ini Anda hanya beroperasi pada pointer (konstan, yang dihasilkan kompiler) ke variabel saat mengakses data. Sebaliknya, jika Anda secara eksplisit menentukan alamat tempat masing-masing variabel berada, Anda harus mengurus sendiri alamat-alamat itu, termasuk memastikan bahwa tidak ada variabel yang secara tidak sengaja menempati alamat yang sama, saling menimpa; atau menghitung ulang semua alamat jika ukuran penyimpanan variabel berubah di masa depan dll.