ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Вторник
26 ноября
78452 Топик полностью
rezident (17.01.2007 18:53, просмотров: 1) ответил Viland на Проблемы с АЦП в MSP430F149
Проблемы вовсе не с АЦП, а в том, что вы не совсем понимаете свою программу написанную на Си и то, как интерперетирует ее компилятор. Если вы посмотрите в заголовочный файл 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> но я предпочитаю первый вариант, как более понятный и наглядный.