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);
}
}
}

}

}

}


 

Leave a Reply

avatar
  Prenumeruoti  
Pranešti apie