644a 20MHz e USB Serial Light Adapter

Ieri mi sono arrivati gli USB Serial Light Adapter di Arduino, essi montano una MCU ATmega16U2 con quarzo a 16MHz.
Ho provato a collegare un 644a su bread che gira a 20MHz e impostato screen o altro serial monitor con un baud rate di 250k, ma non funziona, non c'è sincro e i caratteri sono senza significato.

Ho provato altri baud rate ma l'unico modo è lavorare a 57600.
Allora ho controllato il manuale del 644 e del 16U2 dove si ved che entrambe possono lavorare a 250k con percentuale di errore uguale a zero.

Quando mi connetto con il serial monitor a 250K LUFA dovrebbe leggere il valore di baud rate richiesto e impostare UBRR = 3, mentre nel 644 UBRR sta a 4.

Nota che ho modificato USB Serial Light Adapter, tagliando la pista 5+ che esce dal connettore USB e va al fusibile autoripristinante, perchè il 644 sta lavorando a 3.3V. Comunque prima ho provato collegando solo GND RX e TX lasciando il convertitore alimentato da USB e il 644 a 3.3V con risultati positivi, ma ho provato solo ad inviare dati dal 644 e no a riceverli, e il problema del baud rate è rimasto, cioè solo 57600.

Guardando il codice di arduino vedo questo:

/* Must turn off USART before reconfiguring it, otherwise incorrect operation may occur */
	UCSR1B = 0;
	UCSR1A = 0;
	UCSR1C = 0;

	/* Special case 57600 baud for compatibility with the ATmega328 bootloader. */	
	UBRR1  = (CDCInterfaceInfo->State.LineEncoding.BaudRateBPS == 57600)
			 ? SERIAL_UBBRVAL(CDCInterfaceInfo->State.LineEncoding.BaudRateBPS)
			 : SERIAL_2X_UBBRVAL(CDCInterfaceInfo->State.LineEncoding.BaudRateBPS);	

	UCSR1C = ConfigMask;
	UCSR1A = (CDCInterfaceInfo->State.LineEncoding.BaudRateBPS == 57600) ? 0 : (1 << U2X1);
	UCSR1B = ((1 << RXCIE1) | (1 << TXEN1) | (1 << RXEN1));

Per come la vedo io, prima avvia la seriale a 9600 (non si vede qui), poi azzera UCSR1A/B/C, ora se BaudRateBPS == 57600 imposta calcola il valore da assegnare a UBRR1 con la formula per la seriale a velocita 1X altrimenti usa la macro SERIAL_2X_UBBRVAL che è valida nel caso di velocità
2X.

Sembra corretto, ma in questo modo qualunque velocita diversa da 57600 ci sia scritta in CDCInterfaceInfo->State.LineEncoding.BaudRateBPS ha come conseguenza l'impostazione e calcolo della velocita 2X, comunque guardando il manuale anche in questo caso l'errore è zero.

Ci capite qualcosa?
Io non so dove guardare, forse c'è qualcosa che mi sfugge, ma non mi viene nulla in mente da controllare.

Ciao.

Da dove viene quella porzione di codice?
Che core stai usando? Che versione dell'IDE?

PS: ma 3,3V per un clock a 20 MHz non sono pochi?

Si leo, sono pochi 3.3v per 20MHz di clock infatti sto lavorando fuori SOA, ma non ti lasciare influenzare dalla SOA, almeno per come la vedo io la SOA è legata più alla dissipazione che alla stabilità. Però potrebbe anche essere questo il motivo putroppo mi serve 3.3v e quarzi di frequenza inferiore a 16 non ne ho.

Proverò con arduino 2009 oppure con il 644 rimanendo in SOA 5V 20MHz.

Il codice viene dalla versione 1.0.1 e il file è Arduino-usbserial.c.

Il compilatore è avr-gcc 4.5.1 con le patch di mamma atmel, e quello di cui abbiamo discusso tempo fa.
avr-libc-1.7.1-3.fc12.noarch che dovrebbe essere quello consigliato da atmel, non considerare il -3 dopo 1.7.1 perchè si tratta del build numero 3.

Tu dovresti avere la UNO, provi con screen alla massima velocità?

$ screen /dev/ttyACM0 250000

250000 è il baud rate, se lo metto a 57600 lavora.

Ciao.

Prova fatta.

ATmega644a 5V 20MHz connesso con USB Serial Light Adapter, questa volta il tutto viene alimentato da usb tramite l'adattatore stesso.

Forse c'è un errore nella libreria che ho scritto, ora vediamo.

Ciao.

Nel datasheet Atmel 8272D–AVR–05/12 del 644 a pag 200 c'è riepilogata la tabella che lega clock, baud rate, UBRRn e l'errore.
Si vede che a 20MHz di clock, UBRRn deve essere 21 per impostare il baud rate a 57600, però dal calcolo viene fuori 20.

Il calcolo:

UBRR0L = (F_CPU / (16 * baud)) - 1;

20.000.000 / (16 x 57600) - 1 = 20.000.000 / 921600 - 1 = 21,701388889 - 1 = 20

Comunque la differenza e minima e lavoro comunque anche se lo imposto a 21.

Devo concludere che quella tabella è errata.

Ciao.

Ho fatto la prova, mi "aggancio" all'Arduino ma se scrivo qualcosa vedo solo quadretti vuoi comparire sul terminale ( i led RX e TX lampeggiano entrambi). A che servirebbe quel programma?

MauroTec:
Nel datasheet Atmel 8272D–AVR–05/12 del 644 a pag 200 c'è riepilogata la tabella che lega clock, baud rate, UBRRn e l'errore.
Si vede che a 20MHz di clock, UBRRn deve essere 21 per impostare il baud rate a 57600, però dal calcolo viene fuori 20.

Il calcolo:

UBRR0L = (F_CPU / (16 * baud)) - 1;

20.000.000 / (16 x 57600) - 1 = 20.000.000 / 921600 - 1 = 21,701388889 - 1 = 20

Comunque la differenza e minima e lavoro comunque anche se lo imposto a 21.

Devo concludere che quella tabella è errata.

Ciao.

Oppure che il calcolo lo fanno arrotondando.
Cioè, 21,7->22
22-1=21

Prendi l'esempio di 20 MHz a 38400 bps.
20000000/(1638400)-1 = 32,55-1 = 31,55
Nella tabella c'è il valore 32. Quindi deduco che 20000000/(16
38400)=32,55 per loro diventi 33.

Ho fatto la prova, mi "aggancio" all'Arduino ma se scrivo qualcosa vedo solo quadretti vuoi comparire sul terminale ( i led RX e TX lampeggiano entrambi). A che servirebbe quel programma?

A che velocità ti sei connesso?
Prova a 57600, 115200 e invia dalla UNO qualcosa sulla seriale dovresti vedere il risultato su screen, sarebbe come il serial monitor di Arduino, ma lavora in VT100.

Screen is a full-screen window manager that multiplexes a physical terminal between several processes, typically interactive shells. Each virtual terminal provides the functions of the DEC VT100 terminal and, in addition, several control functions from the ISO 6429 (ECMA 48, ANSI X3.64) and ISO 2022 standards (e.g. insert/delete line and support for multiple character sets).

Ok il calcolo sicuramente lo fanno arrotondato, non ci avevo pensato, quindi la tabella è esatta.
Rimane il problema della velocità, devo capire se è un problema solo mio o un problema generale.

Ciao.

MauroTec:

Ho fatto la prova, mi "aggancio" all'Arduino ma se scrivo qualcosa vedo solo quadretti vuoi comparire sul terminale ( i led RX e TX lampeggiano entrambi). A che servirebbe quel programma?

A che velocità ti sei connesso?
Prova a 57600, 115200 e invia dalla UNO qualcosa sulla seriale dovresti vedere il risultato su screen, sarebbe come il serial monitor di Arduino, ma lavora in VT100.

Mi sono connesso a 250000, 115200, 57600 e qualche altra velocità più bassa.
A 250000 e 115200, come detto, se scrivo un carattere i led RX e TX lampeggiano, e sul terminale appare qualcosa ma non è il carattere premuto bensì un quadratino vuoto, come quando apri un terminale e poi dai il focus ad un'altra finestra ed al cursore, da pieno, resta solo la cornice. A velocità più basse l'eco non me lo fa, cioè se ad esempio mi connetto a 19200, le lettere che premo non mi tornano indietro, nonostante veda i led RX/TX lampeggiare.
PS:
sì, ho la UNO (R1 per la precisione)

Il buon giorno si vede dal mattino, peccato che oggi è l'ultimo giorno per pagare L'imu rtacci loro e per me questo inizio non è dei migliori.

Comunque, leo per adesso sta lavorando a 115200, ci sono riuscito scrivendo in flash questo file:
avrdude -p atmega16u2 -F -P usb -c avrispmkii -U flash:w:Arduino-COMBINED-dfu-usbserial-atmega16u2-Uno-Rev3.hex -U lfuse:w:0xFF:m -U hfuse:w:0xD9:m -U efuse:w:0xF4:m -U lock:w:0x0F:m

Evidentemente il firmware inserito in origine è diverso da questo, ma ancora non va a 250k quindi il problema sembrerebbe risiedere nel firmware.

Ho provato a scrivere il firmware (prima compilato) del progetto USBtoSerial della ultima versione di LUFA, ma qualcosa non è andato per il verso giusto e il led tx rimane sempre acceso.

Provero a capirci qualcosa di LUFA per vedere di apportare modifiche al codice al fine di ottenere la massima velocità, per le feste penso di avere tempo libero da dedicare.

Quindi la arduino UNO rev1 può andare solo a 57600, oppure velocità inferiori sono permesse? Si penso che a 9600 deve funzionare perchè lo usano tutti gli sketch di esempio.

Leo come fai ad uscire da screen?
A me la combinazione di tasti per il quit non funziona. Per il quit dovrebbe essere C-a C-\ ma non funziona, mentre con C-a C-c ritorna alla bash ma lascia il processo screen avviato.

Ciao.

MauroTec:
Provero a capirci qualcosa di LUFA per vedere di apportare modifiche al codice al fine di ottenere la massima velocità, per le feste penso di avere tempo libero da dedicare.

Attento con LUFA, le ultime versioni sono buggate e non funzionano.
Devi scaricarti una vecchia versione altrimenti non riesci a compilare. Se ricerchi nei Megatopic (mi pare) la discussione in cui Astrobeed presenta il suo firmware per Atmega8U2 modificato per usare l'antiautoreset, c'è anche la versione di LUFA che devi usare. Con quella vai sicuro, l'ho usata anch'io e compila perfettamente.

Quindi la arduino UNO rev1 può andare solo a 57600, oppure velocità inferiori sono permesse? Si penso che a 9600 deve funzionare perchè lo usano tutti gli sketch di esempio.

Veramente la UNO supporta anche velocità molto superiori. 112500 sono supportate dagli sketch (e forse anche i 250K, ma non ho provato).

Leo come fai ad uscire da screen?
A me la combinazione di tasti per il quit non funziona. Per il quit dovrebbe essere C-a C-\ ma non funziona, mentre con C-a C-c ritorna alla bash ma lascia il processo screen avviato.

Esatto. Io ho chiuso brutalmente la finestra in cui ho aperto il terminale, in questo modo ho "seccato" il processo :stuck_out_tongue_closed_eyes:

Sono riuscito a compilare Arduino-usbserial e adesso lavora alla velocità massima di 230400, oltre non c'è sincro, questo protrebbe anche dipendere dal PCB della scheda su cui è montato il 644.

Ho scoperto come impostare le seriali tramite la shell.

stty -F /dev/ttyACM0

Questo è quello che ricevo dopo il comando

speed 115200 baud; line = 0;
eof = ^A; min = 1; time = 0;
-brkint -icrnl -imaxbel
-opost -onlcr
-isig -icanon -iexten -echo -echoe -echok -echoctl -echoke

Si tratta di una interrogazione. Mentre se volessi impostare il Baud Rate a 57600 devo scrivere:

stty -F /dev/ttyACM0 57600

Tutti gli altri argomenti non ho idea di cosa siano.

Se voglio inviare qualcosa sulla seriale posso usare cat e la redirezione così:

cat file_da_spedire > /dev/ttyACM0

Mentre se voglio leggere cosa spedisce il microcontroller scrivo:

cat - < /dev/ttyACM0

Ciao.

stty non lo conoscevo. Le impostazioni sono documentate nella sua pagina del manuale che, devo dire, è immensamente ricca di voci! :astonished:

Di cat > lo sapevo, il carattere > instrada l'output verso un qualcosa, sia esso un file che una periferica. < è l'opposto, ossia raccoglie l'input.