#include <tiny13.h>
#include <delay.h>
//определили биты для данной переменной 0b100000
#define ADC_VREF_TYPE 0x20
unsigned char Y;
int L0,R0,L1,R1;
//функция,переменная - номер канала, аргумент десятичный или бинарный
unsigned char read_adc(unsigned char adc_input)
{
// сравниваем и дописываем adc_input в незанятые биты
ADMUX=(adc_input | (ADC_VREF_TYPE & 0xff));
// Delay needed for the stabilization of the ADC input voltage
delay_us(10);
// добавляет в регистры 0b1000000 - ADSC запускает преобразование
ADCSRA|=0x40;
// пока не станет из ADCSRA ADIF=1 продолжается, просто задержка, до срабатывания флага выполнения преобразования
while ((ADCSRA & 0x10)==0);
//кажется пишем в бит завершения преобразования,ADIF=1, 0x10=0b10000, раньше проверяли, должен ставиться автоматом?Хз зачем
ADCSRA|=0x10;
//возвращает старшие (при выравнивании влево) 8 битов числа с ацп
return ADCH;
}
void main(void)
{
//Data Direction Register сконфигурировали PB0,PB1,PB4,PB5 как выходы, остальные как входы контакты порта B
DDRB = 0b110011;
//выставляет начально выравнивание влево, питание внешнее Vcc
ADMUX=((ADC_VREF_TYPE) & (0xff));
//выствляет 0b10000101, включение ацп и делитель частоты, одиночное преобразование,без запроса на прерывание
ADCSRA=0x87;
//параметр чувствительности
Y=15;
while(1){ //этот цикл будет выполняться бесконечно
PORTB.5=1;
delay_us(50);
R1=read_adc(1);
L1=read_adc(3);
PORTB.5=0;
delay_us(50);
R0=read_adc(1);
L0=read_adc(3);
//условие поездки прямо, отражение за вычетом фона
if ((((L1-L0)-(R1-R0))<=(((R1-R0)+(L1-L0))/(Y*2)))&&(((R1-R0)-(L1-L0))<=(((R1-R0)+(L1-L0))/(Y*2)))){
PORTB.0=0;
PORTB.1=0;
PORTB.4=1;
delay_ms(1);
};
//условие поездки вправо, отражение за вычетом фона
if ((((L1-L0)-(R1-R0))>0)&&(((L1-L0)-(R1-R0))>(((R1-R0)+(L1-L0))/(Y*2)))) {
PORTB.0=0;
PORTB.1=1;
PORTB.4=0;
delay_ms(1);
};
//условие поездки влево, отражение за вычетом фона
if ((((R1-R0)-(L1-L0))>0)&&(((R1-R0)-(L1-L0))>(((R1-R0)+(L1-L0))/(Y*2)))) {
PORTB.0=1;
PORTB.1=0;
PORTB.4=0;
delay_ms(1);
};
}
}


