Używam licznika pętli zadeklarowanego w nagłówku:
int loop_counter = 0;
Używam tego licznika do wywoływania zdarzenia tak często. Kiedyś używałem modulo dla tego samego rodzaju zachowania, ale uprościłem go, aby łatwiej było z nim pracować (nadal powoduje to takie samo zachowanie)
void loop() {
if(loop_counter > 100) loop_counter = 0;
else loop_counter++;
//Serial.println("hey");
if(loop_counter == 0) {
//do_something_important();
}
}
Wszystko jest dobrze i dobrze, dopóki nie spróbuję się komunikować Serial
, odkomentując //Serial.println("hey");
( "hey"
w tym przykładzie, ponieważ dla mnie takie zachowanie jest absurdalne).
Powoduje to, loop_counter
że do_something_important();
sekcja kodu nigdy się nie uruchamia . Próbowałem deklarowania loop_counter
jako volatile
, że nic nie zmieni. Próbowałem Serial.print
ing loop_counter
, a także zachowywałem się dziwnie (spowodowałoby to zawieszenie pętli). Serial.println("hey");
działa w tym sensie, że na monitorze szeregowym dostaję dużo „hej” (tj. szybko dużo więcej niż 100 „hej”, liczba iteracji, przy których powinna zadziałać druga sekcja kodu)
Co może być przyczyną korzystania Serial
z danych, które nie są (o ile wiem) powiązane, aby loop_counter
całkowicie uniemożliwić prawidłowe działanie?
EDYCJA : Oto część głównego pliku, która ostatecznie stanowi problem (cóż, przyczyniając się do niego najwięcej (zużywając zbyt dużo pamięci)):
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);
}
}
Oto „letters.h”:
#ifndef _MY_LETTERS_H #define _MY_LETTERS_H
#define nrows 4 #define ncols 4 #define num_rows 16 #define num_cols 16 #define MAX_WORD_LENGTH 16 #define NUMBER_OF_CHARACTERS 26 #include <stdlib.h>
int loop_counter = 0 ; short led_matrix [ num_rows ] [ num_cols ];
const short letter_a [ nrows ] [ ncols ] = {{ 0 , 1 , 1 , 0 }, { 1 , 0 , 0 , 1 }, { 1 , 1 , 1 , 1 }, { 1 , 0 , 0 , 1 } }; const short letter_b [ nrows ] [ ncols ] = {{ 1 , 0 , 0 , 0 }, { 1 , 1 , 1 , 0 }, { 1 , 0 , 1 , 0 }, { 1 , 1 , 1 , 0 }}; const short letter_c [ nrows ] [ ncols ] = {{ 0 , 1 , 1 , 1 }, { 1 , 0 , 0 , 0 }, { 1 , 0 , 0 , 0 }, { 0 , 1 , 1 , 1 }}; const short letter_t [ nrows ] [ ncols ] = {{ 1 , 1 , 1 , 1 }, { 0 , 1 , 0 , 0 }, { 0 , 1 , 0 , 0 }, { 0 , 1 , 0 , 0 } };
typedef struct letter_node { const short * data ; letter_node * next ; int x ; int y ; } letter_node ;
letter_node aa = {&letter_a[0][0],NULL,1,1}; letter_node bb = {&letter_b[0][0],NULL,1,1}; letter_node cc = {&letter_c[0][0],NULL,1,1}; letter_node tt = {&letter_t[0][0], NULL , 1 , 1 };
letter_node letter_map [ NUMBER_OF_CHARACTERS ]; #endif
Więcej informacji: - Używam Uno (ATMega328)
loop()
funkcji. Jak mam pomalować swój stos, jeśli jedyna metoda wyjścia, którą mam ( Serial.print()
), zawodzi mnie?