Programazioa
18F2550 PIC-a programatzeko software-a PIC C Compiller izenekoa da eta bertan C lenguaia erabiliz programatzen da. Azpian agertzen da guk erabilitako programa.
#include «D:\ECO SHELL\Firmware\Firm_V3\Eco-clutch.h»
int32 temp1=0, t1; //Buelta baten denbora
int32 temp2=0, t2; //Buelta baten denbora
int16 rpmMotor; //Abiadura RPM-tan MOTORRA
int16 rpmGurpil; //Abiadura RPM-tan GURPILA
float32 a=0; //Hortzetik hortzera dagoen denbora segunduetan, hau da t1-etik t2-ra
float32 b=0; //Hortzetik hortzera dagoen denbora segunduetan, hau da t3-etik t4-ra
float aux_rpm1=0; //Abiadura RPM-tan dezimalekin MOTORRA
float aux_rpm2=0; //Abiadura RPM-tan dezimalekin GURPILA
float aux_abiadura=0;
unsigned int16 Abiadura_be=0,Abiadura_za=0 ; //Abiadura berria eta abiadura zaharra
int8 dec, uni; //Dezenen display-a eta unitarioen display-a
void abiad_kalkulo(void);
void Belozimetroa(void);
#int_EXT
void GurpilBirak(void) //Gurpilaren biren kontagailuaren funtzioa
{
temp1=get_timer1(); //Buelta baten denbora jaso
set_timer1(0); //Timer1 Hasieratu, momentu honetan timer-a kontatzen hasiko da
}
#int_EXT2
void MotorBirak(void) //Motorraren biren kontagailuaren funtzioa
{
temp2=get_timer0(); //Buelta baten denbora
set_timer0(0); //Timer2 Hasieratu, momentu honetan timer-a kontatzen hasiko da
}
void Test(void) //Plaka elikatzean, display-ek ongi funtzionatzen dutela jakiteko funtzioa
{
int i;
for(i=0; i<3; i++) //Display-en segmentu guztiak piztu segundu erdi batez eta denak itzali beste segundu erdi batez. Hau hiru aldiz egingo dugu.
{
int test1 = 8; //Segmentu guztiak pizteko aldagaia
int test2 = 15; //Segmentu guztiak itzaltzeko aldagaia
output_A(test1);//A portutik unitarioko display-aren segmentu guztiak piztu
output_bit(PIN_B4,shift_right(&test1,1,0)); //B portuko 4. pinetik dezenen display-a piztu
output_bit(PIN_B5,shift_right(&test1,1,0)); //B portuko 5. pinetik dezenen display-a piztu
output_bit(PIN_B6,shift_right(&test1,1,0)); //B portuko 6. pinetik dezenen display-a piztu
output_bit(PIN_B7,shift_right(&test1,1,0)); //B portuko 7. pinetik dezenen display-a piztu
delay_ms(500); //Segundu erdiz segmentuak piztuta eduki
output_A(test2);//A portutik unitarioko display-aren segmentu guztiak itzali
output_bit(PIN_B4,shift_right(&test2,1,0));//B portuko 4. pinetik dezenen display-a itzali
output_bit(PIN_B5,shift_right(&test2,1,0));//B portuko 5. pinetik dezenen display-a itzali
output_bit(PIN_B6,shift_right(&test2,1,0));//B portuko 6. pinetik dezenen display-a itzali
output_bit(PIN_B7,shift_right(&test2,1,0));//B portuko 7. pinetik dezenen display-a itzali
delay_ms(500);//Segundu erdiz segmentuak itzalita eduki
}
}
void Belozimetroa(void) //Abiadura display-etan azaltzeko funtzioa
{
dec = Abiadura_be / 10; //Autoaren abiaduraren zenbaki dezena kalkulatu
uni = Abiadura_be % 10; //Autoaren abiaduraren zenbaki unitarioa kalkulatu
output_A(uni); //A portutik zenbaki unitarioa atera, modu binarioan
output_bit(PIN_B4,shift_right(&dec,1,0)); //B portuko 4. pinetik zenbaki dezena atera, binarioan
output_bit(PIN_B5,shift_right(&dec,1,0)); //B portuko 5. pinetik zenbaki dezena atera, binarioan
output_bit(PIN_B6,shift_right(&dec,1,0)); //B portuko 6. pinetik zenbaki dezena atera, binarioan
output_bit(PIN_B7,shift_right(&dec,1,0)); //B portuko 7. pinetik zenbaki dezena atera, binarioan
}
void abiad_kalkulo() //Gurpilaren biren arabera, autoaren abiadura kalkulatzeko funtzioa
{
t1=temp1*8;
b=((t1/1000.0)/1000.0); //Hortzetik hortzerako denbora microsegundutatik segundutara pasatu //3300uS = 0,0033s
aux_rpm2=60.0/b; //Bira kopurua minutuko RPM //60/0,2=300rpm
rpmGurpil=aux_rpm2; //Emaitzari koma kendu eta zenbaki oso bihurtu
aux_abiadura= rpmGurpil*0.075396; //Lortutako RPM-en emaitza, guk aurrez sortutako konstante batekin biderkatu (gurpilaren zirkunferentzia…)
Abiadura_be=aux_abiadura; //Emaitzari koma kendu eta zenbaki oso bihurtu
if( Abiadura_be!=Abiadura_za) //Abiadura berria eta abiadura zaharra desberdinak badira….
{
if (((Abiadura_be – Abiadura_za)<3)||((Abiadura_za – Abiadura_be)<3)) /* Abiadura berria eta zaharraren arteko aldea 3 km/h-ko baino txikiagoa bada…
{ //8 km/h-tik behera arazoak ematen dituenez, abiadura honetatik behera
//Display-ak zeroan jarriko ditugu*/
Belozimetroa(); //Abiadura display-etan azaldu
Abiadura_za=Abiadura_be; //Abiadura zaharrari abiadura berriaren aurreko denbora eman
}
/*else //Else honetan 8km/h baino mantsoago goanez, display-ak zeroan jarriko ditugu
{
Abiadura_za=Abiadura_be; //Abiadura zaharrari abiadura berriaren aurreko denbora eman
Abiadura_be=0; //Display-ak zeroan jartzeko, abiadura zeroan jarri
Belozimetroa(); //Abiadura display-etan azaldu, kasu honetan zero
}*/
}
//}
void main()
{
setup_adc_ports(NO_ANALOGS|VSS_VDD);
setup_adc(ADC_OFF);
setup_spi(SPI_SS_DISABLED);
setup_wdt(WDT_OFF);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_8);
setup_timer_1(T1_INTERNAL|T1_DIV_BY_8);
setup_timer_2(T2_DISABLED,0,1);
setup_timer_3(T3_DISABLED|T3_DIV_BY_1);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
enable_interrupts(INT_EXT);
enable_interrupts(INT_EXT2);
enable_interrupts(GLOBAL);
setup_oscillator(OSC_4MHZ|OSC_INTRC|OSC_31250|OSC_PLL_OFF);
Test();
Belozimetroa();
while(TRUE) // TODO: USER CODE!!
{
while(input(PIN_B1)==1) // Etengailua Manuala
{
output_high(PIN_C0);//Enbragea aktibatu
abiad_kalkulo();//Abiadura kalkulatu
printf(«Abiadura: %Lu Km/h.\n\r»,Abiadura_be);
}
while(input(PIN_B1)==0) // Etengailua automatikoa
{
if(input(PIN_C1)) //Itxaron rpmak 200tik pasa arte (Timerrak gaizki ez neurtzeko)
{
delay_ms(1000);
}
t2=temp2*8;
a=((t2/1000.0)/1000.0); //Hortzetik hortzera dagoen denbora microsegundutatik segundutara pasatu //3300uS = 0,0033s
aux_rpm1=60.0/a; //Bira kopurua minutuko RPM //60/0,2=300rpm
rpmMotor=aux_rpm1; //aux_rpm:float/rpm:int16
abiad_kalkulo();//Abiadura kalkulatu
if ((rpmMotor-rpmGurpil<15)||(rpmGurpil-rpmMotor<15)) // 15 aztertzekoa da
{
output_high(PIN_C0); //Enbragatu
}
else
{
output_low(PIN_C0); //Desenbragatu
}
if(input(PIN_B3))
{
output_low(PIN_C0); //Desenbragatu
// delay_ms(500);
}
printf(«Abiadura: %Lu K/h.\n\r»,Abiadura_be);
}
}
}
Proiektua osatzeko material eta artxibo guztiak HEMEN eta Tutoriala beheko bideoan.