Stai visualizzando 2 post - dal 1 a 2 (di 2 totali)
  • Autore
    Post
  • #2233
    Avatartheremino
    Amministratore del forum

    Ciao a tutti,
    conosco abbastanza bene il CPP ma non ho esperienza con Arduino, per cui vengo qui a chiedere aiuto agli esperti.

    Abbiamo scritto una libreria e un protocollo di comunicazione con il PC. L’implementazione è avvenuta senza troppe difficoltà, ma c’è un particolare che non siamo riusciti a risolvere nel modo dovuto. Abbiamo quindi dovuto ricorrere a una soluzione che comporta un maggiore carico di lavoro alla CPU della scheda Arduino. Ora la libreria è completa e funziona bene, ma siccome io sono un tantino pignolo, mi resta il dubbio che possa esistere una soluzione migliore.

    – – –

    Tutto nasce dalla funzione “serialEvent()”, che evento non è, ma solo un polling ad ogni giro di “loop()”.

    Per cui, per rendere la comunicazione seriale asincrona, e indipendente da quel che l’utente scrive nel “loop()”, abbiamo preparato un secondo modo di funzionamento chiamato “AsyncMode”.

    In questo modo di funzionamento il controllo del buffer della seriale viene chiamato dall’interrupt del comparatore del timer zero, cioè da “ISR(TIMER0_COMPA_vect)”

    L'”AsyncMode” non è sempre una buona idea perché diminuisce l’efficienza di comunicazione di un 25% e potrebbe anche creare problemi con alcune librerie che utilizzano il TIMER0_COMPA_vect.

    Per cui l’AsyncMode andrebbe abilitato solo se necessario.

    Quindi la soluzione pulita sarebbe una “#define AsyncMode” nel file “.ino”, e una compilazione condizionale nel file CPP della libreria, con alcuni “#ifdef AsyncMode”, per compilare solo le parti necessarie.

    – – –

    Ma, a quanto pare, i file vengono compilati separatamente, e niente di quel che si scrive nel file “.ino” riesce a modificare il comportamento della precompilazione di una libreria.

    Abbiamo provato di tutto, #define, costanti ecc.. Abbiamo anche provato a includere un file “.h” di definizioni… Ma il problema fondamentale resta, nessuna informazione passa dal file “.ino” alla libreria in fase di precompilazione.

    Qualche idea?

    #7133
    Picmicro675Picmicro675
    Moderatore

    L’idea, sebbene un po tardi, sarebbe di mettere un interrupt sul piedino RX, come del resto già fanno le seriali, anche la soft-serial se non sbaglio. Quindi quando il segnale va basso, per il bit di start la seriale viene presa in considerazione. Non serve interrogare il timer0, ma basta rilevare (in tempo) il fronte di discesa di RX.
    Comunque il metodo del define è ammissibile e quindi può dare il risultato voluto. Sebbene il compilatore dovrebbe solo includere quello che viene di fatto instanziato.

    • Questa risposta è stata modificata 9 mesi fa da Picmicro675Picmicro675.
    • Questa risposta è stata modificata 9 mesi fa da Picmicro675Picmicro675.
Stai visualizzando 2 post - dal 1 a 2 (di 2 totali)
  • Devi essere connesso per rispondere a questo topic.