Pagine

giovedì 6 agosto 2009

Mini Tutorial per usare Arduino come programmatore ATMEGA8 / ATMEGA168

Il "cervello" di Arduino è il microprocessore ATMEGA. Partito con la versione ATMEGA8 si è passati al ATMEGA168 e, oggi il ATMEGA328.

E' possibile "staccare" il processore oppure acquistarne uno (un ATMEGA8 si acquista in un negozio di elettronica o su web a circa 3€) ed utilizzarlo standalone ovvero senza la nevessità di abbinarlo ad un Arduino.
Vantaggi:
  • Dimensioni estremamente compatte (paragonabili ad un Arduino mini)
  • Costo decisamente minore rispetto ad un Arduino (3€ rispetto 25€ di un Arduino)
  • Consumi minori dovuti a:
    • tensioni minori necessarie (dai 3V --due batterie da 1,5V in serie-- ai 5V contro i 5V-9V-12V di un Arduino)
    • frequenza di clock minore (8Mhz riducibile anche a 1Mhz contro i 20Mhz di un Arduino)
  • Oggetto completamente standalone
  • Maggiore spazio a disposizione (dato che non necessita del bootloader inserito in Arduino: il firmware viene flashato direttamente in esadecimale)
  • Utilizzo del IDE Arduino e non del linguaggio ASSEMBLY
Il problema fondamentale è riuscire a flashare il firmware all'interno del ATMEGA in modo che questo funzioni correttamente.
In questo minitutorial verrà spiegato come usare un Arduino per programmare un ATMEGA.

Passi preliminari

Preparazione dell'Arduino

Prima di tutto è necessario prendere un Arduino e caricare lo sketch presente in questa pagina come si è soliti caricare un qualsiasi sketch:
http://code.google.com/p/mega-isp/
Questo firmware permette di usare il nostro Arduino come programmatore del ATMEGA; in pratica, alla fine di questo tutorial è possibile passare un firmware al Arduino e questo, grazie al programma linkato lo trasferisce sul processore.
Successivamente è necessario dissaldare o tagliare in modo netto con un taglierino il jumper del reset presente subito sotto alla porta USB nella seguente immagine:

Questo passaggio è indispensabile per evitare di resettare sia l'ATMEGA sia l'arduino quando si passeranno i firmware.

Preparazione del ATMEGA

A questo punto si prenda l'ATMEGA e lo si sistemi sulla breadboard a cavallo della scanalatura.


Collegare Arduino al ATMEGA

L'arduino e l'ATMEGA comunicano con il protocollo ISP che sfrutta le porte MISO, MOSI, SCK, RESET come nello schema seguente


In pratica si colleghino i PIN dell'arduino posti in fondo alla scheda (che nella figura qui sopra si trovano nell'immagine in alto a destra) all'ATMEGA (come indicato nella figura qui sopra in fondo la penultima).
Per maggiore chiarezza riporto una immagine esplicativa rilevata dal sito tinker.it dove si vedono schematicamente le connessioni:

Si tenga conto che la connessione XTAL2 non è necessaria.
Ciò che viene fuori è la seguente figura:


Preparazione software e caricamento sketch

A questo punto tutto è pronto a livello hardware e si può procedere alla parte software.
L'IDE di Arduino contiene il programma avrdude.
Si deve preparare l'ATMEGA a ricevere i comandi. Per fare questo si apra una console, ci si sposti in dir_arduino/hardware/tools e si troverà l'eseguibile avrdude.
Quindi, da shell (per gli utenti windows sarebbe il prompt del dos) si digiti il seguente comando:

avrdude -pm8 -P/dev/ttyUSB0 -cavrisp -b19200

Ora l'ATMEGA è pronto per ricevere gli sketch.
Io ho provato il Blink ed il Fade.
Dall'IDE Arduino si prenda lo sketch desiderato (nel nostro esempio Blink), da Tools->Boards si scelga la scheda Arduino NG or older w/ATMEGA 8. Si compili e si faccia l'upload (questo passaggio genererà un errore ma serve per generare il file .HEX da caricare).
A questo punto ci si sposti nella directory sketckbook/Blink/applet e si digiti il comando:

avrdude -p m8 -c avrisp -U flash:w:/home/enkel/sketchbook/Blink/applet/Blink.hex -P

Dopo una serie di messaggi si dovrebbe ricevere la scritta "Thank you!" e se tutto va bene il nostro LED si accenderà e si spegnerà.

Nel mio caso si è usato un ATMEGA8; se si usasse un 168 o un 328 i comandi contemplerebbero m168 o m328 al posto di m8.

Note: opzioni particolari


E' possibile, tramite varie opzioni, fare in modo che l'ATMEGA funzioni in modalità differenti.
A questo proposito si può seguire il seguente sito:
http://code.rancidbacon.com/LearningAboutArduinoATMega8

Note: ATMEGA standalone

La cosa ancora più interessante è vedere lavorare l'ATMEGA senza necessità di essere alimentato dal PC. Nella figura che segue abbiamo preso due batterie da 1,5V collegate in serie e con queste abbiamo alimentato il processore che fa accendere e spegnere in modalità FADE un LED

48 commenti:

  1. Complimenti....Molto utile. ;)

    Simone.

    RispondiElimina
  2. bella vitto.
    mi sembra un buon tutorial.

    (é estremamente più sbatti, ma io sono passato dalle foto agli schemi su photoshop. avevi mai provato fritzig?)

    bravi
    d

    RispondiElimina
  3. ciao...mi daresti una dritta su come usare arduino per sistemi domotici??grazie!

    RispondiElimina
  4. Ciao,

    due domande.

    1) Dalle foto non riesco a decifrare le connessioni. Ad esempio, la prima foto, quella della preparazione dell'ATmega, serve solo per vedere dove piazzare l'ATmega sulla breadboard oppure bisogna mettere in piedi tutti i collegamenti?

    2) Ma l'ATmega standalone funziona sena nessuna circuiteria al contorno? Non serve almeno un quarzo?

    Grazie!

    RispondiElimina
  5. Ciao,
    per quanto riguarda la prima domanda, effettivamente hai ragione: le connessioni non si vedono bene. Per questo ho aggiunto una immagine presa dal sito tinker.it direttamente sul post.
    La trovi nel paragrafo "Collegare Arduino al ATMEGA" come seconda immagine: è più chiaro adesso?
    Fammi sapere così lo miglioro :-)
    Per quanto riguarda la circuiteria al contorno, tieni conto che abbiamo acceso e spento un LED e alimentato con batterie (quindi tensione e corrente stabili nel tempo) per cui non è servita alcuna circuiteria.
    Certo, se usi un alimentatore da 220V in AC... ti servono almeno delle resistenze ed un bel condensatore.
    Inoltre il quarzo non è necessario se ti "accontenti" di lavorare a 8Mhz. Arduino ha già un quarzo interno a questa velocità; se ti occorre una velocità maggiore allora necessiti effettivamente di un quarzo.

    RispondiElimina
  6. Molte grazie per le risposte.

    Lo schema presentato nella sezione "Collegare Arduino al ATMEGA" è molto chiaro e va proprio bene.

    In realtà io mi riferivo alla foto presente nella sezione "Preparazione del ATMEGA" dove si vede l'ATmega sulla breadboard con una serie di connessioni. Immagino la foto volesse soltanto far vedere dove posizionare il processore, le filature rosse e nere devono essere ignorate. E' così?

    Relativamente invece alla circuiteria, il fatto di lavorare a 8Mhz, che potrebbe anche andar bene, richiede qualche modifica da apportare al SW per inizializzare opportunamente l'HW?

    Grazie nuovamente.

    RispondiElimina
  7. Esatto: quella foto vuol solo far vedere la posizione del processore.
    Il software per l'8Mhz non deve avere particolari modifiche: cambia solo la stringa avrdude come puoi vedere da questo sito:
    http://www.engbedded.com/fusecalc/
    Scegli il ATMEGA168 e nel primo menù a tendina che ti appare di conseguenza, puoi scegliere la velocità di clock.

    RispondiElimina
  8. Inizio a capire...

    Però la situazione si ingarbuglia. Nel mio caso ho scelto ATmega328P dal menu a tendina, ho lasciato tutti i parametri di default ed ho ottenuto le stringhe:
    -U lfuse:w:0x62:m -U hfuse:w:0xd9:m -U efuse:w:0xff:m

    Dove e quando utilizzo le stringhe?

    Le aggiungo al comando
    avrdude -p m8 -c avrisp -U flash:w:/home/enkel/sketchbook/Blink/applet/Blink.hex -P

    che diventa:
    avrdude -p m8 -c avrisp -U lfuse:w:0x62:m -U hfuse:w:0xd9:m -U efuse:w:0xff:m -U flash:w:/home/enkel/sketchbook/Blink/applet/Blink.hex -P
    ?

    RispondiElimina
  9. Esatto.
    A questo punto però non riesco ad esserti di maggiore aiuto anche perchè la mia esperienza in questo campo non è così grande :-P
    Vedendolo ad occhio dovrebbe funzionare ma non mi assumo responsabilità in merito ;-)

    RispondiElimina
  10. Ok, grazie mille.

    Nella peggiore delle ipotesi aggiungo un quarzo come quello utilizzato da Arduino.

    Luigi

    RispondiElimina
  11. Ciao Vittorio,
    vorrei farti una domanda.
    E' possibile programmare un atmega328 privo di bootloader direttamente nella scheda arduino sostituendolo a quello già inserito con bootloader?

    Grazie.

    RispondiElimina
  12. Ciao, no non è possibile fare una cosa del genere.
    L'ATMEGA su Arduino necessita di bootloader.
    Non puoi sostituirlo con uno senza questa parte di codice.

    RispondiElimina
  13. Vittorio grazie per aver risposto.

    Volevo porti un'altra domanda, se possibile.
    Seguendo la procedura del tuo mini tutorial, quindi dissaldando il jumper di reset, è poi possibile continuare ad usare la scheda arduino come prima?

    P.S. La mia scheda duemilanove aquistata di recente non ha i jumper di reset come nella figura da te esposta.

    RispondiElimina
  14. In realtà nelle ultime schede non dovrebbe nemmeno più essere necessario tagliare il jumper del reset.
    Ad ogni modo si, puoi sempre usare Arduino normalmente. L'unico "inconveniente" è che prima di caricare uno sketch sopra devi resettare manualmente con il pulsante la scheda.

    RispondiElimina
  15. Vittorio sei gentilissimo.

    Quindi con questa procedura ( da te descritta ) posso programmate tutti i micro della Atmel o solo alcuni modelli?

    Rinnovo i grazie.

    RispondiElimina
  16. Questo non te lo so dice.
    So che, ad esempio l'ATTiny non si può programmare così ma sicuramente il 168 e 328 si :-)

    RispondiElimina
  17. Ok, grazie mille, Vittorio.

    Metterò in pratica il tutorial.

    Grazie.

    RispondiElimina
  18. Ho disponibile un programmatore ATMEL
    AVRDRAGON e vorrei programmare un ATMEL ATMEGA 168 per la mia scheda :Arduino Duemilanove dove normalmente è montato un ATMEGA 328.quarzo 16Mhz
    Quale file.hex devo usare??
    Devo impostare i Fuse manualmente o sono contenuti nel file HEX?
    (lo programmo sul AVR DRAGON poi lo trasferisco su Arduino)
    FInora quelli che ho programmato non vanno.
    Grazie
    Fernando

    RispondiElimina
  19. Ciao Fernando,purtroppo non capisco la domanda.
    Tu hai un ATMEGA 168 e vuoi programmarlo con Arduino?
    In tal caso non è necessario modificare i FUSE ma attenzione perchè senza il quarzo esterno questo lavorerà al massimo a 8Mhz

    RispondiElimina
  20. ho una scheda arduino2009 senza processore.
    non ho un chip mega328.
    Ho disponibile un chip mega168-20 vuoto.
    innanzitutto è compatibile con la board Arduino2009?
    se si che firmware debbo mettergli dentro (lo programmo su un'altra board atmel dragon stan alone programmer)
    che fuse devo mettere??

    --- dalle prove fatte tutti i firmware di arduino2009 ilo programmer mi dice che il programma è troppo grosso per essere contenuto..
    ho provato atmegaBoot_168_pro_8Mhz.hex(che ci sta) ma non va
    ----
    Quando viene venduta la scheda originale Atmega380-Arduino2009 che firmware monta??
    e ti chiedo ancora i Fuse sono contenuti nel file .HEX come nei pic o vanno messi manualmente nel programmer.
    ciao e grazie
    Fernando

    RispondiElimina
  21. Seguendo il mio articolo dovresti riuscire a inserire uno sketch direttamente nel tuo chip ATMEGA168 ma necessiti di un secondo arduino (come da articolo) per fare ciò.
    I FUSE vanno impostati inserendo il clock a 20Mhz e non il default a 8Mhz.
    Se al contrario vuoi fare in modo che il tuo 168 venga montato su una Arduino 2009 e funzioni normalmente, devi anche mettere il bootloader: su questo argomento, però, non ti so aiutare; non mi sono mai interessato.

    RispondiElimina
  22. Ciao ragà oltre questa ottima guida potete trovare molto materiale anche sul nostro gruppo di robotica opensource:

    http://www.hlrobotx.net/

    RispondiElimina
  23. Ciao volevo farti i complimenti per la chiarezza della guida e porgerti una domanda, premetto che studio questi componenti da qualche giorno, volevo sapere se è possibile fare l'operazione inversa del "flashaggio" del firmware o di programmi all'interno dei MC, in altre parole se è possibile leggere il contenuto di quanto memorizzato ed e eventualmente esaminarlo a parte. Grazie

    RispondiElimina
  24. Ciao Amedeo, ti ringrazio per il complimento.
    Per quanto riguarda la tua domanda, però, non so rispondere con esattezza. Purtroppo non sono un guru in materia ma un semplice appassionato.
    Da quanto ho capito quello che chiedi non è possibile perchè il tutto viene memorizzato in formato esadecimale dentro il microcontrollore.
    Tuttavia non ci metterei la mano sul fuoco :-)

    RispondiElimina
  25. Ciao Vittorio bella guida potresti allargarla anche su Mac?
    grazie in anticipo.

    RispondiElimina
  26. Ciao, per quanto riguarda il Mac non penso ci siano differenze.
    I comandi da usare sono senza dubbio gli stessi perchè avrdude è indipendente dalla piattaforma.
    Cosa non ti funziona?

    RispondiElimina
  27. ciao
    bellissimo blog, vorrei sapere se ho fatto le connessioni giuste tra la mia Arduino e l ATmega8..ti allego un file postscript
    https://docs.google.com/uc?id=0B3XrcvDwvBbaYjdkNDIyYTgtN2FkOC00MGMxLWFiZTItODRmNzM2YTNmYTcy&export=download&hl=en
    grazie tantissimo per l aiuto!;)

    RispondiElimina
  28. Ciao tonicooperi, purtroppo non riesco ad aprire il tuo link.
    Riesci a trovare un'altra collocazione? :-(

    RispondiElimina
  29. L' ho uppato su megaupload

    http://www.megaupload.com/?d=IDMLXG7K

    volevo sapere se le connessioni che ho disegnato sono giuste..se sì, la 5V e il GND che escono dai pin dell' icsp vanno collegati alle batterie??
    oppure se ho sbagliato qualcosa sapresti indicarmi dove?
    inoltre, scusa l' igoranza ma il led lo devo collegare all' arduino?
    grazie scusa il disturbo

    RispondiElimina
  30. Ciao, i collegamenti sembrano corretti.
    Ho ricontrollato tre volte lo schema ma non sembrano esserci errori.
    Il LED va collegato al ATMEGA altrimenti come fai a sapere se funziona o meno :-)

    RispondiElimina
  31. ecco :) e precisamente a quale pin dell ATmega?

    RispondiElimina
  32. in questo PDF riassumo tutti i miei dubbi :)

    http://www.megaupload.com/?d=E9VNNRU3

    allora è giusto il collegamento del led al pin 28 dell atmega?
    e soprattutto a cosa lo collego l altro polo del led.
    grazie ancora:)

    RispondiElimina
  33. Si è corretto al pin 28 e l'altro capo del LED lo collochi a massa :-)

    RispondiElimina
  34. Grazie per le dritte che mi hai dato,mi sono state di grande aiuto,ti contattero' in futuro.

    RispondiElimina
  35. Ciao. Sono uno studente che a comprato da appena una settimana una scheda arduino 2009 con CPU ATMEGA328. ho un piccolo problema. negli ultimi 3 giorni la mia arduino a smesso improvvisamente di funzionare, nel senso che non esegue più i programmi che gli scarico e sullo schermo in basso viene visualizzato l'errore:
    avrdude: verification error, first mismatch at byte 0x000 0x0c != 0xff
    avrdude: verification error; content mismatch

    Qualcuno avrebbe voglia di dirmi cosa significa tale errore? non o idea di come fare a risolvere questo broblema.
    Grazie

    RispondiElimina
  36. Ciao Vittorio. ho un problema con la mia arduino 2009 ATMEGA328. non riesco più a caricare i miei programmi. questo problema e spuntato d'improvviso 3 giorni fa, la scheda lo comprata una settimana fa e inizialmente funzionava perfettamente. sapresti dirmi qual'è il problema? non ho idea di cosa fare.
    grazie.

    RispondiElimina
  37. Ciao, sinceramente non saprei quale potrebbe essere il problema.
    Gli arduino sono ultra testati per cui, con un buon 98% escluderei un guasto hardware.
    Posso solo consigliarti di controllare le impostazioni dell'IDE: la porta USB (è sempre la stessa?) e il processore. Prova a modificare la porta usb e vedi se riesce a dialogare con l'arduino

    RispondiElimina
  38. Ciao vittorio complimenti per la guida. Volevo solo chiederti se usando un atmega328p standalone(col clock interno da 8mhz e non con quello da 16 dell arduino) come in questa guida sia necessario o meno adattare le istruzioni per la generazione dei PWM, ovvero è possibile continuare ad usare le istruzioni AnalogWrite ?

    RispondiElimina
  39. Ciao, si è possibile utilizzare AnalogWrite anche se tieni conto che è tutto dimezzato.
    Attenzione, come scritto, al fatto che il clock risente del cambio di temperatura e quindi non sarà mai troppo preciso...

    RispondiElimina
  40. Ciao Vittorio,
    complimenti per la preparazione e per l'ottima organizzazione del forum, sicuramente uno dei migliori.
    Ho una domanda da porti: vorrei programmare u micro atmega88 (anche se sinceramente non so se è possibile!) usando il file hex generato dall'IDE di arduino. Il file .hex l'ho trovato nella cartella temporanea nascosta "...\Impostazioni locali\Temp\build2497504785654741464.tmp" (ho win XP) e l'ho caricato il AVR Studio 4. Lancio la programmazione e va tutto ok, solo che...il micro non va!
    Tu sapresti dirmi il perchè? Forse devo per forza usare l'atmega328 al posto che l'atmega88? Tieni presente che sulla mia breadboard che ospita l'atmega88 non ho messo il quarzo...potrebbe essere quello?
    Ti ringrazio anticipatamente per la disponibilità!

    Gian

    RispondiElimina
  41. Ciao Gian, grazie per i complimenti.
    Sinceramente vado a ruota libera... Noi abbiamo usato un ATMEGA8, un 168.
    Non abbiamo usato il 328 nè tanto meno l'88...
    Probabilmente sono da modificare i parametri della compilazione che mi sembrano la parte più delicata del processo...

    RispondiElimina
  42. Ciao Vittorio,
    grazie per la veloce risposta! Ma la programmazione degli atmega8 e 168 l'avete fatta caricando l'.hex file generato dall'IDE di arduino con avr studo 4?

    Grazie,

    Gian

    RispondiElimina
    Risposte
    1. Caricando con avrdure (come descritto nel post) il file .HEX generato dall'IDE.
      AVR Studio non lo conosco :-)

      Elimina
  43. Salve,
    devo simulare il comportamento e poi programmare un ATmega 168.
    Uso la Dragon board, ma il mio problema sorge molto prima dell'uso della Dragon board: vorrei semplicemente scrivere e simulare un piccolo programma con AVR Simulator.
    Guardando i tutoriall presenti sul sito ATMEL risulta tutto piuttosto intuitivo, ma io non riesco ad usare ASF (AVR SOFTWARE FRAMEWORK)ovvero non riesco ad aggiungere DRIVER al mio progetto cliccando sul menù Project e scegliendo Select Driver from ASF perchè quest'ultimo menù è disattivato (grigio).

    Come posso usare ASF per implementare il mio programma?

    Ringrazio anticipatamente chiunque voglia rispondermi.

    Saluti a tutti!

    Sara

    RispondiElimina
    Risposte
    1. Purtroppo non riesco ad aiutarti. Non ho mai usato questi strumenti ma solo Arduino per la programmazione di un ATMEGA8 e 168.
      Mi dispiace, Vittorio

      Elimina
  44. ciao ,scusa ma non mi funziona avrdude.
    Sto cercando di istallare un bootloader su atmega168 avendo però un 328 su scheda arduino. Ho usato le soket sulla sceda arduino direttamente su atmega 168. please help me

    RispondiElimina
  45. Purtroppo ci siamo fermati al 168. Non so se quelli più "potenti" abbiano delle impostazioni di parametri dfferenti.

    RispondiElimina