Уважаемый Gipsy!
Пишу сюда, как к отцу-основателю проекта №1.
Наконец-то на 100% разобрался с вашей программой (буду переделывать под себя используя как учебник). Восхищен стройным алгоритмом.
Но как же без вопросов? =)
1. wpua := 1 это подтяжка входа RA0 к питанию для кнопки когда она сидела на 13 ноге. Самая первая схема. Но, к удивлению, это сохранилось и в тех прошивках где на этой ноге уже аналоговый вход. Схемы с внешним опорным напряжением. Микросхему спасает только внутренний аудит =). Наверное, это лучше убрать?
2. В хелпе на микропаскаль про функцию ADC_Read написано
Note : This function doesn't work with the external voltage reference source, only with the internal voltage reference.
Т.е. типа не работает с внешним Vref, только с внутренним опорным. Это как? Ведь используется же!
3. Периоды. Ваше if (i.0) - это шедевр! самая последняя взятая мною "крепость". Как я понял, измерения происходят 1 раз за 256 циклов программы, переключения 2-х разрядов индикатора через раз, Мигание, когда оно включено - 127 циклов горит, 128 нет. Т.е., получается, 1 миг=1измерение. Время цикла в режиме измерения в вашей программе определяется delay_ms(1) в конце программы. Т. е. измерения происходят один раз за 256 мс (+6мс на АЦП) или 4 раза в секунду. Но как тогда это мигает с такой частотой? Это же должна быть просто рябь! Было так? А вот в прошивке на 3 цифры - 10 мс, т.е мигание вроде должно быть величавым раз в 2,5 секунды.
4. Самое для меня удивительное.
adcon0 := 4 при внутреннем опорном или adcon0 := %01000000 в схемах с внешним. Для схемы с 3-мя цифрами adcon0 вообще равен 0.
По даташиту самый старший бит adcon0 = ADFM определяет расположение 10-разрядного измеренного кода АЦП в двух байтах.
В одном случае все прижимается вправо - в младшем байте 8 бит, в старшем байте 2 оставшихся старших бита на младших разрядах.
В другом случае все прижимается влево - в старшем байте 8 старших бит и в младшем байте оставшиеся 2 младших бита на старших местах.
В вашей программе после принятия кода ацп вы делаете
V:=ADC_Read(0);
V:=V shr 2; - сдвиг кода на 2 разряда вправо.
Т.е. из 10 разрядов делаете 8, чтобы потом работать только с одним байтом. Это логично для случая "правого" расположения байтов. Но прикол в том, что если верить даташиту, у нас задается "левое" расположение! ADFM = 0!
Просмотрел все известные исходники. Везде в проекте именно так. Но тогда получается, что мы работаем только с 4 младшими разрядами АЦП (2 было и 2 задвинули из старшего байта)?
Может где в моих рассуждениях ошибка - я только учусь!