Activación simultanea de salidas digitales

Hola a todos!

Tengo el siguiente ejercicio para compartir con todos.
Pines a trabajar del pin 0-7 o del 2-9 (Si usas Arduino Uno).
La idea es usar la sentencia if, for y digitalWrite para lograrlo y no los registros PORTX, ni otra sentencia.

Ejercicio:

Se activa el pin 0 y se apaga
Se activa el pin 0 y el 1 y se apagan
Se activa el pin 0 1 y 2 y se apagan
Se activa el pin 0 1 2 y 3 y se apagan
y asi sucesivamente hasta el pin 7.

Tengo lo siguiente pero no, funciona como es debido...

int t1(200), t2(100), t3(500);

void setup() {  
     for ( int i=0;i<8; i++) {
       pinMode(i,OUTPUT); 
                            }                  
}

void loop() {
       for (int i=0;i<1;i++) {
            digitalWrite(i,HIGH); delay(t1);
            digitalWrite(i,LOW); delay(t1);
       }
       for (int i=0;i<1;i++){
            if (i > i++) 
                digitalWrite(i, HIGH);
 }

Has definido mal int t1(200), t2(100), t3(500);

Ahi creaste vectores t1 de 200 elementos int, t2 de 100 elementos y t3 de 500 elementos.

Agradece que te dio la memoria.

debiste hacer

int t1 = 200, t2 = 100, t3 = 500;

Prueba el cambio!

¡Ojo surbyte, no te confundas! Brian_v lo tiene bien. Fíjate que está utilizando paréntesis no corchetes.

Para aquellos que no estén acostumbrados a las "peculiaridades" del C++, aunque pueda parecer obvio, no es lo mismo:

int t1(200), t2(100), t3(500);

que:

int t1[200], t2[100], t3[500];

En el primer caso se está invocando el constructor de int al crearse las variables t1, t2 y t3, que son simples enteros. Mientras que en el segundo caso se están creando tres arrays de int de tamaños de 200, 100 y 500 enteros respectivamente.

Pero lo que no es tan ovbio es que poner:

int t1(200), t2(100), t3(500);

es exactamente lo mismo que:

int t1 = 200, t2 = 100, t3 = 500;

Minetras que lo siguiente:

int t1, t2, t3;
t1 = 200, t2 = 100, t3 = 500;

Aunque el resultado pueda ser el mismo que en los dos anteriores, no es exactamente lo mismo. Los dos primeros crean los enteros a la vez que se inicializan directamente con los valores indicados, mientras que en el último caso se crean los enteros sin inicializar (pueden contener "basura") y después se les asigna a cada uno de ellos sus correspondientes valores.

En C++ una cosa es el operador = y otra cosa es el constructor. Cuando usamos el signo = en la declaración de la variable/objeto, lo que se está invocando es el constructor y no el operador de asignación (que es el que se está usando en el último caso, cuando no se usa en la declaración de las variables, sino después).

C y C++ tiene la fastidiosa "costumbre" de usar un mismo signo para múltiples cometidos diferentes dependiendo del contexto. Por ejemplo el & delante de una variable cuando se está declarando como parámetro indica que ese parámetro se pasa por referencia (sólo en C++), mientras que si se antepone al nombre de la función cuando se está declarando significa algo similar a lo anterior: que retorna el valor por referencia (sólo en C++). Si lo antepones a una variable cuando "la usas" lo que obtienes es su dirección de memoria (puntero), pero entre dos enteros & es el operador AND a nivel de bits. Y para colmo este operador, al igual que la mayoría de operadores, en C++ se pude redefinir para que haga lo que nos de la gana. Todo ello sin contar que dos seguidos (&&) es otro signo diferente (el operador AND lógico).

El * (asterisco) es también otro que "se las trae". Sirve para indicar en la declaración que la variable es un puntero o que la función retorna un puntero, mientras que el "uso" de una variable lo que indica es que queremos acceder al contenido apuntado por esa variable (que ha de ser un puntero). Si la usas entre variables numéricas o números es la operación de multiplicación. Y si pones dos asteriscos consecutivos () no es un operador diferente (a diferencia del &&) es el mismo operador puesto dos veces, pero sólo cuando se trata de punteros ya que estamos tratando con punteros a punteros... y sí, se pueden tener punteros a punteros a punteros (*).

Así que tened cuidado con el C++, que lo carga el diablo :wink:

Brian_v, no veo la necesidar de usar ningún if para resolver el ejercicio. Basta con anidar bucles for.

No lo sabía.

Gracias a todos! Ya me dió el codigo, y muchas gracias por las curiosidades del C++ @IgnoranteAbsoluto, no conocia mucho de lo que dijiste, en el foro en Ingles se volvieron locos por esa sola linea, jajaja, y si, llama mucho la atención, pero lo hice asi para que los demas supieran que tambien se puede escribir de esa forma. Proximamente estaré subiendo el codigo, para que las personas aprendan como se hace.