#1 2023-10-13 12:21:29

Daminski
Учасник
Зареєстрований: 2022-08-12
Повідомлень: 18

Не працює код PWM вимикача на голому чіпі Attiny13

Вітаю! Намагаюсь зробити, щоб запрацював елементарний код PWM вимикача на Attiny13 і він чомусь не працює. В якості генератора PWM імпульсів використовую тестер для сервомашинок. Доречі цей самий код, який я наведу нижче, нормально працює з заводським модулем Attiny85, який має свій завантажувач та вставляється в USB. Не можу зрозуміти в чому проблема при завантаженні цього ж коду на голий чіп Attiny13. Для прошивки чіпа використовую Arduino Nano, прошиваю через макетну плату та перемички.

Ось код:

void setup() {
    pinMode(3, INPUT);
    pinMode(0, OUTPUT);
    digitalWrite (0, LOW);
}
void loop() {
    int ch3 = pulseIn(3, HIGH);
    if (ch3 < 1200) {
    digitalWrite (0, LOW);
} 
    if (ch3 > 1800) {
    digitalWrite (0, HIGH);
}  
}

Ще буває мені видає помилку при заливці скетча в голий чіп Attiny13, але незваєаючи на це, натискаю кнопку завантаження скетчу вдруге і все записується. Інші коди, без PWM працюють нормально.

avrdude warning: attempt 1 of 10: not in sync: resp=0x15
avrdude warning: attempt 2 of 10: not in sync: resp=0x15

avrdude error: protocol expects OK byte 0x10 but got 0x14

avrdude error: protocol expects sync byte 0x14 but got 0x01
avrdude error: protocol expects sync byte 0x14 but got 0x10
avrdude error: initialization failed, rc=-1
        - double check the connections and try again
        - use -B to set lower ISP clock frequency, e.g. -B 125kHz
        - use -F to override this check

avrdude error: unknown response=0x12
avrdude error: unknown response=0x12


Підскажіть, будь ласка, в чому може бути справа?

Неактивний

#2 2023-10-13 13:31:15

Honey
Учасник
З Київ
Зареєстрований: 2020-09-26
Повідомлень: 433

Re: Не працює код PWM вимикача на голому чіпі Attiny13

Покажіть ф'юзи з тіні. Можливо там по замовчуванню встановлений дільник частоти на 8.

Неактивний

#3 2023-10-13 13:32:48

Daminski
Учасник
Зареєстрований: 2022-08-12
Повідомлень: 18

Re: Не працює код PWM вимикача на голому чіпі Attiny13

Honey пише:

Покажіть ф'юзи з тіні. Можливо там по замовчуванню встановлений дільник частоти на 8.

А що таке ф'юзи?

Неактивний

#4 2023-10-13 13:37:56

Honey
Учасник
З Київ
Зареєстрований: 2020-09-26
Повідомлень: 433

Re: Не працює код PWM вимикача на голому чіпі Attiny13

Про ф'юзи гляньте в цій темі, щоб не повторюватись

Неактивний

#5 2023-10-13 23:03:06

Daminski
Учасник
Зареєстрований: 2022-08-12
Повідомлень: 18

Re: Не працює код PWM вимикача на голому чіпі Attiny13

Honey пише:

Про ф'юзи гляньте в цій темі, щоб не повторюватись

Дякую, трохи почитав цю тему, подивився калькулятьр ф'юзів, але не розумію як це мені може допомогти. Коли я прошиваю Attiny мені перший раз видає помилку, що написана червоним текстом на початку теми, а на другу спробу завантажити скетч - нормально прошиває чіп і працює будь який простий код. Але саме функція pulseIn() таке враження, що взагалі не працює і нічого не считує. Хоча сигнальний провід від тестера сервомашинок підключений в наступний пін після піна з ключем (ніжка №2, пін PB3).

Чи ці ф'юзи можуть якось впливати на роботу функції pulseIn()?

Неактивний

#6 2023-10-14 00:02:40

Honey
Учасник
З Київ
Зареєстрований: 2020-09-26
Повідомлень: 433

Re: Не працює код PWM вимикача на голому чіпі Attiny13

Неактивний

#7 2023-11-10 23:50:47

Daminski
Учасник
Зареєстрований: 2022-08-12
Повідомлень: 18

Re: Не працює код PWM вимикача на голому чіпі Attiny13

Нарешті розібрався як за допомогою командної строки зчитувати ф'юзи, знайшов приклади на ютубі. Але всерівно щось не так. Аттіні прошивається нормально, а в командній строці при спробі зчитати інформацію про ф'юзи видає помилку, наче плата не підключена. Хоча порт вказував вірний, як пише в Arduino IDE (COM4), а тут чомусь пише "com1"... І ось яку помилку видає зараз в командній строці:

avrdude: ser_open(): can't open device ".com1": ═х єфрхЄё  эрщЄш єърчрээ√щ Їрщы.

Що це тепер може бути?

Остання редакція Daminski (2023-11-10 23:53:16)

Неактивний

#8 2023-11-12 00:29:56

Honey
Учасник
З Київ
Зареєстрований: 2020-09-26
Повідомлень: 433

Re: Не працює код PWM вимикача на голому чіпі Attiny13

Ви вказали в команді перед COM4 якийсь не той ключик, а по замовчуванню воно використовує COM1.
Команда для читання ф'юзів така:
avrdude -P COM4 -b 19200 -c avrisp -p t13a -U lfuse:r:-:h -U hfuse:r:-:h

Неактивний

#9 2023-11-12 03:58:48

Daminski
Учасник
Зареєстрований: 2022-08-12
Повідомлень: 18

Re: Не працює код PWM вимикача на голому чіпі Attiny13

Honey пише:

Ви вказали в команді перед COM4 якийсь не той ключик, а по замовчуванню воно використовує COM1.
Команда для читання ф'юзів така:
avrdude -P COM4 -b 19200 -c avrisp -p t13a -U lfuse:r:-:h -U hfuse:r:-:h

Дякую, тепер хоч без ієрогліфів показало щось, але всерівно якась помилка sad

avrdude warning: attempt 1 of 10: not in sync: resp=0x15
avrdude warning: attempt 2 of 10: not in sync: resp=0x15


avrdude error: protocol expects OK byte 0x10 but got 0x14

avrdude error: protocol expects sync byte 0x14 but got 0x01
avrdude error: protocol expects sync byte 0x14 but got 0x10
avrdude error: initialization failed, rc=-1
        - double check the connections and try again
        - use -B to set lower ISP clock frequency, e.g. -B 125kHz
        - use -F to override this check

avrdude error: unknown response=0x12

avrdude done.  Thank you.

Неактивний

#10 2023-11-12 04:27:12

Daminski
Учасник
Зареєстрований: 2022-08-12
Повідомлень: 18

Re: Не працює код PWM вимикача на голому чіпі Attiny13

О, через ще 100500 спроб щось вийшло! Довелось прибрати з "t13a" літеру "a", хоча в мене мікросхема Attiny 13А. Що тепер робити далі, щоб запрацювало зчитування PWM сигналу? І щось дивне сталось з контролером. Чомусь перестав працювати код, навіть самий простий типу блінк.

avrdude: AVR device initialized and ready to accept instructions

Reading | ################################################## | 100% 0.03s

avrdude: Device signature = 0x1e9007 (probably t13)
avrdude: reading lfuse memory:

Reading | ################################################## | 100% 0.02s

avrdude: writing output file "<stdout>"
0x3a
avrdude: reading hfuse memory:

Reading | ################################################## | 100% 0.02s

avrdude: writing output file "<stdout>"
0xfb

avrdude: safemode: Fuses OK (E:FF, H:FB, L:3A)

avrdude done.  Thank you.

Остання редакція Daminski (2023-11-12 04:50:47)

Неактивний

#11 2023-11-12 09:58:56

Honey
Учасник
З Київ
Зареєстрований: 2020-09-26
Повідомлень: 433

Re: Не працює код PWM вимикача на голому чіпі Attiny13

Заміна t13a на t13 ну аж ніяк не впливає на те, що "спрацювало", бо t13a це псевдонім для t13.
З ф'юзами тіні у Вас все гаразд, можете підставити в калькулятор і подивитися, що вони означають.
Залийте на NANO "програматор" з Arduino IDE, здається проблема з ним. Якщо цікаво, в examples має бути ArduinoISP.ino - це і є вихідний код "програматора".

Неактивний

#12 2023-11-13 15:17:14

Daminski
Учасник
Зареєстрований: 2022-08-12
Повідомлень: 18

Re: Не працює код PWM вимикача на голому чіпі Attiny13

Хм,  може й дійсно проблема з моїм програматором у вигляді ардуіно нано. Ще подивився на те, які налаштування мають ті ф'юзи, що скинув вище. В них параметр CKDIV8 (ділитель частоти на 8) відключений. Але дивно чому всерівно не було ніякої реакції на PWM сигнал.

А ось що мені видав IDE, коли спробував повторно записати скетч з ArduinoISP на свою плату ардуіно нано. В принципі це те ж саме, що мені писало, коли прошивав Attiny13A за допомогою NANO. Як це виправити?

Помилка запису завантажувача.
avrdude: stk500_getsync() attempt 1 of 10: not in sync: resp=0x15
avrdude: stk500_getsync() attempt 2 of 10: not in sync: resp=0x15

avrdude: stk500_getparm(): (a) protocol error, expect=0x14, resp=0x14

avrdude: stk500_getparm(): (a) protocol error, expect=0x14, resp=0x01
avrdude: stk500_initialize(): (a) protocol error, expect=0x14, resp=0x10
avrdude: initialization failed, rc=-1
         Double check connections and try again, or use -F to override
         this check.

avrdude: stk500_disable(): unknown response=0x12


А коли натиснув ще раз на кнопку "Записати завантажувач", то виникла вже така помилка:

avrdude: Yikes!  Invalid device signature.
         Double check connections and try again, or use -F to override
         this check.

Помилка запису завантажувача.


Через деякий час пробував завантажити простий скетч блінк в свою ардуіно нано, видає ту ж саму помилку. Виходить, що якимось чином палата ардуіно зіпсувалась sad

Остання редакція Daminski (2023-11-13 15:58:59)

Неактивний

#13 2023-11-14 15:03:19

Honey
Учасник
З Київ
Зареєстрований: 2020-09-26
Повідомлень: 433

Re: Не працює код PWM вимикача на голому чіпі Attiny13

Спробуйте замінити кабель USB-miniUSB і підключити в інший USB-порт, бо щось у Вас проблема з самого початку має імовірнісний характер і прогресує.
Потестуйте на пункті 5 інструкції, має бути 100% стабільність і повторюваність.
Можна ще зробити так (скачати флеш):
avrdude -P COM4 -b 115200 -c arduino -p m328p -U flash:r:flashdump.hex:i
А потім повторювати (порівнювати зі скачаним):
avrdude -P COM4 -b 115200 -c arduino -p m328p -U flash:v:flashdump.hex:i

Неактивний

#14 2023-11-15 14:49:27

Pliamplystka
Гість

Re: Не працює код PWM вимикача на голому чіпі Attiny13

Спробуй не використовувати 0-й пін, на деяких платах він погано працює

#15 2023-11-17 04:18:00

Daminski
Учасник
Зареєстрований: 2022-08-12
Повідомлень: 18

Re: Не працює код PWM вимикача на голому чіпі Attiny13

Honey пише:

Спробуйте замінити кабель USB-miniUSB і підключити в інший USB-порт, бо щось у Вас проблема з самого початку має імовірнісний характер і прогресує.
Потестуйте на пункті 5 інструкції, має бути 100% стабільність і повторюваність.
Можна ще зробити так (скачати флеш):
avrdude -P COM4 -b 115200 -c arduino -p m328p -U flash:r:flashdump.hex:i
А потім повторювати (порівнювати зі скачаним):
avrdude -P COM4 -b 115200 -c arduino -p m328p -U flash:v:flashdump.hex:i

Дякую, ваш рецепт з командами допоміг повернути до нормальної роботи мою Arduino Nano smile

Хочу уточнити, що коректно працює AVRdude з вашого посилання і тільки якщо я її папку розміщаю на диску С:. А от "вбудована" версія AVRdude, котра йде в папці з ардуіно (C:/Users/user/AppData/Local/Arduino15/packages/arduino/tools/avrdude6.3.0-arduino17) чомусь взагалі не реагує на команди. Можливо тому що файл avrdude.conf знаходиться в іншій папці (C:/Users/user/AppData/Local/Arduino15/packages/arduino/tools/avrdude6.3.0-arduino17/etc).

Буду ще раз пробувати зчитати ф'юзи в аттіні. Також купив програматор USBasp і в ньому виявилась застаріла прошивка, для заміни якої потрібен другий такий самий програматор roll  Тож сподіваюсь щось вдасться зробити за допомогою ардуіно в якості програматора для аттіні.

Остання редакція Daminski (2023-11-17 04:27:36)

Неактивний

#16 2023-11-17 04:56:50

Daminski
Учасник
Зареєстрований: 2022-08-12
Повідомлень: 18

Re: Не працює код PWM вимикача на голому чіпі Attiny13

avrdude: AVR device initialized and ready to accept instructions
avrdude: device signature = 0x1e9007 (probably t13a)
avrdude: reading lfuse memory ...
avrdude: writing output file <stdout>
0x3a
avrdude: reading hfuse memory ...
avrdude: writing output file <stdout>
0xfb

avrdude done.  Thank you.

Наскільки я зрозумів, зараз ф'юзи 3A FB і в калькуляторі ф'юзів на них відключено параметр "Divide clock by 8 internally; [CKDIV8=0]", тобто ділителя частоти не має бути. А при цьому чомусь простий код PWM вимикача всерівно не працює sad В чому ще може бути причина? Частота прошивки 9.6МГц, в якості PWM сигналу використовую тестер для сервомашинок... Але тепер радує, що вже не видає помилку при прошивці, яка була з самого початку smile

Остання редакція Daminski (2023-11-17 05:04:21)

Неактивний

#17 2023-11-17 11:45:23

Honey
Учасник
З Київ
Зареєстрований: 2020-09-26
Повідомлень: 433

Re: Не працює код PWM вимикача на голому чіпі Attiny13

З ф'юзами тіні все гаразд, дільник на 8 відключений. А Ви тестували скетч на нано і параметри 1200 і 1800 підібрали на ній? Тоді переконайтеся, що при компіляції скетчу для нано була виставлена частота процесора 16МГц, а для тіні 9.6МГц. І взагалі, переконайтеся, що pulseIn на тіні працює. Згідно її опису, якщо імпульс не виявлено, то вона повертає 0, додайте в код: digitalWrite(1, ch3 ? HIGH : LOW); і подивіться, що на пін 1 коли є ШІМ і коли немає. Щоб не чекала дуже довго, додайте третій параметр таймаут.
Якщо avrdude.conf лежить в іншому каталозі, то шлях до нього можна задати в командному рядку ключиком -C, без ключика avrdude шукає конфіг в каталозі, який в ного був зашитий при компіляції.
USBasp можна прошити за допомогою нано:
avrdude -P COM4 -b 19200 -c avrisp -p m8a -U flash:w:usbasp.atmega8.2011-05-28.hex
Прошивку взяти звідси і на USBasp замкнути перемичку Selfprogramming (дивіться схему USBasp).

Неактивний

#18 2024-03-08 23:28:26

Daminski
Учасник
Зареєстрований: 2022-08-12
Повідомлень: 18

Re: Не працює код PWM вимикача на голому чіпі Attiny13

Хм, декілька разів ще восени заходив сюди і наче не було відповіді від вас. А зараз зайшов і бачу, що відповідь була в той час. Тоді повернемось до теми, бо проблема так і не вирішилась за цей час.

Honey пише:

А Ви тестували скетч на нано і параметри 1200 і 1800 підібрали на ній?

Я тестував цей самий код на модулі з Attiny85, який на товстому текстоліті і вставляється в USB  порт. Там все запрацювало як треба зі значеннями 1200 та 1800. А от на Attiny13 цей самий код не завівся.

Honey пише:

Тоді переконайтеся, що при компіляції скетчу для нано була виставлена частота процесора 16МГц, а для тіні 9.6МГц. І взагалі, переконайтеся, що pulseIn на тіні працює. Згідно її опису, якщо імпульс не виявлено, то вона повертає 0, додайте в код: digitalWrite(1, ch3 ? HIGH : LOW); і подивіться, що на пін 1 коли є ШІМ і коли немає.

Для тіні стоїть 9.6МГц. Вставив код digitalWrite(1, ch3 ? HIGH : LOW); і чомусь ніякої реакції у світлодіода не було, що з приєднаним проводом ШІМ сигналу від тестера сервомашинок, що з від'єднаним проводом... Як можна ще спробувати визначити чи підключений провід з ШІМ сигналом?

Ще робив експерименти з кількістю імпульсів зчитування ШІМ сигналу і чомусь від тестера сервомашинок тіні запрацювала на значеннях 600 та 900. При чому тестер сервомашинок видає 800-2200 імпульсів ШІМ. І чомусь, коли в коді вказано максимально 900 імпульсів, на тестері сервомашинок крутилку треба майже до кінця повернути, тоді є реакція. Але прикрий момент у тому, що з іншими пристроями, які генерують ШІМ сигнал аттіні знов не працює, навіть з такими налаштуваннями зчитування сигналу.

Чи є цьому якесь пояснення і чи можна тепер заставити тіні працювати і з іншими пристроями окрім тестера сервомашинок?

Неактивний

#19 2024-03-09 02:06:24

dimich
Учасник
Зареєстрований: 2023-12-01
Повідомлень: 205

Re: Не працює код PWM вимикача на голому чіпі Attiny13

Daminski пише:

Чи є цьому якесь пояснення

Може бути декілька пояснень.
В першу чергу впевніться, що всі флаги препроцесора, компілятора і лінкера коректні. Як ви збираєте скетч, в IDE? Увімкніть "Show verbose output during compile" (чи як воно там в локалізованому варіанті) і покажіть вивод процесу збірки.

pulseIn() рахує, скільки ітерацій циклу встигає виконатись перед зміною стану піна. Звісно, при обробці переривання виконання циклу призупиняється і ітерації не рахуються. В ардуіно переривання по таймеру виникає кожні 64 * 256 = 16384 такта. Один і той же код обробника переривання на 16 МГц виконується в 1.7 рази швидше, ніж на 9.6 МГц.
В коментарі до pulseIn() пишуть:

This function performs better with short pulses in noInterrupt() context

Спробуйте вимкнути обробку переривань. Звісно, millis()/micros() в такому разі не будуть працювати правильно.

Також внутрішній RC-осциллятор без калібровки має нестабільність до 10%, на граничних значеннях це теж може впливати.

Доречі, вимкнути дільник частоти на 8 можна і програмно за допомогою clock_prescale_set(), без перешивання фʼюза.

Daminski пише:

і чи можна тепер заставити тіні працювати і з іншими пристроями окрім тестера сервомашинок?

Для точного виміру інтервалів часу я би не звʼязувався з бібліотеками ардуіно, а виміряв би таймером напряму.

Остання редакція dimich (2024-03-09 02:59:54)

Неактивний

#20 2024-03-09 10:23:50

Honey
Учасник
З Київ
Зареєстрований: 2020-09-26
Повідомлень: 433

Re: Не працює код PWM вимикача на голому чіпі Attiny13

Daminski пише:

Але прикрий момент у тому, що з іншими пристроями, які генерують ШІМ сигнал аттіні знов не працює, навіть з такими налаштуваннями зчитування сигналу.

Чи є цьому якесь пояснення і чи можна тепер заставити тіні працювати і з іншими пристроями окрім тестера сервомашинок?

А Ви з піном не помилилися? Бо пін в високоімпедансному стані і від наводок щось зловить.

Неактивний

#21 2024-03-09 10:38:27

Daminski
Учасник
Зареєстрований: 2022-08-12
Повідомлень: 18

Re: Не працює код PWM вимикача на голому чіпі Attiny13

Думаю не посилився. Я використовував для зчитування сигналу пін #3, який являється другою від ключа ніжкою на мікросхемі. Якщо я не задаю на нього зчитування сигналу, то реакції ніякої немає. А от якщо цей вивід налаштований на зчитування сигналу і "висить в повітрі", то так, він хибно вмикається. Як можна програмно зчитувати наявність чи відсутність сигналу? Той код, що ви скинули вище чомусь не запрацював. Ну і саме головне – незрозуміло чому на тестері сервомашинок чіп спрауьовує від значень 600 та 900 імпульсів, а з іншими пристроями вже не працює і не може працювати на 1200 і 1800 імпульсів:(

Неактивний

#22 2024-03-09 10:53:17

Honey
Учасник
З Київ
Зареєстрований: 2020-09-26
Повідомлень: 433

Re: Не працює код PWM вимикача на голому чіпі Attiny13

pinMode(3, INPUT);
замініть на
pinMode(3, INPUT_PULLUP);
Якщо після цього і з тестером перестане працювати, значить спрацьовувало від наводок.

Як Вам радив dimich, виконуйте pulseIn() при вимкнених перериваннях
__builtin_avr_cli();
ch3 = pulseIn(3, HIGH, timeout);
__builtin_avr_sei();

Остання редакція Honey (2024-03-09 10:55:19)

Неактивний

#23 2024-03-09 19:09:32

dimich
Учасник
Зареєстрований: 2023-12-01
Повідомлень: 205

Re: Не працює код PWM вимикача на голому чіпі Attiny13

А який пекедж використовуєте для attiny13? MicroCore?
У них досить дивна реалізація pulseIn().
Коментар до значення що повертається:

  // Convert the reading to microseconds.
  return (width); // Multiply by 16

Але ж повертається просто кількість ітерацій.
Обчислення таймаута бере до уваги F_CPU, а значення що повертається - ні. Схоже, ця реалізація не розрахована на частоту, відмінну від 16 МГц.
До того ж цикл реалізований на C. Я би не покладався на те, що він завжди буде 16 тактів незалежно від версії та опцій оптимізації компілятора.

Daminski пише:

Ну і саме головне – незрозуміло чому на тестері сервомашинок чіп спрауьовує від значень 600 та 900 імпульсів, а з іншими пристроями вже не працює

Тут уже дивіться, чим відрізняється форма сигналів на піні при використанні тестера та "інших пристроїв". Осцилограф вам у поміч.

Неактивний

#24 2024-03-09 19:22:19

dimich
Учасник
Зареєстрований: 2023-12-01
Повідомлень: 205

Re: Не працює код PWM вимикача на голому чіпі Attiny13

Доречі, щодо MicroCore:
MicroCore/issues/30
MicroCore/issues/114

Неактивний

#25 2024-03-09 19:29:36

Daminski
Учасник
Зареєстрований: 2022-08-12
Повідомлень: 18

Re: Не працює код PWM вимикача на голому чіпі Attiny13

Honey пише:

pinMode(3, INPUT);
замініть на
pinMode(3, INPUT_PULLUP);
Якщо після цього і з тестером перестане працювати, значить спрацьовувало від наводок.

Додав "_PULLUP", теж запрацювало з тестером сервомашинок і значеннями 600 та 900

Honey пише:

Як Вам радив dimich, виконуйте pulseIn() при вимкнених перериваннях
__builtin_avr_cli();
ch3 = pulseIn(3, HIGH, timeout);
__builtin_avr_sei();

На такий код видає помилку "'builtin_avr_cli' was not declared in this scope", хоча в коді написано саме "builtin_avr_cli();"
"

Неактивний

Швидке повідомлення

Введіть повідомлення і натисніть Надіслати

Підвал форуму