Autor Tema: Funcion milis(), donde se encuentra?  (Leído 3050 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado Loudness

  • PIC16
  • ***
  • Mensajes: 147
Funcion milis(), donde se encuentra?
« 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.

Desconectado Eduardo2

  • PIC24H
  • ******
  • Mensajes: 1004
Re:Funcion milis(), donde se encuentra?
« Respuesta #1 en: 22 de Marzo de 2021, 01:31:48 »
Está definida en ..\hardware\arduino\avr\cores\arduino\wiring.c

Desconectado Loudness

  • PIC16
  • ***
  • Mensajes: 147
Re:Funcion milis(), donde se encuentra?
« Respuesta #2 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?
« Última modificación: 22 de Marzo de 2021, 03:36:41 por Loudness »

Desconectado remi04

  • PIC24F
  • *****
  • Mensajes: 657
Re:Funcion milis(), donde se encuentra?
« Respuesta #3 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.

 
« Última modificación: 22 de Marzo de 2021, 05:03:34 por remi04 »

Desconectado Loudness

  • PIC16
  • ***
  • Mensajes: 147
Re:Funcion milis(), donde se encuentra?
« Respuesta #4 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.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Funcion milis(), donde se encuentra?
« Respuesta #5 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. }

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5892
    • Picuino
Re:Funcion milis(), donde se encuentra?
« Respuesta #6 en: 22 de Marzo de 2021, 07:27:54 »

Desconectado Loudness

  • PIC16
  • ***
  • Mensajes: 147
Re:Funcion milis(), donde se encuentra?
« Respuesta #7 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


 

anything