#include <mega8.h>
#include <delay.h>
#define ADC_VREF_TYPE 0x40 
///////////////////////////////////////////////////////////////////////////////////
//  АЦП №1
//  1-0101-0101010101-1010-1010101010-1-0000   // пакет 35 бит - 31дел -00000000...00011111
//  с- №  -  -АЦП-   - и№ - и АЦП -  -c-пауза
//  ШИМ №1
//  1-1010-0101010101-0101-1010101010-1-0000   // пакет 35 бит - 31дел -00000000...00011111
//  с- №  -  -ШИМ-   - и№ - и ШИМ -  -c-пауза
//  кнопка №1
//  1-1011-0010101010-1101-1010110010-1-0000   // пакет 35 бит  
//  - - - - - - -код- - - - - - - -  -c-пауза
//  кнопка №2
//  1-1010-0110110100-1010-1010100110-1-0000   // пакет 35 бит  
//  - - - - - - -код- - - - - - - -  -c-пауза
//  кнопка №3
//  1-1101-0101001010-1100-1010110010-1-0000   // пакет 35 бит  
//  - - - - - - -код- - - - - - - -  -c-пауза
//  кнопка №4
//  1-1001-1011010101-0011-0011010110-1-0000   // пакет 35 бит  
//  - - - - - - -код- - - - - - - -  -c-пауза
//////////////////////////////////////////////////////////////////////////////////
char a,b,z,d,c=144,v=72;     //v=1/2c - вероятность 
char u,f,g,q,e=0b00010000;   // АЦП №1, ШИМ №1
char b1,b2,b3,b4,b5,b6,b7,b8,b9,b10,b11,b12,b13,b14,b15;          // биты.
char b16,b17,b18,b19,b20,b21,b22,b23,b24,b25,b26,b27,b28,b29,b30; // биты.
char k1,s,h;                 // АЦП №1, мигалка - сирена
//////////////////////////////////////////////////////////////////////////  внутренний АЦП
unsigned int read_adc(unsigned char adc_input)
{
ADMUX=adc_input | (ADC_VREF_TYPE & 0xff);
delay_us(10);
ADCSRA|=0x40;
while ((ADCSRA & 0x10)==0);
ADCSRA|=0x10;
return ADCW;
}
////////////////////////////////////////////////////////////////////////////////// 
void main(void)
{
DDRC.0=0;        // вход внутренний АЦП 1 - сравнение
PORTC.0=0;       // вход внутренний АЦП 1 - сравнение
DDRC.2=1;        // выход настройка "вкл" 
PORTC.2=0;       // выход настройка "вкл"
DDRC.3=1;        // выход настройка "синхро"
PORTC.3=0;       // выход настройка "синхро"
DDRC.4=0;        // вход сигнал приёмник
PORTC.4=0;       // вход сигнал приёмник
DDRD=0b11111111; // выход кнопки 1,2,3,4...
PORTD=0b00000000;// выход кнопки 1,2,3,4...
DDRB.6=1;        // выход сравнение АЦП 1 <> внутренний АЦП 1 "+"
PORTB.6=0;       // вкл. "+" АЦП 1 > внутренний АЦП 1
DDRB.7=1;        // выход сравнение АЦП 1 <> внутренний АЦП 1 "-"
PORTB.7=0;       // вкл. "-" АЦП 1 < внутренний АЦП 1
//////////////////////////////////////////////////////////////// внутренний АЦП 1
ADMUX=ADC_VREF_TYPE & 0xff; // настройка - внутренний АЦП 1
ADCSRA=0x83;                // АЦП 1 - 00000000...00011111 - 31 дел
//////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////// таймер № 1
TCCR1A=0b10000010; // настройка таймера - режим быстрая ШИМ  
TCCR1B=0b00011011; // настройка таймера - предделитель - выход ШИМ № 1 - 1041 Hz 
ICR1L=0b00001111;  // регистр захвата - верхний предел счета 00001111 - 15 дел
OCR1AL=0b00000000; // регистр порога сравнения - 00000000...00001111 - +/- 15 дел
//////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////// таймер № 2
TCCR2=0b00011010; // настройка таймера - режим CTC - инверсия при совпадении 
OCR2=0b00000000;  // регистр порога сравнения //10000000-480 Hz//01000000-960 Hz
//////////////////////////////////////////////////////////////////////////////////
mesto_1: 
//////////////////////////////////////////// вкл. внутренний АЦП 1 (PC0)
read_adc(0); // измерение - внутренний АЦП 1 (PC0)
f=ADCW/16;   // ADCW/16;-5v-00111111-63, 63/2=31  -5v-31-00011111.  
//////////////////////////////////////////// фильтр входа серво - гистерезис
if (f>g+1) { 
u=f/2;   //+63/2=31-00011111  // u=АЦП 1
g=f;
    }
if (f<g-1) { 
u=f/2;   //-63/2=31-00011111
g=f;
    }
//////////////////////////////////////////////////////// сравнение АЦП 1-RX<>АЦП 1-TX. 
if (e>u) { 
PORTB.6=1;   // вкл. "+" АЦП 1 > внутренний АЦП 1
PORTB.7=0;
     }
if (e<u) { 
PORTB.6=0;   // вкл. "-" АЦП 1 < внутренний АЦП 1
PORTB.7=1;
     }
if (e==u) { 
PORTB.6=0;   // "0"     АЦП 1 == внутренний АЦП 1
PORTB.7=0;
     }
///////////////////////////////////////// поворотники
if (k1<10) {  // есть сигнал АЦП
b=b+1;
if (b>5) {                 // мигаем - вкл. 0,2 c    
  if (u>0b00001111) {      // 10000...11111  
  PORTD.4=0;               // > вправо (вход АЦП больше 2,5 V)
  PORTD.5=1;              
  }
  if (u==0b00001111) {     // 01111 
  PORTD.4=0;               // == прямо 
  PORTD.5=0;              
  }
  if (u<0b00001111) {      // 11110...00000  
  PORTD.4=1;               // < влево (вход АЦП меньше 2,5 V)
  PORTD.5=0;             
  }
}
if (b>10) {                 
  PORTD.4=0;               // мигаем - выкл. 0,2 c 
  PORTD.5=0;              
  b=0;               
 }
}
//////////////////////////////////////// мигалка - сирена  
if (h==1) {         // вкл. мигалка
DDRB.3=1;           // вкл. таймер № 2 - сирена
  s=s+1;
  if (s>10) {        // мигаем - вкл. 0,2 c    
  OCR2=0b10000000;  // частота таймера № 2 - 480 Hz - сирена
  PORTD.1=1;                
  PORTD.2=0;              
  } 
  if (s>20) {       // мигаем - выкл. 0,2 c 
  OCR2=0b01000000;  // частота таймера № 2 - 960 Hz - сирена
  PORTD.1=0;                
  PORTD.2=1;             
  s=0;
  }
}
if (h==0) {          // выкл. мигалка
DDRB.3=0;            // выкл. таймер № 2 - сирена
PORTD.1=0;
PORTD.2=0;   
}     
//////////////////////////////////////////////////////////////////////////// 
/////////////////////////////////////////////////// поиск синхро - ждём "0"
while (1)
      {  
mesto_3:
z=z+1;             
if (z>100) {       // ждём синхро  0,1...0,3 c.
PORTD=0b00000000;  // нет синхро > выкл. все кн.
DDRB.1=0;          // нет синхро > выкл. таймер № 1 - ШИМ № 1  
DDRB.3=0;          // нет синхро > выкл. таймер № 2 - сирена
};
/////////////////////////////////////////////////// поиск синхро - "000"    
////////////////////////////// "0"     
for (a=0;a<c;a++) {
if (PINC.4==0) { 
d=d+1;         
     };
     }; 
if (d<v) { 
d=0;
goto mesto_3;         
     };
d=0;
////////////////////////////// "00"    
for (a=0;a<c;a++) {
if (PINC.4==0) { 
d=d+1;         
     };
     }; 
if (d<v) { 
d=0;
goto mesto_3;         
     };
d=0;
////////////////////////////// "000"   
for (a=0;a<c;a++) {
if (PINC.4==0) { 
d=d+1;         
     };
     }; 
if (d>v) { 
d=0;
z=0;             
PORTC.2=0;         // настройка "вкл"
goto mesto_2;      // пуск      
     };
d=0;
};
//////////////////////////////////////////////////////////// пуск
mesto_2:
//////////////////////////////////////////////////////////////////////////// 
/////////////////////////////////////////////////////// счётчик ошибок АЦП:
k1=k1+1; 
///////////////////////////////////////////// ошибка кода АЦП (нет сигнала)
if (k1>10) {    
PORTD=0b00000000;  // ошибка кода АЦП > выкл. все кн.
DDRB.1=0;          // ошибка кода АЦП > выкл. таймер № 1 - ШИМ № 1  
DDRB.3=0;          // ошибка кода АЦП > выкл. таймер № 2 - сирена
h=0;               // ошибка кода АЦП > выкл. мигалка
k1=10;
     };
/////////////////////////////////////////////////////////////////////////     
////////////////////////////////////////////////////////////// ждём "1"
while (PINC.4==0)
      {  
z=z+1;          
if (z>250) {       // ждём "1" - 5 mc ...
PORTD=0b00000000;  // нет сигнала > выкл. все кн. 
DDRB.1=0;          // нет сигнала > выкл. таймер № 1 - ШИМ №1
DDRB.3=0;          // нет сигнала > выкл. таймер № 2 - сирена
};
};
z=0;
///////////////////////////////////////////////////////////// приём код:                   
////////////////////////////// 1 - старт бит  "1"      
PORTC.3=1;
for (a=0;a<c;a++) {
if (PINC.4==1) { 
d=d+1;         
     };
     }; 
if (d>v) { 
b1=1;         
     };
if (d<v) { 
b1=0;         
     };
d=0;
PORTC.3=0;
////////////////////////////// 2         
PORTC.3=1;
for (a=0;a<c;a++) {
if (PINC.4==1) { 
d=d+1;         
     };
     }; 
if (d>v) { 
b2=1;         
     };
if (d<v) { 
b2=0;         
     };
d=0;
PORTC.3=0;
////////////////////////////// 3   
PORTC.3=1;
for (a=0;a<c;a++) {
if (PINC.4==1) { 
d=d+1;         
     };
     }; 
if (d>v) { 
b3=1;         
     };
if (d<v) { 
b3=0;         
     };
d=0;
PORTC.3=0;
////////////////////////////// 4
PORTC.3=1;
for (a=0;a<c;a++) {
if (PINC.4==1) { 
d=d+1;         
     };
     }; 
if (d>v) { 
b4=1;         
     };
if (d<v) { 
b4=0;         
     };
d=0;
PORTC.3=0;
////////////////////////////// 5       
PORTC.3=1;
for (a=0;a<c;a++) {
if (PINC.4==1) { 
d=d+1;         
     };
     }; 
if (d>v) { 
b5=1;         
     };
if (d<v) { 
b5=0;         
     };
d=0;
PORTC.3=0;    
////////////////////////////// 6       
PORTC.3=1;
for (a=0;a<c;a++) {
if (PINC.4==1) { 
d=d+1;         
     };
     }; 
if (d>v) { 
b6=1;         
     };
if (d<v) { 
b6=0;         
     };
d=0;
PORTC.3=0;
////////////////////////////// 7       
PORTC.3=1;
for (a=0;a<c;a++) {
if (PINC.4==1) { 
d=d+1;         
     };
     }; 
if (d>v) { 
b7=1;         
     };
if (d<v) { 
b7=0;         
     };
d=0;
PORTC.3=0;         
////////////////////////////// 8       
PORTC.3=1;
for (a=0;a<c;a++) {
if (PINC.4==1) { 
d=d+1;         
     };
     }; 
if (d>v) { 
b8=1;         
     };
if (d<v) { 
b8=0;         
     };
d=0;
PORTC.3=0;          
////////////////////////////// 9      
PORTC.3=1;
for (a=0;a<c;a++) {
if (PINC.4==1) { 
d=d+1;         
     };
     }; 
if (d>v) { 
b9=1;         
     };
if (d<v) { 
b9=0;         
     };
d=0;
PORTC.3=0;    
////////////////////////////// 10       
PORTC.3=1;
for (a=0;a<c;a++) {
if (PINC.4==1) { 
d=d+1;         
     };
     }; 
if (d>v) { 
b10=1;         
     };
if (d<v) { 
b10=0;         
     };
d=0;
PORTC.3=0;          
////////////////////////////// 11       
PORTC.3=1;
for (a=0;a<c;a++) {
if (PINC.4==1) { 
d=d+1;         
     };
     }; 
if (d>v) { 
b11=1;         
     };
if (d<v) { 
b11=0;         
     };
d=0;
PORTC.3=0;  
////////////////////////////// 12       
PORTC.3=1;
for (a=0;a<c;a++) {
if (PINC.4==1) { 
d=d+1;         
     };
     }; 
if (d>v) { 
b12=1;         
     };
if (d<v) { 
b12=0;         
     };
d=0;
PORTC.3=0;         
////////////////////////////// 13      
PORTC.3=1;
for (a=0;a<c;a++) {
if (PINC.4==1) { 
d=d+1;         
     };
     }; 
if (d>v) { 
b13=1;         
     };
if (d<v) { 
b13=0;         
     };
d=0;
PORTC.3=0;     
////////////////////////////// 14      
PORTC.3=1;
for (a=0;a<c;a++) {
if (PINC.4==1) { 
d=d+1;         
     };
     }; 
if (d>v) { 
b14=1;         
     };
if (d<v) { 
b14=0;         
     };
d=0;
PORTC.3=0;        
////////////////////////////// 15       
PORTC.3=1;
for (a=0;a<c;a++) {
if (PINC.4==1) { 
d=d+1;         
     };
     }; 
if (d>v) { 
b15=1;         
     };
if (d<v) { 
b15=0;         
     };
d=0;
PORTC.3=0;
////////////////////////////// 16       
PORTC.3=1;
for (a=0;a<c;a++) {
if (PINC.4==1) { 
d=d+1;         
     };
     }; 
if (d>v) { 
b16=1;         
     };
if (d<v) { 
b16=0;         
     };
d=0;
PORTC.3=0;
////////////////////////////// 17      
PORTC.3=1;
for (a=0;a<c;a++) {
if (PINC.4==1) { 
d=d+1;         
     };
     }; 
if (d>v) { 
b17=1;         
     };
if (d<v) { 
b17=0;         
     };
d=0;
PORTC.3=0;    
////////////////////////////// 18      
PORTC.3=1;
for (a=0;a<c;a++) {
if (PINC.4==1) { 
d=d+1;         
     };
     }; 
if (d>v) { 
b18=1;         
     };
if (d<v) { 
b18=0;         
     };
d=0;
PORTC.3=0;          
////////////////////////////// 19       
PORTC.3=1;
for (a=0;a<c;a++) {
if (PINC.4==1) { 
d=d+1;         
     };
     }; 
if (d>v) { 
b19=1;         
     };
if (d<v) { 
b19=0;         
     };
d=0;
PORTC.3=0;
////////////////////////////// 20       
PORTC.3=1;
for (a=0;a<c;a++) {
if (PINC.4==1) { 
d=d+1;         
     };
     }; 
if (d>v) { 
b20=1;         
     };
if (d<v) { 
b20=0;         
     };
d=0;
PORTC.3=0;
////////////////////////////// 21       
PORTC.3=1;
for (a=0;a<c;a++) {
if (PINC.4==1) { 
d=d+1;         
     };
     }; 
if (d>v) { 
b21=1;         
     };
if (d<v) { 
b21=0;         
     };
d=0;
PORTC.3=0;
////////////////////////////// 22       
PORTC.3=1;
for (a=0;a<c;a++) {
if (PINC.4==1) { 
d=d+1;         
     };
     }; 
if (d>v) { 
b22=1;         
     };
if (d<v) { 
b22=0;         
     };
d=0;
PORTC.3=0;
////////////////////////////// 23       
PORTC.3=1;
for (a=0;a<c;a++) {
if (PINC.4==1) { 
d=d+1;         
     };
     }; 
if (d>v) { 
b23=1;         
     };
if (d<v) { 
b23=0;         
     };
d=0;
PORTC.3=0;
////////////////////////////// 24       
PORTC.3=1;
for (a=0;a<c;a++) {
if (PINC.4==1) { 
d=d+1;         
     };
     }; 
if (d>v) { 
b24=1;         
     };
if (d<v) { 
b24=0;         
     };
d=0;
PORTC.3=0;
////////////////////////////// 25       
PORTC.3=1;
for (a=0;a<c;a++) {
if (PINC.4==1) { 
d=d+1;         
     };
     }; 
if (d>v) { 
b25=1;         
     };
if (d<v) { 
b25=0;         
     };
d=0;
PORTC.3=0;
////////////////////////////// 26       
PORTC.3=1;
for (a=0;a<c;a++) {
if (PINC.4==1) { 
d=d+1;         
     };
     }; 
if (d>v) { 
b26=1;         
     };
if (d<v) { 
b26=0;         
     };
d=0;
PORTC.3=0;
////////////////////////////// 27       
PORTC.3=1;
for (a=0;a<c;a++) {
if (PINC.4==1) { 
d=d+1;         
     };
     }; 
if (d>v) { 
b27=1;         
     };
if (d<v) { 
b27=0;         
     };
d=0;
PORTC.3=0;
////////////////////////////// 28       
PORTC.3=1;
for (a=0;a<c;a++) {
if (PINC.4==1) { 
d=d+1;         
     };
     }; 
if (d>v) { 
b28=1;         
     };
if (d<v) { 
b28=0;         
     };
d=0;
PORTC.3=0;
////////////////////////////// 29       
PORTC.3=1;
for (a=0;a<c;a++) {
if (PINC.4==1) { 
d=d+1;         
     };
     }; 
if (d>v) { 
b29=1;         
     };
if (d<v) { 
b29=0;         
     };
d=0;
PORTC.3=0;
////////////////////////////// 30 - стоп бит  "1"     
PORTC.3=1;
for (a=0;a<c;a++) {
if (PINC.4==1) { 
d=d+1;         
     };
     }; 
if (d>v) { 
b30=1;         
     };
if (d<v) { 
b30=0;         
     };
d=0;
PORTC.3=0;
/////////////////////////////////////////////////////////////////////////////////////////////  
/////////////////////////////////// приём АЦП 1-TX. 
if (b1==1&&b2==0&&b3==1&&b4==0&&b5==1&&b16==1&&b17==0&&b18==1&&b19==0&&b6!=b20&&b7!=b21&&b8!=b22&&b9!=b23&&b10!=b24&&b11!=b25&&b12!=b26&&b13!=b27&&b14!=b28&&b15!=b29&&b30==1) {      
PORTC.2=1; 
k1=0;
//////////////// запись  АЦП 1-TX.
e=b6|(b8<<1)|(b10<<2)|(b12<<3)|(b14<<4);   //  АЦП - 00000000...00011111 - 31 дел
goto mesto_1;
}
////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////// приём  ШИМ 1 
if (b1==1&&b2==1&&b3==0&&b4==1&&b5==0&&b16==0&&b17==1&&b18==0&&b19==1&&b6!=b20&&b7!=b21&&b8!=b22&&b9!=b23&&b10!=b24&&b11!=b25&&b12!=b26&&b13!=b27&&b14!=b28&&b15!=b29&&b30==1) {      
PORTC.2=1;
//////////////// запись  ШИМ 1-TX.
q=b6|(b8<<1)|(b10<<2)|(b12<<3)|(b14<<4);   //  ШИМ - 00000000...00001111 - +/- 15 дел
//////////////////////////////////////////// вкл. ШИМ 1    
if (q>0b00010001) {    // 10010...11111 - выход - 13 дел 
PORTD.7=0;   
PORTD.6=1;             // > вперёд
OCR1AL=q-0b00010000;;  // скважность 00000010...00001111 - 13 дел > вперёд
DDRB.1=1;              // вкл. ШИМ 1
}              
if (q==0b00010001) {   // 10001 - 1 дел
PORTD.6=0;
PORTD.7=0;             // == стоп
DDRB.1=0;              // выкл. ШИМ 1
}
if (q==0b00010000) {   // 10000 - 1 дел
PORTD.6=0;
PORTD.7=0;             // == стоп
DDRB.1=0;              // выкл. ШИМ 1
}
if (q==0b00001111) {   // 01111 - 1 дел
PORTD.6=0;
PORTD.7=0;             // == стоп
DDRB.1=0;              // выкл. ШИМ 1
}
if (q==0b00001110) {   // 01110 - 1 дел
PORTD.6=0;
PORTD.7=0;             // == стоп
DDRB.1=0;              // выкл. ШИМ 1
}
if (q<0b00001110) {    // 01101...000000 
PORTD.6=0;             // 00010...001111 - выход - 13 дел
PORTD.7=1;             // < назад
OCR1AL=0b000001111-q;  // скважность 00000010...00001111 - 13 дел < назад
DDRB.1=1;              // вкл. ШИМ 1
}                 
goto mesto_1;
} 
////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////// приём кнопка 1    
//      1      1      0      1      1      0      0      1      0       1       0       1       0       1       0       1       1       0       1       1       0       1       0       1       1       0       0       1       0       1
if (b1==1&&b2==1&&b3==0&&b4==1&&b5==1&&b6==0&&b7==0&&b8==1&&b9==0&&b10==1&&b11==0&&b12==1&&b13==0&&b14==1&&b15==0&&b16==1&&b17==1&&b18==0&&b19==1&&b20==1&&b21==0&&b22==1&&b23==0&&b24==1&&b25==1&&b26==0&&b27==0&&b28==1&&b29==0&&b30==1) { 
PORTC.2=1;
 PORTD.0=1;     // вкл.(фары)
goto mesto_1;
}
/////////////////////////////////// приём кнопка 2   
//      1      1      0      1      0      0      1      1      0       1       1       0       1       0       0       1       0       1       0       1       0       1       0       1       0       0       1       1       0       1
if (b1==1&&b2==1&&b3==0&&b4==1&&b5==0&&b6==0&&b7==1&&b8==1&&b9==0&&b10==1&&b11==1&&b12==0&&b13==1&&b14==0&&b15==0&&b16==1&&b17==0&&b18==1&&b19==0&&b20==1&&b21==0&&b22==1&&b23==0&&b24==1&&b25==0&&b26==0&&b27==1&&b28==1&&b29==0&&b30==1) {      
PORTC.2=1;
 PORTD.0=0;     // выкл.(фары) 
goto mesto_1;
}    
/////////////////////////////////// приём кнопка 3      
//      1      1      1      0      1      0      1      0      1       0       0       1       0       1       0       1       1       0       0       1       0       1       0       1       1       0       0       1       0       1
if (b1==1&&b2==1&&b3==1&&b4==0&&b5==1&&b6==0&&b7==1&&b8==0&&b9==1&&b10==0&&b11==0&&b12==1&&b13==0&&b14==1&&b15==0&&b16==1&&b17==1&&b18==0&&b19==0&&b20==1&&b21==0&&b22==1&&b23==0&&b24==1&&b25==1&&b26==0&&b27==0&&b28==1&&b29==0&&b30==1) { 
PORTC.2=1;
 h=1;          // вкл. (мигалка - сирена) 
goto mesto_1;
}
/////////////////////////////////// приём кнопка 4    
//      1      1      0      0      1      1      0      1      1       0       1       0       1       0       1       0       0       1       1       0       0       1       1       0       1       0       1       1       0       1
if (b1==1&&b2==1&&b3==0&&b4==0&&b5==1&&b6==1&&b7==0&&b8==1&&b9==1&&b10==0&&b11==1&&b12==0&&b13==1&&b14==0&&b15==1&&b16==0&&b17==0&&b18==1&&b19==1&&b20==0&&b21==0&&b22==1&&b23==1&&b24==0&&b25==1&&b26==0&&b27==1&&b28==1&&b29==0&&b30==1) {      
PORTC.2=1;
 h=0;         // выкл. (мигалка - сирена)
goto mesto_1;
}    
//////////////////////////////////////////////////////////////////////////////////////////////   
goto mesto_1;
}

