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.
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.
PaoloP:
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.
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.
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.
/*
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.
leo72:
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:
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
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.
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
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
-----------
PaoloP:
Il mio Arduino è più veloce del vostro. ] ]
cosa gli hai dato da mangiare perché debba essere piú veloce deglia ltri?
Ciao Uwe
Secondo me gli ha messo accanto l'arduino DUE che ha ARM a bordo, allora la UNO si e detta cazzz, c'è la DUE qui "oooo ragazi fasciamo bella figura ehe, mi stiamo a contare i bit durante la programmazione ISP, andiamo."