Velocità Bootloader

Ciao a tutti, avrei bisogno di abbassare la velocità del Bootloader da 115200 a 9600. C'è un modo sicuro e "certificato" per farlo?

Grazie a tutti

I sorgenti del bootloader sono presenti nella cartella /hardware/arduino/bootloader/optiboot contenuto nel pacchetto dell'IDE di Arduino. Nel file optiboot.c dalla riga 179 ci sono le #define per il settaggio della velocità del bootloader. In automatico viene regolata in base alla velocità del clock della CPU ma tu puoi modificare quella parte e provare a impostarla a mano con un

#define BAUD_RATE   9600L

Fatto questo, devi ricompilare il bootloader. E qui dipende dal sistema che hai, con Windows devi tirarti giù anche il compilatore gcc mi pare, con *nix (Linux/OSX) sei più avvantaggiato perché gcc di solito è già preinstallato. Adesso ti serve un'altra scheda Arduino o un programmatore per scrivere l'hex che hai creato.

Poi apri il file /hardware/arduino/boards.txt e cambi anche la velocità di upload che l'IDE passa ad avrdude cambiando questa riga e mettendoci la velocità

uno.upload.speed=115200

quasi all'inizio del file.

Prova e fammi sapere.

Ciao Leo, grazie della risposta, precisa mirata e utilissima!! (Sul forum internazione mi stanno facendo mille domande sul perchè 8) 8) :) ) Googlelando e con i tuoi suggerimenti, mi sono creato un nuovo hardware che ho chiamato "Uno with 9600 Bootloader", e l'ho caricato nella cartella hardware dove ci sono gli sketches. Ho ricompilato il bootloader con 9600 e modificato boards.txt a 9600.

Stasera provo, e poi ti faccio sapere.

PS Su windows se esegui lo script di creazione dalla cartella optiboot originale, si compila, credo che nell'IDE siano compresi anche i compilatori.

Grazie Marco

Se vuoi fare una cosa pulita e far ricompilare con il file make tutti i bootloader, allora devi aprire il suddetto file make e anche lì mettere una nuova voce e dare un nome al file che verrà generato, in questo modo non ti sovrascrive nulla e puoi farti creare il file diverso. Anzi, per farlo ancora più pulito dovresti inserire un parametro che poi venga riconosciuto dal compilatore quando compila il bootloader in modo da elaborare quella serie di #define del file bootloader.c

Ma per te, puoi benissimo farti una copia dei file originali, apportare le modifiche e poi compilare. Penso ti basti lo stesso per quel che devi fare.

Ciao Leo, in verità io sono andato nella cartella di installazione di arduino, hardware/arduino/bootloader e ho creato una copia della cartella optiboot e l'ho chiamata optiboot_9600 In questa nuova cartella ho fatto le modifiche e ricompilato il bootloader. Mi ha generato un file hex per l'ATMega328.

Dopo di che sono andato nella cartella dove ci sono gli sketches, ho creato una cartella hardware, e dentro una nuova cartella, in cui ho copiato tutta la cartella arduino originale, epurandola di cio che non mi serve. Ho inserito in questa cartella anche il file boards.txt, inserendo solo l'arduino Uno rinominato.

Fatto questo aprendo l'IDE, mi compare la mia nuova scheda, che a questo punto, credo mi carichi il nuovo bootloader. Così mi sembra molto pulito, in quanto mi basta copiare la cartella degli sketches per portarmi anche il mio nuovo UNO con bootloader a 9600.

Stasera provo e vi faccio sapere. Grazie 1000

Sempre nel file boards.txt controlla che il percorso del bootloader punti a quello nuovo altrimenti l'IDE tenta di caricare il file hex dalla vecchia cartella e, se gli hai cambiato di nome, non la trova più e ti restituisce un errore

E' disponibile l'IDE 1.0.6. :grin:

Ehm... che c'entra ? :sweat_smile:

Niente... E' per diffondere la notizia. :grin:

OMG... :sweat_smile: :sweat_smile:

Ciao Leo, ho fatto anche quello.

Grazie 1000

Ho modificato optiboot.c in questa sezione:

/* set the UART baud rate defaults */
#ifndef BAUD_RATE
#if F_CPU >= 8000000L
#define BAUD_RATE   115200L // Highest rate Avrdude win32 will support 115200
#elsif F_CPU >= 1000000L
#define BAUD_RATE   9600L   // 19200 also supported, but with significant error
#elsif F_CPU >= 128000L
#define BAUD_RATE   4800L   // Good for 128kHz internal RC
#else
#define BAUD_RATE 1200L     // Good even at 32768Hz
#endif
#endif

impostando

#if F_CPU >= 8000000L
#define BAUD_RATE   9600L // Highest rate Avrdude win32 will support 115200

e ho impostato nel boards.txt:

uno.upload.speed=9600

il bootloader si compila, e lo carico sul mega con un USBasp ICSP senza errori. Quando vado a caricare il programma, vedo dal monitor seriale che Arduino IDE manda tre volte zero, ma nessuno risponde. Se invece, riporto il uno.upload.speed a 115200, tutto funziona con lo stesso Bootloader. Quindi vuol dire che per qualche motivo il bootloader se ne fotte delle mie modifiche nel file c.

Qualcuno riesce a darmi una mano?

Grazie

Sei sicuro del valore di F_CPU? Perché non commenti tutti gli IF e lasci solo

#define BAUD_RATE   9600L

così sei sicuro che il valore è quello scelto da te.

E' la cosa che gli avevo consigliato anche io. Se vuole tenere la catena di #ifdef deve creare nel makefile la voce per compilare con il bootloader a 9600 bps e clock a 16 Mhz, altrimenti se non vuol toccare il makefile, deve cambiare bootloader.c e mettere i bps a 9600.

PaoloP: Sei sicuro del valore di F_CPU? Perché non commenti tutti gli IF e lasci solo

#define BAUD_RATE   9600L

così sei sicuro che il valore è quello scelto da te.

Se tolgo gli IfDef e lascio solo il define, il Makefile mi da errore di velocità troppo bassa. Ho provato con 19200, ma non compila ugualmente.

:roll_eyes: :roll_eyes:

A mali estremi....

/* set the UART baud rate defaults */
#ifndef BAUD_RATE
#if F_CPU >= 8000000L
#define BAUD_RATE 9600L
#elsif F_CPU >= 1000000L
#define BAUD_RATE 9600L
#elsif F_CPU >= 128000L
#define BAUD_RATE 9600L
#else
#define BAUD_RATE 9600L
#endif
#endif

PaoloP:
A mali estremi…

/* set the UART baud rate defaults */

#ifndef BAUD_RATE
#if F_CPU >= 8000000L
#define BAUD_RATE 9600L
#elsif F_CPU >= 1000000L
#define BAUD_RATE 9600L
#elsif F_CPU >= 128000L
#define BAUD_RATE 9600L
#else
#define BAUD_RATE 9600L
#endif
#endif

ahahaha dopo provo

Riporta esattamente l'errore che ti da, perché ti evidenzierà anche il punto in cui lo solleva. Così cerchiamo di capire cosa fare.

Ragazzi,
prima di tutto grazie infinite per l’aiuto :slight_smile: :slight_smile:

Poi, ho commentato tutta la sezione dei Indef e inserito un define:

#define BAUD_RATE   19200L
/* set the UART baud rate defaults */
/*#ifndef BAUD_RATE
#if F_CPU >= 8000000L
#define BAUD_RATE   115200L // Highest rate Avrdude win32 will support
#elsif F_CPU >= 1000000L
#define BAUD_RATE   9600L   // 19200 also supported, but with significant error
#elsif F_CPU >= 128000L
#define BAUD_RATE   4800L   // Good for 128kHz internal RC
#else
#define BAUD_RATE 1200L     // Good even at 32768Hz
#endif
#endif*/

Però ottengo questo errore:

C:\Program Files (x86)\Arduino\hardware\arduino\bootloaders\optiboot_test>..\..\
..\tools\avr\utils\bin\make OS=windows ENV=arduino
../../../tools/avr/bin/avr-gcc -g -Wall -Os -fno-inline-small-functions -fno-spl
it-wide-types -mshort-calls -mmcu=atmega328p -DF_CPU=16000000L  '-DLED_START_FLA
SHES=3' '-DBAUD_RATE=115200' '-DVIRTUAL_BOOT'   -c -o optiboot.o optiboot.c
optiboot.c:178:1: warning: "BAUD_RATE" redefined
<command-line>: warning: this is the location of the previous definition
optiboot.c: In function 'main':
optiboot.c:319: error: 'UART_DDR' undeclared (first use in this function)
optiboot.c:319: error: (Each undeclared identifier is reported only once
optiboot.c:319: error: for each function it appears in.)
optiboot.c:319: error: 'UART_TX_BIT' undeclared (first use in this function)
optiboot.c: In function 'putch':
optiboot.c:526: error: 'UART_PORT' undeclared (first use in this function)
optiboot.c:527: error: 'UART_TX_BIT' undeclared (first use in this function)
optiboot.c: In function 'getch':
optiboot.c:564: error: 'UART_PIN' undeclared (first use in this function)
optiboot.c:565: error: 'UART_RX_BIT' undeclared (first use in this function)
make: *** [optiboot.o] Error 1

BAUD_RATE viene già definito per cui devi per forza metter mano al file make.

Aprilo e modifica la riga 222:

atmega328: CFLAGS += '-DLED_START_FLASHES=3' '-DBAUD_RATE=115200'

metti 9600 lì.