با سلام خدمت دوستان و اساتید گرامی
در برنامه ای نیاز به فشردن یک کلید می باشد که چون ولتاژ پشت کلید 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; } }
دیدگاه