Go Down

Topic: #define ---- errore "incomprensibile" (Read 1 time) previous topic - next topic

Livingstone

Salve a tutti ....
vi sottopongo due spezzoni di sketch apparentemente simili

/* Questo è il primo */

#define A 1
#define F 5

int led_0 = A;
int led_1 = F;


/* Questo è il secondo */

#define K 1
#define D 5

int led_0 = K;
int led_1 = D;


La differenza è che il primo NON funziona !

error: 'F' was not declared in this scope

E' come se non esistesse l'istruzione #define F 5
Per ora ho provato con diverse versioni di IDE e su tutte il difetto persiste.
Vi è mai capitato qualcosa di simile o qualche altra stravaganza?
Saluti.

PaoloP

La funzione F() è già definita nel core di Arduino, non puoi usarla per altre cose.  ;)

uwefed

Indipendentemente da questo uso della keyword "F" é opportuno non usare per variabili dei nomi cosí astratti. Se usi A, D, F, K come nomi non ha senso che usi #define. Usa dei nomi che descrivono il significato della variabile come lo hai fatto con led_1 per esempio pin_led_1.

Ciao Uwe

astrobeed


La funzione F() è già definita nel core di Arduino, non puoi usarla per altre cose.  ;)


Vero, però F() è una funzione e non un nome generico, ovvero puoi tranquillamente creare una variabile denominata F, o un alias F, non puoi creare una funzione F().
Il problema è che o ha scritto "F5" invece di "F 5" oppure non ha definito led_0 e led_1 come variabili globali, pertanto possono risultare non disponibili in tutto lo sketch in accordo con l'errore riportato.

Livingstone

Grazie a tutti per le risposte ....

il codice l'ho trovato su

https://github.com/ril3y/Make-Projects/blob/master/_7_segment/_7_segment.pde

e fa parte di un esempio semplice semplice pubblicato dalla rivista Make.

http://makeprojects.com/Project/Drive+a+7-Segment+LED+with+an+Arduino/645/1#.UOAZWazpuSp

Probabilmente non l'hanno provato prima, ma solo scritto e pubblicato .....
ora però mi sovviene la domanda .... ma F() che funzione è ??? dove si usa, cosa fa ???
Non trovo riferimenti attendibili a tal riguardo.
Grazie ancora a tutti, saluti.

leo72

F non è una funzione ma un #define definito nel file WString.h:
#define F(string_literal) (reinterpret_cast<const __FlashStringHelper *>(PSTR(string_literal)))

e come tale viene a crearsi il problema che nella porzione di codice in cui ridefinisci F tutto funziona, ma non nelle funzioni successive, essendo la ridefinizione di F al di fuori dello spazio di visibilità della funzione stessa.
Ho visto lo sketch che è stato pubblicato.
Affinché esso... funzioni dovresti inserire un #define F 5 in ogni funzione

Il seguente codice compila.
Code: [Select]

/*
Make Projects: How to Drive a 7 Segment LED
URL:
By: Riley Porter
This is an introduction on how to drive a 7 Segment LED using only a Arduino.  This is
not the best way to do this.  This is meant to be a learning excercise.  In later tutorials
I will show you how to use an dedicated IC using SPI or a Shift Register.  Enjoy.


digitalWrite(A, HIGH) = turn off the "A" segment in the LED display
digitalWrite(B, LOW)  = turn on the "B" segment in the LED display

*/


#define A 8
#define B 9
#define C 2
#define D 3
#define E 4
#define F 5
#define G 6




void clr()
{
    #define F 5
  //Clears the LED
  digitalWrite(A, HIGH);
  digitalWrite(B, HIGH);
  digitalWrite(C, HIGH);
  digitalWrite(D, HIGH);
  digitalWrite(E, HIGH);
  digitalWrite(F, HIGH);
  digitalWrite(G, HIGH);

}


void char_A()
{
    #define F 5
  digitalWrite(D, HIGH);
  digitalWrite(E, LOW);
  digitalWrite(F, LOW);
  digitalWrite(G, LOW);
  digitalWrite(A, LOW);
  digitalWrite(B, LOW);
  digitalWrite(C, LOW);
}

void char_B()
{
    #define F 5
  //Displays B
  digitalWrite(D, LOW);
  digitalWrite(E, LOW);
  digitalWrite(F, LOW);
  digitalWrite(G, LOW);
  digitalWrite(A, HIGH);
  digitalWrite(B, HIGH);
  digitalWrite(C, LOW);
}

void char_C()
{
    #define F 5
  //Displays C
  digitalWrite(D, LOW);
  digitalWrite(E, LOW);
  digitalWrite(F, LOW);
  digitalWrite(G, HIGH);
  digitalWrite(A, LOW);
  digitalWrite(B, HIGH);
  digitalWrite(C, HIGH);
}

void char_D()
{
    #define F 5
  //Displays D
  digitalWrite(D, LOW);
  digitalWrite(E, LOW);
  digitalWrite(F, HIGH);
  digitalWrite(G, LOW);
  digitalWrite(A, HIGH);
  digitalWrite(B, LOW);
  digitalWrite(C, LOW);
}

void char_E()
{
    #define F 5
  //Displays E
  digitalWrite(D, LOW);
  digitalWrite(E, LOW);
  digitalWrite(F, LOW);
  digitalWrite(G, LOW);
  digitalWrite(A, LOW);
  digitalWrite(B, HIGH);
  digitalWrite(C, HIGH);
}

void char_F()
{
    #define F 5
  //Displays F
  digitalWrite(D, HIGH);
  digitalWrite(E, LOW);
  digitalWrite(F, LOW);
  digitalWrite(G, LOW);
  digitalWrite(A, LOW);
  digitalWrite(B, HIGH);
  digitalWrite(C, HIGH);
}


void one()
{
    #define F 5
  //Displays 1
  digitalWrite(D, HIGH);
  digitalWrite(E, LOW);
  digitalWrite(F, LOW);
  digitalWrite(G, HIGH);
  digitalWrite(A, HIGH);
  digitalWrite(B, HIGH);
  digitalWrite(C, HIGH);
}

void two()
{
    #define F 5
  //Displays 2
  digitalWrite(D, LOW);
  digitalWrite(E, LOW);
  digitalWrite(F, HIGH);
  digitalWrite(G, LOW);
  digitalWrite(A, LOW);
  digitalWrite(B, LOW);
  digitalWrite(C, HIGH);
}

void three()
{
    #define F 5
  //Displays 3
  digitalWrite(D, LOW);
  digitalWrite(E, HIGH);
  digitalWrite(F, HIGH);
  digitalWrite(G, LOW);
  digitalWrite(A, LOW);
  digitalWrite(B, LOW);
  digitalWrite(C, LOW);
}

void four()
{
    #define F 5
  //Displays 4
  digitalWrite(D, HIGH);
  digitalWrite(E, HIGH);
  digitalWrite(F, LOW);
  digitalWrite(G, LOW);
  digitalWrite(A, HIGH);
  digitalWrite(B, LOW);
  digitalWrite(C, LOW);
}

void five()
{
    #define F 5
  //Displays 5
  digitalWrite(D, LOW);
  digitalWrite(E, HIGH);
  digitalWrite(F, LOW);
  digitalWrite(G, LOW);
  digitalWrite(A, LOW);
  digitalWrite(B, HIGH);
  digitalWrite(C, LOW);
}

void six()
{
    #define F 5
  //Displays 6
  digitalWrite(D, LOW);
  digitalWrite(E, LOW);
  digitalWrite(F, LOW);
  digitalWrite(G, LOW);
  digitalWrite(A, LOW);
  digitalWrite(B, HIGH);
  digitalWrite(C, LOW);
}

void seven()
{
    #define F 5
  //Displays 7
  digitalWrite(D, HIGH);
  digitalWrite(E, HIGH);
  digitalWrite(F, HIGH);
  digitalWrite(G, HIGH);
  digitalWrite(A, LOW);
  digitalWrite(B, LOW);
  digitalWrite(C, LOW);
}

void eight()
{
    #define F 5
  //Displays 8
  digitalWrite(D, LOW);
  digitalWrite(E, LOW);
  digitalWrite(F, LOW);
  digitalWrite(G, LOW);
  digitalWrite(A, LOW);
  digitalWrite(B, LOW);
  digitalWrite(C, LOW);
}

void nine()
{
    #define F 5
  //Displays 9
  digitalWrite(D, LOW);
  digitalWrite(E, HIGH);
  digitalWrite(F, LOW);
  digitalWrite(G, LOW);
  digitalWrite(A, LOW);
  digitalWrite(B, LOW);
  digitalWrite(C, LOW);
}

void zero()
{
    #define F 5
  //Displays 0
  digitalWrite(D, LOW);
  digitalWrite(E, LOW);
  digitalWrite(F, LOW);
  digitalWrite(G, HIGH);
  digitalWrite(A, LOW);
  digitalWrite(B, LOW);
  digitalWrite(C, LOW);
}

void LoopDisplay()
{
  //Loop through all Chars and Numbers
  char_A();
  delay(1000);
  char_B();
  delay(1000);
  char_C();
  delay(1000);
  char_D();
  delay(1000);
  char_E();
  delay(1000);
  char_F();
  delay(1000);
  one();
  delay(1000);
  two();
  delay(1000);
  three();
  delay(1000);
  four();
  delay(1000);
  five();
  delay(1000);
  six();
  delay(1000);
  seven();
  delay(1000);
  eight();
  delay(1000);
  nine();
  delay(1000);
  zero();
  delay(1000);
}

void setup()
{
    #define F 5
  //Setup our pins
  pinMode(A, OUTPUT);
  pinMode(B, OUTPUT);
  pinMode(C, OUTPUT);
  pinMode(D, OUTPUT);
  pinMode(E, OUTPUT);
  pinMode(F, OUTPUT);
  pinMode(G, OUTPUT);
  Serial.begin(9600);  //Begin serial communcation

}

void loop()
{
  Serial.println("Starting\n");
  LoopDisplay();

}


Quel codice è stato scritto per le vecchie versioni dell'IDE, la 0022/0023. Lo si capisce dall'estensione del file, .pde, che era usata dalla vecchia IDE. Dall'IDE 1.0 in poi l'estensione è diventata .ino ed è stata introdotta la funzione F, che permette di scrivere su monitor seriale o su un lcd una stringa recuperandola direttamente dalla Flash, per risparmiare RAM.
http://arduino.cc/en/Serial/Print

uwefed

Se avessero scritto seg_A, seg_B ecc non sarebbe sucesso.
Ciao Uwe

astrobeed


F non è una funzione ma un #define definito nel file WString.h:
#define F(string_literal) (reinterpret_cast<const __FlashStringHelper *>(PSTR(string_literal)))


Hai ragione, non mi ricordavo che F() è una #define.


leo72


Hai ragione, non mi ricordavo che F() è una #define.

E' che siamo così abituati ad indicare F() come funzione che alla fine poi sbagliamo senza accorgercene  ;)

astrobeed


E' che siamo così abituati ad indicare F() come funzione che alla fine poi sbagliamo senza accorgercene  ;)


Più che altro è impossibile ricordarsi tutto a memoria :)
Non mi ricordo se è già stato segnalato questo utile sketch che fornisce informazioni dettagliate su Arduino ed esegue un test prestazioni, mi ci sono imbattuto per caso stamattina mentre stavo cercando una libreria.

leo72



E' che siamo così abituati ad indicare F() come funzione che alla fine poi sbagliamo senza accorgercene  ;)


Più che altro è impossibile ricordarsi tutto a memoria :)

+1  ;)

Quote

Non mi ricordo se è già stato segnalato questo utile sketch che fornisce informazioni dettagliate su Arduino ed esegue un test prestazioni, mi ci sono imbattuto per caso stamattina mentre stavo cercando una libreria.


Non lo conoscevo. Mi sembra utile.

astrobeed


Non lo conoscevo. Mi sembra utile.


Se non lo conoscevi tu allora vuol dire che nessuno l'ha mai linkato sul forum italiano :)
L'ho già provato e ti confermo che funziona molto bene.


PaoloP

#12
Dec 30, 2012, 03:49 pm Last Edit: Dec 30, 2012, 03:59 pm by PaoloP Reason: 1
Il mio Arduino è più veloce del vostro.  ]:D ]:D

Quote
Speed test
----------
F_CPU = 16000000 Hz
1/F_CPU = 0.0625 us
The next tests are runtime compensated for overhead
  nop                       : 0.063 us
  avr gcc I/O               : 0.125 us
  Arduino digitalRead       : 3.653 us
  Arduino digitalWrite      : 3.903 us
  pinMode                   : 4.623 us
  multiply volatile byte    : 0.632 us
  divide volatile byte      : 12.888 us
  multiply volatile integer : 1.449 us
  divide volatile integer   : 15.223 us
  multiply volatile long    : 4.530 us
  multiply single float     : 7.110 us
  multiply double float     : 7.108 us
  divide double float       : 79.978 us
  itoa()                    : 16.488 us
  ltoa()                    : 239.478 us
  dtostrf()                 : 79.303 us
  random()                  : 94.253 us
  y |= (1<<x) with volatile : 0.569 us
  bitSet() with volatile    : 0.569 us
  analogReference()         : 0.694 us
  analogRead()              : 111.928 us
  analogWrite() PWM         : 11.608 us
  delay(1)                  : 1003.978 us
  delay(100)                : 100024.976 us
  delayMicroseconds(1)      : 0.883 us
  delayMicroseconds(5)      : 4.655 us
  delayMicroseconds(100)    : 100.228 us
-----------

astrobeed


Il mio Arduino è più veloce del vostro.  ]:D ]:D


La mia Luigino 328 Evo turbo, che non arriverà mai sul mercato, è ancora più veloce perché è overcloccata a 24 MHz  :smiley-mr-green:

leo72

Questi sono i dati del mio Arduino UNO R1:
Code: [Select]

Speed test
----------
F_CPU = 16000000 Hz
1/F_CPU = 0.0625 us
The next tests are runtime compensated for overhead
  nop                       : 0.063 us
  avr gcc I/O               : 0.125 us
  Arduino digitalRead       : 3.964 us
  Arduino digitalWrite      : 5.162 us
  pinMode                   : 4.030 us
  multiply volatile byte    : 0.632 us
  divide volatile byte      : 5.407 us
  multiply volatile integer : 1.386 us
  divide volatile integer   : 15.217 us
  multiply volatile long    : 4.655 us
  multiply single float     : 7.237 us
  multiply double float     : 7.237 us
  divide double float       : 80.112 us
  itoa()                    : 16.602 us
  ltoa()                    : 239.787 us
  dtostrf()                 : 79.662 us
  random()                  : 55.212 us
  y |= (1<<x) with volatile : 0.569 us
  bitSet() with volatile    : 0.569 us
  analogReference()         : 0.695 us
  analogRead()              : 111.987 us
  analogWrite() PWM         : 12.357 us
  delay(1)                  : 1007.487 us
  delay(100)                : 99999.984 us
  delayMicroseconds(1)      : 0.883 us
  delayMicroseconds(5)      : 4.656 us
  delayMicroseconds(100)    : 100.237 us
-----------


Go Up