Programmazione ATMega328 standalone utilizzando COM

Ciao,
come da oggetto ho la necessità di programmare un ATMega in standalone ma passare ogni volta da Arduino ICSP è laborioso e sostituire ogni volta il micro dal zoccoletto lo trovo dannoso. Ho visto i convertitori USB-RS232 ma mi scoccia fare un ordine da 12€ per poi aggiungci altri 8.5€ per la spedizione(magari quando dovrò comperare qualcos' altro). Così ho visto questo schema e ho pensato di autocostruirmelo:

Però ho alcuni dubbi. Appurato che ci sono 3 errori come citato, volevo chiedervi se questo circuito può funzionare. La porta seriale COM non opera tra +/-12V? Il 7404 non usa valori logici TTL?
Grazie.

Ho gli stessi Tuoi dubbi, anzi peggio.
Anche perché i 2 inverter usati sono collegati tutti due nella stessa direzione.

Per avere una seriale puoi usare lo schema del Arduino serial:

http://webzone.k3.mah.se/k3dacu/arduino/releases/serial_v2/arduino_rs232_v2.png

Ciao Uwe

Scusa, perché dici che l'ISP è laborioso? Ti costruisci un PCB con uno zoccolo ZIF ed un connettore ISP e ci metti pochi secondi ogni volta; non è più scomodo dover ogni volta caricare il bootloader sul micro per poi programmarlo via seriale?

Comunque devi programmare via RS232 o via USB?

Nel secondo caso io ho comprato un MCP2200 della microchip e con un paio di euro ho realizzato il convertitore USB-seriale; invece col porta RS232 non c'ho mai lavorato.

@ Uwe: subito sotto lo schema c'è scritto che i pin 1 e 2 vanno invertiti.

@Menniti. Ne approfitto per ringraziarti della guida. Comunque dico che è laborioso perché al momento sto provando a fare delle trasmissioni radio a 433Mhz tra una board Arduino e una Luigino. Sopra queste ho messo una shield autocostruita con i moduli RF, una per TX e l' altra per l' RX (dopo verranno equipaggiate con altri sensori) e devo fare questi passaggi: 1)togliere shield da Arduino 2)togliere shield da Luigino 3)riprogrammare Arduino come ISP 4)programmare Luigino come TX 5)riprogrammare Arduino come RX. Posso farlo, ma siccome molte spesso mi ci vogliono più tentativi per centrare il programma mi risparmierei la trafila.

non è più scomodo dover ogni volta caricare il bootloader sul micro per poi programmarlo via seriale?

Perché dici caricare ogni volta il bootloader?

@Uwe. Grazie..mi sa che proverò proprio questo

DevonMiles:
@Menniti. Ne approfitto per ringraziarti della guida.

Grazie a te del feedback XD

Comunque dico che è laborioso perché al momento sto provando a fare delle trasmissioni radio a 433Mhz tra una board Arduino e una Luigino. Sopra queste ho messo una shield autocostruita con i moduli RF, una per TX e l' altra per l' RX (dopo verranno equipaggiate con altri sensori) e devo fare questi passaggi: 1)togliere shield da Arduino 2)togliere shield da Luigino 3)riprogrammare Arduino come ISP 4)programmare Luigino come TX 5)riprogrammare Arduino come RX. Posso farlo, ma siccome molte spesso mi ci vogliono più tentativi per centrare il programma mi risparmierei la trafila.

Sì, hai perfettamente ragione, ma non sapevo in che contesto tu che stessi lavorando.

non è più scomodo dover ogni volta caricare il bootloader sul micro per poi programmarlo via seriale?

Perché dici caricare ogni volta il bootloader?

come sopra.... stavo facendo un discorso generale, riferendomi alla necessità di programmare diversi chip; ora che ho capito so che mi potevo risparmiare l'intervento :blush:

Però ora sono incuriosito, perché non so quali pin delle board stai usando; praticamente vuoi ricorrere alla seriale per non levare le shield e per non collegare Arduino e Luigino all'USB del PC? Non devi comunque ogni volta collegare il tuo schedino usb-seriale prima ad una board e poi all'altra, usando ben 5 fili (tx/rx/reset/5v/GND)?
Solo se ti va di perdere tempo con me, mi spieghi cosa mi sta sfuggendo?

Solo se ti va di perdere tempo con me, mi spieghi cosa mi sta sfuggendo?

Certo, è un piacere, anzi è utile per ottimizzare la cosa.

praticamente vuoi ricorrere alla seriale per non levare le shield

Sì, in effetti gli shield li devo comunque togliere. :slight_smile:
Per quanto riguarda Arduino l' idea era questa:

  1. togliere shield
  2. programmare normalmente Arduino con USB
    Mentre per quanto riguarda Luigino 1000pads:
  3. togliere shield
  4. programmare Luigino con porta seriale DB9
    L' idea era di fare uno schedino che va a infilarsi sugli strip di Luigino (attacca e stacca e via). Però mi hai messo un dubbio. Quando programmo, il RESET deve essere alto o basso? Sullo schema di Uwe sembra sempre "pulluppato" e sembra che la programmazione attraverso COM fili diretta.

Il reset deve essere collegato allo schedino che realizzerai, se è dotato di un segnale DTR o RTS, in caso contrario quello schema ti dice che devi mettere la pull-up (e questo è ovvio), e al momento opportuno dovrai premere manualmente il pulsante di reset, previsto nello schema, altrimenti non riuscirai a programmarlo; ti anticipo che è uno sbattimento questa cosa del reset manuale, ecco perché l'unica soluzione valida e comoda è quella di uno schedino "serio" da collegare ad un'altra porta USB, abbandonando l'idea della seriale RS232.
Alla fine perderai un sacco di tempo, almeno io che sono impedito :blush: non sono mai riouscito a beccare il momento in cui si deve premere il tasto reset (dovrebbe essere subito dopo il messaggio di compilazione); questa manovra è indispensabile, infatti il micro deve ricevere un impulso sul reset per capire che sta per ricevere dati, altrimenti non li accetterà mai.

Sì infatti avevo trovato questo:
http://www.arduino.cc/playground/Learning/AutoResetRetrofit
Farò due prove visto che i componenti ce li ho, ma mi sa che alla fine hai ragione tu, la soluzione dello schedino USB è quella più sbrigativa..

DevonMiles:
Sì infatti avevo trovato questo:
Arduino Playground - AutoResetRetrofit
Farò due prove visto che i componenti ce li ho, ma mi sa che alla fine hai ragione tu, la soluzione dello schedino USB è quella più sbrigativa..

Bene, con questo sistema eviti il problema del pulsante, infatti prelevi il DTR dalla RS232 e lo porti sul pin Reset (sotto il connettore ISP, è più comodo) tramite un C da 100nF (indispensabile! deve essere proprio un impulso, senza di questo non ti funziona). Riguardo il dubbio dell'autore:

At the reset pin, I measure the same 22ms "LOW" signal, but it swings from +5V to zero and bounces to +10V. I know that the reset pin on the ATMEGA168 can tolerate +12V, used during high voltage programming, but I don't know if this is completely safe.

ti confermo che il pin reset sopporta tranquillamente segnali a 12V, quindi puoi stare tranquillo.
Visto che hai tutto la prova falla, con questo segnale ti funziona in automatico; fammi sapere come va a finire.

Aggiorno il thread purtroppo non positivamente in quanto non ho avuto successo in questo tipo di programmazione. L' IDE mi ritorna il tipico errore di comunicazione plurivisto:
avrdude: stk500_getsync(): not in sync: resp=0x00
avrdude: stk500_disable(): protocol error, expect=0x14, resp=0x51
Lo schedino mi sembra assemblato correttamente. Per programmare ho usato il core Arduino UNO e poi uno creato da me con baud rate della porta COM più basso (anche se ho letto che l' autoreset funziona solo a 115200). Dentro al 328 ho il bootloader della UNO forse non gli piace. Mah..

Sullo shedino fai un loopback fra tx e rx e prova a vedere se ricevi eco su un terminale, in modo da escludere problemi di funzionamento.

l'autoreset e' una bella cosa, pero' vorrei aggiungere, se puo' essere utile, che il fantastico optifix risolve il probelma della tempistica del reset manuale, cioe' lanci la programmazione dall'ide e poi premi con tutta calma il reset, quando vuoi tu.
A questo punto io non mi preoccupo piu' di implementare l'autoreset sui miei convertitori cinesi sub-euro proprio perche' premere un tastino non e' un problema non dovendo lottare con le tempisctiche.

Essendo l'optifix funzionante anche sui supereconomici Atmega8A, con 2 euro (1 per convertitore usb ed 1 per atmega8A) hai uno standalone comodamente collegabile in usb, mantenendo sempre a bordo il bootloader (perdi solo 0,5KB)

DevonMiles:
Aggiorno il thread purtroppo non positivamente in quanto non ho avuto successo in questo tipo di programmazione. L' IDE mi ritorna il tipico errore di comunicazione plurivisto:
avrdude: stk500_getsync(): not in sync: resp=0x00
avrdude: stk500_disable(): protocol error, expect=0x14, resp=0x51
Lo schedino mi sembra assemblato correttamente. Per programmare ho usato il core Arduino UNO e poi uno creato da me con baud rate della porta COM più basso (anche se ho letto che l' autoreset funziona solo a 115200). Dentro al 328 ho il bootloader della UNO forse non gli piace. Mah..

@ questo errore è dovuto al fatto che non sta funzionando l'autoreset; se stai tentando con il tastino è facile che tu non stia beccando la tempistica esatta; se invece hai un segnale DTR lo devi disaccoppiare mettendo un C da 100nF tra DTR e RESET del micro.
Non uso l'optifix di cui parla Testato, però da come dice lui risolveresti facilmente, puoi provare; personalmente resto "legato" al segnale DTR o RTS, così non hai nemmeno la "seccatura" di dover premere un tastino, esattamente come avviene su Arduino.

Sullo shedino fai un loopback fra tx e rx e prova a vedere se ricevi eco su un terminale, in modo da escludere problemi di funzionamento

Ok..fatto. Funziona tx-rx. Però poi ho fatto anche la prova di mettere un led+res su tx e rx. Se lascio lo schedino a vuoto noto che quando provo a trasmettere con loop tx-rx aperto lampeggia il led in corrispondenza di quello che io pensavo fosse rx e l' altro rimane spento. Questo mi fa dedurre che questo cavo non è una prolunga.. :0 però lo avevo usato con successo su un programmatore PIC autocostruito..adesso smonto e controllo.

@Testato
provo prima a vedere se combino qualcosa con l' autoreset comunque grazie della dritta.

@Menniti
Sto usando l' autoreset e ho già montato il condensatore 100 nF tra DTR e RESET micro. Controllo bene il cavo perchè se non è una prolunga devo invertire 2-3 fili.

Scusa, solo per scrupolo, non ti offendere, ma nella concitazione delle prove capita di sbagliare :blush:
Vorrei ricordarti che tx/rx dell'interfaccia vanno collegati incrociati sul micro, quindi txI->rxM e rxI<-txM
Altra cosa, l'interfaccia sta lavorando a 5V?, in questo caso alimenta tutto tramite i 5V dell'interfaccia

Scusa, solo per scrupolo, non ti offendere, ma nella concitazione delle prove capita di sbagliare

Figurati..

Vorrei ricordarti che tx/rx dell'interfaccia vanno collegati incrociati sul micro, quindi txI->rxM e rxI<-txM

Sì, ho seguito lo schema e ora ho ricontrollato anche i percorsi con il multimetro e mi sembra corretto. Il cavo comunque è un 1-1.

Altra cosa, l'interfaccia sta lavorando a 5V?, in questo caso alimenta tutto tramite i 5V dell'interfaccia

I 5V li prendo dallo strip di Luigino 1000pads e vanno ai collettori dei due transistor. Ho inoltre collegato la ground di Luigino alla ground della porta seriale per avere lo stesso riferimento.

Sullo shedino fai un loopback fra tx e rx e prova a vedere se ricevi eco su un terminale, in modo da escludere problemi di funzionamento.

Riprendo quello che avevo detto prima. Il loop io lo avevo fatto all' inizio della porta seriale..ehhhm forse tu dicevi di looparlo alla fine. :grin: Adesso ci provo però devo portare i 5Vsullo schedino con un alimentatore..

Scusa, io ora vorrei dare un'occhiata all'intero schema, perché non ricordo più che configurazione hai usato, vorrei capire bene questa cosa delle alimentazioni; puoi rinfrescarmi la memoria e, se possibile, postare gli schemi di ciò che hai realizzato?

Menniti..perché non mi hai detto che avrei perso un sacco di tempo e mi sarebbe convenuto prendere uno schedino USB?!!? :smiley: :smiley: :smiley:
Comunque ho fatto la prova del loop alla fine del connettore del mio schedino quindi facendo giocare tutti i transistor e il serial monitor mi riceve quello che trasmetto, a questo punto penso a un problema di autoreset..
Ecco le foto dello schema..tolto il condensatore di autoreset tra pin 4 del DB9 e RESET dell' ATMega. E preso pari pari dalla parte iniziale di Arduinoserial o Severino. Poi anche la foto dello stampato Luigino con lo strip dove mi attacco. (5V TX RX GND DTR RST)

luigino.jpg

:astonished: XD
Immagino che la luigino pad abbia la R di pull-up da 10K, quindi lo schema è a posto.
Guarda, ti consigliavo lo schedino solo perché io ho perso interi pomeriggi a cercare di far funzionare la comunicazione PC<->micro via seriale; ho provato molte tecniche che tutti giuravano funzionassero, mi sono sentito un deficiente finché un esperto (leggi Astrobeed ;)) mi ha detto "lascia perdere, non ne caverai nulla"; da quel momento ho lavorato solo con chip dedicati, MCP2200 e FT232RL, tutto ha funzionato sempre al primo colpo.
Sono più che convinto che il tuo problema sia il controllo dell'autoreset, evidentemente la tempistica della RS232 non è valida, tant'è che nello schema originale prevedono il tastino per azionare manualmente il reset.
Scollega il DTR e tenta con l'operazione manuale che dovrebbe essere questa:
Avvii l'upload da IDE
Appena in basso esce il messaggio che lo sketch è compilato e occupa tot byte, devi premere il reset per un istante
Se becchi il momento esatto vedrai che ti funziona, io non ci sono mai riuscito (ma nemmeno mi ci sono disperato su) ma tanti lo fanno regolarmente, quindi se hai la pazienza di fare un bel poò di tentativi prima o poi ce la fai; una volta capito il momento ti verrà facile replicare la tecnica.