А Serial использует TIMER1?

Logik
Offline
Зарегистрирован: 05.08.2014

Есть ли связь между подозреваемыми или они абсолютно независимы?

Logik
Offline
Зарегистрирован: 05.08.2014

Пожалуй добавлю: 328p, Serial стандартный, аппаратные. 

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

Аппаратный ничего не использует, даже системный таймер0.

Logik
Offline
Зарегистрирован: 05.08.2014

Я тоже так думал. Сижу в жестокой отладке вторую неделю. В общем есть скетч, сложный, использует много разных классов. Один из них инкапсулирует 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 не вызывалось.
Logik
Offline
Зарегистрирован: 05.08.2014

Все. Разобрался. Ошибка настройки таймера похоже. Досчитал до 255 и пошол обратно. Serial.begin просто оказался в неудачном месте. Он не при чем. Будем считать тему примером варианта отладки в сложных случаях.