hai fatto la define di due parametri della shiftOut() presente in Arduino.h, clockPin e dataPin
prova ad aggiungere al nome anche solo una x xclockPin e xdataPin
Nel secondo sketch il file Arduino.h forse viene incluso dopo le tue #define.
Però nei file .h lasciare il nome dei parametri no ha senso, secondo me.
Al compilatore basta il tipo:
void shiftOut(uint8_t , uint8_t , uint8_t , uint8_t );
Ho scoperto l'inghippo!
Dovete dirlo, sono trooooppo forte
Il problema è qui: #define latchPinOUT 11//Pin connected to ST_CP of 74HC595 #define clockPinOUT 12//Pin connected to SH_CP of 74HC595 #define dataPinOUT 10//Pin connected to SH_CP of 74HC595
OUT tutto maiucolo probabilmente è un'altra define messa chissà dove.
Se mettete minuscolo (sostituendo ovviamente nel codice): #define latchPinOut 11//Pin connected to ST_CP of 74HC595 #define clockPinOut 12//Pin connected to SH_CP of 74HC595 #define dataPinOut 10//Pin connected to SH_CP of 74HC595
Ne abbiamo discusso in altro thread.
Con la define il compilatore sostituisce brutalmente la parola con quello che definisci e puoi incorrere in molti problemi, ad esempio
quello che è capitato a te.
Poi un altro vantaggio della const byte pinXX=10; è che dichiari il tipo
Tieni conto che la const NON è interpretata dal compilatore come variabile ma fa praticamente come la define, sostituisce ma in maniera più controllata.
Anche a me piaceva più la define, da vecchio programmatore di C, ma ho imparato a usare la const, grazie al forum.
P.S. @leo e figurati, nella fretta, capita.
Però perchè nelle varie .h del core oltre ai tipi dei parametri han lasciato il nome del parametro? Al compilatore non serve. Serve all'IDE ?
scusate non sapevo di quella discussione, nonostante segua quotidianamente, se no non avrei iniziato questa, comunque adesso starò più attento alle discussioni
@stefa24, non mi sembra un problema il tuo thread. Anche fossi stato a conoscenza della discussione già fatta sulle define (e mica puoi seguirle tutte !!!), non potevi sapere che quello era il problema del tuo sketch.
No, il vero problema è che l'IDE di Arduino non fa vedere le varie warning e tutti gli errori, se provate a compilare lo stesso programma con AvrStudio si vede subito che l'errore è dovuto alla ridefinizione di un parametro usato da una libreria/funzione.
La diatriba define vs const è solo un questione di stile di programmazione e non una vera questione di vantaggio/svantaggio nell'uso di una o l'altra.
Secondo me c'e' un piccolo vantaggio, ma non sempre utile. Con la const sei obbligato a dichiararne il tipo mentre per una define o forzi un cast oppure è poi il compilatore che farà dei cast ove necessario.
nid69ita:
Con la const sei obbligato a dichiararne il tipo mentre per una define o forzi un cast oppure è poi il compilatore che farà dei cast ove necessario.
Se con la #define esegui una sostituzione tra un alias e un valore numerico quest'ultimo verrà considerato in base al suo uso, se viene assegnato ad una variabile è questa è stabilire il tipo dato, se viene usato come parametro di una funzione è il prototipo di questa, e/o la sua definizione, a stabilire il tipo dato, se viene usato per un calcolo è il valore stesso a stabilire il tipo dato.