Відповісти

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

Назад

Огляд теми (нові повідомленні вгорі)

dimich
2024-03-10 19:48:21
Daminski пише:

Можливо вам цей лог щось скаже, бо я тут нічого не розумію:

На майбутнє: на форумі можна завантажити файл і вставити на нього посилання в повідомленні. В тексті зворотні слеші зʼїдає чомусь.

Daminski пише:

Компілювання скетчу..."D:ProgrammingArduino 1.8.16datapackagesarduinotoolsavr-gcc7.3.0-atmel3.6.1-arduino7/bin/avr-g++" -c -g -Os -flto -fno-reorder-blocks -ffixed-r2 -ffixed-r3 -ffixed-r4 -w -std=gnu++11 -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -MMD -mmcu=attiny13a -DF_CPU=1200000L -DARDUINO=10816 -DARDUINO_attiny -DARDUINO_ARCH_AVR "-ID:ProgrammingArduino 1.8.16datapackagesMicroCorehardwareavr2.3.0coresmicrocore" "-ID:ProgrammingArduino 1.8.16datapackagesMicroCorehardwareavr2.3.0variantsattiny13a" "C:UsersuserAppDataLocalTemparduino_build_416861sketchAttiny_PWM.ino.cpp" -o "C:UsersuserAppDataLocalTemparduino_build_416861sketchAttiny_PWM.ino.cpp.o"

IDE передає компілятору, що частота 1200000 Гц. А у вас 9600000 Гц, якщо фʼюз дільника скинуто.

Daminski пише:

Хм, можливо тому й спрацювало на тестері сервомашикок розділення значень 1200 та 1800 навпіл (600 і 900) на частоті 9.6МГц.

Навряд чи це через переривання, там не такий вплив.

Daminski пише:

Але ж чомусь в відеоуроках з ютубу в людей одразу виходить, що аттіні зчитує PWM сигнал коректно на цій частоті, без розділення значень сигналу два.

Ну я тих відеоуроків не бачив, не знаю, що там за core package використовується, якої версії, яка конфігурація фʼюзів на attiny, і що за сигнали аналізуються.

Daminski пише:

А підскажете на майбутнє як це зробити в коді? Це потрібно в дужках вписати якесь значення?

Так, в попередньому повідомленні є в прикладі:

clock_prescale_set(clock_div_1); // вимикаєм дільник F_CPU
Daminski пише:

А як можна виміряти значення PWM напряму без таймера?

"Напряму" я мав на увазі без pulseIn() з ардуінівської бібліотеки. pulseIn() якраз і виміряє тривалість імпульсу без таймера, покладаючись на те, що ітерація цикла виконується за заздалегідь відому кількість тактів процесора.

Daminski
2024-03-10 12:02:10
dimich пише:

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

Так, я використовую Arduino IDE. Витягнув лог компіляції і схоже, що я все ж використовую MicroCore. Можливо вам цей лог щось скаже, бо я тут нічого не розумію:

D:ProgrammingArduino 1.8.16arduino-builder -dump-prefs -logger=machine -hardware D:ProgrammingArduino 1.8.16hardware -hardware D:ProgrammingArduino 1.8.16datapackages -tools D:ProgrammingArduino 1.8.16tools-builder -tools D:ProgrammingArduino 1.8.16hardwaretoolsavr -tools D:ProgrammingArduino 1.8.16datapackages -built-in-libraries D:ProgrammingArduino 1.8.16libraries -libraries D:ProgrammingArduino codeslibraries -fqbn=MicroCore:avr:13:clock=1M2,eeprom=keep,BOD=1v8,bootloader=no_bootloader -ide-version=10816 -build-path C:UsersuserAppDataLocalTemparduino_build_416861 -warnings=none -build-cache C:UsersuserAppDataLocalTemparduino_cache_133984 -prefs=build.warn_data_percentage=75 -prefs=runtime.tools.avr-gcc.path=D:ProgrammingArduino 1.8.16datapackagesarduinotoolsavr-gcc7.3.0-atmel3.6.1-arduino7 -prefs=runtime.tools.avr-gcc-7.3.0-atmel3.6.1-arduino7.path=D:ProgrammingArduino 1.8.16datapackagesarduinotoolsavr-gcc7.3.0-atmel3.6.1-arduino7 -prefs=runtime.tools.arduinoOTA.path=D:ProgrammingArduino 1.8.16datapackagesarduinotoolsarduinoOTA1.3.0 -prefs=runtime.tools.arduinoOTA-1.3.0.path=D:ProgrammingArduino 1.8.16datapackagesarduinotoolsarduinoOTA1.3.0 -prefs=runtime.tools.avrdude.path=D:ProgrammingArduino 1.8.16datapackagesMicroCoretoolsavrdude7.1-arduino.1 -prefs=runtime.tools.avrdude-7.1-arduino.1.path=D:ProgrammingArduino 1.8.16datapackagesMicroCoretoolsavrdude7.1-arduino.1 -verbose D:ProgrammingArduino codesAttiny_PWMAttiny_PWM.inoD:ProgrammingArduino 1.8.16arduino-builder -compile -logger=machine -hardware D:ProgrammingArduino 1.8.16hardware -hardware D:ProgrammingArduino 1.8.16datapackages -tools D:ProgrammingArduino 1.8.16tools-builder -tools D:ProgrammingArduino 1.8.16hardwaretoolsavr -tools D:ProgrammingArduino 1.8.16datapackages -built-in-libraries D:ProgrammingArduino 1.8.16libraries -libraries D:ProgrammingArduino codeslibraries -fqbn=MicroCore:avr:13:clock=1M2,eeprom=keep,BOD=1v8,bootloader=no_bootloader -ide-version=10816 -build-path C:UsersuserAppDataLocalTemparduino_build_416861 -warnings=none -build-cache C:UsersuserAppDataLocalTemparduino_cache_133984 -prefs=build.warn_data_percentage=75 -prefs=runtime.tools.avr-gcc.path=D:ProgrammingArduino 1.8.16datapackagesarduinotoolsavr-gcc7.3.0-atmel3.6.1-arduino7 -prefs=runtime.tools.avr-gcc-7.3.0-atmel3.6.1-arduino7.path=D:ProgrammingArduino 1.8.16datapackagesarduinotoolsavr-gcc7.3.0-atmel3.6.1-arduino7 -prefs=runtime.tools.arduinoOTA.path=D:ProgrammingArduino 1.8.16datapackagesarduinotoolsarduinoOTA1.3.0 -prefs=runtime.tools.arduinoOTA-1.3.0.path=D:ProgrammingArduino 1.8.16datapackagesarduinotoolsarduinoOTA1.3.0 -prefs=runtime.tools.avrdude.path=D:ProgrammingArduino 1.8.16datapackagesMicroCoretoolsavrdude7.1-arduino.1 -prefs=runtime.tools.avrdude-7.1-arduino.1.path=D:ProgrammingArduino 1.8.16datapackagesMicroCoretoolsavrdude7.1-arduino.1 -verbose D:ProgrammingArduino codesAttiny_PWMAttiny_PWM.inoUsing board '13' from platform in folder: D:ProgrammingArduino 1.8.16datapackagesMicroCorehardwareavr2.3.0Using core 'microcore' from platform in folder: D:ProgrammingArduino 1.8.16datapackagesMicroCorehardwareavr2.3.0Detecting libraries used..."D:ProgrammingArduino 1.8.16datapackagesarduinotoolsavr-gcc7.3.0-atmel3.6.1-arduino7/bin/avr-g++" -c -g -Os -flto -fno-reorder-blocks -ffixed-r2 -ffixed-r3 -ffixed-r4 -w -std=gnu++11 -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -w -x c++ -E -CC -mmcu=attiny13a -DF_CPU=1200000L -DARDUINO=10816 -DARDUINO_attiny -DARDUINO_ARCH_AVR "-ID:ProgrammingArduino 1.8.16datapackagesMicroCorehardwareavr2.3.0coresmicrocore" "-ID:ProgrammingArduino 1.8.16datapackagesMicroCorehardwareavr2.3.0variantsattiny13a" "C:UsersuserAppDataLocalTemparduino_build_416861sketchAttiny_PWM.ino.cpp" -o nulGenerating function prototypes..."D:ProgrammingArduino 1.8.16datapackagesarduinotoolsavr-gcc7.3.0-atmel3.6.1-arduino7/bin/avr-g++" -c -g -Os -flto -fno-reorder-blocks -ffixed-r2 -ffixed-r3 -ffixed-r4 -w -std=gnu++11 -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -w -x c++ -E -CC -mmcu=attiny13a -DF_CPU=1200000L -DARDUINO=10816 -DARDUINO_attiny -DARDUINO_ARCH_AVR "-ID:ProgrammingArduino 1.8.16datapackagesMicroCorehardwareavr2.3.0coresmicrocore" "-ID:ProgrammingArduino 1.8.16datapackagesMicroCorehardwareavr2.3.0variantsattiny13a" "C:UsersuserAppDataLocalTemparduino_build_416861sketchAttiny_PWM.ino.cpp" -o "C:UsersuserAppDataLocalTemparduino_build_416861preprocctags_target_for_gcc_minus_e.cpp""D:ProgrammingArduino 1.8.16tools-builderctags5.8-arduino11/ctags" -u --language-force=c++ -f - --c++-kinds=svpf --fields=KSTtzns --line-directives "C:UsersuserAppDataLocalTemparduino_build_416861preprocctags_target_for_gcc_minus_e.cpp"Компілювання скетчу..."D:ProgrammingArduino 1.8.16datapackagesarduinotoolsavr-gcc7.3.0-atmel3.6.1-arduino7/bin/avr-g++" -c -g -Os -flto -fno-reorder-blocks -ffixed-r2 -ffixed-r3 -ffixed-r4 -w -std=gnu++11 -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -MMD -mmcu=attiny13a -DF_CPU=1200000L -DARDUINO=10816 -DARDUINO_attiny -DARDUINO_ARCH_AVR "-ID:ProgrammingArduino 1.8.16datapackagesMicroCorehardwareavr2.3.0coresmicrocore" "-ID:ProgrammingArduino 1.8.16datapackagesMicroCorehardwareavr2.3.0variantsattiny13a" "C:UsersuserAppDataLocalTemparduino_build_416861sketchAttiny_PWM.ino.cpp" -o "C:UsersuserAppDataLocalTemparduino_build_416861sketchAttiny_PWM.ino.cpp.o"Compiling libraries...Compiling core..."D:ProgrammingArduino 1.8.16datapackagesarduinotoolsavr-gcc7.3.0-atmel3.6.1-arduino7/bin/avr-gcc" -c -g -x assembler-with-cpp -Os -flto -fno-reorder-blocks -ffixed-r2 -ffixed-r3 -ffixed-r4 -MMD -mmcu=attiny13a -DF_CPU=1200000L -DARDUINO=10816 -DARDUINO_attiny -DARDUINO_ARCH_AVR "-ID:ProgrammingArduino 1.8.16datapackagesMicroCorehardwareavr2.3.0coresmicrocore" "-ID:ProgrammingArduino 1.8.16datapackagesMicroCorehardwareavr2.3.0variantsattiny13a" "D:ProgrammingArduino 1.8.16datapackagesMicroCorehardwareavr2.3.0coresmicrocorepcrt.S" -o "C:UsersuserAppDataLocalTemparduino_build_416861corepcrt.S.o""D:ProgrammingArduino 1.8.16datapackagesarduinotoolsavr-gcc7.3.0-atmel3.6.1-arduino7/bin/avr-gcc" -c -g -x assembler-with-cpp -Os -flto -fno-reorder-blocks -ffixed-r2 -ffixed-r3 -ffixed-r4 -MMD -mmcu=attiny13a -DF_CPU=1200000L -DARDUINO=10816 -DARDUINO_attiny -DARDUINO_ARCH_AVR "-ID:ProgrammingArduino 1.8.16datapackagesMicroCorehardwareavr2.3.0coresmicrocore" "-ID:ProgrammingArduino 1.8.16datapackagesMicroCorehardwareavr2.3.0variantsattiny13a" "D:ProgrammingArduino 1.8.16datapackagesMicroCorehardwareavr2.3.0coresmicrocoremillis.S" -o "C:UsersuserAppDataLocalTemparduino_build_416861coremillis.S.o""D:ProgrammingArduino 1.8.16datapackagesarduinotoolsavr-gcc7.3.0-atmel3.6.1-arduino7/bin/avr-gcc" -c -g -Os -flto -fno-reorder-blocks -ffixed-r2 -ffixed-r3 -ffixed-r4 -w -std=gnu11 -ffunction-sections -fdata-sections -MMD -mmcu=attiny13a -DF_CPU=1200000L -DARDUINO=10816 -DARDUINO_attiny -DARDUINO_ARCH_AVR "-ID:ProgrammingArduino 1.8.16datapackagesMicroCorehardwareavr2.3.0coresmicrocore" "-ID:ProgrammingArduino 1.8.16datapackagesMicroCorehardwareavr2.3.0variantsattiny13a" "D:ProgrammingArduino 1.8.16datapackagesMicroCorehardwareavr2.3.0coresmicrocorewiring.c" -o "C:UsersuserAppDataLocalTemparduino_build_416861corewiring.c.o""D:ProgrammingArduino 1.8.16datapackagesarduinotoolsavr-gcc7.3.0-atmel3.6.1-arduino7/bin/avr-gcc" -c -g -Os -flto -fno-reorder-blocks -ffixed-r2 -ffixed-r3 -ffixed-r4 -w -std=gnu11 -ffunction-sections -fdata-sections -MMD -mmcu=attiny13a -DF_CPU=1200000L -DARDUINO=10816 -DARDUINO_attiny -DARDUINO_ARCH_AVR "-ID:ProgrammingArduino 1.8.16datapackagesMicroCorehardwareavr2.3.0coresmicrocore" "-ID:ProgrammingArduino 1.8.16datapackagesMicroCorehardwareavr2.3.0variantsattiny13a" "D:ProgrammingArduino 1.8.16datapackagesMicroCorehardwareavr2.3.0coresmicrocorewiring_digital.c" -o "C:UsersuserAppDataLocalTemparduino_build_416861corewiring_digital.c.o""D:ProgrammingArduino 1.8.16datapackagesarduinotoolsavr-gcc7.3.0-atmel3.6.1-arduino7/bin/avr-gcc" -c -g -Os -flto -fno-reorder-blocks -ffixed-r2 -ffixed-r3 -ffixed-r4 -w -std=gnu11 -ffunction-sections -fdata-sections -MMD -mmcu=attiny13a -DF_CPU=1200000L -DARDUINO=10816 -DARDUINO_attiny -DARDUINO_ARCH_AVR "-ID:ProgrammingArduino 1.8.16datapackagesMicroCorehardwareavr2.3.0coresmicrocore" "-ID:ProgrammingArduino 1.8.16datapackagesMicroCorehardwareavr2.3.0variantsattiny13a" "D:ProgrammingArduino 1.8.16datapackagesMicroCorehardwareavr2.3.0coresmicrocorewiring_analog.c" -o "C:UsersuserAppDataLocalTemparduino_build_416861corewiring_analog.c.o""D:ProgrammingArduino 1.8.16datapackagesarduinotoolsavr-gcc7.3.0-atmel3.6.1-arduino7/bin/avr-gcc" -c -g -Os -flto -fno-reorder-blocks -ffixed-r2 -ffixed-r3 -ffixed-r4 -w -std=gnu11 -ffunction-sections -fdata-sections -MMD -mmcu=attiny13a -DF_CPU=1200000L -DARDUINO=10816 -DARDUINO_attiny -DARDUINO_ARCH_AVR "-ID:ProgrammingArduino 1.8.16datapackagesMicroCorehardwareavr2.3.0coresmicrocore" "-ID:ProgrammingArduino 1.8.16datapackagesMicroCorehardwareavr2.3.0variantsattiny13a" "D:ProgrammingArduino 1.8.16datapackagesMicroCorehardwareavr2.3.0coresmicrocorewiring_shift.c" -o "C:UsersuserAppDataLocalTemparduino_build_416861corewiring_shift.c.o""D:ProgrammingArduino 1.8.16datapackagesarduinotoolsavr-gcc7.3.0-atmel3.6.1-arduino7/bin/avr-gcc" -c -g -Os -flto -fno-reorder-blocks -ffixed-r2 -ffixed-r3 -ffixed-r4 -w -std=gnu11 -ffunction-sections -fdata-sections -MMD -mmcu=attiny13a -DF_CPU=1200000L -DARDUINO=10816 -DARDUINO_attiny -DARDUINO_ARCH_AVR "-ID:ProgrammingArduino 1.8.16datapackagesMicroCorehardwareavr2.3.0coresmicrocore" "-ID:ProgrammingArduino 1.8.16datapackagesMicroCorehardwareavr2.3.0variantsattiny13a" "D:ProgrammingArduino 1.8.16datapackagesMicroCorehardwareavr2.3.0coresmicrocoreWInterrupts.c" -o "C:UsersuserAppDataLocalTemparduino_build_416861coreWInterrupts.c.o""D:ProgrammingArduino 1.8.16datapackagesarduinotoolsavr-gcc7.3.0-atmel3.6.1-arduino7/bin/avr-gcc" -c -g -Os -flto -fno-reorder-blocks -ffixed-r2 -ffixed-r3 -ffixed-r4 -w -std=gnu11 -ffunction-sections -fdata-sections -MMD -mmcu=attiny13a -DF_CPU=1200000L -DARDUINO=10816 -DARDUINO_attiny -DARDUINO_ARCH_AVR "-ID:ProgrammingArduino 1.8.16datapackagesMicroCorehardwareavr2.3.0coresmicrocore" "-ID:ProgrammingArduino 1.8.16datapackagesMicroCorehardwareavr2.3.0variantsattiny13a" "D:ProgrammingArduino 1.8.16datapackagesMicroCorehardwareavr2.3.0coresmicrocorewiring_pwm.c" -o "C:UsersuserAppDataLocalTemparduino_build_416861corewiring_pwm.c.o""D:ProgrammingArduino 1.8.16datapackagesarduinotoolsavr-gcc7.3.0-atmel3.6.1-arduino7/bin/avr-gcc" -c -g -Os -flto -fno-reorder-blocks -ffixed-r2 -ffixed-r3 -ffixed-r4 -w -std=gnu11 -ffunction-sections -fdata-sections -MMD -mmcu=attiny13a -DF_CPU=1200000L -DARDUINO=10816 -DARDUINO_attiny -DARDUINO_ARCH_AVR "-ID:ProgrammingArduino 1.8.16datapackagesMicroCorehardwareavr2.3.0coresmicrocore" "-ID:ProgrammingArduino 1.8.16datapackagesMicroCorehardwareavr2.3.0variantsattiny13a" "D:ProgrammingArduino 1.8.16datapackagesMicroCorehardwareavr2.3.0coresmicrocorewiring_pulse.c" -o "C:UsersuserAppDataLocalTemparduino_build_416861corewiring_pulse.c.o""D:ProgrammingArduino 1.8.16datapackagesarduinotoolsavr-gcc7.3.0-atmel3.6.1-arduino7/bin/avr-g++" -c -g -Os -flto -fno-reorder-blocks -ffixed-r2 -ffixed-r3 -ffixed-r4 -w -std=gnu++11 -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -MMD -mmcu=attiny13a -DF_CPU=1200000L -DARDUINO=10816 -DARDUINO_attiny -DARDUINO_ARCH_AVR "-ID:ProgrammingArduino 1.8.16datapackagesMicroCorehardwareavr2.3.0coresmicrocore" "-ID:ProgrammingArduino 1.8.16datapackagesMicroCorehardwareavr2.3.0variantsattiny13a" "D:ProgrammingArduino 1.8.16datapackagesMicroCorehardwareavr2.3.0coresmicrocoreHalfDuplexSerial.cpp" -o "C:UsersuserAppDataLocalTemparduino_build_416861coreHalfDuplexSerial.cpp.o""D:ProgrammingArduino 1.8.16datapackagesarduinotoolsavr-gcc7.3.0-atmel3.6.1-arduino7/bin/avr-g++" -c -g -Os -flto -fno-reorder-blocks -ffixed-r2 -ffixed-r3 -ffixed-r4 -w -std=gnu++11 -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -MMD -mmcu=attiny13a -DF_CPU=1200000L -DARDUINO=10816 -DARDUINO_attiny -DARDUINO_ARCH_AVR "-ID:ProgrammingArduino 1.8.16datapackagesMicroCorehardwareavr2.3.0coresmicrocore" "-ID:ProgrammingArduino 1.8.16datapackagesMicroCorehardwareavr2.3.0variantsattiny13a" "D:ProgrammingArduino 1.8.16datapackagesMicroCorehardwareavr2.3.0coresmicrocoreTone.cpp" -o "C:UsersuserAppDataLocalTemparduino_build_416861coreTone.cpp.o""D:ProgrammingArduino 1.8.16datapackagesarduinotoolsavr-gcc7.3.0-atmel3.6.1-arduino7/bin/avr-g++" -c -g -Os -flto -fno-reorder-blocks -ffixed-r2 -ffixed-r3 -ffixed-r4 -w -std=gnu++11 -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -MMD -mmcu=attiny13a -DF_CPU=1200000L -DARDUINO=10816 -DARDUINO_attiny -DARDUINO_ARCH_AVR "-ID:ProgrammingArduino 1.8.16datapackagesMicroCorehardwareavr2.3.0coresmicrocore" "-ID:ProgrammingArduino 1.8.16datapackagesMicroCorehardwareavr2.3.0variantsattiny13a" "D:ProgrammingArduino 1.8.16datapackagesMicroCorehardwareavr2.3.0coresmicrocorePrint.cpp" -o "C:UsersuserAppDataLocalTemparduino_build_416861corePrint.cpp.o""D:ProgrammingArduino 1.8.16datapackagesarduinotoolsavr-gcc7.3.0-atmel3.6.1-arduino7/bin/avr-g++" -c -g -Os -flto -fno-reorder-blocks -ffixed-r2 -ffixed-r3 -ffixed-r4 -w -std=gnu++11 -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -MMD -mmcu=attiny13a -DF_CPU=1200000L -DARDUINO=10816 -DARDUINO_attiny -DARDUINO_ARCH_AVR "-ID:ProgrammingArduino 1.8.16datapackagesMicroCorehardwareavr2.3.0coresmicrocore" "-ID:ProgrammingArduino 1.8.16datapackagesMicroCorehardwareavr2.3.0variantsattiny13a" "D:ProgrammingArduino 1.8.16datapackagesMicroCorehardwareavr2.3.0coresmicrocoreWMath.cpp" -o "C:UsersuserAppDataLocalTemparduino_build_416861coreWMath.cpp.o""D:ProgrammingArduino 1.8.16datapackagesarduinotoolsavr-gcc7.3.0-atmel3.6.1-arduino7/bin/avr-g++" -c -g -Os -flto -fno-reorder-blocks -ffixed-r2 -ffixed-r3 -ffixed-r4 -w -std=gnu++11 -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -MMD -mmcu=attiny13a -DF_CPU=1200000L -DARDUINO=10816 -DARDUINO_attiny -DARDUINO_ARCH_AVR "-ID:ProgrammingArduino 1.8.16datapackagesMicroCorehardwareavr2.3.0coresmicrocore" "-ID:ProgrammingArduino 1.8.16datapackagesMicroCorehardwareavr2.3.0variantsattiny13a" "D:ProgrammingArduino 1.8.16datapackagesMicroCorehardwareavr2.3.0coresmicrocoreWString.cpp" -o "C:UsersuserAppDataLocalTemparduino_build_416861coreWString.cpp.o""D:ProgrammingArduino 1.8.16datapackagesarduinotoolsavr-gcc7.3.0-atmel3.6.1-arduino7/bin/avr-g++" -c -g -Os -flto -fno-reorder-blocks -ffixed-r2 -ffixed-r3 -ffixed-r4 -w -std=gnu++11 -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -MMD -mmcu=attiny13a -DF_CPU=1200000L -DARDUINO=10816 -DARDUINO_attiny -DARDUINO_ARCH_AVR "-ID:ProgrammingArduino 1.8.16datapackagesMicroCorehardwareavr2.3.0coresmicrocore" "-ID:ProgrammingArduino 1.8.16datapackagesMicroCorehardwareavr2.3.0variantsattiny13a" "D:ProgrammingArduino 1.8.16datapackagesMicroCorehardwareavr2.3.0coresmicrocoremain.cpp" -o "C:UsersuserAppDataLocalTemparduino_build_416861coremain.cpp.o""D:ProgrammingArduino 1.8.16datapackagesarduinotoolsavr-gcc7.3.0-atmel3.6.1-arduino7/bin/avr-g++" -c -g -Os -flto -fno-reorder-blocks -ffixed-r2 -ffixed-r3 -ffixed-r4 -w -std=gnu++11 -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -MMD -mmcu=attiny13a -DF_CPU=1200000L -DARDUINO=10816 -DARDUINO_attiny -DARDUINO_ARCH_AVR "-ID:ProgrammingArduino 1.8.16datapackagesMicroCorehardwareavr2.3.0coresmicrocore" "-ID:ProgrammingArduino 1.8.16datapackagesMicroCorehardwareavr2.3.0variantsattiny13a" "D:ProgrammingArduino 1.8.16datapackagesMicroCorehardwareavr2.3.0coresmicrocorepicoUART.cpp" -o "C:UsersuserAppDataLocalTemparduino_build_416861corepicoUART.cpp.o""D:ProgrammingArduino 1.8.16datapackagesarduinotoolsavr-gcc7.3.0-atmel3.6.1-arduino7/bin/avr-g++" -c -g -Os -flto -fno-reorder-blocks -ffixed-r2 -ffixed-r3 -ffixed-r4 -w -std=gnu++11 -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -MMD -mmcu=attiny13a -DF_CPU=1200000L -DARDUINO=10816 -DARDUINO_attiny -DARDUINO_ARCH_AVR "-ID:ProgrammingArduino 1.8.16datapackagesMicroCorehardwareavr2.3.0coresmicrocore" "-ID:ProgrammingArduino 1.8.16datapackagesMicroCorehardwareavr2.3.0variantsattiny13a" "D:ProgrammingArduino 1.8.16datapackagesMicroCorehardwareavr2.3.0coresmicrocoremicros.cpp" -o "C:UsersuserAppDataLocalTemparduino_build_416861coremicros.cpp.o""D:ProgrammingArduino 1.8.16datapackagesarduinotoolsavr-gcc7.3.0-atmel3.6.1-arduino7/bin/avr-g++" -c -g -Os -flto -fno-reorder-blocks -ffixed-r2 -ffixed-r3 -ffixed-r4 -w -std=gnu++11 -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -MMD -mmcu=attiny13a -DF_CPU=1200000L -DARDUINO=10816 -DARDUINO_attiny -DARDUINO_ARCH_AVR "-ID:ProgrammingArduino 1.8.16datapackagesMicroCorehardwareavr2.3.0coresmicrocore" "-ID:ProgrammingArduino 1.8.16datapackagesMicroCorehardwareavr2.3.0variantsattiny13a" "D:ProgrammingArduino 1.8.16datapackagesMicroCorehardwareavr2.3.0coresmicrocorepicoUART_rxISR.cpp" -o "C:UsersuserAppDataLocalTemparduino_build_416861corepicoUART_rxISR.cpp.o""D:ProgrammingArduino 1.8.16datapackagesarduinotoolsavr-gcc7.3.0-atmel3.6.1-arduino7/bin/avr-gcc-ar" rcs "C:UsersuserAppDataLocalTemparduino_build_416861corecore.a" "C:UsersuserAppDataLocalTemparduino_build_416861coremillis.S.o""D:ProgrammingArduino 1.8.16datapackagesarduinotoolsavr-gcc7.3.0-atmel3.6.1-arduino7/bin/avr-gcc-ar" rcs "C:UsersuserAppDataLocalTemparduino_build_416861corecore.a" "C:UsersuserAppDataLocalTemparduino_build_416861corepcrt.S.o""D:ProgrammingArduino 1.8.16datapackagesarduinotoolsavr-gcc7.3.0-atmel3.6.1-arduino7/bin/avr-gcc-ar" rcs "C:UsersuserAppDataLocalTemparduino_build_416861corecore.a" "C:UsersuserAppDataLocalTemparduino_build_416861coreWInterrupts.c.o""D:ProgrammingArduino 1.8.16datapackagesarduinotoolsavr-gcc7.3.0-atmel3.6.1-arduino7/bin/avr-gcc-ar" rcs "C:UsersuserAppDataLocalTemparduino_build_416861corecore.a" "C:UsersuserAppDataLocalTemparduino_build_416861corewiring.c.o""D:ProgrammingArduino 1.8.16datapackagesarduinotoolsavr-gcc7.3.0-atmel3.6.1-arduino7/bin/avr-gcc-ar" rcs "C:UsersuserAppDataLocalTemparduino_build_416861corecore.a" "C:UsersuserAppDataLocalTemparduino_build_416861corewiring_analog.c.o""D:ProgrammingArduino 1.8.16datapackagesarduinotoolsavr-gcc7.3.0-atmel3.6.1-arduino7/bin/avr-gcc-ar" rcs "C:UsersuserAppDataLocalTemparduino_build_416861corecore.a" "C:UsersuserAppDataLocalTemparduino_build_416861corewiring_digital.c.o""D:ProgrammingArduino 1.8.16datapackagesarduinotoolsavr-gcc7.3.0-atmel3.6.1-arduino7/bin/avr-gcc-ar" rcs "C:UsersuserAppDataLocalTemparduino_build_416861corecore.a" "C:UsersuserAppDataLocalTemparduino_build_416861corewiring_pulse.c.o""D:ProgrammingArduino 1.8.16datapackagesarduinotoolsavr-gcc7.3.0-atmel3.6.1-arduino7/bin/avr-gcc-ar" rcs "C:UsersuserAppDataLocalTemparduino_build_416861corecore.a" "C:UsersuserAppDataLocalTemparduino_build_416861corewiring_pwm.c.o""D:ProgrammingArduino 1.8.16datapackagesarduinotoolsavr-gcc7.3.0-atmel3.6.1-arduino7/bin/avr-gcc-ar" rcs "C:UsersuserAppDataLocalTemparduino_build_416861corecore.a" "C:UsersuserAppDataLocalTemparduino_build_416861corewiring_shift.c.o""D:ProgrammingArduino 1.8.16datapackagesarduinotoolsavr-gcc7.3.0-atmel3.6.1-arduino7/bin/avr-gcc-ar" rcs "C:UsersuserAppDataLocalTemparduino_build_416861corecore.a" "C:UsersuserAppDataLocalTemparduino_build_416861coreHalfDuplexSerial.cpp.o""D:ProgrammingArduino 1.8.16datapackagesarduinotoolsavr-gcc7.3.0-atmel3.6.1-arduino7/bin/avr-gcc-ar" rcs "C:UsersuserAppDataLocalTemparduino_build_416861corecore.a" "C:UsersuserAppDataLocalTemparduino_build_416861corePrint.cpp.o""D:ProgrammingArduino 1.8.16datapackagesarduinotoolsavr-gcc7.3.0-atmel3.6.1-arduino7/bin/avr-gcc-ar" rcs "C:UsersuserAppDataLocalTemparduino_build_416861corecore.a" "C:UsersuserAppDataLocalTemparduino_build_416861coreTone.cpp.o""D:ProgrammingArduino 1.8.16datapackagesarduinotoolsavr-gcc7.3.0-atmel3.6.1-arduino7/bin/avr-gcc-ar" rcs "C:UsersuserAppDataLocalTemparduino_build_416861corecore.a" "C:UsersuserAppDataLocalTemparduino_build_416861coreWMath.cpp.o""D:ProgrammingArduino 1.8.16datapackagesarduinotoolsavr-gcc7.3.0-atmel3.6.1-arduino7/bin/avr-gcc-ar" rcs "C:UsersuserAppDataLocalTemparduino_build_416861corecore.a" "C:UsersuserAppDataLocalTemparduino_build_416861coreWString.cpp.o""D:ProgrammingArduino 1.8.16datapackagesarduinotoolsavr-gcc7.3.0-atmel3.6.1-arduino7/bin/avr-gcc-ar" rcs "C:UsersuserAppDataLocalTemparduino_build_416861corecore.a" "C:UsersuserAppDataLocalTemparduino_build_416861coremain.cpp.o""D:ProgrammingArduino 1.8.16datapackagesarduinotoolsavr-gcc7.3.0-atmel3.6.1-arduino7/bin/avr-gcc-ar" rcs "C:UsersuserAppDataLocalTemparduino_build_416861corecore.a" "C:UsersuserAppDataLocalTemparduino_build_416861coremicros.cpp.o""D:ProgrammingArduino 1.8.16datapackagesarduinotoolsavr-gcc7.3.0-atmel3.6.1-arduino7/bin/avr-gcc-ar" rcs "C:UsersuserAppDataLocalTemparduino_build_416861corecore.a" "C:UsersuserAppDataLocalTemparduino_build_416861corepicoUART.cpp.o""D:ProgrammingArduino 1.8.16datapackagesarduinotoolsavr-gcc7.3.0-atmel3.6.1-arduino7/bin/avr-gcc-ar" rcs "C:UsersuserAppDataLocalTemparduino_build_416861corecore.a" "C:UsersuserAppDataLocalTemparduino_build_416861corepicoUART_rxISR.cpp.o"Архівування відкомпільованого ядра (кешування) в: C:UsersuserAppDataLocalTemparduino_cache_133984corecore_0e0dbc6b60ddf534e04b1636562a52e3.aLinking everything together..."D:ProgrammingArduino 1.8.16datapackagesarduinotoolsavr-gcc7.3.0-atmel3.6.1-arduino7/bin/avr-gcc" -w -Os -flto -fno-reorder-blocks -ffixed-r2 -ffixed-r3 -ffixed-r4 -g -fuse-linker-plugin -Wl,--gc-sections -mrelax -mmcu=attiny13a -nostartfiles -Wl,--undefined=__vectors -o "C:UsersuserAppDataLocalTemparduino_build_416861/Attiny_PWM.ino.elf" "C:UsersuserAppDataLocalTemparduino_build_416861sketchAttiny_PWM.ino.cpp.o" "C:UsersuserAppDataLocalTemparduino_build_416861/corecore.a" "-LC:UsersuserAppDataLocalTemparduino_build_416861" -lm"D:ProgrammingArduino 1.8.16datapackagesarduinotoolsavr-gcc7.3.0-atmel3.6.1-arduino7/bin/avr-objcopy" -O ihex -j .eeprom --set-section-flags=.eeprom=alloc,load --no-change-warnings --change-section-lma .eeprom=0 "C:UsersuserAppDataLocalTemparduino_build_416861/Attiny_PWM.ino.elf" "C:UsersuserAppDataLocalTemparduino_build_416861/Attiny_PWM.ino.eep""D:ProgrammingArduino 1.8.16datapackagesarduinotoolsavr-gcc7.3.0-atmel3.6.1-arduino7/bin/avr-objcopy" -O ihex -R .eeprom "C:UsersuserAppDataLocalTemparduino_build_416861/Attiny_PWM.ino.elf" "C:UsersuserAppDataLocalTemparduino_build_416861/Attiny_PWM.ino.hex"cmd /C echo. && "D:ProgrammingArduino 1.8.16datapackagesarduinotoolsavr-gcc7.3.0-atmel3.6.1-arduino7/bin/avr-objdump" --disassemble --source --line-numbers --demangle --section=.text "C:UsersuserAppDataLocalTemparduino_build_416861/Attiny_PWM.ino.elf" > "C:UsersuserAppDataLocalTemparduino_build_416861/Attiny_PWM.ino_attiny13a_1200000L.lst" "D:ProgrammingArduino 1.8.16datapackagesarduinotoolsavr-gcc7.3.0-atmel3.6.1-arduino7/bin/avr-size" -A "C:UsersuserAppDataLocalTemparduino_build_416861/Attiny_PWM.ino.elf"Скетч використовує 984 байтів (96%) місця зберігання для програм. Межа 1024 байтів.Глобальні змінні використовують 30 байтів (46%) динамічної пам’яті,  залишаючи 34 байтів для локальних змінних. Межа 64 байтів.




dimich пише:

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

Хм, можливо тому й спрацювало на тестері сервомашикок розділення значень 1200 та 1800 навпіл (600 і 900) на частоті 9.6МГц. Але ж чомусь в відеоуроках з ютубу в людей одразу виходить, що аттіні зчитує PWM сигнал коректно на цій частоті, без розділення значень сигналу два.


dimich пише:

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

А підскажете на майбутнє як це зробити в коді? Це потрібно в дужках вписати якесь значення?


dimich пише:
Daminski пише:

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

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

А як можна виміряти значення PWM напряму без таймера?

dimich
2024-03-10 10:30:33
Daminski пише:

Думаю точність до 50 мікросекунд буде допустима.

Враховуючи точність внутрішнього осцилятора в 10% навіть з абсолютно точним алгоритмом для 1800 мкс похибка вже може бути до 180 мкс.

Daminski пише:

Навіть не знаю як це можна зробити без pulseIn().

pulseIn() - всього лише функція бібліотеки ардуіно для вимірювання часу. А час можна вимірювати різними способами.

Daminski пише:

Здавалося б така проста задача, яка одразу в всіх працює в відеоуроках з ютубу. А на практиці не все так просто...

У відеоуроках же мабуть оригінальну ардуінівську бібліотеку використовують. А для attiny13 сторонній пекедж зі своєю бібліотекою. Хто знає, як її тестували, на якому залізі, і чи тестували взагалі. Якщо і оригінальній далеко до ідеалу, то що вже казати про сторонні.

Daminski пише:

Не зовсім зрозумів про ліміти. А таймаут на очікування  початку імпульсів я ставив 25 мікросекунд. В функції pulseIn() це значення було "25000" як третій аргумент.

Один таймаут - це ліміт на час очікування початку імпульса. А можливий і такий сценарій, що імпульс почався, але залишився активним на невизначений період. У прикладі нижче при такому сценарії сигнал на виході просто залишається високим.

Один із можливих варіантів реалізації:

#include <avr/io.h>
#include <avr/power.h>

#define PIN_INPUT       3
#define PIN_OUTPUT      0

// Таймер буде налаштовано так, що переповнення відбуватиметься
// з частотою 100 кГц; один тік - 10 мкс
#define TICK_US  10
// макрос US2T() конвертує мікросекунди в тіки
#define US2T(us) ((us - 1) / TICK_US + 1)

// wait_for() очікує поки вхідний пін не опиниться в заданому стані
// повертає 1 якщо пін опинився в заданому стані
//          0 якщо сплив час очікування
// timeout задається в тіках таймера; має бути більше 0
static uint8_t wait_for(uint8_t state, uint16_t timeout)
{
    TCNT0 = 0;              // обнуляєм лічильник таймера
    TIFR0 = _BV(OCF0A);     // скидаєм флаг переповнення
    TCCR0B = _BV(CS00);     // запускаєм таймер з дільником 1

    // чекаєм поки на вході не буде потрібний стан
    // або не настане таймаут
    while (((PINB & _BV(PIN_INPUT)) != 0) != state)
    {
        if (TIFR0 & _BV(OCF0A))   // переповнення таймера
        {
            TIFR0 = _BV(OCF0A);   // скидаєм флаг переповнення
            if (--timeout == 0)   // час очікування сплив?
            {   // так
                TCCR0B = 0;       // зупиняєм таймер
                return 0;
            } // ні - чекаєм далі
        }
    }

    TCCR0B = 0;  // зупиняєм таймер
    return 1;
}

int main(void)
{
    clock_prescale_set(clock_div_1); // вимикаєм дільник F_CPU

    DDRB  = _BV(PIN_OUTPUT);
//    PORTB = _BV(PIN_INPUT);  // внутрішня підтяжка на PIN_INPUT (якщо потрібно)

    TCCR0A = _BV(WGM01);       // режим CTC
    OCR0A = F_CPU / (1000000ul / TICK_US) - 1;  // частота переповнення таймера 100 кГц, цикл 10 мкс

    for (;;)
    {
        // стан OFF
        PORTB &= ~_BV(PIN_OUTPUT);
        do {
            // чекаєм на високий рівень на вході
            while ((PINB & _BV(PIN_INPUT)) == 0);
            // чекаєм на низький рівень на вході
            // якщо високий рівень протримався довше 1800 мкс - перехід в стан ON
        } while (wait_for(0, US2T(1800)));

        // стан ON
        PORTB |= _BV(PIN_OUTPUT);
        do {
            // чекаєм на низький рівень на вході
            while ((PINB & _BV(PIN_INPUT)) != 0);
            // чекаєм на високий рівень або таймаут 25 мс
            // якщо імпульса нема довше 25 мс - перехід в стан OFF
            if (!wait_for(1, US2T(25000))) {
                break;
            }
            // чекаєм на низький рівень
            // якщо високий рівень протримався більше 1200 мкс - залишаємось в стані ON
        } while (!wait_for(0, US2T(1200)));
    }
}

Це НЕ скетч ардуіно.
Компіляція:

avr-gcc -Wall -pedantic \
    -Os -mmcu=attiny13a \
    -DF_CPU=9600000ull \
    -ffunction-sections -fdata-sections -flto \
    -Wl,--gc-sections \
    -o firmware.elf firmware.c

Прошивка:

avrdude -c usbasp -p t13a -U flash:w:firmware.elf:a

Замініть usbasp на свій програматор, якщо у вас інший.

Daminski
2024-03-10 01:40:26
dimich пише:
Daminski пише:

всерівно чомусь нема ніякої реакції на PWM. Чіп аттіні прошиваю на 9.6МГц

Здається мені, вашу задачу простіше і надійніше вирішити без усяких кучерявих pulseIn(). Яка конкретно умова задачі? Із того, що зрозуміло з коду:
Якщо тривалість імпульсів більше 1800 мкс - видати на пін високий рівень.
Якщо менше 1200 мкс - видати низький рівень.

Яка необхідна точність?
Що має відбуватись, якщо імпульси перестали надходити? Який таймаут на очікування початку імпульса?
Що має відбуватись, якщо імпульс триває довше певного ліміта? Який цей ліміт?

Так, задача максимально проста: коли є 1800 імпульсів – подати високий сигнал, а коли менше 1200 імпульсів – подати низький сигнал.

Думаю точність до 50 мікросекунд буде допустима. Навіть не знаю як це можна зробити без pulseIn(). Здавалося б така проста задача, яка одразу в всіх працює в відеоуроках з ютубу. А на практиці не все так просто...

Не зовсім зрозумів про ліміти. А таймаут на очікування  початку імпульсів я ставив 25 мікросекунд. В функції pulseIn() це значення було "25000" як третій аргумент.

dimich
2024-03-10 00:05:36
Daminski пише:

всерівно чомусь нема ніякої реакції на PWM. Чіп аттіні прошиваю на 9.6МГц

Здається мені, вашу задачу простіше і надійніше вирішити без усяких кучерявих pulseIn(). Яка конкретно умова задачі? Із того, що зрозуміло з коду:
Якщо тривалість імпульсів більше 1800 мкс - видати на пін високий рівень.
Якщо менше 1200 мкс - видати низький рівень.

Яка необхідна точність?
Що має відбуватись, якщо імпульси перестали надходити? Який таймаут на очікування початку імпульса?
Що має відбуватись, якщо імпульс триває довше певного ліміта? Який цей ліміт?

Daminski
2024-03-09 20:09:03
dimich пише:

Або просто

  cli();
...
  sei();

Дякую, так вже не видає помилки, але всерівно чомусь нема ніякої реакції на PWM. Чіп аттіні прошиваю на 9.6МГц

Daminski
2024-03-09 19:54:57
dimich пише:

А який пекедж використовуєте для attiny13? MicroCore?

Ні, я використовував руснявий GyverCore, здається там новіше все.


dimich пише:

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

Ех, нажаль поки осцилографа не маю. Але схоже треба буде купити якийсь big_smile

dimich
2024-03-09 19:42:34
Daminski пише:

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

Якщо по-ардуінівськи, то

  noInterrupts();
...
  interrupts();

Або просто

  cli();
...
  sei();
Daminski
2024-03-09 19:29:36
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();"
"

dimich
2024-03-09 19:22:19

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

dimich
2024-03-09 19:09:32

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

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

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

Daminski пише:

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

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

Honey
2024-03-09 10:53:17

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

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

Daminski
2024-03-09 10:38:27

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

Honey
2024-03-09 10:23:50
Daminski пише:

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

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

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

dimich
2024-03-09 02:06:24
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 пише:

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

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

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