Bonjour skizoh,
"OCR5A", c'est le nom en langage Arduino d'un registre des puces Artmel, c'est la variable qui conserve le fréquence de la minuterie numéro 5 "Timer5" qui contrôle le PWM de la broche numéro 46 d'une carte Arduino Mega.
Pour le moment j'utilise une directive de compilation comme « #define servo46 OCR5A », mais j'ai horreur de cela même si cela fonctionne déjà très bien.
J'ai plusieurs raisons, alors, dans le désordre :
-
Pour rendre le code source plus modulable, car en général, on regroupe les directives de compilation hors de la structure des fonctions qui utilisent ces constantes et variables que sont les « #define ». Et on regroupe les directives de compilation au début (en haut du code source) et c'est parfois loin des fonctions qui les utilisent.
-
De manière générale simplement mettre où je veux dans mon code des déclarations de constante et de variable.
-
Éviter la lourdeur des directives de compilation.
-
En général, avoir le moins possible recourt aux directives de compilation.
Une autre manière de dire que je veux remplacer la ligne de code « #define servo46 OCR5A », ce serait de dire que :
Comment faire pour que l'adresse mémoire de ma variable « ServomoteurBroche46 » soit la même que l'adresse mémoire du registre mémoire « OCR5A » ?
En langage Pascal, cela se fait facilement, alors en C++ cela devrait être encore plus facile !
Etc. Les goûts de chacun sont dans la nature et la manière de programmer aussi.
Mais on s'éloigne du sujet, les ligues de code que je écrie sont-elles valident ?
uint16_t *ServomoteurBroche46 = &OCR5A;
Cela devrait faire que la variable « OCR5A » et « ServomoteurBroche46 » ont la même adresse mémoire, est-ce exact ?
Et le code suivant :
typedef uint16_t t_Pointeur *Pointeur;
Pointeur ServomoteurBroche46 = &OCR5A;
Devrait aussi faire que la variable « OCR5A » et « ServomoteurBroche46 » ont la même adresse mémoire, est-ce exact ?
Mais cela ne passe pas à la compilation, alors pourquoi, et surtout, comment corrigé ce problème ?
Je suis sous Linux Kubuntu 12.04, 64 bits avec l'IDE Arduino 1.0.5.
Respectivement, les messages d'erreur sont pour « uint16_t *ServomoteurBroche46 = &OCR5A; »:
MegaLCD_ServoCinciAdresse:506: error: invalid conversion from ‘volatile uint16_t*’ to ‘uint16_t*’
MegaLCD_ServoCinciAdresse.ino: In function ‘void loop()’:
MegaLCD_ServoCinciAdresse:1018: error: call of overloaded ‘print(uint16_t*&)’ is ambiguous
/home/rene/sda6/Électroniques/Arduino_Linux/hardware/arduino/cores/arduino/Print.h:58: note: candidates are: size_t Print::print(char) <near match>
/home/rene/sda6/Électroniques/Arduino_Linux/hardware/arduino/cores/arduino/Print.h:59: note: size_t Print::print(unsigned char, int) <near match>
/home/rene/sda6/Électroniques/Arduino_Linux/hardware/arduino/cores/arduino/Print.h:60: note: size_t Print::print(int, int) <near match>
/home/rene/sda6/Électroniques/Arduino_Linux/hardware/arduino/cores/arduino/Print.h:61: note: size_t Print::print(unsigned int, int) <near match>
/home/rene/sda6/Électroniques/Arduino_Linux/hardware/arduino/cores/arduino/Print.h:62: note: size_t Print::print(long int, int) <near match>
/home/rene/sda6/Électroniques/Arduino_Linux/hardware/arduino/cores/arduino/Print.h:63: note: size_t Print::print(long unsigned int, int) <near match>
MegaLCD_ServoCinciAdresse:1021: error: call of overloaded ‘print(uint16_t*&)’ is ambiguous
/home/rene/sda6/Électroniques/Arduino_Linux/hardware/arduino/cores/arduino/Print.h:58: note: candidates are: size_t Print::print(char) <near match>
/home/rene/sda6/Électroniques/Arduino_Linux/hardware/arduino/cores/arduino/Print.h:59: note: size_t Print::print(unsigned char, int) <near match>
/home/rene/sda6/Électroniques/Arduino_Linux/hardware/arduino/cores/arduino/Print.h:60: note: size_t Print::print(int, int) <near match>
/home/rene/sda6/Électroniques/Arduino_Linux/hardware/arduino/cores/arduino/Print.h:61: note: size_t Print::print(unsigned int, int) <near match>
/home/rene/sda6/Électroniques/Arduino_Linux/hardware/arduino/cores/arduino/Print.h:62: note: size_t Print::print(long int, int) <near match>
/home/rene/sda6/Électroniques/Arduino_Linux/hardware/arduino/cores/arduino/Print.h:63: note: size_t Print::print(long unsigned int, int) <near match>
Et pour :
typedef uint16_t t_Pointeur *Pointeur;
Pointeur ServomoteurBroche46 = &OCR5A;
MegaLCD_ServoCinciAdresse:504: error: expected initializer before ‘*’ token
MegaLCD_ServoCinciAdresse:505: error: ‘Pointeur’ does not name a type
MegaLCD_ServoCinciAdresse.ino: In function ‘void loop()’:
MegaLCD_ServoCinciAdresse:1013: error: ‘servo46’ was not declared in this scope
Le registre, la variable « OCR5A » est valide, cela fonctionne avec la directive de compilation, il n'y a pas de doute sur ce point.
Vous avez un remède docteur ?
L'ami René