#1 Re: Програмування Arduino » CH32V003 as arduino » 2026-07-29 20:54:35

Ну gdb-multiarch має ж якось взнати, що є ttyACM0, на якому його будуть слухати.

Через файл gdbinit wink

Магічний пристрій і є монітор, який реалізує протокол gdb-сервера.

Походу його не навчили цьому sad

Ну reset то таке.. можна і руками.. а що debug не працює - незручно sad

#2 Re: Програмування Arduino » CH32V003 as arduino » 2026-07-29 20:07:42

А ви gdb з монітором зʼєднали?

Складно wink
У нас є gdb-multiarch, є ttyACM0, є магічний пристій, що слухає ttyACM0 і смикає CH32V003 за SDIO.

#3 Re: Програмування Arduino » CH32V003 as arduino » 2026-07-29 17:51:41

А "monitor reset" працює?

ніт, "monitor" command not supported by this target.

потрібно збирати з -Og,

$CC -g -O0 -ffunction-sections -static-libgcc -lgcc -march=rv32ec_zicsr -mabi=ilp32e -I/usr/include/newlib -nostdlib -I. -Wall -c ch32v003fun.c -o obj/ch32v003fun.o

щось недороблене sad

#4 Re: Програмування Arduino » CH32V003 as arduino » 2026-07-29 10:03:43

gdb-multiarch -x gdbinit -ex 'load' -ex 'detach' -ex 'quit' bin/blink.elf

Трохи дивує що заливається не .bin, а .elf. Десь під капотом повинна бути магія objcopy?

А якщо той же бінарик зашити заздалегідь робочим програматором?

Зашивається, працює

Через ardulink, зроблений з arduino, і пише і читає. Ок wink

Ага, трохи роз"ясняється. picorvd - заливає прошивку правильно, але в кінці не робить reset. ardulink, походу, робить reset через живлення wink Якщо ребутнути через power - blink запускається. Але з debug - облом sad

GNU gdb (xPack GNU RISC-V Embedded GCC x86_64) 12.1
Copyright (C) 2022 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Type "show copying" and "show warranty" for details.
This GDB was configured as "--host=x86_64-pc-linux-gnu --target=riscv-wch-elf".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<https://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
    <http://www.gnu.org/software/gdb/documentation/>.

For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from bin/blink.elf...
0x000001e4 in busywait (x=600000) at blink.cpp:4
4	   for (volatile int i = 0; i < x; i++) {
(gdb) break 10
Breakpoint 1 at 0x212: file blink.cpp, line 10.
Note: automatically using hardware breakpoints for read-only addresses.
(gdb) break 11
Breakpoint 2 at 0x214: file blink.cpp, line 13.
(gdb) c
Continuing.

Program received signal SIGTRAP, Trace/breakpoint trap.
0x000001e4 in busywait (x=<error reading variable: Cannot access memory at address 0xfffffff4>) at blink.cpp:4
4	   for (volatile int i = 0; i < x; i++) {
(gdb) 

Щось там недороблено sad

#5 Re: Програмування Arduino » CH32V003 as arduino » 2026-07-28 16:19:43

хттпс://github.com/aappleby/picorvd
Надибав таке. Виглядає непогано, і rp2040 в хазяйстві є wink
Але не працює sad
blink наче заливає, але рівень на пінах не міняється.
При спробі debug - відтворюється хттпс://github.com/aappleby/picorvd/issues/8
Що хотів сказати автор issue.. Не та версія компілятора? gdb? А яка потрібна? ..
Жаль що до кінця ту штуку не доробили sad

#6 Re: Програмування Arduino » Arduino Pro 8 МГц і бібліотека Servo » 2026-07-24 18:10:04

потрібно було не з першого канала почінати, а з 5...

Або return в кожний if
Взагалі по можливості треба уникати копіпасти з вкладеними if ами. Потім складно зрозуміти що там взагалі відбувається. Особливо якщо ні з debug_ером ні з print не підлізти.

#7 Re: Програмування Arduino » CH32V003 as arduino » 2026-07-24 17:47:16

У 8 ногих дрібноконтролерів свій шарм wink Так, теж прошивається.

board = genericCH32V003J4M6

wch-linkE сам по собі на CH32V305 зроблений)

Інший контроллер, і ціна інша hmm

#8 Програмування Arduino » CH32V003 as arduino » 2026-07-24 15:04:42

jokeR
відповідей: 25

Купив собі колись кілька плат з CH32V003F4P6 на розпродажі, і програматор, і нарешті дійшли ручки іх помацати wink
І вияснилось, що програматор не той wink Я купив wch-link, а треба wch-linkE wink

Але не все так фатально. В інтернетах є проект емулятора minichlink на arduino wink
Береться хттпс://github.com/Community-PIO-CH32V/Ardulink-pio, зашивається звичайним способом в Arduino (я взяв Uno). Для інших варіантів треба вказати правильну плату, з правильною частотою резонатора.

Тепер arduino стає Ardulink Programmer. І platformio може з ним працювати (mounriver-studio, на жаль, ні).

Якщо в platformio.ini вписати

[env:ch32v003f4p6_evt_r0]
platform = ch32v
board = ch32v003f4p6_evt_r0
framework = arduino
upload_protocol = minichlink
upload_port = /dev/ttyACM0
upload_flags = "-c ${UPLOAD_PORT}"

то все прошивається, правда повільно.

З"єднання таке:
Arduino - CH32
GND        -          GND
8 - 1K резистор - SWD
9             -          V

Класичний blink

#include <Arduino.h>

#define LED_PIN PD0

void setup() {
    pinMode(LED_PIN, OUTPUT); }
void loop() {
    digitalWrite(LED_PIN, HIGH);
    delay(250);
    digitalWrite(LED_PIN, LOW);
    delay(250);
}

працює, але не без особливостей. Internal LED тут припаяний до PD1, він же SWD, і, схоже, не можна його просто взяти і використати як GPIO.

#9 Re: Програмування Arduino » Arduino Pro 8 МГц і бібліотека Servo » 2026-07-23 14:13:12

Ну если всё записано в одну строчку, то в принципе нормально.

Для сіоністів може і нормально, (1 << CS10)| (.... wink

Краще вже як у лінуксоїдів

#define R_OK    4               /* Test for read permission.  */
#define W_OK    2               /* Test for write permission.  */
#define X_OK    1               /* Test for execute permission.  */
#define F_OK    0               /* Test for existence.  */

#10 Re: Програмування Arduino » Arduino Pro 8 МГц і бібліотека Servo » 2026-07-23 08:25:27

надо писать именно так, как хочет конкретный компилятор, и пофиг что у другого по другому, они никогда не будут совместимы в этом плане.

Кросплатформна/кроскомпіляторна розробка добавляє складності. Таке життя. Я більше про те що часто копіпастять код виду

(0 << CS10)

взагалі не задумуючись. Правильні макроси спрощують життя.

#11 Re: Програмування Arduino » Arduino Pro 8 МГц і бібліотека Servo » 2026-07-22 20:04:14

дофига не дофига, но я, например, окромя gcc пользовался еще codevision и iar. и как то кумарило, что попадались такие макросы, что свойственны конкретному компилятору.

smile
в сторонніх лібах може бути що завгодно.

#12 Re: Програмування Arduino » Arduino Pro 8 МГц і бібліотека Servo » 2026-07-22 19:20:27

Можна подумати під avr дофіга компіляторів і TCCR1B з CS11 є на дофіга архітектурах wink

#13 Re: Програмування Arduino » Arduino Pro 8 МГц і бібліотека Servo » 2026-07-22 19:03:04

Ну вам залишилось Serv_4_1, Serv_4_2, Serv_5_1 .. занести в таблицю (масив)
І робити навігацію по масиву перемиканням індексу
І буде точно як в servo.cpp wink

    TCCR1A = 0;             // normal counting mode
    TCCR1B = _BV(CS11);     // set prescaler of 8
    TCNT1 = 0; 

Зверніть увагу на макрос _BV, краще виглядає ніж (1 << CS11)
А ще краще як на мене

#define PRESCALER_8 (_BV(CS11))

#14 Re: Програмування Arduino » Arduino Pro 8 МГц і бібліотека Servo » 2026-07-22 14:07:40

Нас рятує те що біти CS* після reset скинуті smile.
Правильно мабуть

    TCCR1B |= (1 << CS10);
    TCCR1B &= ~(1 << CS11);
    TCCR1B |= (1 << CS12);

Або макросів навернути wink Щоб якщо треба задати 3 біти - щоб вони не тільки встановлювались а і скидались. Ну або через змінну.

#15 Re: Програмування Arduino » Arduino Pro 8 МГц і бібліотека Servo » 2026-07-22 13:18:14

хттпс://godbolt.org/z/a5v8q5xzj

#include <avr/io.h>
int main() {
         TCCR1B |= (0 << CS10) | (1 << CS11) | (0 << CS12);
}

дає таку конструкцію

main:
 push	r28
 push	r29
 in	r28, 0x3d	; 61
 in	r29, 0x3e	; 62
 ldi	r24, 0x81	; 129
 ldi	r25, 0x00	; 0
 movw	r30, r24
 ld	r18, Z
 ldi	r24, 0x81	; 129
 ldi	r25, 0x00	; 0
 ori	r18, 0x02	; 2
 movw	r30, r24
 st	Z, r18
 ldi	r24, 0x00	; 0
 ldi	r25, 0x00	; 0
 pop	r29
 pop	r28
 ret
#include <avr/io.h>
int main() {
         TCCR1B |= (1 << CS11);
}

відповідно, таку

main:
 push	r28
 push	r29
 in	r28, 0x3d	; 61
 in	r29, 0x3e	; 62
 ldi	r24, 0x81	; 129
 ldi	r25, 0x00	; 0
 movw	r30, r24
 ld	r18, Z
 ldi	r24, 0x81	; 129
 ldi	r25, 0x00	; 0
 ori	r18, 0x02	; 2
 movw	r30, r24
 st	Z, r18
 ldi	r24, 0x00	; 0
 ldi	r25, 0x00	; 0
 pop	r29
 pop	r28
 ret

різниця відсутня wink
ну якби логічно, як 0 не рухай, він залишається 0.

Якщо розписати так

#include <avr/io.h>
int main() {
    TCCR1B |= (0 << CS10);                     // Установить биты на коэффициент деления 
    TCCR1B |= (1 << CS11);
    TCCR1B |= (0 << CS12);
}

то таки чесно виконує безсмислену операцію

// TCCR1B |= (0 << CS12);
 ld	r24, Z
 st	Z, r24

#16 Re: Програмування Arduino » Arduino Pro 8 МГц і бібліотека Servo » 2026-07-20 16:43:01

Ну я так розумію там відтворюється якийсь проект від Алекса Гувера. Краще тоді з мінімальними змінами. У нього, судячи з каментів в коді, теж на 8 мгц щось не так.

#17 Re: Програмування Arduino » Arduino Pro 8 МГц і бібліотека Servo » 2026-07-20 12:51:42

Ну ніт так ніт wink
Можна ще плату з lgt328 взяти - китайська ардуїна, краща за оригінальну wink

#18 Re: Програмування Arduino » Arduino Pro 8 МГц і бібліотека Servo » 2026-07-18 22:35:53

Не люблю ютуб-проекти.. 1 листок схеми займає 20 хвилин відео про тяжке життя wink Це щось від Алекса Гувера? wink

Осцилограф - г%%но, стверджую як власник wink Складно добитись синхронізації, але таки спробуйте. Hold натисніть.

Може щось з частотами - це можливо якщо в налаштуваннях Arduino IDE вибрати трохи не ту плату - за що я його не люблю. В Platformio є спосіб вказати частоту резонатора. F_OSC при компіляції чому у вас дорівнює?

Якщо ваш варіант з 40% ресурсу влаштовує - саме час тактоложества; замість digitalwrite пишіть в регістр напряму. Можна на асемблері wink

Можна також припустити що у вас щось не те з платою чи резонатором на ній. Є інший екземпляр? Взагалі не бачу смислу упарюватись саме в pro mini. Є 100500 контроллерів, і швидших, і дешевших.

#19 Re: Програмування Arduino » Arduino Pro 8 МГц і бібліотека Servo » 2026-07-17 22:09:40

Ну дивіться. В коді що ви показали є коментар

// Неприятный сюрприз - 8 МГц ардуинка 1000 прерываний не тянет     :( 

Ну не дуже годна схема.

Я для 2 серв робив так. Рахував заздалегідь скільки тіків таймера займає кожний високий рівень. Ставив servo 1 high. Програмував таймер на interrupt. по interrupt ставив servo 1 low, servo 2 high. програмував таймер на interrupt. по interrupt ставив servo 2 low, програмував таймер на низький рівень щоб добити до 20 мс. І так по колу. Але це було STC8, там таймер сильно ущербний - рахує виключно в доповненому коді, і тактова частота крива. На atmega повинно бути простіше; як мінімум заздалегідь рахувати нічого.
Походу я винайшов бібліотеку Servo wink В неї всередині саме так все влаштовано.

у основному циклі лише   SerV.attach(6,150,2400); і SerV.write(0);

Ну не треба так робити. attach виконується 1 раз. його місце в setup(). write(0) немає смислу смикати постійно, вставте якийсь delay() хоча б.

#20 Re: Програмування Arduino » Arduino Pro 8 МГц і бібліотека Servo » 2026-07-13 21:36:26

Дуже дивно. Показуйте що ви робите;) Бібліотека Servo вона ж на таймерах, повинно чітко працювати.

міксувати канали керування

Поясніть. Можна в пошту, якщо що.

#21 Апаратні питання » Снабберний RC ланцюжок паралельно симістору » 2026-06-20 22:22:43

jokeR
відповідей: 10

Хто в курсі, яка його роль? В інтернетах пишуть різне.. Про індуктивне навантаження, хибні спрацьовуваня.. Але якщо у нас симістор з управлінням через оптрон з zero-cross - симістор і вмикається і вимикається при нульовій напрузі на ньому і нульовому струму, і викидів напруги бути не повинно? Чи все не так просто?

#22 Re: Програмування Arduino » Вимірювання швидкості обертання за допомогою квадратурного енкодера » 2026-06-09 10:23:40

wink
ну в принципі так і у мене - теж таблиця станів автомату wink
А упарюватись в особливості конкретного контроллера в мене не було необхідності. Arduino воно досить кросплатформене, але не найефективніше. Нас це влаштовує wink

#23 Програмування Arduino » Вимірювання швидкості обертання за допомогою квадратурного енкодера » 2026-06-08 15:21:42

jokeR
відповідей: 7

Довелось вимірювати швидкість обертання за допомогою такої штуки E6B2-CWZ6C
хттпс://www.rcscomponents.kiev.ua/datasheets/e6b2-c-datasheet.pdf

Зіткнувся з неочевидними не перший погляд речами, може комусь буде корисно.
По перше, енкодер хоч і оптичний, але тригерів Шмідта всередині немає. На малих швидкостях фронти імпульсів виглядають так:
photo_2026-06-08_14-40-35.jpg

І в зв"язку з цим, по 2 імпульсах рахувати швидкість не варто, бажано по хоча б 1 повному оберту.

По друге, результат вимірювання бажано отримувати актуальний зразу, а не після повного оберту.

Для компенсації кривих фронтів є таке рішення: по переходу 0-1 - лічильник інкрементується, по переходу 1-0 - декрементується. Після закінчення перехідного процесу залишиться +1 (чи -1, в залежності від напрямку обертання). Лічильник клацає по фронту і спаду кожної фази, тобто в 4 рази швидше - це треба врахувати.

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

Недоліки такого рішення:
Треба досить багато тактів процесора і пам"яті. Великі оберти Atmega328 не витягне.
Всі зовнішні interrupts, доступні для Atmega328, зайняті.
Не до будь-якої ноги можна підключити енкодер.


#define OMRON_PIN_A 2
#define OMRON_PIN_B 3
#define OMRON_PULSES_2_ROTATE 10

#define COUNT_OF_MEASURES 20
struct MEASURE_S {
   unsigned long ts;
   int ticks;
};
volatile MEASURE_S measures[COUNT_OF_MEASURES];
volatile int measures_head=COUNT_OF_MEASURES-1;
volatile int measures_tail=0;
long int ticks = 0;


const int increment[16] = {0,-1,1,0, 1,0,0,-1, -1,0,0,1, 0,1,-1,0};
volatile char ABprev = 0;
void isr_omron()
{
  char AB = (PIND >> 2) & 3; // PORT D bits 2,3
  ticks += increment[AB+ABprev*4];

  unsigned long now = micros();
  if (measures[measures_head].ticks == ticks 
    || measures[(measures_head-1)% COUNT_OF_MEASURES].ticks == ticks
    || measures[(measures_head-2)% COUNT_OF_MEASURES].ticks == ticks
    || measures[(measures_head-3)% COUNT_OF_MEASURES].ticks == ticks) // bounce
  {
  measures[measures_head].ts = now;
  measures[measures_head].ticks = ticks;

  } else {
  measures_head = (measures_head+1) % COUNT_OF_MEASURES;
  measures[measures_head].ts = now;
  measures[measures_head].ticks = ticks;
  measures_tail = (measures_head+1) % COUNT_OF_MEASURES;
  };
  
  ABprev = AB;
}

int calc_rpm() //оберти за хвилину
{
  int res = 0;
  unsigned long dt;
  int d_cont;
  int head, tail;
  int t;
  noInterrupts();
  t = ticks;
  head = measures_head; tail = measures_tail;
  if (measures_head != measures_tail)
  {
    dt = measures[measures_head].ts - measures[measures_tail].ts;
    d_cont = abs(measures[measures_head].ticks - measures[measures_tail].ticks);
    if (micros() > measures[measures_head].ts + dt)
    {
      dt = micros() - measures[measures_tail].ts;
    };
  };
;
  interrupts();
      if (dt == 0)
      {
        res = 0;
      }
      else
      {
        res = 60 * 1000000 * d_cont / dt / OMRON_PULSES_2_ROTATE / 4;
      };
  return res;
}

void setup() {
  pinMode(OMRON_PIN_A, INPUT_PULLUP);
  pinMode(OMRON_PIN_B, INPUT_PULLUP);
  ABprev = (PIND >> 2) & 3; // PORT D bits 2,3
  int _interrupt = digitalPinToInterrupt(OMRON_PIN_A);
  attachInterrupt(_interrupt, isr_omron, CHANGE);
  Serial.print(F("Use interrupt A ")); Serial.println(_interrupt);
  _interrupt = digitalPinToInterrupt(OMRON_PIN_B);
  attachInterrupt(_interrupt, isr_omron, CHANGE);
}

#24 Апаратні питання » Китайський контроллер двигуна DC 12V-60V 70A 4000W DC Durable Motor » 2026-05-21 21:04:36

jokeR
відповідей: 2

Попався мені в руки контроллер двигуна, ось такий
2026-05-21_20-10.png

І само собою, захотілось прикрутити замість потенціометра ардуїнку wink Ділюсь своїм досвідом.
По перше, рекомендую розібрати і подивитись на плату. В моєму екземплярі один з MOSFETів тупо не запаяний, в обв"язці іншого резистори припаяні мимо площадок. Повезло що ніщо нікуди не коротить, але -2 ключа на рівному місці - неприємно.
По друге, струм по всіх проводах, що йдуть до потенціометра, обмежений, і паразитного живлення для ардуїни недостатньо. Тому ардуїнку треба живити окремо. Мені було достатньо 7805.
Всередині контроллера - схема на компараторі; на одному вході пилообразна напруга, на іншому - напруга з потенціометра; просто і безхитрісно. Для узгодження 3.3В PWM з ардуїнки і компаратором спаяв такий ось типа ЦАП:
2026-05-21_20-28.png
Лінійність у нього, скоріш за все, відсутня wink Але це все одно буде робитись PID регулятором, якщо потрібно. Можна, звичайно, взяти цифровий потенціометр, чи інтегратор на операційному підсилювачі. Але так теж працює wink
Напрямок обертання задається мостом на 2 реле; замінити тумблер електронним ключем теж думаю можна, але це задача для наступного дослідника; мені було не треба.

#25 Re: Проекти » скетч, що керує електродвигуном із зворотним зв’язком » 2026-04-28 20:58:34

нюанс-либа рахує x4-10 P/R → 40 імпульсів/оберт

Ну так на то і енкодер.
Взагалі для вимірювання швидкості та ліба (разом з енкодером) - це мікроскоп для забивання шурупів wink Можна взяти timer-counter і просто рахувати імпульси.

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