Salve a tutti, ho modificato il micro di un Nano, caricando il bootloader ATMEGA328 ad 8Mhz interno delle schede MiniCore, per ottenere appunto una configurazione con oscillatore a 8Mhz interno senza dover utilizzare il risuonatore ceramico. Il tutto è andato a buon fine e l'ho verificato sia attraverso i tools di NickGammon (in particolare il Board Detector) dove in seriale mi dice che i fuse impostati sono questi:
10:18:33.740 -> LFuse = 0xE2 (questo dovrebbe essere quello che imposta 8Mhz interni)
10:18:33.740 -> HFuse = 0xD7
10:18:33.740 -> EFuse = 0xFD
e sia tramite oscilloscopio generando onde quadre tramite il Timer/Counter utilizzando la modalità CTC (Clear Timer on Compare Match), verificando quindi che con un Arduino nano a 16mhz esterni, la frequenza è 8Mhz sul pin 9 mentre su quello modificato con bootloader nuovo ho 4Mhz. Questo lo sketch:
Quindi fin qui tutto ok. Il problema è ora sulla Seriale. Infatti provando anche a diversi baudrate anche inferiori al classico 9600 - tutte le varie stringhe in Seriale appaiono con caratteri strani. Problemi non ne ho invece sul timing come ad esempio delay che penso si siano adattati automaticamente alla frequenza del clock configurata nei fuse bits.
Quindi, come faccio ad ottemperare a questo problema che ho con la seriale ora?
Chiedo a voi che siete sempre disponibili e per questo vi ringrazio in anticipo.
Sì, certo. Per la board seleziono "ATMEGA328" e seleziono "Internal 8Mhz" come puoi vedere dall'immagine. Inoltre nota cosa mi stampa nella Seriale, ovviamente impostato a 9600 anche il monitor.
Mmm ... un paio di prove che puoi fare velocemente ...
voce "Baud rate" ... seleziona "default" e prova (NON ho idea da dove arrivi quel "pochi" ma mi sa di installazione corrotta, li dovrebbero esserci solo valori numerici).
se la cosa non cambia, puoi provare a mettere la voce "Compiler LTO" a "LTO Disabled" ... non dovrebbe incidere, ma non si sa mai.
Si, ho già provato con scarsi risultati ad impostare LTO Disabled e per quanto concerne il Baudrate c'è questo "Pochi" e poi "4800", "9600", "19200" ect ma nessun "Default" che presumo sia quel "Pochi"
Il json di riferimento dove il gestore schede attinge per l'installazione di queste schede MiniCore è questo:
... guardando il boards.txt di MiniCore mi sembra solo che usi un bootloader differente da quello che usa Arduino (Optiboot), urBoot (viene dichiarato compatibile al 100%, ma non sarebbe la prima volta che invece vedo delle incompatibilità) ...
Domanda ... che programmatore stai utilizzando per programmare il "bootloader"? AVRISP mkII?
Guglielmo
P.S.: ... eventualmente prova a scrivere all'autore spiegando il problema.
Sì, ci avevo pensato Guglielmo di scrivere all'autore e infatti lo farò. Per quanto riguarda il programmatore, utilizzo un semplice UNO con su lo sketch ArduinoISP. Ovviamente collego in SPI il Nano su cui flashare il bootloader a 8mhz e quando carico ovviamente l'Arduino Uno deve fare "as ISP" quindi imposto "Arduino as ISP". Dopodichè riporto a AVRISP MAKII quando non mi serve più come impostazione di default.
Parlando con l'autore sono arrivato al dunque e lo riporto qui così magari in futuro potrebbe essere utile per qualcuno.
Si deve fare una calibrazione del OSCCAL (Oscillator Calibration Register) che è un registro di calibrazione dell'oscillatore interno del microcontrollore.
Io ho utilizzato questo approccio per trovare il parametro OSCCAL adatto:
Con questo metodo verranno fuori in seriale i valori del registro OSCCAL da poter impostare, ovviamente saranno quelli leggibili. Tra i diversi io ho scelto 170.
Quindi una volta trovato il valore inizialmente basta impostare il valore del registro OSCCAL così:
void setup() {
OSCCAL = 170; // Usiamo il valore che abbiamo trovato
Quindi fare una prova di print così:
void setup() {
OSCCAL = 170; // Usiamo il valore che abbiamo trovato
delay(1000);
Serial.begin(9600); // Proviamo a tornare a 9600 baud
delay(1000);
// Stampa una stringa di test ogni secondo
for(int i = 0; i < 10; i++) {
Serial.println("Test di comunicazione seriale OK!");
Serial.println("12345678900987654321");
Serial.println("ABCDEFGHIJKLMNOPQRSTUVWXYZ");
Serial.println("------------------------");
delay(1000);
}
}
void loop() {
}
... comprensibile ... l'oscillatore interno non è così preciso come uno quarzato ... per questo ho sempre usato delle Pro Mini a 3.3V con il quarzo (e non ho mai avuto problemi).
In questo caso, sono stato costretto a dover eliminare l'oscillatore dato che ho progettato e fatto stampare delle PCB e cosa ho dimenticato proprio? La footprint dell'oscillatore quella formato CSTCE! Comunque non sono richiesti necessariamente per l'impiego i 16mhz precisi di un oscillatore esterno!