#1 Re: Програмування Arduino » Регістрова змінна » 2025-08-20 20:45:33

В avr-gcc можна об'явити глобальну змінну:
register uint8_t myregvar asm("r16");
вона гарантовано буде в r16, але код на C не буде з нею працювати оптимально.
На asm (або вставками на asm) з нею можна працювати як завгодно оптимально і одночасно мати доступ з C, це зручно, коли частина проекту на asm, а частина на C.

upd:
якщо потрібна двобайтова змінна, то:
register uint16_t myregvar asm("r16");
в коді на asm r16 буде молодшим, r17 - старшим

#3 Re: Програмування Arduino » Arduino vs LCD Trium Mars трабл » 2025-08-14 22:45:56

dimich пише:

Доречі, вам не вдавалось піднімати w1-uart на x86? У мене з наскоку не вийшло, схоже, потрібно патчити таблицю ACPI. Поки що не розібрався, як це правильно зробити.

В мене колись також з наскоку не вийшло розібратися як приєднати serdev до пристрою без використання DT, так щоб з командного рядка за бажанням, тому забив на нього і написав драйвер через ldisc. Через ldisc у драйвера нажаль відсутня можливість керувати baudrate, так би я до пари написав би і w1-uart )) , бо добре розібрався з нутрощами W1.

dimich пише:

Драйвер для CH341A я тільки підтримую, щоб компілювався для сучасних ядер.

А що там не так з ch341, що він працює максимум на 250000 BAUD, а далі таке враження, що в нього там буфер на читання лише 32 байти? Пробував ось цей, 500000 BAUD тягне.

#4 Re: Програмування Arduino » Arduino vs LCD Trium Mars трабл » 2025-08-14 20:07:55

dimich пише:

Тільки для SPI-дисплеїв все одно доведеться задіяти GPIO, бо як мінімум ще DATA/COMM треба смикати.

dimich пише:

Якщо хочеться ще GPIO, наприклад, для RST, то треба поправити таблицю в коді та перезібрати драйвер. Все руки не дійдуть реалізувати цю конфігурацію у вигляді параметра.

Подивіться ось тут ідею, як використовуючи другий CS керувати DATA/COMM та отримати додаткові бонуси від двох SPI.
Може і необхідність правити відпаде)

#6 Re: Апаратні питання » DigiSpark Attiny85 проблема з логічною 1 на виході. » 2025-06-13 22:27:58

dimich пише:
Honey пише:

А ШІМ на outMotorOil завдяки ось цим незалежним одна від одної умовам

Є таке. Тільки чому така залежність від версії core, різниця в реалізації millis() не мала би так впливати. Хоча тут спостерігається залежність і від частоти вхідних імпульсів.

Може це не від core залежить, а від даних в EEPROM? Спробуйте помістити в кінець setup:
ImpulseOilMotor = maxImpulseOilMotor+1;

#7 Re: Апаратні питання » DigiSpark Attiny85 проблема з логічною 1 на виході. » 2025-06-13 21:43:57

А ШІМ на outMotorOil завдяки ось цим незалежним одна від одної умовам:

if (millis() - TimeStart > RoadTime * 1024) {
        digitalWrite(outMotorOil, HIGH);
...
if (millis() - TimeStart > RainTime * 1024) {
        digitalWrite(outMotorOil, HIGH);
...

та

if (TriMin < 7000) {
...
    } else {
      digitalWrite(outMotorOil, LOW);
...

#8 Re: Апаратні питання » DigiSpark Attiny85 проблема з логічною 1 на виході. » 2025-06-13 20:49:38

Якщо ще розбираєтесь, звідки вилазить ШИМ, то це результат конкуренції кількох незалежних "мигалок":

        // Мигаем с частотой 2 и более Гц
        if ((timeAfterStartVeryLong % 500) < 250)
          digitalWrite(LEDMode, HIGH);
        else
          digitalWrite(LEDMode, LOW);
      // Мигаем с частотой 1 Гц пока не отпустят кнопку
      if ((timeAfterStartVeryLong % 1000) < 500)
        digitalWrite(LEDMode, HIGH);
      else
        digitalWrite(LEDMode, LOW);
      // мигаем светодиодом с частотой 3 Гц
      if ((TriMin % 500) < 250)
        digitalWrite(LEDMode, HIGH);
      else
        digitalWrite(LEDMode, LOW);

і є ще одна в DisplayOilMode()

#9 Re: Програмування Arduino » парсинг NMEA **проблема » 2025-04-05 11:22:47

Спробуйте без sscanf, якось так:

#include <stdio.h>
#define TOKEN_COUNT 11
#define TOKEN_SIZE  88
char token[TOKEN_COUNT][TOKEN_SIZE];
void process() {
 int i;
 for (i = 0; i < TOKEN_COUNT; i++)
  printf("token[%i]='%s'\n", i, token[i]);
}
int main() {
 int i = 0, j = 0;
 for (;;) {
  char c = getchar();
  if (c == EOF) {
   break;
  } else if (c == '\n') {
   while (i < TOKEN_COUNT) {
    token[i++][j] = 0;
    j = 0;
   }
   i = 0;
   process();
  } else if (c == ',') {
   if (i < TOKEN_COUNT)
    token[i++][j] = 0;
   j = 0;
  } else {
   if (i < TOKEN_COUNT && j < TOKEN_SIZE - 1)
    token[i][j++] = c;
  }
 }
}

#10 Re: Програмування Arduino » не працює ArduinoISP » 2025-03-20 21:02:25

Спробуйте зробити за допомогою avrdude з командного рядка по цій інструкції https://forum.arduino.ua/viewtopic.php?id=2904
Також подивіться, що за ArduinoISP.ino ви компілюєте, його потрібно брати з arduino-examples, бо в інеті валяється купа його непрацюючих модифікацій.

#11 Re: Програмування Arduino » Допомога з конвертацією float в HEX » 2025-03-15 15:39:17

float floatval = 26.4212;
int intval = floatval * 100 + 0.5;
Send_ar[6] = intval >> 8;
Send_ar[7] = intval & 0xff;

#12 Re: Програмування Arduino » Ошибка компиляции » 2025-03-07 12:38:24

vigor53 пише:

Доброго всем здоровья!
Просветите пожалуйста строчка в коде что означает  4000000.0F

#define resistorValue  4000000.0F   // change this to whatever resistor value you are using

F - суфікс для константи типу float
https://en.wikipedia.org/wiki/C_data_types

#13 Re: Програмування Arduino » Циклічний (коловий) масив » 2025-01-03 21:42:24

Основною фішкою рінгбуфера (якщо не псувати "оптимізаціями" стандартну реалізацію) є можливість виконувати запис і читання в двох окремих потоках без будь-яких синхронізацій між ними.

#14 Re: Програмування Arduino » Led Cub 4*4*4 » 2025-01-02 09:41:05

Зробіь масив int random_index[16]; спочатку заповніть його числами від 0 до 15, а потім їх перетасуйте (google: shuffle), з масиву послідовно берете індекс і заповнюєте цей стовпчик

#15 Re: Програмування Arduino » Led Cub 4*4*4 » 2025-01-01 18:44:36

Вилазите за межі масива
i=4 замінити на i=3
i<=4 замінити на i<4

#16 Re: Апаратні питання » Усилтель напряжения с 5 на 10 вольт или АЦП 10 вольт » 2024-12-23 18:47:33

shrek пише:

Как не крути переменный резистор, на выходе всегда 11.2.

У Вас входи підсилювача закорочені між собою.

#18 Re: Проекти » Моніторинг батареї UPS через інтернет » 2024-12-21 09:55:48

З езернет інтерфейсом https://github.com/honechko/snmpvm
Ще поки руки не дійшли замовити в китаї платки та оформити в пристойному вигляді

#19 Re: Програмування Arduino » Нужна консультация ардуино + Nextion экран. Заплачу. » 2024-10-27 10:13:27

dimich пише:

Вставив картинкою бо форумний двіжок зʼїдає бекслеші в тексті

Ставте два бекслеша підряд. При використанні "попередній перегляд" один бекслеш зникає в вікні вводу тексту, тому доводиться ще раз розставляти дублі.

#20 Re: Проекти » Майстер шини 1-wire + Linux » 2024-10-17 16:30:51

Оффтоп: може кому пригодиться така ідея конвертера логічних рівнів для ESP-01 на основі цієї платки, використовував її при розробці прошивки, також можна використати для отримання 5-вольтового 1-wire.
P1150223_s.jpg
P1150224_s.jpgP1150225_s.jpg

#21 Re: Проекти » Майстер шини 1-wire + Linux » 2024-10-17 14:38:29

Зарезервований коментар, якщо тема розростеться, щоб робити тут посилання по темі.

#22 Проекти » Майстер шини 1-wire + Linux » 2024-10-17 14:37:09

Honey
відповідей: 3

Для тих, хто працює з 1-wire під Linux, доступні два способи роботи з адаптером (майстром шини 1-wire): з простору користувача (найпопулярнішим ПЗ є OWFS) і через драйвер в ядрі. В OWFS реалізована робота майже з усіма існуючими адаптерами, а от в ядрі не густо, є драйвери GPIO-адаптера (w1-gpio), USB-адаптера (ds2490), I2C-адаптера (ds2482), але чомусь не було UART-адаптера (ds2480b).

Коли я вибирав, на якій мікросхемі зробити готовий пристрій, то, незважаючи на це, вибрав UART-інтерфейс, оскільки для моїх задач була необхідна гальванічна розв'язка і зробити її значно простіше на однонаправлених лініях, а з драйвером вирішив "розібратися" пізніше. Є ще й друга причина вибору саме послідовного інтерфейсу, але про це згодом.

Отже, Linux-драйвер для ось такого готового майстра шини 1-wire на мікросхемі ds2480b вже є і його можна взяти звідси. В цій темі намагатимусь допомагати з компіляцією драйвера.

1-wire bus master

Якщо адаптер підключено до комп'ютера з Linux через USB-UART або до пінів Raspberry Pi ось так:
UART 5V
Raspberry Pi
Тоді "приєднати" драйвер до відповідного послідовного порта (/dev/ttyUSB0 або /dev/ttyAMA0) можна командою:

ser1wm_attach /dev/ttyUSB0

Виконувати цю команду можна доручити udevd, щоб він її виконував щоразу, коли до USB підключається USB-UART, до якого підключено майстер шини 1-wire. Наприклад так:

ACTION=="add", KERNEL=="ttyUSB[0-9]*", SUBSYSTEM=="tty", SUBSYSTEMS=="usb",\
 ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", ATTRS{serial}=="A50285BI",\
 RUN+="/usr/local/bin/ser1wm_attach /dev/%k"

В Linux є така утиліта socat, за допомогою якої послідовний порт по TCP можна "передати" на інший хост:

1) на боці реального послідовного порта піднімаєм сервер на TCP-порту:
socat tcp-l:4232,bind=10.0.0.4,reuseaddr /dev/ttyUSB0,raw,echo=0,b9600,cs8

2) на іншому боці підключаємось і утворюєм віртуальний послідовний порт:
socat tcp:10.0.0.4:4232 pty,raw,echo=0,link=/dev/ttyvirt0

До такого віртуального послідовного порта також можна приєднати даний драйвер:

ser1wm_attach /dev/ttyvirt0

Але в ser1wm_attach реалізована можливість робити це напряму без другої команди socat (її функціонал вбудовано), ось так:

ser1wm_attach 10.0.0.4:4232

Кмітливі вже здогадалися, що і першу команду socat також можна в щось вбудувати, наприклад реалізувати її на мікроконтролері з мережевим інтейфейсом, до якого підключено майстер шини 1-wire (або навіть і майстер шини реалізувати програмно). Це і є та друга причина, по якій вибрано послідовний інтерфейс, оскільки його без будь-яких алгоритмів і overhead можна передавати по TCP.

В якості proof-of-concept викладаю прошивку, яка перетворить ESP-01 на майстер шини 1-wire (на піні RX), а по TCP дозволяє приєднати даний драйвер за допомогою останньої наведеної команди ser1wm_attach.

WiFi 1-wire bus master
Для переведення прошивки в режим конфігурування потрібно при подачі живлення закоротити між собою (але не на землю) піни IO0 та IO2. В режимі конфігурування (на це вказує блимання світлодіодом) підключитися до точки доступу ser1wm_setup, зайти браузером на http://192.168.1.1/ і виконати налаштування.

В планах є також реалізація "Ethernet to 1-wire", тому драйвер назвав не ds2480b а більш загально - ser1wm (скорочення від serial 1-wire master).

Добре, "приєднали" драйвер до послідовного порта чи ESP, а що далі?

В dmesg маємо побачити щось подібне:

serio: Serial port pts9
ser1wm serio3: attaching 1-wire bus master
w1_master_driver w1_bus_master1: Attaching one wire slave 28.0000023ccaeb crc 45

Ядро саме буде періодично (раз на 10 сек) опитувати шину 1-wire і писати в dmesg про знайдені слейви. Кожен слейв, поки він присутній на шині, буде мати свій каталог в /sys/bus/w1/devices в якому будуть файли для роботи з слейвом, які саме файли - залежить від сімейства слейва. Наприклад, для DS18B20:

cat /sys/bus/w1/devices/28-0000023ccaeb/w1_slave
78 01 1e 00 7f ff 08 10 e1 : crc=e1 YES
78 01 1e 00 7f ff 08 10 e1 t=23500

#23 Re: Програмування Arduino » переривання по usart atmega » 2024-10-12 10:33:17

Можу зробити те, що ви хочете, на m8a або m328p, звертайтесь в пошту.

#24 Re: Проекти » Счетчик импульсов для умного дома » 2024-09-16 08:41:30

Cherep_VM пише:

датчик з газ.лічильника - геркон

Можна використати SS49E (аналоговий датчик Холла), але він потребує налаштування threshold-ів, це робиться записом в пам'ять лічильника і я для цієї процедури написав веб-інтерфейс (інструкція), що вже вимагає щоб лічильник був підключений до лінукса на якому має бути запущений owhttpd. Тут один користувач викладав урізану лише для ds2423 "емуляцію" owhttpd на мікроконтролері.

#25 Re: Проекти » Счетчик импульсов для умного дома » 2024-09-15 22:49:46

Якщо піни вашого МК не толерантні до 5В, то скористайтесь такою схемою (фактично схема перетворювача логічних рівнів):
large_image9.jpg
Між GPIO4 на схемі (це ваш вихід МК) і +3.3V можна додати резистор 10-100кОм, або програмно використати вбудований в МК.

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