Ottenere 1 Hz precisissimo, 16f84a
Moderatore:
Paolino
0
voti
se invece userei quello esterno da 32.768 e diviso opportunamente non dovrei avere nemmeno quei 16ms di ritardo no?
-

carlomusumeci
353 5 7 - Sostenitore

- Messaggi: 526
- Iscritto il: 8 apr 2011, 0:35
0
voti
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!.
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
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
0
voti
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
-

carlomusumeci
353 5 7 - Sostenitore

- Messaggi: 526
- Iscritto il: 8 apr 2011, 0:35
0
voti
Penso ti possa essere di aiuto questo tutorial:
http://www.settorezero.com/wordpress/corso-programmazione-picmicro-in-c-lezione-5-timer0-e-prescaler-come-si-impostano-per-generare-interrupt-nei-tempi-che-vogliamo-applicazione-pratica/
Ciao,
Dario
http://www.settorezero.com/wordpress/corso-programmazione-picmicro-in-c-lezione-5-timer0-e-prescaler-come-si-impostano-per-generare-interrupt-nei-tempi-che-vogliamo-applicazione-pratica/
Ciao,
Dario
⋮ƎlectroYou e non smetti mai di imparare!
1
voti
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
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
0
voti
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?
(Ovviamente ho dichiarato solo le variabili che servono per fare l'esempio)
- 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)
-

carlomusumeci
353 5 7 - Sostenitore

- Messaggi: 526
- Iscritto il: 8 apr 2011, 0:35
0
voti
Personalmente farei qualche cosa che assomiglia a quanto proposto da
IsidoroKZ 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.
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
0
voti
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
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
0
voti
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.
Inteso come tempo che il micro impiega per "fermarsi" e richiamare la routine di interrupt.
Fabio
0
voti
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
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!
Torna a Firmware e programmazione
Chi c’è in linea
Visitano il forum: Nessuno e 31 ospiti

Elettrotecnica e non solo (admin)
Un gatto tra gli elettroni (IsidoroKZ)
Esperienza e simulazioni (g.schgor)
Moleskine di un idraulico (RenzoDF)
Il Blog di ElectroYou (webmaster)
Idee microcontrollate (TardoFreak)
PICcoli grandi PICMicro (Paolino)
Il blog elettrico di carloc (carloc)
DirtEYblooog (dirtydeeds)
Di tutto... un po' (jordan20)
AK47 (lillo)
Esperienze elettroniche (marco438)
Telecomunicazioni musicali (clavicordo)
Automazione ed Elettronica (gustavo)
Direttive per la sicurezza (ErnestoCappelletti)
EYnfo dall'Alaska (mir)
Apriamo il quadro! (attilio)
H7-25 (asdf)
Passione Elettrica (massimob)
Elettroni a spasso (guidob)
Bloguerra (guerra)



