Эта функция конфигурирует биты PCFG[3:0] регистра ADCON1, определяющие, какие из выводов порта будут аналоговыми, какие — цифровыми и будет ли использовано внешнее опорное напряжение. Константа RA0_RA1_RA3_ANALOG соответствует такой конфигурации, при которой в качестве аналоговых входов используются линии порта RA3 и RA[1:0] (с внутренним источником опорного напряжения), тогда как остальные линии порта остаются цифровыми — PCFG[3:0] = b’0100’ (см. Рис. 14.11). Если же мы хотим использовать вывод RA3 для подключения внешнего ИОН
∙ set_adc_channel(n);
Эта функция используется для загрузки номера текущего канала в биты CHS[2:0] регистра ADCON0.
∙ read_adc();
Эта функция устанавливает флаг
∙ #device ADC=8
Этой директивой задается выравнивание 10-битного результата преобразования по левой границе (см. Рис. 14.13). В таком случае функция read_adc () возвращает 8-битное целое число, считываемое из регистра ADRESH. При наличии в тексте программы директивы #device ADC=10 эта же функция возвращает 2-байтное значение типа long int.
В функцию compare () из Программы 14.3 в качестве параметра передается значение гистерезиса, названного delta, который может быть равен +1 или -1 (h’FF’). Результат преобразования сохраняется в локальной переменной analog, которая затем сравнивается с содержимым порта В плюс delta. По результату сравнения на линии RC[2:0] порта С выдается соответствующий код.
unsigned int compare(unsigned int delta)
{
unsigned int analog;
analog = read_adc();
if(analog > PQRT_B + delta)
{PORT_C = 0x04; delta = 0xff;}
else
if(analog == PORT_B)
{PORT_C = 0x02;}
else
{PORT_C = 0x01; delta = 1;}
return delta;
}
В соответствии с результатом сравнения также обновляется значение переменной delta, т. е. delta = +1, если analog < (PORTJB + delta), и delta = -1, если analog > (PORT_B + delta). Новое значение delta возвращается функцией в вызывающую программу, что позволяет той обновить значение своей локальной переменной (назовем ее hysteresis). Таким образом, для одновременного формирования выходного сигнала компаратора и обновления значения переменной hysteresis в вызывающей программе должно присутствовать следующее выражение:
hysteresis = compare(hysteresis);
В качестве альтернативы можно было бы объявить переменную hysteresis вне функции main (). Тогда эта переменная стала бы глобальной, т. е. ее значение было бы доступно всем функциям программы и его не потребовалось бы передавать между функциями.
* * *
Преобразование цифровой величины в эквивалентное аналоговое напряжение является более простой операцией, нежели рассмотренное нами аналого-цифровое преобразование, да и требуется не так часто. Наверное, именно по этим причинам цифро-аналоговые преобразователи (ЦАП) достаточно редко встречаются в составе большинства микроконтроллеров.
Мы с вами уже знаем, что одним из методов