Tôi đang sử dụng bộ đếm vòng lặp, được khai báo trong tiêu đề:
int loop_counter = 0;
Tôi sử dụng bộ đếm này để kích hoạt một sự kiện thường xuyên. Tôi đã từng sử dụng một modulo cho loại hành vi tương tự này, nhưng tôi đã đơn giản hóa nó để dễ làm việc hơn (nó vẫn dẫn đến hành vi tương tự)
void loop() {
if(loop_counter > 100) loop_counter = 0;
else loop_counter++;
//Serial.println("hey");
if(loop_counter == 0) {
//do_something_important();
}
}
Tất cả đều tốt và tốt, cho đến khi tôi cố gắng giao tiếp bằng Serial
cách bỏ qua //Serial.println("hey");
( "hey"
trong ví dụ này bởi vì, với tôi, hành vi này là vô lý).
Điều này dẫn đến việc loop_counter
không bao giờ kích hoạt do_something_important();
phần mã. Tôi đã cố gắng tuyên bố loop_counter
như volatile
, điều đó không thay đổi bất cứ điều gì. Tôi đã thử Serial.print
ing loop_counter
, và tôi cũng nhận được hành vi kỳ quặc (nó sẽ đóng băng vòng lặp). Serial.println("hey");
hoạt động theo nghĩa là trong màn hình nối tiếp tôi nhận được rất nhiều "hey", (tức là nhanh chóng hơn 100 "heys", số lần lặp mà phần mã khác sẽ kích hoạt)
Điều gì có thể có thể gây ra việc sử dụng Serial
, với dữ liệu không (theo như tôi có thể nói) được buộc để loop_counter
ngăn chặn hoàn toàn nó hoạt động đúng?
EDIT : Đây là một phần của tệp chính đã đặt ra vấn đề (tốt, đóng góp nhiều nhất cho nó (sử dụng quá nhiều bộ nhớ)):
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);
}
}
Đây là "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_count = 0;loop_count = 0 ; ngắn led_matrix [num_rows] [num_cols];ngắn led_matrix [ NUM_ROWS ] [ NUM_COLS ];
const short letter_a [mũi tên] [ncols] = {{0,1,1,0}, ngắn letter_a [ nrows ] [ ncols ] = {{ 0 , 1 , 1 , 0 }, {1,0,0,1},{ 1 , 0 , 0 , 1 }, {1,1,1,1},{ 1 , 1 , 1 , 1 }, {1,0,0,1}};{ 1 , 0 , 0 , 1 }}; const short letter_b [mũi tên] [ncols] = {{1,0,0,0}, {1,1,1,0}, {1,0,1,0}, {1,1,1,0} };const ngắn letter_b [ nrows ] [ ncols ] = {{ 1 , 0 , 0 , 0 }, { 1 , 1 , 1 , 0 }, { 1 , 0 , 1 , 0 }, { 1 , 1 , 1 , 0 } }; const short letter_c [mũi tên] [ncols] = {{0,1,1,1}, {1,0,0,0}, {1,0,0,0}, {0,1,1,1} };const ngắn letter_c [ nrows ] [ ncols ] = {{ 0 , 1 , 1 , 1 }, { 1 , 0 , 0 , 0 }, { 1 , 0 , 0 , 0 }, { 0 , 1 , 1 , 1 } }; const short letter_t [mũi tên] [ncols] = {{1,1,1,1}, {0,1,0,0}, {0,1,0,0}, {0,1,0,0} };const ngắn letter_t [ nrows ] [ ncols ] = {{ 1 , 1 , 1 , 1 }, { 0 , 1 , 0 , 0 }, { 0 , 1 , 0 , 0 }, { 0 , 1 , 0 , 0 } };
typedef struct letter_node { cấu trúc letter_node { const ngắn * dữ liệu;const ngắn * dữ liệu ; letter_node * tiếp theo;* tiếp theo ; int x;int x ; int y;int y ; } letter_node;} letter_node ;
letter_node aa = {& letter_a [0] [0], NULL, 1,1};= {& letter_a [ 0 ] [ 0 ], NULL , 1 , 1 }; letter_node bb = {& letter_b [0] [0], NULL, 1,1};= {& letter_b [ 0 ] [ 0 ], NULL , 1 , 1 }; letter_node cc = {& letter_c [0] [0], NULL, 1,1};= {& letter_c [ 0 ] [ 0 ], NULL , 1 , 1 }; letter_node tt = {& letter_t [0] [0], NULL, 1,1};= {& letter_t [ 0 ] [ 0 ], NULL , 1 , 1 };
letter_node letter_map [NUMBER_OF_CHARACTERS];[ NUMBER_OF_CHARACTERS ]; #endif#endif
Một số thông tin khác: - Tôi đang sử dụng Uno (ATMega328)
loop()
chức năng. Tôi nên vẽ ngăn xếp của mình như thế nào nếu phương thức đầu ra duy nhất mà tôi có ( Serial.print()
) làm tôi thất bại?