Saya menggunakan penghitung lingkaran, dinyatakan dalam tajuk:
int loop_counter = 0;
Saya menggunakan penghitung ini untuk memicu acara sesering mungkin. Saya dulu menggunakan modulo untuk tipe perilaku yang sama ini, tetapi saya menyederhanakannya sehingga lebih mudah untuk dikerjakan (masih menghasilkan perilaku yang sama)
void loop() {
if(loop_counter > 100) loop_counter = 0;
else loop_counter++;
//Serial.println("hey");
if(loop_counter == 0) {
//do_something_important();
}
}
Semuanya baik dan baik, sampai saya mencoba berkomunikasi dengan Serial
membatalkan komentar //Serial.println("hey");
( "hey"
dalam contoh ini karena, bagi saya, perilaku ini tidak masuk akal).
Ini menghasilkan loop_counter
tidak pernah memicu do_something_important();
bagian kode. Saya mencoba menyatakan loop_counter
sebagai volatile
, itu tidak mengubah apa pun. Aku mencoba Serial.print
ing loop_counter
, dan saya juga mendapatkan perilaku aneh (itu akan membekukan loop). Serial.println("hey");
bekerja dalam arti bahwa di monitor Serial saya mendapatkan banyak "hei", (yaitu dengan cepat lebih dari 100 "heys", jumlah iterasi di mana bagian lain dari kode harus dipicu)
Apa yang mungkin menyebabkan penggunaan Serial
, dengan data yang tidak (sejauh yang saya tahu) terikat untuk loop_counter
sepenuhnya mencegahnya bekerja dengan baik?
EDIT : Ini adalah bagian dari file utama yang akhirnya menimbulkan masalah (well, berkontribusi paling banyak untuk itu (menggunakan terlalu banyak memori)):
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);
}
}
Ini adalah "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;loop_counter = 0 ; led_matrix singkat [num_rows] [num_cols];led_matrix singkat [ num_rows ] [ num_cols ];
const short letter_a [nrows] [ncols] = {{0,1,1,0}, letter_a [ nrows ] [ ncols ] = {{ 0 , 1 , 1 , 0 } pendek , {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 [nrows] [ncols] = {{1,0,0,0}, {1,1,1,0}, {1,0,1,0}, {1,1,1,0} };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_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} };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 { struct letter_node { const * data pendek;const * data pendek ; letter_node * selanjutnya;* selanjutnya ; 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 ]; #berakhir jika#berakhir jika
Beberapa informasi lebih lanjut: - Saya menggunakan Uno (ATMega328)
loop()
fungsi. Bagaimana saya harus mengecat stack saya jika satu-satunya metode output yang saya miliki ( Serial.print()
) gagal saya?