funcion :attachInterrupt, funcionamiento estraño-help

hola tengo el arduino uno y he conectado un boton al pin digital 3 el probado un ejemplo como el siguiente , pero no suma de manera pareja, es decir en uno a uno.

volatile int revolutions=0;

void setup() {
  // put your setup code here, to run once:
 Serial.begin(9600);
  attachInterrupt(1,  interrupt, RISING);
}

void loop() {
  // put your main code here, to run repeatedly: 
   Serial.println(revolutions);
}
void interrupt(){
      revolutions++;


}

me tira como lo siguiente:

0 35 94

.............me deberia sumar uno a uno o ¿no? es decir, si apreto el boton suma una a uno

algo asi 0,1,2,3,4.......no es el caso.

otro caso, resultante del otro ejemplo. para retificar que solo sume uno a uno, y que no se quede dando vuentas en la funcion del attachInterrupt.

volatile boolean estado=false;
int revolutions;

void setup()
{
  Serial.begin(9600);
    pinMode(4, OUTPUT);
  attachInterrupt(1, interrupt, RISING);
  
  revolutions=0;
}

void loop()
{

  if(estado==true){
        digitalWrite(4,HIGH);

      revolutions++;
  estado==false;
  }
  
}

void  interrupt()
{

  estado==true;
}

en este caso no pasa nada. como si [u]no[/u] pasara por la funcion interrupt(), y me pusiera la variable "estado==true", por lo que no enciende el led, ni suma.

alguna sugerencia de que puede estar sucediendo ??

Thx

Cambia: estado==true; por: estado=true;

Por otro lado lo que estas viendo son los rebotes en la línea del interruptor.

Cambia: estado==true; por: estado=true; ??? =(

perdon no le entendi.

segun mi programa cuando pasa por el interructor se pone estado=true, esto
habilita que pase por la condicion, y deberia summar y prender el led.
y luego pongo en estado=false. cerrando asi la condicion. y empensando de nuevo el ciclo
para cuando pase por interructtr

Pues en el segundo cacho de código que has publicado en el manejador de interrupción.

Lo mismo te pasa con estado==false, debería ser estado=false en la asignación que tienes en el loop.

Estas usando el operado de igualdad, no estas asignado nada.

ja. ya entendi, error bolu..d.s. despues pruebo si funciona, ahora una sistita. gracias!! :blush:

volatile boolean estado=false;
int revolutions;

void setup()
{
  Serial.begin(9600);
    pinMode(4, OUTPUT);
  attachInterrupt(1, interrupt, RISING);
  
  revolutions=0;
}

void loop()
{

  if(estado==true){
        digitalWrite(4,HIGH);

      revolutions++;
  estado=false;
     Serial.println(revolutions);

  }
  
}

void  interrupt()
{

  estado=true;
}

corregido, sigue tirando lo mismo. no tira de uno a uno. cada vez que aprieto el botton, tira por ejemplo 1 2 3 4 5 6

de una sola vez, deberia tirar algo asi

[u]aprieto botton[/u] 1 [u]aprieto botton[/u] 2 [u]aprieto botton[/u] 3

....espero que se haya entendido

Lo que te está pasando es que tienes problemas de rebotes, como ponía en la primera contestación. Lo que tendrás que hacer es añadir un poco de código para eliminarlos.

Por ejemplo, en el código del loop no le hagas caso a la variable estado hasta que pase cierto tiempo. Pero no uses delays porque entonces la interrupción carece de sentido.

Tendrás que usar la función milliseconds, creo. Que te devuelve los milisegundos que han pasado desde que el AVR arrancó. Usa una variable para determinar cuando detectaste por primera vez la pulsación, por ejemplo dentro del if y pasado cierto tiempo le vuelve a hacer caso a la variable estado (o le permites que cambie de valor). Te aconsejo entre 20ms y 100ms, va a depender mucho de los rebotes que tengas y del interruptor que uses.

Aquí te dejo un enlace para que comprendas lo que te está pasando. http://www.eng.utah.edu/~cs5780/debouncing.pdf

volatile boolean estado=false;
int revolutions;
float ant=0;

void setup()
{
  Serial.begin(9600);
    pinMode(4, OUTPUT);
  attachInterrupt(1, interrupt, RISING);
  
  revolutions=0;
}

void loop()
{

if( (millis()-ant)>235){
ant=millis();
  if(estado==true){
        digitalWrite(4,HIGH);

      revolutions++;
  estado=false;
     Serial.println(revolutions);

  }
}
  
}

void  interrupt()
{

  estado=true;
}

thx, Linda por estar ahi ami preguntas.

lo mas fino que he podido dejar este [u]"delay "[/u] es a 235ms, que me parece mucho comparando con los valores que usted menciona. y teniendo en cuenta que estoy presionando lo mas rapido que puedo el boton. de que funciona este filtro funciona.

le comento , que intento medir las RPM DE UNA RUEDA DE BICICLETA,claro esta que un boton no voy a usar, sino un boton con efecto hall(iman). supongo que debere sumar 235ms, pero no sera una lectura en tiempo real, que opina usted ??

pd: me pondre a ver, con mas detenimiento su archivo que me envio ya que esta en ingles.

Simplemente mira las imágenes del osciloscopio. Verás que el tiempo y los robotes son muy dependientes del tipo de interruptor. Uno malo supera los 200ms.

Para tu interruptor efecto hall no creo que tengas tantos problemas, pero es cuestión de probarlo.

hola [u]FM[/u], disculpa que me salga un poco del tema . QUERIA preguntarle cual seria la manera mas eficiente de almacenar data. le explico uno poco, quiero hacer una matrix de led Rgb de 50*50, es decir la forma que se me ocurrio es esta;

uint32_t RGBDATA[]={ 0x701E20,0x641818,0x440800,

};

Y LA DECODIFICO ASI:

R = valor >> 4; G = (valor >> 8) & 0xFF; B = valor & 0xFF;

===================== EL PROBLEMA ES QUE si la matrix es de 50*50, entonces me da 2500, de data de esta 0x440800.


lo cual da que la memoria del arduino este por colapsar y no pueda cagar mas imagnes. que opina usted ?? s

Una de las cosas que se puede hacer es declarar la variable en flash en vez de en RAM, como tendría la declaración que has publicado. Puedes buscar "PROGMEM" en el foro o google para ver cómo se usa.

Otra alternativa es reducir el rango dinámico de colores que eres capaz de generar de 6 bytes a 3, es decir, usando 1 byte por color.

La última que se me ocurre es usar una uSD.

Digamos que estas son las opciones HW/SW con poca carga algorítmica. Siempre puedes comprimir la "imagen" y descomprimirla antes de pintar. Esta última va a resultar complicadilla de implementar.

Pues, así a botepronto... 2500 * 4 bytes=10000 bytes (+- 10 kb) con lo que sí se sale de la capacidad de memoria, creo. Puedes ahorrar un poquito, si en lugar de declarar cada color de led como uint32 (4 bytes de los cuales creo que no usas el primero) lo declaras directamente como byte[]={0x70,0x1E,0x20, 0x64,0x18,0x18, 0x44,0x08,0x00, ....) y luego sabes que sólo tienes que ir cogiendo consecutivamente cada tres bytes (r=byte[0], g=byte[1], b=byte[2], r1=byte[3]....). De esta forma te ocupará 2500*3=7500 bytes. El declarar las variables en el código, supone que previamente están en el código y las vas a pasar a sram, con lo que estás ocupando esa memoria en ambos sitios. Lo mejor a mi parecer es la opción 3 que te propone FM y volcarlas directamente de uSD a la matrix.

Realmente puedes declarar una estructura de 3 bytes, en el código irán a parar a arma si y sólo si lees todo el array de golpe a memoria. Depende mucho de la interfaz del controlador. Lo que sí es cierto es que no te quita ni el tato los 7,5K sin comprimir.

Yo dependiendo de la aplicación usaría una uSD.

hola chicos, siguiendo sus consejos debo usar 3 bytes para los colores rgb. un byte para cada color.
he probado esto usando un uint8_t={R--------R}, uint8_t={G--------G},uint8_t={B--------B};
EL PROBLEMA que salta el compilador, que array , ha llegado al limite de poder agregar elemntos all mismo.
se que una de la solucion seria es devidir la cantidad de elementos y ponerlo en otro array.

pero se puede aumentar la cantidad de elementos que puede albergar el array ???

otra pregunta, ¿que es uSD?, he buscado en internet esa terminologia, referente a la programacion, y me arroja
que son dolares, dinero.ja

otra pregunta, he visto que para usar una tarjeta de memoria, usa estas entradas http://www.extremadura-web.es/Blog/wp-content/uploads/2012/11/Esquema-Sd-arduino-mega2.jpg, pero yo las tengo ocupadas.
se puede usar en otras entradas del arduino??, o vendra alguna mini placa para que acepte otra entrada?

depues de esto creo lo que quiso decir con uSD, es una tarjeta de memoria, ¿es asi?

Saludos Omni !!

Efectivamente, una uSD → micro SD.

Uno de los últimos añadidos a la colección vinciDuino es una vinciDuino uSD, es decir, el clon de Leonardo que hicimos en el foro (bueno, salió unos cuantos meses antes que la Leonardo) y ahora ha evolucionado y en la propia placa tiene soporte para una uSD. Lo puedes ver en mi web.