قسم الميكروكنترولر والروبوت ودوائر الاتصال بالحاسب الالي قسم المتحكمات الـ microcontroller و المعالجات microprocessor و التحكم الرقمي بالكمبيوتر CNC والانظمة الآلية والروبوت Robots

أدوات الموضوع

Engr_Fahad
:: مهندس ::
تاريخ التسجيل: Feb 2017
المشاركات: 5
نشاط [ Engr_Fahad ]
قوة السمعة:0
قديم 19-02-2017, 03:07 PM المشاركة 1   
ha استفسار هام جدا بخصوص الـ interrupt مع الـLCD Twitter FaceBook Google+



السلام عليكم ورحمه الله وبركاته
اخواني الكرام انا عندي استفسار بخصوص المقاطعة اوinterrupt .... ولكن قبل ذلك اريد ان اعلمكم اني استخدم برنامج MikroC ولغة الـ C واستخدم المايكروكنترولر PIC16F1509 (او من الممكن PIC16F877A) .

اريد ان استخدم المقاطعه (interrupt) بحيث اذا ضغطت على زر (push button) معين يعرض لي (ON) على شاشه LCD 16x2 واذا لم اضغط شي يظهر (OFF)........ والمشكلة اني عندما اكتب
lcd_out(1,1,"ON");
يظهر لي خطأ يقول
18 365 Reentrancy is not allowed: function 'Lcd_Cmd' called from two threads __Lib_Lcd.c
وذلك لاني استخدمت الـLCD مرتين في الكود الاصلي وفي كود المقاطعة

اعتقد انه لابد من وجود حيلة او طريقه لتلافي هذه المشكله......... فأفيدوني و جزاكم الله خيرا

اعلانات

مشتاق الله
:: مهندس متميز ::
تاريخ التسجيل: Oct 2015
المشاركات: 620
نشاط [ مشتاق الله ]
قوة السمعة:0
قديم 19-02-2017, 06:22 PM المشاركة 2   
sun


السلام عليكم و رحمة الله و بركاته

لو رفعت البرنامج سيكون اسهل فى المساعدة , و لكن ببساطة عرف متغير مثلا button_flag = 0;o
ثم بداخل انتربت اجعله button_flag = 1;
ثم ضع اختبار if فى البرنامج لطباعة الشاشة بناءا على قيمة المتغير

و الله ولى التوفيق


اعلانات اضافية ( قم بتسجيل الدخول لاخفائها )
  

Engr_Fahad
:: مهندس ::
تاريخ التسجيل: Feb 2017
المشاركات: 5
نشاط [ Engr_Fahad ]
قوة السمعة:0
قديم 19-02-2017, 07:56 PM المشاركة 3   
افتراضي


السلام عليكم و رحمة الله و بركاته

لو رفعت البرنامج سيكون اسهل فى المساعدة , و لكن ببساطة عرف متغير مثلا button_flag = 0;o
ثم بداخل انتربت اجعله button_flag = 1;
ثم ضع اختبار if فى البرنامج لطباعة الشاشة بناءا على قيمة المتغير

و الله ولى التوفيق

جزاك الله خير اخي مشتاق الله على الرد
ولكن من الاساس لو اني ادخلت اي كود يخص الـ LCD في الانتربت يظهر لي نفس الخطأ
وهذه صوره للخطا


ولو افترضنا اني احذف الكود الذي يخص الـ LCD من الانتربت فراح يشتغل الكود تمام وهذه صوره توضح ما اقصد


وهذا الكود كاملا :


والله يعطيكم العافية


مشتاق الله
:: مهندس متميز ::
تاريخ التسجيل: Oct 2015
المشاركات: 620
نشاط [ مشتاق الله ]
قوة السمعة:0
قديم 19-02-2017, 08:17 PM المشاركة 4   
sun


السلام عليكم و رحمة الله و بركاته
اخى العزيز فهد ارفع الكود copy paste وليس صورة


Engr_Fahad
:: مهندس ::
تاريخ التسجيل: Feb 2017
المشاركات: 5
نشاط [ Engr_Fahad ]
قوة السمعة:0
قديم 19-02-2017, 10:11 PM المشاركة 5   
افتراضي


السلام عليكم و رحمة الله و بركاته
اخى العزيز فهد ارفع الكود copy paste وليس صورة
هذا الكود كوبي باست


//////////////LCD pinout setting
sbit LCD_RS at RC0_bit;
sbit LCD_EN at RA1_bit;
sbit LCD_D4 at RC2_bit;
sbit LCD_D5 at RC4_bit;
sbit LCD_D6 at RC6_bit;
sbit LCD_D7 at RC7_bit;
//////////////LCD pinout direction
sbit LCD_RS_Direction at TRISC0_bit;
sbit LCD_EN_Direction at TRISA1_bit;
sbit LCD_D4_Direction at TRISC2_bit;
sbit LCD_D5_Direction at TRISC4_bit;
sbit LCD_D6_Direction at TRISC6_bit;
sbit LCD_D7_Direction at TRISC7_bit;
////////////////////////////////////////

#define LED porta.f4
#define push_button porta.f2

#define LED_dir trisa.f4
#define push_button_dir trisa.f2

#define input 1
#define output 0
#define is ==
#define pressed 0

char txt1[] = "ON";
char txt2[] = "OFF";

void interrupt ()
{
lcd_cmd(_lcd_clear);
INTCON.GIE=0;
if(INTCON.INTF){
if(push_button is pressed)LED=1;
lcd_out(2,4,"ON"); // ON
}

INTCON.INTF=0;
INTCON.GIE=1;
}


void main()
{
ANSELA=0; //disable Analog feature
ANSELB=0;
ANSELC=0;
OSCCON=0b01101000; //USING INTERNAL OSCILLATOR WITH FREQUANCY OF 4MHz
ADCON1=0x07; //disable ADC feature
INTCON.GIE=1; //Enable the Global Interrupt
INTCON.INTE=1;

push_button_dir=input;
LED_dir=output;
LED=0;
lcd_Init();
lcd_cmd(_LCD_CURSOR_OFF);
lcd_cmd(_lcd_clear);

while(1)
{
if(push_button is 1){
LED=0;
lcd_out(2,4,txt2); // OFF
delay_ms(250);
}
}
}


مشتاق الله
:: مهندس متميز ::
تاريخ التسجيل: Oct 2015
المشاركات: 620
نشاط [ مشتاق الله ]
قوة السمعة:0
قديم 20-02-2017, 05:02 AM المشاركة 6   
sun


السلام عليكم و رحمة الله و بركاته


بفضل الله اليك بعض التعديلات البسيطة
كود:
  
//////////////LCD pinout setting
sbit LCD_RS at RC0_bit;
sbit LCD_EN at RA1_bit;
sbit LCD_D4 at RC2_bit;
sbit LCD_D5 at RC4_bit;
sbit LCD_D6 at RC6_bit;
sbit LCD_D7 at RC7_bit;
//////////////LCD pinout direction
sbit LCD_RS_Direction at TRISC0_bit;
sbit LCD_EN_Direction at TRISA1_bit;
sbit LCD_D4_Direction at TRISC2_bit;
sbit LCD_D5_Direction at TRISC4_bit;
sbit LCD_D6_Direction at TRISC6_bit;
sbit LCD_D7_Direction at TRISC7_bit;
////////////////////////////////////////

#define LED porta.f4
#define push_button porta.f2

#define LED_dir trisa.f4
#define push_button_dir trisa.f2

#define input 1
#define output 0
#define is ==
#define pressed 0
#define notpressed 1

char txt1[] = "ON";
char txt2[] = "OFF";
char button_flag =1;

void interrupt ()
{
INTCON.GIE=0;
if(INTCON.INTF){
   if(push_button is pressed){
      LED=1;
      button_flag = pressed;
   }
}

INTCON.INTF=0;
INTCON.GIE=1;
}

void main()
{
ANSELA=0; //disable Analog feature
ANSELB=0;
ANSELC=0;
OSCCON=0b01101000; //USING INTERNAL OSCILLATOR WITH FREQUANCY OF 4MHz
ADCON1=0x07; //disable ADC feature
INTCON.GIE=1; //Enable the Global Interrupt
INTCON.INTE=1;

push_button_dir=input;
LED_dir=output;
LED=0;
lcd_Init();
lcd_cmd(_LCD_CURSOR_OFF);
lcd_cmd(_lcd_clear);

    while(1)
    {
        if(push_button is 1){
           LED=0;
           lcd_cmd(_lcd_clear);
           lcd_out(2,4,txt2); // OFF
           delay_ms(250);
           button_flag = notpressed;
        }
        else if (button_flag == pressed){
           lcd_cmd(_lcd_clear);
           lcd_out(2,4,"ON"); // ON
        }
    }
}
و ما توفيقى الا بالله





Engr_Fahad
:: مهندس ::
تاريخ التسجيل: Feb 2017
المشاركات: 5
نشاط [ Engr_Fahad ]
قوة السمعة:0
قديم 20-02-2017, 09:24 PM المشاركة 7   
افتراضي


السلام عليكم و رحمة الله و بركاته


بفضل الله اليك بعض التعديلات البسيطة
كود:
  
//////////////LCD pinout setting
sbit LCD_RS at RC0_bit;
sbit LCD_EN at RA1_bit;
sbit LCD_D4 at RC2_bit;
sbit LCD_D5 at RC4_bit;
sbit LCD_D6 at RC6_bit;
sbit LCD_D7 at RC7_bit;
//////////////LCD pinout direction
sbit LCD_RS_Direction at TRISC0_bit;
sbit LCD_EN_Direction at TRISA1_bit;
sbit LCD_D4_Direction at TRISC2_bit;
sbit LCD_D5_Direction at TRISC4_bit;
sbit LCD_D6_Direction at TRISC6_bit;
sbit LCD_D7_Direction at TRISC7_bit;
////////////////////////////////////////

#define LED porta.f4
#define push_button porta.f2

#define LED_dir trisa.f4
#define push_button_dir trisa.f2

#define input 1
#define output 0
#define is ==
#define pressed 0
#define notpressed 1

char txt1[] = "ON";
char txt2[] = "OFF";
char button_flag =1;

void interrupt ()
{
INTCON.GIE=0;
if(INTCON.INTF){
   if(push_button is pressed){
      LED=1;
      button_flag = pressed;
   }
}

INTCON.INTF=0;
INTCON.GIE=1;
}

void main()
{
ANSELA=0; //disable Analog feature
ANSELB=0;
ANSELC=0;
OSCCON=0b01101000; //USING INTERNAL OSCILLATOR WITH FREQUANCY OF 4MHz
ADCON1=0x07; //disable ADC feature
INTCON.GIE=1; //Enable the Global Interrupt
INTCON.INTE=1;

push_button_dir=input;
LED_dir=output;
LED=0;
lcd_Init();
lcd_cmd(_LCD_CURSOR_OFF);
lcd_cmd(_lcd_clear);

    while(1)
    {
        if(push_button is 1){
           LED=0;
           lcd_cmd(_lcd_clear);
           lcd_out(2,4,txt2); // OFF
           delay_ms(250);
           button_flag = notpressed;
        }
        else if (button_flag == pressed){
           lcd_cmd(_lcd_clear);
           lcd_out(2,4,"ON"); // ON
        }
    }
}
و ما توفيقى الا بالله



مشكور يا اخي مشتاق الله و لكن مع الاسف لم تنجح الطريقه .... لم يعرض في الشاشه ON عندما يضغط الزر


Engr_Fahad
:: مهندس ::
تاريخ التسجيل: Feb 2017
المشاركات: 5
نشاط [ Engr_Fahad ]
قوة السمعة:0
قديم 20-02-2017, 11:10 PM المشاركة 8   
افتراضي


مشكور يا اخي مشتاق الله و لكن مع الاسف لم تنجح الطريقه .... لم يعرض في الشاشه ON عندما يضغط الزر
اخي مشتاق الله ابشرك الطريقه نجحت بعد تعديل بسيط على كودك كالاتي

كود:
else if (button_flag == !pressed){
           lcd_cmd(_lcd_clear);
           lcd_out(1,4,txt1); // ON
           delay_ms(250);
        }
وجزاك الله خير و انا سعيد جدا لاني طرحت مشكلتي على هذا المنتدى الرائع وحلت بفضل الله ثم بفضلك

إضافة رد

العلامات المرجعية

«     الموضوع السابق       الموضوع التالي    »
أدوات الموضوع

الانتقال السريع إلى


الساعة معتمدة بتوقيت جرينتش +3 الساعة الآن: 01:35 AM
موقع القرية الالكترونية غير مسؤول عن أي اتفاق تجاري أو تعاوني بين الأعضاء
فعلى كل شخص تحمل مسئولية نفسه إتجاه مايقوم به من بيع وشراء وإتفاق وأعطاء معلومات موقعه
التعليقات المنشورة لا تعبر عن رأي موقع القرية الالكترونية ولايتحمل الموقع أي مسؤولية قانونية حيال ذلك (ويتحمل كاتبها مسؤولية النشر)

Powered by vBulletin® Version 3.8.6, Copyright ©2000 - 2025