Haz una pregunta
  Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos » Arduino y Raspberry Pi
Foros Registrarse ¿Olvidaste tu contraseña?

Temas similares

10/04/2014 #1

Avatar de alexus

Rutina de Arduino a "2 velocidades".
Buenas noches! Espero que se encuentren todos bien!

Como dice el titulo, quiero correr una rutina que tengo escrita a dos velocidades distintas, con velocidades me refiero a el tiempo de ejecucion de una instruccion (tiempo en high,low) y la pausa que coloque entre una instruccion y la siguiente.

Es decir:

Código:
loop:

Rutina a VELOCIDAD "1"

Pausa

Rutina a VELOCIDAD "2"

End loop.
Los tiempos los tengo definidos como variables, es decir, modifico esta y se modifica todo el programa.

Mi duda es:

Tengo que escribir un programa para cada velocidad?

O,

Mantener un solo codigo y "de alguna manera" decirle a este, que, corra leyendo las variables de tiempo para la VELOCIDAD 1 y al finalizar, e iniciar el segundo ciclo, "tome" las variables correspondientes a la VELOCIDAD 2?

Espero haber sido claro, y me puedan dar una mano!

Un abrazo desde Uruguay.
10/04/2014 #2

Avatar de Daniel Meza

Según veo, el AVR que tiene arduino tiene un preescaler que alimenta el clock del CPU, y se puede modificar para dividir la frec osc con tan sólo escribir en un registro OSCCAL. Sólo sería cuestión de escribir en ese registro para ajustar la velocidad.
Saludos
11/04/2014 #3

Avatar de Scooter

No entiendo que pretendes. ¿Podrias aclarar la pregunta?
11/04/2014 #4

Avatar de papirrin

Ya somos dos, no se entiende la finalidad, pero si requieres que sea por ciclos de instruccion seria mejor hacerlos desde ensamblador (no se si desde arduino se pueda)
11/04/2014 #5

Avatar de alexus

Buenas tardes! disculpen si no fui demasiado claro!

tengo un sketch que me enciende un led, en determinada secuencia, el cual contiene tiempo para el led en HIGH, y tiempo para el led en LOW, y tiempo de espacio entre los diferentes carrier.

Ejemplo:

Código:
#define alto 100 
#define bajo 100
#define espacio 300
Esas son las variables que estoy corriendo actualmente, pero lo que quiero, es correr el mismo programa tomando otras variables de tiempo, ejemplo:

Código:
#define alto2 30 
#define bajo2 30
#define espacio2 100
Como decia al principio, necesito "copiar" el programa modificando que variable lee (si alto o alto2, etc), o, mantener un solo programa, y que al culminar la rutina, "de una instruccion", para que al siguiente loop lea las variables "2"?
11/04/2014 #6

Avatar de Scooter

La documentación recomienda encarecidamente no usar #define y en este caso menos aún ya que no tiene ningún sentido usar un #define para algo que puede tomar varios valores sentido.
Usa variables normales y a acorrer
Caso 1:
alto= 1;
bajo=1;
parpadea();


Caso2:
Alto=10000000;
Bajo=1000000;
parpadea;



Parpadea();
loop{
delay(alto)
lo que sea
delay(bajo)
lo que sea
}



O algo así, claro que yo soy fanático opositor de los "delay" ya que hacer un delay y apagar el arduino es casi lo mismo.
11/04/2014 #7

Avatar de alexus

Claro, pero manteniendo el sketch original, no puedo, de alguna forma, elegir que variable leer al comenzar el siguiente loop? y luego de terminado este, que lea las variables iniciales, y asi perpetuamente.
11/04/2014 #8

Avatar de ByAxel

Hola..
Sigo confundido... cuando dices ( tiempo de ejecucion de una instruccion ) supongo que te refieres a una instrucción en lenguaje C y no en ASM...

Si es del primer caso, no crees que bastaría con usar un IF y un Flag para determinar que valor usar como pausa o velocidad entre instrucciones. Y si no quieres perder datos se pueden guardar en la EEPROM. Algo como:

Código:
#define VelA1 20   ; Velocidad
#define VelA2 30
#define VelB1 100
#define VelB2 200
...
alto, bajo;
flag = 0;
...
Loop{
if (flag==0 ){
   alto =  VelA1;
   bajo = VelA2; 
}
else{
   alto =  VelB1 ;
   bajo = VelB2 ; 
}
Entre otras cosas.... cambiar valor de [ flag ]
}
El parpadeo de un LED a diferente velocidad se trabaja algo así, pero si solo es parte de tu programa como un aviso parpadeante... se debe de tomar en cuenta el resto... tal vez necesites un timer+interrupción del AVR... ahunque me parece demaciado para que solo parpadee...

Si es el otro modo ( asm ) ya es necesario variar la frecuencia del reloj/oscilador...

Saludos.
11/04/2014 #9

Avatar de alexus

Que frustrante es no saber hacerse entender! ja ja

Código:
#define alto1 100 
#define bajo1 100
#define espacio1 300

#define alto2 30 
#define bajo2 30
#define espacio2 100
Tengo estas variables, una unica rutina, que enciende un led.

Quiero que la rutina corra "leyendo" las variables "1", cuando termine e inicie nuevamente, lo haga tomando las variables "2", y al finalizar e iniciar el siguiente ciclo, tome las variables "1" y asi sucesivamente.
11/04/2014 #10

Avatar de ByAxel

Hola.

- Los #define no pueden ser como variables, son más como constantes... necesitas variables las cuales cargar con los valores de los #define... y para determinar cuando cargar con un tipo u otro valor es necesario un Flag o variable que sirva para comparar...

- Prueba el pseudocodigo que puse antes... pero sería algo así..

Código:
#define alto1 100 
#define bajo1 100
#define espacio1 300

#define alto2 30 
#define bajo2 30
#define espacio2 100

variables ALTO, BAJO, ESPACIO;
variable FLAG = 0;

Loop{
  if(FLAG){
     ALTO = alto1;
     BAJO = bajo1;
     ESPACIO = espacio1;
     FLAG = 0; // Cambio
  }
  else{
     // Igual pero cargando alto2, bajo2 y espacio2.
     FLAG = 1; // Cambio
  }

  LED_ALTO;
  Pause con valor de ALTO;
  LED_BAJO;
  Pause con valor de BAJO;
  ...
  Pause con valor de ESPACIO; // Ahunque no lo veo necesario jeje, se suma BAJO + ESPACIO = tiempo       
  más largo en LED_BAJO.
}
11/04/2014 #11

Avatar de alexus

By Axel! Te entiendo pero no te comprendo!
12/04/2014 #12

Avatar de Scooter

#define no son variables son todo lo contrario; son NO-VARIABLES, SON CONSTANTES están "forjadas a fuego" si usas #define olvídate de cambiar nada.
Repito que se desaconseja su uso en los manuales, en todo caso se recomienda const. Si además pretendes cambiar su valor es evidente que no vas a poder.
¡¡Olvida el #define !!
#define is a useful C component that allows the programmer to give a name to a constant value before the program is compiled. Defined constants in arduino don't take up any program memory space on the chip. The compiler will replace references to these constants with the defined value at compile time.

This can have some unwanted side effects though, if for example, a constant name that had been #defined is included in some other constant or variable name. In that case the text would be replaced by the #defined number (or text).

In general, the const keyword is preferred for defining constants and should be used instead of #define.
Pseudocódigo

void setup(){
talto=10
tbajo=10
}

void loop(){
enciende led
delay (talto);
apaga led
delay (tbajo);
if (condicion==loquesea){
talto = 100
tbajo = 100
}
else{
talto =10
tbajo =10
}
}

Pero no con #define, con variables, no con constantes.
14/04/2014 #13

Avatar de alexus

Comprendido! Solo que no logro escribirlo correctamente! Y no hay caso! No para de tirarme errores!
17/04/2014 #14

Avatar de Scooter

A mi código le faltan mil detalles, todos los punto y coma y mas cosas
17/04/2014 #15

Avatar de Nuyel

¿Pero que es lo que pretendes hacer?
Yo diría que los saques en una subrutina como
Código:
void encender(int alto, int bajo, int espacio){
  //aquí va el resto de código de tu led
  //por ejemplo
  digitalWrite(13, HIGH);
  delay(alto);
  digitalWrite(13, LOW);
  delay(bajo);
  delay(espacio);
}
Entonces cuando la necesites solo la llamas dando los argumentos del tiempo, en tu loop solo iría:
encender(100, 100, 300);
encender(30, 30, 100);
18/04/2014 #16

Avatar de cosmefulanito04

El define es una excelente herramienta de C que te permite cambiar los parámetros de tú código fácilmente (puertos de salidas, velocidades, configuración de periféricos, etc).

No se en que manuales se "desaconseja" su uso, pero supongo que en esos manuales tampoco aconsejan usar las librerías típicas de c/familia de uC que define c/u de sus registros .
18/04/2014 #17

Avatar de Scooter

Lo explica bastante claro.
#define cambia el trozo de código fuente por su valor en los primeros pasos.
La ventaja es que no ocupa memoria en el código.
La desventaja es que cambia todo lo que pille por su valor, así si defino "micro como 100" si luego aparece por ahí microcontrolador lo cambiará por 100controlador
Otra pega es que lo bueno de las variables es que varíen si las hacemos constantes en general no va muy bien.
21/04/2014 #18

Avatar de chclau

Otra manera de hacerlo seria con arrays, alto(1) = algo, alto(2) = otra cosa, etc.

Con respecto a los #define, los programadores de mi trabajo dicen que su uso es "no de profesionales" y lo que me explicaron es que la diferencia entre usar #define y usar const int o const lo que sea, es que si uso const el compilador verifica que no asigne un flotante a un entero u otras cosas asi, en cambio con el #define esos errores saltan mucho mas tarde.
21/04/2014 #19

Avatar de papirrin

Mi resumen :

Con respecto a los #define, los programadores de mi trabajo dicen que su uso es "no de profesionales" y lo que me explicaron es que la diferencia entre usar #define y usar const int o const lo que sea, es que si uso const el compilador verifica que no asigne un flotante a un entero u otras cosas asi, en cambio con el #define esos errores saltan mucho mas tarde.
Yo ya explique y demostre hasta cierto punto que el comparar un #define con una constante o variable es como comparar una vaca con un elevador. son dos cosas totalmente diferentes.

estoy deacuerdo en su uso cuando son codigos largos en donde hay miles de lineas de codigo, hace mas facil el trabajo al programador.

no estoy deacuerdo en que digan que no es de profesionales,un profesional toma todas las herramientas disponibles para lograr un objetivo.
21/04/2014 #20

Avatar de Nuyel

Si e. usar #define es con cuidado por que puede hacer tonterías, como poner "#define false true" y cuando escribas true en el código será false
¿Tienes una mejor respuesta a este tema? ¿Quieres hacerle una pregunta a nuestra comunidad y sus expertos? Registrate

Buscar más temas sobre:
Lupa Arduino y Raspberry Pi

Cerrar
Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos » Arduino y Raspberry Pi

Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO ©2011, Crawlability, Inc.