Utiliser un Raspberry Pi pour programmer un AVR
RetourInstallation de avrdude
Nous allons installer avrdude :
Prérequis
pi@raspberrypi ~ $ sudo apt-get update
pi@raspberrypi ~ $ sudo apt-get install bison flex -y
Installation
Depuis les sources :
pi@raspberrypi ~ $ wget http://download.savannah.gnu.org/releases/avrdude/avrdude-6.2.tar.gz
pi@raspberrypi ~ $ tar xfv avrdude-6.2.tar.gz
pi@raspberrypi ~ $ cd avrdude-6.2/
Activer linuxgpio
dans les sources de avrdude et installation :
pi@raspberrypi avrdude-6.2/~ $ ./configure – -enable-linuxgpio
pi@raspberrypi avrdude-6.2/~ $ make
pi@raspberrypi avrdude-6.2/~ $ sudo make install
Spécifier à avrdude quel GPIO utiliser :
pi@raspberrypi avrdude-6.2/~ $ sudo vi /usr/local/etc/avrdude.conf
Rechercher linuxgpio
:
#programmer
# id = "linuxgpio";
# desc = "Use the Linux sysfs interface to bitbang GPIO lines";
# type = "linuxgpio";
# reset = ?;
# sck = ?;
# mosi = ?;
# miso = ?;
#;
Et le remplacer par ceci :
programmer
id = "linuxgpio";
desc = "Use the Linux sysfs interface to bitbang GPIO lines";
type = "linuxgpio";
reset = 4;
sck = 11;
mosi = 10;
miso = 9;
;
Voici le câblage :
Raspberry | Arduino | AVR |
---|---|---|
GPIO 4 | RST | 1 |
GPIO 10 | D11 | 18 |
GPIO 9 | D12 | 17 |
GPIO 11 | D13 | 19 |
Test
Testons la communication :
sudo avrdude -c linuxgpio -p m8 -v
-c Type de programmateur -p Modèle de puce -v Mode verbeux
Je me suis trompé de modéle d’aTmega :
avrdude: Device signature = 0x1e9205 (probably m48)
avrdude: Expected signature for ATmega8 is 1E 93 07
Double check chip, or use -F to override this check.
Changeons le modéle comme l’indique AVR dude :
sudo avrdude -c linuxgpio -p m48 -v
avrdude: Device signature = 0x1e9205 (probably m48)
avrdude: safemode: hfuse reads as DF
avrdude: safemode: efuse reads as FF
avrdude: safemode: hfuse reads as DF
avrdude: safemode: efuse reads as FF
avrdude: safemode: Fuses OK (E:FF, H:DF, L:E2)
avrdude done. Thank you.
Premier programme
Il est tout à fait possible de programmer un AVR ou même un Arduino sans l’IDE grâce à Arduino-MK :
pi@raspberrypi ~ $ sudo apt install arduino-mk
Créons un programme de base :
pi@raspberrypi ~ $ mkdir blink
pi@raspberrypi ~ $ cd blink
pi@raspberrypi blink/~ $ vi blink.ino
Voici un bout de code :
#include <Arduino.h>
void setup() {
pinMode(13, OUTPUT);
}
void loop() {
digitalWrite(13, HIGH);
delay(500);
digitalWrite(13, LOW);
delay(100);
}
Créons un Makefile :
include /usr/share/arduino/Arduino.mk
MCU = atmega48
F_CPU = 1000000L
ARDUINO_DIR = /usr/share/arduino
ARDUINO_LIBS =
Compilons tout ceci :
pi@raspberrypi blink/~ $ make
Un dossier build-uno
est créé à la compilation et contient un fichier .hex
pi@raspberrypi blink/~ $ sudo avrdude -c linuxgpio -p atmega8 -v -U flash:w:build-uno/blink.hex:i
Note : Ajustez le type de puce, n’allez pas griller un aTmega pour rien…
Ajout de librairies :
Ajouter ceci dans le Makefile pour ajouter des librairies :
USER_LIB_PATH += /home/my_username/my_libraries_directory
ARDUINO_LIBS += Wire \
SPI \
my_custom_lib
Troubleshoot :
Erreur GPIO :
Can't export GPIO 4, already exported/busy?: Device or resource busy
Fix :
echo 4 > /sys/class/gpio/unexport
Exemple de fuse :
Par défaut certaines puces n’ont pas les bons fuse en place. Ces fuses permettent de déffinir les paramètres des aTmega. Il est possible de les modifier.
ATTENTION : Une mauvaise manipulation de ces fuse peu rendre inutilisables vos µcontrolleur
Pour un atmega 48 en internal crystal 8mhz
sudo avrdude -c linuxgpio -p atmega48 -U lfuse:w:0xe2:m -U hfuse:w:0xdf:m -U efuse:w:0xff:m
Pour un atmega 8 en internal crystal 8mhz
sudo avrdude -c linuxgpio -p m8 -U lfuse:w:0xe4:m -U hfuse:w:0xd9:m
Utilisez ce site pour savoir quoi envoyer dans AVR dude : https://www.engbedded.com/fusecalc/
Internal crystal veut dire que l’aTmega utilise son oscillateur intégré pour fonctionner. Ce n’est pas aussi précis qu’un quartz mais cela permet d’utiliser ces puces sur une breadboard de façon minimaliste.
Le blog de ladyada parle aussi de ces fameux fuses https://www.ladyada.net/learn/avr/fuses.html
Retour