Go Down

Topic: Funcion millis() (Read 198 times) previous topic - next topic

jhespitia40

Buenas noches amigos

me gustaría saber si alguno de ustedes sabe como funciona internamente la función millis de antemano muchas gracias.

surbyte

#1
Feb 20, 2016, 07:06 pm Last Edit: Feb 20, 2016, 07:07 pm by surbyte
Claro. Es una función que se incrementa en 1 con cada milisegundo desde que energizas el arduino.
Esta presente en todos los arduinos.
También existe una funcion micros() que da los microsegundos desde que energizas el arduino.
millis() devuelve valores en unsigned long y su valor máximo es de 2^32-1=4294967295 = 49.7 dias

También es una función ampliamente documentada y no hace falta consultar porque una simple búsqueda en google te hubiera dado la misma respuesta que te he dado.
No lo tomes a mal pero hay que usar mas el navegador antes de preguntar.

jhespitia40

Gracias por contestar pero tal vez no me hice entender, me gustaria saber como opera internamente la funcion que tipo de timers utiliza para poder llevar la cuenta y si utiliza interrupciones para poder llevar la cuenta

noter

#3
Feb 22, 2016, 12:44 pm Last Edit: Feb 22, 2016, 12:45 pm by noter
Hola.
Millis utiliza el timer0, y tiene una interrupción para llevar la cuenta del número de desbordamientos de dicho timer. Cada vez que se produce un desbordamiento actualiza el número de millis y "el pico" o fracción que se va acumulando (el desbordamiento se produce cada 1024 µs):

Esto significa que de vez en cuando el pico alcanza las mil unidades y la interrupción suma dos milisegundos, en lugar de uno.

Lo que no recuerdo bien es si cuando se invoca la función millis se devuelve directamente el contador de millis, o se suma también el pico y la cuenta actual del timer0 para dar los millis exactos.

Esto es más o menos lo que recuerdo de una vez que tuve tu curiosidad y busqué las funciones entre las librerías del core, y es el cálculo para reloj de 16Mhz. Para otras frecuencias de reloj se establecen distintos valores de prescaler, pico, etc.

Pd. Tampoco es muy difícil encontrar información al respecto (en inglés, claro) a poco que busques en google. Ejemplo

surbyte

#4
Feb 22, 2016, 04:41 pm Last Edit: Feb 22, 2016, 04:42 pm by surbyte
Quote
También es una función ampliamente documentada y no hace falta consultar porque una simple búsqueda en google te hubiera dado la misma respuesta que te he dado.
Acá tu respuesta
Code: [Select]
SIGNAL(TIMER0_OVF_vect)
{
    // copy these to local variables so they can be stored in registers
    // (volatile variables must be read from memory on every access)
    unsigned long m = timer0_millis;
    unsigned char f = timer0_fract;
 
    m += MILLIS_INC;
    f += FRACT_INC;
    if (f >= FRACT_MAX) {
        f -= FRACT_MAX;
        m += 1;
    }
 
    timer0_fract = f;
    timer0_millis = m;
    timer0_overflow_count++;
}
    
unsigned long millis()
{
    unsigned long m;
    uint8_t oldSREG = SREG;
 
    // disable interrupts while we read timer0_millis or we might get an
    // inconsistent value (e.g. in the middle of a write to timer0_millis)
    cli();
    m = timer0_millis;
    SREG = oldSREG;
 
    return m;
}

Fuente : https://ucexperiment.wordpress.com/2012/03/16/examination-of-the-arduino-millis-function/

noter

Creo que hemos puesto el mismo vínculo, Ricardo. Se ve que buscamos lo mismo en google ;)

surbyte

Parece que si, Serafín.
Ojalá estas preguntas no se hicieran en el foro, porque en 2 seg lo mismo que tu y yo respondimos lo pudo haber encontrado el que generó la consulta.



jhespitia40

Gracias por contestar lamento si los incomode realmente habia buscado pero no había encontrado algo tan concreto perdón si los moleste.

surbyte

Solo para la próxima recuerda: en Google : arduino y lo que quieres buscar.
Esta casi todo preguntado y respondido.

noter

No te preocupes, que no incomodó. Al fin y al cabo era al menos una pregunta bien formulada y relativamente novedosa.

Go Up
 


Please enter a valid email to subscribe

Confirm your email address

We need to confirm your email address.
To complete the subscription, please click the link in the email we just sent you.

Thank you for subscribing!

Arduino
via Egeo 16
Torino, 10131
Italy