Ford mustang 05-14m. „europinimo“ dalykėliai

Iš kart pradėsiu nuo džiūgesio, kurį man sukėlė vaizdas gavus „plikas“  PCB iš kinų, taip, pačiam jas gaminti pasidarė per sunku, tiek vargo, tiek laiko atžvilgiu.

20180908_113200
Naujosios PCB

 

 

Grįžtant prie pagrindinės minties, gal geriau pradėsiu nuo to kas yra „europinimas“, čia tiems kas nežino.

Europinimas-tai amerikietiškų ar angliškų automobilių perdarymas ar modifikavimas siekiant pritikyti automobilį mūsų ar kitos, dažniausiai ES šalių rinkoms.

Šiuo atveju kalba eina apie amerikietiškus automobilius, kadangi jų perdarymas kur kas paprastesnis negu angliškų automobilių.

Na, jau kad tuščiažodžiauju- tai niekas ko gero nepaprieštaraus.

Taigi, amerikietiški automobiliai dažniausiai gale neturi mums įprastų oranžinių posūkių, kadangi pas juos šie būna kartu stabdžių ir arba su gabaritų šviesomis, savaime aišku, raudonos spalvos. Taip pat jei automobilis turi „Xenoninius“ žibintus šie neturi apiplovimo. Na ir t.t. ir pan.

Rūtuliojant kalbą link to,jog pagaminti valdikliai, kuriems buvo gamintos PCB yra skirti konkrečiai priešrūkinėms, stabdžių-posūkių šviesoms.

Viso kaip supratote yra 2 valdikliai:

20180908_113732
Priešrūkinių, bei galinių šviesų valdikliai (PCB)

 

 

1.  Priešrūkinių šviesų: Jo funkcija įjungti ir išjungti galines priešrūkines šviesas. Jis valdomas su nefiksuojamu jungikliu. Vos kartą paspaudus jungiklį valdiklio išėjime signalas fiksuojamas (fiksuoto jungiklio veikimas)- užsidega priešrūkinės šviesos. Paspaudus antrą kartą šviesos išjungiamos. Valdiklis sudarytas iš mikrovaldiklio, kuris veikia kaip skaitmeninis filtras ir išmanaus P kanalo lauko tranzistoriaus, kuris nebūtų išmanus, jei neturėtų galybės apsaugų: nuo trumpo jungimo, perkrovos, temperatūros ir t.t.

20180914_140739
Priešrūkinių šviesų valdikliai (sulituoti)

 

2. Stabdžių- Posūkių valdiklis. Jis konstrukciniu atžvilgiu paprastesnis- ji taip pat sudaro išmanieji lauko tranzistoriai, kuriuos valdo jau automobilio posūkių, stabžių signalai ir kadangi šis valdiklis skirtas specialiai Ford mustang automobiliui, valdiklis taip pat turi specializuotus diagnostinius išvadus.

20180914_145456
Stabdžių- posūkių valdikliai (sulituoti)

 

Na, o iki galutinio varianto buvo nueitas nemažas kelias, išbandytas ne vienas variantas, daugiausiai vargo būta su priešrūkinių šviesų valdikliu. Konstrukciniu atžvilgiu viso jų teko pagaminti su lm555, d tipo flip flop ir t.t. Teoriškai visi ankstesni variantai veikdavo įdealiomis sąlygomis (pvz. maitinimas nuo lab. maitinimo šaltinio), tačiau problemos atsirasdavo, kai valdikiiai būdavo sumontuojami į automobilius, o ten  „išlysdavo“ ylos iš maišų. Kiek pamenu valdiklis su 555 įsijungdavo ar išsijungdavo kone nuo bet kokio trikdžio.  O su flip flop atsirasdavo problemos nuo greito junginėjimo, kiti valdikliai net „nenukialavo“ iki automobilių.


Senosios valdiklių versijos:

Išskleisti:
20180423_001626
555 valdiklis

 

20180423_001613
555 valdiklio prototipas

 

20180423_115131
Pgamintas 555 veikiantis valdiklis

 

20180603_212831
Pirmasis veikiantis galinių šviesų valdiklis

 

20180606_212449
Ganėtiniai sėkmingas D tipo flipflop valdiklis

 

20180606_214506
flipflop valdiklis

 

20180606_214456
Flip flop valdiklio schema

 

20180710_194808
Nepagamintas kitokio tipo flipflop valdiklis

 

20180710_210503
Pirmoji veikiančių valdiklių PCB pora

 

20180721_142650
Berots flipflop valdiklis su įėjimo signalo stabilizavimu (nepamenu ar veikė ira ar buvo pagaminta)

 

20180721_142708
flip flop su įėjimo signalo stabilizavimu schema v1

 

20180808_011807
flip flop valdiklis su įėjimo signalo stabilizavimu v2

 

20180808_011843
Net nebepanu su kuom šis valdiklis 😀

 

 

Paprastas, tačiau „sunkus“ valdiklis

Tai štai esmė paprasta – yra jungiklis, nefiksuojams ir jam reikalingas valdiklis, jog jo laikinas paspaudimas būtų konvertuojamas į fiksuotą signalą, kitaip tariant, omenyje turiu – priešrūkinių šviesų jungiklį.  Teoriškai esant tobuloms sąlygomis tai neatrodo ganėtinai sudėtinga, tačiau keblumų kelia ne kas kita, o tai, jog priešrūkinis jungiklis naudojamas ne kur nors prie labaratorinio maitinimo šaltinio, o automobiliuose, kur kone visur pilna trikdžių.

Žinoma šį valdiklį galima realizuoti panaudojant 4 rėles ir 2 diodus:

 

latched_on_off_output_with_momentary_pulse
Rėlinė logika

Viskas gal ir būtų neblogai, tačiau rėlės užima vietos , bei taipogi „klaksi“.

Kitų metodų realizuoti tokį valdiklį yra ganėtinai nemažai , tarkime naudojant 555 timerį, P ir N lauko tranzistorių, logines mikroschemas, mikrovaldiklį ir t.t.

Grubiai tariant jų išbandžiau nemažai ir priėjau išvados, jog geriausiai veikia 1 bito skaitliukas.

 

1_bit_logika
1-bit skaitliukas

 

Čia kaip pavyzdį paėmiau seną prototipinę schemą (trūksta maitinimo diodo) ,  tam , kad būtų daugiau paveiksliukų tekste 😀 .

Na, gal geriau pakalbėsiu apie neveikiančias schemas ir jų neveikimo priežastys.

Kone pati pirmoji schema buvo su lm555 arba ne555 ir t.t. mikroschema. Ji ko puikiausiai veikė, kai jį maitinama būdavo nuo laboratorinio maitinimo šaltinio . Tačiau įdėjus i automobilį pradžioje išlindo toks reikalas, jog jis labai jautriai reaguodavo tai į posūkių signalus ar šiaip į kažką – atsitiktinai įsijungdavo ar išsijungdavo (kalba eina, kai automobilis užvestas) , žinoma tokią problemą išspresdavo diodas ir didelės talpos kondensatorius, na bet tai jau vadinu „chaltūra“.

Taip pat buvau pasigaminęs vieną valdiklį su N ir P lauko tranzistoriais tikslai koks buvo nepamenu, gal irf7319…. Šis bandymas iki automobilio nenukeliavo, kadangi vos tik gavęs maitinimą jo išėjime atsirasdavo +12V, tuomet būtų reikėję papildomai naudoti kažką signalo invertavimui, vėliau pridėti dar vieną tranzistorių signalo stiprinimui ir t.t.

3-iasis bandymas, net nebuvo pagamintas , nes tai jau būtų buvę per daug- norėjau panaudoti mikrovaldiklį, nors schemą ir suprojektavau, jos net kaip ir sakiau, net negaminau.

Galiausiai nusprendžiau panaudoti D tipo flipflop ‘ą – rezultatas geras , tačiau jam reikalinga 5V maitinimas ir būtent dėl to schemoje atsiranda įtampos stabilizatorius. Na bet tai vieni juokai.  Šis variantas jau buvo išbandytas su automobiliais ir jis vis dar tobulinamas.  Paskutiniame variante naudojamos 1g74 , mic5205 mikroschemos, o signalą stiprina išmanusis bts 441 P kanalo lauko tranzistorius.

paskutine_versija
Vėliausiosios valdiklio versijos 3D vaizdas

Žinoma buvo planų bandyti gaminti schemą su pastūmos registrais , bet planai liko planais , jei jau rastas optimaliausias variantas.

Trūksta tik papraščiausio dalyko!

Tai štai, po kurio laiko, kuomet atsirado laisvesnio laiko, nusprendžiau grįžti atgal prie WS212 Led šviesos diodų. Optimizavau programą, bei patobūlinau įgūdžius lituojant 0402 standarto varžytes ir kondensatorius.

20180708_194045
Sulituota bandomoji plokštė
ws212_schema
Scema

Viskas gavosi gana neblogai,   kas susiję su mikrovaldikliu veikia nepriekaištingai, tačiau šiesos diodams buvo pasirinktas per „slabnas“ maitinimo stabilizatorius.  Nors pagal jo  aprašymą, šį keitiklį galima apkrauti iki 3A srove, tačiau, jo generuojamoje įtampoje trikdžiai atsiranda jau ir prie 250mA apkrovos. Tuo metu apytiksli trikdžių amplitudė siekia iki maždaug 900mV , ko pasekoje į tai reaguoja tiek mirovaldiklis tiek ir patys šviesos diodai.

Na, o kas svarbiausia, tai, jog schema buvo išbandyta ir ji veikia. Ateitčiai šį mp1584 led draiverį mėginsiu pakeisti į  tps40200.

Kelių sekundžių video (programos kodo nėra)

Ir pabaigai šiek tiek optimizuota programa, tačiau ji tai pat tstinė. Kitaip, tariant čia sau pačiam špargalkė.

Išskleisti

/*
* begantys posukiai.c
*
* Created: 2018.07.07 18:30:48
* Author : Saulius Stasys
*/

#define F_CPU 16000000
#define slide 15 // laiko intervalas šliaužimui

#include <util/delay.h>
#include <avr/io.h>

void on (void)
{
//ON
PORTB=0<<PB1; //
asm(„nop“);asm(„nop“);asm(„nop“);asm(„nop“);asm(„nop“);asm(„nop“);asm(„nop“);asm(„nop“);asm(„nop“);asm(„nop“);asm(„nop“);asm(„nop“);asm(„nop“);asm(„nop“);asm(„nop“);//apie 0,7uS
PORTB=1<<PB1;
asm(„nop“);asm(„nop“); //apie 0,6uS
}

void off (void)
{
//OFF
PORTB=0<<PB1; //
asm(„nop“);asm(„nop“);asm(„nop“);asm(„nop“);asm(„nop“);asm(„nop“);asm(„nop“);asm(„nop“);asm(„nop“);//apie 0,35uS
PORTB=1<<PB1;
asm(„nop“);asm(„nop“);asm(„nop“);asm(„nop“); //apie 0,8uS
}

void rgb (uint8_t r, uint8_t z, uint8_t m)
{
// 8 bitų spalvų kodų generavimui, kiekvienai spalvai
for (uint8_t j=0;j<3;j++) //3 k. kartojimas zaliai raudonai ir melynai
{
uint8_t a=0, d=128,t=1;
if (j==0) a=z;
if (j==1) a=r;
if (j==2) a=m;

for(uint8_t i=0;i<8;i++) // 8 bitų skaidymas
{
if (a-(d/t)>=0) // konkrečios reikšmės vertimas į dvejetainį kodą
{
a-=(d/t); // jei 1 tai platus signalas
on();
}
else off(); // jei ne siauras
t=t*2; // kintamasis matiekai
}
}

}

void simple (uint8_t r, uint8_t z, uint8_t m, uint8_t sk)
{
//paprastas ledu uzdegimas
for (uint8_t i=0; i<sk; i++)rgb(r,z,m);
_delay_us(50);
}

void snake(uint8_t r,uint8_t z, uint8_t m, uint8_t sk)
{
for (uint8_t i=0;i<sk+1;i++)
{
//gyvate
for (uint8_t o=0;o<i;o++)rgb(r,z,m); _delay_ms(slide);

}
}

int main(void)
{

DDRB=1<<DDB1|0<<DDB2;

while(1)

{
//testas
if(PINB&(1<<DDB2))snake(25,9,0,24); // spalva ir kiek ledų
else simple(5,5,5,24);
}

}


LED posūkių tarpinis progamos variantas

Tobulinant  LED posūkių programą pamaniau būtų neblogai išsisaugoti tarpinį variantą. Tarpiniu variantu vadinu todėl, jog dabar programoje prikūriau įvairių funkcijų LED šviesos diodų uždegimui (dar mąstau apie kelias papildomas), o pačių posūkių valdymo funkcijos kaip dar ir neparašiau, na bet jau su turimomis funkcijomis tai nebus padaryti sunku. O kol kas pati programa:


Programos kodas:
/*
* WS2812B.c
*
* Created: 2017.09.30 17:25:58
* Author : Saulius Stasys
*/

// laiko intervalų nustatymai
#define F_CPU 8000000

#define LED 10 //LED skaičius

#define T0 0.35// laiko intervalas 1
#define T1 0.9//laiko0 intervalas 2

#define slide 30 // laiko intervalas šliaužimui

//išeinantys signalai
#define OUTPORT PORTB //LED valdymo portas
#define OUTDR DDRB

#define OUTDDR PB3 //Kairės pusės LED valdymo kontaktas
#define OUTDDR1 PB4 //Dešinės pusės LED valdymo kontaktas

//Įeinantys signalai
#define INDDR DDRB //Valdymo registras
#define INPIN PINB

#define INLIDDR DDB0 //Ilgų kontaktas
#define INLDDR DDB1 //Kairio posūkio kontaktas
#define INRDDR DDB2 //Dešinio posūkio

#include <util/delay.h>
#include <avr/io.h>
#include <avr/eeprom.h>

//signalų generavimo funkcija
void rgb(uint8_t r,uint8_t z, uint8_t m, uint8_t as )
{
//zalia spalva
//8bit
uint8_t ch;
for (uint8_t h=0;h<3;h++) { if(h==0) ch=z; if(h==1) ch=r; if(h==2) ch=m; //8bit if (ch-128>0)
{
ch-=128;
OUTPORT=1<<as;
_delay_us(T1);
OUTPORT=0<<as;
_delay_us(T0);
}
else
{
OUTPORT=1<<as;
_delay_us(T0);
OUTPORT=0<<as;
_delay_us(T1);
}

//7bit
if((ch-64<128)&&(ch>63))
{
ch-=64;
OUTPORT=1<<as;
_delay_us(T1);
OUTPORT=0<<as;
_delay_us(T0);
}
else
{
OUTPORT=1<<as;
_delay_us(T0);
OUTPORT=0<<as;
_delay_us(T1);
}

//6bit
if((ch-32<64)&&(ch>31))
{
ch-=32;
OUTPORT=1<<as;
_delay_us(T1);
OUTPORT=0<<as;
_delay_us(T0);
}
else
{
OUTPORT=1<<as;
_delay_us(T0);
OUTPORT=0<<as;
_delay_us(T1);
}

//5bit
if((ch-16<32)&&(ch>15))
{
ch-=16;
OUTPORT=1<<as;
_delay_us(T1);
OUTPORT=0<<as;
_delay_us(T0);
}
else
{
OUTPORT=1<<as;
_delay_us(T0);
OUTPORT=0<<as;
_delay_us(T1);
}

//4bit
if((ch-8<16)&&(ch>7))
{
ch-=8;
OUTPORT=1<<as;
_delay_us(T1);
OUTPORT=0<<as;
_delay_us(T0);
}
else
{
OUTPORT=1<<as;
_delay_us(T0);
OUTPORT=0<<as;
_delay_us(T1);
}

//3bit
if((ch-4<8)&&(ch>3))
{
ch-=4;
OUTPORT=1<<as;
_delay_us(T1);
OUTPORT=0<<as;
_delay_us(T0);
}
else
{
OUTPORT=1<<as;
_delay_us(T0);
OUTPORT=0<<as;
_delay_us(T1);
}

//2bit
if((ch-2<4)&&(ch>1))
{
ch-=2;
OUTPORT=1<<as;
_delay_us(T1);
OUTPORT=0<<as;
_delay_us(T0);
}
else
{
OUTPORT=1<<as;
_delay_us(T0);
OUTPORT=0<<as;
_delay_us(T1);
}

//1bit
if(ch==1)
{
ch-=1;
OUTPORT=1<<as;
_delay_us(T1);
OUTPORT=0<<as;
_delay_us(T0);
}
else
{
OUTPORT=1<<as;
_delay_us(T0);
OUTPORT=0<<as;
_delay_us(T1);
}
}

}

void fixrgb(uint8_t r,uint8_t z, uint8_t m, uint8_t sk, uint8_t as)
{
for (uint8_t i=0;i<sk;i++)rgb(r,z,m,as);
_delay_us(200);
}

void fromto(uint8_t r,uint8_t z, uint8_t m, uint8_t sk, uint8_t sk2, uint8_t as)
{
for (uint8_t i=0;i<sk;i++)rgb(0,0,0,as);
for (uint8_t i=sk;i<sk2;i++)rgb(r,z,m,as);
_delay_us(50);
}

void snake(uint8_t r,uint8_t z, uint8_t m, uint8_t sk, uint8_t as)
{
for (uint8_t i=0;i<sk;i++)
{
for (uint8_t o=0;o<i;o++)rgb(r,z,m,as); _delay_ms(slide); } } void revsnake(uint8_t r,uint8_t z, uint8_t m, uint8_t r1,uint8_t z1, uint8_t m1, uint8_t sk, uint8_t as) { for (uint8_t i=sk;i>0;i–)
{
for (uint8_t o=0;o<i;o++)rgb(r,z,m,as);
for (uint8_t o=0;o<sk-i;o++)rgb(r1,z1,m1,as);
_delay_ms(slide);
}
}

 

void slidebar(uint8_t r,uint8_t z, uint8_t m, uint8_t r1,uint8_t z1, uint8_t m1, uint8_t sk2, uint8_t sk, uint8_t as)
{
for (uint8_t i=0;i<sk;i++)
{
if (i<sk2)for (uint8_t o=0;o<i;o++)rgb(r,z,m,as);
else
{
for (uint8_t o=0;o<i-sk2;o++)rgb(r1,z1,m1,as);
for (uint8_t o=i-sk2;o<i;o++)rgb(r,z,m,as);
}
_delay_ms(slide);
}
for (uint8_t i=sk-sk2;i<sk;i++)
{
for (uint8_t o=0;o<i;o++)rgb(r1,z1,m1,as);
_delay_ms(slide);
}

}

int main(void)
{
_delay_ms(200);
if(INDDR==OUTDR)INDDR=0<<INLIDDR|0<<INLDDR|0<<INRDDR|1<<OUTDDR|1<<OUTDDR1;
else
{
INDDR=0<<INLIDDR|0<<INLDDR|0<<INRDDR;
OUTDR=1<<OUTDDR|1<<OUTDDR1;
}

uint8_t a=0,b=0,c=0,k=0,p=0,kr=0;

p=eeprom_read_byte(0);

while (1)
{

/*
fromto(1,0,0,40,50,OUTDDR);
//_delay_ms(100);
fromto(0,1,0,0,40,OUTDDR);
//_delay_ms(100);*/
/*
fromto(1,0,0,0,3,OUTDDR);
_delay_ms(100);*/

//fromto(0,1,0,0,60,OUTDDR);
//slidebar(0,0,1,1,0,0,50,60,OUTDDR);

snake(25,9,0,10,OUTDDR);
revsnake(25,9,0,25,14,6,10,OUTDDR);

}

}


LED posūkių schemos ir PCB projektavimas

Taigi,  kol esu užsidegęs šiuo projektu jis sparčiai stumiasi į priekį. Šiandien (2017-10-04), pasibraižiau numanomą schemą LED valdymui.

Šioje schemoje pagrindinis komponentas yra Attiny25 QFN korpuse (4x4mm) – šio mikrovaldiklio litavimas bus dar vienas iššūkis. Attiny 25 valdymo signalus gaus iš ilgųjų šviesų, abiejų pusių posūkių. Kadangi valdymo signalai galimai gali tūrėti trukdžių, o taip pat jų įtampa yra kur kas aukštesnė negu 5V, be to dar ir kinta nuo 12 iki 14.5V (grubiai tariant), todėl šie signalai bus perduodami be tiesioginio ryšio mikrovaldikliui panaudojant PC817 optoporas. Taip pat, kadangi mikrovaldiklis bus prilituotas prie PCB jam papildomai schemoje suprojektavau ir programavimo jungtį.

Schema bus maitinama per rėlę, kurią valdys gabaritinės šviesos.  Įtampą lygins LM338 5A įtampos stabilizatorius su keliais kondensatoriais prišais ir už jo. Kadangi schema dar tik teorinė ir neišbandyta realiomis sąlygomis, ateityje ji gali kiek keistis.

Jungtys kairėje iš viršaus į apačia: maitinimo, gabaritų, ir bendra ilgųjų su posūkiais.

Jungtis per vidurį skirta mikrovaldiklio programavimui.

Jungtys dešinėje: LED juostų valdymo jungtys.

Taip pat 3D ir PCB vaizdai:

Numanomi PCB matmenys 50x45mm

 

Automobilio posūkiai

Kažkada kilo įdėja pagaminti LED posūkius, kurie ne mirksėtų, o bėgtų eilute. Tuomet parašiau šiokią tokią programą ir viską pamiršau. Na ir visai neseniai prisiminiau visą šį reikalą ir pamaniau, jog būtų neblogai jį pabaigti. Pačioje pradžioje mąsčiau jog LED valdiklio širdis bus ATTINY2313 mikrovaldiklis, tačiau kiek patobulinęs programą pastebėjau, jog viskam pakaks Attiny25, žinoma, jei ateityje dar tobulinsiu šio mikrovaldiklio nepakaks dėl išvadų trūkumo.Siekis yra pagaminti LED posūkius valdomus per bluetooth sąsają. Na o kol kas senas pirmosios programos rezultatas (deje programos kodo nebėra, jis jau perdarytas 100 kartų :D)

Na, o kadangi šiame video pats rašiau subtitrus, tai klaidų gali pasitaikyti (Man su kalbomis niekad nesisekė).
Kur baigiau, tiesa po šiokio tokio patobulinimo net jau pagaminau pcb ir jai dėžutę. Taip pat naujieji posūkiai buvo ištobulinti ant automobilio- pastebėtos klaidos, bugai ir visokie kitokie error. Kitaip tariant po Alfa testavimo nusiųstas tolimiasniam tobulinimui ir galbūt sulaukęs Beta testavimo veiks nepriekaištingai.
Kol kas čia „Alfa“ programa (tobulintina, be bluetooth sąsajos) Led posūkiai turi 2 rėžimus perjungiamus ilgosiomis šviesomis- smulkiau programos komentaruose.


Programa
/*
* WS2812B.c
*
* Created: 2017.09.30 17:25:58
* Author : Saulius Stasys
*/

// laiko intervalų nustatymai
#define F_CPU 8000000

#define LED 60 //LED skaičius

#define T0 0.35// laiko intervalas 1
#define T1 0.9//laiko0 intervalas 2
#define slide 5 // laiko intervalas šliaužimui

//išeinantys signalai
#define OUTPORT PORTB //LED valdymo portas
#define OUTDR DDRB

#define OUTDDR PB3 //Kairės pusės LED valdymo kontaktas
#define OUTDDR1 PB4 //Dešinės pusės LED valdymo kontaktas

//Įeinantys signalai
#define INDDR DDRB //Valdymo registras
#define INPIN PINB

#define INLIDDR DDB0 //Ilgų kontaktas
#define INLDDR DDB1 //Kairio posūkio kontaktas
#define INRDDR DDB2 //Dešinio posūkio

#include <util/delay.h>
#include <avr/io.h>
#include <avr/eeprom.h>

//signalų generavimo funkcija
void grb(uint8_t z,uint8_t r, uint8_t m,uint8_t as )
{
//zalia spalva
//8bit
uint8_t ch;

for (uint8_t h=0;h<3;h++) { if(h==0) ch=z; if(h==1) ch=r; if(h==2) ch=m; //8bit if (ch-128>=0)
{
ch-=128;
OUTPORT=1<<as;
_delay_us(T1);
OUTPORT=0<<as;
_delay_us(T0);
}
else
{
OUTPORT=1<<as;
_delay_us(T0);
OUTPORT=0<<as;
_delay_us(T1);
}

//7bit
if((ch-64<128)&&(ch>63))
{
ch-=64;
OUTPORT=1<<as;
_delay_us(T1);
OUTPORT=0<<as;
_delay_us(T0);
}
else
{
OUTPORT=1<<as;
_delay_us(T0);
OUTPORT=0<<as;
_delay_us(T1);
}

//6bit
if((ch-32<64)&&(ch>31))
{
ch-=32;
OUTPORT=1<<as;
_delay_us(T1);
OUTPORT=0<<as;
_delay_us(T0);
}
else
{
OUTPORT=1<<as;
_delay_us(T0);
OUTPORT=0<<as;
_delay_us(T1);
}

//5bit
if((ch-16<32)&&(ch>15))
{
ch-=16;
OUTPORT=1<<as;
_delay_us(T1);
OUTPORT=0<<as;
_delay_us(T0);
}
else
{
OUTPORT=1<<as;
_delay_us(T0);
OUTPORT=0<<as;
_delay_us(T1);
}

//4bit
if((ch-8<16)&&(ch>7))
{
ch-=8;
OUTPORT=1<<as;
_delay_us(T1);
OUTPORT=0<<as;
_delay_us(T0);
}
else
{
OUTPORT=1<<as;
_delay_us(T0);
OUTPORT=0<<as;
_delay_us(T1);
}

//3bit
if((ch-4<8)&&(ch>3))
{
ch-=4;
OUTPORT=1<<as;
_delay_us(T1);
OUTPORT=0<<as;
_delay_us(T0);
}
else
{
OUTPORT=1<<as;
_delay_us(T0);
OUTPORT=0<<as;
_delay_us(T1);
}

//2bit
if((ch-2<4)&&(ch>1))
{
ch-=2;
OUTPORT=1<<as;
_delay_us(T1);
OUTPORT=0<<as;
_delay_us(T0);
}
else
{
OUTPORT=1<<as;
_delay_us(T0);
OUTPORT=0<<as;
_delay_us(T1);
}

//1bit
if(ch==1)
{
ch-=1;
OUTPORT=1<<as;
_delay_us(T1);
OUTPORT=0<<as;
_delay_us(T0);
}
else
{
OUTPORT=1<<as;
_delay_us(T0);
OUTPORT=0<<as;
_delay_us(T1);
}
}

}

int main(void)
{
if(INDDR==OUTDR)INDDR=0<<INLIDDR|0<<INLDDR|0<<INRDDR|1<<OUTDDR|1<<OUTDDR1;
else
{
INDDR=0<<INLIDDR|0<<INLDDR|0<<INRDDR;
OUTDR=1<<OUTDDR|1<<OUTDDR1;
}

uint8_t a=0,b=0,c=0,k=0,p=0,kr=0;

p=eeprom_read_byte(0);

while (1)
{

////////////////////////////////////////////////////LED posūkių įjungimas ir išjungimas//////////////////////////////////
_delay_ms(30);
if(INPIN&(1<<INLIDDR))// ilgų šviesų tikrinimas
{
k++;
if(k<255) //sumirksėtri per 7.65s (30ms*255)
{
if(c==0)a++; //tikriname ar buvo jungiklis išjungtas
}
else k=254;
c=1;
}
else c=0; // ilgų šviesų jungiklio išjungimas

if (a==3) // reikšmės tikrinimas eeprom atmintyje
{
if(p==0)eeprom_write_byte(0,1); // keičiam reikšmes
else eeprom_write_byte(0,0);
}

/////////////////////////////////////////////////////////REGITRINIS variantas- kuomet LED posūkiai išjungti (paprastas gabaritas)///////////////////////
if(p==0) // išjungta (regitrinis variantas)
{
/////////////////////////////////////////////////////////////PABAIGTI SU LED define!/////////////////////////////////////////

for(uint8_t o=0;o<45;o++)grb(0,0,0,OUTDDR);
for(uint8_t o=45;o<60;o++)grb(147,255,63,OUTDDR);
for(uint8_t o=0;o<45;o++)grb(0,0,0,OUTDDR1);
for(uint8_t o=45;o<60;o++)grb(147,255,63,OUTDDR1);

}

/////////////////////////////////////////////////////////LED posūkiai su gabaritu
else // įjungta (viskas veika)
{

/////////////////////////////////mirksejimas//////////////////////////////////neveikia prigesimas mirksint vienai lempai
if(INPIN&(1<<INLDDR))
{
if(INPIN&(1<<INRDDR))kr=3;
else kr=1;
}

else
{
if(INPIN&(1<<INRDDR))kr=2;
else kr=0;
}

if(INPIN&(1<<INLDDR)||INPIN&(1<<INRDDR))
{
b=0;
for (uint8_t i=0;i<LED;i++)
{
if(kr==1)for(uint8_t o=0;o<i;o++) grb(90,255,0,OUTDDR);
if(kr==2)for(uint8_t o=0;o<i;o++) grb(90,255,0,OUTDDR1);
if(kr==3||kr==0)
{
for(uint8_t o=0;o<i;o++) grb(90,255,0,OUTDDR);
for(uint8_t o=0;o<i;o++) grb(90,255,0,OUTDDR1);
}
_delay_ms(slide); //tarpams vinguriavimo greičiui
}
}

// kai posūkis užgęsta
else
{
b++;
if(b==5) //patikrinam kiek laiko užgesęs posūkis
{
// jei 5 ciklus paryškinam gabaritus
b=b-1;

for(uint8_t o=0;o<LED-1;o++)grb(197,255,143,OUTDDR);
for(uint8_t o=0;o<LED-1;o++)grb(197,255,143,OUTDDR1);
_delay_ms(slide);

}
// jei užgęses posūkis laikome prigesintus gabaritus
else
{
for (uint8_t i=0;i<LED;i++)
{
//

if(kr==1)for(uint8_t o=0;o<i;o++) grb(49,63,35,OUTDDR);
if(kr==2)for(uint8_t o=0;o<i;o++) grb(49,63,35,OUTDDR1);
if(kr==3||kr==0)
{
for(uint8_t o=0;o<i;o++) grb(49,63,35,OUTDDR);
for(uint8_t o=0;o<i;o++) grb(49,63,35,OUTDDR1);
}
_delay_ms(slide);
}
}
}

}

}

}