Baud rate speciale

Buongiorno,

scrivo qui, sperando di scrivere nel punto giusto.

E' possibile instaurare una comunicazione seriale con una frequenza "strampalata" ?
Mi volevo interfacciare con un veccio processore motorola 6803, che ha una seriale con baud rate di 7812,5.
Nessuno ha esperienza in merito?

Antiicipatamente ringrazio.

>max_delta: Ho separato io il tuo post dal quel vecchio thread ...
... REGOLAMENTO (... che ti consiglio di leggere con MOLTA attenzione), punto 16.9

Guglielmo

Ok, fatto.
Sapevo di poter sbagliare.

Adesso speriamo in qualche buon suggerimento.
Scusa e grazie.
MAx

Mah, la Serial.begin() puoi impostarla a qualsiasi valore, ma il problema è che il parametro che specifica il baud rate è un long integer, per cui la vedo difficile. Secondo me se imposti 7812 (ossia per difetto) dovresti riuscire a comunicare, visto che un errore dello 0.05% sui tempi dovrebbe rientrare nelle tolleranze.
Prova e facci sapere.

Ok, buona notizia!

Credo di aver letto che si abbia una tolleranza di circa il 2%, per cui non ci sono particolari problemi ad arrotondare.
Ho letto da qualche parte che le velcoità impostabili, sono quelle classiche della seriale.
Di quale arduino stiamo parlando?

MAx

max_delta:
Ho letto da qualche parte che le velcoità impostabili, sono quelle classiche della seriale.

Direi che NON è affatto vero e basta guardare il sorgente nel “core” per verificarlo …

void HardwareSerial::begin(unsigned long baud, byte config)
{
  // Try u2x mode first
  uint16_t baud_setting = (F_CPU / 4 / baud - 1) / 2;
  *_ucsra = 1 << U2X0;

  // hardcoded exception for 57600 for compatibility with the bootloader
  // shipped with the Duemilanove and previous boards and the firmware
  // on the 8U2 on the Uno and Mega 2560. Also, The baud_setting cannot
  // be > 4095, so switch back to non-u2x mode if the baud rate is too
  // low.
  if (((F_CPU == 16000000UL) && (baud == 57600)) || (baud_setting >4095))
  {
    *_ucsra = 0;
    baud_setting = (F_CPU / 8 / baud - 1) / 2;
  }

  // assign the baud_setting, a.k.a. ubrr (USART Baud Rate Register)
  *_ubrrh = baud_setting >> 8;
  *_ubrrl = baud_setting;

  _written = false;

  //set the data bits, parity, and stop bits
#if defined(__AVR_ATmega8__)
  config |= 0x80; // select UCSRC register (shared with UBRRH)
#endif
  *_ucsrc = config;
  
  sbi(*_ucsrb, RXEN0);
  sbi(*_ucsrb, TXEN0);
  sbi(*_ucsrb, RXCIE0);
  cbi(*_ucsrb, UDRIE0);
}

void HardwareSerial::end()
{
  // wait for transmission of outgoing data
  flush();

  cbi(*_ucsrb, RXEN0);
  cbi(*_ucsrb, TXEN0);
  cbi(*_ucsrb, RXCIE0);
  cbi(*_ucsrb, UDRIE0);
  
  // clear any received data
  _rx_buffer_head = _rx_buffer_tail;
}

… come vedi, nelle prime linee, viene fatto un calcolo con il valore che viene passato e NON ci sono valori prefissati.

Guglielmo

max_delta:
Ho letto da qualche parte che le velcoità impostabili, sono quelle classiche della seriale.

Vero per il monitor seriale, ma non per la UART ossia l'oggetto Serial, come anche Guglielmo ti ha mostrato.

Infatti per fare un esempio, se vuoi usare Arduino come controller MIDI, anche se lo standard MIDI funziona ad un baud rate non convenzionale (31.250 bps) puoi implementarlo perfettamente anche con Arduino.

PS: tra parentesi, essendo io un appassionato di musica e di tastiere elettroniche (sono tastierista amatoriale), proprio da questo forum mi è venuto lo spunto per un progetto di una pedaliera MIDI che vorrei realizzare per comandare le mie tastiere :wink:

Grazie,

non mi resta che fare delle prove.

Il mio progetto è diviso in due parti: prima devo verificare la possibilità di dialogare con questa centralina, inviandole dei semplici codici esadecimali, poi vorrei gestire un display e mettere le informazioni che ricevo a schermo.

Ma un passo alla volta, parto con la seriale (che è la cosa che mi preoccupa di più)

Grazie a tutti
A presto

MAx