возможно ли сделать так:
брать минимальное значение ацп за прошлый период , если текущее значение ацп меньше минимального прошлого значения ацп + х% , генерировать прерывание .
но как это сделать?
ведь контроллер вычисляет еще много чего
Сделать, как два пальца. Только чем еще занят МК? Как организовано считывание АЦП? Какое прерывание нужно?
Где исходник, куда это добавить нужно? И последнее: на хрена фотография непонятно чего, которая не влазит на экран?
vem566 писал(а):Сделать, как два пальца. Только чем еще занят МК? Как организовано считывание АЦП? Какое прерывание нужно?
Уж не знаю что там показывают два пальца, но мне видится ТРИ...
Прерывание - оно и в Африке...
Либо оно есть, а значит в обработчике можно что то там проанализировать, либо его нет и тогда контроллер продолжает исполнять код последовательно...
ТС не обозначил ОБЩУЮ задачу (картинка лишь дает смутные догадки о деревянном велосипеде с квадратными колесами), а его вопрос однозначно говорит о его непонимании архитектуры и принципов работы МК.
ЗЫ.
Тут возможно только два варианта.
1. Обработка после КАЖДОГО преобразования (по прерыванию АЦП по каждой выборке)
2. Обработка по прерыванию от ДМА. Тогда обработка происходит по всему периоду.
Латентность получения результата в первом варианте меньше, но загрузка МК по этой задаче ниже во втором.
Сформировать по заданному АВТОРОМ условию прерывание можно только ПРОГРАММНОЕ. Сиречь ни о каком реальном времени речи быть не может...
Обычно.
1. Выбираете источник запуска преобразований АЦП (таймер или чего еще).
2. Программируете ДМА на предмет адресов, куда будут направлены транзакции, на предмет числа транзакций после которых будет сгенерировано прерывание от ДМА, определяете вектор этого прерывания (если требует архитектура), программируете источник данных для транзакций (в Вашем случае это АЦП).
3. Запускаете источник по п.1
4. В обработчике прерываний от ДМА в обозначенном участке ОЗУ получаете массив данных за время от сброса ДМА до прерывания от ДМА.
Весь этот процесс происходит невидимо для основного кода.
Единственное, при транзакциях происходит захват шины ОЗУ, поэтому основной код при конфликтах обращения к ОЗУ с ДМА будет приостановлен для варианта архитектуры с однопортовым ОЗУ, а в случае с двухпортовым ОЗУ произойдет арбитраж только при одновременной ЗАПИСИ в ОДНУ И ТУ ЖЕ ячейку ОЗУ, что крайне маловероятно и определяется программистом.
а как запустить dma в chibi/os ?
можно обрабатывать каждые определенные промежутки времени , ос поддерживает многозадачность , но я не уверен что хватит вычислительной мощности.
хотя записывать семплы из ацп и отправлять по юсб вполне хватает