Ви не увійшли.
Вітаю! Намагаюсь зробити, щоб запрацював елементарний код 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
Підскажіть, будь ласка, в чому може бути справа?
Неактивний
Про ф'юзи гляньте в цій темі, щоб не повторюватись
Дякую, трохи почитав цю тему, подивився калькулятьр ф'юзів, але не розумію як це мені може допомогти. Коли я прошиваю Attiny мені перший раз видає помилку, що написана червоним текстом на початку теми, а на другу спробу завантажити скетч - нормально прошиває чіп і працює будь який простий код. Але саме функція pulseIn() таке враження, що взагалі не працює і нічого не считує. Хоча сигнальний провід від тестера сервомашинок підключений в наступний пін після піна з ключем (ніжка №2, пін PB3).
Чи ці ф'юзи можуть якось впливати на роботу функції pulseIn()?
Неактивний
Нарешті розібрався як за допомогою командної строки зчитувати ф'юзи, знайшов приклади на ютубі. Але всерівно щось не так. Аттіні прошивається нормально, а в командній строці при спробі зчитати інформацію про ф'юзи видає помилку, наче плата не підключена. Хоча порт вказував вірний, як пише в Arduino IDE (COM4), а тут чомусь пише "com1"... І ось яку помилку видає зараз в командній строці:
avrdude: ser_open(): can't open device ".com1": ═х єфрхЄё эрщЄш єърчрээ√щ Їрщы.
Що це тепер може бути?
Остання редакція Daminski (2023-11-10 23:53:16)
Неактивний
Ви вказали в команді перед COM4 якийсь не той ключик, а по замовчуванню воно використовує COM1.
Команда для читання ф'юзів така:
avrdude -P COM4 -b 19200 -c avrisp -p t13a -U lfuse:r:-:h -U hfuse:r:-:h
Неактивний
Ви вказали в команді перед COM4 якийсь не той ключик, а по замовчуванню воно використовує COM1.
Команда для читання ф'юзів така:
avrdude -P COM4 -b 19200 -c avrisp -p t13a -U lfuse:r:-:h -U hfuse:r:-:h
Дякую, тепер хоч без ієрогліфів показало щось, але всерівно якась помилка
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.
Неактивний
О, через ще 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)
Неактивний
Заміна t13a на t13 ну аж ніяк не впливає на те, що "спрацювало", бо t13a це псевдонім для t13.
З ф'юзами тіні у Вас все гаразд, можете підставити в калькулятор і подивитися, що вони означають.
Залийте на NANO "програматор" з Arduino IDE, здається проблема з ним. Якщо цікаво, в examples має бути ArduinoISP.ino - це і є вихідний код "програматора".
Неактивний
Хм, може й дійсно проблема з моїм програматором у вигляді ардуіно нано. Ще подивився на те, які налаштування мають ті ф'юзи, що скинув вище. В них параметр 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.
Помилка запису завантажувача.
Через деякий час пробував завантажити простий скетч блінк в свою ардуіно нано, видає ту ж саму помилку. Виходить, що якимось чином палата ардуіно зіпсувалась
Остання редакція Daminski (2023-11-13 15:58:59)
Неактивний
Спробуйте замінити кабель 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
Неактивний
Спробуй не використовувати 0-й пін, на деяких платах він погано працює
Спробуйте замінити кабель 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
Хочу уточнити, що коректно працює 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 і в ньому виявилась застаріла прошивка, для заміни якої потрібен другий такий самий програматор Тож сподіваюсь щось вдасться зробити за допомогою ардуіно в якості програматора для аттіні.
Остання редакція Daminski (2023-11-17 04:27:36)
Неактивний
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 вимикача всерівно не працює В чому ще може бути причина? Частота прошивки 9.6МГц, в якості PWM сигналу використовую тестер для сервомашинок... Але тепер радує, що вже не видає помилку при прошивці, яка була з самого початку
Остання редакція Daminski (2023-11-17 05:04:21)
Неактивний
З ф'юзами тіні все гаразд, дільник на 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).
Неактивний
Хм, декілька разів ще восени заходив сюди і наче не було відповіді від вас. А зараз зайшов і бачу, що відповідь була в той час. Тоді повернемось до теми, бо проблема так і не вирішилась за цей час.
А Ви тестували скетч на нано і параметри 1200 і 1800 підібрали на ній?
Я тестував цей самий код на модулі з Attiny85, який на товстому текстоліті і вставляється в USB порт. Там все запрацювало як треба зі значеннями 1200 та 1800. А от на Attiny13 цей самий код не завівся.
Тоді переконайтеся, що при компіляції скетчу для нано була виставлена частота процесора 16МГц, а для тіні 9.6МГц. І взагалі, переконайтеся, що pulseIn на тіні працює. Згідно її опису, якщо імпульс не виявлено, то вона повертає 0, додайте в код: digitalWrite(1, ch3 ? HIGH : LOW); і подивіться, що на пін 1 коли є ШІМ і коли немає.
Для тіні стоїть 9.6МГц. Вставив код digitalWrite(1, ch3 ? HIGH : LOW); і чомусь ніякої реакції у світлодіода не було, що з приєднаним проводом ШІМ сигналу від тестера сервомашинок, що з від'єднаним проводом... Як можна ще спробувати визначити чи підключений провід з ШІМ сигналом?
Ще робив експерименти з кількістю імпульсів зчитування ШІМ сигналу і чомусь від тестера сервомашинок тіні запрацювала на значеннях 600 та 900. При чому тестер сервомашинок видає 800-2200 імпульсів ШІМ. І чомусь, коли в коді вказано максимально 900 імпульсів, на тестері сервомашинок крутилку треба майже до кінця повернути, тоді є реакція. Але прикрий момент у тому, що з іншими пристроями, які генерують ШІМ сигнал аттіні знов не працює, навіть з такими налаштуваннями зчитування сигналу.
Чи є цьому якесь пояснення і чи можна тепер заставити тіні працювати і з іншими пристроями окрім тестера сервомашинок?
Неактивний
Чи є цьому якесь пояснення
Може бути декілька пояснень.
В першу чергу впевніться, що всі флаги препроцесора, компілятора і лінкера коректні. Як ви збираєте скетч, в 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(), без перешивання фʼюза.
і чи можна тепер заставити тіні працювати і з іншими пристроями окрім тестера сервомашинок?
Для точного виміру інтервалів часу я би не звʼязувався з бібліотеками ардуіно, а виміряв би таймером напряму.
Остання редакція dimich (2024-03-09 02:59:54)
Неактивний
Але прикрий момент у тому, що з іншими пристроями, які генерують ШІМ сигнал аттіні знов не працює, навіть з такими налаштуваннями зчитування сигналу.
Чи є цьому якесь пояснення і чи можна тепер заставити тіні працювати і з іншими пристроями окрім тестера сервомашинок?
А Ви з піном не помилилися? Бо пін в високоімпедансному стані і від наводок щось зловить.
Неактивний
Думаю не посилився. Я використовував для зчитування сигналу пін #3, який являється другою від ключа ніжкою на мікросхемі. Якщо я не задаю на нього зчитування сигналу, то реакції ніякої немає. А от якщо цей вивід налаштований на зчитування сигналу і "висить в повітрі", то так, він хибно вмикається. Як можна програмно зчитувати наявність чи відсутність сигналу? Той код, що ви скинули вище чомусь не запрацював. Ну і саме головне – незрозуміло чому на тестері сервомашинок чіп спрауьовує від значень 600 та 900 імпульсів, а з іншими пристроями вже не працює і не може працювати на 1200 і 1800 імпульсів:(
Неактивний
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)
Неактивний
А який пекедж використовуєте для attiny13? MicroCore?
У них досить дивна реалізація pulseIn().
Коментар до значення що повертається:
// Convert the reading to microseconds.
return (width); // Multiply by 16
Але ж повертається просто кількість ітерацій.
Обчислення таймаута бере до уваги F_CPU, а значення що повертається - ні. Схоже, ця реалізація не розрахована на частоту, відмінну від 16 МГц.
До того ж цикл реалізований на C. Я би не покладався на те, що він завжди буде 16 тактів незалежно від версії та опцій оптимізації компілятора.
Ну і саме головне – незрозуміло чому на тестері сервомашинок чіп спрауьовує від значень 600 та 900 імпульсів, а з іншими пристроями вже не працює
Тут уже дивіться, чим відрізняється форма сигналів на піні при використанні тестера та "інших пристроїв". Осцилограф вам у поміч.
Неактивний
Доречі, щодо MicroCore:
MicroCore/issues/30
MicroCore/issues/114
Неактивний
pinMode(3, INPUT);
замініть на
pinMode(3, INPUT_PULLUP);
Якщо після цього і з тестером перестане працювати, значить спрацьовувало від наводок.
Додав "_PULLUP", теж запрацювало з тестером сервомашинок і значеннями 600 та 900
Як Вам радив 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();"
"
Неактивний