Erreur générée avec un #define

Bonjour à tous

Dans le code suivant :

#define PB5 PORTB5

void setup() {
  DDRB |= (1<<DDB5);  
  //PORTB |= (1 << PORTB5) ; //Admis par le compilateur.
  PORTB |= (1<<PB5) ; //Ne fonctionne pas...
}

void loop() {
}

l’IDE génère l’erreur
'PB5 was not declared in this scope'.

Poutrant « PORTB5 » est normalement valide, comme l’atteste la ligne mise en commentaire ; il faut également retirer le #define pour utiliser ladite ligne.

Je ne vois pas où se situe mon erreur.

Merci pour votre aide.

Cordialement.

Bonjour,
Tu ne peux pas appeler ta macro PB5 car PB5 est un mot réservé.
Remplace PB5 par PBX, par exemple est cela fonctionne.
@+

Non ce n'est pas ça le problème : avec << il faut un nombre, la tu passes une config de registre.

Essaye #define PB5 5 tu verras que ça compile

Ton premier code ne compile pas non plus lorsque la ligne PORTB |= (1 << PORTB5) est décommentée.
En fait il manque juste un include

#include <avr/io.h>
#define PB5 PORTB5

void setup() {
  DDRB |= (1<<DDB5);  
  //PORTB |= (1 << PORTB5) ; //Admis par le compilateur.
  PORTB |= (1<<PB5) ; //maintenant ça fonctionne...
}

void loop() {
}

B@tto:
Non ce n'est pas ça le problème : avec << il faut un nombre, la tu passes une config de registre.

Essaye #define PB5 5 tu verras que ça compile

le #define qui fait référence à un #define fonctionne seulement là PORTB5 n'était pas défini.

Merci icare, B@tto et fdudfnews pour vos réponses.

Pour fdudnews

Test 1
Après un nouvel essai, le code suivant ne compile pas avec l’IDE Arduino mais compile avec SublimeText !
(voir les copies d’écran) ;

#define PB5 PORTB5

void setup() {
  DDRB |= (1<<DDB5);  
  PORTB |= (1<<PB5) ; 
}

void loop() {
}

Test 2
J’avais également fait un test avec

#include <avr/io.h>

Je viens de faire un copier coller de votre code :

#include <avr/io.h>
#define PB5 PORTB5

void setup() {
  DDRB |= (1<<DDB5);  
  PORTB |= (1<<PB5) ;
}

void loop() {
}

Si j’écris :

#include <avr/io.h>
//#define PB5 PORTB5

j’obtiens : error: 'PB5' was not declared in this scope

Si j’écris

//#include <avr/io.h>
#define PB5 PORTB5

Le code compile correctement

Si j’écris

#include <avr/io.h>
#define PB5 PORTB5

Le code compile (forcément) correctement.

Donc le

#include <avr/io.h>

ne sert pas.

Pourtant, le fichier io.h est bien présent dans :
arduino/hardaware/tools/avr/avr/include/avr
contents/Resources/Java/hardware/tools/avr/avr/include/avr

Je vais donc rester avec

PORTB |= (1<<PORTB5) ;

et cette incompréhension !
Merci à tous et bonne programmation.

Cordialement

SublimeText.jpg

Non j'insiste le code proposé compile correctement.

Merci fdufnews pour ce suivi attentif !

Il a manqué une image à mon précédent post.
Sur le coup, j’ai regroupé les 2 recopies d’écran dans une seule image…

La commande #define PB5 PORTB5 ne fait que bêtement remplacer « PB5 » par « PORTB5 ».
Donc, du point de vue code avant compilation, PB5 n’existe plus, puisque remplacé.
#include <avr/io.h> est donc inutile.

Je constate que le MEME code (*):

  • ne fonctionne pas (voir recopie d'écran de gauche) avec l’IDE Arduino, ;
  • fonctionne avec Sublime Text, qui utilise le compilateur d’Arduino (Sublime Text n’étant qu’un éditeur de texte).

(*) ce n'est même pas un copier-coller ; j'ouvre le même code source dans l'un ou l'autre des deux éditeurs.

Cordialement.