Con il gruppo di Arduino di Pinerolo (TO) stiamo costruendo degli arduino standalone che funzionano a 3.3V.
Per la comunicazione seriale usiamo gli adattatori USB-TTL CP2102.
E' già il secondo ATmega328 a cui si danneggiano le porte seriali Tx-Rx dopo un pò di utilizzo.
Le porte usate come I/O digitali continuano a funzionare.
E già successo anche a voi?
Quando si utilizza l'alimentazione a 3.3V si può ancora usare il CP2102?
Non so a che tensione alimenti il CP2102. Il ATmega328 puó sopportare sui pin di entrata / uscita tensioni che vanno da -0,5V alla tensione di alimenazione + 0,5V ovvero 3,8V. Se dai 5V si rompe.
Usa un partitore resistivo per abbassare la tensione del CP2102.
Ci chiedavamo come mai tutto questo tempo OK e poi il crash.
Faccio notare che a problema rilevato cioè (comunicazione assente con la seriale) i pin funzionano:
I pin 0 e 1 se programmati come I/O funzionano, naturalmente l'ATmega328 in questo caso
lo programmiamo via SPI.
pag 317 del datasheet
Voltage on any Pin except RESET with respect to Ground ...-0.5V to VCC+0.5V
se il 2102 è alimentato dall'USB al 99% (salvo la presenza di un evidente regolatore) i segnali sono a lievllo logico TTL 0-5V. Mentre in ricezione il 2102 non subisce danno dai segnali che arrivano dal micro (0/3,3V vengono visti regolarmente ome L/H), in trasmissione i 5V del livello H sforano di parecchio (non dovreste superare 3,3+0,5V=3,8V); di conseguenza avete probabilmente bruciato il solo circuito UART interno del micro, ecco perché la parte digitale funziona ancora.
Vi basta aggiungere un banalissimo partitore:
TX 2102->R 5k->RX micro->R 10k->GND ed in questo modo limitate il segnale in arrivo al TX a 3,3V circa e risolvete tutti i vostri problemi.
No Michele, se leggi il datasheet di quel chip vedi che o può essere alimentato dal piedino +Vdd o dalla USB, ma in ogni caso a 3.3V (... per la USB ha un regolatore interno per ottenere i 3.3V) e le uscite sono già a 3.3V.
Guarda in particolare lo schema di pagina 1, nel chip, in alto a sinistra
Infine, Tavola 2 riporta chiaramente : Supply Voltage min 3V, typ 3.3V, max 3.6V.
gpb01:
No Michele, se leggi il datasheet di quel chip vedi che o può essere alimentato dal piedino +Vdd o dalla USB, ma in ogni caso a 3.3V (... per la USB ha un regolatore interno per ottenere i 3.3V) e le uscite sono già a 3.3V.
Guarda in particolare lo schema di pagina 1, nel chip, in alto a sinistra
Infine, Tavola 2 riporta chiaramente : Supply Voltage min 3V, typ 3.3V, max 3.6V.
Guglielmo
Ho misurato la tensione (senza collegamenti) sui vari pin:
DTR, TXD, RXD, DTR sono tutte a 3V3.
Ciao Guglielmo, hai ragione, mi aveva ingannato l'immagine iniziale in cui il VBUS (5V) sembra alimentare il transceiver USB, invece è solo un pin di "sense", per controllare se la tensione in ingresso è 5V, nel qual caso interviene il regolatore interno, oppure se è già all'origine a 3,3V, nel qual caso il regolatore viene escluso, così mi pare di capire.
A questo punto l'unica spiegazione è che sia rotto il regolatore interno del CP2102 ed il circuito stia lavorando a 5V.
Inganna anche il fatto che comunque sull'uscita l'adattatore riporta anche i 5V, ma evidentemente lui è protetto in questo caso.
gpb01:
... Busco, con riferimento alla ipotesi di Michele .. la verifica l'hai fatta su uno di quelli che ha danneggiato l'ATmega328P ???
Perché, se così fosse, sarebbe escluso il guato interno e ... la causa sarebbe da cercare altrove ...
Guglielmo
Si, la misura l'ho fatta su quello che sto utilizzando.
Pensi alla schedina dove è montato il micro?
E' una schedina con un ATmega328P e radio nRF24L01+.
Utilizziamo una schedina Master e uno o più slave questi ultimi con un termometro DS18B20.
Se può essere utile posso postare gli schemi.
Non l'ho ancora fatto perchè non sono ancora definitivi.
un'occhiata agli schemi non guasta mai anche se, se stai alimentando tutto quanto a 3,3V, difficile che ci possa essere un problema di extra-tensione; semmai bisogna capire cosa stai alimentando visto che il regolatore a 3,3V del CP2102 è dato come massimo per 500mA.
gpb01:
Non solo ... pensavo anche ad un problema software ...
Fate strane cose con la seriale o vi limitate ai semplici Serial.begin(), Serial.read() e Serial.write() ???
Riassegnate mai i pin ?
Guglielmo
La seriale viene utilizzata in questo momento per la programmazione e per la lettura dei dati da una EEprom
24C32 poi sarà 24C512 o altro tipo di memoria per esempio SD card.
In seguito solo per scaricare i dati dalla EEprom tramite un terminale.
Durante il normale funzionamento la seriale non viene utilizzata.
Breve descrizione del funzionamento:
Il MASTER ad intervalli stabiliti da un Clock Calendar richiede la temperatura agli SLAVE e salverà questi dati
nella EEprom.
La temperatura arrivata è visualizzata su un LCD via I2C.
Quando si vuole si può scaricare questi dati sul PC.
Tutto questo funziona se non fosse per il problema in discussione.
In allegato lo schema eletrico.
Una parte del circuito con il transistor serve a salvare l'indirizzo della EEprom nel caso
di mancata tensione.
Quindi giustamente non alimenti tramite il convertitore. Intanto metti un C da 100µF elettrolitico a valle del regolatore altrimenti non hai stabilità e filtro decenti; la versione di regolatore che usi che corrente riesce ad erogare? fai attenzione perché ci sono serie "L" da 500mA ma anche da 100mA.
Riguardo il tuo problema puoi fare solo una cosa: limitare le correnti in gioco mettendo in serie ai due segnali tx e rx due resistenze da 1k. Mi è appena venuto in mente che quando ho progettato il convertitore USB-Seriale basato sull'MCP2200 della Microchip ricordo che uscì fuori in una discussione questa necessità di limitare le correnti proprio per evitare possibili danneggiamenti; ho appena verificato per scrupolo lo schedino ed in effetti ci sono. La cosa mi viene confermata dallo schema elettrico di Arduino UNO, se lo vai a guardare troverai anche lì queste due resistenze di limitazione; ho la netta sensazione che risolverai il problema
Una precisazione: Lo schema che ho postato vale sia per MASTER che per SLAVE.
MASTER avrà il Clock e la EEprom e non avrà il termometro.
SLAVE non avrà il Clock e la EEprom ma avrà il termometro.
Il condensatore da 100uF l'ho messo anche se non appare sullo schema.
Per quanto riguarda il regolatore lo danno per 1A e il carico del MASTER è di circa 25mA.
La radio 14mA
ATmega 10mA
Clock e La EEprom 1mA.
Riguardo il tuo problema puoi fare solo una cosa: limitare le correnti in gioco mettendo in serie ai due segnali tx e rx due resistenze da 1k. Mi è appena venuto in mente che quando ho progettato il convertitore USB-Seriale basato sull'MCP2200 della Microchip ricordo che uscì fuori in una discussione questa necessità di limitare le correnti proprio per evitare possibili danneggiamenti; ho appena verificato per scrupolo lo schedino ed in effetti ci sono. La cosa mi viene confermata dallo schema elettrico di Arduino UNO, se lo vai a guardare troverai anche lì queste due resistenze di limitazione; ho la netta sensazione che risolverai il problema
Mi sono venuti in mente altri dubbi:
Per usare l'alimentazione a 3.3V si deve usare un bootloader diverso da quello a 5V?
Ci possono essere dei fuse settati sbagliati che disattivano la comunicazione seriale hardware?
E' possibile leggerli con avrdude sotto linux?
Qualche volta mi è capitato di scollegare l'alimentazione alla schedina
con l'ATmega prima di scollegare il convertitore dalla porta USB, in questo
caso il LED sull'alimentazione della schedina si accende debolmente.
Questo significa che l'ATmega è alimentato tramite i pin della seriale o il pin di reset.
Non ho mai dato importanza a questo, mi chiedo però se questo possa
aver danneggiato la funzione USART dell'ATmega328P-PU ciò che mi è successo
di recente.
Per chi utilizza questi (convertitori, programmatori) consiglio di far attenzione e scollegare
sempre prima il convertitore dalla porta USB prima di togliere l'alimentazione alla schedina.
Per evitare questa operazione, si potrebbe utilizzare uno switch tipo CD4016, HC4066 o
altro tipo per disattivare queste linee quando si toglie l'alimentazione alla schedina con l'ATmega.
non viene alimentato ma certamente circola corrente, siccome il datasheet dice chiaramente che un pin sopporta al massimo una tensione >0,5V rispetto all'alimentazione, se l'alimentazione è =0V basta un solo volt su un pin per fare danno quindi è probabilissimo che sia successo quello che pensi.
Per proteggere i Pin di circuiti integrati CMOS da scariche elettrostatiche sono messi dei diodi verso il pin di alimentazione e verso massa. De la tensione sui Pin supera il 0,5V sopra e sotto l' alimentazione (5V e 0V) oppure 0V quando l' limentazioen manca, circola una corrente che puó rompere i Diodi e il circito delle entrate / uscite.
Ciao Uwe