//#include <defines.h>
#include <avr/io.h>
#include <avr/interrupt.h>
#define FOSC 4000000
#define BAUD 19200
#define MYUBRR 12
//макрос для запуска преобразования 
#define StartConvAdc() ADCSRA |= (1«ADSC) 
///////Объявление внутренних подпрограмм//////////////////
void USART_init(unsigned int ubrr);//инициализация USART 
void Chip(void);// Инициализация ресурсов процессора
void ADC_Init(void);//Подпрограмма инициализации АЦП и коммутатора
unsigned int ADC_Read(unsigned char );//Подпрограмма для чтения АЦП по указанному каналу
void spi_m(unsigned int dat);//Подпрограмма для SPI
void lp_s1(unsigned char k);//Подпрограмма фильтрации данных
void lp_s2(unsigned char k);//Подпрограмма фильтрации данных
unsigned int xd,k,s1,s2;// Объявление глобальных переменных
int TT,D1,D2,lp[128],lp1[128];
long int D1_1,D2_1;
unsigned char x1,x2,x3,x4,x5,x6,x7,x8,x9,x10,x11,
x12,ya,yb,yc,yd,sp,flag_rx;
int main(void)//начало основной программы

{ cli();
Chip();
USART_init(MYUBRR);
//TIMSK = 0x10;//разрешаем прерывание по совпадению
sei();
ADC_Init();

while(1)//организация бесконечного цикла
{ 
ya=PINA;
if(ya&4) {x1=1;} else {x1=0;};
if(ya&8) {x2=1;} else {x2=0;};
if(ya&16) {x3=1;} else {x3=0;};
if(ya&32) {x4=1;} else {x4=0;};
yb=PINB;
if(yb&0) {x5=1;} else {x5=0;};
if(yb&2) {x6=1;} else {x6=0;};
if(yb&4) {x7=1;} else {x7=0;};
if(ya&8) {x8=1;} else {x8=0;};
yc=PINC;
if(yc&4) {x9=1;} else {x9=0;};
if(yc&4) {x10=1;} else {x10=0;};
if(yc&4) {x11=1;} else {x11=0;};
if(yc&4) {x12=1;} else {x12=0;};//Опрос портов
xd=x1+x2*2+x3*4+x4*8+x5*16+x6*32+x7*64+x8*256+x9*128+x10*512+x11*1024+x12*2048; //формирование слова с 12 дискретных входов
spi_m(xd);//полученный код по SPI на внешний ЦАП
lp_s1(k);//фильтрация аналогового сигнала 1канал АЦП
lp_s2(k);//фильтрация аналогового сигнала 2канал АЦП
//OCR0=D1;//вывод обработанных данных на дискретный выход
//OC1A=
//OCR2=D2;
OCR1A=D1;//D1;//вывод обработанных данных на дискретный выход2 
OCR1B=D2;
OCR0=D1;
OCR2=D2;
}//конец цикла
}// конец основной программы
void Chip(void)
{//НАПРАВЛЕНИЕ ПЕРЕДАЧИ ДАННЫХ
DDRA=0x00;//настройка направления передачи данных порт А
DDRB=0xE8;//настройка направления передачи данных порт В
DDRC=0x00;//настройка направления передачи данных порт С
DDRD=0xF5;//настройка направления передачи данных порт D
//SFIOR=0xC;//УСТАНОВКА HI-Z
TCCR1A=0xC1;//настройка счетчика1 ДЛЯ ШИМ
TCCR1B=0x09;
TCCR0=0x19;// СЧЕТЧИК 0 ДЛЯ ЧИМ
TCCR2=0xFA;

}

void USART_init(unsigned int ubrr)
{ /* UCSRA = _BV(U2X); UBRRH = 0; UBRRL =3; UCSRB = (1 « TXEN) | (1 « RXEN); UCSRB |= (1 « RXCIE); */
//Задаем скорость работы USART
UBRRH = (unsigned char)(ubrr»8);
UBRRL = (unsigned char)ubrr;
UCSRB=(1«RXEN)|( 0«TXEN)|(1«RXCIE); //разращён прием и передача //URSEL,UMSEL=0 асинхронный,UPM01=0 Parity нет, USBS=0 1 стоп бит,UCSZ012 = 3 8бит данных
UCSRC=(1«URSEL)|(0«UMSEL)|(0«UPM1)|(0«UPM0)|(0«USBS)|(0«UCSZ2)|(1«UCSZ1)|(1«UCSZ0);
}
ISR(USART_RXC_vect)//Обработка прерывания чтения USART
{ k = UDR;

//USART_Transmit(D1);//Отправляем то, что получили
flag_rx=1;
//UCSRA = (0«RXC); //прерывание при чтении
}
void lp_s1(unsigned char k)// ОРГАНИЗАЦИЯ СКОЛЬЗЯЩЕГО СРЕДНЕГО
{ unsigned char i;
s1=127;//ADC_Read(0);
for(i=0;i<=k;i++)
{lp[k-1-i]=lp[k-2-i];}
D1_1=s1;
lp[0]=s1;
D1_1=0;
for(i=0;i<=k;i++){D1_1+=lp[k];}
D1=D1_1/k;
D1=D1/4;}
void lp_s2(unsigned char k)// ОРГАНИЗАЦИЯ СКОЛЬЗЯЩЕГО СРЕДНЕГО
{unsigned char j;
s2=127;//ADC_Read(1);
for(j=0;j<=k;j++)
{lp1[k-1-j]=lp1[k-2-j];}
D2_1=s1;
lp1[0]=s1;
D2_1=0;
for(j=0;j<=k;j++){D2_1+=lp1[k];}
D2=D2_1/k;
D2=D2/2;}

void ADC_Init(void)// Инициализация АЦП и коммутатора.
{ /*//ион - напряжение питания, выравнивание влево, нулевой канал
ADMUX = (0«REFS1)|(1«REFS0)|(1«ADLAR)|(0«MUX3)|(0«MUX2)|(0«MUX1)|(0«MUX0);
//вкл. ацп, режим одиночного преобр., разрешение прерывания,частота преобр. = FCPU/128
ADCSRA =
(1«ADEN)|(1«ADSC)|(0«ADATE)|(1«ADIE)|(0«ADPS2)|(1«ADPS1)|(1«ADPS0);*/
ADMUX=0xD0;//7; //регистр управления мультиплексором АЦП
ADCSRA=0xAF; //регистр управления и состояния А
ADCSRA|=ADSC; //(ADSC)старт преобразования для инициализации
while(!(ADCSRA&ADIF));//ожидание флага "конец преобразования"от компаратора
TT=ADC;}

unsigned int ADC_Read(unsigned char Chanel)// Чтение АЦП по указанному каналу.
{unsigned int Result;
ADMUX=208+Chanel; //выбор канала
ADCSRA+=64; //старт
while(!(ADIF&ADCSRA));//ожидание конца преобразования
Result=ADC;
return(Result);}
void spi_m(unsigned int dat) //SPI
{unsigned char ml,st,z;
ml=dat; st=dat»8 ;
SPCR=64+16+8;SPSR=1;//настройка spi master режим
PORTD&=251;sp=SPSR; SPDR=st;
for(z=0;z<=1;z++)sp=SPSR;
SPDR=ml;//передаваемые данные
for(z=0;z<=1;z++)sp=SPSR;
PORTD|=4;}