vshurik, ну раз адекватно, так пользуйтесь. Но надо понимать, что аппаратный способ будет существенно точнее, о чём вам ssss уже несколько раз сказал. У дуе есть навороченный 32-битный таймер, который может взять на себя вообще всё, и сделает это всё с максимально возможной для этого МК точностью. Вам останется в loop только вычесть значение одного регистра захвата из другого.
void SysTick_Handler(void) {
// Тут делаем что-то полезное
}
вставляю в код, а он не комплируется.
пишет:
Arduino: 1.8.5 (Windows 10), Плата:"Arduino Due (Programming Port)"
Archiving built core (caching) in: C:\Users\8523~1\AppData\Local\Temp\arduino_cache_104864\core\core_arduino_sam_arduino_due_x_dbg_f03bc1497c21bab2a485c6edb88e6f7c.a
C:\Users\8523~1\AppData\Local\Temp\arduino_build_375163/core\core.a(cortex_handlers.c.o): In function `SysTick_Handler':
C:\Users\Александр\AppData\Local\Arduino15\packages\arduino\hardware\sam\1.6.11\cores\arduino/cortex_handlers.c:47: multiple definition of `SysTick_Handler'
sketch\systick.ino.cpp.o:D:\arduino\systick/systick.ino:17: first defined here
collect2.exe: error: ld returned 1 exit status
exit status 1
Ошибка компиляции для платы Arduino Due (Programming Port).
.del.
Производители МК от фонаря периферии... наверное... напичкали...del.
.del.
.del.
.del.
.del.
Ну вот и встретились баран и новые ворота ;)
на просторах интернета нашел про системный таймер ARM, плата китайская Arduino DUE.
int t0 = 0, t1 = 0; float tt = 0; void setup() { Serial.begin(115200); //открываем COM порт pinMode (11, INPUT_PULLUP); //красная кнопка обнуление t0 и t1 attachInterrupt(digitalPinToInterrupt(27), start, RISING); attachInterrupt(digitalPinToInterrupt(28), stop, RISING); } //---------------------------- void start() { if (t0 == 0) { t0 = SysTick->VAL; } } //---------------------------- void stop() { if (t1 == 0) { t1 = SysTick->VAL; } } //---------------------------- void loop() { if (t0 != 0 && t1 != 0) { tt = (t0 - t1) * 0.0119047619; //вычисляем задержку 2 сигнала относительно 1 сигнала (в микросекунах с дискретностью 0.1мкс), частота процессора 84МГц, 1 тик=0.0119047619мкс Serial.print ("t="); Serial.println(tt, 1); delay(200); } if (digitalRead(11) == LOW) { t0 = 0; t1 = 0; Serial.println("ОБНУЛЕНИЕ"); } }Вроде все адекватно работает.
Жду конструктивной критики, может что кто посоветует.
vshurik, ну раз адекватно, так пользуйтесь. Но надо понимать, что аппаратный способ будет существенно точнее, о чём вам ssss уже несколько раз сказал. У дуе есть навороченный 32-битный таймер, который может взять на себя вообще всё, и сделает это всё с максимально возможной для этого МК точностью. Вам останется в loop только вычесть значение одного регистра захвата из другого.
подскажите по прерванию systick
вставляю в код, а он не комплируется.
пишет:
Arduino: 1.8.5 (Windows 10), Плата:"Arduino Due (Programming Port)"
vshurik, вам же компилятор английским по белому написал - дофига назначений на вектор. Короче он уже занят, иначе бы системные тики не работали.
как я понял, systick->val считает от 83999 до 0 (по времени 1мс), в момент счета с 1 на 0 вызывает прервание.
читал вот здесь http://stm32.chrns.com/post/149112836514/systick
Вот мне в этот момент нужно инерементировать перменную на 1 (считать количестов отсчетов с 83999 до 0), для и измерения интервала времени >1мс.
А чё вы тут... SAM3X...
Нус... кто даташит читать начнёт??? ))))))))
мы даташиты начинаем читать когда "НУ НЕ ПОЛУЧИЛОСЬ" )))