Таймер прерывает анализа

Wizarcl
Ср 6 апреля 2016 г. 1:12
Привет, друзья.
Я разрабатываю защитную эстафету в колледже, но я не могу использовать анализа в пределах таймера. Микроконтроллер останавливается, когда я это делаю.
HardwareTimer pwmtimer(3); setup() { pinMode(PA6,PWM ); pwmtimer.pause(); pwmtimer.setPrescaleFactor(1); pwmtimer.setOverflow(1200 - 1); // 72MHZ / 1200 = 60KHZ pwmtimer.setCompare(TIMER_CH1, 600 - 1); // 50% duty cycle pwmtimer.refresh(); pwmtimer.resume(); }

Mrburnette
Ср 6 апреля 2016 г. 1:42
Я разрабатываю защитную эстафету в колледже, но я не могу использовать анализа в пределах таймера. И есть веские причины, по которым вы не должны этого делать.
Скорее, установите глобальный флаг и восстановление прерываний. В вашем Loop () вы можете опросить флаг, выполнить аналоговое чтение встроено или в функции, а затем сбросить флаг для последующего использования.


Луча

Запоздалая мысль...
Я включил какой -то код, написанный для Attiny85 .... внимательно посмотрите на то, как f_wdt объявляется и используется; то есть:
летучая логическая f_wdt = 1;
Затем в самой процедуре прерывания это единственный активный код:
f_wdt = 1; // установить глобальный флаг
void setup() { // pinMode(PA6, PWM); // this line isn't needed pwm_start(PA_6, F_CPU, 1200, 600, 1); // this line goes in setup() }

Стевех
Ср. 06, 2016, 4:16
Правило 1 кода прерывания службы прерывания (ISR) Правило 1

а) Выйти, выйти очень быстро. Isrs живут в заимствованное время. Имейте в виду принципы взаимного исключения.
б) Не звоните за пределы ISR, не зная, что другой код подчиняется (а).
в) редко позволяет одному ISR прерывать другого.
г) Читать (а)

Rogerclark
Ср 6 апреля 2016 г., 4:25
В дополнение к тому, что сказали другие люди ...

Некоторые вещи не работают внутри прерываний, поскольку они используют прерывания в своей работе.

Я определенно не напишу ничего в серийный (или USB -серийный) внутри ISR, и я подозреваю, что чтение аналога, вероятно, будет использовать прерывание I.E, чтобы пометить, что «преобразование» завершено.

Примечание. Я не уверен, почему вы используете USBERIAL Class, как если бы вы используете загрузчик, «Serial» - это USBERIAL (Serial1 - аппаратный сериал 1)


эн.глин. У меня есть какой -то код, который запускается на триггере экстрарального прерывания 100 Гц (AC Mains Freq X 2), и мне нужно прочитать данные из SPI после того, как я получу прерывание.
Но я не читаю из SPI в ISR, я установил глобальный летучий флаг, а затем обращаюсь к чтению SPI в основном цикле в следующий раз, когда он проверяет переменную флага

Wizarcl
Ср. 06, 2016, 10:07
Спасибо за поддержку, ребята.

Мне не нужно использовать последовательный класс в прерывании таймера, я использовал его, чтобы проверить, какое значение возвращается анализацией. Я пытался собирать данные из анализа каждой микросекунд XXX. int (PA_6); //int (pwm_start); //pinMode(PA6, PWM); //pwm_start(PA_6, F_CPU, 1200, 600, 1); void setup() { pinMode(PA_6, PWM); //void pwm_start(PinName pin, uint32_t clock_freq, uint32_t period, uint32_t value, uint8_t do_init) //pwm_start(PA_6, uint32_t 72000000, uint32_t 1200, uint32_t 600, uint8_t 1); // set pwm frequency to 60.0 khz at 50% duty cycle on PA_6 //void pwm_start(PA_6, F_CPU, 1200, 600, 1); pwm_start(PA_6, F_CPU, 1200, 600, 1); } void loop() {}

Rogerclark
Ср. 06, 2016, 10:36
Зависит от того, что происходит в вашем основном цикле

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

Я помню, как кто -то еще разместил вопрос о чем -то подобном, и @Ddrown опубликовал ответ, показывающий, как вам нужно определить переменную флага как изменчивую и сколько инструкций это требуется, чтобы обработать плотно, пока цикл

STM32, работающий на уровне 72 МГц, представляет собой довольно быстрый процессор, поэтому установление флага в ISR и его обработка в основной цикле вряд ли даст огромную задержку.

Wizarcl
Ср. 06, 2016, 13:12
Я попробую, но у меня есть много кода в Main Loop (). Я использовал это в прошлом, но в основной петле не детерминированный. В зависимости от программы, Loop занимает 12 микросекунд или более, поэтому, если мне понадобится анализа каждые 20 микросекунд, используя флаг, микроконтроллер будет выполнять измерения после 24 микросекундов....

ZMEMW16
Ср. 06, 2016, 14:33
глупые вопросы времени
60 Гц - около 16.666 мс
Показать пользователь, как & Что именно?

Скажите 100 образцов, поэтому каждые 3.6 градусов - 0.166 мс или 166us / образец
При отборе 20USEC, это (16.666*1000US)/20US = 8333 Образцы

Преобразование АЦП занимает сколько времени?
Разве кто -то не делал с АЦП & DMA недавно? свинья

Arduino Loop выполняется каждые 24US, действительно?

Кто -нибудь еще также озадачен?

SRP

Wizarcl
Ср. 06, 2016, 21:13
ZMEMW16 написал:глупые вопросы времени
60 Гц - около 16.666 мс
Показать пользователь, как & Что именно?

Стевех
Ср. 06, 2016, 21:29
Вызовы библиотеки Arduino (или большинство из них) из ISR - вам нужно знать, как долго этот код будет работать.
Вообще неразумно.

Rogerclark
Ср. 06, 2016, 22:43
Похоже на уровне точности времени, который вы хотите, вам может потребоваться напрямую взаимодействовать с аппаратным обеспечением и не полагаться на вызовы Maple API.

На самом деле вам может потребоваться повторно код в ассемблере, если время имеет решающее значение, поскольку это единственный способ, которым вы сможете получить более точные сроки

Нб.

Все Micro Doe - это Miltiply количество миллисов на 1000, и выясняйте, как долго проходит между вызовом к микросхемам и следующим тиком Millis (Systick, который происходит после 72 000 тактовых циклов

Итак, у It Self в Micro довольно много накладных расходов.


Возможно, если вы точно объяснили, чего вы пытались достичь со всеми этими сложными временем, мы можем посоветовать, если вы просто смотрите на всю проблему неправильно.

Стевех
Чт, 07 апреля 2016 г., 4:42 утра
Rogerclark написал:Все Micro Doe - это Miltiply количество миллисов на 1000, и выясняйте, как долго проходит между вызовом к микросхемам и следующим тиком Millis (Systick, который происходит после 72 000 тактовых циклов

Итак, у It Self в Micro довольно много накладных расходов.

Wizarcl
Солнце 10 апреля 2016 г., 11:17
Извините, друзья, я совершаю большую ошибку. Я забыл объявить свою переменную как летучим, и использование серийного перерыва - плохая идея. Теперь я ищу информацию о MOR о часах ADC. В документации Leaflabs, которую я не основал, я ищу включенные файлы... Если у кого -то есть больше информации, пожалуйста, поделитесь. :)

Rogerclark
Солнце 10 апреля 2016 11:54
Leaflabs перенесла свою вики, но я не уверен, что это еще в Интернете.

Но я сомневаюсь, что вы найдете информацию, которая вам нужна в вики

Вам нужно будет сослаться на руководство по программированию для STM32F103 под названием RM0008, которое, я думаю, вы можете скачать отсюда http: // www.ул.com/web/en/resource/techn ... 171190.PDF