Estoy usando un contador de bucle, declarado en una cabecera:
int loop_counter = 0;
Utilizo este contador para activar un evento cada cierto tiempo. Solía usar un módulo para este mismo tipo de comportamiento, pero lo simplifiqué para que sea más fácil trabajar con él (sigue dando como resultado el mismo comportamiento)
void loop() {
if(loop_counter > 100) loop_counter = 0;
else loop_counter++;
//Serial.println("hey");
if(loop_counter == 0) {
//do_something_important();
}
}
Todo va bien, hasta que intento comunicarme con Serial
descomentando el //Serial.println("hey");
( "hey"
en este ejemplo porque, para mí, este comportamiento es absurdo).
Esto da lugar a loop_counter
Nunca se activa el do_something_important();
sección de código. He probado a declarar loop_counter
como volatile
eso no cambió nada. Intenté Serial.print
en loop_counter
Y también estaba obteniendo un comportamiento impar (se congelaba el bucle). Serial.println("hey");
funciona en el sentido de que en el monitor Serial obtengo un montón de "hey", (es decir, rápidamente mucho más de 100 "heys", el número de iteraciones en el que la otra sección de código debe disparar)
¿Qué podría estar causando el uso de Serial
con datos que no están (hasta donde yo sé) vinculados a loop_counter
¿Impedir por completo que funcione correctamente?
EDITAR : Aquí está la parte del archivo principal que terminó planteando el problema (bueno, contribuyendo al máximo a él (usando demasiada memoria)):
void display_state() {
int i,j,index=0;
short alive[256][2];
for(i=0;i<num_rows;i++) {
for(j=0;j<num_cols;j++) {
if(led_matrix[i][j]==1) {
alive[index][0]=i;
alive[index][1]=j;
index++;
}
}
}
alive[index][0]=NULL; //Null-terminate.
alive[index][1]=NULL;
//383 is a great number
for(int idx=0;idx < index; idx++) {
display(alive[idx][0],alive[idx][1]);
delayMicroseconds(283);
}
}
Aquí está "letters.h":
#ifndef _MY_LETTERS_H
#define _MY_LETTERS_H
Algo más de información: - Estoy usando un Uno (ATMega328)
0 votos
¿Cuál es el tamaño de su pila? ¿Hay alguna posibilidad de pintar tu pila y ver si se está corrompiendo? ¿La impresión en serie utiliza interrupciones, es su código reentrante?
0 votos
La impresión Serial no es disparada por ninguna interrupción, la estoy usando sólo en el
loop()
función. ¿Cómo debo pintar mi pila si el único método de salida que tengo (Serial.print()
) me está fallando?2 votos
Para eliminar posibles errores y efectos secundarios malinterpretados de cambios aparentemente triviales, sustituya el código de su pregunta por un literal, carácter exacto copia de un boceto reducirse al mínimo necesario para desencadenar el problema . No "este es mi programa que falla si yo.." sino exactamente el programa mínimo que falla de esta manera.