Проблема со cбросом значений
- Войдите на сайт для отправки комментариев
Сб, 14/11/2020 - 13:10
Здравствуйте.
Пытаюсь сделать устройство, которое считает и выводит количество прерываний. Если после срабатываний прерываний, прерывания отсутствуют 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);
}
Это что ты такое нарисовал?
!attachInterrupt-
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; } }Это что ты такое нарисовал?
!attachInterruptа millis()>2000 - лучше?:)
МемориОвер, это уже вторая или третья ваша бредовая тема, из которых следует, что вы совсем по нулям. Может уже пора учебник почитать?
Ua6em, нафига ты этим безграмотным дятлам что-то пишешь, пусть сами учаться
Он все равно неправильно написал, не переживай.
ты насчёт атомарности?
ну да а миллис устанавливать дядя будет, есть такое )))
oid loop() { if (millis() - oldMillis >= 2000){ Serial.println(myTimer1); myTimer1 = 0; oldMillis = millis(); } }oid loop() {
if (millis() - oldMillis >= 2000){ Serial.println(myTimer1); myTimer1 = 0; oldMillis = millis(); } }Снова мимо. Кроме атомарности, надо еще добавить в условие проверку значения myTimer1. И про валотильность не забыть.
oid loop() {
if (millis() - oldMillis >= 2000){ Serial.println(myTimer1); myTimer1 = 0; oldMillis = millis(); } }Снова мимо. Кроме атомарности, надо еще добавить в условие проверку значения myTimer1. И про валотильность не забыть.
рыба то в принципе съедобна (это я о логике поведения программы) )))
Валовой продукт знаю, вАлОтильность - не, не слышал! ;)))
Так пойдёт?
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(); } }Не там Вы дяденька прерывания запрещаете. Заведи ещё переменную для вывода и запрещай только при присвоении ей.
Так пойдёт?
Нет! "И эти люди запрещают мне ковыряться в носу..."
Так пойдёт?
Нет! "И эти люди запрещают мне ковыряться в носу..."
критикуя - предлагай )))
PS это же набросок был, в моём контроллере посудиной переменные перегружаемые естественно, так как управление реалтайм, использую три канала int0,1 и PCINT
критикуя - предлагай )))
PS это же набросок был, в моём контроллере посудиной переменные перегружаемые естественно, так как управление реалтайм, использую три канала int0,1 и PCINT
Зачем в 18 строке Вы запрещаете прерывания? Достаточно было сбросить счетчик прерываний.
критикуя - предлагай )))
PS это же набросок был, в моём контроллере посудиной переменные перегружаемые естественно, так как управление реалтайм, использую три канала int0,1 и PCINT
Зачем в 18 строке Вы запрещаете прерывания? Достаточно было сбросить счетчик прерываний.
первое, что под руку подвернулось, у себя я применяю атомарное присваивание другой переменной
ATOMIC_BLOCK(ATOMIC_RESTORESTATE){ a=b;}
у себя я применяю атомарное присваивание другой переменной
ATOMIC_BLOCK(ATOMIC_RESTORESTATE){ a=b;}
Извините, сэр. Пойду - выпью. Не понимаю...
Вот - выпил, понял. Но мне кажется, что Вы и тут ошибаетесь. Надо так: ATOMIC_BLOCK(ATOMIC_RESTORESTATE(ATOMIC_COLA_AND_VODKA)){ a=b;}
oid loop() {
if (millis() - oldMillis >= 2000){ Serial.println(myTimer1); myTimer1 = 0; oldMillis = millis(); } }Снова мимо. Кроме атомарности, надо еще добавить в условие проверку значения myTimer1. И про валотильность не забыть.
рыба то в принципе съедобна (это я о логике поведения программы) )))
Без дополнительной проверки значения myTimer1 и логика не верна. Т.к. надо выводить кол-во импульсов только если они были, а у вас при отсутствии импульсов - каждые 2 секунды будет выводиться 0. Атомарным (в данной реализации) надо делать и блок условия, т.е. любые обращения к многобайтным переменным изменяемым в прерывании.
в задании ТС этого нету - которое считает и выводит количество прерываний, если их 0, то надо и выводить 0!?
Вот - выпил, понял. Но мне кажется, что Вы и тут ошибаетесь. Надо так: ATOMIC_BLOCK(ATOMIC_RESTORESTATE(ATOMIC_COLA_AND_VODKA)){ a=b;}
водка без пива деньги на ветер )))
водка без пива деньги на ветер )))
Нет повода не согласится.
Вообще, если прерываний нет, то выводить их не нужно.
Вообще не судите строго, так как у меня экономическое образования, а это просто решил немного побаловаться)
в задании ТС этого нету - которое считает и выводит количество прерываний, если их 0, то надо и выводить 0!?
Вообще, если прерываний нет, то выводить их не нужно.
Вообще не судите строго, так как у меня экономическое образования, а это просто решил немного побаловаться)