Arduino Nano - Problemi con la Seriale con oscillatore a 8Mhz (interno)

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:

void setup() {
  pinMode(9, OUTPUT);  
  TCCR1A = _BV(COM1A0); 
  TCCR1B = _BV(WGM12) | _BV(CS10);  // CTC mode, nessun prescaling
  OCR1A = 0; 
}

void loop() {
 
}

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.

Quando nell'IDE selezioni la scheda, che scheda selezioni (l'IDE DEVE sapere che stai andando ad 8MHz)?

Guglielmo

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.

Guglielmo

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" :sweat_smile:

Il json di riferimento dove il gestore schede attinge per l'installazione di queste schede MiniCore è questo:

https://mcudude.github.io/MiniCore/package_MCUdude_MiniCore_index.json

Non so che dirti ...

... 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à) ... :roll_eyes:

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.

1 Like

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:

void setup() {
  delay(1000);
  
  Serial.begin(1200);  
  delay(1000);
  
  uint8_t original_osccal = OSCCAL;
  uint8_t start_value = original_osccal - 20;  
  
  for(uint8_t i = 0; i < 40; i++) {  // Test di 40 valori
    uint8_t test_value = start_value + i;
    OSCCAL = test_value;
    delay(1000);  
    
    for(int j = 0; j < 5; j++) {
      Serial.write('=');
    }
    Serial.write(' ');
    Serial.write('0' + (test_value / 100));     
    Serial.write('0' + ((test_value / 10) % 10)); 
    Serial.write('0' + (test_value % 10));       
    Serial.write(' ');
    for(int j = 0; j < 5; j++) {
      Serial.write('=');
    }
    Serial.write('\n');
  }
  
  OSCCAL = original_osccal;
}

void loop() {
}

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). :wink:

Guglielmo

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!

Ciao Guglielmo, grazie comunque a presto!

Sì, l'uso della seriale richiede una temporizzazione precisa, quindi un quarzo (ricordandoselo! :grin: ) risolve ogni problema evitando ulteriori pensieri.

... la Pro Mini a 3.3V usa un quarzo a 8MHz :wink:

Guglielmo

Intendevo per la mia applicazione non sono richiesti necessariamente. :slightly_smiling_face:
Conosco bene la Pro Mini a 3.3v per la quale c'è un quarzo a 8Mhz.

Ciao!!

1 Like

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.