Arduino Forum

International => Italiano => Hardware => Topic started by: DarkIaspis on Oct 10, 2012, 03:31 pm

Title: [Arduino as ISP]Programmare ATMEGA168 SMD
Post by: DarkIaspis on Oct 10, 2012, 03:31 pm
Ciao a tutti!
Ormai è da un po' che bazzico il mondo arduino, ma mai come adesso ho sentito il bisogno di rivolgermi specificamente a forum per risolvere un piccolo ma grande problema.
Non molto tempo fa mi è stato regalato una scheda per la gestione di segnali analogici che monta un ATMEGA168 (tipo SMD), senza però badare al fatto che per essere usato è chiesto il programmatore AVR.
Non ho resistito a cercare soluzioni con arduino. Infatti, manco a farlo apposta, c'è anche nell'IDE il programmino da installare che fa proprio al caso mio.
Fino ad oggi non si contano il numero di guide che ho seguito. La faccio molto sintetica:
1) ho collegato i pin D11 al MOSI, D12 al MISO D13 al SCK, D10 al Reset ed infine le alimentazioni.
2) ho programmato la mia arduino (uno rev2) come ISP
3) ho digitato il comando avrdude -P COM4 -b 19200 -c avrisp -p m168 -v -e -U flash:w:prova.hex
4) ottengo l'errore "avrdude: Device signature = 0x000000"

Ho provato di tutto: scaricato un altro programmino (ArduinoISP2), montato resistenza e/o capacità sul pin di reset della mia arduino, collegato resistenze al pin di reset della scheda con l'atmega168 smd. Insomma... non so più che devo inventare! Avete suggerimenti? Grazie per il supporto!


P.s. sulla scheda in questione è disponibile un bottone di reset. Mi sono accorto che se lo tengo premuto l'avrdude prosegue e risponde " stk500_program_enable(): protocol error, expect=0x14, resp=0x50
initialization failed, rc=-1" e poi " stk500_program_enable(): protocol error, expect=0x14, resp=0x51"
Title: Re: [Arduino as ISP]Programmare ATMEGA168 SMD
Post by: PaoloP on Oct 10, 2012, 03:49 pm
La guida definitiva!!  :smiley-mr-green: :smiley-mr-green: :smiley-mr-green: --> http://www.michelemenniti.it/arduino_burn_bootloader.php

Edit: Durante la programmazione potresti avere dei problemi a causa di altri circuiti presenti sulla scheda.
Title: Re: [Arduino as ISP]Programmare ATMEGA168 SMD
Post by: DarkIaspis on Oct 10, 2012, 05:25 pm
Ho seguito la guida alla lettera, ma purtroppo continua a darmi quell'errore. A bordo del dispositivo non c'è nient'altro se non molti transistor discreti, led e capacità.
Title: Re: [Arduino as ISP]Programmare ATMEGA168 SMD
Post by: PaoloP on Oct 10, 2012, 06:00 pm
Puoi indicarci il modello della scheda o farci una foto oppure postare lo schema.
Dovresti controllare cosa c'è collegato ai pin MISO, MOSI e SCK del micro.
Title: Re: [Arduino as ISP]Programmare ATMEGA168 SMD
Post by: menniti on Oct 10, 2012, 06:08 pm
Quoto Paolo, usare AVRDUDE (peraltro ad occhio quella riga mi sembra sbagliata...) o l'DE direttamente non modifica la situazione; il condensatore (la R non serve più, v. ultimo aggiornamento della Guida) lo devi usare solo per l'errore dell'autoreset; i pin miso, mosi, sck del micro target DEVONO essere liberi, se c'è collegato qualcosa (basta una R di pull-down) è facile che la programmazione non vada a buon fine; se possiamo vedere lo schema elettrico del tuo circuito diventa facile capire se c'è un problema del genere. Nel caso puoi sempre ricorrere alla programmazione seriale, sempre che almeno i pin 2 e 3 del micro target siano liberi. Se così non fosse avrebbero creato una scheda NON programmabile, visto che il micro è smd e non puoi smontarlo.
Title: Re: [Arduino as ISP]Programmare ATMEGA168 SMD
Post by: Pelletta on Oct 10, 2012, 06:13 pm
Posta anche la sigla dell'ATmega168 che hai, ne fanno tante versioni; non si può certo dire che alla 
Atmel (http://www.stkcheck.com/evs/atmel/atmelheader2.asp?mfg=atmel&part=ATmega168#__utma=51109366.323947567.1349885162.1349885162.1349885162.1&__utmb=51109366.2.10.1349885162&__utmc=51109366&__utmx=-&__utmz=51109366.1349885162.1.1.utmcsr=google|utmccn=%28organic%29|utmcmd=organic|utmctr=atmega168&__utmv=-&__utmk=6805110) non si danno da fare
Title: Re: [Arduino as ISP]Programmare ATMEGA168 SMD
Post by: DarkIaspis on Oct 10, 2012, 06:17 pm
Le scritte sono riprodotte su due righe in questo modo:
ATMEGA168
20AI 0535
Title: Re: [Arduino as ISP]Programmare ATMEGA168 SMD
Post by: menniti on Oct 10, 2012, 06:18 pm

Posta anche la sigla dell'ATmega168 che hai, ne fanno tante versioni; non si può certo dire che alla 
Atmel (http://www.stkcheck.com/evs/atmel/atmelheader2.asp?mfg=atmel&part=ATmega168#__utma=51109366.323947567.1349885162.1349885162.1349885162.1&__utmb=51109366.2.10.1349885162&__utmc=51109366&__utmx=-&__utmz=51109366.1349885162.1.1.utmcsr=google|utmccn=%28organic%29|utmcmd=organic|utmctr=atmega168&__utmv=-&__utmk=6805110) non si danno da fare

giusto, ma stai certo che l'errore che ottiene è perché non c'è dialogo ISP, in caso contrario avrebbe ricevuto un messaggio in cui si riportava la signature reale del micro rispetto a quella "attesa" (expected), infatti sta confermando (mentre scrivo) che il modello è esatto ;)
Title: Re: [Arduino as ISP]Programmare ATMEGA168 SMD
Post by: DarkIaspis on Oct 10, 2012, 06:23 pm
Ecco lo schematico.
Da notare che io ho facoltà di selezionare con un jumperino se il pin R/S dello SPI deve essere SS o RST. Entrambe le configuazioni non cambiano il risultato.

EDIT: scusate, in realtà se lo jumperino sta su SS ottengo lo stesso risultato se tengo premuto reset della scheda durante tutta la fase.
Title: Re: [Arduino as ISP]Programmare ATMEGA168 SMD
Post by: menniti on Oct 10, 2012, 06:46 pm
Che valore hanno le R in serie ai segnali miso, mosi e sck?
Quei diodi cosa sono?
a mio parere entrambi i componenti disturbano fortemente i segnali di programmazione, considera che se sono diodi comuni tipo 1N4148 abbattono il segnale a 0,7V, quindi ti scordi la parte HIGH della comunicazione, se invece sono degli zener bisogna capire qual è il valore ma a questo punto sarebbe completamente sballato il fatto che le R sono a valle del diodo. Oppure questo circuito deve pilotare qualcosa che lavora a tensione inferiore e quindi gli zener servono per diminuire la soglia dei segnali in uscita dal 168, in questo caso non  puoi usarli come ingressi
Title: Re: [Arduino as ISP]Programmare ATMEGA168 SMD
Post by: DarkIaspis on Oct 10, 2012, 06:47 pm
E' un semplice circuito ESD sembra... quindi fatto per impedire sovratensioni no?


edit: vi carico l'intero schematico
Title: Re: [Arduino as ISP]Programmare ATMEGA168 SMD
Post by: PaoloP on Oct 10, 2012, 06:53 pm
Non vede oscillatore esterno nello schema quindi bisogna supporre che usi quello interno.
In questo caso occhio ai fuse.
Title: Re: [Arduino as ISP]Programmare ATMEGA168 SMD
Post by: menniti on Oct 10, 2012, 07:03 pm
Hai ragione Paolo, ma a questo punto mi sa che iniziamo uno di quei mega-Topic (ma solo per durata :smiley-sweat:) con AVRDUDE. Però insisto sul fatto che quei diodi disturbano la programmazione. Infatti il connettore SPI a pagina 2 dice chiaramente che NON è collegato direttamente sui pin del micro.
Dark, quei diodi che sono? le info ti si devono tirare con le pinze da dentista ]:D
Title: Re: [Arduino as ISP]Programmare ATMEGA168 SMD
Post by: DarkIaspis on Oct 10, 2012, 07:07 pm
Dai! Sto rispondendo a tutte le domande xDDD
Ripeto sono circuiti ESD per la protezione dalle cariche elettrostatiche, non dovrebbero proprio entrare in funzione.
Title: Re: [Arduino as ISP]Programmare ATMEGA168 SMD
Post by: menniti on Oct 10, 2012, 07:17 pm
Va bene, diamo per scontato che quel circuito di ingresso non influenzi la programmazione. Due domande:

Sai con certezza che IN QUELLE condizioni il micro sia programmabile esternamente?
A che frequenza sta lavorando il micro, visto che non c'è un oscillatore esterno?
Title: Re: [Arduino as ISP]Programmare ATMEGA168 SMD
Post by: DarkIaspis on Oct 10, 2012, 07:20 pm
Bah... suppongo alla frequenza di tutti gli atmega168 smd. Cerco nei datasheet se serve!
Title: Re: [Arduino as ISP]Programmare ATMEGA168 SMD
Post by: menniti on Oct 10, 2012, 07:41 pm

Bah... suppongo alla frequenza di tutti gli atmega168 smd. Cerco nei datasheet se serve!

Non ci siamo, le domande erano due e la prima è fondamentale, io sono disposto ad aiutarti a patto che non dobbiamo fare una lotta contro i mulini a vento.
I data-sheet li sappiamo leggere tutti, i micro ATMEL AVR escono di fabbrica con clock 1MHz, possono lavorare senza oscillatore esterno fino a 8MHz, con oscillatore esterno fino a 16-20MHz.
Se non sai con certezza che il circuito sia programmabile così com'è, perdiamo solo tempo, e io più lo guardo e più lo vedo un qualcosa fatto per essere usato così com'è.
Se non sai con certezza qual'è il clock di impostazione ce lo dobbiamo ricavare, ma a questo punto diventa fondamentale avere risposta al primo quesito.
Altra domanda: hai possibilità di eliminare la "protezione ESD" temporaneamente, in modo da collegarci direttamente ai pin del micro?
Title: Re: [Arduino as ISP]Programmare ATMEGA168 SMD
Post by: DarkIaspis on Oct 10, 2012, 08:14 pm
Mi dispiace se ho sagomato la risposta con un tono che non ti è piaciuto, ma la mia intenzione è solo ricevere aiuto. Alla domanda della frequenza non so rispondere, perché questo aggeggio non ha oscillatori esterni e se lo accendo più del led rosso del power non mi da niente. Dunque immediatamente mi vien da rispondere in quel modo.
Dovrebbe essere programmabile, riporto alcune diciture dal foglietto uscito all'interno:

The device has one in-system programming connector, J1. A common SPI cable can be used. When connecting the programming cables, ensure that the VCC and GND pin labels on the cable match the VCC and GND pins on the board. Programming can be accomplished using the AVRDUDE programmer in the WinAVR release for in-system programming. Connector J1 is used both for in-system programming and for user access to the SPI controller. The jumper block JP10 is used to select between the two functions. The shorting block is placed in the RST position for in-system programming, and in the SS position for user access to the SPI port.
Title: Re: [Arduino as ISP]Programmare ATMEGA168 SMD
Post by: menniti on Oct 10, 2012, 08:21 pm
No, figurati, che c'entra il tono? mica sei stato sgarbato :) il problema è che le informazioni servono, tutto qui, ora le hai fornite, quindi il costruttore garantisce che si può programmare il micro anche in queste condizioni circuitali, resta il problema del clock ma quello si supera. Solo che non disponiamo di una board e non vale la pena costruirla a tentativo, quindi resta come unica strada quella che stavi percorrendo, la riga di comando.
Che versione di IDE stai usando?
Title: Re: [Arduino as ISP]Programmare ATMEGA168 SMD
Post by: DarkIaspis on Oct 10, 2012, 08:25 pm
La 0022, ma le ho praticamente tutte xDDD.

Se può servire ho visto che questa scheda che ho è il pezzotto cinese di questa scheda della digilent (chissà perché la cosa non mi stupisce). Ho visto che il datasheet è praticamente lo stesso (http://www.digilentinc.com/Products/Detail.cfm?NavPath=2,396,565&Prod=MINICON)
Title: Re: [Arduino as ISP]Programmare ATMEGA168 SMD
Post by: menniti on Oct 10, 2012, 08:28 pm
Per ora non serve, allora pazienta che provo a buttar giù la riga di comando per la 0022, a dopo
Title: Re: [Arduino as ISP]Programmare ATMEGA168 SMD
Post by: DarkIaspis on Oct 10, 2012, 08:41 pm
Leggendo dal rm di digilent, più completo, ho visto che sulla resistenza R29 è possibile fornire un clock esterno. Fornendogli quello della arduino l'errore è diverso: "Expected signature for ATMEGA168 is 1E 94 06 Double check chip, or use -F to override this chec"
Title: Re: [Arduino as ISP]Programmare ATMEGA168 SMD
Post by: PaoloP on Oct 10, 2012, 08:55 pm
Non è che nelle varie prove che hai fatto hai modificato i fuse ed adesso si aspetta un oscillatore esterno?
Leggi a pag. 5 nella sezione "AVR Clock Fuse Settings" --> http://www.digilentinc.com/Data/Products/MINICON/Minicon_rm.pdf
Quote
If the clock source fuses are set to select a clock source that doesn't exist on the board, the SPI controller won't work and it will no longer be possible to program the microcontroller via the insystem programming protocol. The Minicon can only use of the internal RC oscillator as the clock source.
Title: Re: [Arduino as ISP]Programmare ATMEGA168 SMD
Post by: DarkIaspis on Oct 10, 2012, 08:56 pm
Giuro che non l'ho mai usata e mai ho modificato i fuse. Ma se gli voglio far usare quello interno?
Title: Re: [Arduino as ISP]Programmare ATMEGA168 SMD
Post by: menniti on Oct 10, 2012, 09:01 pm
avrdude.exe -C "percorso\avrdude.conf" -p m168 -c stk500v1 -b 19200 -P COM4 -v -e -U flash:w:prova.hex:i

Il percorso dell'avrdude.conf dovresti aggiungerlo, al limite prova comunque ad eliminare -C "percorso\avrdude.conf"
Do per scontato che il file prova.hex si trovi nella stessa cartella dell'avrdude.exe, altrimenti devi aggiungere il percorso.
Questa riga dovrebbe funzionare usando Arduino UNO come programmatore ISP (caricagli dentro ArduinoISP originale della 0022), con i seguenti collegamenti:
Arduino         168
10                RST
11                MOSI
12                MISO
13                SCK
5V                VCC
GND             GND
NON devi usare resistenze/condensatori sul pin reset di Arduino, a meno che non esca un messaggio specifico. Prova e fammi sapere come va. NON fare prove "tanto per", se non sai cosa stai facendo, altrimenti rischi di sputtanare tutto e poi sono zz

EDIT: attenzione alla posizione dei jumper del reset e dell'alimentazione!
Title: Re: [Arduino as ISP]Programmare ATMEGA168 SMD
Post by: DarkIaspis on Oct 10, 2012, 09:20 pm
Ok... adesso però non gli sto più fornendo il clock esterno, mi sa che sta usando il suo perché almeno adesso si programma.
Mi viene fuori questo, va bene?

avrdude: Version 5.10, compiled on Jan 19 2010 at 10:45:23
         Copyright (c) 2000-2005 Brian Dean, http://www.bdmicro.com/
         Copyright (c) 2007-2009 Joerg Wunsch

         System wide configuration file is "C:\WinAVR-20100110\bin\avrdude.conf"


         Using Port                    : COM4
         Using Programmer              : stk500v1
         Overriding Baud Rate          : 19200
         AVR Part                      : ATMEGA168
         Chip Erase delay              : 9000 us
         PAGEL                         : PD7
         BS2                           : PC2
         RESET disposition             : dedicated
         RETRY pulse                   : SCK
         serial program mode           : yes
         parallel program mode         : yes
         Timeout                       : 200
         StabDelay                     : 100
         CmdexeDelay                   : 25
         SyncLoops                     : 32
         ByteDelay                     : 0
         PollIndex                     : 3
         PollValue                     : 0x53
         Memory Detail                 :

                                  Block Poll               Page
      Polled
           Memory Type Mode Delay Size  Indx Paged  Size   Size #Pages MinW  Max
W   ReadBack
           ----------- ---- ----- ----- ---- ------ ------ ---- ------ ----- ---
-- ---------
           eeprom        65     5     4    0 no        512    4      0  3600  36
00 0xff 0xff
           flash         65     6   128    0 yes     16384  128    128  4500  45
00 0xff 0xff
           lfuse          0     0     0    0 no          1    0      0  4500  45
00 0x00 0x00
           hfuse          0     0     0    0 no          1    0      0  4500  45
00 0x00 0x00
           efuse          0     0     0    0 no          1    0      0  4500  45
00 0x00 0x00
           lock           0     0     0    0 no          1    0      0  4500  45
00 0x00 0x00
           calibration    0     0     0    0 no          1    0      0     0
0 0x00 0x00
           signature      0     0     0    0 no          3    0      0     0
0 0x00 0x00

         Programmer Type : STK500
         Description     : Atmel STK500 Version 1.x firmware
         Hardware Version: 2
         Firmware Version: 1.18
         Topcard         : Unknown
         Vtarget         : 0.0 V
         Varef           : 0.0 V
         Oscillator      : Off
         SCK period      : 0.1 us

avrdude: AVR device initialized and ready to accept instructions

Reading | ################################################## | 100% 0.13s

avrdude: Device signature = 0x1e9406
avrdude: erasing chip
avrdude: reading input file "GccApplication1.hex"
avrdude: input file GccApplication1.hex auto detected as Intel Hex
avrdude: writing flash (178 bytes):

Writing | ################################################## | 100% 0.23s

avrdude: 178 bytes of flash written
avrdude: verifying flash memory against GccApplication1.hex:
avrdude: load data flash data from input file GccApplication1.hex:
avrdude: input file GccApplication1.hex auto detected as Intel Hex
avrdude: input file GccApplication1.hex contains 178 bytes
avrdude: reading on-chip flash data:

Reading | ################################################## | 100% 0.26s

avrdude: verifying ...
avrdude: 178 bytes of flash verified

avrdude: safemode: Fuses OK

avrdude done.  Thank you.
Title: Re: [Arduino as ISP]Programmare ATMEGA168 SMD
Post by: menniti on Oct 10, 2012, 09:31 pm
Yes, la riga di comando funziona; ora sei pronto per programmare il tuo circuito, metti il giusto file hex e sei a posto, non era questo che volevi? :)
Title: Re: [Arduino as ISP]Programmare ATMEGA168 SMD
Post by: DarkIaspis on Oct 10, 2012, 09:45 pm
Si... voglio provare ad accendere un led, ma al momento non ci riesco. A fasi alterne vuole il clock e non lo vuole :S


EDIT: come faccio a modificare il fuse per mettergli il clock interno?
Title: Re: [Arduino as ISP]Programmare ATMEGA168 SMD
Post by: menniti on Oct 10, 2012, 10:21 pm

Si... voglio provare ad accendere un led, ma al momento non ci riesco. A fasi alterne vuole il clock e non lo vuole :S


EDIT: come faccio a modificare il fuse per mettergli il clock interno?

che vuol dire vuole il clock e non lo vuole? e dove lo staresti prendendo tu questo clock da dare al 168?
il tuo circuito è GIA' settato per lavorare col clock interno, altrimenti non lo avresti programmato e sul circuito stesso sarebbe montato un quarzo o un risuonatore ceramico con due condensatori, sui due pin di clock
Title: Re: [Arduino as ISP]Programmare ATMEGA168 SMD
Post by: DarkIaspis on Oct 10, 2012, 10:23 pm
Al momento devo fornirgli io il clock dall'esterno (lo sto prelevando direttamente dal pin sull'atmega328 dell'arduino uno). Come faccio ad impostare che deve usare il clock dall'interno?


Edit: usando il calcolatore dei fuse ho ottenuto questa stringa sa settare (-U lfuse:w:0x62:m -U hfuse:w:0xdd:m -U efuse:w:0xf8:m)

Grazie a tutti veramente ^^