TODOPIC

Otros Microcontroladores / Dispositivos programables => Arduino => Mensaje iniciado por: Loudness en 22 de Marzo de 2021, 01:25:06

Título: Funcion milis(), donde se encuentra?
Publicado por: Loudness en 22 de Marzo de 2021, 01:25:06
Hola a todos.

La funcion milis() del arduino me parece muy util y estoy pensando en hacer algo parecido para utilizar en un PIC.

Para ello quiero saber como funciona pero no se donde se encuentra escondida, no la encuentro.

Alguien me puede decir donde se esconde susodicha funcion?

Gracias por adelantado por sus respuestas.

Saludos.
Título: Re:Funcion milis(), donde se encuentra?
Publicado por: Eduardo2 en 22 de Marzo de 2021, 01:31:48
Está definida en ..\hardware\arduino\avr\cores\arduino\wiring.c
Título: Re:Funcion milis(), donde se encuentra?
Publicado por: Loudness en 22 de Marzo de 2021, 02:28:54
Está definida en ..\hardware\arduino\avr\cores\arduino\wiring.c

Gracias  :laugh:

Parece que la porcion de codigo que me interesa es esta:

Código: [Seleccionar]
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;
}

El caso es que no la entiendo muy bien:  lee (timer0_millis) y lo mete en m.
Pero este timer0_millis desde donde se escribe?. De donde viene esto?

Alguna idea?
Título: Re:Funcion milis(), donde se encuentra?
Publicado por: remi04 en 22 de Marzo de 2021, 05:00:01
La función millis utiliza el Timer0 y una interrupción por desbordamiento de ese timer.

 El timer se configura para un periodo de 1 Khz. Por ello, cuando desborda, se genera una interrupción y dentro de esa interrupción es donde se actualiza el timer0_millis.

  En un pic se puede hacer usando el timer1 y el periodo. Lo ajustas para obtener un periodo de 1 Khz y cuando se produzca la interrupción  incrementas en 1 una variable global de 32 bits que será el tiempo en ms transcurridos desde que diste alimentación  al pic.

 Saludos.

 
Título: Re:Funcion milis(), donde se encuentra?
Publicado por: Loudness en 22 de Marzo de 2021, 05:15:19
remi04: Gracias por la respuesta :laugh:

La función millis utiliza el Timer0 y una interrupción por desbordamiento de ese timer.

 El timer se configura para un periodo de 1 Khz. Por ello, cuando desborda, se genera una interrupción y dentro de esa interrupción es donde se actualiza el timer0_millis.

  En un pic se puede hacer usando el timer1 y el periodo. Lo ajustas para obtener un periodo de 1 Khz y cuando se produzca la interrupción  incrementas en 1 una variable global de 32 bits que será el tiempo en ms transcurridos desde que diste alimentación  al pic.

 Saludos.


Para una frecuencia de 1KHz corresponde un periodo de 1 ms asi que cuando la interrupcion se desborde podremos saber en cada momento cuantos milis han pasado verdad?.

Ya veo mucho mas claro por donde tirar.

Gracias por su ayuda.

Saludos.
Título: Re:Funcion milis(), donde se encuentra?
Publicado por: KILLERJC en 22 de Marzo de 2021, 06:48:20
Pero este timer0_millis desde donde se escribe?. De donde viene esto?
En el mismo archivo tenes la interrupcion:

Código: C
  1. ISR(TIM0_OVF_vect)
  2. {
  3.         // copy these to local variables so they can be stored in registers
  4.         // (volatile variables must be read from memory on every access)
  5.         unsigned long m = timer0_millis;
  6.         unsigned char f = timer0_fract;
  7.  
  8.         m += MILLIS_INC;
  9.         f += FRACT_INC;
  10.         if (f >= FRACT_MAX) {
  11.                 f -= FRACT_MAX;
  12.                 m += 1;
  13.         }
  14.  
  15.         timer0_fract = f;
  16.         timer0_millis = m;
  17.         timer0_overflow_count++;
  18. }
Título: Re:Funcion milis(), donde se encuentra?
Publicado por: Picuino en 22 de Marzo de 2021, 07:27:54
Secrets of Arduino millis:
https://www.best-microcontroller-projects.com/arduino-millis.html
Título: Re:Funcion milis(), donde se encuentra?
Publicado por: Loudness en 22 de Marzo de 2021, 21:54:42
Gracias por sus respuestas

Pero este timer0_millis desde donde se escribe?. De donde viene esto?
En el mismo archivo tenes la interrupcion:


No me habia fijado  :oops:

Secrets of Arduino millis:
https://www.best-microcontroller-projects.com/arduino-millis.html

 ((:-)) ((:-)) ((:-))

Saludos