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

4
voti

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

Messaggioda Foto UtenteWALTERmwp » 13 set 2014, 11:46

Ciao Foto UtenteTricka90, questo ...
Tricka90 ha scritto:uno che generi un interrupt ad ogni ciclo
... non ho capito cosa significhi, comunque, come ti è già stato scritto, se tu usi il timer sei tu che imposti il suo valore quindi conosci il tempo che impiega ad andare in overflow.
Se tendi ad una maggiore "accuratezza" devi ridurre la frequenza di esecuzione di qualsivoglia funzione (ivi compresa l'interpretazione dell'insorgenza dello interrupt) a meno che, ovviamente, non sia indispensabile.
Hai l'esigenza di attivare il timer ogni 10 ms ?
Se non sussiste fai in modo che questo valore sia più alto possibile; 50 ms, 100 ms ... 1 s ?
Una volta che hai definito la tua griglia temporale incrementi la tua variabile " i " in modo coerente.
Se poi la verifica dell'orario la fai su un periodo ragionevolmente "grande" (una settimana, un mese, ... ) il valore della griglia temporale di cui sopra non risulta determinante rispetto all'entità della deriva stessa del sistema microcontrollore.

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

1
voti

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

Messaggioda Foto Utentedean95 » 13 set 2014, 12:41

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


non a caso, in inglese precisione si dice "accuracy " :D
Avatar utente
Foto Utentedean95
262 1 5 8
Sostenitore
Sostenitore
 
Messaggi: 950
Iscritto il: 20 ago 2010, 17:21

1
voti

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

Messaggioda Foto UtenteTricka90 » 13 set 2014, 15:08

Vi ringrazio Foto UtenteRussel e Foto UtenteWALTERmwp, ho unito le informazioni che mi avete dato ed ho provato ad impostare un metodo.
Innanzitutto imposterei il prescaler del TIMER0 a 1:256 che è il massimo. Il valore del TIMER0 cresce ad ogni ciclo, e va da 0 a 255. Dato che la frequenza è di 4 MHz dovrebbe andare da 0 a 255 in 64 us (generando l'interrupt), ma moltiplicando per il prescaler diventa 16.384 ms.
Ora, se incrementassi una variabile "i" ad ogni interrupt, cioè ogni 16.384 ms, non riuscirei a trovare un valore intero di "i" che corrisponda esattamente ad 1 secondo: dovrei scegliere fra 61 e 62, e nel caso migliore (scegliendo 61) avrei un errore inferiore allo 0.06%. Ciò significa che l'errore sarebbe di meno di mezzora al mese, e così si inizia a già a ragionare: è molto meglio rispetto ai risultati che ho ottenuto finora :D Poi, volendo, basterebbe usare un prescaler inferiore affinché la variabile "i" abbia una risoluzione maggiore e si possa scegliere un valore intero che corrisponda con più precisione (argh accuratezza! #-o ) ad 1 secondo.

Dite che ho fatto tutto giusto? E soprattutto, io in questo calcolo ho ipotizzato trascurabili i ritardi d'esecuzione del programma....ho fatto bene? [-X
Avatar utente
Foto UtenteTricka90
662 1 6 10
Expert
Expert
 
Messaggi: 627
Iscritto il: 1 lug 2013, 15:53

1
voti

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

Messaggioda Foto UtenteRussell » 13 set 2014, 15:24

Tricka90 ha scritto:Ora, se incrementassi una variabile "i" ad ogni interrupt, cioè ogni 16.384 ms, non riuscirei a trovare un valore intero di "i" che corrisponda esattamente ad 1 secondo: dovrei scegliere fra 61 e 62


Ma è davvero necessario avere un interrupt al secondo? Non puoi allungare i tempi e farti segnalare direttamente il minuto, o l'ora ... o di piu'?
Se la tua variabile fosse su 2 byte potresti tranquillamente "contare" fino a mezza giornata...
in tal caso l'errore che commetteresti sarebbe sicuramente molto inferiore.

Inoltre, insistendo con questa volonta' di farsi segnalare il secondo, il fatto stesso che sai quanto tempo richiede contare fino a 61 (o 62) ti da' anche immediatamente la possibilità di correggerti
... ovvero nel tuo caso:
Il corretto modo di "contare" 1 secondo sarebbe dopo 61,03515625 cicli
puoi scegliere di contare sempre fino a 61... ma commetteresti un errore sistematico
oppure puoi contare il secondo 35 volte contando fino a 62, e le succesive 965 volte contando fino a 61
fatti 2 conti e vedrai che vai "mediamente" molto piu' vicino al secondo di quanto tu creda
Avatar utente
Foto UtenteRussell
3.373 3 5 9
Master
Master
 
Messaggi: 2194
Iscritto il: 4 ott 2009, 10:25

5
voti

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

Messaggioda Foto UtenteTardoFreak » 13 set 2014, 15:39

Non serve avere una interrupt al secondo, basta anche solo averla ogni 10ms per esempio tenendo il conto mediante il software (si tratta solo di incrementare e comparare, quindi niente di difficile, banale direi).
L' importante è fare in modo di non perdere tempo nel ricaricare il timer con un valore perché l' operazione fa passare del tempo.
La soluzione migliore è utilizzare un timer con il registro comparatore e quello di ricarica (o che azzeri il timer). Su i PIC18 il timer perfetto per questo lavoro è il timer 2.
In questo articolo ho illustrato il concetto.
A questo punto più il quarzo è preciso più lo sarà l' orologio.
Si può anche utilizzare l' oscillatore secondario con il quarzino da 32678Hz, quello per gli orologi. Questa soluzione viene adottata per generare una interrupt al secondo, ma non tanto per la precisione che dipende comunque dal quarzo, quanto per i consumi.
Nelle applicazioni che necessitano un RTCC e questo non è presente si usa non spegnere mai il micro ma lo si manda in uno stato di basso consumo (sleep o standby) e lo si sveglia con l' interrupt del timer. Una volta eseguita la funzione di servizio dell' interrupt (cioè dopo aver aggiornato il timer/calendario software) il micro viene nuovamente mandato in sleep, a meno che non stia già facendo qualcosa per gli affari suoi.
"La follia sta nel fare sempre la stessa cosa aspettandosi risultati diversi".
"Parla soltanto quando sei sicuro che quello che dirai è più bello del silenzio".
Rispondere è cortesia, ma lasciare l'ultima parola ai cretini è arte.
Avatar utente
Foto UtenteTardoFreak
73,4k 8 12 13
-EY Legend-
-EY Legend-
 
Messaggi: 15764
Iscritto il: 16 dic 2009, 11:10
Località: Torino - 3° pianeta del Sistema Solare

0
voti

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

Messaggioda Foto UtenteTricka90 » 14 set 2014, 10:12

Russell ha scritto:Ma è davvero necessario avere un interrupt al secondo? Non puoi allungare i tempi e farti segnalare direttamente il minuto, o l'ora ... o di piu'?

Beh, in realtà non volevo far avvenire l'interrupt ogni secondo, ma ogni 16,384 ms, e con questo PIC, che ha TIMER a 8 bit e non a 16, purtroppo, non è possibile far avvenire l'interrupt con minor frequenza (almeno credo, correggimi pure se sbaglio).
Ottima l'idea di contare sia a 61 che a 62, la userò di certo! :D

Ora però, per iniziare, ho provato a scrivere il semplice codice di cui ti ho parlato prima, ma non funziona come dovrebbe...

Codice: Seleziona tutto
unsigned int i = 0;

void interrupt()
{
  if (INTCON.T0IF)
     {
      i++;
      if (i >= 1953)
         {
          PORTB.RB3 = ~PORTB.RB3;
          i = 0;
          }
      INTCON.T0IF = 0;
      }

}


void main()
{

OPTION_REG = 0b00000010;
INTCON.GIE = 1;
INTCON.T0IE = 1;

TRISB = 0;
PORTB = 0;

while (1)

{

  }

}


Ho scritto questo programma in MikroC.
Ho scelto di utilizzare un prescaler pari a 8, per maggior precisione, quindi avere un interrupt (a cui corrisponde un incremento della variabile "i") ogni 512 us. Quindi quando la variabile "i" sarà pari a 1953 sarà trascorso 1 secondo (precisamente 0.999936 secondi). Ogni secondo verrà spento/acceso il LED su RB3.
Il problema è che l'accensione/spegnimento del LED non avviene ogni secondo, ma circa ogni 4 secondi. Solo se porto il prescaler a 2, mantenendo tutti gli altri parametri invariati, il LED lampeggia ogni secondo, ma in modo molto impreciso (dopo pochi minuti è già in anticipo di un bel po').
Come mai non funziona? I calcoli non erano corretti?

Grazie anche a te TardoFreak! :D Purtroppo per ora non ho la possibilità di lavorare coi PIC18 (sono dannatamente costosi! :mrgreen: ) quindi mi sto accontentando di utilizzare PIC più modesti. Per ora comunque sarei già felice di imparare a fare i calcoli corretti per questo semplice programma, e sembra che abbia già sbagliato qualcosa! #-o
Avatar utente
Foto UtenteTricka90
662 1 6 10
Expert
Expert
 
Messaggi: 627
Iscritto il: 1 lug 2013, 15:53

0
voti

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

Messaggioda Foto UtenteWALTERmwp » 14 set 2014, 14:18

Foto UtenteTricka90, Il codice così com'è dovrebbe dare "qualche" errore in compilazione ma credo tu lo abbia semplicemente riportato con distrazione.
A parte ciò, non vedo il valore di preset caricato nel timer0 quindi presumo tu lo voglia fare "contare" da 0 a 255.
Quindi, per questo ...
Tricka90 ha scritto:Ho scelto di utilizzare un prescaler pari a 8, per maggior precisione, quindi avere un interrupt (a cui corrisponde un incremento della variabile "i") ogni 512 us. Quindi quando la variabile "i" sarà pari a 1953 sarà trascorso 1 secondo (precisamente 0.999936 secondi).
... , credo tu commetta un errore di base (poi guarda con più attenzione il datasheet a pag. 46 ... ).
Quando si verifica l'overflow del timer, quando cioè entri nella routine di interrupt, non saranno trascorsi 512 microsecondi ma 2,04 millisecondi, quindi un tempo quattro volte superiore.
Questo perché, semplicemente, il clock di base (guarda la figura), è "Fosc/4".
Ho letto i Posts precedenti e credo tu abbia interpretato le informazioni in modo errato come già riportato nel Post [13]:
Tricka90 ha scritto:Il valore del TIMER0 cresce ad ogni ciclo, e va da 0 a 255. Dato che la frequenza è di 4 MHz dovrebbe andare da 0 a 255 in 64 us
.
Considera quanto sopra, ammesso ch'io non abbia letto male, e riprova con il tuo codice rivisto.

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

4
voti

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

Messaggioda Foto UtenteTardoFreak » 14 set 2014, 15:55

Foto UtenteTricka90,
Guarda che il timer 2, identico a quello del PIC18 c'è anche nel tuo PIC!
Uguale uguale.

Ma perché prima di parlare non leggete il datasheet? ||O

"[#]"
"La follia sta nel fare sempre la stessa cosa aspettandosi risultati diversi".
"Parla soltanto quando sei sicuro che quello che dirai è più bello del silenzio".
Rispondere è cortesia, ma lasciare l'ultima parola ai cretini è arte.
Avatar utente
Foto UtenteTardoFreak
73,4k 8 12 13
-EY Legend-
-EY Legend-
 
Messaggi: 15764
Iscritto il: 16 dic 2009, 11:10
Località: Torino - 3° pianeta del Sistema Solare

0
voti

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

Messaggioda Foto UtenteTricka90 » 15 set 2014, 14:20

WALTERmwp ha scritto:Foto UtenteTricka90, Il codice così com'è dovrebbe dare "qualche" errore in compilazione ma credo tu lo abbia semplicemente riportato con distrazione.


...ehm, veramente no, l'ho appena ricontrollato ed è esattamente come l'ho riportato...ho fatto qualche erroraccio grossolano? :oops:
Per il resto adesso è tutto chiaro, capisco come mai il LED lampeggiava ogni 4 secondi invece che ogni secondo.
Però ancora non mi è chiaro come mai, impostando il prescaler a 2, (quindi 4 volte inferiore in modo da compensare il fatto che abbiamo Fosc/4) il LED lampeggi si ogni secondo, ma in modo molto impreciso.

TardoFreak ha scritto:Foto UtenteTricka90,
Guarda che il timer 2, identico a quello del PIC18 c'è anche nel tuo PIC!

Foto UtenteTardoFreak ti chiedo scusa, pensavo che ti riferissi in particolare ai timer 2 dei PIC18, e che avessero qualche pregio in più rispetto al timer 2 del PIC16F628a.
Ho letto il datasheet ma forse non mi è chiaro come mai il timer 2 sarebbe più indicato del timer 0.
Se ho capito bene il timer 2 dovrebbe generare un interrupt ogni volta che il suo valore coincide con quello che imposterò nel registro PIR2. Il pregio potrebbe essere che, impostando il PIR2, potrò scegliere esattamente il tempo di 1 secondo (diviso per un numero intero) piuttosto che una sua approssimazione come nel caso del timer 0; anche per quest'ultimo potrei ottenere 1 secondo preciso ma dovrei reimpostare ad ogni interrupt un valore di partenza che me lo consenta e ciò causerebbe ritardi, come mi avevi scritto qui:
TardoFreak ha scritto:L' importante è fare in modo di non perdere tempo nel ricaricare il timer con un valore perché l' operazione fa passare del tempo.

Dico bene? E' questo il motivo per cui è meglio utilizzare il timer 2?
Ovviamente per entrambi sarebbe indispensabile la variabile "i" se non sbaglio.

Ora comunque sto leggendo l'articolo che mi hai linkato :-)
Avatar utente
Foto UtenteTricka90
662 1 6 10
Expert
Expert
 
Messaggi: 627
Iscritto il: 1 lug 2013, 15:53

0
voti

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

Messaggioda Foto UtenteWALTERmwp » 15 set 2014, 15:20

Per questo ...
Tricka90 ha scritto:ho fatto qualche erroraccio grossolano?
... credo nessun errore, mi dispiace per averlo scritto ma mi sono fatto ingannare dall'irregolarità dell'indentazione: avrei potuto comunque controllare meglio.

Tricka90 ha scritto:Però ancora non mi è chiaro come mai, impostando il prescaler a 2, (quindi 4 volte inferiore in modo da compensare il fatto che abbiamo Fosc/4) il LED lampeggi si ogni secondo, ma in modo molto impreciso.
... ?
Se imposti "010" per "bit 2-0 PS<2:0>: Prescaler Rate Select bits", definisci un rapporto di 8 a 1 tra la frequenza di ingresso e quella di uscita.

Poi, prova ad essere più "preciso" nella descrizione della mancanza di "accuratezza" che ritieni di rilevare.

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

PrecedenteProssimo

Torna a Realizzazioni, interfacciamento e nozioni generali.

Chi c’è in linea

Visitano il forum: Nessuno e 1 ospite