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

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

الصورة الرمزية bound2u
bound2u
:: مهندس ::
تاريخ التسجيل: Nov 2012
المشاركات: 15
نشاط [ bound2u ]
قوة السمعة:0
قديم 13-11-2012, 08:30 PM المشاركة 1   
افتراضي ميكروكنترولر 8051 Twitter FaceBook Google+



السلام عليكم:

حاولت كتابة كود للميكروكنترولر 8051 لكي اقوم بربط الكيبورد بلوحة التحكم. لكن لا اعرف هناك اخطاء .. ممكن احد يساعدني ويكتشف الاخطاء في الكود التالي:

keyport equ P2 ;Keypad port connected here
col1 equ P2.0 ;Column 1
col2 equ P2.1 ;Column 2
col3 equ P2.2 ;Column 3
col4 equ P2.3 ;Column 4
ORG 0000H
LJMP MAIN
MAIN:
keyval equ 30H ;To store key number
pressed bit 0H ;Flag

key_init:
mov keyport,#0FH ;Make rows as o/p and col as i/p
ret

get_key:
mov keyval,#0 ;reset the number
mov keyport,#7FH ;make Row1 low
acall read_col ;read columns
jb pressed, done ;check if flag is set
mov keyval,#4 ;if not then read next row
mov keyport,#0BFH ;make Row2 low
acall read_col ;read columns

jb pressed, done ;check if flag is set

mov keyval,#8 ;if not then read next row
mov keyport,#0DFH ;make row3 low
acall read_col ;read columns

jb pressed, done ;check if flag is set

mov keyval,#12 ;if not read row4
mov keyport,#0EFH ;make row4 low
acall read_col ;read columns

done:
ret

read_col: ;read columns routine
clr pressed ;reset the flag

jb col1, nextcol ;check if first key is pressed
jnb col1,$ ;if yes then wait for key release
setb pressed ;set the flag
ret

nextcol: ;read col2
jb col2, nextcol1 ;check if second key is pressed
jnb col2,$ ;if yes then wait for key release
inc keyval ;its key number 2
setb pressed ;set the flag
ret

nextcol1: ;read col3
jb col3, nextcol2 ;check if third key is pressed
jnb col3,$ ;if yes then wait for key release
inc keyval ;its key 3
inc keyval
setb pressed ;set the flag
ret

nextcol2: ;read column 4
jb col4, exit ;check if fourth key pressed
jnb col4,$ ;if yes then wait for key release
inc keyval ;its key 4
inc keyval
inc keyval
setb pressed ;set the flag
ret
exit: ;if no key is pressed
clr pressed ;clr the flag
clr keyval ;reset the number
ret


LJMP MAIN
$include(t89c51cc01.inc)
end

اعلانات

ماجد عباس محمد
:: نائب المشرف العام
::
تاريخ التسجيل: Jun 2009
الدولة: القاهرة - مصر
المشاركات: 12,214
نشاط [ ماجد عباس محمد ]
قوة السمعة:409
قديم 14-11-2012, 05:57 AM المشاركة 2   
افتراضي


هناك عدة أخطاء فى هذا البرنامج
ما هو البرنامج الذى تستخدمه فى الكتابة؟؟ أى برنامج بسيط يكون به أوامر بسيطة مثل If-then-elst,For-Next فهى تسهل كثيرا هذا ليس بيزك أو سى أو غيره مجرد امر أو اثنين للتسهيل
أول خطأ أنك فى البدء تضع loop لا منتهية فتقفز ل Init ثم هناك تضع قيمة وتعود

البرنامج لا يوضح إن كنت تستخدم المقاطعة ولا يجهز لها وواضع أنه يختبر الأطراف ولكنه أيضا بفرض أنع بمعجزة خرج من الدورة ، يضع Flag عندما يجد زر مضغوط ثم ببساطة لا يحتفظ بدليل أى الأزرار تم ضغطه

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

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

Mistake
:: مهندس ::
تاريخ التسجيل: Jul 2010
المشاركات: 40
نشاط [ Mistake ]
قوة السمعة:0
قديم 14-11-2012, 08:45 AM المشاركة 3   
افتراضي


أخي الكريم
مبدئياً............................
قم بحذف السطر قبل (end) ثم قم بالتحويل للهكس,
مع العلم أن الكود كما أرى ناقص فلم يتم تعريف الأسطر البوابة القسم الأعل من البوابة الثانية (P2.4,P2.5,P2.6,P2.7) أيضاً الخرج (OUTPUT)لم يتم تعيين بوابة للعملية؟
باقي الأخوة الكود بلغة الأسمبلي للمعالج 8051 في المشروع أعلاه تم أستخدام
المعالج(AT89c51) وقد تم إستخدام البوابة الثانية للأدخال كأعمدة وأسطر 4X4
على العموم ملف الهكس :
:1000000002000375A00F2275300075A07F1131200A
:10001000001E75300475A0BF113120001375300823
:1000200075A0DF113120000875300C75A0EF11317B
:1000300022C20020A00630A0FDD2002220A108305C
:10004000A1FD0530D2002220A20A30A2FD05300514
:1000500030D2002220A30C30A3FD0530053005303E
:0B006000D20022C200C23022020003C6
:00000001FF

ودمتم بخير.


ماجد عباس محمد
:: نائب المشرف العام
::
تاريخ التسجيل: Jun 2009
الدولة: القاهرة - مصر
المشاركات: 12,214
نشاط [ ماجد عباس محمد ]
قوة السمعة:409
قديم 14-11-2012, 02:41 PM المشاركة 4   
افتراضي


أعلم هذا وقد وضعت الكود فى برنامج Batronix compiler وهو لهذا النوع من المعالجات بلغة الأسيمبلى و به هذه الأوامر و أعلم ما هى لغة الأسيمبلى و دوما اكتب بها و شرحى فى مداخلتى
و كانت نتيجة تجربته أن دام فى دورة حسب ما ذكرت
حذف السطر الأخير هذا يخص البرنامج الذى يكتب به لأن كل برنامج يستخدم ملفات مختلفة الإسم و الإمتداد للتعريف بذات البروسيسور
هذا البرنامج يستخدم
$include(t89c51cc01.inc)
و البرنامج الذى استخدمه يحتاج الأمر
Include 89C51.mc


الصورة الرمزية bound2u
bound2u
:: مهندس ::
تاريخ التسجيل: Nov 2012
المشاركات: 15
نشاط [ bound2u ]
قوة السمعة:0
قديم 14-11-2012, 07:44 PM المشاركة 5   
افتراضي


السلام عليكم:

انا استخدم برنامج Keil uvision4 لكتابة كود الاسيمبلي , وبرنامج flip لقرائه الميكروكنترولر ..

الكود الي نسخته للمنتدى كان قبل التعديل عفواً .. نسخته بالغلط يوم امس

الاستاذ ماجد:

حاول اعدل البرنامج لكن لم استطيع ان احفظ القيمه كتبت عدة اوامر من امس ولكن بدون فائدة.
و كلامك صحيح السطر قبل الاخير مثل المكتبه عشان تتعرف بعض المتغيرات في الكود.

الاستاذ Mistak :

ملف الهكس مش ظاهر عندي .. و هل ممكن ان توضح كلامك اكثر عن باقي الصفوف ؟

ساضع بين ايديكم الكود المعدل وصورة الميكروكنترولر والمداخل الي ينفرض ان تربط بالكيبورد والشاشة.



الصورة الرمزية bound2u
bound2u
:: مهندس ::
تاريخ التسجيل: Nov 2012
المشاركات: 15
نشاط [ bound2u ]
قوة السمعة:0
قديم 14-11-2012, 07:45 PM المشاركة 6   
افتراضي


كود:
keyport equ P0                  ;Keypad port connected here
col1 equ P0.0                   ;Column 1
col2 equ P0.1                   ;Column 2
col3 equ P0.2                   ;Column 3
col4 equ P0.3                   ;Column 4
ORG 0000H
LJMP MAIN
MAIN:
keyval equ 30H                  ;To store key number
pressed bit 0H                  ;Flag

key_init:
mov keyport,#0FH        ;Make rows as o/p and col as i/p
ret

get_key:
mov keyval,#0           ;reset the number
mov keyport,#7FH        ;make Row1 low
acall read_col          ;read columns
jb pressed, done        ;check if flag is set
mov keyval,#4           ;if not then read next row
mov keyport,#0BFH       ;make Row2 low
        acall read_col          ;read columns

        jb pressed, done        ;check if flag is set

        mov keyval,#8           ;if not then read next row
        mov keyport,#0DFH       ;make row3 low
        acall read_col          ;read columns

        jb pressed, done        ;check if flag is set

        mov keyval,#12          ;if not read row4
        mov keyport,#0EFH       ;make row4 low
        acall read_col          ;read columns

done:
        ret

read_col:                       ;read columns routine
        clr pressed             ;reset the flag

        jb col1, nextcol        ;check if first key is pressed
        jnb col1,$              ;if yes then wait for key release      
        setb pressed            ;set the flag
        ret

nextcol:                        ;read col2
        jb col2, nextcol1       ;check if second key is pressed
        jnb col2,$              ;if yes then wait for key release
        inc keyval              ;its key number 2
        setb pressed            ;set the flag
        ret

nextcol1:                       ;read col3
        jb col3, nextcol2       ;check if third key is pressed
        jnb col3,$              ;if yes then wait for key release
        inc keyval              ;its key 3
        inc keyval
        setb pressed            ;set the flag
        ret

nextcol2:                       ;read column 4
        jb col4, exit           ;check if fourth key pressed
        jnb col4,$              ;if yes then wait for key release
        inc keyval              ;its key 4
        inc keyval
        inc keyval
        setb pressed            ;set the flag
        ret
		  exit:                           ;if no key is pressed
        clr pressed             ;clr the flag
        clr keyval              ;reset the number
        ret


LJMP MAIN
$include(t89c51cc01.inc)
end


Mistake
:: مهندس ::
تاريخ التسجيل: Jul 2010
المشاركات: 40
نشاط [ Mistake ]
قوة السمعة:0
قديم 14-11-2012, 10:09 PM المشاركة 7   
افتراضي


الأخ الأستاذ ماجد لك مني كل التحية والأحترام,
فأنا لم أقصدك بمداخلتي عندما كتبت ....((باقي الأخوة))....إنما قصدت الأخوة الذين سيمرون على الموضوع .
يوجد عدد كبير من الـcompilers وربما Keil بإصداراته من أكفْئها علماُ بأني أستخدم كمبايلر حجمه 4kb ورغم بساطته ومحدوديته لكني صنعت به الأعاجيب من وجهة نظري طبعاً .
تقبل فائق إحترامي .


ماجد عباس محمد
:: نائب المشرف العام
::
تاريخ التسجيل: Jun 2009
الدولة: القاهرة - مصر
المشاركات: 12,214
نشاط [ ماجد عباس محمد ]
قوة السمعة:409
قديم 15-11-2012, 04:44 AM المشاركة 8   
افتراضي


أخى bound2u لا اريد أعطيك الحل كما قمت به ولكنى أريدك أن تفكر وتصل لتستفيد لكن سأضعة لو لم تصل
الحل الذى قمت بعمله مبنى على امرين أو ثلاثة
كود:
		 MOV	Key_Pad,#!11101111		;Chk Row_0 Make it Low
		 IF NOT BIT Col_0 THEN   ; if col 0 pressed that is key"1" then its pin will be low
			  MOV A,#1       ; put 1 in Acc to indicate Key"1" is pressed
            ;   you may use any Rx or mem location for that too
			LJMP _Key_Dn ; just a loop to ensure the key is pressed
		END IF
; Repeat for each key in keypad
فى حال عدم الضغط على أى زر أضع القيمة $FF حيث القيمة من صفر إلى $0F لستة عشر زر لو متاحه


أخى Mistake شكرا للرد

إضافة رد

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

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

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


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

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