Pages: [1] 2 3 ... 5   Go Down
Author Topic: funzione millis()  (Read 3851 times)
0 Members and 1 Guest are viewing this topic.
Bologna
Offline Offline
Sr. Member
****
Karma: 2
Posts: 454
La gente spesso definisce impossibili cose che semplicemente non ha mai visto. [Albert Einstein]
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
« Last Edit: May 02, 2012, 02:33:40 pm by valvale97 » Logged

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 333
Posts: 22973
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged


BZ (I)
Offline Offline
Brattain Member
*****
Karma: 271
Posts: 21879
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Genova
Offline Offline
Faraday Member
**
Karma: 40
Posts: 3433
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 smiley Insomma, molto probabile che vuole misurare un tempo dallo START manuale a uno STOP di qualche sensore.

ciao
Logged

no comment

Bologna
Offline Offline
Sr. Member
****
Karma: 2
Posts: 454
La gente spesso definisce impossibili cose che semplicemente non ha mai visto. [Albert Einstein]
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 smiley Insomma, molto probabile che vuole misurare un tempo dallo START manuale a uno STOP di qualche sensore.

ciao
@pablos
dindindin abbiamo un vincitore
Logged

Bologna
Offline Offline
Sr. Member
****
Karma: 2
Posts: 454
La gente spesso definisce impossibili cose che semplicemente non ha mai visto. [Albert Einstein]
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Cagliari, Italy
Offline Offline
Tesla Member
***
Karma: 114
Posts: 7210
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Code fast. Code easy. Codebender --> http://codebender.cc/?referrer=PaoloP

0
Offline Offline
Shannon Member
****
Karma: 132
Posts: 10502
:(){:|:&};:
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

ma la funzione delay(xxx); influenza la funzione millis(); ?
no, anzi direi che delay è figlia di millis()  smiley-mr-green
Logged

sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 333
Posts: 22973
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Mi spiace, ma delay si basa su micros()  smiley-wink

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

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


Bologna
Offline Offline
Sr. Member
****
Karma: 2
Posts: 454
La gente spesso definisce impossibili cose che semplicemente non ha mai visto. [Albert Einstein]
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ok,
ma se io assegno ad una variabile:
Code:
unsigned long time1= millis();
e poi alla fine del loop() metto un delay(xxxxx);
questo mi altera il valore di "time1" ?
Logged

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 333
Posts: 22973
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged


Bologna
Offline Offline
Sr. Member
****
Karma: 2
Posts: 454
La gente spesso definisce impossibili cose che semplicemente non ha mai visto. [Albert Einstein]
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 333
Posts: 22973
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged


Bologna
Offline Offline
Sr. Member
****
Karma: 2
Posts: 454
La gente spesso definisce impossibili cose che semplicemente non ha mai visto. [Albert Einstein]
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

ok , ho capito grazie dell'aiuto.
Valerio.
Logged

0
Offline Offline
Shannon Member
****
Karma: 132
Posts: 10502
:(){:|:&};:
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 :-)
Logged

sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Pages: [1] 2 3 ... 5   Go Up
Jump to: