ผมต่อวงรทำงานในรถยนต์
ใช้ PORTB.F0 เป็น interrupt เพื่อสลับสถานะการทำงานจาก 1 ไป 2
+มีปํญหาคือ
-เวลาเปลี่ยนเกียร์ Auto จาก // P (จอด) ไปที่ D (ขับ) interrupt ทำใมถึงทำงาน ทั้งที่ไม่ได้ต่อสัญญานจากเกียร์
-ถ้ากด ลดกระจกไฟฟ้าลง บางปุ่มของ สวิทย์ จะมีผลกับ interrupt
รบกวนขอคำชี้แนะด้วยครับ
**
// 16F877 , PORT ,RB1 ,RB2 ,RB3 ,RB4, RB7 NOT USE
/////// UPDATE 23/11/2011 //////////////
/////// UPDATE 10/12/2011 //////////////
/////// UPDATE 31/12/2011 //////////////
/////// UPDATE 27/01/2012 //////////////
/////// UPDATE 31/01/2012 //////////////
/////// UPDATE 4/02/2012 sat //////////////
/////// UPDATE 11/02/2012 sat //////////////
/*
SWITCHING VERSION CONTROL
*/
#define tick1 PORTB.F2 //LM358-1 Tip31-1
#define push_sw PORTB.F4 //LM358-1 Tip31-2 SWITCHING SELECTOR
#define reg2 PORTB.F1 //Tip31-3 750W GAS
#define beep1 PORTC.F2 //BC548 BUZZER 12V
#define Dis PORTC.F3 //DISPLAY CONTROL
char y=0,t1=1,le,i4=1;
char timming_cut=15,timming_cut2,lled;
char *B="PE RUN",*G="G RUN-T OFF",*BG="G RUN-T ON";
////////////////////////////////////////////////////////////////////////////////
void push_sw1()
{
push_sw=1; delay_ms(200);
push_sw=0;delay_ms(22);
}
void beep0()
{
beep1=1;
delay_ms(10);
beep1=0;
delay_ms(5);
}
void beep4() //
{
beep1=1;
delay_ms(200);
beep1=0;
delay_ms(5);
}
////////////////////////////////////////////////////////////////////////////////
void beep()
{ int x=0;
Dis=0;
for(x=0;x<3;x++)
{
beep1=1;
delay_ms(80);
beep1=0;
delay_ms(80);
Dis=1;
}
}
/////////////////////////
void interrupt()
{
i4++; beep1=1;
if(i4>2){i4=1;}
delay_ms(500);
beep1=0;
INTCON.INTF= 0;
}
/////////////////////
void delay_1sec()
{
delay_ms(1000);
}
void led_read()//ตรวจสอบการกระพริบของ LED จากข้างนอก
{ unsigned long int ls1,ls2,ls3,ls4,
ls5,ls6,lsp;
ls1=Adc_Read(4); // LED ON/OFF
delay_ms(333);
ls2=Adc_Read(4); // LED ON/OFF
delay_ms(333);
ls3=Adc_Read(4); // LED ON/OFF
delay_ms(333);
ls4=Adc_Read(4); // LED ON/OFF
lsp=ls1+ls2+ls3+ls4;
if(lsp<=10){ le=0;}
else if(lsp>=4000){le=1;}
else {le=2;}
}
void swit_to_pet()
{ led_read();
if(le==1){ push_sw1();}
else if(le==2){ push_sw1(); push_sw1();}
else{beep1=1;delay_ms(50);beep1=0;}
}
void cut_system()
{
if(t1>=3&&t1<timming_cut)//15 min
{
lled=Adc_Read(4);
{
if(lled==0){tick1=1;}
else{tick1=0;}
}
Lcd_Cmd(LCD_Clear);Lcd_Out(2,1,G);
delay_1sec();
}
else if(t1==timming_cut-1){Lcd_Cmd(LCD_Clear);Lcd_Out(2,3,B); tick1=1;beep4();
}
else{
beep0();
tick1=1;
Lcd_Cmd(LCD_Clear);
Lcd_Out(2,5,B);
delay_1sec();
}
}
void Engin_check()
{
unsigned long int Engine;
Engine=Adc_Read(2);
if (Engine>=511)// 2.5 v
{ delay_1sec();
Lcd_Cmd(LCD_Clear);
Lcd_Out(1,4,"ENGINE HEAT");
tick1=1; delay_1sec(); delay_1sec();
beep();
t1=1;
}
else{beep1=0;}
}
void power_on()
{
tick1=1;
Dis=1;
Lcd_Init(&PORTD);
Lcd_Cmd(LCD_Clear);
Lcd_Cmd(lcd_cursor_off);
Lcd_Out(2,5,"POWER ON");
beep();
delay_ms(500);
beep1=1;
delay_ms(400);
beep1=0;
}
void main()
{////block Main
TRISA=0XFF;
TRISB=0x01;
TRISC=0X00;
TRISD=0X00;
TRISE=0X07;
PORTB=0X00;
PORTC=0X00;
PORTD=0X00;
PORTE=0X00;
power_on();
swit_to_pet();
Lcd_Out(1,4,"AUTO READY");
delay_1sec();
INTCON.INTF=0; // Clear Interrupt flag before use
INTCON.INTE=1; // Enable interrupt from INT/RB0 Pin
// INTCON.T0IF=0;// Clear Interrupt flag before use
// INTCON.T0IE=1;// Enable interrupt from TMR0 Pin
INTCON.GIE=1; // Enable Global interrupt
while(1)
{
{
while(i4==2)
{
tick1=1; Lcd_Cmd(LCD_Clear);
Lcd_Out(1,1,"AUTO SWITCH RUN");
Lcd_Out(2,3,"T ON"); delay_1sec();
Engin_check();
}
timming_cut2=timming_cut+1;
y++;
Engin_check();
cut_system();// LOOP 3 SEC
if(y==60){t1++;}
{ if(y<=50) { reg2=1;} // if Y < 50 SEC ON Supply Voltege
else if(y>60){y=0;} // Wait for Y > 60 SEC OFF Supply Voltege
else{reg2=0;}
}
if(t1==timming_cut) {t1++; tick1=1;beep4(); push_sw1(); }
if(t1==2) {t1++; beep4(); push_sw1(); beep4(); push_sw1(); }
if(t1==timming_cut2) {t1=1; }
}
}
}