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.