Пытаюсь сделать вольтметр обновляющий данные по таймеру. Проблема такая: первое измерение правильное, а дальше прёт лажа.
Исходный код приложен. Объясните, плиз, что не так.
Если я правильно понял, то у тебя по переполнению таймера запускается АЦП, а по завершению цикла АЦП результат записывается в переменную. Одновременно в основном цикле из этой переменной извлекается число и выводится куда-то как-то... Получается, вывод никак не синхронизирован с процессом измерений (может быть такое, что как раз в момент, когда ты начал вычислять новое значение, как раз завершился цикл АЦП и значение это изменилось - оно же двухбайтное, а значит первый байт ты мог взять от старого результата, а второй - уже от нового - отсюда и лажа в индикации). Добавь в основной цикл ожидание конца преобразования АЦП, чтобы извлекать уже новый результат: добавь переменную какую-нибудь и устанавливай ее в 0 в обработчике прерывания от АЦП, а в основном цикле (в самом начале или самом конце) добавь:
Код:
while(sync){}; sync=1;
где sync - та самая переменная.
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...
Уважаемый! Я ж тебе русским языком сказал, как надо сделать... Ты сделал запуск и вывод без ожидания завершения цикла АЦП - чего ж ты хочешь-то?
Если уж ты решил запускать АЦП без таймера, то надо после его запуска ждать конца преобразования, и лишь после этого выводить результат.
Я советую перед тем, как начать писать программу, нарисовать алгоритм ее работы и по нему самому попытаться проследить, как и что работает. Пока сам не поймешь, ЧТО НАДО сделать и КАК ЭТО НАДО СДЕЛАТЬ - ничего не выйдет. Поставь себя на место МК и попробуй выполнить свою программу в уме (и на бумаге в качестве ОЗУ) - и ты сразу найдешь все свои недочеты.
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...
АЦП в ATMega16 ничего не видит, вывожу в десятеричке число на дисплеину, цифры "пляшут" в пределе 295... 300. На изменение уровня на 0-м вхoде ни как не реагирует.
// Read the AD conversion result unsigned int read_adc(unsigned char adc_input) { ADMUX=adc_input|ADC_VREF_TYPE; // Start the AD conversion ADCSRA|=0x40; // Wait for the AD conversion to complete while ((ADCSRA & 0x10)==0); ADCSRA|=0x10; return ADCW; }
// Declare your global variables here char buf0[41]; unsigned int temp;
void main(void) { // Declare your local variables here
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 6
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения