Récupérer le programme enregistré sur une carte Arduino Mega

Bonjour à tous, je viens vous demander s'il est possible de récupérer un programme enregistré sur ma carte Arduino Mega 2560 ??

Mon problème étant que suite à une défaillance de disque dur j'ai perdu tout mes programmes... =( et donc j'aimerais récupérer la dernière version d'un programme qui est encore enregistré sur la carte!

Je n'ai pas trouvé la réponse à ma question sur internet, c'est pourquoi je fais appel à vous, espérant fortement trouver la solution :D

Cordialement

maxime

Je suis pas du tout spécialiste, mais je pense qu'au mieux, tu peux peut être récupérer le code en .hex, ce qui doit revenir à avoir le code en langage machine...

Le reconvertir en C, ça doit pas être évident quand on ne connait pas trop ce langage

onemaxshow désolé mais c'est quasiment impossible ... en fait techniquement c'est possible, mais c'est tellement complexe que j'ai jamais vu quelqu'un le faire ... et je pense que si ce quelqu'un avait réussi il aurait fait un programme pour le faire partager à tout le monde xD

A ta place j’essaierais plutôt de récupérer les donnée perdue de ton disque avec un logiciel de récup type easyrecovery à moins que ton disque soit vraiment mort ?

Je suis à des années lumières d’être un spécialiste en micro mais justement comme je n’y connais rien je me documente.
Et pour occuper mes soirées d’automne j’ai récupéré la doc d’avrdude grace à Monsieur google.

Toujours pour essayer de comprendre j’ai passé l’IDE Arduino en mode verbose pour récupérer la ligne de commande avrdude qui est pour moi avec Linux et un UNO :

$avrdude -C/usr/share/arduino/hardware/tools/avrdude.conf -v -v -v -v -p atmega328p -c arduino -P/dev/ttyACM0 -b115200 -D -U flash:w:/temp/buildxxxx/Blink.cpp.hex:i

Les options utilisées par l’IDE arduino sont :
-C ? adresse du fichier avrdude.conf
-v mode verbose (-v bavardage minimal ; -v-v-v-v bavardage maximal)
-p ? modèle du micro
-c ? modèle du programateur
-P ? port utilisé
-b ? débit série
-D ? désactive l’effacement automatique de la mémoire flash
-U ?
flash ? type de mémoire utilisée
w ? lit le fichier et en écrit le contenu dans la mémoire
r ->“read the specified device memory and write into the specified file”
/temp/…/ xxxxxx.hex ? adresse du fichier à transférer.
i ? précise le format ihex (Intel)

La ligne en rouge devrait correspondre à ton besoin, je ne l’ai pas traduite pour éviter de faire une erreur

Cela ne te redonnera pas le source du code mais tu pourras archiver le fichier hex

En pj la doc avrdude

avrdude-doc-5.11.1.pdf (237 KB)

ensuite pour désassembler il existe deux ou trois projets sur le net, de mémoire c'est les projet revava et avra ... @+

Bonjour

Une fois l’extraction du .hex proposée par 68tjs réalisée il est possible de désassembler avec les outils disponibles dans Arduino. Dans le même répertoire qu’avrdude on trouve l’utilitaire avr-objdump Il est surtout utile pour désassembler du code objet (.elf) mais fait aussi ce qu’il peut avec un .hex

Ceci pour montrer le point le plus ‘haut’ où l’on peut remonter à partir d’un code machine extrait : un source en assembleur ‘brut’ … sans étiquettes, sans noms de variables… juste le code machine représenté par les mnémoniques et les valeurs des données manipulées. (blink.asm joint).
C’est tout ce qu’on peut espérer récupérer.

Exemple (sous xp) :
-j’ai mis blink.hex (blink.cpp.hex renommé blink.hex) dans le répertoire d’avrdude et avr-objdump pour faciliter la manip’
-j’ai lancé en ligne de commande :

C:\Program Files\arduino-0022\hardware\tools\avr\bin>avr-objdump -j .sec1 -d -m avr5 blink.hex >blink.asm

(l’option -j .sec1 n’était pas documentée mais une recherche (mots clefs “obj-dump dissassemble” a donné rapidement ce lien: http://www.avrfreaks.net/index.php?name=PNphpBB2&file=printview&t=35023&start=0

/!\ le blink.hex traité içi n’a pas été extrait du micro, c’est le fichier destiné à etre envoyé par avrdude pour programmer la puce. Un fichier .hex extrait serait beaucoup plus long !!

obj-dump.gif

blink.asm (15.2 KB)

démarrage.gif

onemaxshow: Bonjour à tous, je viens vous demander s'il est possible de récupérer un programme enregistré sur ma carte Arduino Mega 2560 ??

Mon problème étant que suite à une défaillance de disque dur j'ai perdu tout mes programmes... =( et donc j'aimerais récupérer la dernière version d'un programme qui est encore enregistré sur la carte!

Je n'ai pas trouvé la réponse à ma question sur internet, c'est pourquoi je fais appel à vous, espérant fortement trouver la solution :D

Hello Maxime

Comme l'a dit quelqu'un ci-dessus, ce que tu peux récupérer, c'est le programme en fichier .hex, c'est-à-dire compilé. Comment le récupérer ? Pour cela, tu as besoin d'un programmateur (USBasp, AVRISP mkII, STK500, Ponyser ou autre, pour ne citer que les plus courants). A noter qu'un deuxième arduino peut être utilisé comme programmateur et qu'il n'est pas difficile de s'en fabriquer un soi-même si tu bricoles un peu l'électronique. Que peux-tu faire avec le fichier.hex récupéré ? Tu peux le renvoyer dans autant d'atmega que tu veux, qui tourneront alors comme ton programme actuel. Mais tu ne pourras jamais lire la source du programme car elle est restée sur ton disque dur.

Il n'est pas possible de retransformer en langage C un programme compilé. A l'aide d'un dé-assembleur, on peut retransformer un programme compilé en assembleur mais c'est encore à mille lieues du programme C d'origine.

Bon, ça confime ce que je pensais, donc au mieux (au plus simple plutot), tu peux changer de broches quelques composants, ou si y a une erreur du genre t'as écrit "if(a==0)" au lieu de "a!=0", mais bon, faut encore trouver la bonne ligne, et franchement assembleur, c'est pas évident du tout quand on y connait rien...

y'a des outils (mais il me donne pas les noms originel des var ... du style ma var dans mon source est int led dans le code generé j'ai un int v_g1 ) l'outil que j'utilise est vendu par microAPL ( http://www.microapl.co.uk/ )

Apprendre l'assembleur peut faire peur mais normalement avant de faire du c sur un micro il vaut mieux le connaitre ! En plus en c tu peux tres bien appelé de l'asm ...

@+

autre truc ? que JM n'a pas preciser, si le blink.hex provient d'arduino il faut pas oublier d'installer le bootloader sur les atmega ...

goabonga:
autre truc ? que JM n’a pas preciser, si le blink.hex provient d’arduino il faut pas oublier d’installer le bootloader sur les atmega …

Bien sûr. Mais avec un programmateur, cela ne pose aucun problème.

Mais au fait, quelqu’un a-t-il déjà essayé de charger un programme .hex provenant d’un Arduino dans un Atmega sans bootloader ?
D’une manière générale, un bootloader sert à entrer en communication avec le PC immédiatement après un reset et si un programme est à charger, il se charge de l’envoyer dans la mémoire flash puis il passe la main au programme chargé. Si aucun programme n’est disponible venant du PC, le bootloader passe directement la main au programme en mémoire. Pendant que ce programme se déroule, le bootloader n’intervient pas. Donc, il me semble que sur le plan théorique, rien ne s’oppose à ce qu’un programme arduino tourne sur un Atmega sans bootloader.

Bon, on discute mais le plus comique c’est que le gars qui a lancé le topic reste muet comme une carpe depuis 5 jours. Peut-être qu’en essayant de suivre nos conseils, il a fait sauter son PC. :wink:

Mais au fait, quelqu'un a-t-il déjà essayé de charger un programme .hex provenant d'un Arduino dans un Atmega sans bootloader ?

Des élements 'théoriques' de réponse se trouvent dans la documentation Atmel (note app AVR109) Le code produit par Arduino peut fonctionner tel quel avec ou sans présence de bootloader (adresse 0). Si un bootloader est implanté ET que le fusible BOOTTRST est activé le bootloader aura la main au reset, jouera eventuellement son rôle avant de lancer le programme lui même implanté à l'adresse 'normale'

Un certain Jean-Marie (Arlon,Belgique lui aussi) :) à traduit la note d'application AVR109 d'Atmel qui décrit le principe de fonctionnement du 'bootloading' sur AVR. Qu'il en soit içi remercié !!! http://www.atmicroprog.com/forum/viewtopic.php?t=1097

goabonga: Apprendre l'assembleur peut faire peur mais normalement avant de faire du c sur un micro il vaut mieux le connaitre ! En plus en c tu peux tres bien appelé de l'asm ...

:astonished:

Heu.. tu pousses un peu quand même... On vit très bien sans. C'est sans doute un très grand avantage pour apprendre le C, mais de là à conseiller l'asm avant de toucher a C, c'est un peu comme dire qu'il faudrait apprendre à faire du feu avec des silex avant d'utiliser un briquet ]:D

al1fch:
Un certain Jean-Marie (Arlon,Belgique lui aussi) :slight_smile: à traduit la note d’application AVR109 d’Atmel qui décrit le principe de fonctionnement du ‘bootloading’ sur AVR.
http://www.atmicroprog.com/forum/viewtopic.php?t=1097

Putin ! J’avais complètement oublié que j’avais fait ce petit travail.
En plus, j’ai eu un crash de disque dur depuis cette époque, de sorte que je n’avais plus ce texte. Merci, al1fch, de l’avoir retrouvé. Et bonne lecture à ceux qui pataugent dans les notions de bootloader.

Je suis quand même curieux d’essayer de faire tourner un programme arduino sur un Atmega sans bootloader. Je range cette idée dans mes priorités à court terme.

n'oubliez pas que lors de la compilation avec arduino vous utilisez un tas de fichier permettant de faire communiquer votre scketch avec votre bootloader ! ( Serial .... ) ??? regardez tous ce qu'il faut linker et dans le dossier https://github.com/arduino/Arduino/tree/new-extension/hardware/arduino/cores/arduino

Pour le coup de l'asm , je donne juste un conseil, sa aide vraiment a comprendre le fonctionnement d'un micro... Sa permet de comprendre ce que tu fais lorsque tu écris en c .. Je peut te conseiller aussi d'utiliser un emulateur ....

goabonga: n'oubliez pas que lors de la compilation avec arduino vous utilisez un tas de fichier permettant de faire communiquer votre scketch avec votre bootloader ! ( Serial .... ) ???

Hello goabonga, Tous ces fichiers interviennent lors de la compilation du programme (du sketch, pour parler le dialecte Arduino). Ces fichiers n'interviennent absolument pas dans la communication avec le bootloader.

La compilation et le "linkage" aboutissent à la production d'un seul ficher .hex.

C'est le programme Avrdude qui se charge de communiquer avec le bootloader et qui lui envoie le fichier .hex

Le bootloader quant à lui transfert le fichier .hex à sa place dans la mémoire flash.

Dans l'environnement Arduino, on ne voit pas l'usage de Avrdude. Cela se passe "sous la table" et est transparent à l'utilisateur. Par contre, en-dehors de l'environnement Arduino, on doit manipuler soi-même Avrdude (ou un autre logiciel de flashage).

Avrdude est capable de communiquer avec le bootloader. En l'absence de bootloader, Avrdude doit avoir un programmateur hardware pour pouvoir envoyer le fichier .hex à l'Atmega.

Arduino lors de la compilation d'un scketch utilise bien ces fichier ( meme tu devrais retrouver des .a ) si tu me crois pas regarde comment compiler sans passer par arduino-ide !

goabonga: Arduino lors de la compilation d'un scketch utilise bien ces fichier ( meme tu devrais retrouver des .a ) si tu me crois pas regarde comment compiler sans passer par arduino-ide !

Hello goabonga, Tout à fait d'accord avec toi. Ces fichiers interviennent bien dans la compilation du sketch. C'est d'ailleurs ce que je te disais dans la première phrase de ma réponse ci-dessus.

Par contre, ces fichiers ne sont pas transmis à l'atmega. Seul le fichier .hex (qui est le résultat de la compilation) est transmis à l'Atmega grâce au couple Avrdude-Bootloader ou Avrdude-Programmateur s'il n'y a pas de bootloader.

Autrement dit, les fichiers ".c", ".h" ou "*.a" servent à produire le fichier .hex mais restent sur le PC et Avrdude ne s'occupe pas de ces fichiers.