Ви не увійшли.
Подивіться Модуль розширення портів з інтерфейсом 1-wire, в ньому є функція відстеження стану порта, призначена для побудови охоронної системи, може це саме те, що вам потрібно. 1-wire дозволяє почепити на одну шину безліч таких модулів, використавши лише один пін мікроконтролера для керування всіми ними. Або 1-wire можна підключити напряму до лінукс, для роботи з такими модулями є драйвер.
а також щоби ця частота була на виходах 26 та 36, як відомо, tone() може працювати одночасно тільки на одному порті, тому треба зробти якесь швидке перекидання чи якийсь інший фокус, щоби вона була на цих двух портах.
припаяйте перемичку
GmmC пише:можливо одночасно буде реалізувати також шім по двух чи одному каналу?
На одному таймері з довільною частотою два канала не вийде: у таймера два регістра-компаратора, і один із них використовується або як один із каналів ШІМ, або для керування частотою.
Подивіться режими, коли верхня межа лічильника задається регістром ICR, тоді обидва регістри-компаратори доступні для ШІМ.
Частоту і коефіцієнт заповнення ШІМ на AVR не вийде встановлювати абсолютно довільно, лише ось такі дискретні значення:
Частота: f=16MHz/N, де N=1..65536
Коеф.заповнення: d=n/N, де N - те ж саме, яке використано для підбору частоти, n=0..N
analogWrite(PIN_RELAY, 0);
Якщо я не помиляюсь, дана команда увімкне ШІМ з коефіцієнтом заповнення 1/256 (а параметр 255 дасть коефіцієнт заповнення 256/256 - завжди на одиничку більше, тобто за допомогою analogWrite неможливо отримати коефіцієнт заповнення 0/256)
Як можна з Вами зв'язатись
Зліва під аватаркою натискаєте на "E-mail" і відправляєте повідомлення.
pinMode(3, INPUT);
замініть на
pinMode(3, INPUT_PULLUP);
Якщо після цього і з тестером перестане працювати, значить спрацьовувало від наводок.
Як Вам радив dimich, виконуйте pulseIn() при вимкнених перериваннях
__builtin_avr_cli();
ch3 = pulseIn(3, HIGH, timeout);
__builtin_avr_sei();
Але прикрий момент у тому, що з іншими пристроями, які генерують ШІМ сигнал аттіні знов не працює, навіть з такими налаштуваннями зчитування сигналу.
Чи є цьому якесь пояснення і чи можна тепер заставити тіні працювати і з іншими пристроями окрім тестера сервомашинок?
А Ви з піном не помилилися? Бо пін в високоімпедансному стані і від наводок щось зловить.
Подавайте PWM на серву, але якщо дуже хочеться і є зайві гроші, звертайтесь, напишу Вам PWM->PDM конвертер.
В мене драйвер 3.5.2019.1, спробую останній 3.6.2021.12
У мене також версія 3.5.2019.1, але ніяких проблем немає, перемичку не використовую. Проблема, мабуть, в чомусь іншому.
Добрий день. Скажіть чи працює avrdude на windows 10?
У мене віндовс 10 і на ній працює. Драйвер USB-UART CH340 версії 3.5.2019.1
Можливо знадобиться такий лайфхак, коли будете використовувати avrdude з ключиком "-c avrisp"
Конденсатор (між RST і GND, або RST і VCC) чи перемичка (між RST і VCC) використовуються як лайфхак, якщо драйвер USB-UART (CH340) неправильно керує сигналом DTR, в мене в віндовс 10 з цим проблем немає, в лінуксі пробема зникла коли перейшов на ядро 5.4.х (на 4.х ще була така проблема).
Honey, людина просила простий приклад. Хоча ваш код і виконує його забаганку, але навряд чи він розбереться у ньому.
В шести рядках (куди ж вже простіший код?) має розібратися. Там та ж ідея "інтерпретатора", яку щойно докладно "для домогосподарок" розписав dimich. (dimich, респект!)
#define LED_PIN 13
#define LED_ON HIGH
#define LED_OFF LOW
short durations[] = {
// state 0
1000, -1, // always OFF (loop)
// state 2 (SOS)
100, // initial delay
// loop start
500, 500, 500, 500, 500, 1500, // ON/OFF durations
1500, 500, 1500, 500, 1500, 1500,
500, 500, 500, 500, 500, 2000,
-18, // goto 18 steps back == loop start
// state 22
0,
1000, 500, 1000, 500, 1000, 500+5000,
2000, 5000, 2000, 5000+10000,
500, 1500, 1000, 2000,
-14, // Чєрєз пять мінут наступаєт зіма
};
byte state = 22; // state = 2 for SOS
unsigned long start_time = 0;
void setup(void) {
pinMode(LED_PIN, OUTPUT);
}
void loop(void) {
digitalWrite(LED_PIN, (state & 1) ? LED_ON : LED_OFF);
unsigned long cur_time = millis();
if (cur_time - start_time >= durations[state]) {
if (durations[++state] < 0)
state += durations[state];
start_time = cur_time;
}
}
А думав що тут той самий принцип як і заливкою через usb, якщо заливаємо hex без бутлоадеру, то при перепрошивці бутлоадер не чіпається. А тут виявляється що потрібно заливати hex з назвою ....ino.with_bootloader.hex або прошивати бутлоадер при потребі окремо?
В бутлоадері запрограмовано, щоб він сам себе не затирав.
В avrdude просто вказуєте підряд обидві прошивки: -U flash:w:optiboot_atmega328.hex:i -U flash:w:myfirmware.hex:i
І ще тоді запитання: при наявності бутлоадера і залочці через lock bit через бутлоадер можно прошивку зляти? В гуглі одні пишуть так, інші пишуть ні
Прошивка сама себе може читати і при бажанні кудись відправити. Можна захистити від читання код бутлоадера з коду користувача - це може бути дійсно корисно. Можна навпаки - код користувача від бутлоадера (мабуть, це мали на увазі ті, хто писав що можна захистити), але це створить лише незручності, бо бутлоадер не зможе перевіряти те, що записав, а скинути лок можна лише стиранням всього флеш через ISP, програмно ніяк.
Доречі "відключити бутлоадер" і "затерти бутлоадер" це не одне й те ж, затертий бутлоадер все одно буде виконуватись, але оскільки в ньому порожні команди, то керування врешті передасться на прошивку користувача, а ці кілька десятків зайвих мікросекунд Ви не помітите.
Ще одне таке питання: після залочки (біт FC) на нано пропадає можливість запису прошивки через usb, процес просто висить.
Через arduinoISP прошивається. Це так і має бути?Зашив прошивку через arduinoISP, біт скинувся на FF, але через usb вже не прошивається. Хоча юсб працює, через serial я отримую данні з прошивки
Коли Ви записуєте прошивку в ціль, то затирається бутлоадер.
Подивіться інструкцію, там є приклади, як відновити бутлоадер.
0x3c це приклад для tiny13a, я ж написав, що Вам для своєї m328p потрібно почитати в даташиті правильне значення. Я записую в tiny13a 0x3c (хоча по даташиту маю записувати 0xfc), щоб не виводило помилку.
Подивився даташит, Вам для m328p потрібно також писати 0xfc і у Вас і читається 0xfc, тобто все ок.
Якщо розберетесь як оновити драйвер, щоб був не потрібен лайфхак, відпишіться, будь ласка, в цю тему.
E:avrdude-v7.1-windows-windows-x64>avrdude -P COM70 -b 57600 -c avrisp -p m328p -U lock:r:-:h
Не помітив одразу... ArduinoISP працює ж на швидкості 19200 а не 57600. У Вас наявна проблема з драйвером CH340 і потрібен "лайфхак з RST". Тобто зараз драйвер смикає DTR і Ви заливаєте прошивку і читаєте лок не з цілі а з тієї нано, що напряму підключена до юсб.
Залийте спочатку ArduinoISP.hex (бо зараз Ви його затерли), а потім поставте конденсатор між RST і GND на програматорі і спробуйте ще раз прочитати лок, має бути 0xff.
Після заливки прошивки (це скидає лок в початкове значення 0xff) спробуйте спочатку прочитати (-U lock:r:-:h), читає 0xff чи 0x00 ?
Почитайте в даташиті на m328p, що які лок-біти означають, я давав приклад для t13a.
Ще там є прикол, що записуєш одне значення, а при читанні (перевірці) деякі біти дзеркаляться в інші позиції (наприклад в t13a записуєш 0xfc=0b11111100, а при читанні повертає 0x3c=0b00111100, біти з позицій 0 і 1 дзеркаляться в 6 і 7 позиції)
І ще одне питання: використовуються D11, D12, D13, тобто якщо в мене до цих ніг щось підключене, то доведеться спочатку відпаяти перед тим як вносити зміни по бітам? А якщо там вже зашита прошивка яка використовує ці ноги?
Тобто краще в нову ардуіно прошити лок біти, а потім вже розпаюваті і заливати прошивку?
Коли RST замикається на землю, робота прошивки зупиняється і всі ноги мк переходять в високоімпедансний стан (крім MISO), тому відповідь на питання чи можна не випаювати мк зі схеми залежить лише від Вашої схеми а не від прошивки, дивіться по схемі, як вона реагуватиме на наявність сигналів на SCK,MISO,MOSI.
І друге: на Вашій схемі небачу перемички чи конденсатора на RST програматора, він вже не потрібен?
Конденсатор (між RST і GND, або RST і VCC) чи перемичка (між RST і VCC) використовуються як лайфхак, якщо драйвер USB-UART (CH340) неправильно керує сигналом DTR, в мене в віндовс 10 з цим проблем немає, в лінуксі пробема зникла коли перейшов на ядро 5.4.х (на 4.х ще була така проблема).
чи достатньо nano використати як ArduinoISP для зміни лог бітів іншої нано чи все ж таки купляти окрему avrisp? На ютюбі бачив відео де було сказано що nano для avrdude і різних бітів не дуже підходить
Прошивають і змінюють біти вони абсолютно однаково, тут питання лише в зручності підключення до програматора окремими дротами або готовим шлейфом.
І ще про порядок такої прошивки: я заливаю скетч, і потім окремо виставляю лок біти? А після лок бітів можно ще раз заливати прошивку чи вже все?
Лок-біти працюють так:
* їх можна встановити на будь-якому етапі
* їх можна скинути лише з одночасною очисткою флешу і еепром
* коли встановлені, то замість флеш і еепром читаються випадкові дані
Це дає можливість:
* захистити прошивку від читання
* багаторазово оновлювати прошивку
Не плутайте лок-біти з ф'юзами, деякі ф'юзи можуть "зацеглити" м/к, але лок-бітів це не стосується, вони безпечні.
за допомогою стандартного радіобрелка
Можете взяти за основу мій код для читання радіобрелоків з цього поста.
Для м/к з напругою 3.3V є такі варіанти:
3) є ще варіант (не відмовляючись від батарейки) подати на VCC лічильника 5V, а DQ підключити до м/к без перетворювача логічних рівнів (тобто на ньому буде до 3.3V) - на коротких шинах має працювати.
Найкращим для довгої шини є варіант (1), а якщо лічильник, м/к і батарейка розташовані в одному корпусі, то варіант (2).
по якій схемі і з якими налаштуваннями треба з‘єднати ваш модуль з єсп32?
Лічильник розрахований на стандартну напругу шини 1-wire 4.5-5.5V, цю напругу диктує батарейка - напруга шини має бути більшою від напруги батарейки мінімум на 0.65V, інакше лічильник відключає свій інтерфейс 1-wire і працює автономно в режимі лише підрахунку імпульсів. Для м/к з напругою 3.3V є такі варіанти:
1) перетворювач логічних рівнів для 1-wire, щоб на 1-wire було 5V
2) відмовитись від батарейки, закоротивши контакти в роз'ємі батарейки монетками, тоді лічильник зможе працювати з напругою 3.3V на 1-wire, але Ви втратите автономність - втрата зовнішнього живлення призведе до скидання лічильника. Цей варіант підійде лише якщо м/к зі своїм батарейним живленням зовсім поряд.