Diferencia entre revisiones de «millis()»
De ArduWiki
(→Retornos) |
(→Comentario) |
||
Línea 15: | Línea 15: | ||
== Comentario == | == Comentario == | ||
Se puede resetear el temporisador de millis() ? | Se puede resetear el temporisador de millis() ? | ||
+ | |||
+ | <syntaxhighlight lang="c++"> | ||
+ | extern volatile unsigned long timer0_millis; | ||
+ | unsigned long nuevo_valor = 0; | ||
+ | |||
+ | void setup(){ | ||
+ | //Algo | ||
+ | } | ||
+ | |||
+ | void loop(){ | ||
+ | //Algo | ||
+ | //-------- | ||
+ | |||
+ | //Change Millis | ||
+ | setMillis(nuevo_valor); | ||
+ | } | ||
+ | |||
+ | void setMillis(unsigned long nuevo_valor){ | ||
+ | uint8_t oldSREG = SREG; | ||
+ | cli(); | ||
+ | timer0_millis = nuevo_valor; | ||
+ | SREG = oldSREG; | ||
+ | } | ||
+ | </syntaxhighlight> | ||
== Advertencias == | == Advertencias == |
Revisión del 16:13 27 feb 2019
Contenido
Descripción
Devuelve el número de milisegundos desde que la placa Arduino empezó a ejecutar el programa actual. Este número se desbordará (volverá a cero), después de aproximadamente 50 días.
Sintaxis
millis();
Parámetros
Nada.
Retornos
Número de milisegundos desde que el programa se inició. Numero tipo unsigned long.
Comentario
Se puede resetear el temporisador de millis() ?
extern volatile unsigned long timer0_millis;
unsigned long nuevo_valor = 0;
void setup(){
//Algo
}
void loop(){
//Algo
//--------
//Change Millis
setMillis(nuevo_valor);
}
void setMillis(unsigned long nuevo_valor){
uint8_t oldSREG = SREG;
cli();
timer0_millis = nuevo_valor;
SREG = oldSREG;
}
Advertencias
- Tenga en cuenta el tipo de valor que retorno millis() es unsigned long y pueden producirse errores lógicos si hacer operaciones aritméticas con otros tipos de datos más pequeños como: byte o int, incluso los long con signo pueden producir errores de calculo.
- millis() funciona mediante una interrupción (la misma de micros()); por lo tanto, su valor dejará de incrementar durante una rutina de servicio de interrupción (ej.: posterior a attachInterrupt()), o mientras no se llame a interrupts() después de llamar a noInterrupts().
Ejemplo
unsigned long hora=0; //Es muy importante respetar el tipo de dato void setup() { pinMode(13, OUTPUT); } void loop() { if (milis() - hora >= 500){ hora = millis(); //Guarda a hora de cada cambio digitalWrite(13, !digitalRead(13)); //Invierte valor del pin } }