Nano a 3v

Ciao, ho voluto fare la prova a mandare un nano a 3v. Funziona, sarebbe meglio usare un quarzo a 8mhz, ma comunque funziona. Dovendo però stare attaccato a elettronica a 3v quando lo programmo e va a 5v rischio di bruciare qualcosa che non è 5v tolerant.

Ho tolto il ch340g e ci ho collegato un convertitore esterno... funziona per programmare. Però al momemto di usare la seriale succede una cosa strana. Il baud rare in uscita è la meta del dovuto, tipo se scrivo a 9600 posso leggere solo a 4800. Vi viene in mente il motivo ?

Per ovviare al problema del clock fuori specifiche (non puoi far lavorare la MCU a 16MHz alimentandola a 3V) ed evitare di rischiare malfunzionamenti inspiegabili o blocchi del programma, ti consiglio di abbassare da software, prima ancora che inizi il tuo programma (per dirla tutta prima del main()) il clock a 8MHz.

Se vuoi farlo devi inserire prima del setup(), in testa al programma, le seguenti righe:

void set_Clock(void) __attribute__((naked)) __attribute__((section(".init3"))) __attribute__((used));

void set_Clock(void) {
 cli();
 CLKPR = (1 << CLKPCE) | (0 << CLKPS3) | (0 << CLKPS2) | (0 << CLKPS1) | (0 << CLKPS0); // Enable change
 CLKPR = (0 << CLKPCE) | (0 << CLKPS3) | (0 << CLKPS2) | (0 << CLKPS1) | (1 << CLKPS0); // Prescaler 2
 sei();  
}

… che verranno eseguite prima di qualsiasi cosa e che divideranno il clock in entrata per due (… portandolo a 8MHz).

A questo punto però, per evitare che il “core” venga tratto in inganno e tutte le funzioni che si basano sul clock funzionino male (es. la millis()), devi creare, nel file “boards.txt”, una nuova boards, basata su quella che usi attualmente, ma con una riga diversa:

nano.build.f_cpu=8000000L

… così da indicare al “core” che la tua MCU lavora ad 8MHz.

Attenzione … NON modificare una “board” che già c’è, ma fanne copia/incolla e creane una nuova tua con quella riga in più.

Relativamente al problema che indichi sulla seriale invece … al momento non mi viene in mente alcuna spiegazione ::slight_smile:

Guglielmo

Sarebbe piú semplice usare un Arduino MINI per 3,3V. Quello é giá settato e dimensionato per 3V.
Ciao Uwe

Si mi sa che farò cosi, ho fatto sta prova perchè avevo quello a portata, ma visto che in effetti funge col programmatore esterno, userò una mini che forse costa pure di meno.

Una domanda ancora, ma l’unico modo per programmare un atmega328p nuovo di pacca, se lo saldassi in un mio circuito ad hoc… è solo tramite SPI vero ?

dukeluca86:
Una domanda ancora, ma l’unico modo per programmare un atmega328p nuovo di pacca, se lo saldassi in un mio circuito ad hoc… è solo tramite SPI vero ?

Salvo che tu non voglia caricarci sopra il bootloader, mettere una presa USB ed un convertitore USB <–> Seriale … SI.

Guglielmo

dukeluca86:
Una domanda ancora, ma l'unico modo per programmare un atmega328p nuovo di pacca, se lo saldassi in un mio circuito ad hoc... è solo tramite SPI vero ?

Un nuovo Atmega328 non ha niente memorizzato. Devi mettere Tu o il bootloader e poi caricarre lo sketch via seriale / USB-Seriale o lo sketch attraverso ISP con un programmatore ISP (In System Programming).
Puoi programmare un arduino che poi funge da programmatore ISP. Cerva "Arduino as ISP"

Ciao Uwe

Oppure ti prendi un USBasp che costa meno di 5 euro dalla Cina.

Se prendi il mini puoi prendere anche un adattatore USBseriale fatto apposta per lui (offre la stessa pidinatura con il connettore femmina) che è molto comodo.