Проблема со cбросом значений

MemoryOveer
Offline
Зарегистрирован: 30.08.2020

Здравствуйте.
Пытаюсь сделать устройство, которое считает и выводит количество прерываний. Если после срабатываний прерываний, прерывания отсутствуют 2 секунды, то должно выводится количество, а переменная сбрасываться. У меня почему-то оно просто считает эти прерывания. Буду признателен кто объяснит проблему и поможет ее решить.

uint32_t myTimer1;

void setup() {
  Serial.begin(9600);                  
  attachInterrupt(0, YL_63, RISING);
  
  }


void loop() {

}

void YL_63 () {
  myTimer1++;
    
   if (!attachInterrupt && millis() >= 2000) {  
    myTimer1 = 0;  // сброс 
        // 
  } 
Serial.println(myTimer1);

}

 

rkit
Онлайн
Зарегистрирован: 23.11.2016

Это что ты такое нарисовал?

!attachInterrupt

v258
Offline
Зарегистрирован: 25.05.2020

-

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016
uint32_t myTimer1;
uint32_t oldMillis;

void YL_63 () {
  myTimer1++; 
  oldMillis = millis();  
  } 

void setup() {
  Serial.begin(9600);                  
  attachInterrupt(0, YL_63, RISING);
  oldMillis = millis(); 
  }


void loop() {
  if (millis() - oldMillis >= 2000){
  Serial.println(myTimer1); 
  myTimer1 = 0; 
  }
}

 

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

rkit пишет:

Это что ты такое нарисовал?

!attachInterrupt


а millis()>2000 - лучше?:)
МемориОвер, это уже вторая или третья ваша бредовая тема, из которых следует, что вы совсем по нулям. Может уже пора учебник почитать?

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

Ua6em, нафига ты этим безграмотным дятлам что-то пишешь, пусть сами учаться

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

Он все равно неправильно написал, не переживай.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

sadman41 пишет:
Он все равно неправильно написал, не переживай.

ты насчёт атомарности?

ну да а миллис устанавливать дядя будет, есть такое )))
 

oid loop() {
  if (millis() - oldMillis >= 2000){
  Serial.println(myTimer1); 
  myTimer1 = 0; 
  oldMillis = millis(); 
  }
}

 

Upper
Offline
Зарегистрирован: 23.06.2020

ua6em пишет:

oid loop() {

  if (millis() - oldMillis >= 2000){
  Serial.println(myTimer1); 
  myTimer1 = 0; 
  oldMillis = millis(); 
  }
}

Снова мимо. Кроме атомарности, надо еще добавить в условие проверку значения myTimer1. И про валотильность не забыть.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Upper пишет:

ua6em пишет:

oid loop() {

  if (millis() - oldMillis >= 2000){
  Serial.println(myTimer1); 
  myTimer1 = 0; 
  oldMillis = millis(); 
  }
}

Снова мимо. Кроме атомарности, надо еще добавить в условие проверку значения myTimer1. И про валотильность не забыть.

рыба то в принципе съедобна (это я о логике поведения программы) )))
 

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

Upper пишет:
И про валотильность не забыть.

Валовой продукт знаю, вАлОтильность - не, не слышал! ;)))

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Так пойдёт?
 

volatile uint32_t myTimer1;
volatile uint32_t oldMillis;

void YL_63 () {
  myTimer1++; 
  oldMillis = millis();  
  } 

void setup() {
  Serial.begin(9600);                  
  attachInterrupt(0, YL_63, RISING);
  oldMillis = millis(); 
  }


void loop() {
  if (millis() - oldMillis >= 2000){
  noInterrupts();
  Serial.println(myTimer1); 
  myTimer1 = 0; 
  oldMillis = millis();
  interrupts(); 
  }
}

 

nik182
Offline
Зарегистрирован: 04.05.2015

Не там Вы дяденька прерывания запрещаете. Заведи ещё переменную для вывода и запрещай только при присвоении ей.

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

ua6em пишет:

Так пойдёт?

Нет! "И эти люди запрещают мне ковыряться в носу..."

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

mykaida пишет:

ua6em пишет:

Так пойдёт?

Нет! "И эти люди запрещают мне ковыряться в носу..."

критикуя - предлагай )))
 

PS это же набросок был, в моём контроллере посудиной переменные перегружаемые естественно, так как управление реалтайм, использую три канала int0,1 и PCINT

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

ua6em пишет:

критикуя - предлагай )))

PS это же набросок был, в моём контроллере посудиной переменные перегружаемые естественно, так как управление реалтайм, использую три канала int0,1 и PCINT

Зачем в 18 строке Вы запрещаете прерывания? Достаточно было сбросить счетчик прерываний.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

mykaida пишет:

ua6em пишет:

критикуя - предлагай )))

PS это же набросок был, в моём контроллере посудиной переменные перегружаемые естественно, так как управление реалтайм, использую три канала int0,1 и PCINT

Зачем в 18 строке Вы запрещаете прерывания? Достаточно было сбросить счетчик прерываний.

первое, что под руку подвернулось, у себя я применяю атомарное присваивание другой переменной
ATOMIC_BLOCK(ATOMIC_RESTORESTATE){ a=b;}

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

ua6em пишет:

у себя я применяю атомарное присваивание другой переменной

ATOMIC_BLOCK(ATOMIC_RESTORESTATE){ a=b;}

Извините, сэр. Пойду - выпью. Не понимаю...

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

Вот - выпил, понял. Но мне кажется, что Вы и тут ошибаетесь. Надо так: ATOMIC_BLOCK(ATOMIC_RESTORESTATE(ATOMIC_COLA_AND_VODKA)){ a=b;}

Upper
Offline
Зарегистрирован: 23.06.2020

ua6em пишет:

Upper пишет:

ua6em пишет:

oid loop() {

  if (millis() - oldMillis >= 2000){
  Serial.println(myTimer1); 
  myTimer1 = 0; 
  oldMillis = millis(); 
  }
}

Снова мимо. Кроме атомарности, надо еще добавить в условие проверку значения myTimer1. И про валотильность не забыть.

рыба то в принципе съедобна (это я о логике поведения программы) )))

Без дополнительной проверки значения myTimer1 и логика не верна. Т.к. надо выводить кол-во импульсов только если они были, а у вас при отсутствии импульсов - каждые 2 секунды будет выводиться 0. Атомарным (в данной реализации) надо делать и блок условия, т.е. любые обращения к многобайтным переменным изменяемым в прерывании.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

в задании ТС этого нету - которое считает и выводит количество прерываний, если их 0, то надо и выводить 0!?

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

mykaida пишет:

Вот - выпил, понял. Но мне кажется, что Вы и тут ошибаетесь. Надо так: ATOMIC_BLOCK(ATOMIC_RESTORESTATE(ATOMIC_COLA_AND_VODKA)){ a=b;}

водка без пива деньги на ветер )))

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

ua6em пишет:

водка без пива деньги на ветер )))

Нет повода не согласится.

MemoryOveer
Offline
Зарегистрирован: 30.08.2020

Вообще, если прерываний нет, то выводить их не нужно.

Вообще не судите строго, так как у меня экономическое образования, а это просто решил немного побаловаться)

MemoryOveer
Offline
Зарегистрирован: 30.08.2020

ua6em пишет:

в задании ТС этого нету - которое считает и выводит количество прерываний, если их 0, то надо и выводить 0!?

Вообще, если прерываний нет, то выводить их не нужно.

Вообще не судите строго, так как у меня экономическое образования, а это просто решил немного побаловаться)

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

MemoryOveer пишет:
у меня экономическое образования
Мы так и поняли.