3 Respuestas Última respuesta el Feb 4, 2015 8:41 AM por lvarela

    Al intentar una prueba tan simple como tan solo conmutar un pin digital en el ciclo loop, genera una señal cuadrada muy lenta comparada con la que genera una simple tarjeta arduino uno, ¿alguien sabe por qué?

      Que tal saludos a todos, intenté una prueba muy simple, tengo este pequeño programa:

       

      int PinPulso=13;

      void setup() {

      pinMode(PinPulso,OUTPUT);

      }

       

      void loop() {

      digitalWrite(PinPulso,HIGH);

      digitalWrite(PinPulso,LOW); 

      }

       

      Muy simple solo cambia de alto a bajo una y otra vez el estado del pin 13 de la tarjeta, este programa lo cargué a una tarjeta arduino uno, y se genera una señal casi cuadrada que dura aproximadamente 9us, algo lenta para los 16MHz a la que opera esta tarjeta, pero aceptable,  este mismo sketch lo cargue hacia la tarjeta Galileo esperando pues que fuera una señal mucho más rápida, puesto que esta tarjeta trabaja a 400MHz (esperaba unas 25 veces mas rápido), sin embargo al probarlo resulto que observaba en el osciloscopio una señal cuadrada que dura prácticamente 4.5 ms, es decir 500 veces mas lenta. Probé el sketch tanto sin conectar la tarjeta SD a la Galileo para que no estuviera interviniendo el S.O. Linux, como con ella, pero el resultado fue el mismo. No encuentro alguien que describa este problema, ¿alguien sabe por qué sucede?

        • Re: Al intentar una prueba tan simple como tan solo conmutar un pin digital en el ciclo loop, genera una señal cuadrada muy lenta comparada con la que genera una simple tarjeta arduino uno, ¿alguien sabe por qué?

          Bien, creo que ya encontré la respuesta y para malas noticias aparentemente no hay solución a este problema, quienes quieran ver en la siguiente liga:

          Intel Galileo FAQ

          En el apartado de construcción indica que el controlador del GPIO que utilizaron en el diseño de la tarjeta Galileo, permite actualizar el estado de un pin en un tiempo de 2ms, que es prácticamente el tiempo que me dió el experimento descrito en la presentación (poner en alto y despues en bajo un pin 4.5 ms) . Entonces para los que requeriramos leer o escribir valores a los pines del GPIO a velocidades mayores, no es posible, esto es un gran problema, yo pretendía implementar una aplicación muy común, medir distancia con un módulo de ultrasonido el HC-SR04, en el que hay que medir el ancho de pulso de la señal de eco, que esta está en el orden de los microsegundos, con una tarjeta arduino uno me era posible medirla, pero no tenía tanta resolución como deseaba, dada la velocidad de la Galileo imaginé que lograría una mayor resolución en tiempo, pero no, de hecho es muy mala. Es una lástima que hayan decidido incorporar un controlador de GPIO tan pobre junto con un procesador con tanta capacidad!.

           

          Si estoy en un error ojalá alguien pueda corregirme!.

           

          Gracias.

            • Re: Al intentar una prueba tan simple como tan solo conmutar un pin digital en el ciclo loop, genera una señal cuadrada muy lenta comparada con la que genera una simple tarjeta arduino uno, ¿alguien sabe por qué?
              gerardo.soria22

              Hola Luis Julián, bienvenido a la comunidad Galileo.

               

              En respuesta a tu consulta, efectivamente como tu comentas, las limitantes en la velocidad de conmutación de los pines digitales de la tarjeta galileo, las establece la comunicación entre el chip Quark y el expansor de cypress, sin embargo, la tarjeta galileo gen1, que es la que imagino posees y si me equivoco por favor házmelo saber, ofrece la posibilidad de obtener las señales de los pines digitales 2 y 3 directamente de los GPIO del chip Quark y para ello existen tres métodos:

               

              1. Utilizando el modo OUTPUT_FAST en la función pinMode().
                1. Utilizando este método es posible conmutar un pin individual a maximo 477 Khz.
                2. Ej.  pinMode(2, OUTPUT_FAST);
              2. Remplazar la función digitalWrite() por fastGpioDigitalWrite();
                1. Esta función te permite escribir directamente a los registros saltándose todo el código dentro de digitalWrite()
                2. Con éste método puedes alcanzar una velocidad máxima de conmutación cercana a los 680Khz.
                3. Ej.  pinMode(2, OUTPUT_FAST);
                  1. fastGpioDigitalWrite(GPIO_FAST_IO2, HIGH);
              3. Utilizar la función fastGpioDigitalWriteDestructive(register uint8_t fpio_mask);
                1. Usando éste método es posible alcanzar los 2.93 Mhz en la conmutación de uno o ambos pines a la vez
                2. Hay que ser cuidadoso con este método ya que es responsabilidad de la aplicación mantener el estado de los registros GPIO, para ello se proporciona la función fastGpioDigitalLatch(), la cual permite almacenar el estado inicial del registro GPIO para después actualizarlo.

              A continuación te dejo algunos ejemplos de como utilizar los tres modos:

               

              Ejemplo 1 - salida a 477kHz en IO2:

              setup(){

                  pinMode(2, OUTPUT_FAST);

              }

              loop()

              {

                  register int x = 0;

                  while(1){

                      digitalWrite(2, x);

                      x =!x;

                  }

              }

               

              Ejemplo 2 - salidas a 683kHz en IO3:

              setup(){

                  pinMode(3, OUTPUT_FAST);

              }

              loop()

              {

                  register int x = 0;

                  while(1){

                      fastGpioDigitalWrite(GPIO_FAST_IO3, x);

                      x =!x;

                  }

              }

               

              Ejemplo 3 - salida a  2.93MHz solo en IO3:

              uint32_t latchValue;

              setup(){

                  pinMode(3, OUTPUT_FAST);

                  latchValue = fastGpioDigitalLatch();

              }

              loop()

              {

                  while(1){

                      fastGpioDigitalWriteDestructive(latchValue);

                     latchValue ^= GPIO_FAST_IO3;

                  }

              }

               

              Ejemplo 4 - salidas a 2.93MHz en IO2 e IO3 simultáneamente:

              uint32_t latchValue;

              setup(){

                  pinMode(2, OUPUT_FASTMODE);

                  pinMode(3, OUPUT_FASTMODE);

                  latchValue = fastGpioDigitalLatch(); // latch initial state

              }

              loop()

              {

                  while(1){

                      fastGpioDigitalWriteDestructive(latchValue);

                      if(latchValue & GPIO_FAST_IO3){

                          latchValue |= GPIO_FAST_IO2;

                          latchValue &= ~ GPIO_FAST_IO3;

                      }else{

                          latchValue |= GPIO_FAST_IO3;

                          latchValue &= GPIO_FAST_IO2;

                      }

                  }

              }

               

              Como te comente al principio, lo anterior solo es válido para la Galileo Gen 1, en la Gen2 se ofrecen las mismas características pero en mas pines, desde el IO0 hasta el IO6 y del IO9 al IO13, sin embargo la forma de acceder a ellos es distinta.

               

              Espero que la respuesta te sea de utilidad. Saludos