- Messaggi: 137
- Ringraziamenti ricevuti 3
funzione delay
- paolotherocker
- Autore della discussione
- Visitatori
-
12 Anni 11 Mesi fa #1
da paolotherocker
funzione delay è stato creato da paolotherocker
salve a tutti!
nella libreria laurtec è compresa una funzione che genera un delay pari ai millisecondi passati. Avrei bisogno di comprendere la logica di funzionamento di tale funzione, perché ho necessità di crearne una che genera un delay del numero di microsecondi passati. Lo so che si tratta di una funzione molto semplice però non riesco a capire se è dovuta ad un ragionamento empirico (cioè vedere il ciclo for quante istruzioni copre) oppure ad un ragionamento basato su clock o altro.
nella libreria laurtec è compresa una funzione che genera un delay pari ai millisecondi passati. Avrei bisogno di comprendere la logica di funzionamento di tale funzione, perché ho necessità di crearne una che genera un delay del numero di microsecondi passati. Lo so che si tratta di una funzione molto semplice però non riesco a capire se è dovuta ad un ragionamento empirico (cioè vedere il ciclo for quante istruzioni copre) oppure ad un ragionamento basato su clock o altro.
Code:
void delay_ms (int value) {
unsigned int reference = 0;
unsigned int mainDelay;
unsigned int subDelay;
reference = value * delay_quartz_frequency_value;
for (mainDelay = 0; mainDelay < reference; mainDelay++) {
for (subDelay = 0; subDelay < 12; subDelay++);
}
}
Si prega Accesso o Crea un account a partecipare alla conversazione.
- Akuryu
-
- Premium Utente
-
Less
Di più
12 Anni 11 Mesi fa #2
da Akuryu
Risposta da Akuryu al topic Re: funzione delay
Allora vediamo se riesco ad esserti utile
Allora nome della funzione che pretende un valore, fino a quitutto chiaro, poi crea delle variabili di funzione che chiama reference mainDelay e SubDelay
reference assume il valore che riguarda la frequenza del quarzo, se consideri che nella freedom abbiamo di base un quarzo da 20000 hrz. avremo un referenz di 20000 agni microsecondo
qui avviene la magia, per ogni 12 cicli del subdelay maindelay aumenta di 1. fino ad arrivare ai 20000 per microsecondo, quindi da questo calcolo abbiamo che
12 * 20000 = 240000, passati i quali in teoria è passato un micro secondo. spero di aver spiegato al meglio la cosa.
Code:
void delay_ms (int value) {
unsigned int reference = 0;
unsigned int mainDelay;
unsigned int subDelay;
Allora nome della funzione che pretende un valore, fino a quitutto chiaro, poi crea delle variabili di funzione che chiama reference mainDelay e SubDelay
Code:
reference = value * delay_quartz_frequency_value;
reference assume il valore che riguarda la frequenza del quarzo, se consideri che nella freedom abbiamo di base un quarzo da 20000 hrz. avremo un referenz di 20000 agni microsecondo
Code:
for (mainDelay = 0; mainDelay < reference; mainDelay++) {
for (subDelay = 0; subDelay < 12; subDelay++);
}
}
qui avviene la magia, per ogni 12 cicli del subdelay maindelay aumenta di 1. fino ad arrivare ai 20000 per microsecondo, quindi da questo calcolo abbiamo che
12 * 20000 = 240000, passati i quali in teoria è passato un micro secondo. spero di aver spiegato al meglio la cosa.
Si prega Accesso o Crea un account a partecipare alla conversazione.
- paolotherocker
- Autore della discussione
- Visitatori
-
12 Anni 11 Mesi fa #3
da paolotherocker
quindi sarà passato un microsecondo ogni 5 istruzioni.
Risposta da paolotherocker al topic Re: funzione delay
scusami ma il quarzo è da 20MHz, che sono 20,000,000 non 20,000. Poi quella variabile è utilizzata come valore in MHz. Inoltre il pic in realtà non lavora a 20MHz ma a 5MHz, perché per ogni istruzione ha bisogno di 4 colpi di clock:reference assume il valore che riguarda la frequenza del quarzo, se consideri che nella freedom abbiamo di base un quarzo da 20000 hrz. avremo un referenz di 20000 agni microsecondo
quindi sarà passato un microsecondo ogni 5 istruzioni.
Si prega Accesso o Crea un account a partecipare alla conversazione.
- Pinna
-
- Moderatore
-
Less
Di più
- Messaggi: 1010
- Ringraziamenti ricevuti 107
12 Anni 11 Mesi fa - 12 Anni 11 Mesi fa #4
da Pinna
Chi vola vale, chi vale vola, chi non vola è un vile
Risposta da Pinna al topic Re: funzione delay
Provo a rispondere io, in base all'analisi temporale (pag. 84 C18 step by step) che ho fatto:
i dodici cicli della variabile subDelay servono a raggiungere un valore teorico di 50 usec. Ricordando che il periodo del clock utilizzato è uguale a:
1 sec / 20000000 Hz =0.05 usec
la stessa formula può essere scritta anche come:
((1000 msec /20000000 Hz).
Dividendo tutto per 1000, per semplificare i calcoli si ha:
1 msec/20000 KHz è uguale a 0,00005 msec, cioè 0.05 usec
1 msec = 20000 KHz *0.00005 msec che scrvo, sempre per semplificare i calcoli,:
1 msec = 20 MHz * 0.05 msec = 20 * 50 usec (quelli trovati con l'analisi temporale)
Da qui il calcolo finale: msec * 20 MHz * 50 usec, che è la risultante di semplificazioni matematiche
Ovviamente, la misura del secondo, preso come unità di misura, si discosta leggermente: ho infatti misurato un valore reale di 1.016 sec., questo perchè è difficile avere 50 usec esatti per via di vari parametri.
Ne approffitto per augurare una Buona Pasqua a voi e famiglia
@ Mauro: se ho detto grosse corbellerie, correggimi qui, su questo forum e mettimi pure alla berlina
i dodici cicli della variabile subDelay servono a raggiungere un valore teorico di 50 usec. Ricordando che il periodo del clock utilizzato è uguale a:
1 sec / 20000000 Hz =0.05 usec
la stessa formula può essere scritta anche come:
((1000 msec /20000000 Hz).
Dividendo tutto per 1000, per semplificare i calcoli si ha:
1 msec/20000 KHz è uguale a 0,00005 msec, cioè 0.05 usec
1 msec = 20000 KHz *0.00005 msec che scrvo, sempre per semplificare i calcoli,:
1 msec = 20 MHz * 0.05 msec = 20 * 50 usec (quelli trovati con l'analisi temporale)
Da qui il calcolo finale: msec * 20 MHz * 50 usec, che è la risultante di semplificazioni matematiche
Ovviamente, la misura del secondo, preso come unità di misura, si discosta leggermente: ho infatti misurato un valore reale di 1.016 sec., questo perchè è difficile avere 50 usec esatti per via di vari parametri.
Ne approffitto per augurare una Buona Pasqua a voi e famiglia
@ Mauro: se ho detto grosse corbellerie, correggimi qui, su questo forum e mettimi pure alla berlina
Chi vola vale, chi vale vola, chi non vola è un vile
Ultima Modifica 12 Anni 11 Mesi fa da Pinna.
Si prega Accesso o Crea un account a partecipare alla conversazione.
- paolotherocker
- Autore della discussione
- Visitatori
-
12 Anni 11 Mesi fa #5
da paolotherocker
Risposta da paolotherocker al topic Re: funzione delay
grazie per l'aiuto
Si prega Accesso o Crea un account a partecipare alla conversazione.
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.
Forum - Ultimi messaggi
-
- Watchdog
- da FABRIZIO
-
- Timer0 e interrupt
- da marcoilgrande
-
- Strana anomalia LT lib module_EEPROM
- da marcoilgrande
-
- Nuova versione Kicad 9
- da Mauro Laurenti
-
- MODULO GSM SIM900A
- da embedded