Студопедия

Главная страница Случайная страница

КАТЕГОРИИ:

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Программирование вручную






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.


Поделиться с друзьями:

mylektsii.su - Мои Лекции - 2015-2026 год. (0.082 сек.)Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав Пожаловаться на материал