Вывод данных в serial - ардуино начинает замедляться

Binary Smile
Offline
Зарегистрирован: 15.05.2016

Добрый день!

Столкнулся с проблемой, что ардуино выводит данные в serial, но через некоторое время начинает выводить из раз в секунду, что еще и замедляет работу общего цикла.

<!--break-->

к ардуине подключен binary counter CD74HCT393, который считает количество импульсов.
Ардуина берет это число и отправляет в serial
и пропорционально числу выставляет напряжение на одной из ножек с PWM

в цикле стоит задержка 100мс.

Какое-то небольшое время (от 3 до 10 минут) все работает отлично, но потом, значения начинают приходить раз в секунду, и соответственно, вывод на ножке c PWM так же медленно изменяется.

Попробовал убрать печать в serial, и следил только за значеним PWM - все отлично работает.

 

Раньше у меня программа была на ардуино, которая принимала значение через serial и меняла pwm, так она тоже через какое-то время начинала тупить. Я тогда решил вопрос тем, что если порт "подвисал", то программа делала реконект порта, и дальше все опять отлично летело.

Нагуглить схожую проблему не получилось, возможно не по тем словам ищу.

Есть идеи как решить это затуп?

 

 

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

В строке <хер-знет-какая>  ошибка в переменной <хер-знает-какой>.

Чудо! код вставь. И, плз, по правилам, указанным в прикрепленной теме.

Binary Smile
Offline
Зарегистрирован: 15.05.2016

Прошу прощения, вот код)

На строке 73  закоментированный вывод значения счетчика,
На строке 84, выводил значение PWM для отладки

(на строках 79-81 исправление косяка с DAC, что при увеличении битности, при команде analogWrite(pin, 255) - PWM заполняется на 100%, хотя при 10 битах, это четверть)

Платформа: Arduino Pro Micro (ATmega32u4), но так же затупы замечены на Uno (ATmega 328)

 

int q0 = 7;
int q1 = 6;
int q2 = 5;
int q3 = 4;
int q4 = 1;
int q5 = 0;
int q6 = 2;
int q7 = 3;

int q8 = 21;
int q9 = 20;
int q10 = 19;
int q11 = 18;
int q12 = 15;
int q13 = 14;
int q14 = 16;
// int q15 = 10; 10й пин ушел для шима на выход
int dac = 10;


int mr = 8;
int time = 50;
int maxValue = 5000;
int noise = 1000;
float outValue = 0;


void setup () {
  
  TCCR1A = TCCR1A & 0xe0 | 3;
  TCCR1B = TCCR1B & 0xe0 | 0x09;

  // initialize serial communication at 9600 bits per second:
  Serial.begin(2000000);
  // make the pushbutton's pin an input:
  pinMode(q0, INPUT);
  pinMode(q1, INPUT);
  pinMode(q2, INPUT);
  pinMode(q3, INPUT);
  pinMode(q4, INPUT);
  pinMode(q5, INPUT);
  pinMode(q6, INPUT);
  pinMode(q7, INPUT);
  pinMode(q8, INPUT);
  pinMode(q9, INPUT);
  pinMode(q10, INPUT);
  pinMode(q11, INPUT);
  pinMode(q12, INPUT);
  pinMode(q13, INPUT);
  pinMode(q14, INPUT);
 pinMode(mr, OUTPUT);
 pinMode(dac, OUTPUT);


  
  }

void loop() {
//peripheral_loop();
int qState[] = {digitalRead(q14),digitalRead(q13),digitalRead(q12),digitalRead(q11),digitalRead(q10),digitalRead(q9),digitalRead(q8),digitalRead(q7),digitalRead(q6), digitalRead(q5),digitalRead(q4),digitalRead(q3),digitalRead(q2),digitalRead(q1),digitalRead(q0)};



digitalWrite(mr, HIGH);
digitalWrite(mr, LOW);
unsigned int value = 0;
for (byte i=0; i<15; i++)
{
  value *= 2;
  value += qState[i] ;
}
unsigned int freq = value *1e3/time;
//Serial.println(freq, DEC); 

outValue = (freq - noise);
if (Out
outValue = outValue*1023/maxValue;
outValue = int(outValue);
if (outValue == 255) {
 outValue = 254;
}
analogWrite(dac, outValue); 

//Serial.println(outValue, DEC); 

  delay(time);        

}

 

sadman41
Offline
Зарегистрирован: 19.10.2016

А в#76 селёдку заворачивали?

Binary Smile
Offline
Зарегистрирован: 15.05.2016

Оу. Там должна была быть проверка на outValue > 1023... но я отвлекся.
Вчера поработал с контроллером - затупов не обнаружил. Странно это. но ладно.

Вопрос пока что закрыт, спасибо за уделенное время!