programmer un atmega16 avec un raspberry pi (fichier .ino)

Bonjour tout le monde,

Voilà pour un projet perso je cherche un moyen de programmer un atmega16 directement par un Rpi via la liaison SPI.

Mes recherches m'ont amené à voir que c'est possible via avrdude, le problème c'est que dans les tuto que j'ai pu voir, le programme pour l'atmega est développé en C et non dans le langage utilisé par l'IDE de l'arduino. Or je ne maitrise pas vraiment ce langage là.

Donc je suis à la recherche d'un tuto (ou juste de mots clés ^^) qui me permettrait d'une part de compiler le fichier .ino en .hex pour un atmega16 (je l'utilise avec l'oscillateur 8MHz interne) puis de transférer le .hex dans l'atmega (à priori ça c'est via avrdude)

Actuellement, j'utilise un arduino uno pour dans un premier temps transférer le bootloader qui va bien (grâce à MightyCore qui permet la prise en charge de l'atmega16) puis je programme l'atmega par ISP.

Mon projet utilise un Rpi et un atmega16 qui dialogue en I²C, pouvoir programmer directement l'atmega sans la retirer du circuit serait vraiment un plus.

Merci d'avance pour toutes aides :slight_smile:

bonne journée,

docbrownd:
Mes recherches m'ont amené à voir que c'est possible via avrdude, le problème c'est que dans les tuto que j'ai pu voir, le programme pour l'atmega est développé en C et non dans le langage utilisé par l'IDE de l'arduino. Or je ne maitrise pas vraiment ce langage là.

le langage de l'IDE Arduino c'est du C/C++

Bonjour,

docbrownd:
Voilà pour un projet perso je cherche un moyen de programmer un atmega16 directement par un Rpi via la liaison SPI.

Pourquoi pas !

docbrownd:
Mes recherches m'ont amené à voir que c'est possible via avrdude, le problème c'est que dans les tuto que j'ai pu voir, le programme pour l'atmega est développé en C et non dans le langage utilisé par l'IDE de l'arduino. Or je ne maitrise pas vraiment ce langage là.

Arduino n'est pas un langage. L'IDE Arduino utilise un mélange de C et C++
Installe Arduino sur ton RPI

docbrownd:
Donc je suis à la recherche d'un tuto (ou juste de mots clés ^^) qui me permettrait d'une part de compiler le fichier .ino en .hex pour un atmega16 (je l'utilise avec l'oscillateur 8MHz interne) puis de transférer le .hex dans l'atmega (à priori ça c'est via avrdude)

Si tu utilises Arduino sur ton RPI, ton problème est résolu.

docbrownd:
Actuellement, j'utilise un arduino uno pour dans un premier temps transférer le bootloader qui va bien (grâce à MightyCore qui permet la prise en charge de l'atmega16) puis je programme l'atmega par ISP.

Pourquoi passer par une UNO ?

docbrownd:
Mon projet utilise un Rpi et un atmega16 qui dialogue en I²C, pouvoir programmer directement l'atmega sans la retirer du circuit serait vraiment un plus.

Utilise un connecteur permettant d'isoler les pins utilisées lors de la programmation.

[edit] pepe très rapide

Le problème c'est que du coup il me faut une interface graphique sur le RPi. c'est pas bien compliquer mais du coup c'était pas l'idée (surtout qu'il faut avoir un écran sous la main, ce qui n'est pas pratique dans le cadre de ce projet).

ce ne serait pas possible de le faire en ligne de commande ?

Sinon certe les programmes .ino sont en c mais avec de légère différence non ? (genre les mots clés, etc) je peux pas utiliser un .ino directement comme source de compilation, si ?

PS : j'utilise l'uno car je l'ai sous la main et qu'il me semblait que c'était le plus simple pour programmer un AVR

PS2: je suis encore débutant avec les AVR, désolé si c'est des questions stupides (pourtant j'ai fait des recherches avant :s)

Re,

docbrownd:
Le problème c'est que du coup il me faut une interface graphique sur le RPi. c'est pas bien compliquer mais du coup c'était pas l'idée (surtout qu'il faut avoir un écran sous la main, ce qui n'est pas pratique dans le cadre de ce projet).

VNC et Co existent

docbrownd:
ce ne serait pas possible de le faire en ligne de commande ?

Il faut se donner la peine de chercher.
http://playground.arduino.cc/French/OutilsDeDéveloppement

AMHAyendotre.

icare:
Re,VNC et Co existent

oui évidemment mais c'est pas le plus pratique et ça nécessite d'avoir l'arduino uno avec soi (ou alors on peut programmer l'atmega sans ? genre avec un simple cable USB<>Série ? )

icare:
Il faut se donner la peine de chercher.
Arduino Playground - HomePage

AMHAyendotre.

je n'avais pas vu cette page, merci je vais regarder de plus près.

Re,
Pas besoin de UNO.
isp1.png

Je reviens juste à ma question initiale. Comme je suis têtu, j'ai poursuivi mes recherches.

Donc j'arrive à compiler les fichiers ino en hex (entendre par là sans erreurs de compilations) et à les transférer, le tout en ligne de commande. Malheureusement le programme ne fonctionne pas, alors que si je pars d'un programme en C, aucun soucis donc le problème vient sans doute de la compilation.

Pour info (si ça intéresse), j'ai utilisé le makefile dispo ici et cette commande avrdude :

 sudo avrdude -c gpio -p atmega16  -U flash:w:programme.hex

Le Rpi et l'atmega étant relié par une liaison SPI (activé sur le RPI évidemment)

Voilà, en attendant de comprendre d'où vient le problème, je vais probablement passer par vnc même si c'est le moins pratique (c'est plus simple d'ouvrir un terminal ssh sur un téléphone qu'une sessiosn vnc, surtout sur le mien :s)

Je poste ici ma solution :
le problème venait effectivement de la compilation. J'ai donc utilisé la sortie de l'IDE pour voir exactement ce qu'il se passait. Ensuite j'ai installer l'IDE sur le RPi (à partir de l'archive ARM du site, la version des dépôts n'étant pas à jour), puis j'ai installé l'extension qui permet de compiler pour l'atmega16 (GitHub - MCUdude/MightyCore: Arduino hardware package for ATmega1284, ATmega644, ATmega324, ATmega324PB, ATmega164, ATmega32, ATmega16 and ATmega8535).

j'ai ensuite adapté le Makefile à partir des infos fournies par l'IDE :

ARDUINO_DIR = /home/pi/.arduino15/packages/MightyCore/
PROG_DIR=/home/pi/arduino-1.8.1/
# various programs
CC = "$(PROG_DIR)hardware/tools/avr/bin/avr-gcc"
CPP = "$(PROG_DIR)hardware/tools/avr/bin/avr-g++"
AR = "$(PROG_DIR)hardware/tools/avr/bin/avr-ar"
OBJ_COPY = "$(PROG_DIR)hardware/tools/avr/bin/avr-objcopy"

MAIN_SKETCH = cible.cpp

# compile flags for g++ and gcc

# may need to change these
F_CPU = 8000000
MCU = atmega16

# compile flags
GENERAL_FLAGS = -c -g -Os -Wall -ffunction-sections -fdata-sections -mmcu=$(MCU) -DF_CPU=$(F_CPU)L -MMD -DUSB_VID=null -DUSB_PID=null -DARDUINO=10801 -DARDUINO_AVR_ATmega16 -DARDUINO_ARCH_AVR 
CPP_FLAGS = $(GENERAL_FLAGS) -fno-exceptions
CC_FLAGS  = $(GENERAL_FLAGS)

# location of include files
INCLUDE_FILES = "-I$(ARDUINO_DIR)hardware/avr/1.0.8/cores/MightyCore" "-I$(ARDUINO_DIR)hardware/avr/1.0.8/variants/standard"

# library sources
LIBRARY_DIR = "$(ARDUINO_DIR)hardware/avr/1.0.8/cores/MightyCore/"

build:

	$(CPP) $(CPP_FLAGS) $(INCLUDE_FILES) $(MAIN_SKETCH) -o $(MAIN_SKETCH).o
	$(CC) $(CC_FLAGS) $(INCLUDE_FILES) $(LIBRARY_DIR)avr-libc/malloc.c -o malloc.c.o 
	$(CC) $(CC_FLAGS) $(INCLUDE_FILES) $(LIBRARY_DIR)avr-libc/realloc.c -o realloc.c.o 
	$(CC) $(CC_FLAGS) $(INCLUDE_FILES) $(LIBRARY_DIR)WInterrupts.c -o WInterrupts.c.o 
	$(CC) $(CC_FLAGS) $(INCLUDE_FILES) $(LIBRARY_DIR)hooks.c -o hooks.c.o 
	$(CC) $(CC_FLAGS) $(INCLUDE_FILES) $(LIBRARY_DIR)wiring.c -o wiring.c.o 
	$(CC) $(CC_FLAGS) $(INCLUDE_FILES) $(LIBRARY_DIR)wiring_analog.c -o wiring_analog.c.o 
	$(CC) $(CC_FLAGS) $(INCLUDE_FILES) $(LIBRARY_DIR)wiring_digital.c -o wiring_digital.c.o 
	$(CC) $(CC_FLAGS) $(INCLUDE_FILES) $(LIBRARY_DIR)wiring_pulse.c -o wiring_pulse.c.o 
	$(CC) $(CC_FLAGS) $(INCLUDE_FILES) $(LIBRARY_DIR)wiring_shift.c -o wiring_shift.c.o 

	$(CPP) $(CPP_FLAGS) $(INCLUDE_FILES) $(LIBRARY_DIR)CDC.cpp -o CDC.cpp.o 
	$(CPP) $(CPP_FLAGS) $(INCLUDE_FILES) $(LIBRARY_DIR)HardwareSerial.cpp -o HardwareSerial.cpp.o 
	$(CPP) $(CPP_FLAGS) $(INCLUDE_FILES) $(LIBRARY_DIR)HardwareSerial0.cpp -o HardwareSerial0.cpp.o 
	$(CPP) $(CPP_FLAGS) $(INCLUDE_FILES) $(LIBRARY_DIR)HardwareSerial1.cpp -o HardwareSerial1.cpp.o 
	$(CPP) $(CPP_FLAGS) $(INCLUDE_FILES) $(LIBRARY_DIR)HardwareSerial2.cpp -o HardwareSerial2.cpp.o 
	$(CPP) $(CPP_FLAGS) $(INCLUDE_FILES) $(LIBRARY_DIR)HardwareSerial3.cpp -o HardwareSerial3.cpp.o 
	$(CPP) $(CPP_FLAGS) $(INCLUDE_FILES) $(LIBRARY_DIR)HID.cpp -o HID.cpp.o 
	$(CPP) $(CPP_FLAGS) $(INCLUDE_FILES) $(LIBRARY_DIR)PluggableUSB.cpp -o PluggableUSB.cpp.o 
	$(CPP) $(CPP_FLAGS) $(INCLUDE_FILES) $(LIBRARY_DIR)IPAddress.cpp -o IPAddress.cpp.o 
	$(CPP) $(CPP_FLAGS) $(INCLUDE_FILES) $(LIBRARY_DIR)main.cpp -o main.cpp.o 
	$(CPP) $(CPP_FLAGS) $(INCLUDE_FILES) $(LIBRARY_DIR)abi.cpp -o abi.cpp.o 
	$(CPP) $(CPP_FLAGS) $(INCLUDE_FILES) $(LIBRARY_DIR)new.cpp -o new.cpp.o 
	$(CPP) $(CPP_FLAGS) $(INCLUDE_FILES) $(LIBRARY_DIR)Print.cpp -o Print.cpp.o 
	$(CPP) $(CPP_FLAGS) $(INCLUDE_FILES) $(LIBRARY_DIR)Stream.cpp -o Stream.cpp.o 
	$(CPP) $(CPP_FLAGS) $(INCLUDE_FILES) $(LIBRARY_DIR)Tone.cpp -o Tone.cpp.o 
	$(CPP) $(CPP_FLAGS) $(INCLUDE_FILES) $(LIBRARY_DIR)USBCore.cpp -o USBCore.cpp.o 
	$(CPP) $(CPP_FLAGS) $(INCLUDE_FILES) $(LIBRARY_DIR)WMath.cpp -o WMath.cpp.o 
	$(CPP) $(CPP_FLAGS) $(INCLUDE_FILES) $(LIBRARY_DIR)WString.cpp -o WString.cpp.o 
	$(CPP) $(CPP_FLAGS) $(INCLUDE_FILES) $(LIBRARY_DIR)wiring_extras.cpp -o wiring_extras.cpp.o 
	$(AR) rcs core.a malloc.c.o 
	$(AR) rcs core.a realloc.c.o 
	$(AR) rcs core.a WInterrupts.c.o 
	$(AR) rcs core.a hooks.c.o 
	$(AR) rcs core.a wiring.c.o 
	$(AR) rcs core.a wiring_analog.c.o 
	$(AR) rcs core.a wiring_digital.c.o 
	$(AR) rcs core.a wiring_pulse.c.o 
	$(AR) rcs core.a wiring_shift.c.o 
	$(AR) rcs core.a CDC.cpp.o 
	$(AR) rcs core.a HardwareSerial.cpp.o 
	$(AR) rcs core.a HardwareSerial0.cpp.o 
	$(AR) rcs core.a HardwareSerial1.cpp.o 
	$(AR) rcs core.a HardwareSerial2.cpp.o 
	$(AR) rcs core.a HardwareSerial3.cpp.o 
	$(AR) rcs core.a HID.cpp.o 
	$(AR) rcs core.a PluggableUSB.cpp.o 
	$(AR) rcs core.a IPAddress.cpp.o 
	$(AR) rcs core.a main.cpp.o 
	$(AR) rcs core.a abi.cpp.o 
	$(AR) rcs core.a new.cpp.o 
	$(AR) rcs core.a Print.cpp.o 
	$(AR) rcs core.a Stream.cpp.o 
	$(AR) rcs core.a Tone.cpp.o 
	$(AR) rcs core.a USBCore.cpp.o 
	$(AR) rcs core.a WMath.cpp.o 
	$(AR) rcs core.a WString.cpp.o 
	$(AR) rcs core.a wiring_extras.cpp.o 
	$(CC) -Os -Wl,--gc-sections -mmcu=$(MCU) -o $(MAIN_SKETCH).elf $(MAIN_SKETCH).o core.a -lm 
	$(OBJ_COPY) -O ihex -j .eeprom --set-section-flags=.eeprom=alloc,load --no-change-warnings --change-section-lma .eeprom=0 $(MAIN_SKETCH).elf $(MAIN_SKETCH).eep 
	$(OBJ_COPY) -O ihex -R .eeprom $(MAIN_SKETCH).elf $(MAIN_SKETCH).hex

Ensuite j'ai transféré le fichier .hex comme précédemment indiqué.
Si ça peut servir à d'autres (pour info j'ai juste testé avec le programme blink.ino, renommé en blink.cpp auquel j'ai ajouté la ligne #include<Arduino.h> au tout début du fichier)