اسهل طريقة لبرمجة الـ Microcontroller


(eng.Eiad) #1

السلام عليكم و رحمة الله
كتبت هذا الموضوع منذ فترة قصيرة في ملتقى المهندسين العرب و اطرحه هنا لتعميم الفائدة

بعد تجربة طويلة مع المتحكمات و استخدام الاسمبلي في البداية ثم المحاولة مع C-compilers
و تعقيدات الـ C
توصلت لأسهل Compiler على ما اعتقد و هو MikroBasic او MikroPascal
هذا موقع الشركة للتنزيل :
http://www.mikroelektronika.co.yu/english/
و بوجود مكتبة واسعة للبرنامج من الاجراءات الجاهزة تصبح الامور بمنتهى السهولة

اجراءات البرنامج كما في الصورة تتضمن :
الاظهار على الـ LCD
و التحويل ADC
و الاتصال التسلسلي
تعديل عرض النبضة PWM
الDelays.
.
.

و الكثير … كما هو مبين يساركم

اذا كان هناك استفسارات سأحاول الاجابة قدر ما استطيع
و لا تنسونا من دعوة صالحة


(eng.Eiad) #2

و البرنامج ينزل مجاناً بفعالية كاملة
لكن الحد يكون في استخدام ذاكرة البرنامج
مثلا : pic16f84 الصغير لا يوجد حد لاستخدام ذاكرة البرنامج
أما pic16f877 الاكبر يمكن كتابة برنامج حتى 25% من ذاكرة البرنامج
طبعاً سيكون هذا البرنامج معقداً حتى يستهلك اكثر من 25% و خصوصاً حسابات لاعداد معقدة Real و هذا عن تجربة
بالنتيجة يمكنك كتابة تطبيقات رائعة دون الوصول للحد
و ان وجد احدكم الكراك فلا يبخل علينا


(mechanical) #3

مشكور يا باشا على المعلومات المفيدة فأنا مبرمج بيك جيد ابرمج بالسي والاسمبلي ولكن بعد قراءتي للكود الذي قمت بوضعه اخي تبين لي ان هذه اللغة اسهل من السي والاسمبلي شكرا جزيلا وانا طامح لتعلم هذه اللغة كي انافسك :stuck_out_tongue: :wink: :slight_smile:


(eng.Eiad) #4

اهلاً بك اخي mechanical


(eng.Eiad) #5

لاجراء تأخير في عمل المتحكم (المراوحة في المكان) و هو ما نحتاجه كثيراً
في الاسمبلي نحتاج لحلقة يدور فيها المايكرو حتى تحقق شرط كسرها
و تحتاج حتى لحسابات لحساب زمن التأخير
أما في MikroBasic فالاجراء جاهز
مثلاً : للتأخير بالميللي ثانية التعليمة Delay_ms
للتأخير بالميكرو ثانية التعليمة Delay_us
الخ
متبوعة بالرقم بين():eek:
سهل اليس كذلك…يتبع


(eng.Eiad) #6

كما في الشكل :

يتبع…


(eng.Eiad) #7


(eng.Eiad) #8

يمكن للسهولة . تعريف متحول word اي بايتين و ليكن temp_res مثلاً :
temp_res =Adc_Read(0) سحب القيمة من المحول من القناة 0 RA0
ss=(temp_res*(5000/1024)) الحساب للقيمة الحقيقية
حيث الجهد المرجعي 5 فولت = 5000 ميللي فولت
و 2^10=1024 عدد مستويات التكميم


(eng.Eiad) #9

سأتوقف عن الشرح … و سأحاول الاجابة على الأسئلة قدر ما أستطيع . إن وجدت أسئلة ؟


(anoos) #10

جزاك الله خيراً أخي الكريم

بعد أن وضعت هذا البرنامج وضغطت ( Build ) أعطاني الكومبايلر رسالة خطأ ولم يولد ملف الـ hex وأضاء السطر التالي بـ اللون الأحمر

Lcd8_Init (PORTB, PORTD(

مع أنه نفس البرنامج الموجود في الـ Help

البرنامج :

program Lcd8_default_test
dim text as char[20]

main:
TRISB = 0 ’ PORTB is output
TRISD = 0 ’ PORTD is output
Lcd8_Init(PORTB, PORTD) ’ Initialize LCD at PORTB and PORTD
Lcd8_Cmd(Lcd_CURSOR_OFF) ’ Turn off cursor
text = “mikroElektronika”
Lcd8_Out(1, 1, text) ’ Print text at LCD
end.

ما هي المشكلة ؟؟؟؟؟؟؟؟؟؟؟

(eng.Eiad) #11

أخي anoos بدل تعليمة Lcd8_Init بـ :
Lcd8_Config(PORTB,PORTD,0,1,2,6,5,4,3,7,1,2,0) مثلاً
التي شكلها العام :
Lcd8_Config(dim byref ctrlport, dataport as byte, dim RS, EN, WR, D7, D6, D5, D4, D3, D2, D1, D0 as byte)

اي تمكنك من اختيار ارقام الارجل بالتحديد
جربت نفس البرنامج بهذه التعليمة و عمل
و فعلاً مع التعليمة السابقة لم يعمل … على كل يفضل استخدام التعليمة config
لأنها تمكنك من التحكم بكيفية و ترتيب الارجل


(anoos) #12

جزاك الله خيراً أخي الكريم على الرد

هل من الممكن شرح كيفية استخدام الـ Keypad
قرأتها من الـ help ولكن هناك أشياء غامضة ووضعت البرنامج التالي ولكنه لم يعمل

main:
dim kp as byte
keypad_init(portc)

while kp = 0
kp = Keypad_Read
wend

Lcd_CONFIG(PORTD,3,2,1,0,PORTB,2,3,4)
Lcd_Cmd(LCD_CLEAR)
Lcd_Cmd(LCD_CURSOR_OFF)
Lcd_Out(1,1,“key:”)
Lcd_chr(2,5,kp)
end.


ما هي المشكلة ؟؟؟؟؟؟؟؟؟؟؟ جزاك الله خيراً

(eng.Eiad) #13

من اي ناحية لم يعمل أخي anoos جربته و عملتله بيلد و عمل
ام انك جربته على البروتوس و لم يعمل
على كل حال هناك ملاحظة :

في التعليمة الأخيرة ان اردت اظهار الرقم المضغوط فعليك تعديلها الى :
Lcd_chr(2,5,(kp+48))
أي بدل KP تضع (KP+48) لأنه بدون اشارات التنصيص يعتبر كرمز Ascii
و رموز الارقام تبدا من 48

من قائمة توولز في البيسك يوجد العديد من الادوات المساعدة و منها الـ Ascii chart

و اهلاً و سهلاً بك دائماً


(anoos) #14

جزاك الله خيراً أخي Error101 على الرد و أرجوا ألا أكون قد أثقلت عليك
أولاً بالنسبة للـ KEYPAD فقد اتضحت الأمور إن شاء الله
ولكن عندي سؤال آخر جزاك الله خيراً

[LEFT]Button – Debounce

Prototype
sub function Button(dim byref PORT as byte, dim Pin as byte, dim Time as byte, dim Astate as byte) as byte
Description
Function eliminates the influence of contact flickering due to the pressing of a button (debouncing).
Parameters <PORT> and <Pin> specify the location of the button; parameter <Time> represents the minimum time interval that pin must be in active state in order to return one; parameter <Astate> can be only zero or one, and it specifies if button is active on logical zero or logical one.
Example
if Button(PORTB, 0, 1, 1) then
flag = 255
end if

[/left]


وضعت البرنامج التالي وقمت بمحاكاته على Proteus ولكن الـليدات الموصولة على PORTB لم تتوهج


main:
trisb=0
trisa=1
portb=0
aa:
if button(porta,0,1,1)then
portb=255
end if
goto aa
end.

والبارامتر TIME عن ماذا يعبر وما هو عمله

جعل الله اجاباتك في ميزان حسناتك وضاعفها لك

المرفق برنامج المحاكاة

(eng.Eiad) #15

و لا يهمك أخي أنوس خود راحتك
بالنسبة للباراميتر time فهو تأخير زمني بسيط قبل قبول قيمة الزر و ذلك للتخلص من ظاهرة الـ Debouncing اي الاهتزاز في القيمة الذي يرافق التلامس الميكانيكي للزر
و بالنسبة للبرنامج سأجربه لاحقاً لأن الجهاز الذي أعمل عليه الان ليس جهازي و لا يحوي البرامج اللازمة
و الرد غداً ان شاء الله


(anoos) #16

وأنا انتظرك

جزاك الله خيراً


(eng.Eiad) #17

ان الخطأ الاساسي في البرنامج هو تناقضه مع الدارة التي تستعملها للمحاكاة
حيث فيها الحالة الفعالة هي حالة الصفر عند ضغط الزر و ليس الواحد
اذاً :
program test
main:
trisb=$00
trisa=$ff
portb=$00
While true
if button(porta,0,1,0)then
portb=$ff else portb=$00
end if
wend
end.

كما افضل انا شخصياً اسناد القيم بالـ النظام ست عشري (في البيسك مسبوقة بـ $)
او الثنائي (مسبوقة بـ %)
اما في برنامجك السابق فهي افتراضياً بالنظام العشري
اي في برنامجي هذا جعلت البورت B كله خرج
و البورت A كله دخل

فبرنامجك أخي أنوس صحيح …لكن اختيار حالة الزر الفعالة Active حسب رسمتك خطأ
program test
main:
trisb=0
trisa=1
portb=0
aa:
if button(porta,0,1,0)then
portb=255 else portb=0
end if
goto aa
end.

الان عند ضغط الزر تشعل الليد… وعند ازالة الضغط يطفئ


(anoos) #18

ألف شكر لك أخي Error101

ولكن لاتعتقد أنك خلصت مني

الآن بدأت بالمقاطعات وإذا عرض لي أي سؤال أو مشكلة فلن ترتاح مني

ألف شكر مرة أخرى

(eng.Eiad) #19

أهلاً و سهلاً أنوس
و ان شاء الله اقدر اساعدك… على حسب معرفتي
و انتظر منك تطلعنا على اول مشاريعك المبدعة باستخدام المايكروكنتروللر ان شاء الله


(anoos) #20

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

عدنا … أعزك الله

وآسف على ثقل دمي

* هل هناك أنواع محددة من شاشات الـ LCD تصلها بأربع بتات أي (D4,D5,D6,D7 )وشاشات أخرى يجب وصل الثمان بتات لكي تعمل ( D0 TO D8 ) أم أن أي نوع من الشاشات يمكن وصلها بـ 4 بتات أو 8 بتات وهل هناك مزايا عدا توفير الأرجل بالنسبة للوصل بأربع بتات والسرعة بالنسبة للوصل بثمان بتات .

* في حالة الوصل بثمان بتات كيف يمكنك الكتابة على السطر الثاني قمت بتجريب التعليمة

Lcd8_Out(2,1,“HELLO”)

ولكن للأسف لم تعمل مع أن تعليمة الكتابة على السطر الأول نجحت

سؤال خارج الموضوع ( بما أنك خبير PIC ) :
سمعت أننا نستطيع برمجة المايكرو ليقوم بتنفيذ أوامر صوتية أي تتكلم بمايكروفون موصول بالمايكرو وتقول له LED فيضيء الليد وتقول له MOTOR فيعمل الـمحرك وهكذا
وهل توجد IC تقوم بهذا العمل وهذا حل أفضل و أسهل

البرنامج :

main:
TRISB=0
TRISD=0
Lcd8_Init(PORTD,7,6,5,4,3,2,1,0,PORTB,0,1,2)
Lcd8_Cmd(LCD_CLEAR)
Lcd8_Cmd(LCD_CURSOR_OFF)
Lcd8_Out(2,1,“HELLO”)
end.