MAJ du programme via carte SD avec avr_boot sur ATMega328P

Salut les amis,

Je vais essayer de décrire ma problématique simplement. J'ai deux programmes principaux et aimerais pouvoir passer de l'un à l'autre via MAJ depuis une carte microSD. Actuellement mon montage est sur breadboard et je n'ai aucun problème particulier, les programmes fonctionnent, etc. Seul souci : je n'arrive à flasher le programme depuis la carte SD qu'une seul et unique fois. Explication :

1/ Je flash le bootloader avr_boot sur mon ATMega328P-PU placé sur breadboard via un Arduino UNO en ISP (tout est OK).
2/ Au démarrage (en condition réel d'utilisation - toujours sur breadboard) l'un des deux programmes est flashé depuis la carte microSD.
3/ Le programme ainsi installé démarre et fonctionne.
4/ Impossible de remplacer le programme (en redémarrant avec l'autre programme placé sur la SD), à chaque tentative, il semble ne rien se passer, le premier programme flashé démarre et fonctionne.

Je sais que les deux fichiers FIRMWARE.BIN sont corrects puisque l'un ou l'autre est bien installé tant qu'il passe en premier.

Mes programmes n'utilisent pas le lecteur SD.

Voici les valeurs de fusible après installation du bootloader :

lfuse → 0xf7
hfuse → 0xd8
efuse → 0xfd
lock → 0xff

J'ai tenté de passer lock en 0xef juste après installation du bootloader mais cela ne change rien.

Évidemment, pour obtenir mes fichiers FIRMWARE.BIN, j'utilise bien le fichier .hex sans bootloader.

Ayant épuisé les idées de test, j'ouvre ce sujet en espérant que de nouvelles pistes se réveillent.

Merci d'avance pour votre aide :wink:,

c'est un cold boot ou vous avez vraiment couper totalement l'alimentation ? (en débranchant réellement l'alimentation du montage quelques secondes)

Je ne connais pas le terme cold boot mais j'imagine qu'il parle de lui-même. Dans tous les cas (premier flash qui fonctionne et second où il ne se passe rien), l'alimentation du montage est coupée (plusieurs secondes voire minutes) avant mise en place de la microSD, puis allumage.

de mémoire il me semble qu'il y a un mode où le boot loader peut donner des infos sur le port série. Il faudrait le recompiler avec USE_UART ou un truc comme cela réglé sur le diviseur correspondant à votre fréquence et regarder ce que ça dit au démarrage lors de votre second essai

Sinon quel est le formatage exact de votre carte microSD (FAT16, FAT32 ou exFAT ?) et comment procédez vous concrètement pour remplacer FIRMWARE.BIN entre vos deux essais, écrasement direct du fichier, suppression puis recopie, ou reformatage complet de la carte à chaque fois. Utilisez vous la même carte physique pour les deux essais ou deux cartes distinctes ?

Effectivement, j'ai déjà lu un truc là-dessus, malheureusement cela dépasse mes compétences actuelles :sweat_smile:.

Pour tous mes tests, j'utilise la même carte microSD de 2G que je formate entre chaque opération avec SD Card Formatter (FAT16). Formatage rapide ou complet, j'ai testé les deux.

Avez vous essayé avec deux programmes très simples genre blink à une vitesse lente et un autre à vitesse rapide ?

Peut on voir une photo nette du montage ?

Vous êtes sur Windows ou sur un Linux / Mac ?

Merci pour votre aide.

Après réflexion, je vais réorienter cet aspect de mon projet. Je ne suis vraiment pas convaincu par ce système de bootloader.

EDIT : Pour répondre quand même, je suis sur Windows 11 et mon montage n'a vraiment rien de spécial. J'utilise les broches SPI par défaut. Étant donné que je n'ai pas d'autre souci et que j'arrive à lire et écrire des donnés sur la carte SD avec un sketch de test, je suis convaincu que le montage n'est pas en cause.

Quel est le besoin exactement ?

Pour moi quand un petit projet a besoin de permettre à quelqu’un de faire une mise à jour du code sans passer par l’IDE, je prends un ESP32 et je fais un mode « over the air » - en WiFi

Sur les petits 328p c’est pas vraiment fait pour

J'ai édité mon précédent message pour répondre (en partie du moins) à vos questions.

Je pense qu'effectivement le ESP32 serait mieux en théorie. En pratique, je débute, et mon alimentation (que je ne peux modifier car elle vient d'un autre outil sur lequel se branche ma carte) est en 5v et pour le moment, je préfère éviter de devoir adapter les tensions.

Vous pouvez prendre une carte ESP avec un port USB et elle contient le convertisseur

PS

Vaut mieux répondre dans le fil de la discussion car d’une part je ne vais pas tout relire pour trouver ce qui a changé et quelqu’un qui arrive et lit la conversation ne comprendra pas pourquoi je pose des questions puisque l’info est déjà là

Mon objectif est d'aller vers la fabrication d'une PCB perso. Mon premier prototype utilisait un NANO. Maintenant je veux éviter les modules tout fait intégrant le microcontrôleur.

Si je teste un ESP32, je devrais ajouter régulateur et convertisseur de niveaux (si je ne me trompe pas). Possible que je m'y mette plus tard mais je vais d'abord continuer avec l'ATMega328P encore quelque temps.

OK - pas de souci.

Pour info, je n'ai pas réussi à faire fonctionner correctement avr_boot, ni l'alternative 2boots d'ailleurs :sweat_smile:.

Depuis, j'ai opté pour une seconde puce qui met à jour la première. Avantages : il n'y a plus de restriction liée à la taille maximale de la section bootloader et c'est moins limité en terme de compatibilité avec les différents modèles de carte microSD. Inconvénients : davantage de composants, complexification du câblage et forcément ça consomme plus. Prochaines étapes, essayer de mettre en veille cette seconde puce et couper l'alimentation du lecteur de carte lorsqu’ils ne sont pas sollicités pour les besoins d'une MAJ (dans le but évident de réduire la consommation d'énergie).

Concernant la mise en veille, il me semble que l'ATMega328P a un mode Power-Down pilotable depuis le code. Pour l'alimentation du lecteur SD, je pense utiliser un transistor MOSFET (à canal N).

Tout ça me paraît encore un peu compliqué mais je peux toujours tenter le coup :grin:.

Quand je veux piloter l'alim de quelque chose un peu compliqué, je ne me casse pas trop la tête et je prends un power switch de chez pololu, par exemple le Mini Pushbutton Power Switch, il y a plusieurs modèles

Vous avez une broche (et un bouton physique) pour l'activer et vous pouvez l'éteindre par logiciel et une fois que vous avez coupé le jus le composant lui même consomme moins de 10 nanoampères.

Merci pour le conseil. J'ai déjà commandé un lot de transistors, alors je vais faire comme prévu mais ça pourra me servir plus tard :wink:.

Le vrai avantage du module Pololu c'est quand on veut reproduire un comportement de bouton d'alimentation avec latch matériel et extinction logicielle contrôlée par le microcontrôleur lui même, notamment pour l'alimentation principale d'un appareil sur batterie.

si c'est pas dans les besoins, effectivement un simple MOSFET suffit largement pour ce que vous voulez faire et coûte beaucoup moins cher.

Ça a l'air vraiment pas mal. Je garde l'idée pour de futurs projets.