Проблемы вовсе не с АЦП, а в том, что вы не совсем понимаете свою программу написанную на Си и то, как интерперетирует ее компилятор. Если вы посмотрите в заголовочный файл msp430x1xx.h, то увидите, что ADC12BUSY это лишь символьное обозначение целого числа 0x0001, а вовсе не состояние бита ADC12BUSY в регистре ADC12CTL1. Теперь если подставить это число в вашу программу (что препроцессор компилятора собственно и делает), то получится
<c>
if(!0x0001) //проверка занятости АЦП
{
read_ADC(); // если не занят, читаем
// sort_adc(); //
}
</c>
Тело if (которое в скобках) никогда не выполняется, т.к. 1 имеет значение true, а not true = false. Поэтому компилятор со спокойной совестью выкидывает из конечной программы всю эту операцию проверки готовности АЦП. Во втором вашем примере
<c>
if(0x0001) //проверка занятости АЦП
{
read_ADC(); // если не занят, читаем
// sort_adc(); //
}
</c>
условие всегда выполняется, т.к. 1 всегда имеет значение true. Поэтому компилятор заменяет условную операцию if на безусловный вызов функции
<c>
read_ADC(); // если не занят, читаем
</c>
Для того, чтобы понять это достаточно было посмотреть что именно скомпилировано в листинге asm-файле.
Правильно написанный исходник в вашем случае должен выглядеть так
<c>
if((ADC12CTL1&ADC12BUSY)!=0) //проверка занятости АЦП
{ read_ADC(); // если не занят, читаем
}
</c>
Можно конечно написать просто
<c>
if(ADC12CTL1&ADC12BUSY)
{....}
</c>
но я предпочитаю первый вариант, как более понятный и наглядный.
-
- Гм. Прошу пардону. Ошибка у меня. rezident(132 знак., 17.01.2007 22:48, )