Я тоже так думал. Сижу в жестокой отладке вторую неделю. В общем есть скетч, сложный, использует много разных классов. Один из них инкапсулирует TIMER1, предоставляет интерфейсы для остальных. Инициализация таймера в конструкторе, т.е. до setup таймер запускается на счет. В сетапе код, в начале
word b[255];
word* pp=b;
void setup(void)
{
volatile word e;
volatile word f;
*pp=999; if((pp-b)<255) pp++;
*pp=TCNT1; if((pp-b)<255) pp++;
for(e=TCNT1;;){f=TCNT1;if(e!=f) break;} //ждем инкримента таймера дл¤ защиты от него следующих операций
*pp=TCNT1; if((pp-b)<255) pp++;
for(e=TCNT1;;){f=TCNT1;if(e!=f) break;} //ждем инкримента таймера дл¤ защиты от него следующих операций
*pp=TCNT1; if((pp-b)<255) pp++;
for(e=TCNT1;;){f=TCNT1;if(e!=f) break;} //ждем инкримента таймера дл¤ защиты от него следующих операций
*pp=TCNT1; if((pp-b)<255) pp++;
*pp=99; if((pp-b)<255) pp++;
Serial.begin(19200);
*pp=99; if((pp-b)<255) pp++;
*pp=TCNT1; if((pp-b)<255) pp++;
for(e=TCNT1;;){f=TCNT1;if(e!=f) break;} //ждем инкримента таймера дл¤ защиты от него следующих операций
*pp=TCNT1; if((pp-b)<255) pp++;
for(e=TCNT1;;){f=TCNT1;if(e!=f) break;} //ждем инкримента таймера дл¤ защиты от него следующих операций
*pp=TCNT1; if((pp-b)<255) pp++;
for(e=TCNT1;;){f=TCNT1;if(e!=f) break;} //ждем инкримента таймера дл¤ защиты от него следующих операций
*pp=TCNT1; if((pp-b)<255) pp++;
*pp=9; if((pp-b)<255) pp++;
for(byte i=0;i<255;i++) { Serial.println(b[i]); delay(1); }
В общем собираем отладочную информацию а затем выводим.
999
240
241
242
243
99
99
253
251
250
249
9
Получается таймер увеличивается, как и задумывалось до Serial.begin после чего 8))) .. начинает ити в обратную сторону?!
Понятно убрав Serial.begin эффект исчезает. Прерывания таймера контролирует такой же механизм отладки, прерывания внутри Serial.begin не вызывалось.
Все. Разобрался. Ошибка настройки таймера похоже. Досчитал до 255 и пошол обратно. Serial.begin просто оказался в неудачном месте. Он не при чем. Будем считать тему примером варианта отладки в сложных случаях.
Пожалуй добавлю: 328p, Serial стандартный, аппаратные.
Аппаратный ничего не использует, даже системный таймер0.
Я тоже так думал. Сижу в жестокой отладке вторую неделю. В общем есть скетч, сложный, использует много разных классов. Один из них инкапсулирует TIMER1, предоставляет интерфейсы для остальных. Инициализация таймера в конструкторе, т.е. до setup таймер запускается на счет. В сетапе код, в начале
word b[255]; word* pp=b; void setup(void) { volatile word e; volatile word f; *pp=999; if((pp-b)<255) pp++; *pp=TCNT1; if((pp-b)<255) pp++; for(e=TCNT1;;){f=TCNT1;if(e!=f) break;} //ждем инкримента таймера дл¤ защиты от него следующих операций *pp=TCNT1; if((pp-b)<255) pp++; for(e=TCNT1;;){f=TCNT1;if(e!=f) break;} //ждем инкримента таймера дл¤ защиты от него следующих операций *pp=TCNT1; if((pp-b)<255) pp++; for(e=TCNT1;;){f=TCNT1;if(e!=f) break;} //ждем инкримента таймера дл¤ защиты от него следующих операций *pp=TCNT1; if((pp-b)<255) pp++; *pp=99; if((pp-b)<255) pp++; Serial.begin(19200); *pp=99; if((pp-b)<255) pp++; *pp=TCNT1; if((pp-b)<255) pp++; for(e=TCNT1;;){f=TCNT1;if(e!=f) break;} //ждем инкримента таймера дл¤ защиты от него следующих операций *pp=TCNT1; if((pp-b)<255) pp++; for(e=TCNT1;;){f=TCNT1;if(e!=f) break;} //ждем инкримента таймера дл¤ защиты от него следующих операций *pp=TCNT1; if((pp-b)<255) pp++; for(e=TCNT1;;){f=TCNT1;if(e!=f) break;} //ждем инкримента таймера дл¤ защиты от него следующих операций *pp=TCNT1; if((pp-b)<255) pp++; *pp=9; if((pp-b)<255) pp++; for(byte i=0;i<255;i++) { Serial.println(b[i]); delay(1); }В общем собираем отладочную информацию а затем выводим.
Все. Разобрался. Ошибка настройки таймера похоже. Досчитал до 255 и пошол обратно. Serial.begin просто оказался в неудачном месте. Он не при чем. Будем считать тему примером варианта отладки в сложных случаях.