Comment splitter un programme long en fichiers à inclure ...

Bonjour à tous et à toutes.

J'ai fait un petit détour par la case présentation. :slight_smile:

Je travaille actuellement sur un projet ambitieux dans lequel je code un séquenceur propriétaire mêlant C et assembleur puis des interruptions. Jusque la tout va très bien, ca marche comme sur le papier.

Le code atteint les 1000 lignes (bon il est aéré) et j'en ai encore 1500 - 2000 à rajouter. Savez vous comment je pourrait externaliser sous forme de .h, de .txt ou autre des parties du code afin de le rendre plus lisible ?

L'environnement ARDUINO 1.03 n'accepte pas qu'il y ait un autre fichier dans le même répertoire. Maintenant c'est un constat d'un newbiz et bien entendu c'est archi faux. Mais ca suffit pour me bloquer. Je développe sur d'autres plateformes et c'est une formalité. Bon j'ai appris le software en autodidacte alors des subtilités m'échappent. J'implore votre aide afin de ne pas perdre une journée de plus à rechercher sur internet comment faire.

Par avance merci et désolé si la réponse est enfouie quelque part sur le forum. Je n'ai pas trouvé.

Sinon je suis à l'aise en conception électronique donc à charge de revanche :blush:

Salut,
c'est vraiment tout simple, pas besoin que les deux (ou plus ;))fichiers soient dans le même répertoire :
fais juste ça :

#include <LeCheminCompletDeTonFichierIci>

(mais sinon c'est vrai que c'est bizarre que l'on ne puisse pas mettre deux fichiers dans le même répertoire... Merci la team Arduino :roll_eyes:)

J'ai essayé un truc dans le genre mais ça n'a pas fonctionné. Je réessaye parce que lorsqu'on tente plein de trucs des fois on ne sait plus vraiment comment ou ce qu'on a fait au final.

Dans le fichier à inclure j'ai des choses comme const byte blabla = xxx;

Je me rappelle avoir essayé des trucs comme

#include
#include <c:.....\monfichier>
#include <.\monfichier>
#include <.\REPERTOIRE PARENT\monfichier>

et la même chose entre guillemets

#include "monfichier"

Merci du passage.

Bon je vient de réessayer ça

#include

pour externaliser un truc qui marche très bien à l’intérieur du programme, une 30 aine de déclarations du genre :

const byte monlabel = 0x41;

J'ai besoin d'optimiser la RAM au chausse pied donc lorsque je compare un byte à une valeur définie en const je veut être certain qu'il ne cast pas par défaut en quelque chose de plus gros et que c'est des byte qu'il traite.

Il me renvoie le message lorsque je le met dans un autre fichier :

byte does not name a type ....

J'ai donc tenté un truc qui passe à la compilation, mais dont évidemment je n'ai aucune idée du comportement :

#define monlabel (byte)0x41

Donc un cast systématique

Je suis vraiment dans la galère parce que la c'est juste pour une série de déclarations. Comment ca va être lorsque je vais m'attaquer aux fonctions à externaliser.

J'ai juste besoin d'un truc qui fait comme si on ramenait un morceau de texte dans un autre ... bref comme on en voit partout sauf peut être ici ... :*

J'ai 2 plateformes hardware à gérer, donc le but c'est de faire un truc avec un commutateur :

#include
#ifdef plateforme1
#include
#else
#include <l'autre partie plateforme2>
#endif

void setup ()
{

mes références aux inclusions précédentes (fonctions / données etc ...)

}

void loop ()
{

mes références aux inclusions precedentes (fonctions / données etc ...)

}

Je suis preneur de tout exemple ou conseils qui me permettraient de développer comme je l'ai toujours fait sans avoir à passer des heures sur des problèmes de ce genre ... Je sait que c'est possible mais je me demande si les exemples que j'ai vu n’étaient pas fait sous un environnement différent de celui d'ARDUINO.

Naviguer dans 1000 lignes de code à la suite c'est ingérable. La je vais tripler ca ...

Bon si c'est le prix à payer pour utiliser ce micro je n'ai pas le choix j'ai trop investit d'argent dans ce projet.

Oui je suis désespéré ......... =( comme dirait lilou dans le 5éme élément please help ...

[Mode humour ON]

Sur ce je vais continuer sur mon modèle de développement digne de la préhistoire : codage linéaire dans la même fenêtre en déplaçant en bas de page tout ce qui est codé. C'est possible qu'on me renvoie un message du genre trop de caractères dans une seule fenêtre. Tant qu'à faire autant boire le calice jusqu'à la lie comme on dit.

Salut,
Je ne suis pas sur de tout avoir compris dans ton dernier message, mais en gros :
tu inclus le fichier comme ça :

#include <C:/.../tonFichier.ino> //(ou .txt, ou .toutCeQueTuVeux, tant que le fichier est en ASCII)

Ainsi, lors de la compilation, le contenu du fichier inclus sera exécuté à l'endroit ou il est inclus.
Cependant, je te conseille de l'inclure tout au début du code "principal" et de créer des fonctions que tu mettras dedans ; et après tu n'aura plus qu'à les appeler dans le code principal. Tu peux aussi créer un tel fichier juste pour regrouper les déclarations de variables si tu préfères ; dans tous les cas la méthode est le même.

EDIT : j'ai oublié de préciser qu'il faut que tu lances la compilation à partir du fichier principal (et avant n'oublies pas d'enregistrer les dernières modifications effectuées sur les fichiers inclus ;)).

C'est bien ca que j'ai essayé et qui ne fonctionne pas chez moi. :* .

Pour moi #include c'est juste pour dire insère du "texte" à un endroit.

Comment peut t'on transférer facilement un fichier .hex dans ARDUINO avec le bootloader ?

La on part du .ino qu'on compile puis on fait téléverser mais j'aimerais partir du .hex. Avec un peu de chance je pourrait trouver un environnement de développement moins capricieux à moins qu'il y ait un bug avec Windows seven. Bref quand ca marche avec tout les autres IDE sauf celui la je me dit que peut être ca ne vient pas que de moi ...

C'est dingue le temps qu'on perd sur des trucs sans intérêt ...

Merci d'avoir pris le temps de répondre.

L'IDE est spécial.
Comme tout le monde au début, tu t'es fait avoir en croyant que c'était un IDE arduino et bien non.
Il s'agit en fait de l'IDE processing qui a été décliné en différentes version: Wiring, Arduino, ChipKit, Texas-Energia etc....
Les informations sont plutôt à chercher du coté de Processing.

Ce que je peux dire, et que j'ai découvert empiriquement, c'est que ce que tu veux faire est possible dans l'IDE "Arduino" à condition de respecter certaines contraintes.
Le multi fichier est possible en créant des onglets. Tu ouvres ton projet et tu créé des onglets. A la création il suffit d'indiquer le nom de l'onglet sans extension, c'est l'IDE qui l'ajoutera.
Point très important à comprendre: il ne s'agit pas d'inclusion mais de concaténation.
L'IDE range les onglets par ordre alphabétique et avant la compilation il les ajoute les uns après les autres, c'est totalement différent de ce que peut faire Eclipse ou Code::blocks.
Exemple si tu crée un onglet "setup" et un autre "loop", loop sera bêtement ajouté avant setup
On reste dans un système de programmation "Arduino".

L'astuce que j'ai mis en œuvre pour forcer l'ordre dans la concaténation tout en gardant de la souplesse pour le choix du nom est de préfixer les noms d'onglets par une lettre :
a_setup
b_loop
etc.........

PS :
Si tu préfères utiliser un éditeur externe (celui de l'IDE est vraiment pas terrible) il est plus simple de créer les onglets dans l'IDE Arduino et de basculer ensuite en éditeur externe.
Il existe aussi des plugins gérant l'avr-libc pour Eclipse et Code::blocks (multiplateformes) et bien sur avr-studio pour Windows

Salut

J'aime beaucoup ton explication :D. Je comprend mieux le comportement "assisté" de cet IDE. Je vais essayer de splitter par onglets et voir comment ça se passe à l'enregistrement. Ca serait vraiment du temps de gagné si je pouvait éclater ce programme de 2000 lignes maintenant ...

ARDUINO n'est pas fait pour les projets aussi ambitieux on dirait ... Je mettrait un lien dés que ça sera fini.

Merci

ARDUINO n'est pas fait pour les projets aussi ambitieux on dirait

Arduino fait bien ce pourquoi il a été écrit :
Aider les débuts des néophytes en microcontroleur.
Et cela il le fait bien mais il ne faut pas lui en demander plus.
Si tu veux optimiser en poids ou en rapidité il faut utiliser des outils plus classiques.

En effet.

Avec ton astuce je peut conserver cette plateforme. Je passerait certainement à AVR studio quand j'en aurait l'occasion.

Merci beaucoup

Un passage express par ce fil. Projet terminé (pour la phase beta). Merci à tous.

Pour les plus curieux mot clé VPDUINO sur virus photo

En ce qui me concerne, je rédige mes .h et .cpp dans un éditeur autre que Arduino IDE avec pour règle un module = un répertoire. Pour l'exemple soit un module MyServo que je veux coder. Je créée un répertoire MyServo qui contiendra MyServo.h et MyServo.cpp. Il pourra aussi contenir un sous répertoire 'examples' avec des exemples d'utilisation (au sens projets .INO). Je copie ensuite mon répertoire complet (ici MyServo) dans l'environnement de mon IE Arduino à l'endroit suivant ...\arduino-1.0.4\libraries. Inclure mon module MyServo dans mon projet INO est directement accessible avec l'option 'Croquis/Importer bibliothèque...' (n'ayant pas à me poser la question du chemin complet ou non d'accès aux .h et .cpp). Les éventuels exemples INO seront disponibles via l'option 'Fichier/Exemples' dans l'IE Arduino.