Долгого вступительного слова не будет в общем есть скутер, хотелось приложить к нему руку. Тем более ещё где то года полтора назад я его полностью разобрал выкинул всю проводку положил свою, внёс некоторые изменения заменой всех ламп не светодиоды, вместо галогеновой фары - ксенон. После этого мелькнула мысль что это неплохой потенциал для дальнейшей модернизации. Суть устройства это исполнение основных и дополнительных функций. Так как я в программировании новичок поэтому текст программы не идеал далеко. Для упрошенный установки и избавления возни с проводкой все входные и выходные сигналы от датчиком тормозов, повороты, переключения света фары (дальний - ближний), стопы и кнопки запуска двигателя идут на контроллер а он там сам разруливает всю работу. Что на этот момент делает программа: - при включении проходит так сказать проверка всей осветительной аппаратуры что есть на борту. - При переключении клавиши поворотов соответственно мигают повороты сопровождая звуковым сигналом. Родное реле выкинул так как с установленными светодиодами оно не работает. - При нажатии на любой из тормозов и кнопки запуска срабатывает реле стартера. (для зашиты от случайного включения стартера при работающем двигателе) - При включении ближнего света и нажатии на кнопку запуска отключается питания электронного коммутатора по средствам реле. Это сделано с той целью что если просто повернуть ключ для включения осветительных приборов (габаритов или аварийки), коммутатор жрёт чуть больше ампера, с такой нагрузкой аккумулятор долго не протянет. Включение и выключение так же сопровождается звуковым сигналом. - Ну и на последок добавил несколько световых эффектов для красоты. Выбор осуществляется включением любого поворота и нажатием на кнопку запуска. Основные минусу с которыми я пока не могу побороть: - временные задержки при выполнении любых действий, то-есть например если включить поворот и нажать на тормоз то стоп загорится лишь когда закончится обработка хотя бы одного мерцания, у меня в худшем случае это 0,25 секунды, а на дороге этого может быть достаточно для неприятностей. - при выключении и включении коммутатора, если держать кнопку он будет включатся и выключатся что неприемлемо. Надо одно нажатие и происходит смена состояния на обратное не зависимо от времени нажатия, в общем думаю понятно. Писал в CodeVisionAVR, камень Mega8 частота 8 мегагерц(просто он есть в наличии) Проверяю в Proteuse версии 7.7. [hide] #include <mega8.h> #include <delay.h> int time = 100; int razi = 2; int time_2 = 250; char i=0; char a; void main(void) { DDRB.1=0; //вход DDRB.2=0; DDRB.3=0; DDRB.4=0; DDRC.0=0; DDRC.1=0; DDRB.0=1; // выход DDRB.7=1; DDRB.6=1; DDRD.7=1; DDRD.6=1; DDRD.5=1; DDRD.4=1; DDRD.3=1; DDRD.2=1; DDRD.0=1; PORTB.0=0; PORTB.1=0; PORTB.2=0; PORTB.3=0; PORTB.4=0; PORTC.0=0; PORTC.1=0; PORTD.2=0; PORTD.0=0; while (1) { while (razi==2) { PORTD.0=1; PORTB.7=1; // программа тестирования световых приборов delay_ms (time); PORTD.7=1; delay_ms (time); PORTD.5=1; delay_ms (time); PORTB.6=1; delay_ms (time); PORTD.3=1; delay_ms (time); PORTD.4=1; delay_ms (time); PORTB.7=0; delay_ms (time); PORTD.7=0; delay_ms (time); PORTD.5=0; delay_ms (time); PORTB.6=0; delay_ms (time); PORTD.3=0; delay_ms (time); PORTD.4=0; PORTD.0=0; razi=razi-1; } // цыкл запуска двигателя PORTB.0=(PINB.1|PINB.2)&PINC.1; //Стоп PORTD.3=PINB.1|PINB.2; //повороты if (PINB.3==1 & i==0) //левый { delay_ms (time_2); PORTB.7=1; PORTD.4=1; PORTD.0=1; delay_ms (time_2); PORTB.7=0; PORTD.4=0; PORTD.0=0; } if (PINB.4==1 & i==0) //правый { delay_ms (time_2); PORTD.5=1; PORTB.6=1; PORTD.0=1; delay_ms (time_2); PORTB.6=0; PORTD.5=0; PORTD.0=0; } // Включение габаритов PORTD.7=PINC.0; //Выключение и включение комутатора if(PINC.1 & PINC.0) { PORTD.2=!PORTD.2; PORTD.0=1; delay_ms(200); PORTD.0=0; delay_ms(200); } //Эфекты if((PINB.3|PINB.4)&PINC.1) { i++; if(i>7) { i=0; } } if (i==1) { PORTD.5=1; PORTB.6=1; PORTB.7=1; PORTD.4=1; delay_ms(time_2); PORTD.5=0; PORTB.6=0; PORTB.7=0; PORTD.4=0; delay_ms(time_2); } if (i==2) { for (a = 0; a<4 ; a++) // Цикл мигание первого светодиода, 4 раза { PORTB.7=1; PORTD.4=1; //Включаем светодиод delay_ms(50); //Делаем задержку на 50 миллисекунд PORTB.7=0; PORTD.4=0; //Выключаем светодиод delay_ms(50); //Делаем задержку на 50 миллисекунд } delay_ms(200); // Задержка между мерцаниями, 200 мс for (a = 0; a<4 ; a++) // Мигание второго светодиода, 4 раза { PORTD.5=1; PORTB.6=1; //Включаем светодиод delay_ms(50); //Делаем задержку на 50 миллисекунд PORTD.5=0; PORTB.6=0; //Выключаем светодиод delay_ms(50); //Делаем задержку на 50 миллисекунд } delay_ms(200); // Задержка между мерцаниями, 200 мс } if (i==3) { for (a = 0; a<4 ; a++) // Цикл мигание первого светодиода, 4 раза { PORTB.7=1; PORTD.4=1; //Включаем светодиод delay_ms(50); //Делаем задержку на 50 миллисекунд PORTB.7=0; PORTD.4=0; //Выключаем светодиод delay_ms(50); //Делаем задержку на 50 миллисекунд PORTD.7=1; PORTD.3=1; } delay_ms(200); // Задержка между мерцаниями, 200 мс for (a = 0; a<4 ; a++) // Мигание второго светодиода, 4 раза { PORTD.5=1; PORTB.6=1; //Включаем светодиод delay_ms(50); //Делаем задержку на 50 миллисекунд PORTD.5=0; PORTB.6=0; //Выключаем светодиод delay_ms(50); //Делаем задержку на 50 миллисекунд } PORTD.7=0; PORTD.3=0; delay_ms(200); // Задержка между мерцаниями, 200 мс } if(i==4) { PORTB.7=1; PORTD.4=1; //Включаем светодиод delay_ms(time_2); //Делаем задержку на time_2 PORTB.7=0; PORTD.4=0; //Выключаем светодиод PORTD.5=1; PORTB.6=1; delay_ms(time_2); //Делаем задержку на time_2 PORTD.5=0; PORTB.6=0; } if(i==5) { PORTB.7=1; // По кругу как при старте delay_ms (time); PORTD.7=1; delay_ms (time); PORTD.5=1; delay_ms (time); PORTB.6=1; delay_ms (time); PORTD.3=1; delay_ms (time); PORTD.4=1; delay_ms (time); PORTB.7=0; delay_ms (time); PORTD.7=0; delay_ms (time); PORTD.5=0; delay_ms (time); PORTB.6=0; delay_ms (time); PORTD.3=0; delay_ms (time); PORTD.4=0; } if(i==6) { PORTB.7=1; // По кругу как при старте но 1 светодиодом delay_ms (time); PORTB.7=0; delay_ms (time); PORTD.7=1; delay_ms (time); PORTD.7=0; delay_ms (time); PORTD.5=1; delay_ms (time); PORTD.5=0; delay_ms (time); PORTB.6=1; delay_ms (time); PORTB.6=0; delay_ms (time); PORTD.3=1; delay_ms (time); PORTD.3=0; delay_ms (time); PORTD.4=1; delay_ms (time); PORTD.4=0; } if(i==7) { PORTB.7=1; // По кругу как при старте но 1 светодиодом ,без задержки delay_ms (time); PORTB.7=0; PORTD.7=1; delay_ms (time); PORTD.7=0; PORTD.5=1; delay_ms (time); PORTD.5=0; PORTB.6=1; delay_ms (time); PORTB.6=0; PORTD.3=1; delay_ms (time); PORTD.3=0; PORTD.4=1; delay_ms (time); PORTD.4=0; } } } [/hide]
|