#include // включение заголовочного файла для м/к ATmega8 // подпрограмма инициализации порта UART void uart_init ( void ) { UCSRA.1 = 1; // двойная скорость передачи UBRRL = 35; // скорость передачи 56000 бит/сек при частоте генератора 16 МГц UCSRB.3 = 1; // разрешение передачи UCSRB.4 = 1; // разрешение приема } // подпрограмма передачи байта по UART void uart_out ( unsigned char data ) { while ( !UCSRA.5 ); // ждем окончания передачи UDR = data; } // подпрограмма приема байта по UART unsigned char uart_in ( void ) { while ( !UCSRA.7 ); // ждем окончания приема return UDR; } // подпрограмма инициализации прерываний и АЦП void adc_interrupt_init( void ) { ADCSRA = 0b11100111; // включаем АЦП TIMSK = 0x80; // прерывание по совпадению содержимого счетчика T2 OCR2 = 156; // значение в счетном регистре // установка частоты дискретизации #asm("sei"); // глобальное разрешение прерываний } // программа обработки прерывания по счетчику interrupt [TIM2_COMP] void send_to_host ( void ) { while ( !UCSRA.5 ); // ожидаем конец передачи байта UDR = ( ADCL / 4 ) + ( ADCH * 64 ); // записываем в регистр для передачи, приведенное к 8 битам, значение АЦП return; } void main () { unsigned char i = 0 ; uart_init(); // инициализация порта UART adc_interrupt_init(); // инициализация прерывания и АЦП // основной цикл while ( 1 ) { i = uart_in(); if ( i == 0xFF ) ADMUX = uart_in(); // выбор канала для сканирования else ADMUX = i; TCCR2 = 0b00001111; // включаем счетчик с прерываниями, предделитель /1024 while ( !UCSRA.7 ); // ожидаем прием стопового байта i = UDR; // считываем принятый байт TCCR2 = 0; } }