Pages: [1]   Go Down
Author Topic: Evitar que un codigo se repita en el void loop y optimizarlo  (Read 1367 times)
0 Members and 1 Guest are viewing this topic.
Orduña- Bizkaia
Offline Offline
Sr. Member
****
Karma: 0
Posts: 317
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hola, tengo un problema con el que llevo toda la tarde, al final poniendo un boton he conseguido que funcione pero no es la mejor opcion, el caso esque manejando un motor a traves de unos pulsos, a veces el tiempo es 0 y cuando eso ocurre quiero que haga lo que hay en el IF de cuando se pulsa el boton, no se como hacerlo de manera automatica porque si pongo un if cuando vuelve a repetir el ciclo si sigue siendo 0 lo vuelve a hacer y solo quiero que lo haga una vez. A ver si alguien me puede iluminar.
Un saludo y gracias.

Code:
void(* resetFunc) (void) = 0;


void loop(){
 buttonState = digitalRead(buttonPin);
  if (buttonState == HIGH) {    
    digitalWrite(ledPin, HIGH);
    step(false,1000);
    resetFunc();
  }

  time = pulseIn(pin, LOW);
 delayMicroseconds(5);
  Serial.println(time);
  if(time>0){
  position = map(time,2391,40190,800,0);
  }
  nextStep = position - previousStep;

if(nextStep>0){
  step(true,nextStep);
}
else{
  prox=nextStep*-1;
  step(false,prox);
}
previousStep = position;
}
« Last Edit: April 19, 2011, 03:50:02 pm by riscking » Logged

0
Offline Offline
Edison Member
*
Karma: 17
Posts: 1413
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

puedes crear una variable tipo int que valga cero.
cuando ejecutes el codigo if compruebas tu condicion y que la variable int siga valiendo cero,
cuando entres en el IF te aseguras de que al final aumenta el valor de la varialbe int en 1 y asi ya no volvera a entrar mas porque en el IF no se cumplira que variable == 0
Logged

* Si preguntas, pon el código de tu programa, hace mucho mas fácil ayudarte. Y me ahorro un mensaje pidiendo que lo hagas.
* Si consigues solucionar tu problema, dedica unos minutos a explicar en tu post como lo conseguiste para beneficio de todos.
* Cambia el 'Subject' de tu hilo y añade 'SOLUCIONADO' cuando hayas llegado a una solución al problema que planteaste.
* Utiliza un 'Subject' para tu hilo que explique de que va el hilo.
Si estas empezando:
* Comienza a usar Arduino
* Guías de iniciación a Arduino
* Ejemplos
* Referencia del Lenguaje
* Conceptos básicos
Guia de usuario de arduino
Tutoriales en Ingles
Si necesitas que alguien te escriba el código: http://www.freelancer.com/  o esta  http://www.guru.com/

Orduña- Bizkaia
Offline Offline
Sr. Member
****
Karma: 0
Posts: 317
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

he puesto un contado, mas o menos como dices tu y asi parece q va bastante bien, hay alguna manera de optimizar este codigo al máximo para que en hacer los calculos tarde el menor número de ciclos posible?
Un saludo.
Logged

0
Offline Offline
Edison Member
*
Karma: 17
Posts: 1413
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

me alegro que ahora funcione, puedes poner el codigo para ver como se podria optimizar
Logged

* Si preguntas, pon el código de tu programa, hace mucho mas fácil ayudarte. Y me ahorro un mensaje pidiendo que lo hagas.
* Si consigues solucionar tu problema, dedica unos minutos a explicar en tu post como lo conseguiste para beneficio de todos.
* Cambia el 'Subject' de tu hilo y añade 'SOLUCIONADO' cuando hayas llegado a una solución al problema que planteaste.
* Utiliza un 'Subject' para tu hilo que explique de que va el hilo.
Si estas empezando:
* Comienza a usar Arduino
* Guías de iniciación a Arduino
* Ejemplos
* Referencia del Lenguaje
* Conceptos básicos
Guia de usuario de arduino
Tutoriales en Ingles
Si necesitas que alguien te escriba el código: http://www.freelancer.com/  o esta  http://www.guru.com/

Orduña- Bizkaia
Offline Offline
Sr. Member
****
Karma: 0
Posts: 317
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ahora no estoy delante del otro PC pero basicamente he conseguido optimizarlo haciendo los siguientes cambios:

pinMode(12, OUTPUT);
 pinMode(13, OUTPUT);
por
DDRB = _BV (4) | _BV (5);
 
digitalWrite(12, HIGH);
por
PORTB &= ~(_BV(PORTB4));

digitalWrite(stepperPin, LOW);
por
PORTB |= _BV(PORTB4);

Lo que no se es como cambiar  digitalWrite(13,dir); donde dir es una variable 0 o 1.
Sustituyendo digitalwrite  se pasa de usr 56 ciclos a 2 q no esta mal, el resto si q ya no se que mas hacer.

Logged

0
Offline Offline
Edison Member
*
Karma: 17
Posts: 1413
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

interesante, siento no poder ayudarte en esto.
como sabes que has pasado de 56 a 2 ciclos? lo has calculado tu o lo ves en algún sitio?
Logged

* Si preguntas, pon el código de tu programa, hace mucho mas fácil ayudarte. Y me ahorro un mensaje pidiendo que lo hagas.
* Si consigues solucionar tu problema, dedica unos minutos a explicar en tu post como lo conseguiste para beneficio de todos.
* Cambia el 'Subject' de tu hilo y añade 'SOLUCIONADO' cuando hayas llegado a una solución al problema que planteaste.
* Utiliza un 'Subject' para tu hilo que explique de que va el hilo.
Si estas empezando:
* Comienza a usar Arduino
* Guías de iniciación a Arduino
* Ejemplos
* Referencia del Lenguaje
* Conceptos básicos
Guia de usuario de arduino
Tutoriales en Ingles
Si necesitas que alguien te escriba el código: http://www.freelancer.com/  o esta  http://www.guru.com/

Orduña- Bizkaia
Offline Offline
Sr. Member
****
Karma: 0
Posts: 317
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

La verdad yo no sabría como comprobarlo, si alguien sabe que me diga, lo de los ciclos lo he visto en esta página:
http://blog.bricogeek.com/noticias/arduino/arduino-funcion-digitalwrite-mas-rapida/
Es un blog donde aparecen muchas cosas interesantes, ya me gusta.
Logged

Orduña- Bizkaia
Offline Offline
Sr. Member
****
Karma: 0
Posts: 317
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Cual de estas dos formas es mas rápida en cuanto a ciclos , a ver alguien q controle bastante de programación.

void step(boolean dir,int steps){
  digitalWrite(dirPin,dir);
ó
  if (dir==1){
    PORTB |= _BV(PORTB5);
  }else{
    PORTB &= ~(_BV(PORTB5));
  }
}


un saludo
Logged

Offline Offline
Edison Member
*
Karma: 23
Posts: 1375
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

La segunda es más rápida, pero pierdes la portabilidad del código entre las placas de Arduino, que es la razón por la que digitalWrite tarda más.
Logged

Mercadillo electrónico. Kit iniciación a Arduino, shield LCD a color y más cosas!

Orduña- Bizkaia
Offline Offline
Sr. Member
****
Karma: 0
Posts: 317
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Como la portabilidad, no es valido para todas las placas arduino? para cuales sirve?
Logged

Offline Offline
Edison Member
*
Karma: 23
Posts: 1375
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Cuando programas la placa, piensas en que PORTB5 es el pin 13, pero en las mega es el pin 11, por lo que funcionaría pero tienes que estar convirtiendo pines entre placas.
Logged

Mercadillo electrónico. Kit iniciación a Arduino, shield LCD a color y más cosas!

Orduña- Bizkaia
Offline Offline
Sr. Member
****
Karma: 0
Posts: 317
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

En mi caso de momento no tendria ese problema, pero hay algun comando para identificar q placa estas usando y segun eso poner una configuracion u otra? solo por curiosidad.
Logged

Offline Offline
Edison Member
*
Karma: 23
Posts: 1375
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Usando las ordenes de precompilación se puede hacer:
Code:
#if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
    #define ENC28J60_CONTROL_CS     53
    #define SPI_MOSI                51
    #define SPI_MISO                50
    #define SPI_SCK                 52
#else
    #define ENC28J60_CONTROL_CS     10
    #define SPI_MOSI                11
    #define SPI_MISO                12
    #define SPI_SCK                 13
#endif
Logged

Mercadillo electrónico. Kit iniciación a Arduino, shield LCD a color y más cosas!

Pages: [1]   Go Up
Jump to: