Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Намур (Берегун) #76

Closed
OloloevReal opened this issue Apr 27, 2019 · 17 comments
Closed

Намур (Берегун) #76

OloloevReal opened this issue Apr 27, 2019 · 17 comments
Labels
bug Something isn't working help wanted Extra attention is needed

Comments

@OloloevReal
Copy link
Contributor

OloloevReal commented Apr 27, 2019

Добрый день!

При подключении счетчика ГВС Берегун обнаружил проблему

При нажатии на кнопку происходит изменение величины считываемой со входов. Например, если состояние входа NAMUR_CLOSED, в моем случае значение 149, и происходит нажатие кнопки, то значение на входе изменяется со 149 на 224

12437 [D]: 149
12437 [D]: 149
12437 [D]: 224 <- изменение, фактически NAMUR_CLOSED -> NAMUR_OPEN
37883 [I]: Data:
37910 [I]: 13
37933 [I]: 0

Это приводит к ложным увеличениям счетчика импульсов, т.е. при каждой принудительной отправке показаний кнопкой происходит +1 счетчика.

@dontsovcmc
Copy link
Owner

dontsovcmc commented Apr 27, 2019

Так. Константа 170 разделяет положение открыт/закрыт, ОК.
Что вы называете "нажатие кнопки"? Той,что для отправки/настройки?

Можете подробнее описать.

Это странно,т.к. она на линии i2c сидит. В коде где то проблема.

@OloloevReal
Copy link
Contributor Author

Да, та кнопка что для отправки/настройки

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

    bool is_close()
    {
        //bool value = digRead();
        //state = value2state(value ? 1024 : 0);
        uint16_t value = aRead();
        LOG_DEBUG(value);
        state = value2state(value);
        return state == CounterState_e::CLOSE || state == CounterState_e::NAMUR_CLOSE;
    }

Временно вышел из положения таким образом:

inline void counting() {

    power_adc_enable(); //т.к. мы обесточили всё а нам нужен компаратор
    adc_enable();       //после подачи питания на adc

	if(button.digBit() == LOW){
		adc_disable();
    	        power_adc_disable();
		LOG_DEBUG(F("Skip!"));
		return;
	}
.....

Т.е. откидывая значение если кнопка нажата перед чтением данных со входов.

Мне кажется это как-то связанно с тем что контроллер находится power save, а нажатие кнопки просаживает напряжение

@dontsovcmc
Copy link
Owner

Хм... Не понимаю. Это же разные пины и они не должны влиять друг на друга.

  1. Странно, что лог работает, мне казалось LOG_BEGIN всегда после пробуждения нужно делать.
  2. А как увеличивается значение value? Оно всегда плавает - это же компаратор от 0 до 1023.
uint16_t value = aRead();
LOG_DEBUG(value);
  1. А можете протестировать вызов counting() в условии, вместо изменения ее содержимого:
		while ( wdt_count > 0 ) {
			noInterrupts();

			if (button_pressed()) { 
				interrupts();  // Пользователь нажал кнопку
				break;
			} else 	{
			        counting(); //Опрос входов
				interrupts();
				sleep_mode();  // Спим (WDTCR)
			}
		}

@OloloevReal
Copy link
Contributor Author

А как увеличивается значение value? Оно всегда плавает - это же компаратор от 0 до 1023.

При постоянном значении нагрузки на входах значение плавает +- 1
А вот так оно меняется при нажатии на кнопку:
0: 109 -> 188
1.6 кОм: 143 -> 220
5.6 кОм: 221 -> 290
обрыв: 1020 -> 1023

А можете протестировать вызов counting() в условии, вместо изменения ее содержимого:

С таким кодом работает корректно, ложных срабатываний не фиксируется

23803 [D]: 143
23803 [D]: 143
23803 [D]: 143
23803 [D]: 143
23803 [D]: 143
23803 [D]: 143
23803 [D]: 143
23803 [D]: 143
23803 [D]: 143
23803 [D]: 143
23803 [D]: 143
23803 [D]: 143
23803 [D]: 143
23808 [I]: Data:
23832 [I]: 4
23853 [I]: 0
24379 [D]: wake up for transmitting

@dontsovcmc dontsovcmc added bug Something isn't working enhancement New feature or request labels Apr 30, 2019
@dontsovcmc
Copy link
Owner

Я сейчас попробовал у себя - у меня вообще нет этой ошибки.. Придется вам код показать, а то не ясно, что вы переделали =(

@dontsovcmc
Copy link
Owner

Проверьте, что включен компаратор в том месте. Потому что в readVcc он выключается и я удивился, когда увидел другое значение сразу после вызова функции.

@OloloevReal
Copy link
Contributor Author

Проверяю на v0.8, стоковой версии, все отличия это активированный лог, уменьшенный таймер #define WAIT_ESP_MSEC 5000UL и добавленный принтаут в функцию is_close()
Записал лог, в нем видно что при нажатии кнопки посылки показаний происходит скачек значения и счетчик импульсов увеличивает значение

ESP отключена, нагрузка на Input_0 подключена 1.6 кОм
log.log

@OloloevReal
Copy link
Contributor Author

Пробовал убирать из кода запрос напряжения
//info.voltage = readVcc(); // Текущее напряжение
ни на что не повлияло, проблема сохраняется

@dontsovcmc
Copy link
Owner

Упс. WAIT_ESP_MSEC надо вернуть.
Я вставляю печать в is_close и нет никакой разницы в показаниях. Т.е. кнопка нажата,нет. Нет разницы.
У вас она есть. пришлите кусок кода где вы нажимаете кнопку, пожалуйста.

@OloloevReal
Copy link
Contributor Author

WAIT_ESP_MSEC ставлю небольшим значением что бы проблему отлавливать быстрее - проблема проявляется когда Attiny в повер сейве и выходит из него. Если она уже проснулась, и например, ждет ESP, то жми, не жми кнопку результат стабильный, изменений не происходит.

Вот все изменения сделанные поверх master версии, все сток diff

@dontsovcmc
Copy link
Owner

да, да. я также сделал. у меня нет разницы в aRead(). Слушайте, а на плате у вас нет замыкания какого-нибудь? Ну если код одинаковый, МК тоже, то только плата осталась...

@OloloevReal
Copy link
Contributor Author

Не похоже на замыкание, померил ток:
0.01 mA - power save
1.56 mA - кнопка нажата, attiny проснулась и ждет ESP

Очень странно, ладно, видимо нужно собирать еще одну тестовую плату, на новом МК

@dontsovcmc dontsovcmc reopened this May 5, 2019
@dontsovcmc
Copy link
Owner

Второй человек сегодня отписал об этой проблеме... Мне не сложно перенести counting() в условие, но это костыль, а нужно понять причину.
Я смотрел в сторону AREF - опорное напряжение компаратора, но этот пин SDA, а кнопка замыкает SLK.

@dontsovcmc
Copy link
Owner

о! я проверял без ESP всунутой. А ведь она может как-то влиять. У вас ошибка без ESP воспроизводится?

@dontsovcmc dontsovcmc added help wanted Extra attention is needed and removed enhancement New feature or request labels May 5, 2019
@OloloevReal
Copy link
Contributor Author

Я проверяю без ESP, ошибка воспроизводится без ESP

@dontsovcmc
Copy link
Owner

dontsovcmc commented May 6, 2019

Я проверяю без ESP, ошибка воспроизводится без ESP

А! Подтверждаю, есть ошибка =(

@dontsovcmc
Copy link
Owner

Оставил пока так:

{
interrupts();  // Пользователь нажал кнопку
break;
} else {
    counting(); //Опрос входов
    interrupts();
    sleep_mode();  // Спим (WDTCR)
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working help wanted Extra attention is needed
Projects
None yet
Development

No branches or pull requests

2 participants