ArDos / дозиметр, продолжение темы, часть №2

ddr2
Offline
Зарегистрирован: 27.12.2020

mambavamba14, понятно. И видимо по причине возможного конфликта вочдога со стандартным загрузчиком ардуино, предлагается устанавливать оптибут ?

mambavamba14
mambavamba14 аватар
Offline
Зарегистрирован: 25.12.2019

ddr2 - Нет, проблемы с ватчдогом на старом загрузчике возникаю только в режиме сброса, в режиме прерываний проблем нету. Оптибут раньше был нужен по причине нехватки флеш памяти, сейчас же прошивка влазит с любым загрузчиком.

mambavamba14
mambavamba14 аватар
Offline
Зарегистрирован: 25.12.2019

#ArDos_with_RADON_3.8.4 - Критическое исправление счёта текущей дозы, критическое исправление чтения и очистки накопленной дозы.

ddr2
Offline
Зарегистрирован: 27.12.2020

mambavamba14, в ардосе для выхода из режима сна не используется функция avr/sleep_disable(), это необязательно? (что-то типа &= ~(1<<SE)), не нашёл, бит сам сбрасывается?

mambavamba14
mambavamba14 аватар
Offline
Зарегистрирован: 25.12.2019

ddr2, Да, любое включенное прерывание выводить мк из сна. Когда устройство включено и ушло по тайм-ауту в сон, то опрос кнопок продолжается тк работает таймер собаки. При софтовом выключении используется пустое прерывание INT1 для выхода из сна. Если мне не изменяет память, то авэровская процедура sleep disable очищает бит SE регистра SMCR, нам не нужно запрещать сон, для этого есть подобие power manager который управляет режимами сна в зависимости от ситуации (работы таймеров/скорости счета).

GerkOn2
GerkOn2 аватар
Offline
Зарегистрирован: 03.01.2022

Дайте прошивку 1.08.2 а то на форуме не могу скачать пишет страница не существует

tekagi
tekagi аватар
Offline
Зарегистрирован: 07.10.2016

GerkOn2, тыц или тыц

А смысл? Она ж более не развивается и по всем параметрам проигрывает нынешней.

inferis
Offline
Зарегистрирован: 04.01.2022

Здравствуйте дорогие разработчики дозиметра "ardos"! последнее время активно пользуюсь версией 3.8.2. Глюков пока не заметил, единственны нюанс- при полном отключении от источника питания и последующей подачей питания видно версию прошивки на загрузочном экране, а при отключении с кнопки просто внизу виден прогрессбар, а далее следует серия ошибок по низкому напряжению преобразователя, что в прочем не особо меня беспокоит

mambavamba14
mambavamba14 аватар
Offline
Зарегистрирован: 25.12.2019

inferis - Добрый вечер! Лучше обновитесь до 3.8.4, были исправления критических ошибок...
Версия отображается только при первом включении, при софтовом включении запускается только накачка. Преобразователь у вас точно настроен? Просто так ошибок по ВВ не должно быть...

inferis
Offline
Зарегистрирован: 04.01.2022

Добрый вечер! обязательно обновлюсь, преобразователь настроен (скр-38-40, вв-396). прчем держит напряжение при закоротке накопительного кондера мультиметром. сейчас включил-ошибок небыло. Странно, поэкспериментирую еще. И может подскажите, как правильно настраивать СЧ (время счета). по умолчанию у меня стоит 36, не трогал. Спасибо.  P.S.  в отключенном режиме замерил ток потребления - в районе 40мкА. в рабочем режиме (без подсветки) -5 мА. С подсветкой 8мА. Сам преобразователь - в ределах 0.9-1мА

mambavamba14
mambavamba14 аватар
Offline
Зарегистрирован: 25.12.2019

inferis - Тогда странно... А накачка быстро проходит или залипает на время при софтовом включении? Для сбм-20 в среднем без учета собственного фона 36сек, более точно нужно подстраивать по эталону.

inferis
Offline
Зарегистрирован: 04.01.2022

mambavamba14- быстро проходит, сейчас включил / выключил/включил-все нормально. В момент загрузки прошивки импульсы просто чаще идут. когда загрузилось то падают до 38-40. Насчет эталона понял. Тестировал прибор фоном около 12 мР условно ( с помощью спд) при таком уровне скорость накачки вырастает всего на пару импульсов. еще поганяю, отпишусь о результатах

ddr2
Offline
Зарегистрирован: 27.12.2020

mambavamba14, как я понимаю WDT имеет свой тактовый генератор, насколько точно он работает, нужно ли его калибровать?  

mambavamba14
mambavamba14 аватар
Offline
Зарегистрирован: 25.12.2019

ddr2 - Да свой на 128кГц. В идеале нужно тк разброс у них достаточно ощутимый, для этого есть пункт в отладке "ПЕР", задается с шагом 10мкс.

ddr2
Offline
Зарегистрирован: 27.12.2020

mambavamba14 пишет:

ddr2 - Да свой на 128кГц. В идеале нужно тк разброс у них достаточно ощутимый, для этого есть пункт в отладке "ПЕР", задается с шагом 10мкс.

А может как-то автоматизировать процесс калибровки или это не нужно? 

mambavamba14
mambavamba14 аватар
Offline
Зарегистрирован: 25.12.2019

ddr2 - Такое уже было, но все равно калибровка давала ощутимую погрешность. А нет, посмотрел старые исходники, все же проблема не в в сбросе собаки...
Но можно попробовать сделать подомное на ассеме, мож что и выйдет путного...

 

ddr2
Offline
Зарегистрирован: 27.12.2020

mambavamba14 пишет:
ddr2 - Можно сделать, раньше она была но от неё пришлось отказаться тк все равно давала погрешность. Раньше списывал на напряжение питания, но на самом деле было все проще - не было сброса счетчика собаки командой "wdr"...
Всмысле не было сброса, а что там сбрасывать, мы же просто доверяем документации, что прерывание wdt вызывается каждые - 16 ms (при VCC = 5.0V) и 17.5 мс (видимо при 3.3 В), я про то чтобы проверить действительно ли оно вызывается раз в 16 мс.

mambavamba14
mambavamba14 аватар
Offline
Зарегистрирован: 25.12.2019

ddr2 - Сбрасывать счетчик таймера, если этого не сделать то получать будем погоду на марсе а не осмысленные временные интервалы. Все немного сложнее чем прописанные в даташите интервалы. Разброс от партии к партии может быть и 2 мс, но даже дело не в этом, на практике отставание/спешка даже на 10мкс даёт ощутимый разбег на дистанции... Понятно что на расчет данных это не шибко сильно влияет, но есть люди которым нужно чтоб счетчик времени шел точно, поэтому эта калибровка больше для них.

ddr2
Offline
Зарегистрирован: 27.12.2020

mambavamba14 пишет:
 - Сбрасывать счетчик таймера, если этого не сделать то получать будем погоду на марсе а не осмысленные временные интервалы. 
А что произойдёт если не сбрасывать, видимо "внутренний" счётчик wdt ? 

mambavamba14
mambavamba14 аватар
Offline
Зарегистрирован: 25.12.2019

ddr2 - В случае с калибровкой - неверное значение, тк начали отсчет не с самого начала счетчика.

ddr2
Offline
Зарегистрирован: 27.12.2020

это странно, казалось бы должно быть наоборот. Что сброс приводит к ошибке, также как в случае с АЦП.

И как часто надо сбрасывать счётчик wdt ? Кстати что вы понимаете под сбросом, перезапуск wdt ?

mambavamba14
mambavamba14 аватар
Offline
Зарегистрирован: 25.12.2019

ddr2 - не знаю причем тут АЦП, но странного тут абсолютно ничего нет, обычный таймер как все остальные, только с рядом ограничений и своих особенностей, но по своей сути тот-же счетчик. Если мы начнем замер времени не сначала, а например с середины счетчика, то мы получим на выходе например 8мс(если брать 16мс за переполнение).

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

ddr2
Offline
Зарегистрирован: 27.12.2020

Кто-нибудь знает, почему обработчик прерывания на Int0 так долго вызывается? 255 вызовов обработчика происходит за 100 мсек (0.1 сек), 1 вызов = 400 микро секунд. Int0 настроен на срабатывания по низкому уровню. В обработчике только 

ISR(INT0_VECT) { 
   if (++counter == 255 ) EIMSK &= ~(1<< INT0); 
}

 

mambavamba14
mambavamba14 аватар
Offline
Зарегистрирован: 25.12.2019

ddr2 - у меня больше вопрос как Вы это измерили? И зачем Вы отключаете прерывание по переполнению? Примерно просчитать сколько времени занимает прерывание можно по количеству команд в листинге + вызов + возврат + если сидим в powerdown.

ddr2
Offline
Зарегистрирован: 27.12.2020

mambavamba14 пишет:
ddr2 - у меня больше вопрос как Вы это измерили? 
чисто на глаз, включаю секундомеры (комп, телефон), также вывожу на экран или в uart вывод теста с прерыванием, каждые 10 сек наблюдаю отставание теста, так как int0 по низкому уровню блокирует вывод. У меня в тесте на int0 который настроен на срабатывание по 0 уровню, на пин int0 постоянно подаётся 0, в коде обработчика int0 после 255 срабатываний вызов прерываний должен отключится. Итого: (0.1 сек/255) = 400 мкс (на вызов).  Частота F_CPU = 16MHz, длительность вызова 400 мкс, получается, в каждом вызове обработчик совершает 400 мкс/(1/16MHz) = 6400 тактов (на вызов). Я посмотрел асм-код обработчика, 48 команд.  

48 команд выполняются 400 мкс ?

ISR(INT0_VECT) { 
   if (++counter == 255 ) EIMSK &= ~(1<< INT0); 
}

sleep_mode() в главном цикле отключил, также результат, то есть это int0 - странно работает. 

mambavamba14
mambavamba14 аватар
Offline
Зарегистрирован: 25.12.2019

ddr2 - так такие короткие интервалы никто не измеряет. Учитывайте что на вызов отправки в юарт и сама отправка в юарт занимает львиную долю времени (особенно ардуиновский юарт). Как вариант можете использовать один из таймеров для замера, но имхо, если известно количество команд, то смысла этим заниматься нету. 48 команд это примерно 6мкс, если учитывать что одна команда в среднем выполняется за 2 такта(один такт - 62.5нс при тактирование от 16МГц).

ddr2
Offline
Зарегистрирован: 27.12.2020

Я уже замерил время, думал может Вы знаете почему int0 по низкому уровню, при постоянном 0 на пине блокирует ардуину (т.е. долго выполняет) обработчик (400 мкс).  

255 вызовов обработчика происходит ~ за 0.1 сек !

mambavamba14
mambavamba14 аватар
Offline
Зарегистрирован: 25.12.2019

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

Как вы измерили эту 0.1мс?

ddr2
Offline
Зарегистрирован: 27.12.2020

mambavamba14 пишет:
ddr2 - не мудрено, если прерывания настроено не на изменение сигнала, после выхода из прерывания выполняется одна команда и затем снова прыжок в область обработчика прерывания.
Да, но после 255 таких прыжков обработка прерывания должна закончится. И она заканчивается. Но я получаю что 255 вызовов обработчика происходят за 0.1 сек! Это нормально для Ардуины ?

Измерения простые, за 10 сек расхождения с любыми другими часами составляет 1 сек, что видно на глаз. За 20 сек 2 сек и т.д. При отключенной обработке int0 таких расхождений нет (вывод на uart или oled)

mambavamba14
mambavamba14 аватар
Offline
Зарегистрирован: 25.12.2019

ddr2 - что-то вы явно не то делаете/измеряете. Как я и сказал выше, хотите на практике измерить период - берете например таймер1 -> настраиваете -> сбрасываете счётчик (TCNT1) -> разрешаете прерывание на INT -> висите в цикле пока прерывания INT разрешены -> после выходвыхода из цикла копируете счетчик(TCNT1) -> отправляете куда нужно. А "на глаз" это не измерения... Ну и соответственно во время этого измерения все прерывания кроме INT должны быть запрещены, миллис если что тоже работает на прерываниях таймера0.

ddr2
Offline
Зарегистрирован: 27.12.2020

mambavamba14 пишет:

ddr2 - что-то вы явно не то делаете/измеряете. Как я и сказал выше, хотите на практике измерить период - берете например таймер1 -> настраиваете -> сбрасываете счётчик (TCNT1) -> разрешаете прерывание на INT -> висите в цикле пока прерывания INT разрешены -> после выходвыхода из цикла копируете счетчик(TCNT1) -> отправляете куда нужно. А "на глаз" это не измерения... Ну и соответственно во время этого измерения все прерывания кроме INT должны быть запрещены, миллис если что тоже работает на прерываниях таймера0.

Вы видимо не поняли, Это другой вопрос, не относящийся к калибровке WD-таймера. Мне сначала показалось что тормозит WDT, но оказалось что это прерывание int0 (при low-level).

Зачем мне измерять внутренними часами, представьте что int0 блокирует процессор, тогда я никаких расхождений не увижу измеряя разность TCNT1/TCNT0 и т.д. Так что "на глаз" в данном случае точнее. 

mambavamba14
mambavamba14 аватар
Offline
Зарегистрирован: 25.12.2019

ddr2 - Я тоже не про ватчдог. Кто заблокирует работу таймера? Вы же не будете отключать питание или тактирование таймера...

ddr2
Offline
Зарегистрирован: 27.12.2020

mambavamba14 пишет:
ddr2 - Я тоже не про ватчдог. Кто заблокирует работу таймера? Вы же не будете отключать питание или тактирование таймера...
Может быть бракованная atmega328p или в реальности она не способна нормально работать по низкому уровню (постоянно и без задержек вызывать обработчик прерывания) хотя в документации об этом умолчали. То есть по факту прерывание int0 при low-level, блокируют работу МК на 400 мкс.

mambavamba14
mambavamba14 аватар
Offline
Зарегистрирован: 25.12.2019

ddr2 - Видимо, Вы не читали что я писал выше, иначе все бы "странности" сразу пропали. Не сочтите за стёб, но Вы явно не совсем понимаете что делаете.

ddr2
Offline
Зарегистрирован: 27.12.2020

mambavamba14 пишет:
ddr2 - Видимо, Вы не читали что я писал выше, иначе все бы "странности" сразу пропали. Не сочтите за стёб, но Вы явно не совсем понимаете что делаете.
Вы про якобы неправильно измерение интервалов? я отправляю по uart 2 байта (секунды) просто пишу в регистр UDR, тем более это делается у меня 1 раз/сек в основном цикле, который не блокирует прерывания int0.  Или что я не понимаю, повторите если не сложно, что я пропустил. 

mambavamba14
mambavamba14 аватар
Offline
Зарегистрирован: 25.12.2019

ddr2 - сказать что именно Вы делаете не правильно у себя в коде я не могу по причине его отсутствия. Но даже без него могу сказать что так замеры не делаются, и как сделать правильно я описал в посту #130.

ddr2
Offline
Зарегистрирован: 27.12.2020

mambavamba14 пишет:

ddr2 - сказать что именно Вы делаете не правильно у себя в коде я не могу по причине его отсутствия. Но даже без него могу сказать что так замеры не делаются, и как сделать правильно я описал в посту #130.

#130 пишет:
практике измерить период - берете например таймер1 -> настраиваете -> сбрасываете счётчик (TCNT1) -> разрешаете прерывание на INT -> висите в цикле пока прерывания INT разрешены -> после выходвыхода из цикла копируете счетчик(TCNT1) .. 

Но если Int0 блокирует MK, то в момент зависания TCNT1/TCNT0 не меняются, тогда я никаких расхождений не увижу ?!

mambavamba14
mambavamba14 аватар
Offline
Зарегистрирован: 25.12.2019

ddr2 - С чего Вы это взяли? Вся периферия работает независимо от АЛУ.

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

ddr2 пишет:
Но если Int0 блокирует MK, то в момент зависания TCNT1/TCNT0 не меняются, тогда я никаких расхождений не увижу ?!

TCNT обновляется независимо от никаких прерываний.  Пришел фронт - счетчик увеличился автоматически. 

ddr2
Offline
Зарегистрирован: 27.12.2020

mambavamba14 пишет:
ddr2 - С чего Вы это взяли? Вся периферия работает независимо от АЛУ.
А как ещё можно объяснить запаздывание работы МК при постоянном прерывании int0 (low-level) ограниченной 255 прерываниями:  "if (++counter == 255 ) EIMSK &= ~(1<< INT0);"  (48 строк в амсе)?  

ddr2
Offline
Зарегистрирован: 27.12.2020

DetSimen пишет:

ddr2 пишет:
Но если Int0 блокирует MK, то в момент зависания TCNT1/TCNT0 не меняются, тогда я никаких расхождений не увижу ?!

TCNT обновляется независимо от никаких прерываний.  Пришел фронт - счетчик увеличился автоматически. 

Это понятно, что это внутренний счётчик процессора МК. Я про то что если прерывания на int0 (low-level) блокирует процессор, счётчик не изменится. 

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

ddr2 пишет:
Я про то что если прерывания на int0 (low-level) блокирует процессор, счётчик не изменится. 

Нет.

ddr2
Offline
Зарегистрирован: 27.12.2020

Всё нормально с int0, это была 6% ошибка wd-таймера. 

Wik
Offline
Зарегистрирован: 10.11.2019

Здравствуйте! На последней прошивке при переключении экранов в нижнем правом углу появляется на секунду палка, напоминающая текстовый курсор. И в отладке значение ИМП - дробное число стало, раньше целые числа были (я ж не ошибаюсь же, это длительность импульса на сколько помню, давно не заходил сюда и пропустил несколько версий прошивки). Ну и периодические сбросы точности, смотрю, остались.. 

mambavamba14
mambavamba14 аватар
Offline
Зарегистрирован: 25.12.2019

Wik - Добрый вечер! Полоска была пофикшена, скачайте последнюю версию! Сбросы точности могут возникать тк никто толком коэффициенты не отладил... Занимаюсь новым алгоритмом счёта который избавит от этого. Да, настройка импульса теперь отображается в мкс.

Вопрос ко всем, есть вариант повысить точность счета времени в ущебр потреблению, стоит ли переходить? Потребление во сне поднимется на 2-2.2мА.

Также будет вариант перехода прошивки на работу от внутреннего кварца с установкой внешнего часового на 32кГц, в теории должно сохранить низкое потребление и точность хода времени.

 

Wik
Offline
Зарегистрирован: 10.11.2019

 На самой последней прошивке у меня так. Это появляется на секунду при переходе на новый экран. Через секунду картинка приходит в норму.

mambavamba14
mambavamba14 аватар
Offline
Зарегистрирован: 25.12.2019

Wik - Просто ещё раз скачайте последнюю и прошейте, я не меняю версию при мелких исправлениях.

Wik
Offline
Зарегистрирован: 10.11.2019

Так и сделал, только что прошился, скачал с гитхаба, там версия 4х дневной давности, ее и скачал. Или я что то не так делаю?

mambavamba14
mambavamba14 аватар
Offline
Зарегистрирован: 25.12.2019

Эмм.. Я точно помню что заливал комит... Извиняюсь...

Замените строчки 146-148 в файле display.h на:

for (uint16_t c = 0; c < 504; c++) _LCD_Write(_lcd_buffer[c], LCD_DATA);
_LCD_Write(PCD8544_SETYADDR, LCD_COMMAND);
_LCD_Write(PCD8544_SETXADDR, LCD_COMMAND);

 

Wik
Offline
Зарегистрирован: 10.11.2019

Да, помогло, спасибо))