Выбрать главу

}

void main(void)

{

// Инициализация портов ввода-вывода

// Все выводы порта PORTB настроены на вывод информации

DDRB=0xff;

// Включить первый светодиод

PORTB=led_status,

// Инициализация таймера TIMER1

// Таймер TIHER1 отсоединен or линии OC1

// не включен режим широтно-импульсной модуляции PWM

TCCR1А=0;

// Частога таймера TIMER1 xtal/1024

TCCR1B=5;

// Предустановим значение таймера TIMER1

TCNT1=0x10000-(xtal/1024/fmove);

// Очистить флаги прерываний по таймеру

TIMER1 TIFR=0;

// Разрешить прерывания по переполнению таймера TIMER1

TIMSK=0x80;

// Все остальные виды прерываний запрещены

GIMSK=0;

// Разрешение глобальных прерываний

#fasm

sei

#endasm

// Бесконечный цикл, при этом возможно возникновение прерываний по переполнению таймера TIMER1

while (1);

}

Цифровой вольтметр с использованием АЦП фирмы Maxim типа МАХ1241

Измеренное значение передается с помощью интерфейса RS232. Параметры интерфейса: 9600 8N1.

Материал взят из демонстрационной версии компилятора CodeVisionAVR С Compiler, автором которого является Pavel Haiduc, HP InfoTech S.R.L.

Частота кварцевого резонатора: 4,000 МГц.

Подсоединение МАХ 1241 KAT90S8515.

Программатор после программирования контроллера должен быть отсоединен.

Текст программы:

#include <90s8515.h>

// Стандартная библиотека ввода/вывода

#include <stdio.h>

// Библиотека SPI-функций

#include <spi.h>

// Библиотека для формирования задержек

#include <delay.h>

// Опорное напряжение для МАХ1241 [мВ]

#define VREF 5000

// Определение управляющих сигналов для МАХ1241

#define NSHON P0RTB.0

#define NCS P0RTB.1

#define DOUT PINB.6

union adcu

{

unsigned char byte[2];

unsigned int word;

};

// Произвести одно аналого-цифровое преобразование и

// вернуть его результат unsigned

int max1241_read(void)

{

union adcu adc_data;

// Вывести микросхему MAX1241 из режима shutdown

NSHDN=1;

// Подождать 5 мкс для приведения МАХ1241 в рабочее состояние

delay_us(5);

// Теперь выбрать чип для начала преобразования

NCS=0;

// Ждать, пока преобразование не завершится

// DOUT будет равен 0 в процессе преобразования

while (DOUT==0);

// DOUT=1 —> преобразование завершено

// Прочитать младший байт (MSB)

adc_data.byte[1]=spi(0);

// Прочитать старший байт (LSB)

adc_data.byte[0]=spi(0);

// Снять сигнал выбора чипа

NCS=1;

// Перевести АЦП в режим shutdown

NSHDN=0:

// Форматировать результат преобразования и возврат результата

return (adc_data.word»3)&0xfff;

}

void main(void)

{

// Переменная для хранения результата преобразования

unsigned n;

// Инициализация портов ввода/вывода

// Port А

DDRA=0x00;

P0RTA=0x00;

// Port В

// Линия /SS установлена на вывод информации

// на уровне 1, это необходимо для работы

// SPI-порта в режиме мастер

DDRB=0xA3;

P0RTB=0x12;

// Port С

DDRC=0x00;

P0RTC=0x00;

// Port D

DDRD=0x00;

P0RTD=0x00;

// Инициализация UART (интерфейс RS-232)

// Параметры интерфейса: 8 битов данных, 1 стоп бит, без проверки четности

// приемник UART: отключен

// передатчик UART: включен

UCR=Ox08;

// Скорость передачи данных: 9600

UBRR=0x19;

// Инициализация SPI

// Режим работы SPI: мастер

// Тактовая частота SPI: 1000 000 кГц

// Порядок передачи данных: младший бит первый

SPCR=0x50;

putsf("MAX1241 Demo using the CodeVisionAVR С Compiler");

pUtSf ("*******************************************\n");

// Произвести аналого-цифровое преобразование и передать результаты

// через интерфейс RS-232

while (1)

     {

     n=max1241_read();

     printf("HAX1241-> N=%4u U=964umV\r\n",n,(unsigned) ((long) n*VREF/4096));

     // 0.3 sec. delay

     delay_ms(300);