با سلام خدمت دوستان و اساتید گرامی
در برنامه ای نیاز به فشردن یک کلید می باشد که چون ولتاژ پشت کلید 12 ولت است من توسط یک اپتوکوپلر آنرا به حدود 3 ولت رسانده (البته خوب حفاظت هم شده ) به یکی از پایه های میکرو دادم ( ATXmega128A1 ) روی Pin هفتم پورت F . که اینتراپت هم فعال نمودم و داره کار می کنه .
مشکل : مشکل اینجاست که زمانی که کلید را می فشارم گاهی اوقات روتین زیر برنامه مربوطه یکبار اجرا میشود و گاهی بیش از یکبار ( دو یا سه بار ) اجرا میشود . :eek:
به نظر می رسد وقتی وارد روتین اینتراپت هستم نیز اگر کلید فشرده شود یا در هنگام فشردن قطع و وصل شود پس از پایان روتین زیر برنامه ، مجددا آنرا اجرا می کند .
در حالی که من می خواهم حتی در صورتی که در حال اجرای روتین هست و کلید مجددا فشرده شد دیگر آن اینتراپت اجرا نشود و تکرار نشود . (در واقع در هر لحظه فقط یکبار )
خواستم با نوشتن شرط از این اتفاق جلوگیری کنم ولی بی فایده بود . لطفا راهنمایی فرمائید .
کد برنامه main برای تعریف اینتراپت
در تابع port setting این پین بصورتی ورودی تعریف شده است و با یک مقاومت آری 10 کیلو کل پورت pull down شده است .
کد اینتراپت
در برنامه ای نیاز به فشردن یک کلید می باشد که چون ولتاژ پشت کلید 12 ولت است من توسط یک اپتوکوپلر آنرا به حدود 3 ولت رسانده (البته خوب حفاظت هم شده ) به یکی از پایه های میکرو دادم ( ATXmega128A1 ) روی Pin هفتم پورت F . که اینتراپت هم فعال نمودم و داره کار می کنه .
مشکل : مشکل اینجاست که زمانی که کلید را می فشارم گاهی اوقات روتین زیر برنامه مربوطه یکبار اجرا میشود و گاهی بیش از یکبار ( دو یا سه بار ) اجرا میشود . :eek:
به نظر می رسد وقتی وارد روتین اینتراپت هستم نیز اگر کلید فشرده شود یا در هنگام فشردن قطع و وصل شود پس از پایان روتین زیر برنامه ، مجددا آنرا اجرا می کند .
در حالی که من می خواهم حتی در صورتی که در حال اجرای روتین هست و کلید مجددا فشرده شد دیگر آن اینتراپت اجرا نشود و تکرار نشود . (در واقع در هر لحظه فقط یکبار )
خواستم با نوشتن شرط از این اتفاق جلوگیری کنم ولی بی فایده بود . لطفا راهنمایی فرمائید .
کد برنامه main برای تعریف اینتراپت
کد:
int main(void)
{
system_clocks_init();
PortSetting();
TWI_Hard_init();
I2C_Init();
LCD.LCDinit();
LCD.LCDcursorOFF();
LoadSetting();
usarte0_init(); // Scale
// Interupt Enable
// External interrupt 0 on PC0, enable pullup, sence falling edge
PORTF.PIN7CTRL = PORT_ISC_RISING_gc;
PORTF.INT0MASK = PIN7_bm;
PORTF.INTCTRL = PORT_INT0LVL_LO_gc;
// Times Enable
TCC1_PER = 7811; // (F Crystal) 16.000.000 / (TC_CLKSEL_DIV256_gc) 16000000 / 1024 = 15625 (1s) / 2 = 7812 = 500 ms
TCC1_INTCTRLA = TC_ERRINTLVL_OFF_gc | TC_OVFINTLVL_LO_gc;
TCC1_CTRLA = TC_CLKSEL_DIV1024_gc;
PMIC_CTRL = PMIC_LOLVLEN_bm;
cli();
sei();
while(1)
{
if(Starter == 0)
{
Logo();
shart = 1;
Starter = 1;
ShowDateTime();
}
Ready();
}
return (0);
}
کد اینتراپت
کد:
ISR(PORTF_INT0_vect)
{
// SW Int
if(ShartInterrupt)
{
ShartInterrupt = false;
LED_2_ON;
KeyPress();
LED_2_Off;
ShartInterrupt = true;
}
}









دیدگاه