Charger un programme à partir d'une carte SD

Bonjour à tous,
Ainsi que je l'avais dis, j'ouvre un nouveau post qui fait suite à celui-ci :

Mon but étant toujours d’effectuer le chargement d'un sketch à partit d'une carte SD.
J'ai essayé d'assimiler tout ce qui se dit dans le post suivant :

Mais malheureusement, je suis un peu largué.
Ou est-ce que ça coince, je vais essayer d'être le plus clair possible

1 - je récupère les fichiers listés dans le post --> OK

  • mais ensuite qu'est ce que j'en fais ?
    --- Est ce que je dois créer une librairie, y inclure les fichiers, et la déclarer (include) dans mon programme ?

2 - Ensuite, il faut récupérer le fichier "NameBoardSketch.pde" --> OK

  • Je le charge dans l'IDE, le transfert, mais la, énormément de messages d'erreur.
    --- Il y a également un répertoire "BUILD" avec des fichiers "elf" et "hex" comme extensions; à quoi servent-ils ?

3 - Sur la carte SD, en plus de mon programme en HEX, doit-il y avoir autre choses ?

Dans un 1° temps, il me faudrait comprendre comment tout ceci doit s'imbriquer

Ci-dessous les erreurs générées lors de la compil de "NameBoardSketch.pde"

NameBoardSketch.pde:9:29: error: invalid suffix "boots" on integer constant
NameBoardSketch:9: error: stray '\' in program
NameBoardSketch.pde:373:661: error: invalid suffix "boots" on integer constant
NameBoardSketch.pde:384:113: error: invalid suffix "boots" on integer constant
NameBoardSketch:484: error: stray '#' in program
NameBoardSketch:484: error: stray '#' in program
NameBoardSketch:484: error: stray '#' in program
NameBoardSketch:582: error: stray '#' in program
NameBoardSketch:640: error: stray '\' in program
NameBoardSketch:644: error: stray '\' in program
NameBoardSketch:675: error: stray '\' in program
NameBoardSketch:679: error: stray '\' in program
NameBoardSketch:738: error: stray '\' in program
NameBoardSketch:742: error: stray '\' in program
NameBoardSketch:746: error: stray '\' in program
NameBoardSketch:750: error: stray '\' in program
NameBoardSketch:760: error: stray '\' in program
NameBoardSketch:764: error: stray '\' in program
NameBoardSketch:768: error: stray '\' in program
NameBoardSketch:772: error: stray '\' in program
NameBoardSketch:810: error: stray '\' in program
NameBoardSketch.pde:874:3: error: invalid preprocessing directive #This
NameBoardSketch:875: error: stray '##' in program
NameBoardSketch:876: error: stray '##' in program
NameBoardSketch:876: error: stray '##' in program
NameBoardSketch:876: error: stray '##' in program
NameBoardSketch.pde:893:10: error: invalid suffix "a" on integer constant
NameBoardSketch.pde:894:10: error: invalid suffix "b" on integer constant
NameBoardSketch.pde:900:11: error: invalid suffix "a" on integer constant
NameBoardSketch.pde:901:11: error: invalid suffix "b" on integer constant
NameBoardSketch:918: error: missing terminating ' character
NameBoardSketch:929: error: stray '`' in program
NameBoardSketch:929: error: stray '`' in program
NameBoardSketch:929: error: stray '`' in program
NameBoardSketch:932: error: stray '

Bonne journée
JP in program
NameBoardSketch:935: error: stray '' in program NameBoardSketch:935: error: stray '' in program
NameBoardSketch:935: error: stray '' in program NameBoardSketch:951: error: stray '' in program
NameBoardSketch:951: error: stray '`' in program
NameBoardSketch:5: error: 'javascript' does not name a type
NameBoardSketch:4: error: expected unqualified-id before '<' token
NameBoardSketch:484: error: expected unqualified-id before '<' token
NameBoardSketch:484: error: expected unqualified-id before '<' token
NameBoardSketch:484: error: expected constructor, destructor, or type conversion before ';' token
NameBoardSketch:484: error: expected unqualified-id before '<' token


Bonne journée
JP

Bonjour,

bricopin:
1 - je récupère les fichiers listés dans le post --> OK

D'âpres ce que j'ai pu voir avec les erreurs de compilation tu n'as pas fait les choses correctement en récupérant le code source ...

Sur le repository github du projet tu doit (au choix) ;

  • faire un "git clone" (avec "git" sous linux ou "tortoisegit" sous windows)
  • demander à github de te faire une archive (bouton "ZIP")

bricopin:

  • mais ensuite qu'est ce que j'en fais ?
    --- Est ce que je dois créer une librairie, y inclure les fichiers, et la déclarer (include) dans mon programme ?

Tu n'as pas compris un truc manifestement ...

Un bootloader ce n'est pas un programme "arduino" classique.
C'est un programme bas-niveau AVR-C (pas arduino) qui est chargé dans une zone bien particulière de la mémoire flash.
C'est un programme totalement indépendant que tu doit compiler avec avr-gcc (en utilisant le makefile fourni) et envoyer sur la carte avec avrdude et un programmateur d'avr ICSP (usbtiny, usbasp, ou autre ...).

Le bootloader est lancé avant le programme utilisateur (dans le cas d'une carte arduino le programme utilisateur c'est un sketch arduino) qui ce charge de regarder si il n'y a pas de màj à faire du programme (ici via le port série et la carte sd) et si il n'y en a pas il lance le programme utilisateur.

bricopin:
2 - Ensuite, il faut récupérer le fichier "NameBoardSketch.pde" --> OK

  • Je le charge dans l'IDE, le transfert, mais la, énormément de messages d'erreur.

Voir point n°1, tu as du foirer un truc en récupérant les sources.
"NameBoardSketch.pde" a pour but de stocker dans l'eeprom le nom du fichier de mise à jour que tu va mettre sur la carte sd.

bricopin:
--- Il y a également un répertoire "BUILD" avec des fichiers "elf" et "hex" comme extensions; à quoi servent-ils ?

.elf -> fichier binaire ELF (code source compilé) avec les informations de debug et les symboles
.hex -> fichier Intel Hex qui est à charger dans la mémoire flash du microcontrôleurs avec avrdude

bricopin:
3 - Sur la carte SD, en plus de mon programme en HEX, doit-il y avoir autre choses ?

Non juste le .hex avec comme nom le nom que tu as programmé en EEPROM avec "NameBoardSketch.pde".

bricopin:
Ci-dessous les erreurs générées lors de la compil de "NameBoardSketch.pde"

Supprime les sources que tu as et re-télécharge les depuis git comme précisé dans le point 1, ya un truc qui va pas (t'as copié/collé le code à la main ?)

Je me suis fait griller par Skywodd :smiley:
Je complète ...

  1. Pour télécharger, dans GitHub, tu choisit l'onglet files puis tu navigue jusque dans le répertoire 2boots
    La tu clique sur l'icone ZIP en dessus
    Comme ca tu récupère un ZIP propre
    je n'ai aucun problème pour compiler le NameBoardSketch.pde

  2. Les fichiers HEX sont les fichiers de bootloader qui supportent le bootload à partir de la liaison série ET de la carte SD
    C'est l'un des fichiers HEX qu'il va falloir flasher en tant que bootloader suivant :

  • le chip : ATmega168 ou ATmega328p
  • la vitesse
  • la proche de chipselect utilisée pour la SD
    Si tu utilises sur ta carte un Atmega328p à 16MHz avec chipselect sur la broche 4, alors le bon bootloader est "2boots-arduino-atmega328p-16000000L-PD4.hex"
    Si tu utilises une autre broche, tu es partit pour avoir a recompiler le bootloader... Envisage de refaire ta carte pour utiliser la broche 4 :smiley:
  1. Maintenant il va falloir flasher le bootloader dans ton ATmega328p
    Pour cela il te faut :
  • Soit une autre Arduino en mode ArduinoISP
  • soit un programmateur USB type USBasp ou similaire

Qu'as tu à ta disposition ?

Merci de votre patience ;
Voila ou j'en suis ;.

  • Je possède un programmateur USBASP.
    1 - j'ai télécharger le "2boots" en Zip.
    -- Je récupère le fichier NameBoardSketch.pde, je le charge dans l'IDE, je le vérifie --> OK pas d’erreur.
    Par contre, en regardant ce qu'il y dans le listing, je vois qu'il écrit le nom (ARDUINO pour le moment) dans l'EEPROM (a priori aux adresses 0 à 8 )
    Or, mon programme écrit également des données dans l'EEPROM à ces adresses ; il faudra que je modifie mes adresses ?
    2 - Le fichier hex --> OK, j'ai besoin de lui (mais pas du elf)
    Donc :
  • Je Charge NameBoardSketch.pde sur ma Mega au travers de mon port série.
  • Je charge le bon fichier HEX avec mon prog USBASP
    -- Est-ce que l'ordre des opérations à une importance (NameBoardSketch.pde d'abord et le fichier HEX ensuite ou bien l'inverse) ?
    Bien, maintenant la ou j'ai besoin d'eclaircicement .
Les fichiers HEX sont les fichiers de bootloader qui supportent le bootload à partir de la liaison série ET de la carte SD
C'est l'un des fichiers HEX qu'il va falloir flasher en tant que bootloader suivant :
- le chip : ATmega168 ou ATmega328p
- la vitesse
- la proche de chipselect utilisée pour la SD
Si tu utilises sur ta carte un Atmega328p à 16MHz avec chipselect sur la broche 4, alors le bon bootloader est "2boots-arduino-atmega328p-16000000L-PD4.hex"
Si tu utilises une autre broche, tu es partit pour avoir a recompiler le bootloader... Envisage de refaire ta carte pour utiliser la broche 4
  • Quel ship choisir pour une Mega 2560 ?
  • Comment connaitre la vitesse de ma carte ?
  • Le shipselect sur la broche X : a quoi sert cette broche et quelle est t' elle concrètement sur la carte
    JP

bricopin:
-- Je récupère le fichier NameBoardSketch.pde, je le charge dans l'IDE, je le vérifie --> OK pas d’erreur.
Par contre, en regardant ce qu'il y dans le listing, je vois qu'il écrit le nom (ARDUINO pour le moment) dans l'EEPROM (a priori aux adresses 0 à 8 )
Or, mon programme écrit également des données dans l'EEPROM à ces adresses ; il faudra que je modifie mes adresses ?

Revérifie le code mais d'après le ReadMe, il est sensé écrire à partir de la fin dans les 8 derniers octets.

2 - Le fichier hex --> OK, j'ai besoin de lui (mais pas du elf)
Donc :

  • Je Charge NameBoardSketch.pde sur ma Mega au travers de mon port série.
  • Je charge le bon fichier HEX avec mon prog USBASP
    -- Est-ce que l'ordre des opérations à une importance (NameBoardSketch.pde d'abord et le fichier HEX ensuite ou bien l'inverse) ?

D'abord NameBoardSketch pour que le nom soit écrit
Puis flashage du bootloader

  • Quel ship choisir pour une Mega 2560 ?

Ah.
Tu fait pas les choses à moitié.
Pas de version précompilé pour la 2560, va falloir que tu te compiles toi même le bootloader.
Il faut regarder comment marche le makefile et s'il supporte la 2560.
Si tu coinces la dessus, je regarderais

  • Comment connaitre la vitesse de ma carte ?

Si tu sais pas c'est que tu veux aller à fond : 16MHz

  • Le shipselect sur la broche X : a quoi sert cette broche et quelle est t' elle concrètement sur la carte

La carte SD est reliée au port SPI (port ICSP ou broches dans les 52, ... sur la MEGA) : SCK, MISO, MOSI + une broche de chipselect (CS). Celle que tu utilises normalement quand tu fait un SD.begin(4);
Par défaut les bootloaders précompilés supposent que tu utilises la broche 4 (Port D, pin 4 = PD4)
Si tu utilises une autre broche que PD4, pareil il faut indiquer au makefile quand tu va recompiler le bootloader

RE,
Bon, il y a des choses que je commence à comprendre ...

Revérifie le code mais d'après le ReadMe, il est sensé écrire à partir de la fin dans les 8 derniers octets.

Exact, tu as raison

D'abord NameBoardSketch pour que le nom soit écrit Puis flashage du bootloader

OK, c'est ce que je ferais.

Quel ship choisir pour une Mega 2560
--> Tu fait pas les choses à moitié

Obligé car lié aux nombres d'entrées/sorties (48 nécessaires)

Comment connaitre la vitesse de ma carte ?
--> Si tu sais pas c'est que tu veux aller à fond : 16MHz

OK, ce sera donc 16MHz

Et des choses que je ne comprends pas encore....

Pas de version précompilé pour la 2560, va falloir que tu te compiles toi même le bootloader.
Il faut regarder comment marche le makefile et s'il supporte la 2560.
Si tu coinces la dessus, je regarderais

La pour le moment je suis totalement ignare.

La carte SD est reliée au port SPI (port ICSP ou broches dans les 52, ... sur la MEGA) : SCK, MISO, MOSI + une broche de chipselect (CS).

Sur l'exemple "ArduinoIsp", on voit que les 4 broches utilisées pour une Mega sont :

// 
slave reset :  -> 53 
MOSI:           -> 51 
MISO:           -> 50 
SCK:            -> 52

Est ce que la broche 53 (slave reset) est celle qui correspond à la broche de chipselect (4) dont tu parles
JP

bricopin:
Sur l'exemple "ArduinoIsp", on voit que les 4 broches utilisées pour une Mega sont :

// 

slave reset :  -> 53
MOSI:          -> 51
MISO:          -> 50
SCK:            -> 52



Est ce que la broche 53 (slave reset) est celle qui correspond à la broche de chipselect (4) dont tu parles

Non, ca c'est le SPI en tant que ICSP (bus de programmation).

Quand tu utilises un périphérique SPI telle que le chip Ethernet ou une carte SD, les périphériques partagent tous SCK, MOSI, MISO mais le chip-select est individuel par composant. La botion de "bus" en électronique signifie que les signaux de communication sont partagés. Mais il faut quand même que chacun sache si on s'adresse à lui ou pas.
Sur le bus I2C qui est aussi un bus série, l'adresse du périphérique est transmis sur la liaison série.
Sur le us SPI, chaque périphérique à une broche de chip-select qu'il faut mettre au niveau bas pour dire "he, c'est à toi que je cause".
Corrollaire : qu'un seul chip select ne peut être actif à la fois.

Regarde comment est fait le shield Ethernet+SD (schéma électronique). Le chip WIZ et la carte SD se partagent SCK, MOSI, MISO mais la broche 4 est utilisée pour le chipselect de la carte SD et la broche 10 (de mémoire) pour le chip ethernet.
D'où les lignes respectives dans le code :
SD.begin(4) pour la carte SD
Pour Ethernet, c'est implicite (codé en dur dans la lib Ethernet) : broche 10.

Apparemment, il va falloir te donner un coup de main sur le bootloader.
Est-ce que tu utilise un shield Ethernet standard (WIZ + Carte SD) sur ta Mega ?
Donc on considère chipselect de la SD sur la pin 4 ?

je regarde cela plus tard dans la soirée. Pour l'instant je suis en train de faire 3 autres trucs en même temps :wink:

Re

apparemment, il va falloir te donner un coup de main sur le bootloader.
Est-ce que tu utilise un shield Ethernet standard (WIZ + Carte SD) sur ta Mega ?
Donc on considère chipselect de la SD sur la pin 4 ?

Non, juste un module carte SD -- http://www.frduino.com/module/dfr0071.html#BtnAddCart
Le probleme, c'est que j'ai un PCB qui dispatche toutes mes entrées/sorties qui est positionné sur la Mega.
Le routage des pistes fait que mes broches du module SD sont associées a la Mega de cette façon :
Module SD --> Mega
MISO --> broche 44
SCK --> broche 42
SS --> broche 40
MOSI --> broche 38
et je ne peux pas modifier le routage

bricopin:
Module SD --> Mega
MISO --> broche 44
SCK --> broche 42
SS --> broche 40
MOSI --> broche 38

Pas possible : SCK, MISO, MOSI sont des broches hardware dédiées du chip. Tu dois impérativement utiliser les broches 50 à 52. Tu n'as pas le choix.
Pour la briche SS (chipselect) tu peux prendre n'importe quelle broche I/O.

Re,
Bon, comme ça c'est clair.
Pour le moment je ne vois pas trop de solution de contournement.
Je cherche ....
JP

Hello,
Après avoir tourné le problème de tout les cotés, voila la seule piste (éventuelle) qui pourrait me sortir d'affaire :
1 - je ne peux absolument pas récupérer les bornes 50 à 53 pour y connecter le module SD.
2 - je peux , en modifiant complétement mon PCB, me servir du connecteur 6 broches ICSP.
3 - Si je me sers de ce connecteur, est-ce que tout ce qui vient d'être dit dans ce post reste valable.
4 - Si oui, Barbudor, ton aide me sera précieuse.

Apparemment, il va falloir te donner un coup de main sur le bootloader.

Je ferais les essais sur la Méga nue (sans mon PCB) et si c'est OK, je referais développer mes PCB.
Bonne journée à tous
JP

bricopin:
1 - je ne peux absolument pas récupérer les bornes 50 à 53 pour y connecter le module SD.
2 - je peux , en modifiant complétement mon PCB, me servir du connecteur 6 broches ICSP.
3 - Si je me sers de ce connecteur, est-ce que tout ce qui vient d'être dit dans ce post reste valable.

Mmmoui mais non car le connecteur ICSP est relié aux broches SCK, MISO, MOSI et donc aux broches 50 à 52

Retour au point de départ.

Je regarde le bootloader ce soir. Trop de trucs hier.

Salut Barbudor
Eh bien, puisqu'il n'y a pas d'autre solution, je vais donc modifier et le PCB et le programme.
De ce fait, je vais donc câbler mon module SD aux broches 50 à 52.

slave reset :   -> 53 
MOSI:           -> 51 
MISO:           -> 50 
SCK:            -> 52

Et merci
JP

Bonjour à tous,
J'ai donc modifié mon programme et je viens de passer commande pour mon nouveau PCB.
Mais , Barbudor, je peux, si tu as une solution pour le bootloader faire les essais sur la Méga nue en attendant.
JP

Un peu débordé cette semaine, j'arrive pas à tenir mes promesses....
Je vais faire de mon mieux

Salut Barbudor,
Loin de moi l'idée de t'imposer quoique ce soit.
Je m'estime déjà suffisamment heureux que les intervenants de ce forum prennent le temps de se pencher sur mon problème.
Bonne soirée à tous
JP

Bon

J'ai d'une part essayé de convertir le Makefile linux en fichier de commande windows pour builder le bootloader
Et j'ai aussi du reprendre un peu stk500v1 pour la mega2560.
Ca compile et génère un HEX mais je suis pas encore sur que ce soit bon
Voici déjà ce que j'ai fait

Demain je regarde pour faire un board.txt adapté pour facilement flasher la Mega2560

winbuild.cmd (1.63 KB)

stk500v1.c (10.4 KB)

Bonjour à tous,
Bonjour Barbudor, je sais , ce n'est pas très poli de faire cette démarche mais bon...
As tu trouvé une solution au problème de chargement à partir de la carte SD ?
Bonne journée
JP

J'ai malheureusement un peu trop rapporté de boulot à la maison ces derniers jours, ne laissant pas trop de temps pour la bricole.
J'espérais aussi qu'une âme bienveillante jète un coup d'oeil a ce que j'ai fait pour confirmer...
je vais essayer de m'y remettre cette semaine

A vrai dire, j'ai quand même essayé de comprendre un peu tout ça.
Mais, ça dépasse de beaucoup mes compétences.
JP