не работает программный счетчик

Alexey_Rem
Offline
Зарегистрирован: 09.09.2019

Плата mega2560 китайская. Не работает счетчик вида:

int k;
int n;
void function()
{
k++;
if(k>=7)
{
k=0;
n++;
if(n>=7)
{
n=0;
}
}
}

Возвращается несколько одинаковых значений n. Сама функция вызывается таймером из loop. k и n обнуляются в setup.

В чем ошибка, чего я не понимаю

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

Кому возвращаются и каким образом?

Но, если мега китайская, то виноваты (на 99%) китайцы.

Alexey_Rem
Offline
Зарегистрирован: 09.09.2019

Возвращает через Serilal.Println(n)--->00000111112222 и т,д.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Дак у китайской мега2560 это фича такая, когда ты ей говоришь инкрементировать какойнить особенно бесполезный щёччик, она вместо этого криптовалюту майнит. 

Alexey_Rem
Offline
Зарегистрирован: 09.09.2019

А если серьезно, что не так со счетчиком?

b707
Offline
Зарегистрирован: 26.05.2017

Alexey_Rem пишет:

А если серьезно, что не так со счетчиком?

а чего вы хотели, если вы сами меняете значение n только раз в 7 циклов? - вот оно по 7 раз одинаковое и печатается

Для более подробного обсуждения приведите код целиком

Alexey_Rem
Offline
Зарегистрирован: 09.09.2019
int k;
int n;
void function()
{
k++;
if(k>=7)
{
k=0;
n++;
Serial.PrintLn(n)
if(n>=7)
{
n=0;
}
}
}

По-моему в этом случае n должно изменятся и печататься 1 раз на 8 вызовов функции, увеличиваясь на 1.

b707
Offline
Зарегистрирован: 26.05.2017

Alexey_Rem - не вижу полного кода, с setup и lopp

Alexey_Rem
Offline
Зарегистрирован: 09.09.2019

int k;
int n;
unsigned long time_1;
void setup() {
k=0;
n=0;
}
void function()
{ k++; if(k>=7) { k=0; n++; Serial.PrintLn(n) if(n>=7) { n=0; } } }

void loop() {

  if ((micros() - time_1) > 900 )
  {
    time_1 = micros();
     function();
     }
}

Как-то так

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

а Serial.begin() хде?

Alexey_Rem
Offline
Зарегистрирован: 09.09.2019
int k;
int n;
unsigned long time_1;
void setup() {
k=0;
n=0;
Serial.begin(9600);
}
void function()
{ k++; if(k>=7) { k=0; n++; Serial.PrintLn(n) if(n>=7) { n=0; } } }

void loop() {

  if ((micros() - time_1) > 900 )
  {
    time_1 = micros();
     function();
     }
}

Извините пропустил

b707
Offline
Зарегистрирован: 26.05.2017

и еще Serial.PrintLn() - такого метода нет. И точек с запятыми не хватает

Алексей, не надо этихь отписок, "лишь бы отстали". Если вам лень обращать внимание на "мелочи". то нам и подавно.

Скопируйте именно тот код, который у вас компилируется и работает с ошибкой, а не "нечто вроде"

 

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

ну, если у тебя Сериал на 9600 работает, я удивлен, что вапще чота выводится.  k достигает значения 7 примерно за 6.3 миллисекунды, и начинается асинхронный вывод в сериал.  Передача 1 символа на такой скорости занимает примерно 4 миллисекунды. А символов у тебя выводится минимум 3 (цифра вместе с CR и LF). Как у тебя чо меняться успевает? 

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

а еще, если код писать вот так

void function() { 
	k++; 
	if (k >= 7) { 
		k = 0; 
		n++; 
		Serial.println(n);
		if (n >= 7) { 
			n = 0; 
		} 
	} 
}

то будет какта понятнее, штоли. 

b707
Offline
Зарегистрирован: 26.05.2017

DetSimen пишет:

 Передача 1 символа на такой скорости занимает примерно 4 миллисекунды.

Дед, а разве не одну? - 9600/8 = 1200 символов сек

хотя на ситуацию в коде клиента это мало влияет

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

b707 пишет:

DetSimen пишет:

 Передача 1 символа на такой скорости занимает примерно 4 миллисекунды.

Дед, а разве не одну? - 9600/8 = 1200 символов сек

хотя на ситуацию в коде клиента это мало влияет

ну да, чуть больше одной, там же не строго 8 бит передаются, еще есть служебные

Alexey_Rem
Offline
Зарегистрирован: 09.09.2019

Господа, прошу у всех прощения, программка для управления лед матрицей 8х8, поэтому сразу видна нерабостоспособность кода вне зависимости от вывода на serial. Счетчик для переборки излучателей, сама программка основана на другой, полностью рабочей, но там опрос происходит немного не так. Наткнулся на такое поведение кода Вот и спрашиваю может есть какие-то ограничения что-то недокументированное, что не лежит на поверхности, может кто-то встречался с таким.

Спасибо

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

У меня вот такой код вполне нормально работает...

int k;
int n;
unsigned long time_1;
void setup() {
  k = 0;
  n = 0;
  time_1 = micros();
  Serial.begin(9600);
}
void function() { 
  k++; 
  if (k > 7) {
    k = 0; 
    n++; 
    if (n > 7) {
      n = 0; 
    } 
    Serial.println(n); // вроде как вывод должен быть апосля всех действий, а не в середине
  } 
}

void loop() {
  if ((micros() - time_1) > 50000 ) { // Чтобы в глазах не рябило, тоже самое и со значением 900
    time_1 = micros();
    function();
  }
}

А у вас как, ТС (Alexey_Rem)?

Arduino Nano (atmega168)

Kakmyc
Offline
Зарегистрирован: 15.01.2018

BOOM пишет:

У меня вот такой код вполне нормально работает...

int k;
int n;
unsigned long time_1;
void setup() {
  k = 0;
  n = 0;
  time_1 = micros();
  Serial.begin(9600);
}
void function() { 
  k++; 
  if (k > 7) {
    k = 0; 
    n++; 
    if (n > 7) {
      n = 0; 
    } 
    Serial.println(n); // вроде как вывод должен быть апосля всех действий, а не в середине
  } 
}

void loop() {
  if ((micros() - time_1) > 50000 ) { // Чтобы в глазах не рябило, тоже самое и со значением 900
    time_1 = micros();
    function();
  }
}

А у вас как, ТС (Alexey_Rem)?

Arduino Nano (atmega168)

Стесняюсь спросить, но спрошу.
А чем не устроил millis() -time_1>=50, а в идеале delay(50) ?

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Я же написал - чтобы глаза не мозолило. А по факту, так как изменение инкрементально и равно 1, то что =, что >, что >= разницы нет. Меняется только максимальное значение. 

Kakmyc
Offline
Зарегистрирован: 15.01.2018

BOOM пишет:

Я же написал - чтобы глаза не мозолило. А по факту, так как изменение инкрементально и равно 1, то что =, что >, что >= разницы нет. Меняется только максимальное значение. 

Я разве про это спрашивал ?

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Хм, значит я не понял вопрос. Переформулируйте его.

Green
Offline
Зарегистрирован: 01.10.2015

Перевожу)) Нафига микрос, если можно миллис, а ещё лучше тупо делай?

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Так не я же код писал, я его опробовал и поделился своим мнением и корректировками для себя. Вообще, если только это и делается = угу. А если это часть кода, то лучше delay-и всякие не добавлять. Да и суть же не меняется вроде в первоначальной задаче? Или я не прав? Или ещё что пропустил? Просветите, пожалуйста.