Сообщение от MasterMushi
|
Не забывайте что само прерывание очень сильно отбирает процессорное время. Вход и выход кушает драгоценные циклы которых может и не хватить на переход из прерывание в прерывание.
|
На самом деле не так, главное правильно распределить время АЛУ и ресурсы МК(RAM ROM таймеры ножки итд) между задачами.
Обрабатывать результаты можно где угодно, лишь бы другие задачи в это время не требовали себе ресурсов АЛУ.
Например здесь. формирование импульсов должно проистекать чтрого в начале прерывания, что бы не было джитера, а когда будет обработано АЦП уже мало играет роль.
В этой задаче минимальный период равен 1/30000=33мксек. Следовательно обработка в каждом прерывании может длится примерно 30-32 микросек, что бы успеть выйти и зайти в следующее прерывание по переполнению таймера.
В начале прерывания формируете импульсы и остаётся около 28-30 микросекунд времени на чтение и обработку результатов АЦП.
Делаете так. Организовали счётчик на 4. 33мкс*4=132мкс›104мкс АЦП гарантировано успевает преобразовать за 132 микросекунды. Далее разделение проходов по счётчику на 4 ветки:
За 1 проход прочитали результат АЦП и запустили след преобразование и сложили в буфер, вычислили среднее. поместили результат в промежуточный буфер, начали обработку этого результата. Длительность не более те самые 28-30мкс.
За 2 проход - продолжение обработка результатов АЦП Длительность не более те самые 28-30мкс.
За 3 проход - продолжение обработка результатов АЦП Длительность не более те самые 28-30мкс.
За 4 проход - продолжение обработка результатов АЦП Длительность не более те самые 28-30мкс.
Итого получаете на обработку 4*28 около 110 микросекунд. Если этого мало, разбить на большее количество проходов. Все процессы будут синхронизированы и ничего не наложится друг на друга.
Практически все программы у меня работают в прерываниях, в главном цикле ничего нет.
Есть даже проект на 200 килобайт ассемблера на МЕГЕ128, 3 вложеных прерывания от таймеров, и всё успевает и работает.