Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Программирование вручную
1) Перед тем, как писать код, нужно подключить необходимые для программирования библиотеки (или убедиться, что они подключены автоматически если использовался мастер CodeWizard) (см. рис.11, позиция 4): #include < mega16.h> #include < delay.h> #include < stdlib.h> #include < alcd.h>
2) Необходимо задать функцию - обработчик прерывания по окончании АЦ преобразования (см. рис.11, поз 9): interrupt [ADC_INT] void adc_isr(void){ }Эту функцию проще задать с помощью CodeWizard в процессе настройки программы. В обработчике прерывания необходимо присвоить назначенной переменной adc_data значение переменной ADCW (см. рис.11, поз 9): adc_data = ADCW;Следует обратить внимание на то, что если использовался мастер CodeWizard, то тип переменной adc_data мастер присвоил в обработчике прерывания. Чтобы значение этой переменной можно было передавать в программе, её нужно сделать глобальной, т.е. поместить в раздел размещения глобальных переменных. ADCW - это двухбайтовая глобальная переменная – типа integer (она объявлена в mega16.h). В ADCW сохраняется 10-битный результат АЦП. При этом результат записывается в биты с 0-го по 9-й, т.е. 8 младших бит в ADCL (младший байт ADCW), а 2 старших бита– в ADCH (старший байт ADCW), т.е. результат выровнен вправо. Запись результата измерений АЦП в ADCW осуществляется по окончании измерения. При этом в 6-ой разряд регистра ADCSRA записывается «0» (сброс флага ADSC). Затем в обработчике прерывания надо установить флаг запуска АЦ преобразования ADSC (см. рис.11, поз 12), т.е. 6-му биту регистра управления и состояния АЦП порта А – ADCSRA присвоить значение равное «1»: ADCSRA|= 1< < ADSC; // либо ADCSRA|=0x40;Таким образом, в обработчике прерывания adc_isr производится запуск измерения АЦП и производится запись результата измерения в переменную ADCW.
3) Работе АЦП предшествует её инициализация. Обычно для этого создаётся отдельная функция, например: void Init_ADC(void) (см. рис.11, поз 14). Её запуск осуществляется в основной функции main. Отдельная функция инициализации может не создаваться, тогда инициализация должна производится в самой функции main. Инициализация АЦП предполагает назначение регистрам ADMUX, ADCSRA требуемых значений. В этой же функции можно инициализировать LCD дисплей и порты. В рассматриваемом примере осуществляется: - Выбор источника опорного напряжения (см. рис.11, поз 16). В примере выбран внутренний ИОН напряжением 2, 56 В, подключенный ко входу AREF: ADMUX = 0xC0; // либо ADMUX = 0b11000000; // либо ADMUX = (1< < REFS1)½ (1< < REFS0);- Разрешение работы АЦП («1» в 7-ом разряде (ADEN) регистра ADCSRA). - Разрешение прерывания от АЦП («1» в 3-м разряде (ADIE) регистра ADCSRA). - Выбор коэффициента предварительного деления частоты XTAL («1» в 0..2-м разрядах (ADPS2…ADPS0) регистра ADCSRA). Если выбрать ADPS2 = 1, то коэффициент предварительного деления частоты =16. Это соответствует записи (см. рис.8, поз 17): ADCSRA = 0x8C; // либо ADCSRA = 0b10001100; // либо ADCSRA = (1< < ADEN)½ (1< < ADIE)½ (1< < ADPS2));.Отдельно вынесена операция запуска АЦП (см. рис.8, поз 18): ADCSRA½ = (1< < ADSC); // либо ADCSRA ½ = 0x40; // либо ADCSRA ½ = 0b01000000;Данную операцию можно совместить с предыдущей и записать: ADCSRA=0xCС; //либо ADCSRA=0b11001100;Таким образом можно создавать общую функцию инициализации, которая кроме инициализации АЦП включает инициализацию портов, дисплея и т.д.
Рис.11 - Код программы
4) Рассмотрим реализацию функции void main(void). Задан массив str[9] типа unsigned char и переменная voltage типа float. Чтобы все прерывания работали, установлено глобальное разрешение прерываний с помощью функции #asm (“sei”) (см. рис.11, поз 33). В бесконечном цикле while(1) производится расчёт измеренного напряжения: voltage = ((float)(adc_data)) * 2.5 / 1023; ftoa(voltage, 2, str);Здесь (float) и ftoa – функции преобразование формата. Массив str используется для вывода измеренного значения АЦП на ЛСД. В строках 37, 38, 40 рис.11 вызываются функции управления дисплеем lcd_clear(), lcd_gotoxy(0, 0), lcd_puts(str). В строке 41, рис.11 задаётся временная задержка 100 мс: delay_ms(100). Текст полученной программы представлен на рис. 11.
|