1. Насколько я понял 100% заполнение выставить нельзя? Одиночные импульсы все таки проскакивают. Не помню точно а каком случае, когда 0 в регистрах сравнения или TOP.
2. ADC как известно умеет режим noise canlceler. Преобразование запускается при входе в сон. И это вызывает некоторые сложности. Задача: по регулярному событию делать две (четыре, + ещё две т.к. после смены опоры одно преобразование надо отбросить) выборки и преобразования с разных входов АЦП. Надо делать выборки без задержек и дрожащих фронтов. Это можно сделать по событию от например таймера или во free run режиме. В первом случае работу может нарушить sleep, может так случится, что в этот момент нет задач и выполение дойдет до входа в сон, начнется преобразование АЦП когда оно не должно быть (и это нельзя выключить). Во втором (free run) преобразование всегда в процессе, а обновлять ADMUX надо как-то особенно осторожно (в ДШ не очень ясно написано). Пока думаю использовать запуск по событию от таймера и запрещать сон на период использования АЦП (16% времени работы). Но как то это все не красиво, может можно лучше, а я не знаю как?
МК mega88/328, спасибо.
Добавка: Из ДШ,
The MUXn and REFS1:0 bits in the ADMUX Register are single buffered through a temporary register to which the
CPU has random access. This ensures that the channels and reference selection only takes place at a safe point
during the conversion. The channel and reference selection is continuously updated until a conversion is started.
Once the conversion starts, the channel and reference selection is locked to ensure a sufficient sampling time for
the ADC.Continuous updating resumes in the last ADC clock cycle before the conversion completes (ADIF in
ADCSRA is set). Note that the conversion starts on the following rising ADC clock edge after ADSC is written. The
user is thus advised not to write new channel or reference selection values to ADMUX until one ADC clock cycle
after ADSC is written.
If Auto Triggering is used, the exact time of the triggering event can be indeterministic. Special care must be taken
when updating the ADMUX Register, in order to control which conversion will be affected by the new settings.
If both ADATE and ADEN is written to one, an interrupt event can occur at any time. If the ADMUX Register is
changed in this period, the user cannot tell if the next conversion is based on the old or the new settings. ADMUX
can be safely updated in the following ways:
a. When ADATE or ADEN is cleared.
b. During conversion, minimum one ADC clock cycle after the trigger event.
c. After a conversion, before the Interrupt Flag used as trigger source is cleared.
When updating ADMUX in one of these conditions, the new settings will affect the next ADC conversion.
Какое-то здесь противоречие, а последнее выделенное (пункт с) я не понимаю. Тот флаг снимется до завершения преобразования.
Ещё добавка: Наверно надо понимать второй пункт немного иначе, "During conversion" там лишнее. Преобразование же начинается только про фронту тактоваого сигнала АЦП. То есть когда оно действительно начнется то ADMUX будет действительно "is locked". А до того это ещё не "During conversion".
Во free runing как я понял к моменту входа в прерывание АЦП уже начинается новое преобразование, то есть можно обновлять ADMUX в прерывании и следующее преобразование будет по заданному каналу.
По поводу пункта c. это больше похоже на флаг ADIF.
Ещё добавка:
3. Как по хорошему обновлять регистры сравнения? При записи в OCR1A/OCR1B может произойти переполнение таймера, между записию двух этих регистров. Одно значение возмется новое, второе старое. И ещё некоторое действие хотелось бы делать после каждого обновления регистров сравнения. А не так, чтобы регистры обновились а действие будет только при следующем переполнении. Решение: останавливать таймер и запрещать прерывание, все быстро делать и включать обратно. Лучше никак нельзя?