[C (UNO) ] softUART

lo posto solo per i più smaliziati.
Questa è un’alternativa alla SoftwareSerial, si differenzia che è scritta in C, funziona con il timer1 e Arduino UNO.

Per configurarla bisogna modificare il file “configure_softUART.h”, troverete le varie definizioni che iniziano con CONFIGURE_ e vanno settate a proprio piacimento per i vari pin, dimensione del buffer velocità etc.
Salvare e adesso potete usarla, ad esempio cosi:

#include <softUART.h>

void setup() 
{
    suart_init();
    
    suart_putf(INFLASH("Start test softUART\n"));
    suart_putf(INFLASH("enable echo\n"));
}

void loop() 
{
    if ( suart_available_read() )
        suart_write(suart_read());
}

softUART.zip (4.85 KB)

Grazie. :slight_smile:

Sicuro? :smiling_imp:
[edit] devo correggere il configure STOPBIT adesso va solo con 1.....oops[/edit]

vbextreme:
Sicuro? :smiling_imp:

Uhm ... ok, mi arrendo, dov'e' nascosta la routine di autodistruzione ? (:stuck_out_tongue: :smiley: :smiley: :D)

@etemenanki e ho usato solo lo stile unix di "abuse of define", pensa se aggiungevo un pò di obfuscated...
comunque il pulsante è questo:

a te la scelta...

In allegato la softUART modificata.
ho ripulito, semplificato la configurazione, ora si può scegliere se usare il timer1 o 2 e sistemato il numero di bit stop.
naturalmente è decisamente più performante della SoftwareSerial, sopratutto perchè si può usare una sola softUSART e grazie al modello di Buffer Circolare che ho usato.

softUART.zip (4.77 KB)

scusate, mi ero dimenticato di mappare i pin analogici e con quella precedente da 14/19 non funziona.
allego quella corretta, ora dovrebbe essere completa.

softUART.zip (4.84 KB)

VB, per chiarezza, non conviene mettere la versione corretta SEMPRE nel primo post ? Così uno la trova facilmente anche se qui si accodano altri post ... ::slight_smile:

Basta che editi il primo, elimini la vecchia e alleghi l'ultima versione e, magari, in fondo al post metti una nota in rosso con la data della versione :wink:

Grazie :slight_smile:

Guglielmo

Penso che sarebbe anche utile inserire una lista di pro e contro rispetto alla SoftwareSerial, altrimenti è difficile capire cosa conviene usare.

SukkoPera:
Penso che sarebbe anche utile inserire una lista di pro e contro rispetto alla SoftwareSerial,

Per la software serial ci sono solo contro. :slight_smile:
Sempre e comunque seriali hardware.

Per la software serial ci sono solo contro. :slight_smile:
Sempre e comunque seriali hardware.

c'é un pro: la seriale hardware occupata da qualcos'altro.
Ciao Uwe

uwefed:
c’é un pro: la seriale hardware occupata da qualcos’altro.
Ciao Uwe

Se servono due seriali si usa un micro con due seriali hardware :slight_smile:

astrobeed:
Per la software serial ci sono solo contro. :slight_smile:
Sempre e comunque seriali hardware.

Questo è ovvio... Ma sulla Uno abbiamo una seriale hardware sola, per cui ogni tanto dobbiamo ricorrere a quelle software. Quindi ovviamente intendevo pro e contro tra la SoftwareSerial "di serie" (che nella mia esperienza funziona bene fino a 19200 bps ed è portabile su molti AVR) e questa implementazione SoftUART.

@gbp01, anche io la pensavo così, poi nella sezione inglese mi hanno fatto notare che è meglio non modificare ma aggiungere.

@SukkoPera, la softUART è molto più performante, questo significa che il tempo impiegato ad inviare il bit essendo minore lascia più tempo di esecuzione al resto del programma.
Ad esempio la softwareSerial usa un puntatore alla porta per cambiare lo stato del pin, mentre io uso direttamente la porta, se non ricordo male con il puntatore impieghi 1.3us mentre usando direttamente la porta 0.5us, significa che per inviare un byte la softwareSerial usa la mcu per 10bit*0.5us 5us in più rispetto alla softUART, ma non solo, anche l'uso di un buffer circolare in potenza di 2 è molto più veloce.
Così ad occhio e croce direi che il tempo che impiega la softwareSerial per inviare un bit è lo stesso che impiega la softUART ad inviare 10bit, comunque dato che sei interessato appena ho tempo faccio un benchmark

@Astro concordo, per quello l'ho predisposta per funzionare solo con la UNO, con la mega o la Leonardo non ha molto senso. In più è possibile creare solo una softUART supplementare, crearne 2/3 è sicuramente sintomo che è ora di cambiare mcu.

vbextreme:
Così ad occhio e croce direi che il tempo che impiega la softwareSerial per inviare un bit è lo stesso che impiega la softUART ad inviare 10bit, comunque dato che sei interessato appena ho tempo faccio un benchmark

:o :o :o ... perdona, ma, salvo io non abbia capito male ciò che vuoi dire, su una trasmissione seriale, quello che limita la velocità di invio dei bit e ... il baud rate, non certo i μS impiegati ad alzare o abbassare il livello di un pin.

Guglielmo

@gbp01, invece è molto importante la durata dell'interrupt e quindi la durata di invio di un bit.
più veloce è il codice dentro all'interrupt e più veloce potrà essere il baund rate. ma non solo, per semplificare diciamo che la softwareSerial impieghi 10us a bit e la softUART 5us, per inviare un byte la softwareSerial userà 100us di tempo mcu mentre la softUART 50us, questo significa che nei restanti 50us puoi fare quello che ti pare.
sono riuscito a spiegarmi meglio?

Ok per il possibile incremento del baud-rate, per il resto ,non ho visto in dettaglio il codice ... da quanto dici debbo supporre che per ogni bit cambi solo lo stato del pin e ritorni, ed allo scadere del tempo del singolo bit, aggiorni il pin con il successivo e così via, lasciando quindi più tempo al programma principale per la sua esecuzione. Giusto ? :slight_smile:

Guglielmo