Когда описывал разную периферию обратил внимание, что биты регистра SFIOR описываются в разных местах даташита, а это может оказаться не очень удобным. Не так часто конечно он используется, я бы даже сказал редко, но все же решил сделать короткую заметку об этом регистре, может кому сгодится. Итак, SFIOR (special function input output regester) - регистр специальных функций ввода вывода. В этой заметке опишу регистр МК ATmega16 и в каком разделе даташита биты описываются. У него задействованы почти все биты регистра. У других микроконтроллеров функции битов будут те же самые, но некоторые биты могут не использоваться.
SFIOR

Биты 7:5 - ADTS2:ADTS0: выбор источника запуска АЦП. Если ADATE=1 регистра ADCSRA, то значение записанное в эти биты будет определять источник запуска преобразований АЦП. Преобразование будет запускаться на растущем фронте выбранного флага прерывания (т.е. при установке в "1"). Раздел даташита Analog to Digital Converter.

Бит 3 - ACME: включение мультиплексора аналогового компаратора. Если в этот бит записан "0" - вход компаратора AIN1 подключен к ножке микроконтроллера AIN1, а если "1", тогда AIN1 может быть подключен к любому входу АЦП микроконтроллера (при условии, что АЦП выключен - бит ADEN=0 регистра ADCSRA). Раздел даташита Analog Comparator.
Бит 2 - PUD: отключение подтягивающих резисторов. Если бит установлен, то подтягивающие резисторы отключены не зависимо от того, что записано в DDRx и PORTx. Раздел даташита I/O Ports.
Бит 1 - PSR2: сброс предделителя таймера/счетчика2. Если этот бит установить в "1" - предделитель таймера/счетчика2 будет сброшен. Этот бит будет очищен аппаратно после подтверждения операции (буквально на следующем такте). Запись "0" в этот бит ни к чему не приведет. Раздел даташита 8-bit Timer/Counter2 with PWM and Asynchronous Operation.
Бит 0 - PSR10: сброс делителя частоты таймера/счетчика1 и таймера/счетчика0. Если этот бит установлен в "1" - предделитель таймера/счетчика1 и таймер/счетчика0 будет сброшен. Этот бит будет очищен аппаратно после подтверждения операции. Запись "0" ни к чему не приведет. Чтение этого бита всегда будет возвращать "0". Следует отметить, что ТС1 и ТС0 используют совместно один и тот же предделитель и сброс делителя повлияет на оба таймера. Раздел даташита Timer/Counter0 and Timer/Counter1 Prescalers.
Предделитель работает не зависимо от того включен таймер или выключен. Если мы запускаем таймер с каким-нибудь предделителем, например 256, то первый такт на таймер может прийти не через 256 импульсов, а меньше, т.к. при запуске таймера на этом предделителе могло пройти какое-то количество импульсов. Сброс предделителей нужен для того, чтобы мы точно знали, что в этот момент мы начинаем наш счет с нуля. Но к этому нужно подходить аккуратно. А то, например, сбрасывая все время один таймер, второй с большим предделителем может и не сработать никогда.
Комментариев: 1 RSS
1 Руслан 11-11-2012 02:54
Спасибо! Оч пригодилась статья.
нет, как раз это все спользуется.. И даже не редко. Даже в самых простых задачах.
Жаль ADATE не разъяснили.. И ADIE (ADC Interrupt Enable - Разрешение прерывания ADC)