}
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);