Go Down

Topic: funzione millis() (Read 4195 times) previous topic - next topic

valvale97

May 01, 2012, 10:14 pm Last Edit: May 02, 2012, 09:33 pm by valvale97 Reason: 1
Salve,
se volessi sfruttare l'arduino come timer che si attiva quando premo un pulsante e si disattiva quando un sensore riceve un certo segnale come potrei fare ?
intendo dal punto di vista di programmazione.
Grazie.
Valerio.

leo72

Metti nel loop una lettura continua del pulsante.
Nel momento in cui il pulsante viene chiamato, lanci una routine che legge il sensore finché non ricevi il dato.

Usa i while per creare dei cicli da cui esci solo al verificarsi di una certa condizione.

uwefed


Salve,
se volessi sfruttare l'arduino come timer che si attiva quando premo un pulsante e si disattiva quando un sensore riceve un certo segnale come potrei fare ?
intendo dal punto di vista di programmazione.
Grazie.
Valerio.


Sei molto criptico. Non capisco cosa fa un timer se lo fai partire e viene spento da un evento esterno.

Ciao Uwe

pablos

Quote
Sei molto criptico. Non capisco cosa fa un timer se lo fai partire e viene spento da un evento esterno.

Probabilmente vuol fare un fotofinish :) Insomma, molto probabile che vuole misurare un tempo dallo START manuale a uno STOP di qualche sensore.

ciao
no comment

valvale97


Quote
Sei molto criptico. Non capisco cosa fa un timer se lo fai partire e viene spento da un evento esterno.

Probabilmente vuol fare un fotofinish :) Insomma, molto probabile che vuole misurare un tempo dallo START manuale a uno STOP di qualche sensore.

ciao

@pablos
dindindin abbiamo un vincitore

valvale97

ma la funzione delay(xxx); influenza la funzione millis(); ?

PaoloP

La funzione millis non è influenzata dal delay, ma durante l'esecuzione il codice rimane "bloccato" su quella riga per tot millisecondi.

lesto


ma la funzione delay(xxx); influenza la funzione millis(); ?

no, anzi direi che delay è figlia di millis()  :smiley-mr-green:
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

leo72

Mi spiace, ma delay si basa su micros()  ;)

Code: [Select]

void delay(unsigned long ms)
{
uint16_t start = (uint16_t)micros();

while (ms > 0) {
if (((uint16_t)micros() - start) >= 1000) {
ms--;
start += 1000;
}
}
}

valvale97

Ok,
ma se io assegno ad una variabile:
Code: [Select]

unsigned long time1= millis();

e poi alla fine del loop() metto un delay(xxxxx);
questo mi altera il valore di "time1" ?

leo72

Spetta un attimo.
Delay è un comando che istruisce la CPU del micro a fermarsi ed attendere che passi un certo lasso di tempo. Millis è una funzione che restituisce il numero di ms trascorsi dall'avvio del micro.

L'una non influenza l'altra ma entrambe dipendono da un contatore interno all'Atmega328, un contatore a 32 bit che tiene il conto dei millisecondi. E' lui che va in overflow, per la cronaca.

Tornando al tuo problema, quando sei ad esegure il tuo delay semplicemente non puoi fare altro per cui non puoi neanche controllare quanto tempo è trascorso leggendo millis.

valvale97

quindi ponendo che il delay è di 10ms mi ritroverò la variabile time1 con 10ms in più.
Giusto  ?

leo72

se il tuo programma è questo:

void loop() {
  unsigned long time1=millis();
  delay(10);
  .....CHECK....
}

Poniamo che il contatore interno sia a 0.
Al 1° avvio, time1=millis=0.
A "CHECK" millis sarà time1+millis ossia 10.

valvale97

ok , ho capito grazie dell'aiuto.
Valerio.

lesto


quindi ponendo che il delay è di 10ms mi ritroverò la variabile time1 con 10ms in più.
Giusto  ?

no, il valore restituito da millis() è una COPIA del timer in quell'istante. Se fosse un puntatore, allora non cambierebbe solo quando chiami delay, ma cambierebbe insieme ad ogni millisecondo :-)
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Go Up