Спойлер
Код: Выделить всё
#include <mega8.h> //основной заголовочный файл для ATMega8
#include <stdio.h> //базовые функции ввода-вывода
#include <delay.h> //функция задержки
#define ADC_VREF_TYPE 0x40 //константа для задания источника опорного напряжения АЦП
#define MUX_NUM_MASK 0x0F //маска для защиты 4 старших бит регистра АDMUX от неверного номера ножки входного сигнала АЦП
#define PACK_MASK_6 0x3F //маска бит №0-5 для 6 младших разрядов результата АЦП в 8-битном слове отсылаемого на ПК массива данных
#define PACK_MASK_4 0x3C //маска бит №2-5 для 4 старших -/-
#define PACK_NUM_0 0x00 //идентификаторы байт отсылаемого массива
#define PACK_NUM_1 0x40
#define PACK_NUM_2 0x80
#define PACK_NUM_3 0xC0
#define REL_1_ON 0x01 //признак работы реле 1
#define REL_2_ON 0x02 //признак работы реле 2
//объявление глобальных переменных
unsigned int adc_data; //переменная для хранения результата АЦП, 16 бит
unsigned char pack[4]; //массив из 4х 8-битных слов для посылки данных через USART
unsigned char n; //счетчик для отправки байтов
void read_adc(unsigned char pin_number) //Функция однократного выполнения АЦП
{
ADMUX = (pin_number & MUX_NUM_MASK) | (ADC_VREF_TYPE & 0xFF); //задание номера ножки входного сигнала
delay_us(60); //пауза для стабилизации входного напряжения на АЦП
ADCSRA |= 0x40; //запуск АЦП 6-м битом
while (!(ADCSRA & 0x10)); //пустой цикл ожидания завершения АЦП (пока 4-й бит не станет = 1)
ADCSRA |= 0x10; //обнуление 4-ого бита записью в него логической 1
adc_data = ADCW; //запись результата АЦП
}
void USART_transmit(unsigned char data) //функция отправки байта через USART
{
while (!(UCSRA & 0x20)); //цикл ожидания опустошения буфера данных UDR (пока 5-й бит регистра URDE не станет = 1)
UDR = data; //помещение данных в буфер, отправка
}
void main(void)
{
//инициализация портов ввода/вывода
//Port B (8 ножек)
DDRB=0x00; //все ножки = входы
PORTB=0x00; //на всех ножках логический 0
//Port C (7 ножек)
DDRC=0x00; //все ножки = входы
PORTC=0x00; //на всех ножках логический 0
//Port D (8 ножек)
DDRD=0x00; //все ножки = входы
PORTD=0x00; //на всех ножках логический 0
//инициализация таймеров/счетчиков
//Timer/Counter 0 - выкл
TCCR0=0x00;
TCNT0=0x00;
//Timer/Counter 1 - выкл
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
//Timer/Counter 2 - выкл
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;
//внешние прерывания - выкл
MCUCR=0x00;
//прерывания таймеров/счетчиков - выкл
TIMSK=0x00;
//инициализация USART
//порядок битов в пакете: 8 Data, 1 Stop, No Parity
//Rx (приемник): выкл
//Tx (передатчик): вкл
//режим передачи: асинхронный
//скорость передачи: 9600 бит/с
UCSRA=0x00;
UCSRB=0x08;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x2F;
//аналоговый компаратор: выкл
ACSR=0x80;
SFIOR=0x00;
//инициализация АЦП
ADMUX = (ADC_VREF_TYPE & 0xFF); //источник опорного напряжения АЦП - ножка AVCC, на AREF - конденсатор, выравнивание результата АЦП по правому краю регистра ADCL
ADCSRA=0x87; //АЦП разрешено, циклический режим выключен, запретить прерывание по окончании АЦП, делитель частоты = 128, частота АЦП 57.600 кГц
//разрешить прерывания глобально
#asm("sei")
delay_ms(200);
while (1) //главный цикл программы
{
read_adc(0x05); //АЦП1 - температура
pack[0] = (adc_data & PACK_MASK_6) | PACK_NUM_0; //1ое слово массива, биты 0-5: 6 младших бит АЦП1
adc_data = adc_data >> 4; //сдвиг результата АЦП1 на 4 разряда вправо
pack[1] = (adc_data & PACK_MASK_4) | PACK_NUM_1; //2ое слово массива, биты 2-5: 4 старших бита АЦП1
read_adc(0x04); //АЦП2 - положение ИМ
pack[4] = (adc_data & PACK_MASK_6) | PACK_NUM_2; //3е слово массива, биты 0-5: 6 младших бит АЦП2
adc_data = adc_data >> 4; //сдвиг результата АЦП2 на 4 разряда вправо
pack[3] = (adc_data & PACK_MASK_4) | PACK_NUM_3; //4е слово массива, биты 2-5: 4 старших бита АЦП2
if(!(PINB.0)) pack[3] |= REL_1_ON; //0й бит 4ого слова - состояние реле 1
if(!(PINB.1)) pack[3] |= REL_2_ON; //1й бит 4ого слова - состояние реле 2
for(n=0; n<4 ; n++)
{
USART_transmit(pack[n]); //цикл отправки 4х слов 8-битного массива
delay_ms(20); //пауза между байтами
}
}
}

