- Messaggi: 40
- Ringraziamenti ricevuti 0
Timer ma con tempi lunghi
8 Anni 7 Mesi fa #1
da MauroFx
Timer ma con tempi lunghi è stato creato da MauroFx
Sono rimasto un pò deluso. Pensavo che col PIC si potessero raggiungere ritardi molto più lunghi.
Riferendomi al codice, se non fosse pregiudizievole utilizzare il metodo waste-time, potremmo raggiungere qualsiasi ritardo, ma di solito non è possibile "bloccare" il programma fino al raggiungimento del tempo prefissato.
In alternativa, i vari timer controllabili con le interrupt, consentono di raggiungere ritardi entro il secondo.
Ma come è possibile ottenere ritardi nell'ordine dei secondi, o dei minuti, senza "impallare" il programma ?
Per il momento ho potuto solo sfruttare il caricamento di un condensatore esterno tramite un resistore, alimentato da una uscita del PIC, rilevando la soglia di tensione tramite un ingresso con interrupt.
Questo sistema, però, è più da elettronica con porte logiche.
Ci sono altri sistemi per ottenere tempi lunghi ?
Riferendomi al codice, se non fosse pregiudizievole utilizzare il metodo waste-time, potremmo raggiungere qualsiasi ritardo, ma di solito non è possibile "bloccare" il programma fino al raggiungimento del tempo prefissato.
In alternativa, i vari timer controllabili con le interrupt, consentono di raggiungere ritardi entro il secondo.
Ma come è possibile ottenere ritardi nell'ordine dei secondi, o dei minuti, senza "impallare" il programma ?
Per il momento ho potuto solo sfruttare il caricamento di un condensatore esterno tramite un resistore, alimentato da una uscita del PIC, rilevando la soglia di tensione tramite un ingresso con interrupt.
Questo sistema, però, è più da elettronica con porte logiche.
Ci sono altri sistemi per ottenere tempi lunghi ?
Si prega Accedi o Crea un account a partecipare alla conversazione.
- MauroFx
- Autore della discussione
- Senior Member
Riduci
Di più
8 Anni 7 Mesi fa - 8 Anni 7 Mesi fa #2
da permax1958
Risposta da permax1958 al topic Timer ma con tempi lunghi
Ti sei risposto da solo:
Se con i vari timer settando opportunatamente il prescaler arrivi ad avere un interrupt ogni secondo non ti resta che inserire una o due variabili, che fungono da contatore, all'interno della routine di gestione dell interrupt, in una ora ci sono 3600 secondi, in un giorno ci sono 24 ore, in una settimana ci sono 7 giorni e così via, in questo modo puoi ottenere dei ritardi di anni senza impallare il Micro in quanto l'incremento dei contatori avviene solo con l'interrupt una volta al secondo
Se con i vari timer settando opportunatamente il prescaler arrivi ad avere un interrupt ogni secondo non ti resta che inserire una o due variabili, che fungono da contatore, all'interno della routine di gestione dell interrupt, in una ora ci sono 3600 secondi, in un giorno ci sono 24 ore, in una settimana ci sono 7 giorni e così via, in questo modo puoi ottenere dei ritardi di anni senza impallare il Micro in quanto l'incremento dei contatori avviene solo con l'interrupt una volta al secondo
Ultima Modifica 8 Anni 7 Mesi fa da permax1958.
Si prega Accedi o Crea un account a partecipare alla conversazione.
- permax1958
- Premium Member
Riduci
Di più
- Messaggi: 91
- Ringraziamenti ricevuti 16
8 Anni 7 Mesi fa - 8 Anni 7 Mesi fa #3
da Mauro Laurenti
Risposta da Mauro Laurenti al topic Timer ma con tempi lunghi
Effettivamente facendo uso degli interrupt il programma principale non viene disturbato molto.
Facendo uso dell'oscillatore secondario da 32KHz puoi avere dei ritardi dell'ordine del secondo per cui hai interrupt piuttosto rari.
Incrementi dei contatori/variabili per ottenere dei ritardi maggiori...
Ci sono microcontrollori con RTC (Real Time Calendar) incorporato.
Nel qual caso hai un vero orologio e puoi impostare la sveglia...quindi hai i ritardi che vuoi, di ore o giorni, senza l'intervento della CPU.
Su Freedom II faccio uso dei RTC esterno, ma la cosa è analoga nel caso in cui usi una MCU con RTC interno.
Saluti,
Mauro
Facendo uso dell'oscillatore secondario da 32KHz puoi avere dei ritardi dell'ordine del secondo per cui hai interrupt piuttosto rari.
Incrementi dei contatori/variabili per ottenere dei ritardi maggiori...
Ci sono microcontrollori con RTC (Real Time Calendar) incorporato.
Nel qual caso hai un vero orologio e puoi impostare la sveglia...quindi hai i ritardi che vuoi, di ore o giorni, senza l'intervento della CPU.
Su Freedom II faccio uso dei RTC esterno, ma la cosa è analoga nel caso in cui usi una MCU con RTC interno.
Saluti,
Mauro
Ultima Modifica 8 Anni 7 Mesi fa da Mauro Laurenti.
Si prega Accedi o Crea un account a partecipare alla conversazione.
8 Anni 7 Mesi fa - 8 Anni 7 Mesi fa #4
da MauroFx
Risposta da MauroFx al topic Timer ma con tempi lunghi
Grazie Max, grazie Mauro.
Capisco che i timer interni sono più comodi del metodo con rc esterni, anche solo per il fatto quest'ultimi occupano un ingresso in più per ogni temporizzazione.
Se non ho capito male, se non faccio uso di RCT, è consigliabile partire da una frequenza minore possibile, quale quella interna a 32kHz, usare il massimmo prescaler e intercettare l'overflow del conteggio come interrupt.
Meglio se provochiamo l'overflow a tempi più lunghi possibile, ma senza troppi decimali, così da incrementare apposite varibili int-long e ripetere il ciclo per n-volte, pari al rapporto tra il tempo voluto e quello di overflow.
Come al solito, io e la lingua inglese abbiamo litigato da piccoli. Mi sarebbe utile un frammento di codice di esempio per capire meglio. Andrebbe bene sia per 16f che per 18f-compatibile.
Altra cosa che devo capire è come posso utilizzare contemporaneamente gli altri time2,3, 4, e se l'overflow è intercettato come evento per il risveglio da SLEEP, oppure solo come interrupt.
Inoltre, timer0 può essere utilizzato per pilotare timer1 in castata ?
L'esigenza di usare contemporaneamente più timer deriva dall'avere contemporaneamente più uscite da temporizzare. Lo so, qui si vede la mia umile origine elettronica, ma ho tanta roba da convertire.
Se non dispongo più di 8 bit nel prescaler, potrei ottenere 32000/160, ottenendo 0,02 secondi come base-time, e quando arrivo a 36000 sono 180 secondi. Forse, per non indurmi in errori, potrei utilizzare 2 funzioni annidate, di cui la prima mi crea la basetime di 1ms, per poi proseguire con la seconda, da utilizzare come con la funzione interna _Delay_ms(), ma non in waste-time
La strada è questa, ma mi occorre un passaggio per non farmela tutta a pedi !
Capisco che i timer interni sono più comodi del metodo con rc esterni, anche solo per il fatto quest'ultimi occupano un ingresso in più per ogni temporizzazione.
Se non ho capito male, se non faccio uso di RCT, è consigliabile partire da una frequenza minore possibile, quale quella interna a 32kHz, usare il massimmo prescaler e intercettare l'overflow del conteggio come interrupt.
Meglio se provochiamo l'overflow a tempi più lunghi possibile, ma senza troppi decimali, così da incrementare apposite varibili int-long e ripetere il ciclo per n-volte, pari al rapporto tra il tempo voluto e quello di overflow.
Come al solito, io e la lingua inglese abbiamo litigato da piccoli. Mi sarebbe utile un frammento di codice di esempio per capire meglio. Andrebbe bene sia per 16f che per 18f-compatibile.
Altra cosa che devo capire è come posso utilizzare contemporaneamente gli altri time2,3, 4, e se l'overflow è intercettato come evento per il risveglio da SLEEP, oppure solo come interrupt.
Inoltre, timer0 può essere utilizzato per pilotare timer1 in castata ?
L'esigenza di usare contemporaneamente più timer deriva dall'avere contemporaneamente più uscite da temporizzare. Lo so, qui si vede la mia umile origine elettronica, ma ho tanta roba da convertire.
Se non dispongo più di 8 bit nel prescaler, potrei ottenere 32000/160, ottenendo 0,02 secondi come base-time, e quando arrivo a 36000 sono 180 secondi. Forse, per non indurmi in errori, potrei utilizzare 2 funzioni annidate, di cui la prima mi crea la basetime di 1ms, per poi proseguire con la seconda, da utilizzare come con la funzione interna _Delay_ms(), ma non in waste-time
La strada è questa, ma mi occorre un passaggio per non farmela tutta a pedi !
Ultima Modifica 8 Anni 7 Mesi fa da MauroFx.
Si prega Accedi o Crea un account a partecipare alla conversazione.
- MauroFx
- Autore della discussione
- Senior Member
Riduci
Di più
- Messaggi: 40
- Ringraziamenti ricevuti 0
8 Anni 6 Mesi fa - 8 Anni 6 Mesi fa #5
da permax1958
Risposta da permax1958 al topic Timer ma con tempi lunghi
Guarda che stai facendo una grandissima confusione, devi dare delle indicazioni precise su quale pic vuoi utilizzare, quale ritardo ti interessa, quali esigenze particolari hai, di pic ne esistono tantissimi, ci sono quelli con l'oscillatore interno a 32KHz e quelli no ci sono quelli a cui bisogna aggiungere un oscillatore esterno ci sono quelli con prescaler a 8bit, a 4 bit, e a 2 bit ci sono quelli con contatore del timer a 8 bit e quelli a 16bit.
Non si può spiegare l'architettura di tutti i pic in un post del forum al massimo si possono dare consigli, fare qualche esempio e risolvere qualche problema ma su richieste ben precise, ti consiglio prima di tutto di leggerti il libro di Mauro "XC8 STEP BY STEP" che trovi come pdf in questo sito, oltre a dare le basi per la programmazione in ambiente MplabX spiega l'architettura dei pic, è fatto molto bene ed è in italiano.
Intanto ti spiego come funziona un timer:
un timer ha una base dei tempi, data da una frequenza di oscillazione che viene selezionata settando i bits del registro dedicato e divisa dal prescaler, con la quale incrementa ad ogni clock un contatore interno che arriva a 256 nel caso di contatore a 8bit o a 65536 nel caso di contatore a 16bit, una volta raggiunto il valore massimo il contatore viene azzerato e se abilitato il timer genera un interrupt e setta il bit flag dedicato, volendo ottenere il ritardo voluto oltre a settare opportunatamente il prescaler si deve far partire il contatore da un valore prefissato invece di 0 e questo lo si fa nella funzione di interrupt caricando il registro del timer con il valore prefissato così il conteggio del timer parte da quel valore e non da 0 e si raggiunge l'overflow prima.
Ora un esempio usando il pic 18F4550 con quarzo da 20MHz ed il Timer0 che ha un prescaler a 8bit (rapporto da 1:1 a 1:256) e un contatore a 16bit (65536) e selezionando come sorgente di clock FOSC/4.
Calcoliamo il ritardo massimo che si può ottenere solo col timer senza usare variabili all'interno della funzione di interrupt per espandere il ritardo:
la base dei tempi è data da 1/(FOSC/4/prescaler) cioè 1/(20000000/4/256) = 0,0000512s cioè 51,2 μs, quindi ogni 51,2 μs il contatore interno del timer0 viene incrementato di una unità e dopo 65536 conteggi il contatore viene azzerato e generato un'interrupt così il ritardo massimo è dato da 0,0000512 * 65536 = 3,35s.
Per modificare il ritardo e adattarlo alle nostre esigenze dovremo agire sul fattore di divisione del prescaler e sul numero di conteggi, ora proviamo a lasciare il prescaler settato a 1:256 e modifichiamo il numero di conteggi caricando il contatore del timer0 ad ogni interrupt con il valore 46004 in questo modo dopo 65536 - 46004 = 19532 conteggi si ha il passaggio per lo 0 (overflow) la generazione dell'interrupt e il caricamento del contatore nuovanente con 46004 così avremo un interrupt ogni 0,0000512 * 19532 = 1,000s.
Per i dettagli e le formule ti rimando alla lettura del libro sopracitato.
Non si può spiegare l'architettura di tutti i pic in un post del forum al massimo si possono dare consigli, fare qualche esempio e risolvere qualche problema ma su richieste ben precise, ti consiglio prima di tutto di leggerti il libro di Mauro "XC8 STEP BY STEP" che trovi come pdf in questo sito, oltre a dare le basi per la programmazione in ambiente MplabX spiega l'architettura dei pic, è fatto molto bene ed è in italiano.
Intanto ti spiego come funziona un timer:
un timer ha una base dei tempi, data da una frequenza di oscillazione che viene selezionata settando i bits del registro dedicato e divisa dal prescaler, con la quale incrementa ad ogni clock un contatore interno che arriva a 256 nel caso di contatore a 8bit o a 65536 nel caso di contatore a 16bit, una volta raggiunto il valore massimo il contatore viene azzerato e se abilitato il timer genera un interrupt e setta il bit flag dedicato, volendo ottenere il ritardo voluto oltre a settare opportunatamente il prescaler si deve far partire il contatore da un valore prefissato invece di 0 e questo lo si fa nella funzione di interrupt caricando il registro del timer con il valore prefissato così il conteggio del timer parte da quel valore e non da 0 e si raggiunge l'overflow prima.
Ora un esempio usando il pic 18F4550 con quarzo da 20MHz ed il Timer0 che ha un prescaler a 8bit (rapporto da 1:1 a 1:256) e un contatore a 16bit (65536) e selezionando come sorgente di clock FOSC/4.
Calcoliamo il ritardo massimo che si può ottenere solo col timer senza usare variabili all'interno della funzione di interrupt per espandere il ritardo:
la base dei tempi è data da 1/(FOSC/4/prescaler) cioè 1/(20000000/4/256) = 0,0000512s cioè 51,2 μs, quindi ogni 51,2 μs il contatore interno del timer0 viene incrementato di una unità e dopo 65536 conteggi il contatore viene azzerato e generato un'interrupt così il ritardo massimo è dato da 0,0000512 * 65536 = 3,35s.
Per modificare il ritardo e adattarlo alle nostre esigenze dovremo agire sul fattore di divisione del prescaler e sul numero di conteggi, ora proviamo a lasciare il prescaler settato a 1:256 e modifichiamo il numero di conteggi caricando il contatore del timer0 ad ogni interrupt con il valore 46004 in questo modo dopo 65536 - 46004 = 19532 conteggi si ha il passaggio per lo 0 (overflow) la generazione dell'interrupt e il caricamento del contatore nuovanente con 46004 così avremo un interrupt ogni 0,0000512 * 19532 = 1,000s.
Per i dettagli e le formule ti rimando alla lettura del libro sopracitato.
Ultima Modifica 8 Anni 6 Mesi fa da permax1958.
Si prega Accedi o Crea un account a partecipare alla conversazione.
- permax1958
- Premium Member
Riduci
Di più
- Messaggi: 91
- Ringraziamenti ricevuti 16
Moderatori: Mauro Laurenti, Pinna, StefA, Matteo Garia
Registrati al sito
Accedi a tutte le risorse e articoli non visibili pubblicamente, puoi registrarti con pochi passi.