Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

Un orologio con un PIC 16F628a sarà preciso?

Tipologie, strumenti di sviluppo, hardware e progetti

Moderatore: Foto UtentePaolino

0
voti

[1] Un orologio con un PIC 16F628a sarà preciso?

Messaggioda Foto UtenteTricka90 » 10 set 2014, 14:14

Ciao ragazzi.
Ho cercato attentamente nel datasheet del PIC16F628a ma non ho trovato alcuna informazione a riguardo.
Vorrei sapere quanto possiamo aspettarci che un PIC di questo tipo sia preciso quando impostiamo delle funzioni Delay.
In particolare, se io costruissi un orologio con un PIC16F628a utilizzando l'oscillatore interno da 4MHz, che precisione potrei aspettarmi? Quanti minuti perderebbe alla settimana?
Vorrei giusto un'idea a spanne, niente di più.
Grazie in anticipo a chi mi aiuterà :D
Avatar utente
Foto UtenteTricka90
662 1 6 10
Expert
Expert
 
Messaggi: 627
Iscritto il: 1 lug 2013, 15:53

2
voti

[2] Re: Un orologio con un PIC 16F628a sarà preciso?

Messaggioda Foto UtenteRussell » 10 set 2014, 14:36

a naso darei la colpa principalmente al quarzo, che non avra' mai la frequenza nominale per cui è stato acquistato
ammettendo una tolleranza del 1 percento... o 1 per-mille.... è quello che ti dovrai aspettare anche sul lungo periodo

è anche vero che la stabilità del cristallo dovrebbe essere di qualche parte per milione
quindi una volta che sai l'esatta frequenza del cristallo (ovvero quanto deriva al mese) puoi anche provare a compensare
ma non ho mai provato... e se vuoi toglierti il dubbio sai anche come fare il test :D
Avatar utente
Foto UtenteRussell
3.373 3 5 9
Master
Master
 
Messaggi: 2194
Iscritto il: 4 ott 2009, 10:25

0
voti

[3] Re: Un orologio con un PIC 16F628a sarà preciso?

Messaggioda Foto UtenteTricka90 » 10 set 2014, 22:23

Beh, qualche parte per milione, se davvero fosse così, non sarebbe niente male come precisione!
Mi interessa sapere, in particolare, se la precisione può dipendere anche dai carichi che vengono alimentati, o meglio dalla corrente che assorbono e dal tempo durante il quale la assorbono (corrente che ovviamente rimarrà sempre ampiamente al di sotto degli Absolute Maximum Ratings). Che ne pensi?

Ho appena provato comunque! Ho scritto un programma in MikroC che accende un pin per 50ms e poi lo spegne per 9950ms (in tutto 10 secondi). Ho letto con un cronometro affidabile per 40 minuti, e dopo questo breve intervallo di tempo il PIC era già in anticipo di ben 13.3 secondi! Altro che orologio preciso! :D Ora ho aumentato i 10000ms in modo proporzionale e domattina farà una nuova prova ;-)
Avatar utente
Foto UtenteTricka90
662 1 6 10
Expert
Expert
 
Messaggi: 627
Iscritto il: 1 lug 2013, 15:53

1
voti

[4] Re: Un orologio con un PIC 16F628a sarà preciso?

Messaggioda Foto Utenteedgar » 10 set 2014, 23:05

Tricka90 ha scritto:Beh, qualche parte per milione, se davvero fosse così, non sarebbe niente male come precisione!

I quarzi "standard" possono avere derive anche di oltre 100 ppm. Non ho esperienza coi PIC ma per avere temporizzazioni accurate di solito si usa un interrupt. Tempo fa ho fatto una prova su breadboard con un ATmega generando un interrupt al secondo: teneva senza problemi il tempo a distanza di una settimana
Avatar utente
Foto Utenteedgar
5.287 3 3 8
Master
Master
 
Messaggi: 2539
Iscritto il: 15 set 2012, 22:59

1
voti

[5] Re: Un orologio con un PIC 16F628a sarà preciso?

Messaggioda Foto UtenteRussell » 11 set 2014, 9:06

Tricka90 ha scritto:Mi interessa sapere, in particolare, se la precisione può dipendere anche dai carichi che vengono alimentati


Questo non credo fortunatamente. Non vedo forti nessi tra questo e il segnale di clock

Nota poi che se un clock ha anche una deriva di 100ppm, passati 40 minuti, dovresti avere, al massimo, 0.25 secondi di differenza.... fatti i calcoli.
Quindi nel tuo test c'è qualcosa di strano.

piuttosto che le alimentazioni dei carichi, penso sia piu' determinante il codice che si scrive.
Ad esempio puo' essere importante come hai implementato quelle temporizzazioni nel tuo test
Se infatti hai scritto qualcosa tipo:

Codice: Seleziona tutto
loop{
  SetPinAlto();
  sleep(50ms);
  SetPinBasso();
  sleep(9950ms);
}


Allora potresti aver introdotto da codice un problema...
Infatti le funzioni SetPinAlto/Basso non sono istantanee, e a lungo andare l'effetto si fa' sentire.
In effetti anche la funzione sleep non è perfettamente istantanea probabilmente, quindi anche quella puo' introdrre un ritardo.

Se tu ad esempio facessi lampeggiare il LED, con questo codice, una volta ogni 2 minuti (invece che ogni 10 sec) credo che dopo 40 min la deriva non sarebbe poi tanto accentuata (dato che hai perso meno tempo complesivamente in operazioni superflue)

Come ti ha detto Foto Utenteedgar sarebbe meglio usare un interrupt
Quindi appena ti arriva il segnale di "tempo scaduto" come prima cosa devi riattivare l'interrupt successivo, e solo a quel punto puoi perdere tempo a settare il pin (alto o basso).... in questo modo le operazioni superflue non influiscono sulla tua analisi del tempo.
Se tu potessi attivare un interrupt ciciclo automaticamente ogni 10 sec sarebbe il massimo, infatti anche invocare una interrupt non è poi cosi' gratis (servono sempre qualche ciclo di clock per eseguirla). Chiaramente poi la gestione del lampeggio da 50ms te la dovresti fare in autonomia a parte.
[Dipende molto dall'ambiente sul quale stai scrivendo il tuo codice, studiati i dettagli magari]
Avatar utente
Foto UtenteRussell
3.373 3 5 9
Master
Master
 
Messaggi: 2194
Iscritto il: 4 ott 2009, 10:25

2
voti

[6] Re: Un orologio con un PIC 16F628a sarà preciso?

Messaggioda Foto UtenteDonJ » 12 set 2014, 10:59

Ho letto molto velocemente, ma posso confermare che un orologio costruito con un 16F867 con interrupt su TMR0 garantisce una buona precisione, il mio orologio perde circa 2 secondi al mese.

Se non usi il timer come interrupt non otterrai mai qualcosa di affidabile!

Ciao
And now for something completely different.
[Monty Python]
Avatar utente
Foto UtenteDonJ
3.951 6 9 13
Master EY
Master EY
 
Messaggi: 2461
Iscritto il: 19 lug 2009, 22:13
Località: Croccamauria (Dublino)

4
voti

[7] Re: Un orologio con un PIC 16F628a sarà preciso?

Messaggioda Foto UtenteWALTERmwp » 12 set 2014, 15:55

Attenzione, non fatevi "beccare" da Foto UtenteDirtyDeeds a scriver di "precisione" altrimenti qui "finisce male" ... ah, e che nessuno lo evochi, mi raccomando ... "accuratezza" ...

Saluti
W - U.H.F.
Avatar utente
Foto UtenteWALTERmwp
22,2k 4 8 13
G.Master EY
G.Master EY
 
Messaggi: 6444
Iscritto il: 17 lug 2010, 18:42
Località: le 4 del mattino

2
voti

[8] Re: Un orologio con un PIC 16F628a sarà preciso?

Messaggioda Foto Utentedadduni » 12 set 2014, 17:53

allora, io non ho mai lavorato con i PIC ma con gli atmega si, e in quel caso è sconsigliato usare l'oscilatore interno dell atmega ma usare un real time clock che comunica tramite i2c con il micro così da affidare al componente esterno il compito di portare l'orario e solo quando serve, si fa una query all'RTC che passa l'orario al processore, questi componenti sono prvvisti anche di batteria stand alone così in caso di mancata alimentazione mantiene comunque l'ora e la data corrente =) spero di esseert stato utile =)
Avatar utente
Foto Utentedadduni
1.655 2 6 12
Expert EY
Expert EY
 
Messaggi: 1034
Iscritto il: 23 mag 2014, 16:26

0
voti

[9] Re: Un orologio con un PIC 16F628a sarà preciso?

Messaggioda Foto UtenteTricka90 » 13 set 2014, 8:57

Grazie infinite delle risposte ragazzi! :D
Scusate il ritardo ma ero occupato con l'università...ora finalmente posso riprendere l'esperimento.
Dunque, vedo che tutti siete d'accordo che l'unico modo per avere una precisione accettabile (per me pochi secondi alla settimana sarebbero già un ottimo risultato!) è utilizzare gli interrupt del TIMER.
Provo a dirvi come realizzerei il programma, correggetemi se sbaglio: dopo aver configurato uno dei TIMER (uno che generi un interrupt ad ogni ciclo) lo faccio partire; ogni volta che viene generato un interrupt, e quindi avrò il relativo bit che diventa 1, lo riporto a zero e incremento una variabile, chiamiamola "i"; quando essa avrà raggiunto un dato valore che dovrò calcolare, sarà trascorso un secondo esatto, perciò la potrei reimpostare a zero e incrementare un'altra variabile, "secondi"; a questo punto avrei la mia base tempi espressa in secondi e potrei scrivere una funzione if che esegue un'istruzione quando la variabile "secondi" ha un certo valore.
Che ne dite, vado bene?
Ho solo una domanda: come faccio a calcolare quale valore di "i" equivale ad un secondo esatto?
Avatar utente
Foto UtenteTricka90
662 1 6 10
Expert
Expert
 
Messaggi: 627
Iscritto il: 1 lug 2013, 15:53

1
voti

[10] Re: Un orologio con un PIC 16F628a sarà preciso?

Messaggioda Foto UtenteRussell » 13 set 2014, 10:49

Tricka90 ha scritto:come faccio a calcolare quale valore di "i" equivale ad un secondo esatto?


Lo puoi dedurre dal fatto che conosci la frequenza di clock del tuo micro, e conosci il tuo timer.
quindi puoi ragionare come illustrato qui
http://electronics.stackexchange.com/questions/84164/pic-how-to-set-timer0-to-give-an-interrupt-at-every-1-sec
e infine se hai dubbi sicuramente sul datasheet del micro c'è una apposita sezione che spiega come affrontale questo problema, probabilmente con esempi :D
Avatar utente
Foto UtenteRussell
3.373 3 5 9
Master
Master
 
Messaggi: 2194
Iscritto il: 4 ott 2009, 10:25

Prossimo

Torna a Realizzazioni, interfacciamento e nozioni generali.

Chi c’è in linea

Visitano il forum: Nessuno e 3 ospiti