Ви не увійшли.
Цікаво, що дає саме PWM.
Ну, один із можливих варіантів я вже написав: пін перемикається на функцію Compare Match Output. Чому - це вже інше питання.
https://forum.arduino.ua/img/members/4083/OSC-_-OUT-PB1.jpeg
У мене ось такий сигнал на PB1
...
https://forum.arduino.ua/img/members/4083/PXL_20250611_042428586.jpeg
Було ж 1.2 вольта, тут бачу чесні 5. Після яких змін амплітуда імпульсів стала 5 вольт?
понавстановлював все, що можна було стосовно Attiny 85.
Потрібно якось фіксувати ці зміни: з якого URL, яка версія. Щоб можна було собі теж скачати та проаналізувати код цього конкретного пакунка.
Частота стала 16кГц, цикл 70 відсотків.
PB1 має альтернативну функцію виходу компаратора таймера. (Доречі, PB0,PB3,PB4 також). Якщо якимось чином біти вибору режима стають ненульові, то це досить очікуваний результат: різні core можуть використовувати таймери по-різному.
Якось би здампити вміст регістрів TCCR0A, TCCR1 та GTCCR, коли баг проявляється. Я би увімкнув debugWIRE. Але без досвіду це буде непросто зробити: потрібно перешивати фʼюзи і вимикати функцію піна Reset, а також підʼєднуватись UART'ом до піна Reset як мінімум через діод, і на компі запускати відлагоджувальний софт.
Можна спробувати записати вміст цих регістрів в EEPROM, потім зчитати програматором.
Але в першу чергу я би все таки перевірив з
#define HAVE_BOOTLOADER 1
в core_build_options.h.
А також мінімізував би програму до такого стану, коли баг ще відтворюється.
Ось схема всього пристрою.
Для повноти картини ще би домалювати USB'шні резистори зі стабілітронами, а також вбудований світлодіод.
входи вільно теліпаються, хз що вони ловлять у вас і що у мене. Їх було б непогано підтягнути чи до 0 чи до VCC - хз як правильно за вашою схемою.
Автор же писав, що є підтяжки по 5.1к. Мені тільки не подобається, що підтяжка на PB3, бо там же ще через 47 Ом стабілітрон в землю. А свої 3.6В стабілітрон тримає тільки при відносно великих струмах, десь 5 мА. При малих струмах через підтяжку на ньому падає десь 3 В, або й менше. Мабуть, тому там і analogRead(). UPD: хоча "analogRead() < 512" це майже те ж саме, що "digitalRead() == LOW", тільки без гистерезису.
Цікаво, чи вдастся відтворити баг з пінами на голій attiny85, без USB-шних стабілітронів та бутлоадера.
Можу лог показати
Будь ласка, якщо не складно. У мене один раз скомпілилось. Потім перезапускав IDE - перестало, каже, нема EEPROM.h. І дійсно, в packages/digistump такого нема. Крім дефолтної arduino та цієї digistump (з https://raw.githubusercontent.com/digistump/arduino-boards-index/master/package_digistump_index.json) ніяких інших пакунків не ставив. Якась китайська чудасія з цим IDE.
Але сайд ефекти дуже дивні.
Ну, чудес не буває. Але причина може бути так глибоко, що у нас може не вистачити засобів до неї докопатись. Наприклад, який-небудь апаратний баг МК, який проявляється тільки при певних хитрих умовах.
Хм, як воно взагалі компілиться, якщо в packages/digistump/hardware/avr/1.6.7/libraries/ нема EEPROM. Ви її доставляли вручну, чи у вас вона є в самому package, а це у мене чомусь нема?
Також підозріле місце: digistump-avr/cores/tiny/core_build_options.h:138
Micronucleus bootloader там часом не залишає таймери в якомусь PWM-режимі? (UPD: Та не схоже)
https://forum.arduino.ua/img/members/3983/2025-06-10_19-06.png
А у вас що за board package?
https://raw.githubusercontent.com/digistump/arduino-boards-index/master/package_digistump_index.json
Як мінімум для плат "Digispark (Default - 16.5mhz)" та "Digispark (16mhz - No USB)" опції компіляції наче правильні.
tiny core 1.6.7 (що в Arduino IDE) старіший за dtiny 1.7.2 (що дефолтовий в platform.io). Але суттєвих відмінностей, які могли би впливати, поки не бачу.
В dtiny 1.7.2 є деякі виправлення, повʼязані з калібровкою тактового генератора. Але не схоже, що це може бути якось повʼязано з вашою проблемою.
Якщо у вас вибрано "Digispark (Default - 16.5mhz)", для експерименту спробуйте "Digispark (16mhz - No USB)". USB ж у вас в програмі ніяк не використовується.
Нажаль, не знайшов у себе attiny85 чи 45, щоб перевірити безпосередньо на залізі. Наче колись купляв, десь були, а нема
не можу прикріпити картинку
Під полем редагування є "Завантаження". Заходите туди, завантажуєте картинку. Клікаєте на неї, копіюєте її адресу, вставляєте в тег [img]<адреса тут>[/img].
Ще б здогадатись, звідки крім 1.2 вольта ще ті 5.2 кГц.
Не дуже розумію, чому стан кнопки зчитується як аналоговий сигнал. Там звичайна механічна кнопка, чи якась особлива? Спробуйте для експерименту
if (analogRead(btnMode) < 512) {
замінити на
if (digitalRead(btnMode) == LOW) {
Не зовсім зрозумів питання.
Ще одне припущення щодо дивної поведінки - що ви збираєте прошивку під якусь іншу плату чи контролер, і воно якимось чином успішно прошивається.
Наприклад, щоб зібрати ваш скетч в platform.io, я обираю плату "digispark-tiny", при збірці воно підтягує пакунок framework-arduino-avr-digistump і компілює з опціями, поміж інших, "-mmcu=attiny85 -DARDUINO_AVR_DIGISPARK -DF_CPU=16500000L".
З якими опціями компілюється прошивка у вас?
версія ардуіно - остання з сайту.
На сайті дві активні версії IDE: Arduino IDE 2.3.6 та Arduino PLC IDE 1.0.8. Як вгадати, яку з них ви поставили?
В репозиторії мого дистрибутиву Arduino IDE версії 2.3.6. Воно знає тільки ардуінівські плати, про DigiSpark нічого не знає.
Віндова збірка "з сайту" підтримує плати DigiSpark "з коробки"? Чи ви додавали board package вручну?
Я пробував додавати https://github.com/ArminJo/DigistumpArduino/blob/master/package_digistump_index.json (який ставиться для platform.io), також http://drazzy.com/package_drazzy.com_index.json. Але IDE все одно не бачить плат DigiSpark. Схоже, це якийсь відомий баг IDE.
Тому й питаю, який пакунок плат ви ставили, щоб зібрати скетч під DigiSpark Attiny85?
Де можна подивитися те, що Ви запитуєте?
File -> Preferences -> Settings -> Additional boards manager URLs. Також, яка плата обрана в Tools -> Board (не тільки назва, а повний шлях в тому меню), Tools -> Processor та інші пункти з опціями збірки.
Також не завадило би в File -> Preferences -> Settings увімкнути "Show verbose output during: compile", зібрати скетч "з нуля" і показати лог збірки.
@stas_amp, доречі, який board package використовуєте для своєї плати? Який URL у package index json?
Мене цікавить, чому себе так поводить контролер.
Документованих способів видавати на пін 1.2 В при живлені 5 В у контролера нема.
Можу припустити, що analogRead() з якоїсь причини перемикає опорну напругу на Vref або на внутрішній опорник (який, доречі, 1.1 В, звідси ваші 1.2 В може і вилазять), а потім намагається вимірювати напругу на цьому ж Vref піні (PB0).
Також не можна виключати, що і сам чіп - якийсь клон з глюками, у всій партії плат.
Так як ніяких особливостей Attiny85 у вас не використовується, перевірте програму на якій-небудь "класичній" платі ардуіно з атмегою.
я задав конкретне питання по програмній частині, в якій я не розуміюся.
Код програми сумбурний, але явних причин для такого глюку поки не побачив. Метод діагностики вже написали: вимикаєте #if'ами або коментуєте спочатку весь функціональний код, перевіряєте. Поступово вмикаєте невеликі частини коду, і дивитесь, після включення якої частини глюк починає проявлятись.
Що дасть вимкення BOD ?
При увімкненому BOD при просадці живлення нижче встановленого рівня (1.8, 2.7 або 4.3 вольт) контроллер гарантовано входить в reset, а не намагається з глюками працювати до останнього.
В заглюченому стані пін може тіліпатись на досить високій частоті, що осцилограф з недостатньою полосою пропускання (або за наявності паразитних ємностей на платі) може цього не бачити.
На саму плату ардуіно даю 14 вольт, на виході стабілізатора чітко 5, і на вході контроллера - теж 5 вольт
Судячи по схемах з інтернета, там перед регулятором нема ніякого конденсатора. А по даташиту має бути.
Живлення там достатньо, перевіряв, та до всього ж, якщо що, то звичайний блінкер там працює без проблем.
Так як ви живите плату у вашій схемі, не в блінкері?
І що показує осцилограф на піні живлення під час глюку?
Може бути таке, що у схемі якийсь із інших виходів зʼєднаний малим опором в землю, а ви видаєте на нього високий рівень (або підтягнутий до Vcc, а ви видаєте низький). Контроллер може намагатись працювати при живлені навіть менше 1 вольта. BOD мабуть же вимкнений у фʼюзах.
Та в принципі такий спосіб усереднення pwm має право на існування. analogread іноді читає 0, іноді 1023, в середньому виходить 22
Та десь так, але ж аліасінг. Дивне ускладнення рішення для простої задачі.
Наскільки я бачу, при вказаній умові воно повинно клацати з інтервалом в 1 секунду.
Хе, там дійсно осцилятор
Інший пристрій це STM32F103 яка управляє сервомоторами зі зворотнім зв'язком у виді микроперемекача.
Як саме пін з STM32 підключений до входу ардуіни? Між ними є якісь компоненти?
Яка напруга живлення у вашого Nano?
Я вимикаю конектор мотора та туди ціпляюсь портом D2 (два пина: сигнал та GND)
Так D2 чи A0?
sum += analogRead(A0);
Якщо це PWM, то амплітуда нас не має цікавити, тільки логічний рівень. Якщо там аналоговий сигнал, то це не PWM.
Хлопці все запрацювало
Це вам поки що повезло. При зміні зовнішніх факторів може перестати.
average = sum / NUM_READINGS; // знаходимо середнє арифметичне, поділивши суму на число вимірів ... if (average < 22 ...
Замість того щоб ділити на константу і потім порівнювати з константою, можна просто порівнювати з константою:
if (sum < 22 * NUM_READINGS ...
... && digitalRead(outPin) == LOW)
digitalRead() читає з регістра PINn, і при деяких умовах там може бути не те значення, що digitalWrite() записало в регістр PORTn. Краще зберігайте внутрішній стан в окремій змінній.
На виході, замість 5-ти вольт, маємо тільки 1.2. Що ще дивно, що ці 1.2 вольти ідуть з частотою 6кГц.
Амплітуда цих 6-кілогерцових імпульсів 1.2 вольт? Чи амплітуда 5 вольт, але в середньому при вимірюванні дає 1.2?
При подачі живлення перші два імпульси йдуть нормальні, далі вже в 1.2 Вольти.
Як живите плату? З якого джерела, якою напругою, на який вхід?
Відраховує 64 імпельси, знову два нормальні, і так по колу.
64 імпульси схоже на преамбулу PowerDelivery, але там 300 кГц по лінії CC.
До USB в цей час плата ж не підключена, сподіваюсь?
Поради по навантаженню порту - відпадають.
Чому? Глюк спостерігається, коли до PB1 окрім вбудованого світлодіода нічого не підключено?
Переназначав іншу ногу, на PB4, раптом порт пошкоджено.
PB4 та PB3 використовуються V-USB в ролі D+/D-. Якщо у вас прошивка з V-USB, то їх краще не використовувати.
Може хто має ідеї?
Якщо виключити навантаження, то або живлення, або баг в схемі підключення чи в коді. Без схеми та коду здогадуватись буде непросто.
Схоже, автор хотів зробити щось типу фільтра ковзаючим вікном з прямокутною віконною функцією. Але в загальному випадку для цього потрібно зберігати попередні значення в буфері. При кожному новому семплі найстаріше значення віднімати від акумульованої суми, замість нього записувати нове значення і додавати його до акумульованої суми.
Для періодичного сигналу можна і без збереження, але похибка залежить від співвідношення тривалості вікна та періоду сигналу.
Для бінарного сигналу можна замість самих значень 0/1 зберігати тривалості між фронтами, і по них рахувати середнє.
В будь-якому разі, як уже зазначили, потрібно знати, за який проміжок часу середнє.
Але це здогадки. Що насправді хоче автор - відомо тільки автору, чекаєм на зрозумілий опис задачі.
500 відліків - невідомо скільки мікросекунд.
Можна приблизно оцінити. В ардуіно тактова частота АЦП встановлюється 125 кГц, тобто при 10 бітах на семпл та буфері в 500 семплів це десь 40 мс на буфер. Це не враховуючи часу на виконання коду.
АЦП вертає значення від 0 до 1024, 1024 відповідає, якщо не помиляюсь, 3.3 В.
До 1023 В ардуіно АЦП atmega328p за замовчуванням вимірює відносно Vcc (тобто 5 або 3.3 В), але можна перемкнути на Vref або внутрішнє джерело 1.1 В.
І для дискретного вихода у вигляді T-триггера потрібен або гистерезис, або таймаут. Бо на граничних значеннях вихід буде тіліпатись туди-сюди неконтрольовано.
Маємо PWM сигнал з іншого пристрою
Яка частота PWM? Якщо не фіксована, то який допустимий діапазон: мінімум та максимум?
Якщо це PWM, чому ви читаєте аналогове значення, а не дискретне? Чи PWM попередньо фільтрується, і на вході аналоговий сигнал? Тоді яка різниця, як він формується, PWM чи іншим способом?
треба з нього по команді (умова (average < 20))
Вважаючи, що ви робите по 500 виборок, це значить коефіцієнт заповнення 4%? Чи якась фіксована напруга у випадку аналогового сигналу?
перетворити на логічну одиницю і якщо через деякий час ще буде такий саме імпульс, на нуль.
Тобто умовою перемикання виходу на протилежне значення є перехід коефіцієнту заповнення від значення 4% і вище до значення нижче 4%, чи як?
EDIT: про 4% писав до того як звернув увагу, що там analogRead(), а не digitalRead(). Тоді ще менше зрозуміло, яка саме умова перемикання вихода. Бо значення 20 від analogRead() - це десь 2% від Vcc, тобто приблизно 0.1 вольт для 5-вольтової ардуіни або 0.06 вольт для 3.3-вольтової.
імпульс пробігає декілька разів і в мене, порт падає в LOW
У вашій спробі реалізації стан виходу залежить тільки від поточного середнього значення, без врахування поточного стану виходу.
Також, частота виборки залежить від тактової частоти процесора та інших сторонніх факторів, таких як версія компілятора та опції збірки.
Можливо, я все роблю не правильно, є інший алгоритм... Підскажіть як це можна реалізувати.
Ви не могли б описати умову задачі, а не своє бачення її реалізації?
Прислал китаец программу не пойму как запустить?
Відкрити в Keil, скомпілювати, прошити у ваш STM32F103.
Тільки навіщо воно вам? Почитайте коментар в main.c.
Ну, іноді дивні задачі вирішують ще більш дивними способами
Це так. Один мій знайомий вимикав комп з блоком живлення AT за допомогою матричного принтера: давав команду на переміщення каретки в кінцеве положення, і вона висмикувала прив'язану вилку з розетки.
якщо треба активність від миші, щоб комп не спав, то можна покласти її сенсором на щось рухоме. Механічний годинник наприклад.
Для рішення такої проблеми потрібно правильно сконфігурувати комп, а не вигадувати апаратні воркераунди
Ось знайшлась у мене Lenovo Thinkpad Laser Mouse, модель MOC9ULA. Кнопки замикаються на землю, напруга підтяжки 5В, струм замкненої кнопки біля 40 мкА.
Зібрав на макетці таку схему:
Підключив. Клікає аж бігом.