avrdude -p m328p -c arduino -b 19200 -P /dev/ttyUSB0 -t

Salve gente, mi date una mano? ;"giuro ve la ridò appena posso".

Ho Arduino 2009 su Fedora 12 con kernel 2.6.35 (aggiornato a manina).

L'ide non funge su F12, non ho potuto appurare da cosa dipende, anche perchè non mi serve sviluppare programmi con la scheda, per il momento.

La 2009 è stata spenta per circa 1 mese, ora ricollegata volevo usare avrdude per entrare in modalità terminale, usano il comando seguente:

avrdude -p m328p -c arduino -b 19200 -P /dev/ttyUSB0 -t.

e questa è la risposta di avrdude:

avrdude: stk500_getsync(): not in sync: resp=0x21

avrdude done.  Thank you.

Nota che resp=xxx non è mai sempre lo stesso.

Cosa contiene la flash non me lo ricordo proprio, all'iserimento dell'usb i led lampeggiano normalmente a quello che mi ricordo. L led a volta e rx, tx si alternano velocemente per due volte o tre.

Il sorgente del bootloader e quello che si trova in hardware/arduino/bootloaders/atmega/ATmegaBOOT_168.c, giusto?

A voi quel comando funziona?

Ho provato anche ad aprire da python il device ttyUSB0, e ad inviare i codici presi dal sorgente ATmegaBOOT.... per vedere cosa riponde il bootloader, ma nulla da cui si possa dedurre informazioni utili.

Ps: Non ho altro Arduino, ne ISP ne altro sistema per flashare.

Ciao.

Premesso che in questo momento non ho sotto mano una installazione Linux e ho fatto la prova con Windows, ma non dovrebbe cambiare nulla, mi salta all'occhio il fatto che la velocità del bootloader per la 2009 è 57600 e non 19200, quindi la riga di comando è:

avrdude -p m328p -c arduino -b 57600 -P /dev/ttyUSB0 -t

Con windows, devo mettere comX al posto /dev/ttyUSB0, funziona perfettamente.

[mauro@localhost SPECS]$ avrdude -p m328p -c arduino -b 57600 -P /dev/ttyUSB0 -t
 
avrdude: AVR device initialized and ready to accept instructions

Reading | ################################################## | 100% 0.00s

avrdude: Device signature = 0x1e950f
avrdude>

Mi ha fregato il codice nel bootloader, da arduino 0018:

/* set the UART baud rate */

/* 20060803: hacked by DojoCorp */

//#define BAUD_RATE   115200

#ifndef BAUD_RATE

#define BAUD_RATE   19200

#endif

Ora funonzia, grazie astrobeed. Chissà quando ci sarei arrivato.

Ora posso avviare arduino IDE 0021, il pacchetto l'ho preso da F14, ma occhio che ho dovuto aggiornare il pacchetto rxtx-2.2-0.4.20100211 preso sempre dal repo di F14.

AStrobeed non è che sai cosa devo inviare al device per ricevere risposta dal bootloader. Mi serve scrivere codice per individuare a quale porta è collegata la scheda arduino. Se il bootloader mi risponde anche il tipo di arduino (2009 o Uno ecc) poi posso selezionare nella gui il modello.

Ok grazie di nuovo, ora provo un pò con python con il baudrate adatto.

Ciao.

AStrobeed non è che sai cosa devo inviare al device per ricevere risposta dal bootloader. Mi serve scrivere codice per individuare a quale porta è collegata la scheda arduino. Se il bootloader mi risponde anche il tipo di arduino (2009 o Uno ecc) poi posso selezionare nella gui il modello.

Dal punto di vista di AVRdude vedi un programmatore STK500 e non Arduino nel vero senso della parola, il bootloader è prima di tutto una emulazione, non completa, di questo programmatore per AVR.
Tra le informazioni fornite durante la connessione tra AVRdude e l'STK500 c'è anche il tipo di processore, è una risposta preprogrammata nel bootloader stesso, quindi si puoi capire su quale porta seriale è collegato Arduino.
Non mi ricordo la sequenza di comandi da inviare al STK500 per instaurare la connessione e verificare l'ID del micro (la risposta preprogrammata), però dovrebbe essere abbastanza facile trovarli con google.

Mi ha fregato il codice nel bootloader, da arduino 0018:

Allora il baudrate per il bootloader ed altri dati vengono ridefiniti nel Makefile, quindi chi volesse ricompilare il bootloader con frequenza e baudrate diversi, es 1MHZ, deve guradare il Makefile.
da Makefile:

atmega328: CFLAGS += '-DMAX_TIME_COUNT=F_CPU>>4' '-DNUM_LED_FLASHES=1' -DBAUD_RATE=57600

Non mi ricordo la sequenza di comandi da inviare al STK500 per instaurare la connessione e verificare l'ID del micro (la risposta preprogrammata), però dovrebbe essere abbastanza facile trovarli con google.

Si dovrebbe essere facile, solo che non riesco ad entrare nel bootloader, cioè questo dovrebbe avvenire al reset e dovrebbe bastare impostrare DTR=true, e poi inviare "A" poi il chr(x080) ma non funge.

Dal codice ATmegaBOOT_168.c:

/* AVR ISP/STK500 board requests */

	else if(ch=='A') {

		ch2 = getch();

		if(ch2==0x80) byte_response(HW_VER);		// Hardware version

		else if(ch2==0x81) byte_response(SW_MAJOR);	// Software major version

		else if(ch2==0x82) byte_response(SW_MINOR);	// Software minor version

		else if(ch2==0x98) byte_response(0x03);		// Unknown but seems to be required by avr studio 3.56

		else byte_response(0x00);				// Covers various unnecessary responses we don't care about

	}

Prima o poi verrà fuori il modo per interrogare il bootloader, ora guardo pure il codice di avrdude, vediamo che ne esce fuori.

Ciao.

avrdude permette una modalità "terminale" in cui apre la connessione col micro e poi resta in attesa di comandi dall'utente. Ti potrebbe interessare?
(man avrdude)

avrdude permette una modalità "terminale" in cui apre la connessione col micro e poi resta in attesa di comandi dall'utente. Ti potrebbe interessare?
(man avrdude)

Si Leo, però guarda il titolo del post, finische proprio con -t, per entrare in modalità terminale interattivo.

Ciao.

Dunque ho scritto in python questo:

print "Clear DTR and RTS to unload the RESET capacitor"  
ser.setRTS(False)
ser.setDTR(False)
print "attende x tempo"
time.sleep(1)
print "Set DTR and RTS back to high"
ser.setRTS(True)
ser.setDTR(True)
print "attende x tempo"
time.sleep(0.5)
print "scrive 0x30, 0x20"
ser.write(chr(0x30))
ser.write(chr(0x20))

questo l'ho dedotto da stk500.c di avrdude:

 * get in sync */
  buf[0] = Cmnd_STK_GET_SYNC;
  buf[1] = Sync_CRC_EOP;
  
  /*
   * First send and drain a few times to get rid of line noise 
   */
   
  stk500_send(pgm, buf, 2);
  stk500_drain(pgm, 0);
  stk500_send(pgm, buf, 2);
  stk500_drain(pgm, 0);

dove Cmnd_STK_GET_SYNC, e Sync_CRC_EOP valgono appunto 0x30 e 0x20.

Come risposta ottengo 20 e 16 int, rispettivamente 0x14 e 0x10 in hex.
Che secondo questa define, in stk500_private.h:
#define Resp_STK_OK 0x10 // ' '
#define Resp_STK_FAILED 0x11 // ' '
#define Resp_STK_UNKNOWN 0x12 // ' '
#define Resp_STK_NODEVICE 0x13 // ' '
#define Resp_STK_INSYNC 0x14 // ' '
#define Resp_STK_NOSYNC 0x15 //

Il bootloader risponde Resp_STK_INSYNC, Resp_STK_OK.

Quindi è quello che volevo fare, ora mi serve ricavare il modello di scheda tramite python.

Ciao.

MauroTec:
Si Leo, però guarda il titolo del post, finische proprio con -t, per entrare in modalità terminale interattivo.

Azz... mi era sfuggita.
Cmq in modalità terminale il comando "sig" dice che restituisce la firma del micro in byte.

avrdude> sig
>>> sig 

Reading |                                                    | 0% 0.00savrdude: error reading signature data for part "ATMEGA328P", rc=-1
error reading signature data, rc=-1
Device signature = 0xffffff

Cmq in modalità terminale il comando "sig" dice che restituisce la firma del micro in byte.

Appunto dice, ma.... ora mi devo allontanare per mancanza di ossigeno.

Ciao.

perchè non greppi l'output del comando lsusb (su linux) in cerca dei vid e pid della scheda?
così vedi la scheda collegata ed il suo nome così come la vede il S.o.

perchè non greppi l'output del comando lsusb (su linux) in cerca dei vid e pid della scheda?
così vedi la scheda collegata ed il suo nome così come la vede il S.o.

Si questa è una strada che richiede come dipendenze lsusb, ci sono alternative a questa?

Una è :

ls -l /dev/serial/by-id/usb-FTDI_FT232R_USB_UART_A600etZm-if00-port0

Che mostra:

lrwxrwxrwx 1 root root 13 11 mag 08:06 /dev/serial/by-id/usb-FTDI_FT232R_USB_UART_A600etZm-if00-port0 -> ../../ttyUSB3

Allora ricavo a cosa punta il link e poi interrogo il bootloader su tutte le porte con FTDI presenti nel sistema, quella che risponde correttamente è la scheda Arduino.

Per ricavare la signature scritta nel bootloader faccio così:

print "Clear DTR and RTS to unload the RESET capacitor"  
ser.setRTS(False)
ser.setDTR(False)
print "attende x tempo"
time.sleep(1)
print "Set DTR and RTS back to high"
ser.setRTS(True)
ser.setDTR(True)
print "attende x tempo"
time.sleep(0.5)
print "scrive 0x75, 0x20"
ser.write(chr(0x75))
ser.write(chr(0x20))
print ord(ser.read())	# 0x14
print ord(ser.read())	# 0x1E
print ord(ser.read())	# 0x95
print ord(ser.read())   # 0xF
print ord(ser.read())	# 0x10

La signature per la 2009 è appunto 0x1E950F, per la Mega 1280 0x1E97
03.
Per le altre che usano il chip 8u2 non so se il codice python di cui sopra è ancora valido.

Poi tutto questo lo devo fare in javascript.

Ciao.

e se mandassi la richiesta di read signature tramite il protocollo stk500?

http://www.atmel.com/dyn/resources/prod_documents/doc2525.pdf

Proprio il documento che volevo cercare, grazie.

e se mandassi la richiesta di read signature tramite il protocollo stk500?
Ma quel codice python fa proprio questo. Oppure dici di usare avrdude e parsare l'output?
La signatura con avrdude ultimo è possibile così:

[mauro@localhost python-test]$ avrdude -p m328p -c arduino -b 57600 -P /dev/ttyUSB3 

avrdude: AVR device initialized and ready to accept instructions

Reading | ################################################## | 100% 0.00s

avrdude: Device signature = 0x1e950f

avrdude: safemode: Fuses OK

avrdude done.  Thank you.

Ma in questo modo devo specificare per forza -p m328p altrimenti avrdude protesta, mentre l'interrogazione mi ritorna l'informazione che cercavo senza sapere prima il micro controllore.

Ora mi leggo il docu di cui sopra, grazie.
Ciao.

e se al comando aggiungi -F e togli la specifica del micro?

e se al comando aggiungi -F e togli la specifica del micro?

Protesta comunque e non fornisce la signature.

Brain tu hai L'UNO o una con il chip 8U2, se si e te la cavi con python protresti provare quel codice?
Il codice per intero:

#!/usr/bin/env python

import serial  
import time   
# imposto la porta  
ser = serial.Serial(port='/dev/ttyUSB3',  # devi mettere la tua porta che per la uno è ttyAC.. e non ricordo
    baudrate=57600,  
    bytesize=8,  
    parity='N',  
    stopbits=serial.STOPBITS_ONE,  
    timeout=3,  
    xonxoff=False,  
    rtscts=False,  
    writeTimeout=None,  
    dsrdtr=False)  
    
ser.open()
print "Clear DTR and RTS to unload the RESET capacitor"  
ser.setRTS(False)
ser.setDTR(False)
print "attende x tempo"
time.sleep(1)
print "Set DTR and RTS back to high"
ser.setRTS(True)
ser.setDTR(True)
print "attende x tempo"
time.sleep(0.5)
print "scrive 0x75, 0x20"
ser.write(chr(0x75))
ser.write(chr(0x20))
print ord(ser.read())	# 0x14
print ord(ser.read())	# 0x1E
print ord(ser.read())	# 0x95
print ord(ser.read())   # 0xF
print ord(ser.read())	# 0x10
ser.close()

Ciao.

No, ho il 2009.
e purtroppo non capisco una cippa di python :slight_smile:
ma intuisco il significato del codice che hai postato...
il 0x75 lo ho capito , ma il 0x20 che è?
Edit:
guarda in fondo al pdf dove parla di modalità seriale di lettura e scrittura dei fuse
forse vale anche per la signature.
ti linko anche quest'altra nota che potrebbe tornarti utile :wink:
http://www.atmel.com/dyn/resources/prod_documents/doc2591.pdf guarda a pag 34
Così.. per ridere prova anche con avrdude con il flag "-p auto".

Un modo semplicissimo per riconoscere la presenza di Arduino e identificare il tipo di processore, indirettamente il possibile modello, è inviare 0x75 e 0x20 subito dopo il reset, è la richiesta al STK500 di fornire il signature ID del micro.
La risposta è 0x14 SIG1 SIG2 SIG3 0x10 ove SIGx sono i tre byte del signatur ID dell'ATmega, vedere data sheet per i possibili valori a seconda del modello.
Per esempio se interrogo Arduino 2009 ottengo questa risposta:

0x14 0x1E 0x95 0x0F 0x10

0x1E 0x95 0x0f è il signature ID del 328p.

Cosa scoperta sbirciando nel sorgente del bootloader la funzione "Get device signature", viene invocata dal comando 0x75 ('u'), ove i tre byte SIGx sono predefiniti in base al micro supportato (la famosa risposta preprogrammata)

/* Get device signature bytes  */
	else if(ch=='u') {
		if (getch() == ' ') {
			putch(0x14);
			putch(SIG1);
			putch(SIG2);
			putch(SIG3);
			putch(0x10);
		} else {
			if (++error_count == MAX_ERROR_COUNT)
				app_start();
		}
	}

La cosa funziona anche da un normale terminale seriale in grado di inviare sequenze esadacimali, basta che i due byte siano inviati entro pochi decimi di secondo dopo il reset che avviene automaticamente (autoreset) non appena si apre la porta seriale virtuale collegata ad Arduino.

Così.. per ridere prova anche con avrdude con il flag "-p auto".

L'ho fatto, ma non ho riso e non ha funzionato l'ho rifatto ridendo e non ha funzionato lo stesso. :smiley:

Un modo semplicissimo per riconoscere la presenza di Arduino e identificare il tipo di processore, indirettamente il possibile modello, è inviare 0x75 e 0x20 subito dopo il reset, è la richiesta al STK500 di fornire il signature ID del micro.

Appunto, il codice python di prima fà proprio questo, ma cosa accade con optiboot, cioè funonzia anche con la Uno che monta il chip 8U2, dovrebbe perchè il chip non c'èntra, c'entra il bootloader, se questo è compatile con stk500.x dovrebbe funzionare, ma io non ho la Uno o Mega 2560 che hanno il bootloader optiboot (credo) per provare.

Ciao.

Ho fatto una prova al volo con la UNO e funziona perfettamente, la stringa ritornata è identica perché il micro è sempre un ATmega 328p, però si può capire lo stesso che è una UNO perché il dialogo avviene a 115200 bps invece di 57600.
Non ho una MEGA1280 per fare il test però ho la MEGA2560 e qui la cosa si complica, infatti con la stringa breve di richiesta ID non ottengo nessuna risposta.
Ho dato una sniffata ai dati sulla seriale mentre ci carico sopra lo sketch blink, a quanto pare su questa scheda è stato fatto un lavoro migliore per l'emulazione STK500, per ottenere una risposta è indispensabile fornire la richiesta nel formato standard indicato sulla AN di Atmel per l'STK500.
Serve una stringa formattata come indicato nella tabella 3.1 del pdf "AVR068: STK500 Communication Protocol" di Atmel, adesso non ho tempo per provare a generare in modo corretto la richiesta, ci provo stasera.

Ho fatto una prova al volo con la UNO e funziona perfettamente, la stringa ritornata è identica perché il micro è sempre un ATmega 328p, però si può capire lo stesso che è una UNO perché il dialogo avviene a 115200 bps invece di 57600.

Ma anche dal fatto che il device tty* è diverso, però su swinoz non so come si risolve, si vedra in futuro come fare.

Non nascondo che ero indeciso a rilasciare il codice con la GPL o LGPL o comunque una licenza a codice aperto, i motivo dell'indecisione sono legati proprio alla licenza GPL, che sceglierei per vari motivi, uno il più importante è trovare riscontro e collaborazione e condivisione per imparare gli uni dagli altri, ma mi sono reso conto che in Italia la cultura della condivisione e collaboarzione non è apprezzata, anzi perchè dovrei collaboarare ad un progetto non mio farlo crescere migliorarlo se questo porta il nome del progettista.

Ci dormo su un paio di ore, e poi decido cosa fare.

Non ho una MEGA1280 per fare il test però ho la MEGA2560 e qui la cosa si complica

Per la 1280, fintantochè il bootloader è quello da 1.5kb cioè non optiboot si vede da codice che non cambia la procedura, mentre per la 2560 il bootloader dovrebbe essere l'optiboot ma forse entra in gioco codice grazie #if #endif che non viene compilato per la UNO.

Ciao.