В общем, "высокоточный программно-емкостный реостат" тупо не уместился в отведенные на все-про все 2.5 кБ flash :) Посему применил способ для определения "конченности" батареи в пределах 2В (манипуляция с делителем 0.25Vcc и опорой. Зависит только от их точности). Ну и добавил довесок, позволяющий при тактовой 800 кГц на "излете экспоненты" таки замерить несколько градаций выше этих 2В. Уже трудится, если чО ;) На картинке внизу справа девайс 10-летней давности, залитый компаундом . Наконец удалось подлезть к нему и полностью диагностировать. Имхо, передатчик скопытился еще после заливки - ПАВ резонатор не силах "захватить" сильно ушедшую при этом вниз частоту трехточки. Кстати, частоту замеряю "анализатором спектра", етить. На плате ридера имеется радиомодуль CC1101 на 868 Мгц. Он прекрасно чувствует расположенный поблизости передатчик на 434 и с откушенной антенной(чтобы не лезли помехи). 40 каналов с шагом 25 кГц с центральной частотой 433.92.
char tst_bat(unsigned char t)
{
char i;
WDTCTL = WDT_ADLY_250; // отменим WDT прерывания на 250 мс
CS_ON; // отключим выход DATA MCP2030A (порт 2.4 DATA)
DATA_0; // разрядим емкость в RC цепочке, чтобы заряд происходил всегда от Vss
DATA_OUT; // порт 2.4 DATA в 0
delay(40); // достаточное время разряда
DATA_IN; // порт 2.4 DATA на вход
CAPD=CAPD4; // вообще отключим "цифру" от порта 2.4 "DATA"
CACTL2 = P2CA1; // P2.4 подцепим к CA1
CACTL1 = CAREF_1 + CAON + CARSEL; // подадим на P2.4 0.25*Vcc, включим компаратор
delay(t); // заряжаем RC цепь от 0.25*Vcc в течении времени "t"
CACTL1 = CAREF_2 + CAREF_1 + CAON; // подключим ref 0.5V к входу CA0, включим компаратор
i = CACTL2 & CAOUT; // запомним состояние выхода компаратора
CACTL1 = 0; // выключим компаратор
CAPD=0; // вернем на родину "цифру"
CS_OFF; // вернем на родину выход DATA MCP2030A (порт 2.4 DATA)
return(i); // вернем результат замера
}
void check_batt(void)
{
if (tst_bat(150)) {Vbat=20; return;} // "Приплыли". Здесь самое точное измерение, зависящее только от точности REF и делителя 0.25Vcc MSP.
if (tst_bat(40)) {Vbat=21; return;} // Здесь и ниже +- лапоть, но устраивает для диагноза
if (tst_bat(35)) {Vbat=22; return;}
if (tst_bat(30)) {Vbat=23; return;}
if (tst_bat(27)) {Vbat=24; return;}
if (tst_bat(23)) {Vbat=25; return;}
Vbat=30; // напряжение в норме (выше 2.5В)...
// RF_OFF; // выключим передатчик (нагрузка 2 мА), если он был включен для теста
// с выключеним лопухнулся, посему закомментарил. ON/OFF изображу в main()
// осталось еще пара десятков байтиков во flash ;)
}