تكملة دورة المعالجات والمتحكمات المصغرة الجزء الثاني (44-70)
ترجمة أحمد رامي قباني || RamiKabbani.wordpress.com
71 ترجمة وتنسيق: رامي قباني. إلقاء الدكتور: عبد الغني البكار.
تسمح واجهة الخطين للمصمم بربط عدد )أقصاه 128 ( من الأجهزة )معالجات
صغرية، محولات طاقة، شاشات، مخزنات ذاكرة، …( في نظام يستخدم تقنية
الخطين.
كل جهاز له عنوانه الفريد، ويستطيع الإرسال و الاستقبال بسرعة تصل إلى
400 كيلوهرتز.
أحد مشاكل تقنية ممر حزمة I2C )تقنية الخطين( هي السرعة.
وا ة الخطين ) TWI )
ترجمة أحمد رامي قباني || RamiKabbani.wordpress.com
72 ترجمة وتنسيق: رامي قباني. إلقاء الدكتور: عبد الغني البكار.
استخدامات ممر حزمة I2C
ترجمة أحمد رامي قباني || RamiKabbani.wordpress.com
73 ترجمة وتنسيق: رامي قباني. إلقاء الدكتور: عبد الغني البكار.
نقل الب عل ممر حزمة I2C
ترجمة أحمد رامي قباني || RamiKabbani.wordpress.com
74 ترجمة وتنسيق: رامي قباني. إلقاء الدكتور: عبد الغني البكار.
حالات البدء والتوقف عل ممر حزمة I2C
ترجمة أحمد رامي قباني || RamiKabbani.wordpress.com
75 ترجمة وتنسيق: رامي قباني. إلقاء الدكتور: عبد الغني البكار.
// المترجم هو ImageCraftICCAVR Ver7.22C
******************************************
#include <iom103.h>
#include <MACROS.h>
#include “DC_Defines.h”
#include “I2C.h”
ملفات العنوان
ترجمة أحمد رامي قباني || RamiKabbani.wordpress.com
76 ترجمة وتنسيق: رامي قباني. إلقاء الدكتور: عبد الغني البكار.
// إعداد منفذ I2C // ***
void Init_I2C (void)
{
SETBIT (I2C_DIR,SCL); // ليكون خرج » اس سي ال « تحديد
SETBIT (I2C_DIR,SDA); // ليكون خرج » اس دي ايي « تحديد
SETBIT (I2C_PORT,SCL); // » اس سي ال « تحديد قيمة مرتفعة ل
SETBIT (I2C_PORT,SDA); // » اس دي ايي « تحديد قيمة مرتفعة ل
}
تشغيل منفذ I2C
ترجمة أحمد رامي قباني || RamiKabbani.wordpress.com
77 ترجمة وتنسيق: رامي قباني. إلقاء الدكتور: عبد الغني البكار.
// * ستقوم هذه الطريقة بإرسال بت بدء ال I2C ***
void I2C_Start (void)
{
SETBIT(I2C_PORT,SCL); // » اس سي ال « تحديد قيمة مرتفعة ل
SETBIT(I2C_PORT,SDA); // » اس دي ايي « تحديد قيمة مرتفعة ل
SETBIT(I2C_DIR,SDA); // ليكون خرج » اس دي ايي « تحديد
CLEARBIT(I2C_PORT,SDA); // » اس دي ايي « مسح
}
ارسال ب بدء ال I2C
ترجمة أحمد رامي قباني || RamiKabbani.wordpress.com
78 ترجمة وتنسيق: رامي قباني. إلقاء الدكتور: عبد الغني البكار.
// ** تقوم هذه الطريقة بإرسال بت إيقاف ال I2C // **
void I2C_Stop (void)
{
SETBIT(I2C,DIR,SDA); // كخرج » اس دي ايي « تحديد
CLEARBIT(I2C_PORT,SDA); // » اس دي ايي « مسح
CLEARBIT(I2C_PORT,SCL); // » اس سي ال « مسح
SETBIT(I2C_PORT,SCL); // » اس سي ال « تحديد قيمة مرتفعة ل
SETBIT(I2C_PORT,SDA); // » اس دي ايي « تحديد قيمة مرتفعة ل
}
إرسال ب إيقاف ال I2C
ترجمة أحمد رامي قباني || RamiKabbani.wordpress.com
79 ترجمة وتنسيق: رامي قباني. إلقاء الدكتور: عبد الغني البكار.
// تقوم هذه الطريقة بإرسال نبضات ساعة I2C //
void I2C_Clock (void)
{
SETBIT(I2C_PORT,SCL); // » اس سي ال « تحديد قيمة مرتفعة ل
NOP; // تأخير صغير
CLEARBIT(I2C_PORT,SCL); // » اس سي ال « تحديد قيمة منخفضة ل
}
إرسال نبضات ساعة ال I2C
ترجمة أحمد رامي قباني || RamiKabbani.wordpress.com
80 ترجمة وتنسيق: رامي قباني. إلقاء الدكتور: عبد الغني البكار.
void write_I2C_Byte(unsigned char byte){
Unsigned chari;
SETBIT(I2C_DIR,SDA); // لتكون » اس دي ايي « تحديد
خرج
CLEARBIT(I2C_PORT,SCL);
For(i=0; i<8; i++){ // اس دي « تشغل أو تمسح قطب ال
» ايي
If((byte & 0x80) == 0x80)
SETBIT(I2C_PORT,SDA); // اس دي « تشغيل قطب
آي « ل » ايي 2 » سي
Else CLEARBIT(I2C_PORT,SDA); // اس « مسح قطب
آي « ل » دي ايي 2 » سي
SETBIT(I2C_PORT,SCL); // اس « تحديد قيمة مرتفعة ل
ساعة البيانات ،» سي ال
byte=byte <<1; // إزاحة البيانات في المسجل خانة
واحدة إلى اليمين
CLEARBIT(I2C_PORT,SCL); } // » اس سي ال « مسح
whie(I2C_Ackn() ); // آي « تحقق من وجود تعريق من
2 » سي
{
كتابة باي إل I2C
ترجمة أحمد رامي قباني || RamiKabbani.wordpress.com
81 ترجمة وتنسيق: رامي قباني. إلقاء الدكتور: عبد الغني البكار.
unsigned char Read_I2C_Byte(void) {
unsigned char i, buff = 0;
for (i = 0; i < 8; i++) {
buff = buff << 1;
CLEARBIT(I2C_DIR,SDA); // اس دي « تحديد
ليكون دخل » ايي
SETBIT(I2C_PORT,SCL); // تحديد قيمة مرتفعة ل
بت خرج الساعة ،» اس سي ال «
if ( CHECKBIT( I2C_IN,SDA ) ) buff = buff | 0x01; // » اس دي ايي « قراءة البيانات على
CLEARBIT(I2C_PORT,SCL); // اس سي « مسح
» ال
}
// *** لا توجد تعاريف *** //
I2C_Clock(); // آي « بت ساعة 2 » سي
return buff; // آي « إعادة بايت 2 الخاص بنا » سي
}
قراءة باي من I2C
ترجمة أحمد رامي قباني || RamiKabbani.wordpress.com
82 ترجمة وتنسيق: رامي قباني. إلقاء الدكتور: عبد الغني البكار.
unsigned char I2C_Ackn(void)
{
unsigned char Ackn= 0; // رامات مؤقتة من
أجل علم التعاريف
CLEARBIT(I2C_PORT,SCL);
CLEARBIT(I2C_DIR,SDA); // اس دي « تحديد
لتكون دخل » ايي
SETBIT(I2C_PORT,SCL); // )إعطاء قيمة مرتفعة
لبت التعاريف(
if ( CHECKBIT( I2C_IN,SDA ) )
Ackn= 1; // اس دي « افحص بت التعاريف على
» ايي
CLEARBIT(I2C_PORT,SCL); // امسح الساعة
return Ackn; // إعادة بت التعاريف الخاص بنا
}
إعادة القيمة 0 إذا قام I2C بإرسال تعريف
ترجمة أحمد رامي قباني || RamiKabbani.wordpress.com
83 ترجمة وتنسيق: رامي قباني. إلقاء الدكتور: عبد الغني البكار.
void Write_I2C_Control(unsigned char D_Code,
unsigned char H_ADD,unsignedchar RW)
{
CLEARBIT(I2C_PORT,SCL); // اس « مسح ساعة
» سي ال
if( (D_Code& 0x08) == 0x08)
SETBIT(I2C_PORT, SDA);// اس « تشغيل قطب
آي « ل » دي ايي 2 » سي
else CLEARBIT(I2C_PORT,SDA); // اس « مسح
» دي ايي
I2C_Clock();
if( (D_Code& 0x04) == 0x04)
SETBIT(I2C_PORT, SDA);// اس « تشغيل قطب
آي « ل » دي ايي 2 » سي
else CLEARBIT(I2C_PORT,SDA); // اس « مسح
» دي ايي
إرسال شيفرة تحكم ال I2C
ترجمة أحمد رامي قباني || RamiKabbani.wordpress.com
84 ترجمة وتنسيق: رامي قباني. إلقاء الدكتور: عبد الغني البكار.
I2C_Clock();
if( (D_Code& 0x02) == 0x02)
SETBIT(I2C_PORT, SDA); // » اس دي ايي « تشغيل قطب
else CLEARBIT(I2C_PORT,SDA); // » اس دي ايي « مسح ال
I2C_Clock();
if( (D_Code& 0x01) == 0x01)
SETBIT(I2C_PORT, SDA); // » اس دي ايي « تشغيل قطب ال
else CLEARBIT(I2C_PORT,SDA); // » اس دي ايي « مسح ال
I2C_Clock();
إرسال شيفرة تحكم ال I2C
ترجمة أحمد رامي قباني || RamiKabbani.wordpress.com
85 ترجمة وتنسيق: رامي قباني. إلقاء الدكتور: عبد الغني البكار.
if( (H_ADD & 0x04) == 0x04)
SETBIT(I2C_PORT, SDA); // اس « تشغيل القطب
» دي ايي
else CLEARBIT(I2C_PORT,SDA); // مسح ال
» اس دي ايي «
I2C_Clock();
if( (H_ADD & 0x02) == 0x02)
SETBIT(I2C_PORT, SDA); // اس « تشغيل قطب
» دي ايي
else CLEARBIT(I2C_PORT,SDA); // مسح قطب
» اس دي ايي « ال
I2C_Clock();
if( (H_ADD & 0x01) == 0x01)
SETBIT(I2C_PORT, SDA); // اس « تشغيل قطب
» دي ايي
else CLEARBIT(I2C_PORT,SDA) ;// مسح قطب
» اس دي ايي « ال
I2C_Clock();
إرسال باي تحكم ال I2C وبتات تحديد الشريحة
ترجمة أحمد رامي قباني || RamiKabbani.wordpress.com
86 ترجمة وتنسيق: رامي قباني. إلقاء الدكتور: عبد الغني البكار.
if(RW) SETBIT(I2C_PORT,SDA); // » اس دي ايي « تشغيل القطب
else CLEARBIT(I2C_PORT,SDA); // » اس دي ايي « مسح القطب
I2C_Clock();
while(I2C_Ackn() ); // آي « تحقق من وجود تعريفات من 2 » سي
}
تشغيل أو مسح ب ال قراءة / كتابة
ترجمة أحمد رامي قباني || RamiKabbani.wordpress.com
87 ترجمة وتنسيق: رامي قباني. إلقاء الدكتور: عبد الغني البكار.
| بت OR
& بت AND
~ بت NOT
^ بت XOR
<< بت إزاحة إلى اليسار
>> بت إزاحة إلى اليمين
تعليمات تس ل تحديد الب واختباره
ترجمة أحمد رامي قباني || RamiKabbani.wordpress.com
88 ترجمة وتنسيق: رامي قباني. إلقاء الدكتور: عبد الغني البكار.
#define BIT(x) (1 << (x))
#define SETBITS(x,y) ((x) |= (y))
#define CLEARBITS(x,y) ((x) &= (~(y)))
#define SETBIT(x,y) SETBITS((x), (BIT((y))))
#define CLEARBIT(x,y) CLEARBITS((x), (BIT((y))))
#define BITSET(x,y) ((x) & (BIT(y)))
#define BITCLEAR(x,y) !BITSET((x), (y))
#define BITSSET(x,y) (((x) & (y)) == (y))
#define BITSCLEAR(x,y) (((x) & (y)) == 0)
#define BITVAL(x,y) (((x)>>(y)) & 1)
تعليمات تس ل تحديد الب واختباره
ترجمة أحمد رامي قباني || RamiKabbani.wordpress.com
89 ترجمة وتنسيق: رامي قباني. إلقاء الدكتور: عبد الغني البكار.
. 1 قم بتلخيص الفارق بين التحويل التسلسلي والتحويل التفرعي.
.2 قم بتلخيص الفارق بين طرق الاتصال التسلسلي USART ، و SPI ، و TWI .
. 3 ارسم مخططا صندوقيا ل USART ، قم بتسمية جميع المسجلات الرئيسية، وجميع أعلام USART الرئيسية.
. 4 ارسم مخططا صندوقيا لنظام SPI ، قم بتسمية جميع المسجلات الرئيسية، وجميع أعلام USART الرئيسية.
. 5 إذا كانت لدينا شريحة ATMega16 تعمل عند تردد 12 ميغاهرتز، ما هو أكبر تردد نقل بيانات لكل من USART و
SPI ؟
. 6 ارسم دارة توضح نظاما مكونا من شريحتي ATMega16 ، حيث أنهما ستقومان بتبادل المعلومات عبر نظام SPI . يجب
أن يحتوي النظام على دارة ربط RS-232 لتغيير مستوى الكمون.
. 7 اكتب البرنامج الذي يقوم بتنفيذ النظام الموصوف في السؤال السابق.
مسائل
انتهت المحاضرة الثانية