vorrei implementare un contatore binario con clock di 1 KHz su arduino zero
i metodi che avrei pensato sono 2
1 interupt ogni ms e incremento di un registro
2 utilizzo RTC di arduino zero
qualche consiglio di come procedere ?
- Esaminare come è realizzata la board (è quarzata? non lo è?)
- C'è un quarzo per l'oscillatore che pilota il RTC?
- Esaminare il "core" Arduino e vedere se e come è direttamente supportato il RTC
- Vedere se il "reference" della Zero da indicazioni
- cercare librerie che lo supportano
... dopo di che puoi fare la scelta più giusta.
Guglielmo
sulla board c'e un quarzo da 32768
il RTC e insito nella mcu samd21
ci sono librerie ma fanno riferimento solo a RTC come orologio
(anno mese giorno ora min sec)
cosa non so?
creare un int a 1 KHz o collegare 1 KHz al RTC
il RTC puo funzionare anche ome contatore e non come orologio
Mah ... se a te le funzioni di RTC non occorrono, allora, probabilmente, è molto più facile usare un timer. Ci sono varie librerie che ti aiutano.
Guglielmo
Ancora più facile, visto che già esiste, sarebbe avere un "hook" sull'interrupt che viene usato per incrementare il contatore usato da millis() ... questo però NON è previsto di base e, se è vero che il core SAM-D21 è ormai stabile e non ci dovrebbero essere ulteriori aggiornamenti, è anche vero che se aggiornano il "core" devi rifare la tua modifica che viene cancellata.
Il vantaggio è che non si va a creare un'altra ISR, chiamata anche lei ogni ms., ma si sfrutta quella che già c'è ... alleggerendo il carico di MCU.
Guglielmo
EDIT: Mi correggo ... sono andato a vedere il "core" e ... su SAM-D21 hanno avuto l'ottima idea di implementare una serie di "hook" ... guarda il file cores/arduino/hooks.c ... int sysTickHook(void) ![]()
Nel file cores/arduino/wiring.c è chiaramente indicato:
void init( void )
{
// Set Systick to 1ms interval, common to all Cortex-M variants
if ( SysTick_Config( SystemCoreClock / 1000 ) )
{
e ancora, in cores/arduino/delay.c
void SysTick_DefaultHandler(void)
{
// Increment tick count each ms
_ulTickCount++;
tickReset();
}
... quindi, il Systick, è esattamente di 1 ms , come occorre a te. Mi raccomando, l'eventuale "hook function" che vai ad implementare DEVE essere la più corta e veloce possibile per non rallentare tutto il funzionamento.
Guglielmo
grazie... gentilissimi
ora ho una base di partenza
a fra qualche giorno per aggiornarvi sui risultati
e qui che cade l'asino che sarei io
come la implemento la funzione ?
sono andato avanti un po
sono riuscito a far partire millis da 100000000
come posso fare a mettere in quella funzione la MIA_BASETEMPI ??
MIA_BASETEMPI 10000000 MILLIS 10359509
MIA_BASETEMPI 10000000 MILLIS 10359510
MIA_BASETEMPI 10000000 MILLIS 10359510
MIA_BASETEMPI 10000000 MILLIS 10359510
MIA_BASETEMPI 10000000 MILLIS 10359510
MIA_BASETEMPI 10000000 MILLIS 10359511
MIA_BASETEMPI 10000000 MILLIS 10359511
MIA_BASETEMPI 10000000 MILLIS 10359511
MIA_BASETEMPI 10000000 MILLIS 10359511
MIA_BASETEMPI 10000000 MILLIS 10359512
Mica ho capito ch vuoi fare ... a te cosa serve?
Guglielmo
Serial.print("MIA_BASETEMPI ");
Serial.print(MIA_BASETEMPI);
Serial.print(" MILLIS ");
Serial.println(millis());
da qui il risultato
debbo sincronizzare il tempo con gps su due schede separate
ogni 1000 secondi carico il valore del tempo dal gps
nella mia BASE_TEMPI
e ... non fai prima ad utilizzare una libreria RTC basata su millis() che correggi ogni 1000 secondi con i dati dal GPS?
Guglielmo
digita o incolla il codice
void SysTick_DefaultHandler(void)
{
// Increment tick count each ms
_ulTickCount++;
MIA_BASETEMPI++; // quello che vorrei aggiungere
tickReset();
} qui
ma non so dove dichiararlo o come trasmetterlo al mio programma
... però, comunque ... non fai prima comunque ad usare millis() per fare un tuo RTC che correggi con il GPS ogni 1000 sec?
Guglielmo
... ma NON ti serve ... stai semplicemente duplicando millis() ... a te serve costruire un orologio (un RTC) basato su millis() che correggi ogni X secondi con il valore letto dal GPS!!!
Guglielmo
infatti lo vorrei duplicare per leggere e scriver e nella MIA_BASETEMPI
quando voglio senza aggiungere altro codice
Non ti rendi conto che la TUA base dei tempi la puoi fare partendo da millis() e poi correggerla come ti pare senza incasinarti oltre ! Aggiungere un contatore che viene aggiornato dove viene aggiornato millis() NON HA SENSO!
Che precisione di sincronizzazione tra le due MCU ti occorre?
Guglielmo
10 ms