home | area personale         schemi | tutorial | robotica | pic micro | recensioni         forum | chat irc         faq | contatti         store
username
password
cerca

 
FORUM: Pic Micro
Tutto quanto riguarda questi microprocessori... progetti, suggerimenti, aiuti, discussioni...ecc


scadenze temporali in c
     
Autore Messaggio opzioni
registrazionilollo





postato il:
08.03.2010, alle ore 20:02
scadenze temporali in c 

Ciao a tutti. Sono nuovo nel mondo della programmazione e vorrei porvi una semplice domanda:
In c è possibile impostare delle scadenze temporali?
Ovvero: posso impostare che, se entro un certo tempo si verifica un evento (es. una entrata passa a livello alto), viene incrementeta una variabile (o qualunque altra istruzione)?

Semplice esempio per farvi capire meglio:
pressione pulsante su RA0
se entro 200 ms premo anche il pulsante su RA1, si accende un led su RB0.

Grazie a tutti quelli che risponderanno ed anche a quelli che hanno avuto la pazienza di ascoltare.
registrazionilollo
harpefalcata





postato il:
08.03.2010, alle ore 22:16
Certo che si può fare, ma io programmo in assembler, e quindi in C non ho idea di come si faccia, ma tranquillo, è una cosa possibilissima


Credendo Vites
zuperone




una ogni 10 livelli


postato il:
08.03.2010, alle ore 22:35
Certo che si può fare... ci mancherebbe altro.:)
Può essere implementato in qualunque linguaggio e semplicemente si può fare come segue:
- premo RA0 --> dopo antirimbalzo azzero variabile contatore
- con l'interrupt incremento contatore
- se premo RA1 --> dopo antirimbalzo --> accendo RB0
- se contatore raggiunge valore limite (200 ms) si blocca routine tornando all'inizio o uscendo

Il concetto è creare un ciclo dove si inizia con un contatore settato a zero, incrementarlo ad ogni intervallo di tempo (con l'interrupt) e controllare ciclicamente il suo valore e il pulsante RA1. Se il valore del contatore supera il limite si esce altrimenti se RA1 è premuto si esegue l'alternativa.

Claudio

registrazionilollo





postato il:
08.03.2010, alle ore 22:42
grazie per le risposte.
ora capisco perchè non riusivo a trovare il modo... Mi ero intestardito che si potesse fare senza interrupt...
harpefalcata





postato il:
09.03.2010, alle ore 09:48
registrazionilollo:
grazie per le risposte.
ora capisco perchè non riusivo a trovare il modo... Mi ero intestardito che si potesse fare senza interrupt...


Ed inftti si può, senza nulla togliere alla soluzione del nostro amico zuperone, è sempre meglio evitare gli interrupt quando possibile, una soluzione in polling è sempre da preferire, semplicemente alla pressione del primo tasto oltre ad avviare il timer per contare i 200 mS setto anche un bit di una variabile di flag, scaduti i 200 mS controllo se il secondo pulsante è stato premuto e simultanemente se il bit di flag che indica la pressione del primo pulsante è sempre settato, nel caso di verifica di entrambe le condizioni, allora attivo il carico.




Credendo Vites
mgurudc




una ogni 10 livelli


postato il:
09.03.2010, alle ore 14:50
Non conosco il µC, ma in C farei così (trattando RA0-1 come variabili booleane):

#include <time.h>
...
double a, b;
...
if(RA0) {
    b = a = (double)clock / (double)CLOCKS_PER_SEC;
    while(b - a <= 0.2 && RA1 == 0) {
        b = (double)clock() / (double)CLOCKS_PER_SEC;
        }
    if(RA1 ==  1) {
        //operazioni da fare...
        }
    }
 

Ciao



Linux User #503422
registrazionilollo





postato il:
09.03.2010, alle ore 21:01
Grazie ragazzi, fantastici come al solito!
Grazie in particolare a mgurudc, è proprio quello che cercavo!
Alla prossima (ho il sospetto che non passerà molto tempo!)
zuperone




una ogni 10 livelli


postato il:
09.03.2010, alle ore 22:14
Come spesso succede... c'è sempre da imparare ...:))

Penso però che senza usare l'interrupt, il programma si ferma lì ad aspettare la condizione necessaria ad uscire e proseguire. Certo, dipende dal tempo di attesa, se si tratta di 200 ms va bene, ma se si trattasse di 10 secondi? o giù di lì? Senza interrupt si può fare?

Ciao a tutti

Claudio
harpefalcata





postato il:
10.03.2010, alle ore 09:47
zuperone:
Come spesso succede... c'è sempre da imparare ...:))

Penso però che senza usare l'interrupt, il programma si ferma lì ad aspettare la condizione necessaria ad uscire e proseguire. Certo, dipende dal tempo di attesa, se si tratta di 200 ms va bene, ma se si trattasse di 10 secondi? o giù di lì? Senza interrupt si può fare?

Ciao a tutti

Claudio


Certo che si può, ma in questo secondo caso sarebbero le specifiche del problema ad essere strane, non riesco a concepire alcuna situazione per cui si renda necessario tenere premuto un pulsante dieci secondi prima di premerne un secondo.




Credendo Vites
zuperone




una ogni 10 livelli


postato il:
10.03.2010, alle ore 18:39
No non intendevo che bisogna tenere premuto un pulsante.
Faccio un esempio:
voglio controllare lo spegnimento di un LCD o di un qualsiasi altro tipo di intervento se dopo 10 secondi non ci sono interventi da parte di un operatore.
Ecco, in questo caso vedo difficile implementare la cosa senza l'interrupt.
Mi sbaglio?

Claudio


Come utente anonimo puoi leggere il contenuto di questo forum ma per aprire una discussione
o per partecipare ad una discussione esistente devi essere registrato ed accedere al sito




 




 
 
indietro | homepage | torna su copyright © 2004/2010 GRIX.IT - la community dell'elettronica amatoriale