Go Down

Topic: Traduire "Arduino" en "C" pour avr-gcc (Read 2650 times) previous topic - next topic

maximg90

Bonjour,

Je suis actuellement sur un projet codé en C qui comporte plusieurs dizaines de fichiers. Afin d'améliorer ce code je voudrai ajouter une partie ( comptage des impulsions d'un encodeur). Pour cela j'ai trouvé un composant qui fonctionne sous language "Arduino" j'aimerai donc traduire ce code pour l'ajouter a mon projet (même microcontroleur) qui est en C. Après avoir parcouru le net je ne trouve rien qui puisse m'aider à faire ça.

Auriez-vous une idée si cela est possible?

Merci d'avance

XavierMiller

Bonjour,

Le "langage Arduino" est du C++ standard, qui se compile avec avr-gcc (ou plutôt avr-g++).

Il te faut juste récupérer les librairies et headers dans les sources d'Arduino (arduino.h, les librarires "wiring", ...)

68tjs

Il n'y a pas de "language Arduino", il n'y a que du C et du Cpp.

Ce qu'on appelle improprement du langage arduino c'est  une bibliothèque de fonctions qui simplifient la vie.
Exemple pour configurer une Entrée/sortie soit en entrée soit en sortie il faut aller modifier la valeur de certains registres, pour savoir lesquels il faut lire une datasheet de 500 pages , la fonction arduino:  pinMode(numéro de pin, INPUT ou OUTPUT) le fait "élégament".
La bibliothèque arduino privilégie la simplicité d'usage à l'optimisation, il peut y avoir des surprises désagréables pour quelqu'un habitué à d'autres styles de programmation.

Pour avoir le code de la bibliothèque arduino c'est très simple : tu télécharge l'IDE et tu cherches dans l'arboressence (elle peut varier entre win,linux,mac) et tu trouvera le "core" avec l'ensemble des fichiers c,cpp et h.

Pour avoir la documentation des fonctions c'est encore plus simple : c'est sur ce site : Learning-> Reference.

En faisant un petit peu de recherche sur internet on trouve des tutos pour utiliser la bibliothèque "arduino" avec Eclipse, Code::Blocs et Netbeens

Et pour le "langage arduino" adapté à ton composant c'est boule de cristal puisque tu ne nous dit pas de quoi il s'agit.







Ceux qui savent qu'ils ne savent rien en connaisse autant que ceux qui croient tout savoir et qui n'en connaissent pas plus qu'eux.
Pierre DAC.

maximg90

Merci pour vos réponse c'est devenu un peu plus clair pour moi !

Quote
Et pour le "langage arduino" adapté à ton composant c'est boule de cristal puisque tu ne nous dit pas de quoi il s'agit.
C'est volontaire vu que l'idée est à long terme pouvoir intégrer du code "arduino" dans mon projet sans se soucier des fonctions pinMode() par ex.


J'ai juste oublié précisé que je tourne sur Ubuntu 14.04.

J'essayerai alors simplement d'intégrer le "core" avec mes fichiers voir ce que ça donne

68tjs

Ubuntu c'est du Debian. L'IDE mode arduino est coupée en 2 paquets :
1 paquet IDE seule
1 paquet "core", qui pour toi devrait être le seul indispensable.
Ceux qui savent qu'ils ne savent rien en connaisse autant que ceux qui croient tout savoir et qui n'en connaissent pas plus qu'eux.
Pierre DAC.

XavierMiller

#5
Feb 19, 2015, 10:28 am Last Edit: Feb 19, 2015, 10:28 am by XavierMiller
Et un paquet "arduino-makefile" qui permet de compiler et déployer un ".ino" via make, qui fera tout ce qu'il faut pour gérer avr-gcc et avrdude

maximg90

Merci à vous,

J'ai pu réussir à compiler mon ancien programme en ajoutant des fonctions spécifique à arduino en spécifiant simplement le dossier "core" qui se trouve dans le dossier "arduino" ;)

68tjs

Petit complément : certaines fonctions demandent une configuration préalable, comme celles qui utilisent les timers (exemple non exclusif). Cette configuration se fait par la fonction init() qui se trouve dans wiring.c
Ceux qui savent qu'ils ne savent rien en connaisse autant que ceux qui croient tout savoir et qui n'en connaissent pas plus qu'eux.
Pierre DAC.

maximg90

#8
Feb 20, 2015, 11:36 am Last Edit: Feb 20, 2015, 01:33 pm by maximg90
Merci pour ce complément,

Je me suis rendu compte que ma fonction delay(); ne fonctionnait pas. Ca compile maisla led ne blink pas (et rien sur oscilloscope). Comme tu l'as bien indiqué, ça vient d'un problème de timer.

Pour faire fonctionner la librairie j'ai juste défini la valeur de F_CPU (16000000l), je me demande s'il ne faudrait pas configurer d'autres paramétres et comment les integrer (j'utiliser une mega 2560).

Edit : chose curieuse : la fonction delayMicroseconds(); fonctionne.... Je continue à creuser !
Les fonctions millis(); et micros(); ne fonctionnent pas

Merci beaucoup

68tjs

#9
Feb 20, 2015, 02:00 pm Last Edit: Feb 20, 2015, 03:00 pm by 68tjs
C'est ce que je viens de t'écrire il faut éxécuter la fonction init() ou plus efficacement regarder dans la fonction init() ce dont tu as réellement besoin.

Edit :
Il existe toujours les fonctions _delay() et consœur de l'avr-libc qui n'utilisent pas les timers mais les subtilités du micro : comme c'est Atmel qui a fait le micro  et qui écrit l'avr-libc il sait comment c'est fait à l'intérieur .
Arduino c'est pas mieux que ce que fait Atmel.
Ceux qui savent qu'ils ne savent rien en connaisse autant que ceux qui croient tout savoir et qui n'en connaissent pas plus qu'eux.
Pierre DAC.

maximg90


Go Up