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

   

الصورة الرمزية wleed antar
wleed antar
:: عضو ماسي ::
تاريخ التسجيل: May 2006
الدولة: القاهرة - مصر
المشاركات: 1,484
نشاط [ wleed antar ]
قوة السمعة:
قديم 29-09-2009, 01:34 PM المشاركة 41   
افتراضي



نحن فى انتظارك اخى وليد اتمنى ان تبدا بال communication مثل spi i2c
لن أتناول هذه الجزئية كما أشرت فى بداية الموضوع لعيوبها التى لا تتوافق مع مشاريعى رغم ما بها من مميزات أخرى وأنى لم أستخدمها من قبل لكن إليك هذا المثال وهو منقول لعل به ما تريد


Serial EEPROM

I2C or IC stands for Inter-Integrated Circuit and is pronounced I-squared-C. This is another way chips (i.e. PICs) can communicate between themselves. It is simple, cheap, and somewhat slow (from the chip’s point of view), and has been widely used for more than twenty years now. Similar to USART and SPI, the data is transferred in serial manner, i.e. bit-by-bit, through a single wire. Unlike the SPI, this standard uses only two bi-directional wires in total, one for data and one for the clock. It also allows for over 1000 chips to be inter-connected over only two wires, and it is designed to allow the chips to be safely added to or removed from the bus without turning off the power. This and the fact that it has been invented and supported by Philips, can explain such a popularity of this standard.

From BASIC user’s point of view, using I2C looks pretty much like using the SPI. You have to:
Initiate communication between ICs;
  • Read or write some data (in byte-sized chunks);
  • Terminate communication
We will demonstrate this by connecting a 24c02 EEPROM to our PIC. Here is how to connect them:













' Example of communication with 24c02 EEPROM

كود:
' Example of communication with 24c02 EEPROM program i2c_test
dim EE_adr as byte dim EE_data as byte dim jj as word
main: I2C_init(100000) ' initialize full master mode TRISD = 0 ' PORTD is output PORTD = $FF ' initialize PORTD I2C_Start ' issue I2C start signal I2C_Wr($A2) ' send byte via I2C(command to 24cO2) EE_adr = 2 I2C_Wr(EE_adr) ' send byte(address for EEPROM) EE_data = $AA I2C_Wr(EE_data) ' send data(data that will be written) I2C_Stop ' issue I2C stop signal
for jj = 0 to 65500 ' pause while EEPROM writes data nop next jj
I2C_Start ' issue I2C start signal I2C_Wr($A2) ' send byte via I2C EE_adr = 2 I2C_Wr(EE_adr) ' send byte (address for EEPROM) I2C_Repeated_Start ' issue I2C signal repeated start I2C_Wr($A3) ' send byte (request data from EEPROM) EE_data = I2C_Rd(1) ' read data I2C_Stop ' issue I2C stop signal PORTD = EE_data ' show data on PORTD noend: ' endless loop goto noend end.

You can find more details on I2C routines’ syntax in Chapter 5: Built-in and Library Routines. You shouldn’t bother yourself too much about the meaning of the I2C_Start and I2C_Repeated_Start routines – that’s the way your PIC performs the initialization of its I2C device.




أتمنى أن تكون وصلت المعلومة


التعديل الأخير تم بواسطة : wleed antar بتاريخ 29-09-2009 الساعة 02:01 PM
اعلانات

MWWM
:: مهندس جيد ::
تاريخ التسجيل: Aug 2009
المشاركات: 237
نشاط [ MWWM ]
قوة السمعة:
قديم 29-09-2009, 07:50 PM المشاركة 42   
افتراضي


نواصل الشرح

البرنامج الأول الخاص بالمتحكم الرئيسى هو


كود:
dim T as byte
كود:
 
main:
 
delay_ms(100)   'انتظار مستحسن لبدأ باقى المتحكمات بالعمل 
 
option_reg = $80
 
ADCON1 = $07  ' سنتعامل مع دخول بالنظام الرقمى
 
trisa  = $0f ' نحتاج أربع أطراف فقط للبيانات المستقبلة
 
trise  = $00 'نستخدم ثلاث أطراف وهم المنفذ e بكامله
lcd_init(portb) 
lcd_cmd(lcd_cursor_off)
lcd_cmd(lcd_clear)
lcd_out(2,1,"pic1:")
lcd_out(2,9,"pic2:")
lop1:
porte = 0     ' نداء إيقاف أى عمليات إرسال   
while porta <> 0  ' انتظار حتى اتمام عدم ارسال أى معلومات لعدم التداخل
wend
porte = 1      ' طلب خانة العشرات من المتحكم 2
while porta = 0  ' انتظر حتى الرد
wend
T = porta    تخزين خانة العشرات فى المتغير
lcd_chr(2,6,47+ T )  
porte = 0 ' نداء توقف أى عمليات إرسال
while porta <> 0   ' انتظر حتى توقف أى عمليات إرسال
wend
porte = 2      ' طلب خانة الأحاد من المتحكم 2
while porta = 0 ' انتظر حتى حتى الرد
wend
T = porta   ' تخزين القيمة داخل متغير
lcd_chr(2,7,47+ T )
porte = 0      ' طلب إيقاف عمليات الإرسال 
while porta <> 0 '  انتظر حتى توقف أى عمليات إرسال 
wend
porte = 3      ' طلب خانة العشرات من المتحكم 3 
while porta = 0   ' انتظر الرد 
wend
T = porta  ' تخزين القيمة فى المتغير   
lcd_chr(2,14,47+ T ) 
porte = 0      '  طلب إيقاف عمليات الإرسال 
while porta <> 0  ' انتظر إيقاف الإرسال 
wend
porte = 4      ' طلب خانة الأحاد من المتحكم 3
while porta = 0  ' انتظر الرد
wend
T = porta ' تخزين القيمة
lcd_chr(2,15,47+ T )
 
goto lop1
يتتبع ،

اولا اشكرك اخي العزيز على درسك الثمين واقول جزاك الله خيرا

ثانيا افضل طريقتك على زياده ذاكره المتحكم في افضل بكثير

ثالثا شرحك واضح وجميل لاه من شخص جميل واخلاقه جميله

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

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

الصورة الرمزية wleed antar
wleed antar
:: عضو ماسي ::
تاريخ التسجيل: May 2006
الدولة: القاهرة - مصر
المشاركات: 1,484
نشاط [ wleed antar ]
قوة السمعة:
قديم 29-09-2009, 08:36 PM المشاركة 43   
افتراضي


اولا اشكرك اخي العزيز على درسك الثمين واقول جزاك الله خيرا

ثانيا افضل طريقتك على زياده ذاكره المتحكم في افضل بكثير

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

يمكننا استخدام الربط كما سبق الذكر فى كثير من المواقف ومختلف الأغراض ،


رابعا الشي الوحيد الذي لم اتمكن من فهمه ويمكن يتضح في شرح الاكواد الباقيه للمتحكمات الفرعيه وهي عندما يض المتحكم الرئيسي مثلا 3 كيف يعرف المتحكم الفرعي الثاني ان المخاطب هو والمطلوب العشرات
اعتقد ان هذا يتضح في شرح الاكواد الخاصه بالمتحكمات الفرعيه لكن اعذرني على عجلتي فهي بسيبب جمال شرحك واسلوبك الرائع
سؤال جميل ، والإجابه هى :-

كام خانة سنحتاج لنقلها ؟

أربع خانات وهم خانة الأحاد وخانة العشرات للمتحكم رقم 2 ثم مثلهم للمتحكم رقم 3
-------------------------------------------

نختار رقم لكل طلب فمثلا اخترت رقم 1 لخانة العشرات للمتحكم 2
ورقم 2 لخانة الأحـــاد للمتحكم 2
ورقم 3 لخانة العشرات للمتحكم 3
ورقم 4 لخانة الأحـــاد للمتحكم 3

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

وبناءا على ذلك نكتب للمتحكم الفرعى رقم 2 أنه فى حالة ورود رقم 1 على المنفذ e الخاص باستقبال العناوين ففى هذه الحالة فقط يقوم هذا المتحكم الفرعى 2 بوضع خانة العشرات على المنفذ الخاص بارسال البيانات والذى حددناه بأنه a

وبمجرد وجود رقم 1 على منفذ استقبال العناوين e يقوم المتحكم بوضع خانة الأحاد على المنفذ المخصص لإرسال البيانات والذى حددناه أنه المنفذ a

ماعدا ذلك من أرقام مستقبلة مثل 3 أو 4 طبعا نحن خصصناها للمتحكم رقم 3 إذن فلن يتأثر بها المتحكم رقم 2 لأننا لم نحدد له وظيفة يقوم بها فى حالة وجود أى أرقام غير 1 أو 2

وبالنسبة لوجود صفر على أطراف العنوان e سيتوقف أى متحكم فرعى عن عملية الإرسال ! أى يضع قيمة صفر على المنفذ a ويظل على هذا الوضع حتى وجود أى أوامر أخرى

أعتقد أن الموضوع أصبح أسهل الآن ؟!

------------------------------------------------------------





التعديل الأخير تم بواسطة : wleed antar بتاريخ 29-09-2009 الساعة 08:41 PM

MWWM
:: مهندس جيد ::
تاريخ التسجيل: Aug 2009
المشاركات: 237
نشاط [ MWWM ]
قوة السمعة:
قديم 29-09-2009, 10:55 PM المشاركة 44   
افتراضي


شكرا لك على جمال الشرح

ننتظر باقي الشرح بشغف


MWWM
:: مهندس جيد ::
تاريخ التسجيل: Aug 2009
المشاركات: 237
نشاط [ MWWM ]
قوة السمعة:
قديم 01-10-2009, 02:15 PM المشاركة 45   
افتراضي


السلام عليكم

مشتاقون لباقي الدس
لانستطيع الانتظار مع هذا الشرح الجميل الذي يفتح الشهيه


الصورة الرمزية wleed antar
wleed antar
:: عضو ماسي ::
تاريخ التسجيل: May 2006
الدولة: القاهرة - مصر
المشاركات: 1,484
نشاط [ wleed antar ]
قوة السمعة:
قديم 01-10-2009, 02:31 PM المشاركة 46   
افتراضي


السلام عليكم

مشتاقون لباقي الدس
لانستطيع الانتظار مع هذا الشرح الجميل الذي يفتح الشهيه

آسف إخوانى على التأخير لضيق الوقت ، وسأحاول بمشيئة الله مساء اليوم أن أتابع تكملة الموضوع ،


اللهم لا سهل إلا ما جعلته سهلا وأنت تجعل الصعب إن شئت سهلا



الصورة الرمزية wleed ameer
wleed ameer
:: مهندس متواجد ::
تاريخ التسجيل: Apr 2008
المشاركات: 86
نشاط [ wleed ameer ]
قوة السمعة:
قديم 01-10-2009, 08:38 PM المشاركة 47   
افتراضي


السلام عليكم

موضوع ممتاز حقا ولقد استفدت من الأسئلة والإجابة عليها ، وطريقة الشرح المبسطة والتى تخاطب العقل ، ماشاء الله وأنا أعتبر الموضوع حصرى لمنتدى القرية وليس هذا بغريب على المتحابين وروح التعاون .

ولى سؤال جانبى أرجو أن لا يكون مزعجا ، هل يمكن بهذه الطريقة ربط أنواع مختلفة من المتحكمات أم أنه لازم يكون نفس الموديل ؟ يعنى هل يمكننى ربط 16f877a مع 16f84a مع 16f88 مثلا ؟

وشكرا لك أخى وليد عنتر وننتظر تكملة الموضوع وإلى الأمام
:hry:


الصورة الرمزية wleed antar
wleed antar
:: عضو ماسي ::
تاريخ التسجيل: May 2006
الدولة: القاهرة - مصر
المشاركات: 1,484
نشاط [ wleed antar ]
قوة السمعة:
قديم 02-10-2009, 06:15 AM المشاركة 48   
افتراضي


السلام عليكم
موضوع ممتاز حقا ولقد استفدت من الأسئلة والإجابة عليها ، وطريقة الشرح المبسطة والتى تخاطب العقل ، ماشاء الله وأنا أعتبر الموضوع حصرى لمنتدى القرية وليس هذا بغريب على المتحابين وروح التعاون .
النجاح ثمرة التعاون ، والحمد لله

ولى سؤال جانبى أرجو أن لا يكون مزعجا ، هل يمكن بهذه الطريقة ربط أنواع مختلفة من المتحكمات أم أنه لازم يكون نفس الموديل ؟ يعنى هل يمكننى ربط 16f877a مع 16f84a مع 16f88 مثلا ؟


لا يشترط نوع المتحكم ولا نوع المنفذ فيمكن للمتحكم الفرعى أن يكون مثلا f84a أو أى شئ آخر ويستخدم أى بورت وهذا يرجع لترتيب منافذ الدخل والخرج فيمكن للمتحكم الرئيسى أن نستخدم فيه البورت A كبيانات ونجعلها متصلة مع بورت B فى المتحكم الفرعى مثلا وهذا راجع للبرمجة ، وكذلك لو جعلنا المتحكم الرئيسى يعمل باستخدام بورت واحد فقط وليكن البورت B يمكننا أن نجعله فقط هو المستخدم فى عملية الربط أى هو مرسل العنوان ومرسل البيانات وفى هذه الحالة يمكننا وصله ببورت واحد فقط فى المتحكم الفرعى ليكون هذا البورت منقسم إلى أطراف استقبال عناوين وأطراف إرسال بيانات ! ! كما يمكننا أن نستخدم بورت واحد فقط فى متحكم مع بورتان فى متحكم آخر ! ولكن ما فائدة طريقة استخدام بورتان فى حين أنه يمكن استخدام بورت واحد من أجل توفير المنافذ ؟
يمكننا توفير بورت كامل مثل B أو C ونستخدم E حيث أن هذا الأخير 3 أطراف فقط ويمكننا أيضا عدم الإلتزام ببورت كامل بل يكفى ولو 3 أطراف واحد من بورت وواحد من بورت آخر وواحد من بورت مختلف فكل هذا لن يؤثر على عمل نفس البورتات كعمل طبيعى ، ومن هنا تمكنا من استخدام بورت واحد فقط لإرسال البيانات واستقبال العناوين وسنتناول هذا لاحقا إن شاء الله

وبالتوفيق



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