Ciao Gianluca,
provo a soddisfare le tue curiosita'.
Però perché nonostante tutti gli if qui va tutto bene, mentre nel mio avevo tutto quel jitter?
Perche' non ti sei preoccupato di considerare i tempi di esecuzione di quello che hai scritto.
Per ridurre il jitter e' fondamentale che il loop giri il piu' velocemente possibile.
Gli if non c'entrano, ci vogliono e non prendono molto tempo, ma scrivere if(micros()%4830<2415) puo' essere comodo per il programmatore , ma non per un povero micro.
Capisco che sommi tutto e poi fai un solo PORTD alla fine (più il PORTB), ma perché fai XOR?
L'hai gia' capito: se tu vedi i due bit in ingresso di uno XOR, uno come un segnale e l'altro come un comando, quando il comando e' =1 il segnale viene invertito e quando e' =0 il segnale resta invariato.
Inoltre non riesco a capire perché consideri il periodo completo, anziché il semiperiodo... Ah! E' perché hai impostato una base dei tempi a 500ns anziché 1us!
Anche questo l'hai gia' capito, inoltre l'AtMega con clock a 16MHz non consente di usare 1uS come base tempi di Timer 1. Se vuoi approfondire devi leggere il datasheet.(Se sei interessato dimmi e spiego meglio).
Ho provato anche a disattivare il noInterrupts(), ma funziona ugualmente bene!
noInterrupts() ci deve essere per due motivi:
-
Evita che l'interrupt di Timer 0, quello che in Arduino gira sempre per gestire millis() micros() delay() e forse qualcos'altro, interrompa il nostro loop e quindi introduca jitter.
-
E' indispensablile che ci siano gli interrupt disabilitati per leggere Timer 1, avendo la garanzia di leggerlo sempre correttamente.Se vuoi approfondire devi leggere il datasheet.(Se sei interessato dimmi e spiego meglio).
E' perché usi TNCT1 anziché micros()?
Perche' micros() e' molto piu' pesante, nel senso che prende molto piu' tempo per l'esecuzione, specie se lo chiami 9 volte come hai fatto tu.
Leggere Timer1 e' una cosa velocissima.
Inoltre micros() da' un valore su 32 bit che in questo caso non servono a niente, se non a rendere il tutto piu' pesante.
Come sei arrivato a questo programma? Avevi già sperimentato sulla generazione di segnali?
Mi piacerebbe capire bene come sei arrivato a questo che, seppure semplicissimo, funziona molto bene.
Sono piuttosto anziano ed ho iniziato tanti anni fa come progettista HW digitale.
Ho poi scritto per molti anni in assembler, e quindi a contatto con quello che succede dentro ad un micro.
Di conseguenza, anche oggi che scribacchio in C, mi porto dietro quello che ho fatto quando ero giovane.
@Claudio_FF
Secondo me dovrebbe andare ancora meglio cambiando l'aggiornamento delle variabili tempo in questo modo:
Onestamente non vedo vantaggi ...
E anche sostituire tutti i 1 << PDx con costanti precalcolate.
i 1 << PDx sono delle costanti calcolate dal preprocessore
Ciao
Marco