rezident (31.10.2007 19:05, просмотров: 89) ответил Алехин Александр на Вот текст процедуры измерения..
Ответ >> Насчет битов, которые можно изменять только при ENC=0 - не нашел нигде (SLAU144B - может устарел уже?) Про ENC есть только фраза, что если сбросить его во время измерения - результат будет непредсказуем.
Дык в разделе ADC10 Registers имеется примечание Modifiable only when ENC = 0 во всех ревизиях (A, B, C) User's Guide. У меня Rev.C последняя числится.
Еще два замечания по стилю написания программы.
1) Не пользуйтесь арифметическим сложением "+" при формировании байта/слова из отдельных битов. Пользуйтесь логическим ИЛИ "|". При использовании сложения легко ошибиться, а дважды просуммировав один бит уже получится совсем другое значение
REFON + REFON == REF2_5V
а вот REFON | REFON == REFON
2) по возможности используйте общепринятые TI символьные обозначения битов. Иначе текст слабочитаемый получается. Приходится долго и нудно, сверяясь с описанием регистров, проверять какие именно биты установлены, а какие сброшены.
Вот мой вариант вашей процедуры (для IAR EW430), который должен работать. Проверьте и сообщите результат.
<c>
unsigned Measure_Power_Level(void)
{ unsigned cntr;
ADC10CTL0 &=~ENC;
ADC10CTL0 = SREF0 | ADC10SHT0 | REF2_5V | REFON | ADC10ON;
for (cntr=0; cntr<0xff; cntr++);
ADC10CTL1 = INCH_11 | ADC10DIV_7 | ADC10SSEL_2;
ADC10DTC0 = ADC10DTC1 = 0;
ADC10CTL0 |= ENC | ADC10SC;
while((ADC10CTL0 & ADC10IFG) == 0);
ADC10CTL0 &=~ (ENC | ADC10SC | ADC10IFG);
cntr = ADC10MEM;
ADC10CTL0 &=~ (REFON | ADC10ON);
return (cntr);
}
</c>