Pic Micro, Arduino, Atmel, Microchip, Freescale, Texas Instrument, ecc. Strumenti di sviluppo, firmware e progetti.
da mayo
#3547
Scusate la mia newbberia ma dopo aver caricato uno skecth ottengo il seguente errore ripetuto per alcune librerie.h

#error "Never include LIBRERIA.h directly; include Usb.h instead"

Da cosa può dipendere ?

Grazie !
Avatar utente
da Bios
#3548
da mayo
#3555
Per caso, ho notato che c'è un errore per ogni file di libreria per il quale esiste l'estensione .H ma non quella .CPP
Ora, visto che sto cercando di far girare un sorgente passatomi come funzionante, non capisco perchè a me non debba girare.
Avatar utente
da Bios
#3556
Può darsi, che in qualche modo l'ambiente sia stato compromesso accidentalmente?
Proverei a reinstallare l'IDE.

Saluti.
da mayo
#3560
Ho già ripetuto 2 volte la reinstallazione dell' IDE. Domanda: potrebbe essere che alcune librerie siano state unite ma compaiono ancora i loro INCLUDE isolati che ne costituiscono una ridondanza che porta all'errore ?
Avatar utente
da Bios
#3561
Non ho abbastanza dati per rispondere, non so cosa stai cercando di ottenere e come stai procedendo, quali sono i passaggi utili a replicare il "bug", etc. Quanto ho a disposizione è il messaggio di errore e informazioni a morsi e bocconi, questo non mette in grado gli utenti di poterti rispondere al meglio.

  • Prova ad eliminare completamente l'IDE di arduino dal sistema, eventualmente anche cancellando fisicamente la directory.
  • Reinstalla l'ambiente da capo
  • Prova a compilare un semplice sketch come questo per assicurarti che il core dell'ambiente funzioni a dovere

Prova a dare una occhiata al web editor di arduino per verificare che il problema non sia nel tuo sketch, eventualmente puoi usarlo al posto dell'IDE senza installare nulla in locale.
Ecco la pagina di supporto ufficiale del web editor.

Saluti.
da zioelp
#3562
mayo ha scritto:Ho già ripetuto 2 volte la reinstallazione dell' IDE. Domanda: potrebbe essere che alcune librerie siano state unite ma compaiono ancora i loro INCLUDE isolati che ne costituiscono una ridondanza che porta all'errore ?
Non conosco in dettaglio l'ambiente di sviluppo citato, ma approfitterei dell'occasione per qualche info di carattere generale sull'argomento linguaggi di programmazione, compilatori, e le cosiddette "librerie".
Il linguaggio di programmazione non è altro che un modo per sopperire all'attuale incapacità delle macchine di capire al volo un discorso diretto in italiano, in inglese o in altro idioma a piacere.
Se le macchine potessero capire direttamente "apri la porta del garage quando piove", non ci sarebbe bisogno di scrivere "LD A, #1", "OUT (25),A", "if (k < 2) { PORTD |= 1 };" e robe simili, e non servirebbe nemmeno un compilatore.
A differenza dell'italiano o dell'inglese, che sono lingue adatte alle persone, una "lingua" adatta alle macchine dev'essere concepita rispettando almeno due regole di base: avere un vocabolario ridotto a pochi termini; non avere ambiguità, cioè non usare parole e regole che possano assumere più di un significato non desumibile dal contesto.
Il problema dell'ambiguità è sentito anche in italiano, e può essere messo in luce già con una frase banalissima come "venti secchi".
Sfido chiunque a stabilire al volo se sto parlando di un'informazione meteorologica o sto citando una voce d'inventario di un negozio di casalinghi. :-)
Anche parole brevi e semplici come "sale" possono indicare locali da ballo o d'attesa; un ingrediente in cucina o in farmacia; un'azione riferita alla Borsa in Piazza Affari o al movimento di un aereo di linea.
Basta oltrepassare le Alpi, e sale diventa sinonimo di sporcizia. Basta oltrepassare la Manica, e sale diventa una vendita.
La necessità di farsi capire dai computer senza usare le convenzioni valide per gli esseri umani ha dato origine ai cosiddetti "linguaggi di programmazione".
I primi grandi computer che costavano cifre altissime erano destinati più che altro all'esecuzione di calcoli aritmetici, e quindi, come linguaggio preferito, usavano il FORTRAN (FORmula TRANslator).
Più tardi i computer son diventati accessibili al pubblico, e qualcuno ha inventato il BASIC (Beginner's All-Purpose Symbolic Instruction Code).
Nel frattempo i computer sono entrati anche negli uffici contabili e commerciali, e qualcuno ha inventato il COBOL (COmmon Business-Oriented Language).
Come primo approccio per ampliare gli orizzonti verso l'astrazione è uscito fuori anche il PASCAL, e per applicazioni più vicine all'hardware e scaturito anche il C.
Ciascun linguaggio ha le sue debolezze e i suoi punti di forza, ma tutti seguono regole assolutamente non ambigue, altrimenti tanto varrebbe tradurre direttamente dall'italiano o dall'inglese.
In pratica, il compilatore è un programma che traduce in blocco un intero discorso prima che la macchina cominci a svolgere i compiti descritti in ciascuna frase.
In quanto programma per computer, anche il compilatore è stato in qualche modo "compilato" prima di poter funzionare, e visto che svolge operazioni molto varie e complesse, è plausibile che dietro abbia il lavoro più o meno coordinato di molte, molte persone.
L'idea che molte persone "smanettino" in simultanea otto ore al giorno sullo stesso, grandissimo, file sorgente è ridicola, quindi la scartiamo a priori.
L'idea che molte persone "smanettino" singolarmente su un proprio piccolo file è già più bella, ma ci espone alla necessità di condividere in qualche modo le informazioni, soprattutto al momento di raggruppare migliaia di pezzi sciolti in un singolo "sorgentone" da compilare.
Uno dei metodi più in voga per raggruppare più sorgenti al momento di compilare è l'inclusione: se so che qualcun altro ha già scritto un pezzo di programma per aprire il garage, e lo ha chiamato "aprigar", invece di procedere al copia e incolla fisico di tutte le righe di "aprigar" posso chiedere al compilatore di fare da solo, semplicemente scrivendo in una riga del mio sorgente l'indicazione "includi aprigar".
Nel caso del linguaggio C, che in genere è (o almeno è stato a lungo) proprio il linguaggio preferito da chi scrive compilatori per linguaggi di programmazione, è prevista la parola "#include", seguita dal nome del file da includere posto tra parentesi angolari o doppie virgolette.
Ora, finché la responsabilità di scegliere come spezzettare i sorgenti è circoscritta, di solito si vedono una o due righe #include in cima al testo principale, ma se il lavoro è sparso in metà globo e coinvolge tantissimi addetti (esempio tipico il sorgente del kernel di GNU/Linux), i pezzi da far combaciare diventano ben presto centinaia, migliaia, decine di migliaia, e il rischio che da qualche parte sorga un'incongruenza diventa inevitabile.
L'incongruenza consiste nel fatto che un file incluso possa a sua volta citarne in inclusione altri, e questi facciano altrettanto fino ad includersi a vicenda, cosa non permessa per ovvi motivi di ambiguità.
L'errore citato nel primo messaggio, "Never include LIBRERIA.h directly; include Usb.h instead" è legato a un'inclusione che non dovrebbe esserci ma c'è, probabilmente a causa di una riga #ifdef o #ifndef che dovrebbe dare un certo risultato ma invece ne dà un altro.
Ho detto in apertura di non conoscere i dettagli dell'ambiente di sviluppo usato, ma immagino che uno "sketch" non sia un sorgente C che viene trattato con un compilatore C, ma qualcosa di molto simile ad un sorgente C che viene trattato da qualcosa di molto simile a un compilatore C.
Se poi nello sketch vengono citate delle funzioni "simil C" che non compaiono altrove in formato sorgente, eccoci a parlare delle famose "librerie".
A dispetto del nome, in informatica una "libreria" non è un negozio che vende libri, ma piuttosto una "biblioteca", ovvero un luogo dove si conservano libri (intesi come fonti d'informazioni) che chiunque può consultare. Il termine inglese d'origine è infatti "library", non "bookshop", e library andrebbe tradotto come biblioteca, non come libreria.
Nomi a parte, anche se in uno sketch non dovessero comparire inclusioni esplicite, e non si vedessero da qualche parte i "corpi" sorgenti delle funzioni citate, prima o poi, in sede di compilazione, le cose devono andare a posto, pena la comparsa di uno o più messaggi d'errore.
Se il processo di compilazione è gestito con dei "makefile" (è una roba brutta che non illustro qui ma invito a decifrare in rete), è probabile che uno di questi stia pensando di operare verso un "target" (microcontroller) diverso dall'attuale, o comunque abbia dei riferimenti diversi dalla realtà.
Il messaggio d'errore a proposito di un'inclusione fuori luogo non viene prodotto dal compilatore vero e proprio, ma piuttosto dal "preprocessor", cioè dal programma che si attiva in automatico prima della compilazione e provvede, fra le altre cose, anche alla verifica di congruenza delle inclusioni.
Purtroppo, se tali inclusioni non sono in vista nei sorgenti perché gestite in automatico dall'IDE, l'unica via percorribile è l'IDE stesso. Non è un gioco di parole: in qualche schermata può esserci una casella che sceglie questo o quel parametro, o questa o quella "libreria" da includere o escludere in base a qualche criterio prestabilito.
Se il problema fosse davvero nella configurazione di default dell'IDE, si spiegherebbe anche perché il sorgente venga accettato senza errori se compilato da altri. Buona ricerca! :)
Avatar utente
da double
#3568
qualche domanda e richiesta per capire meglio il contesto
1) che versione IDE arduino usi per compilare?
2) che board XXX-INO- UNO-DUE-ENNE usi per eseguire? Che shield ci sono collegate?
3) hai già verificato che la libreria SW che usi sia compatibile con la board HW ?
4) la board+shield del tuo amico su cui il codice gira è uguale alla tua board+shield (non dico compatibili ma proprio uguali)?
5) hai aggiornato le librerie usate alla versione corrente della IDE? Dopo la 1.6.X (mi sembra) la verifica viene fatta automaticamente all'avvio della ide , con versioni precedenti occorre farlo a mano (sempre che l'autore abbia aggiornato la libreria)
6) visto che hai il messaggio di errore include Usb.h instead stai forse usando uno shield usb host? qui c'è qualche info in merito http://forum.arduino.cc/index.php?topic=273134.0
7) la versione della libreria è coerente alla release dello shield? per alcune shield USB- host ci sono librerie diverse (e pure diversi pad da saldare/aprire) per diverse versioni dello stesso shield della stessa ditta (così è più divertente)
8) Posta il frammento di codice con le definizione di inclusione delle librerie (il resto non serve)

Tieni presente che alcune nuove release della ide NON sono retrocompatibili con alcune librerie sviluppate da terze parti se queste non vengono aggiornate, io spesso compilo ancora con la ide 1.0.5 ed in qualche raro caso anche con la vecchissima 0.23.
Bios ringraziano
da mayo
#3574
Allora, leggendo un pò in giro ho capito che certi errori erano dovuti al fatto, correggetemi se sbaglio, che nelle ultime release le variabili non dovevano riportare l'underscore, e a quel punto ho installato la 1.6.6, come ho visto suggerire in altro forum e come qualcuno di voi ha appena confermato, ed è andato tutto liscio.
Vendo

OWON HDS2202S nuovo imballo originale 190.00 eur[…]

Sono comuni interruttori a levetta DPDT. Se le due[…]

Visita il nostro canale telegram