Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

Gestire più delay indipendentemente

Tipologie, strumenti di sviluppo, hardware e progetti

Moderatore: Foto UtentePaolino

0
voti

[1] Gestire più delay indipendentemente

Messaggioda Foto UtenteTricka90 » 22 ago 2013, 17:28

Ho sempre usato la funzione di MikroC Delay_ms in tutte le sue forme per gestire, temporalmente, i vari eventi di un programma. Ora però mi chiedo se è possibile controllare, dal punto di vista del tempo, due o più eventi indipendentemente.
Faccio un esempio banale: se volessi mettere in ON e in OFF con una certa frequenza due distinte porte del PIC, ad esempio per far lampeggiare due LED con diversa frequenza, questo sarebbe possibile?
Certo, in questo caso potrei semplicemente usare due PWM con diversa frequenza, ma in generale, sarebbe possibile?
Ovviamente non potrei usare Delay_ms, esiste qualche altro modo?
Avatar utente
Foto UtenteTricka90
662 1 6 10
Expert
Expert
 
Messaggi: 627
Iscritto il: 1 lug 2013, 15:53

1
voti

[2] Re: Gestire più delay indipendentemente

Messaggioda Foto UtenteTardoFreak » 22 ago 2013, 17:42

Devi usare i timer o timers software tramite interrupt ciclica.
I ritardi "hard", nella realtà, non si usano praticamente mai se non per ritardi brevissimi.
"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,9k 8 12 13
-EY Legend-
-EY Legend-
 
Messaggi: 15754
Iscritto il: 16 dic 2009, 11:10
Località: Torino - 3° pianeta del Sistema Solare

1
voti

[3] Re: Gestire più delay indipendentemente

Messaggioda Foto Utentecyclone » 22 ago 2013, 20:20

@Tricka90,
come già ti hanno consigliato, qualsiasi micro utilizzi, l'unico modo per creare delay pseudo-indipendenti è quello di impiegare i timer presenti sul micro. Chiaramente dovrai abilitare e gstire l'interrupt che sarà scatenato dall'overflow del timer. Sull' handler dell' interrupt potrai incrementare una variabile, eseguire una comparazione con valori diversi e per ogni uguaglianza generare l'evento che ti interessa.

Buone vacanze
Avatar utente
Foto Utentecyclone
86 2
New entry
New entry
 
Messaggi: 64
Iscritto il: 6 feb 2012, 11:38

0
voti

[4] Re: Gestire più delay indipendentemente

Messaggioda Foto UtenteTricka90 » 23 ago 2013, 9:11

Grazie mille, adesso cerco bene informazioni su questi argomenti e su come applicare tutto in MikroC :D
Avatar utente
Foto UtenteTricka90
662 1 6 10
Expert
Expert
 
Messaggi: 627
Iscritto il: 1 lug 2013, 15:53

0
voti

[5] Re: Gestire più delay indipendentemente

Messaggioda Foto UtenteTricka90 » 23 ago 2013, 15:07

Sono riuscito a fare quello che mi avete consigliato! In particolare a far lampeggiare un LED ad una data velocità. Questa velocità la regolo in questo modo, non so se sia molto corretto:

Codice: Seleziona tutto

void interrupt() {
     if(INTCON.B2)
     {
                  i++;
                  if(i == 2)
                  {
                            PORTD.RD6 = ~PORTD.RD6;
                            i = 0;
                  }
     }
     INTCON.B2 = 0;
}


In pratica tramite la variabile 'i' regolo il numero di interrupt che devono accadere, quindi il tempo che deve trascorrere sottoforma di cicli di conteggio del TIMER0, prima che il LED inverta il suo stato.

Ma oltre il TIMER0 nel PIERIN PIC18 esistono davvero altri timer che possono generare un interrupt per overflow? perché sul datasheet, nel registro INTCON trovo solo il Flag relativo al timer0...

cyclone ha scritto:@Tricka90,
Sull' handler dell' interrupt potrai incrementare una variabile, eseguire una comparazione con valori diversi e per ogni uguaglianza generare l'evento che ti interessa.


Non ho ben capito questa frase, quale variabile mi stai consigliando di incrementare? E che comparazione? :oops:
Avatar utente
Foto UtenteTricka90
662 1 6 10
Expert
Expert
 
Messaggi: 627
Iscritto il: 1 lug 2013, 15:53

0
voti

[6] Re: Gestire più delay indipendentemente

Messaggioda Foto UtenteTricka90 » 23 ago 2013, 15:43

EDIT: Trovati i Flag di tutti gli altri Timer! :ok:
Avatar utente
Foto UtenteTricka90
662 1 6 10
Expert
Expert
 
Messaggi: 627
Iscritto il: 1 lug 2013, 15:53

0
voti

[7] Re: Gestire più delay indipendentemente

Messaggioda Foto UtenteShockwaver » 23 ago 2013, 17:14

Si riferisce a quello che tu hai implementato come
Codice: Seleziona tutto
i++;
if (i == 2)

Se hai altre temporizzazioni definisci altre variabili oltre a i da incrementare e le confronti con il numero che corrisponde alla relativa temporizzazione.

2 consigli:
Non so bene come si gestiscano le ISR in MikroC ma qui viene spiegato che è buona norma che queste non richiamino altre funzioni ma eseguano tutto il codice interessato al loro interno per evitare il Context Save. In MikroC potrebbe succedere qualcosa di similare, non so... Parliamo di ottimizzazione comunque.

Se non sei strozzato con le tolleranze per il tempo del lampeggio, visto che è anche buona norma stringere al massimo possibile il codice dentro le ISR, potresti incrementare i nella interrupt service routine ma il check lo fai nel loop principale..
O_/
Anyone who has never made a mistake has never tried anything new
Two things are infinite: universe and human stupidity, and I'm not sure about the former
You did not really understand something unless you can explain it to your grandmother
A. Einstein
Avatar utente
Foto UtenteShockwaver
770 1 5 11
Expert
Expert
 
Messaggi: 859
Iscritto il: 3 mar 2010, 18:56

0
voti

[8] Re: Gestire più delay indipendentemente

Messaggioda Foto UtenteTardoFreak » 23 ago 2013, 17:48

L' articolo che ho scritto sul programma di demo del PIERIN spiega bene come implementare le interrupt cicliche. Ti suggerisco di leggerli, in tutti i miei articoli implemento i timer software.
Li trovi nel mio blog.
Oppure nella sezione "articoli" del sito del PIERIN. Basta cliccare nella mia firma.
"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,9k 8 12 13
-EY Legend-
-EY Legend-
 
Messaggi: 15754
Iscritto il: 16 dic 2009, 11:10
Località: Torino - 3° pianeta del Sistema Solare

0
voti

[9] Re: Gestire più delay indipendentemente

Messaggioda Foto UtenteCandy » 24 ago 2013, 8:42

Genericamente si costruisce una base tempi precisa, veloce, dipende dai casi. Utilizzando uno dei timer che generano interrupt, un tick, che poi può essere di un millisecondo o più preciso. Fatto questo si battezza una variabile globale che incrementa di una unità ogni volta che scatta un tick. Nel formato internazionale TIME si usa un doppio intero come contatore di millisecondi, ma ha campi di applicazione specifici.
A questo punto, ad esempio io, ma vedo anche altrove, uso una funzione apposita di questo tipo:

Codice: Seleziona tutto
time msec(time from = 0)

time msec(time from)
{
  return tGtime - from;
}



dove tGtime è la variabile globale che conta i singoli tick.

A questo punto basta inserirla nel codice:
Codice: Seleziona tutto

time t1; // timer 1

...

t1 = msec(); // per inizializzarlo

...

if msec(t1) > 1000
{
  // dopo un secondo dall'inizializzazione...
}
Avatar utente
Foto UtenteCandy
32,5k 7 10 13
CRU - Account cancellato su Richiesta utente
 
Messaggi: 10123
Iscritto il: 14 giu 2010, 22:54

0
voti

[10] Re: Gestire più delay indipendentemente

Messaggioda Foto UtenteShockwaver » 24 ago 2013, 11:33

Mi accodo, anche se per evitare gli overhead di chiamata a funzioni, quando si tratta di una o due istruzioni, uso le macro, in questo caso sarebbe:
Codice: Seleziona tutto
#define msec(from) (tGtime - from)

O_/
Anyone who has never made a mistake has never tried anything new
Two things are infinite: universe and human stupidity, and I'm not sure about the former
You did not really understand something unless you can explain it to your grandmother
A. Einstein
Avatar utente
Foto UtenteShockwaver
770 1 5 11
Expert
Expert
 
Messaggi: 859
Iscritto il: 3 mar 2010, 18:56

Prossimo

Torna a Realizzazioni, interfacciamento e nozioni generali.

Chi c’è in linea

Visitano il forum: Nessuno e 11 ospiti