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

   

الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,832
نشاط [ F.Abdelaziz ]
قوة السمعة:
قديم 20-02-2012, 02:35 AM المشاركة 25   
افتراضي



البرنامج :











كود:
 
void Tone1(){Sound_Play(659, 250);} // Frequency = 659Hz, duration = 250ms void Tone2(){Sound_Play(698, 250);} // Frequency = 698Hz, duration = 250ms void Tone3(){Sound_Play(784, 250);} // Frequency = 784Hz, duration = 250ms void Melody() // Plays the melody "Yellow house" { Tone1(); Tone2(); Tone3(); Tone3(); Tone1(); Tone2(); Tone3(); Tone3(); Tone1(); Tone2(); Tone3(); Tone1(); Tone2(); Tone3(); Tone3(); Tone1(); Tone2(); Tone3(); Tone3(); Tone3(); Tone2(); Tone2(); Tone1(); } void ToneA(){Sound_Play( 880, 50);} void ToneC(){Sound_Play(1046, 50);} void ToneE(){Sound_Play(1318, 50);} void Melody2() { unsigned short i; for (i = 9; i > 0; i--) { ToneA(); ToneC(); ToneE(); } } void main() { TRISC = 0xFF; // Configure PORTC as inputs TRISD=0; Sound_Init(&PORTD, 0); // Buzzer connected to PORTD pin 0 = RD0
Sound_Play(880, 1000); // Play sound at 880Hz for 1 second while (1) { if (Button(&PORTC,0,1,1)) // RC0 plays Tone1 Tone1(); while (RC0_bit) ; // Wait for button to be released if (Button(&PORTC,1,1,1)) // RC1 plays Tone2 Tone2(); while (RC1_bit) ; // Wait for button to be released if (Button(&PORTC,2,1,1)) // RC2 plays Tone3 Tone3(); while (RC2_bit) ; // Wait for button to be released if (Button(&PORTC,3,1,1)) // RC3 plays Melody2 Melody2(); while (RC3_bit) ; // Wait for button to be released if (Button(&PORTC,4,1,1)) // RC4 plays Melody Melody(); while (RC4_bit) ; // Wait for button to be released } }

التعليق على البرنامج :

اعلانات

الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,832
نشاط [ F.Abdelaziz ]
قوة السمعة:
قديم 20-02-2012, 02:38 AM المشاركة 26   
افتراضي


التعليق على البرنامج :
1- الإعلان عن دوال أو روتينات (برامج فرعية) للنغمات Tone:
· إنشاء دالة باسم Tone1 " النغمة الأولى" وفيها نستخدم الدالة Sound_Play "تشغيل صوت" بتردد 659Hz وفترة دوام 250ms. وبالمثل لباقى دوال النغمات Tone2 و Tone3() .
· إنشاء دالة باسم Melody (ميلودى) أى توزيع وتناسق مجموعة من النغمات حسب الرغبة . وهى هنا تتكون من تسلسل من دوال النغمات التى سبق إنشاؤها فى الخطوة السابقة (بناء على النوتة الموسيقية) .
· يلى ذلك ونفس الطريقة إنشاء دوال النغمات ToneA و ToneC وToneE:
· ثم يتم إنشاء دالة لتوزيع آخر باسم Melody2() باستخدام دوال النغمات فى الخطوة السابقة وعبارة for للتكرار تسع مرات بدءا من( i = 9 ) وتنتهى عند ( i > 0 ) مع تناقص i بواحد فى كل مرة i--(9-8-7-6-5-4-3-2-1) .
2- الدالة الرئيسية :
· إعدادات أطراف المنافذ : المنفذ PORTC كمداخل لتوصيل المفاتيح على الأطراف
RC0-RC4. والمنفذ PORTD كمخارج لتوصيل السماعة على الطرف RD0 ليكون إعداد دالة تهيئة الطرف للصوت كما يلى Sound_Init(&PORTD, 0) .
· نغمة الافتتاحية : الحالة الابتدائية : تشغيل صوت بتردد 880Hz لمدة ثانية .
· إنشاء حلقة غير منتهية while (1) وفيها يتم العبارات التالية :
· عند الضغط على المفتاح المتصل بالطرف RC0 يتحول هذا الطرف إلى الحالة المرتفعة وتتحقق الدالة Button(&PORTC,0,1,1) ويكون عائدها حقيقى ومن ثم يتحقق شرط عبارة if ونتيجة لذلك يتم تشغيل النغمة الأولى Tone1 .
· تستخدم حلقة while (RC0_bit)) للانتظار حتى تحرير المفتاح أى يتحول طرفه إلى الحالة المنخفضة فيخرج البرنامج من هذه الحلقة حتى يمكن تشغيل نغمة أخرى .
· نفس الطريقة للنغمة الثانية Tone2عن طريق المفتاح المتصل بالطرف RC1.
· والنغمة الثالثة Tone3() عن طريق المفتاح المتصل بالطرف RC2.
· بنفس الطريقة يتم تشغيل Melody2 عن طريق المفتاح RC3 .
· والمفتاح RC4 يقوم بتشغيل Melody .

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

الصورة الرمزية أبو معاذ 2010
أبو معاذ 2010
:: مشرف قسم الإنتاج الزراعي والحيواني والطاقة البديلة ::
تاريخ التسجيل: Feb 2010
المشاركات: 2,039
نشاط [ أبو معاذ 2010 ]
قوة السمعة:
قديم 20-02-2012, 04:20 AM المشاركة 27   
افتراضي


فعلا مكتبة شاملة ، شملكم الله برحمته و جميل جزائه ، و أثابكم على ما قدمتم و تقدمون من درر لأبناء الأمة و جعله في ميزان حسناتكم آمين .


Emad Omar
:: مهندس ::
تاريخ التسجيل: Feb 2012
المشاركات: 9
نشاط [ Emad Omar ]
قوة السمعة:
قديم 20-02-2012, 09:13 PM المشاركة 28   
افتراضي


استاذي القدير F.Abdelaziz ..
ماشاء الله!! ..

انت مُستمر في تقديم وطرح الدروس والتدريبات .. اشكُرك على هذا ..

لكن انا لم استطع بعد أنهاء تدريبات الصفحة الثانية ^_^

ولا أعتقد بعد كُل هذا الطرح أن سيكون لدي مُتسع كي اضع إستفساراتي ..
لأنها ستبدو مُتأخرة ..

اشكُرك على هذا .. لكن وددتُ أن تكون هُناك فترة بين كُل درس وآخر لإستقبال الإستفسارات حوله قبل البدء بالتالي ..

آنا من النوع اللذي يبحث عن الشيء العملي .. فعندما أجد دروس مُتقدمة .. تجدني آهمل الدروس السابقة لها ^ ^

----------------------------------------
بخصوص البرنامج الثاني .. اللذي قُمت بطرحه في الصفحة الثانية #14

قُمت برسم الدائرة اللتي وضعتها ..
لكن بعد تشغيل البرنامج لم آرى اي حركة لـ الـ LEDs في الدائرة!! .. مالسبب ؟!

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

آعتذر عن الإزعاج ..

دُمت بصحة


الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,832
نشاط [ F.Abdelaziz ]
قوة السمعة:
قديم 20-02-2012, 10:51 PM المشاركة 29   
افتراضي


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

شكرا جزيلا لك

بارك الله فيك

تقدير أعتز به

مع تمنياتى بدوام التوفيق


الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,832
نشاط [ F.Abdelaziz ]
قوة السمعة:
قديم 20-02-2012, 10:55 PM المشاركة 30   
افتراضي


استاذي القدير F.Abdelaziz ..
ماشاء الله!! ..

انت مُستمر في تقديم وطرح الدروس والتدريبات .. اشكُرك على هذا ..

لكن انا لم استطع بعد أنهاء تدريبات الصفحة الثانية ^_^

ولا أعتقد بعد كُل هذا الطرح أن سيكون لدي مُتسع كي اضع إستفساراتي ..
لأنها ستبدو مُتأخرة ..

اشكُرك على هذا .. لكن وددتُ أن تكون هُناك فترة بين كُل درس وآخر لإستقبال الإستفسارات حوله قبل البدء بالتالي ..

آنا من النوع اللذي يبحث عن الشيء العملي .. فعندما أجد دروس مُتقدمة .. تجدني آهمل الدروس السابقة لها ^ ^

----------------------------------------
بخصوص البرنامج الثاني .. اللذي قُمت بطرحه في الصفحة الثانية #14

قُمت برسم الدائرة اللتي وضعتها ..
لكن بعد تشغيل البرنامج لم آرى اي حركة لـ الـ LEDs في الدائرة!! .. مالسبب ؟!

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

آعتذر عن الإزعاج ..

دُمت بصحة
أخى الكريم

شكرا جزيلا لك

بارك الله فيك

برجاء إرفاق ما كتبته وما رسمته لتحديد المطلوب عمله .

مع تمنياتى بدوام التوفيق


الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,832
نشاط [ F.Abdelaziz ]
قوة السمعة:
قديم 21-02-2012, 01:39 AM المشاركة 31   
افتراضي


برمجة المحول ADC مع mikroC PRO تتم بدون أدنى عناء .
إمكانيات المترجم mikroC PRO فى التعامل مع المحول من تناظرى لرقمى ADC


مكتبة التحويل من تناظرى لرقمى ADC Library
  • موديول (وحدة) المحول ADC متوفر فى عدد من الميكروكونترولر .
  • مكتبة الدالة ADC_Read يجب ضمها لتوفير العمل المريح مع هذا الموديول .
الدالة ADC_Read :
نموذج الصيغة :






  • نبدأ باسم الدالة وهو ADC_Read "قراءة مدخل تناظرى وتحويله إلى رقمى " , وهى دالة عائدها (نتيجتها) قيمة ذات 10 بت وتمثل متغير من نوع unsigned وبقصد بها unsigned (int) أى عدد صحيح بدون إشارة مداه0 .. 65535 .
  • ثم بين قوسين نكتب البارامتر أو الدليل الوحيد لهذه الدالة وهو القناة التناظرية المراد قراءتها إى التحصل (اكتساب) على القيمة التناظرية منها .
مثال:





تعليق :

تقوم هذه الدالة بكل ما هو مطلوب فى إتمام تتابع عملية التحويل من تناظرى لرقمى دون دخول المبرمج فى التفاصيل , فلقد وفرت أفضل ظروف مناسبة للعملية , مثل:
  • جعل الجهد المرجعى السالب متصل داخليا بالأرضى أى Vref- = 0 .
  • والجهد المرجعى الموجب متصل داخليا بالجهد 5V أى أن Vref+ = 5V .
حتى نحصل على أكبر دقة ويكون 5V = 1024 .
  • كما جعلت محازاة النتيجة لليمين .
حتى يسهل معالجتها .
  • ووفرت أفضل تردد لمذبذب المحول والفترة الزمنية للتحويل كما تولت تتابع عملية التحويل نفسها .
لم تترك الدالة للمبرمج سوى خيار واحد هو اختيار قناة الدخل التناظرى والذى يتم عن طريق سجلات التحكم فى المحول ADC .
وحتى هذه : فى الميكروكونترولر PIC16F877A تكون الأوضاع الافتراضية لبتات سجلات التحكم فى المحول ADC وهى ADCON0 و ADSCON1 بأصفار وهو ما يعنى اختيار جميع القنوات التناظرية المتاحة وهى خمس قنوات بالمنفذ PORTA وثلاثة قنوات بالمنفذ PORTE , وهذا يعنى أننا إذا قررنا استخدام هذه المنافذ كمداخل تناظرية فلم نتعرض لإعدادات سجلات التحكم على الأقل فى الوقت الراهن كم ما سوف يتضح من البرنامج التالى .

برنامج لتوضيح مبدأ التحويل من تناظرى لرقمى ADC :

الدائرة الكهربية :







البرنامج :











شرح البرنامج :

1- قبل الدخول إلى الدالة الرئيسية يتم تعريف متغير نوع unsigned int ( بسعة 2 بايت أى 16 خانة ليتسع لنتيجة التحويل ADC ذات العشر خانات ) بالاسم temp_res (أو أى اسم يناسب البرنامج الفعلى ) وذلك لنسخ نتيجة التحويل إليه وعلاجه فيما بعد وفقا لطلبات البرنامج .
2- بداية الدالة الرئيسية : وتحتوى على

أ‌- أعدادات سجلات التحكم والمنافذ :
· إعداد جميع أطراف السجل PORTA كمداخل لأن به المدخل التناظرى TRISA = 0xFF.
· إعداد جميع أطراف السجل PORTB كمخارج لتوصيل ليدات بها TRISB = 0.
· إعداد جميع أطراف المنفذ PORTD كمخارج لتوصيل ليدات بها TRISD = 0.
· إنشاء حلقة غير منتهية باستخدام do { ……} while (1) وفيها يتم :
do {
# قراءة القيمة الناظرية من على القناة رقم (0) باستخدام الدالة ADC_Read(0) للحصول على نتيجة التحويل ذات العشر خانات ونسخها إلى المتغير ذات الستة عشر خانة temp_res .
# إرسال الثمانى خانات المنخفضة بالمتغير temp_res إلى الثمانى خانات الخاصة بالمنفذ PORTB مباشرة PORTB = temp_res ( محتويات المتغير بالبايت الأعلى لن تؤثر أو تتأثر ) .
PORTB = temp_res; // Send lower 8 bits to PORTB
# عمل إزاحة لمحتويات المتغير ذات الستة عشر خانة بمقدار بايت أى 8 خانات جهة اليمين وتكون النتيجة أن تزاح الخانتان الأولى والثانية فى البايت العلوى للمتغير (وهما باقى النتيجة التناظرية) إلى الخانتان الأولى والثانية فى البايت السفلى للمتغير , عندئذ يتم نسخ محتويات المتغير إلى المنفذ PORTD فيتم نقل الخانتان المتبقيتان من نتيجة التحويل إلى الخانة RD0 و RD1 لعرض النتيجة كاملة على
PORTB + (RD0+RD1)
# تكرار الحلقة إلى مالا نهاية
3- نهاية الدالة الرئيسية والبرنامج .

المحاكاة :












الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,832
نشاط [ F.Abdelaziz ]
قوة السمعة:
قديم 21-02-2012, 01:45 AM المشاركة 32   
افتراضي


كود البرنامج

كود:
unsigned int temp_res;
void main() {
  
  TRISA  = 0xFF;               // PORTA is input
  TRISB  = 0;                  // PORTC is output
  TRISD  = 0;                  // PORTB is output
  do {
    temp_res = ADC_Read(0);    // Get 10-bit results of AD conversion
    
    PORTB = temp_res;          // Send lower 8 bits to PORTB
    PORTD = temp_res >> 8;    // Send 2 most significant bits to PORTD
       } while(1);
}



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