Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

Ottenere 1 Hz precisissimo, 16f84a

Raccolta di codici sorgenti

Moderatore: Foto UtentePaolino

0
voti

[41] Re: Ottenere 1 Hz precisissimo, 16f84a

Messaggioda Foto Utentecarlomusumeci » 6 apr 2015, 18:25

se invece userei quello esterno da 32.768 e diviso opportunamente non dovrei avere nemmeno quei 16ms di ritardo no?
Avatar utente
Foto Utentecarlomusumeci
353 5 7
Sostenitore
Sostenitore
 
Messaggi: 526
Iscritto il: 8 apr 2011, 0:35

0
voti

[42] Re: Ottenere 1 Hz precisissimo, 16f84a

Messaggioda Foto UtenteIsidoroKZ » 6 apr 2015, 18:30

Sì, qualcosa del genere, ma di solito è meglio contare all'indietro, perché il test di fine conteggio è automatico (flag di zero).

Quando si arriva a zero si incrementano i secondi. Si inizializza a 61 o 62 come detto prima per avere la divisione esatta, nove divisioni per 62 ogni 247 divisioni per 61 c'era un typo!.
Per usare proficuamente un simulatore, bisogna sapere molta più elettronica di lui
Plug it in - it works better!
Il 555 sta all'elettronica come Arduino all'informatica! (entrambi loro malgrado)
Se volete risposte rispondete a tutte le mie domande
Avatar utente
Foto UtenteIsidoroKZ
121,2k 1 3 8
G.Master EY
G.Master EY
 
Messaggi: 21059
Iscritto il: 17 ott 2009, 0:00

0
voti

[43] Re: Ottenere 1 Hz precisissimo, 16f84a

Messaggioda Foto Utentecarlomusumeci » 6 apr 2015, 18:36

quindi devo scegliere se inizializzare a 61 o 62...precedentemente avevo capito di dovere inizializzare sia a 61 che 62 e non capivo come fare
Avatar utente
Foto Utentecarlomusumeci
353 5 7
Sostenitore
Sostenitore
 
Messaggi: 526
Iscritto il: 8 apr 2011, 0:35

0
voti

[44] Re: Ottenere 1 Hz precisissimo, 16f84a

Messaggioda Foto UtenteDarioDT » 6 apr 2015, 18:53

ƎlectroYou e non smetti mai di imparare!
Avatar utente
Foto UtenteDarioDT
5.235 4 8 13
Master
Master
 
Messaggi: 1267
Iscritto il: 16 apr 2012, 20:13
Località: Bari

1
voti

[45] Re: Ottenere 1 Hz precisissimo, 16f84a

Messaggioda Foto UtenteIsidoroKZ » 6 apr 2015, 18:53

carlomusumeci ha scritto: quindi devo scegliere se inizializzare a 61 o 62.


Sì, proprio così. Se vuoi fare una soluzione semplice, inizializzi per 9 volte a 62, poi per 247 volte a 61, poi si ricomincia.

Oppure distribuisci più o meno uniformemente le inizializzazione per 62 fra quelle per 61. Ad esempio fai 27 cicli a 61, uno a 62, 28 cicli a 61, uno a 62, il tutto ripetuto per 4 volte, più ancora un ciclo da 27 e l'ultima divisione per 62, poi si ricomincia.

Nota che nel ciclo di interrupt non prepari la visualizzazione, incrementi solo un contatore in memoria, e poi fuori dal ciclo di interrupt fai la visualizzazione e tutto il resto che devi fare.

Il quarzo a 32768 Hz e relativo circuito lascialo stare, è una complicazione inutile. Duplichi oscillatore e divisore, che sono già dentro al Micro. Tanto vale fare tutto senza micro.
Per usare proficuamente un simulatore, bisogna sapere molta più elettronica di lui
Plug it in - it works better!
Il 555 sta all'elettronica come Arduino all'informatica! (entrambi loro malgrado)
Se volete risposte rispondete a tutte le mie domande
Avatar utente
Foto UtenteIsidoroKZ
121,2k 1 3 8
G.Master EY
G.Master EY
 
Messaggi: 21059
Iscritto il: 17 ott 2009, 0:00

0
voti

[46] Re: Ottenere 1 Hz precisissimo, 16f84a

Messaggioda Foto Utentecarlomusumeci » 6 apr 2015, 19:30

Quindi la variabile che conta le 61 interruzioni la inizializzo fuori dall'interrupt...o fatto un pezzo di codice dove si vedono le operazione che riguardano questo interrupt...mi puoi spiegare come inizializzarlo 9 volte a 61 e 244 volte a 62?
Codice: Seleziona tutto
ORG    0x0
RES   CONT_INT   1; VARIABILE PER CONTARE GLI INTERRUPT
RES   UNITA       1;VARIABILE INCREMENTO UNITA
ORG   0X00
   GOTO   START
ORG   0X04      ;VETTORE INTERRUPT
   DECFSZ   CONT_INT;DECREMENTA IL CONTA INTERRUPT E SE...
   GOTO   RITORNA ;RITORNA E CONTINUA A CONTARE INTERRUPT
   GOTO    INC_UNIT; SE VALE ZERO INCREMENTA L'UNITA
INC_UNIT
   INCF   UNITA
RITORNA
   RETFIE

START
...
...
   MOVLW   D'61'   ;CARICO 61 NEL CONTA INTERRUPT
   MOVWF   CONT_INT
...
...
...
;MULTIPLEXAGGIO E INCREMENTO MINUTI ORE ECC


(Ovviamente ho dichiarato solo le variabili che servono per fare l'esempio)
Avatar utente
Foto Utentecarlomusumeci
353 5 7
Sostenitore
Sostenitore
 
Messaggi: 526
Iscritto il: 8 apr 2011, 0:35

0
voti

[47] Re: Ottenere 1 Hz precisissimo, 16f84a

Messaggioda Foto Utentec1b8 » 7 apr 2015, 15:50

Personalmente farei qualche cosa che assomiglia a quanto proposto da Foto UtenteIsidoroKZ al post [39] ma senza alternare i conteggi degli interrupt.
Avrei impostato il prescaler a 32 ed il timer0 a 101 (per ottenere un interrupt dopo 155 conteggi).
In questo modo si genera in interrupt, con quanzo a 4MHz, ogni 4960us.
Avrei quindi "ritardato" il caricamento del timer0 nella routine di interrupt di 40us ottenendo un reale interrupt ogni 5000us.
Contando infine 200 interrupt ottengo esattamente 1s.

Si potrebbe obiettare che far perdere al micro 40us nella routine di interrupt sia molto, ma in una applicazione come questa perdere 40us ogni 5ms per me è accettabile.
Fabio
Avatar utente
Foto Utentec1b8
3.595 3 8 13
G.Master EY
G.Master EY
 
Messaggi: 1770
Iscritto il: 15 gen 2009, 15:23

0
voti

[48] Re: Ottenere 1 Hz precisissimo, 16f84a

Messaggioda Foto UtenteIsidoroKZ » 7 apr 2015, 15:54

Avevo pensato a una soluzione del genere, il motivo per cui non l'ho proposta e` che non so se il tempo di reazione all'interrupt e` sempre lo stesso, oppure ci possa essere una variabilita` a seconda di che cosa il micro sta facendo.
Per usare proficuamente un simulatore, bisogna sapere molta più elettronica di lui
Plug it in - it works better!
Il 555 sta all'elettronica come Arduino all'informatica! (entrambi loro malgrado)
Se volete risposte rispondete a tutte le mie domande
Avatar utente
Foto UtenteIsidoroKZ
121,2k 1 3 8
G.Master EY
G.Master EY
 
Messaggi: 21059
Iscritto il: 17 ott 2009, 0:00

0
voti

[49] Re: Ottenere 1 Hz precisissimo, 16f84a

Messaggioda Foto Utentec1b8 » 7 apr 2015, 16:19

Per quanto ne so io, ci potrebbe essere una differenza di 1us tra un interrupt ed il successivo.
Inteso come tempo che il micro impiega per "fermarsi" e richiamare la routine di interrupt.
Fabio
Avatar utente
Foto Utentec1b8
3.595 3 8 13
G.Master EY
G.Master EY
 
Messaggi: 1770
Iscritto il: 15 gen 2009, 15:23

0
voti

[50] Re: Ottenere 1 Hz precisissimo, 16f84a

Messaggioda Foto UtenteDarioDT » 7 apr 2015, 16:59

Ogni volta che si scrive in TMR0 si perdono due cicli (par. 11.7 del documento seguente)
http://ww1.microchip.com/downloads/en/DeviceDoc/33023a.pdf

Proverei anche con prescaler 4 e preload 6 (per ottenere un interrupt dopo 250 conteggi) ottenendo interrupt ogni 1 mS, sempre con quarzo 4MHz.
Contando 1000 interrupt ottengo 1s.
In realtà per quanto detto prima il preload dovrebbe essere 8 per compensare i due cicli persi.
Farei delle prove con l'oscilloscopio per verificare quanto detto.
Ciao,
Dario
ƎlectroYou e non smetti mai di imparare!
Avatar utente
Foto UtenteDarioDT
5.235 4 8 13
Master
Master
 
Messaggi: 1267
Iscritto il: 16 apr 2012, 20:13
Località: Bari

PrecedenteProssimo

Torna a Firmware e programmazione

Chi c’è in linea

Visitano il forum: Nessuno e 31 ospiti