Una guida su ArduinoUno, partendo proprio dall'installazione, è proprio quello che ci vuole per muovere i primi passi con Arduino. Dal Blog di Marco presentiamo questa guida su Arduino Uno.
Iniziare con una nuova demoboard, apprendere le funzioni di un nuovo microcontroller, possono essere operazioni che portano via molto tempo, scoraggiando i neofiti. Da questo interessante Blog, segnaliamo una guida passo passo su come installare Arduino Uno.
Certo la strada è ancora lunga se siete proprio a digiuno di programmazione e microcontrollori, ma sicuramente il primo passo da fare è installare Arduino e questa guida, molto bene illustrata, è proprio quello che ci serve!
La guida è sintetizzabile in 2 fasi:
- Installazione del software di Arduino Uno sul PC con configurazione del driver per la comunicazione USB tra PC ed Arduino. Possibile tramite la creazione di una COM virtuale, sempre la solita FTDI (mitico driver)
- Utilizzo del Software di sviluppo per ArduinoUno con il quale realizzare il programma (editor di testo) e poi programmare la scheda Arduino (programmatore tramite USB)
Marco vi porterà per mano, , con tutti gli screenshots dell'installazione di Arduino ed i blocchi di codice necessari a realizzare la vostra prima applicazione, vabbè il vostro primo led lampeggiante con Arduino... ma è comunque il primo, necessario, passo da compiere per conoscere Arduino.
Questa volta non hai piu scuse per iniziare a "giocare" con Arduino!
Leggendo il titolo mi sono detto: cosa cambierà nell’installazione di Arduino Uno rispetto ad Arduino2009?…La risposta mi è giunta dopo aver finito dil leggere l’articolo…niente! :)…Ma la vera differenza tra le due schede allora qual’è?
Ah ok, anche in questo caso mi sono dato la risposta da solo…Arduino UNO utilizza come transceiver USB un altro micro della ATmel programmato adhoc, a differenza di Arduino2009 che per la stessa funzione utilizza un integrato dedicato della FTDI…
bellissimo, io avevo intenzione di comprarlo, l’unica esperienza che ho avuto con i microcontrollori, l’ho avuta all’università con l’utilizzo di un atmel atmega32, (assembler e il C specifico) scrivendo un paio di semplici programmini… una guida in italiano per arduino per me ci voleva proprio visti tutti i progetti interessanti che si possono realizzare.. è da un po che lo seguivo qui su l’elettronica open source…
ma il mio tempo non è sempre tanto…
La differenza tra Arduino Uno e Arduino Duemilanove consiste nella mancanza del chip FTDI. Infatti prima la seriale USB era gestita dall’integrato della FTDI che altro non è che un bridge USB-RS232. Con la nuova Arduino Uno invece, il chip FTDI è stato sostituito da un microcontrollore Atmel con la seriale USB integrata. Questo è stato fatto affinche Arduino possa avere un Id USB proprietario.
Sta di fatto che comunque è stato eliminato un chip FTDI ed inserito un altro microcontroller, sempre Atmel…. forse inutile?
Penso sia il caso di approfondire poi questo aspetto, cosa si cela dietro questa scelta? Ci sono ragioni legali (Id USB)? oppure solo commerciali ?
La atmel ultimamente ha prodotto una serie di integrati che sono simili a quelli “di una volta” ma dispongono di interfaccia usb built-in. Qualche mesetto fa mi sono studiato il datasheet di questi componenti. la atmel li ha catalogati con nomi simili ai vecchi, ma con la desinenza -U2, che staproprio ad indicare la presenza di un’interfaccia di tipo usb2 (es. ATMega8/16/32U2. Quando avevo letto l’utilizzo di questi chip sull’arduino uno mi ero un pò “stranito”. Infatti atmel distribuisce questi microcontrollori solo con packages di tipo smd, nella fattispecie QFN32 e VQFP32. (ho 300 pagine di datasheet stampate sulla scrivania) Io pensavo che li avesse utilizzati come rimpiazzo degli atmega, ma mi sono smentito poco dopo 🙂 Comunque queste unità sono sprecate come bus. Dispongono infatti, come già detto, di connessione usb2 hardware, e di un bootloader software preinstallato in fabbrica, quindi non mi sarei stupito se il caro Banzi avesse stravolto il concetto di “arduino” rendendolo molto più piccolo e con un solo integrato sulla scheda. Stando a quanto dice il datasheet, queste mcu sono ottime dal punto di vista della programmabilità! Comunque c’è qualcuno tra di voi che sa se è possibile inserire righe di codice assembler in una schermata dell’ ide di arduino?
Secondo me il vantaggio che c’è ad avere un microcontrollore come gestore del bus è che potendolo programmare si ha più espandibilità. ad es. se esistesse (può essere che esista, ma non lo so…) ad esempio un PIC con una piedinatura compatibile con gli atmega, sarebbe possibile programmare il circuito in maniera da poter programmare anche quest’ultimo. Il chip fdti fungeva solo da interfaccia usb, e non aveva la capacità di eseguire elaborazioni complesse sui segnali provenienti dal computer, perciò il bootloader doveva essere installato sull’atmega occupando preziosa memoria programma! Ora credo che non ce ne sia più tanto bisogno… Si possono anche considerare altre funzionalità che prima sarebbe stato esoso implementare, ad esempio (sto inventando ora) una funzione che permetta di vedere l’arduino come periferica dati sul proprio computer e programmarlo semplicemente trascinandoci su un file sorgente. L’utilità sarebbe dubbia, ma credo che si possa fare. Basta solo dare spazio alla fantasia
>forse inutile?
Chissà, quando si cerca di integrare troppa roba all’interno di un unico chip iniziano a sorgere guai/problemi soprattutto per chi vuole poi crearsi un proprio modo di interfacciarsi con il device.
Al di là delle ragioni legali e commerciali, con il chip FTDI erano a disposizione tutte la API per chi voleva farsi un proprio device driver in C (presente da più di due anni sul mio sito – http://elettrolinux.com/Utilities/ftdi-gnulinux-talks-with-ftdi-chips.html – 🙂 ).
Ora con l’integrazione della gestione USB all’interno del micro Atmel cosa si può fare? …in sostanza si hanno ancora ampie modalità di interazione oppure si è limitati? …altrimenti detto, si può “personalizzare” il comportamento del device? …non avendo una Arduino non saprei rispondere: chi ce l’ha, cosa riesce a fare al livello di programmazione in C (non parlo di programma utente, ma di controllo)?
Bye 😎
Penso che di motivazioni legali non ce ne dovrebbero essere, perchè a parità di interfacciamento, il problema del USB id rimane. Al contrario, penso che una soluzione utilizzante come USB-RS232 bridge un micro dell’Atmel convenga di granlunga in fase di produzione…magari sulle grandi quanti, il micro in questione arriva a costare meno rispetto al FTDI dedicato. Non riesco a vedere altre motivazioni differenti da questa.
Per inutile intendo dire, perche sono stati integrati 2 micro in una scheda, quando le stesse funzioni poteva farle anche un solo micro con usb integrata?
Magari si poteva pensare ad un micro piu potente….
Forse la scelta è dovuta sia a mantenere la massima compatibilità con le versioni precedenti, sia a non “caricare” il micro principale dello stack usb (è sempre un 8 bit, se ci metti pure le routine usb limiti parecchio le risorse)
Sta di fatto che nella scheda ora ci sono 2 microcontroller Atmel 🙂
Sono in fase di terminazione della recensione sul Flyport (entro stasera vedrò di inviartela) e anche li ho fatto la stessa considerazione: perchè utilizzare sulla scheda “nest” un FTDI quando lo stesso Flyport poteva essere equipaggiato con un micro della serie PIC24F con USB built-in? Bastava implementare un bootloader USB e il gioco si sarebbe concluso lì…in realtà una risposta penso di essere riuscito a trovarla. Nel caso del Flyport, nel micro gira un sistema operativo real time che tramite operazioni di scheduling associa ai vari eventi da eseguire un certo quanto temporale con una certa priorità. La comunicazione USB richiede una certa continuità delle operazioni e non ci si può permettere di interrompere un evento USB per dare l’esecuzione ad un evento secondario, come andrebbe a fare il RTOS del Flyport. Dato che, mentre è in esecuzione il firware che gestisce il webserver è anche possibile debuggare su porta COM virtuale, allora gestire una semplice comunicazione USART è un lavoro molto meno oneroso e delico rispetto alla gestione di una comunicazione USB.
Nel caso di Arduino non c’è nessuno RTOS implementato, ma la complessità comuputazionale e di risorse nella gesione della comunicazione USB resta comunque ai livelli elevati, e forse questo sarebbe andato ad inficiare sul performance generali della scheda.
la guida, ma l’ho trovata poco utile poichè pur non avendola letta prima, l’installazione è molto semplice ed intuitiva anche per un neofita, è più semplice da farsi che a dirsi, comunque la visualizzazione dei vari passi può dare agli utenti che pensano di approcciarsi all’arduino come sia in realtà più semplice di come potrebbero pensare.
Allora io avendo ricevuto dal concorso precedente febbruino una delle schede Arduino 2009 anche se è un clone ma penso che non cambia niente al livello software che a livello hardware ,
dove viene montato il chip FTDI non è stato così semplice semplicemente perché avendo un computer con architettura x64 al posto del solito x86 in grado sono stati molto più difficili da reperire , anche se la comunità di Arduino dopo che gli ho esposto il problema mi hanno risolto in un breve tempo .
Dopo ho fatto anch’io il fatidico programmino per fare lampeggiare un LED ,
Da questo momento ho incominciato a cercare di sapere come questo compratore funzionasse visto che per un semplice programma così mi ha fregato più 1 ko di programma visto che con una sembra un centinaio di righe avrebbero bastato e avanzate ,
Comunque sia sulla scheda Arduino è possibile anche programmare da un’altra via quella del ICSP che quella standard ,
Dopo ho ordinato un nuovo ATMEG328 per sostituito nella scheda Arduino per non rovinare quello con il boot Lord USB ,
È attualmente sto facendo le prove di programmazione tramite ICSP così da potere fare anche in deBug una cosa che non è possibile Con l’ambiente di sviluppo Arduino ,
Comunque sia per chi è alle prime armi alla programmazione via seriale o fisicamente e tramite USB la trovo molto più interessante visto che non necessita di comprare un programmatore che costa tanto.
Avendo Arduino che è stato gentilmente regalato da questo sito che ringrazio ancora ,
Si possono fare dei programmi abbastanza semplici e che fanno accendere o spegnere un LED o controllano lo stato di un pulsante e che poi dialogano tramite seriale,
uno dei più semplice e scrivere un programma che ascolta la seriale e quanto riceve ” 1 ” tramite la seriale accende un LED è quando riceve ” 2 ” spegne tale LED ,
o il contrario un tasto quando viene premuto invia sul seriale un messaggio di tipo ” on ” è quanto viene rilasciato manda il segnale ” off ” ,
Io penso che più un spirito di rendere ancora più open source il progetto Arduino ,
È non legarsi ad tecnologie chiuse o proprietarie ,
Perché semplicemente anche il fatto di usare un componente più costoso come microcontrollori deve costare più che usare FTDI dedicato ,
È anche questo lo spirito open source ,
Avere anche in mano i protocolli di dialogo RS232 < - > USB così da poter fare tutte le modifiche che ci sembrano necessarie in un dovere dipendere dai fabbricanti
Perché le ragioni economiche o di licenza non tengono in questo caso
Ti consuma 1k di memoria perchè oltre al tuo programma, viene inserito uno stralcio di codice di inizializzazione del micro stesso. Da qualche parte mi pare di aver letto che questo codice ammonta in termini di memoria occupata a circa 600byte o giù di li…se provi a realzzare codici più complessi, ti renderai conto che l’efficienza tende ad aumentare, anche perchè il compilatore è lo stesso che andresti ad utilizzare per la programmazione dell’ATMEGA328 preso singolarmente. Il codice a cui mi riferivo non c’entra nulla con il bootloader…non sto assolutamente confondendo le due cose. E’ come partire da un consumo di memoria minimo per poi aumentare l’occupazione in maniera proporzionale alla complessità e alla lunghezza del codice.
Non penso che dovrò dare problemi avere tutto sullo stesso microcontrollori visto che Arduino non è proprio il prodotto che deve essere usato commercialmente ma solo a livello visto o insegnamento ,
Io penso che è anche una questione di protezione a livello della perdita del bootlord avendo due microcontrollori sulla stessa scheda si possono aggiungere delle sicurezza in caso di perdita del bootloda ipotesi una funzione in caso che venga scritto male il programma è venga cancellato tutte le voci in legato alla programmazione con il secondo microcontrollori che gestisce USB puoi ripristinare questa alle funzioni . Senza ricorrere a un programmatore dedicato .
Ragionandoci bene, il tuo discorso potrebbe essere abbastanza giusto, però ti ricordo che l’ATMEGA utilizzato come USB<->RS232 bridge non fa altro che convertire un protocollo nell’altro, quindi non vedo come si possa agire modificando tale funzionalità. Tra l’altro, il micro in questione non è neanche accessibile dall’esterno per essere riprogrammato, quindi cosa bisogna fare? bisogna toglierlo dalla scheda, modificarne il firmware per aggiungerci cosa rispetto a ciò che fa già? Io rimango per l’idea che la motivazione è principalmente di carattere economico, anzi forse anche per evitare di personalizzare troppo il proprio hardware. Ti spiego cosa intendo. Se vai sul sito di FTDI puoi scaricare gratuitamente un software per la generazione del id-USB e di tutte quelle personalizzazioni come il messaggio che ti compare in basso alla barra di notifica quando viene rilevato un nuovo hardware connesso alla porta USB del PC…con l’implementazione del bridge tramite micro Atmel, questa possibilità viene a decadere rendendo meno personalizzabile (o almeno in maniera semplice)il proprio progetto…Io continuo a vederla come una chiusura più che un’apertura verso l’Open Source…
Guarda che forse stai confondendo un pò le cose…il bootloader è nel micro principale, non nel bridge, quindi se vai a sbagliare la programmazione (essenzialmente impossibile se utilizzi l’IDE messo a disposizione per Arduino che già gestisce le locazioni di memoria in modo da non andare a sovrascrivere nulla) lo perdi comunque il bootloader e devi avvalerti di un programmatore esterno per ripristinare il codice di Arduino…
La atmel sta vendendo ora dei microcontrollori con bootloader che in questo caso sono usati come bridge. Qui sul datasheet che ho io parla di AT90USB128x AT90USB64x AT90USB162 AT90USB82 ATmega32U4 e ATmega16U4. Il bootloader è collocato nella sezione di boot della memoria flash sul chip, gestisce i protocolli di comunicazione e le operazione di lettura e scrittura della EEPROM e della Flash. Il bootloader può essere attivato da:
– Una jump o una call del programma (ad esempio metti un pulsante sul tuo aggeggio e questo fa partire il bootloader con un salto incondizionato o una chiamata a funzione).
– Dal “Boot reset fuse” che può essere programmato affinchè il reset vector punti al bootloader dopo il reset della mcu. Se viene fatto questo settaggio, l’impostazione può essere cambiata solo tramite le interfacce di programmazione seriale o parallelo
– Condizioni hardware esterne. È possibile fare in modo che sotto alcune condizioni, al reset si avii il bootloader.
Dicevo de specificamente il controllo più accurato durante le programmazione da evitare la scrittura errata nelle locazioni di memoria protette , chiaramente bridge come FT232 non può fare tale controllo ,
A differenza di un componente programmato ad hoc che potrebbe eseguire questi controlli ,
Io intendevo come altri dispositivi non solo RS232 < - > USB ,
Ma anche di poter programmare ad esempio come se USB si comportava come una tastiera o qualunque altro dispositivo USB , senza essere per forza un convertitore seriale ,
e si potrebbero mettere i denari altre funzioni che agiscono indirettamente sulla scheda ad esempio il riavvio del microcontrollori ,
La questione resta comunque quella secondo la quale al bootloader è associata un’area di memoria potenzialmente impenetrabile se si adopera il giusto IDE (perchè, in fase di linker, è necessario stabilire da quale locazione di memoria porgramma è necessario partire per evitare di sovrascivere il bootloader)…poi c’è un discorso paradossale dietro: come si fa a sovrascrive il bootloader se è il bootloader stesso a programmare la memoria del micro? Cioè, come è possibile che il codice di bootloader, in esecuzione, sovrascriva se stesso?? Se riuscite a spiegarmelo allora posso anche ammettere come valida l’ipotesi di controlli mirati ad evitare di fare danni sul micro (provenienti dal bridge tra l’altro…bha…)
>inserire righe di codice assembler in una schermata dell’ ide di arduino…
Potresti spiegare meglio cosa intedi. Thx
Sto leggendo due tre manuali scritti dall’inventore e mi sto documentando un sacco sullo studio di questa schedina. A me piace veramente un sacco anche se non l’ho ancora acquistata =)
La guida è fatta olto molto bene, passo per passo. Perfetta.
Se masticate un pò l’inglese ci sono questa serai di video fatti bene che mi mostrano come inziare e con quali progetti provare.
http://www.youtube.com/watch?v=fCxzA9_kg6s
Per il reste in rete si trovano migliaia di documenti di ogni tipo. Ma il link citato nell’articolo è veramente veramente prezioso.
Sarebbe bello creare anche una guida per l’installazione sotto linux 😉
Sul sito ufficiale di Arduino, c’è un esempio in cui viene utilizzata la periferica PWM in modalità High Speed andando a scrivere, dallo stesso ide di Arduino, i vari valori nei registri del micro. Sembrerebbe che non sia tutto così nascosto dalle librerie rilasciate e che invece ci sia la pssibilità di interagire in maniera un pò più diretta sulle risorse dell micro. Il linguaggio Assembly (Assembler è il compilatore,Assembly è invece il linguaggio di programmazione…piccolo punto di pignoleria…;)) non so se è supportato dal compilatore nascosto dietro il comando Verify dell’ide di arduino,ma potrebbe anche essere possibile integrare istruzioni di questo tipo…non ho mai visto in rete esempi utilizzanti l’Assembly, ma può essere che riesci a trovare qualcosa su qualche sito di hack o di cloni delle schede Arduino…se riesci nella tua impresa, rendici partecipi…la community ci conta!! 😉
Se proprio vuoi ottimizzare il codice del compilatore dell’ambiente di sviluppo Arduino ,
Sempre libero di recuperare i fari assembla che ha creato, come ho fatto io per darci un’occhiata dentro e modificarlo al tuo piacimento ,
ma non esistono funzioni come in altri ambienti di sviluppo ed esempio quello che ho usato scuola che era ” PIC Simulator IDE ” , dove bastava aggiungere in inizio della riga ” asm : ” è dopo scrivevi il tuo codice in assemblea il compilatore si prenderà in carico di questo codice già fatto ,
ma il bello di Arduino essendo un progetto open source è che si potrebbe tranquillamente aggiungere questa funzione senza troppe difficoltà .
Guida sintetica quanto coerente,anche perchè il sito,da me sconosciuto fino ad oggi è ricco di progetti molto interessanti sulle periferiche Arduino e Netduino
Ok, mi hai dato conferma di ciò che sospettavo, ciò l’impossibilità, ora come ora, di aggiungerci del codice Assembly nel proprio listato C scritto in ambiente Arduino…bella l’idea, comunque, di modificare successivamente il file Assembly generato, apportando tutte le modifiche del caso…ma ciò che mi chiedo, oltre al file assembly, non viene subito generato il file oggetto da scrivere nel microcontrollore? Cioè, una volta che modifico il file asm generato,sono sicuro che con I/O upload venga trasferito il codice oggetto relativo al file asm modificato?? Se così non dovesse essere, modificare a posteriori il file asm non ti permette comunque di apportare quelle modifiche sul file oggetto, o sbaglio?
L’ambiente di sviluppo adunino funziona su così ,
dal linguaggio C viene creato viene creato un codice assembla ,
e da questo assembla viene creato il codice macchina che si trovano sotto forma di un file hex ,
da lì puoi fare due cose o intercetti il file assembla e lo modifichi con tutti i rischi che incombe a questa pratica è che non conoscendo perfettamente i meccanismi del compilatore C che fa utilizzo Arduino c’è rischio che fa i quali nell’esempio ordini parte essenziale del programma o che fa i decori per esempio sopra scrittura di una variabile senza renderti conto .
il secondo modo e che crei una libreria direttamente in assemblea dopo fare un’unica chiamata alla libreria e una volta partita non si sposta da lì con un look infinito,
Ma chiaramente con la scheda di Arduino non è interessante scrivere direttamente codice assembla ma sembra visto che non sono applicazioni critiche ma serve piuttosto come oggetto educativo in un ambiente scolastico , o a fare piccoli progetti che non sono critici in ambito obistico
L’applicazione di Arduino in contesti essenzialmente educativi non lo deve assolutamente condannare ad essere visto come un ambiente di sviluppo che non sia capace di gestire situazioni più complesse…poter estendere l’efficienza del proprio codice è una possiblità che dovrebbe essere data, indipendentemente dal contesto di utenti che utilizza la board…
…poi devo chiederti una piccola gentilezza…sono cosciente del problema con cui ti ritrovi a scontrarti, la dislessia, ma noto che a volte i tuoi commenti sono molto più confusi e scritti male…poi ho letto che usi un programma di riconoscimento vocale per scrivere al pc…allora, prima di premere invio e pubblicare il commento, potresti rileggere il tutto?…penso che questo serva anche a te come esercizio per imparare a vincere il tuo problema…grazie!
Come tutti sapete, una volta scritto del codice in C, il compilatore si occupa di tradurlo in una sequenza di istruzioni rappresentate in codice binario. Il problema è che questa “traduzione” per quanto possa essere ottimizzata, non è mai proprio il massimo. Ad esempio se su arduino scrivere un ciclo che accende e spegne in continuazione l’uscita su un pin… insomma crea un’onda quadra, la frequenza di questo segnale arriva se non sbaglio fino a qualcosa dell’ordine dei khz. (l’ho misurata al laboratorio dell’uni) Invece credo che se la stessa funzione venisse scritta in assembly si riuscirebbe a ottimizzare molto il consumo di cicli istruzione. A me sarebbe piaciuto intervenire sul codice già preprocessato da GCC, in modo da poter ottimizzare le parti critiche del programma, ma sono cosciente che questa non è una cosa praticamente fattibile. Ho scoperto comunque che in C si può inserire del codice assembly usando queste tecniche: http://www.ibiblio.org/gferg/ldp/GCC-Inline-Assembly-HOWTO.html
Se devo essere sincero quando avevo provato a farla sta cosa avevo utilizzato un altro sistema, con una sintassi diversa, ma comunque pare che i sistemi descritti qui non danno problemi! O almeno utilizzando il comando asm(“”); non ci sono errori nel log del compilatore 😀 Ora devo riuscire a capire come rintracciare gli indirizzi delle variabili in memoria… Vi terrò aggiornati, a limite apro un thread apposito sul forum, per evitare di divagare qua. Al momento non lo conosco ancora l’assembly per MCU avr, ma do un’occhiata sul datasheet per trovare un’istruzione che posso usare senza problemi. a presto
In rete non c’è praticamente nulla che metta insieme assembly e arduino. Probabilmente perchè se una piattaforma nasce per essere semplice, è giusto che romanga tale. comunque sto riuscendo a muovermi bene, I datasheet sono fantastici, se tutti li leggessero non esisterebbero su internet forum di supporto… solo che a questo potevano metterlo un indice XD
Utilizzando un AVR della ATMEL presumo che occorra analizzare il lnguaggio assembler per questo tipo di microcontroller, ad esempio:
http://www.avr-asm-tutorial.net/avr_en/
Se c’è un microcontroller con le sue istruzioni da qualche parte dovrà esserci anche una sorta di manuale che ne illustri il codice assembler, altrimenti come farebbero i produttori a tirar fuori caratteristiche e funzionalità di un certo rilievo.
Naturalmente non ci si deve aspettare di trovare già tutto pronto perché è ovvio che un (bel) po’ occorre sbattersi.
Bye 😎
Ok, ho provato istruzioni di quelle che non necessitano la conoscenza dei registri come sec che setta il bit di carry, clc che lo azzera, sez che setta il flag Zero ecc. Queste istruzioni scritte in questa maniera
asm( “clv; clc;” );
non danno errore al momento della compilazione, e tutto fila liscio. altrimenti scrivendo queste righe
asm( “clv;
clc;
altre istruzioni;” );
Il compilatore da un errori come questi.
provaconnessioneseriale:50: error: missing terminating ” character
provaconnessioneseriale:51: error: missing terminating ” character
provaconnessioneseriale.cpp: In function ‘void loop()’:
provaconnessioneseriale:51: error: expected string-literal before ‘clc’
(ho usato un file a caso) Praticamente l’interprete crede che la stringa sia terminata già, quando in realtà sono solo andato a capo. La tecnica che dicevo nel post di prima che mi dava problemi non è altro che un modo per scrivere codice asm andando accapo senza scrupoli. Vedrò di migliorare i risultati… a fra poco
Non sono molto d’accordo con te. Se vado a modificare l’assembler creato dall’ambiente di arduino (che si appoggia a GCC) non ho molti vantaggi… Soprattutto perchè anche se lo modifico una volta, quando mi trovo a modificare e compilare di nuovo il programma perdo tutte le modifiche fatte in precedenza! Non è una cosa da poco, quando le ottimizzazioni servono sin dalle prime fasi di sviluppo di un sistema. Per quanto riguarda l’aggiunta di queste funzionalità, non è molto facile perchè, come detto prima, l’ambiente di arduino si appoggia a GCC per le sue compilazioni, e aggiungere funzioni significa creare una versione personalizzata (fork) di GCC, e non credo che sia una cosa da poco… Si tratta di prelevare i sorgenti di gcc, gcc-avr, capirli, modificarli e ricompilarli sperando che funzionino. Poi se si riesce in questo, si deve fare in modo che l’ambiente di arduino usi il compilatore giusto, e sono altre rogne
Una cosa un pò più comoda di quella di sopra è scrivere ogni riga di assembler tra virgolette, e andando a capo liberamente, in questo modo
asm( “clv;”
“clc;” );
così non ci sono errori e sicuramente è più leggibile del codice scritto tutto su una riga. Continuo a cercare qualcosa…
I primi due sono errori banali: manca un terminatore di stringa. Verifica nuovamente la sintassi.
La terza riga è più che altro un Warning e non è un errore.
La quarta riga: riguarda una “string-literal” (in mancanza di sorgente non si può essere più precisi). Ancora una volta verifica il sorgente.
Bye 😎
Nello steso post ho scritto anche il codice che funzionava… Solo che mi sarebbe piaciuto poter andare a capo senza problemi. in php si fa una cosa del genere
public $bar = <<
Sotto linux l’installazione è a prova di idiota. Basta scaricare solamente il file compresso dal sito ufficiale, scompattarlo in una cartella e eseguire il file “arduino”. Alcune distribuzioni come ubuntu e se non sbaglio anche fedora, di recente hanno inserito arduino nei propri repository, in maniera tale che chi deve utilizzare questo ambiente, per installarlo deve solo selezionarlo dal gestore di pacchetti, come ad esempio synaptic (di recente mi pare che l’hanno chiamato gestore applicazioni, non ricordo) oppure, sempre per ubuntu, il software center. Non è nemmeno necessario installare i driver per il chip ftdi, infatti linux lo riconosce automaticamente, senza bisogno di installazioni aggiuntive. E infine se uno vuole scaricarlo dal sito, piuttosto che affidarsi al gestore integrato, noterà che la differenza è che la versione per windows è grande quasi 90MB, quella per linux 3MB. Questa differenza è in gran parte dovuta al fatto che la versione per windows contiene anche gcc, mentre quella per linux no, e va installata apparte. I pacchetti da installare sono gcc, gcc-avr, libavr e tutti quelli che il gestore di pacchetti suggerirà. Se ho dimenticato qualcosa basta chiedere. Finora ho usato arduino praticamente solo su linux. È davvero tutto molto facile, difficile sbagliare
Ti riferisci al bootloader di arduino? Quello non è possibile aggiornarlo dentro la scheda perchè i comandi che arrivano al m.controllore vengono interpretati, ciò rende impossibile sovrascrivere il bootloader all’interno dello stesso arduino per lo stesso motivo che dicevi tu prima, cioè non è possibile scrivere una porzione di memoria che è ancora in esecuzione.
Se devi fare una cosa del genere comunque puoi affidarti a sistemi che effettuano la scrittura a basso livello dell’integrato, come i “vecchi” programmatori che si montano alla porta parallela. Quel sistema resta sempre valido, nonché molto semplice… Al giorno d’oggi magari è abbastanza probabile che se il computer è recente non ha la porta parallela
Hai ragione in effetti.. io uso linux quotidianamente ma sento che la maggior parte della gente alla sola parola trema perchè pensa a qualcosa di impossibile =)
Si può fare ben di più, e lo assicuro. Sto pian piano sviluppando un programma per la gestione dell’accensione in un motore a scoppio quindi gestione realtime dove sbagliare di un solo ms l’esecuzione di un comando comporta unaimprecisone non concessa. Tutto sta a saper come settare i timer e gli interrupt, il resto e solo una marea di tempo perso nel debug. Nonostante il livello medio dei programmi che si vedono in giro un Atmega328 può fare ben altro. Dipende da chi scrive il programma però.
Se proprio vuoi ottimizzare il codice non usi l’ide di arduino, basta e avanza come miglioria. Scrivi il programma in ansi C e lo compili con gcc per avr. L’ide di arduino comunque implementa tutte le funzioni standard quindi pure l’uso di codice assembly.
L’area di memoria in cui risiede il programma può essere scritta dal programma stesso infatti pur essento l’atmega 328 ad archittettura harvard l’area di memoria, in questo caso flash, destinata al programma può essere scritta quasi come la vera e propria area dati, eeprom. In questo caso si dice che la architterura è di tipo harvard modificata. Nelle archittetture harvard si possono distinguere due aree di memoria distinte, una dati e una programma.
Più semplicemente:
$sudo apt-get install arduino
Ci siamo chiesti se era possibile nell’ambiente di sviluppo della Arduino si era possibile integrare nel codice scritto in linguaggio C dei pezzi di linguaggio assembla ,
dopo un po’ di ricerca ho trovato la soluzione :
Basta usare questa sintassi :
//codice C
asm(
//codice asm
);
//codice C
Se fate uso di tale sintassi e di tale metodo di programmazione dovete stare attenti molto al transito delle variabili tra i diversi linguaggi di programmazione
Per evitare questo problema è meglio che il codice scritto in linguaggio assembla viene racchiusa in una funzione e non sparso per tutto il codice del programma.
Lo scrivo qui in fondo per non dover scrivere come risposte in 20 domande diverse,
..se usi ubuntu..
Con le debian cambia leggermente XD
Differenza sottile ma importante.
Direi Gestione pacchetti-> cerchi arduino e installi..questo è più universale =)
Mai vista una guida fatta meglio!
Questo è dovuto soprattutto al mercato del microcontrollore è soprattutto fatto di piccole aziende o soprattutto di hobbisti e anche a livello educativo ad esempio nelle scuole tecniche
Dove il loro progetti non richiede molte risorse ,
ad esempio nei progetti dove sono chiesti risorse molto più importante e comincia a entrare in gioco i componenti chiamati FPGA si sono molto più scalabili e molto più potenti e hanno una flessibilità maggiore di un micorntrollore , dopo FPGA incomincia entrare in gioco la fabbricazione sul silicio di un circuito vede proprio che è stato ottimizzato al massimo per eseguire la funzione che gli richiedono .
In realtà non dovresti modificare gcc ma solo l’ ambiente di sviluppo a Arduino , semplicemente perché il compilatore ” gcc arv ” chi è stato scritto apposta per questo tipo di processore è già stata incrementato la possibilità di inserire in mezzo al codice di programmazione scritta in linguaggio C un pezzo di programma interamente scritto direttamente in assembla ,
Chiaramente se uno vuole fare un programma fatto bene usa direttamente gcc avr senza l’ambiente di sviluppo di Arduino ma perde tutte le comodità di poterlo caricare direttamente sulla scheda Arduino tremendo solo un tasto .
Un altro problema che si pone è tra il linguaggio c e il linguaggio assembla ,
Il transito delle variabili ad esempio si usa una variabile nel primo blocco di programma scritto con il linguaggio C e il secondo blocco scritto con il linguaggio assembla come faccio a riusare la stessa variabile .
L’ide di arduino utilizza di già i gcc per AVR…quindi non dovrebbero esserci problemi nell’utilizzare l’ide di arduino per istruzioni che sono implementate nel compilatore c ufficiale per AVR (il gcc appunto…)
Il problema principale non è detto che lo studio di sviluppo di Arduino passa le istruzioni giuste al gcc quando il programma viene mandato in compilazione visto che deve anche fusiona la parte del programma che serve al bootloder ,
si, lo so… è una delle cose che mi stavo ponendo di risolvere. forse scrivendo ad esempio
&variabile si ottiene il puntatore che è compatibile con l’assembler, appena ho voglia provo
si, si molti commenti indietro ci ero arrivato a questa soluzione. avevo scritto del mio dubbio perchè in passato avevo provato a inserire codice assembly dopo aver specificato la direttiva
#pragma ASM
codice asm
#pragma ENDASM
al compilatore, ma evidentemente gcc-avr non la supportava, forse funziona solo in C standard, e con arduino non va bene che è C++. Ieri sono andato a dare di nuovo un’occhiata e ho trovato la stessa soluzione dell’istruzione asm()
Come detto sopra, probabilmente si riesce a passare l’indirizzo esadecimale di una variabile utilizzando l’operatore &. la cosa però diventa scocciante perchè l’istruzione asm prende come ingresso una stringa. per inserire gli indirizzi di memoria bisogna anche andare a modificare la stringa con tutte le complicazioni che ci sono, che non sono molte ma appesantiscono il codice. Resta comunque molto comodo per fare modifiche sui bit di stato del microcontrollore, dato che le istruzioni in C per farlo non me le ricordo mai
Non capisco perchè vuoi introdurre,o meglio l’utilità del linguaggio Assembler in un linguaggio C,quali vantaggi comporta?
Il linguaggio assembla rispetto al linguaggio C è un linguaggio di più basso livello quindi risulta più vicino linguaggio macchina,
Aggiungere pezzi assembla può risultare più snello a livello di programmazione e creare un programma più compatto e più performante , il compilatore di linguaggio C a volte a fare certe operazioni c’impiega molte centinaia di linea di codice quanto al confronto stesso dell’azione potrebbe essere fatta utilizzando usare poche righe di linguaggio assembla .
l’esempio tipico è la moltiplicazione per due di una variabile , con l’assemblea in una sola operazione puoi fare tale moltiplicazione facendo scorrere il bit della variabile di una volta a destra
Se in programma per un microcontrollori è scritto direttamente in linguaggio assemblea risulterà molto più snello il molto più ottimizzato che usare qualsiasi compilatore di linguaggio c o un linguaggio Basic ,
Un altro problema del compilatore di linguaggio C e che non ottimizza i programmi di corte lunghezza perché è necessario come base avere un certo numero di istruzione quindi chi rapporta un certo numero di righe di codice macchina necessaria anche se vengono usate poche in questo caso ti conviene direttamente in linguaggio assemblea ma per un programma piuttosto lungo piuttosto complesso e linguaggio c essendo strutturato risulta più comodo e un ottimo compromesso nella lunghezza del programma di fronte allo stesso programma scritto in linguaggio assembla ,
Utiizzando un qualunque compilatore C per microcontrollori (non importa quale, tanto questi compilatori lavorano tutti allo stesso modo indipendentemente dal tipo di microcontrollore considerato) e andando ad aprire il file assembly che ne viene generato (infatti la sequenza di complizione è C -> assembly -> hex/obj)in fase di linker e compilazione, ti renderai conto come per l’operazione più stupida (come la semplice somma tra 2 variabili di tipo byte), il compilatore esgue un sacco di istruzioni in più e ridondanti e questo perchè sfrutta un sistema di salvataggio dei registri e stack su dei registri di supporto. Quindi, per fare una somma, quello che tipicamente il compilatore fa è salvare le variabili in alcuni di questi registri di supporto e usare questi per effettuare la somma a sua volta salvata in un ulteriore registro. Intuirai, a questo punto, che non è solo il programma in se ad essere poco ottimizzato, ma anche l’utilizzo della memoria ram non è agli alti livelli di efficienza…quindi se in assembly la somma di due numeri si conclude in sole 2 istruzioni, la medesima cosa non si potrà dire per il programma compilato dal C.
@Fabrizio87: giusto una piccola correzione al tuo commento: per effettuare su un byte la moltiplicazione per 2 è necessario traslare i bit di una posizione a sinistra, non a destra…in quest’ultimo caso si dividerebbe per 2…sicuramente ti sarai confuso o è stata una svista! 😉
Una cosa molto interessante che lavorando direttamente su byte possono effettuare delle operazioni matematica facendo scorrere sia destra o sinistra si possono ottenere la divisione una moltiplicazione per i fattori della potenza di due come 2 , 4 , 8 e tutti gli altri ,
Ma prima di effettuare tale operazione è necessario tenere conto del tipo di variabili che si sta impiegando questo è valido solo su variabili di tipo baty e non di tipo In virgola mobile dove tutti insieme bit non corrispondono al valore assoluto ma un valore codificato ,
Un’altra cosa interessante è per calcolare se il numero è pari o dispari basta leggere i bit meno significativo .
Ma credo che ormai tutti compilatori hanno già integrato quest’ ottimizzazione apriori senza doverla e metterla per conto nostro .
Ottima guida, veramente ben fatta. Però il libro ufficiale non si batte!