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

   

الصورة الرمزية Sallam
Sallam
:: مهندس متميز ::
تاريخ التسجيل: Mar 2006
الدولة: Syria
المشاركات: 515
نشاط [ Sallam ]
قوة السمعة:
قديم 05-05-2015, 02:18 AM المشاركة 57   
افتراضي



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

كود:
// Lesson1-EX6 Repeat loop a set number of times
#include <16F877A.h>
#use delay (clock = 4000000)

void main()
{
   int x;
   while(input(PIN_C0)) { } ; // Wait until switch closed

   for (x = 0; x < 5; x ++) 		// For loop conditions
      {
         output_high(PIN_D0); // Flash sequence
        delay_ms(500);
       output_low(PIN_D0);
      delay_ms(500);
     }

     while(TRUE); // Wait for reset
}


يتم تعيين متغير تحكم الحلقة (x) فى البداية بالقيمة صفر ، وتستمر الحلقة طالما أن while هذه القيمة تكون أقل من 5 . يتم تزايد قيمة (x) فى كل مرة تتكرر تدور فيها الحلقة .
التأثير هو وميض الخرج خمس مرات ويتوقف البرنامج عند نهايته ولا يتكرر .
يتضمن البرنامج أيضا استخدام حلقة while للانتظار (طالما أن المفتاح مفتوح)، من أجل غلق المفتاح قبل أن يبدأ تسلسل الوميض . بالإضافة إلى ذلك ، فإن حلقة while(TRUE) الغير مشروطة تنهى البرنامج ، وتمنع تنفيذ البرنامج من التشغيل فى مواقع غير محددة بعد نهاية التسلسل . لهذا ينصح بذلك كلما لا يتم تشغيل البرنامج حلقة مستمرة .
لاحظ أن استخدام الأقواس الفارغة التى لا تحتوى على كود ، تكون اختيارية .

رابط الملفات :
http://www.mediafire.com/download/92...esson1-EX6.zip


http://fathallaabdelaziz.forumarabia.com/t128-topic#332


قمت باجراء تعديل بسيط على الكود بحيث يقوم بالعد 5 مرات في كل ضغطة ويتم تسجيل عدد الضغات على البورت B
وهذا هو الكود أرجو المراجعة:
كود:
#include <16F877A.h>
#use delay(clock=4000000)
void main()
{
   int x,y;                // Declare variable
   output_D(0);             // Clear all outputs
   output_b(0);
while(1)
 {
  while(input(pin_c0)){};     // Wait until switch closed
    for(x=0; x<5; x++)
      {
      output_high(pin_d0);
      delay_ms(500);
      output_low(pin_d0);
      delay_ms(500);
      }y++;
      output_b(y);
     //while(1);  // wait for reset 
 }
}

اعلانات

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


قمت باجراء تعديل بسيط على الكود بحيث يقوم بالعد 5 مرات في كل ضغطة ويتم تسجيل عدد الضغات على البورت B
وهذا هو الكود أرجو المراجعة:
كود:
#include <16F877A.h>
#use delay(clock=4000000)
void main()
{
   int x,y;                // Declare variable
   output_D(0);             // Clear all outputs
   output_b(0);
while(1)
 {
  while(input(pin_c0)){};     // Wait until switch closed
    for(x=0; x<5; x++)
      {
      output_high(pin_d0);
      delay_ms(500);
      output_low(pin_d0);
      delay_ms(500);
      }y++;
      output_b(y);
     //while(1);  // wait for reset 
 }
}
شكرا على المشاركة المثمرة ، واسمح لى حتى يستفيد المتابعين أن أقوم بشرح ملخص لما يقوم به البرنامج الخاص بك :
يتم تنفيذ البرنامج بدءا من الدالة main بالتتابع (التسلسل) سطر تلو السطر ما لم يكن هناك أمر بالتفرع أو المقاطعة . فبعد التعريفات يدخل البرنامج إلى الحلقة while(1) والتى تتكرر بشكل دائم كلما انتهى تنفيذ عبارتها .
• فى البداية يجد المترجم حلقة while المشروطة ، فيختبر الشرط input(pin_c0) فيقوم بقراءة ، فإذا كان المفتاح مفتوح كان الطرف C0 مرتفع ويتحقق شرط الحلقة true ويتم تنفيذ ما بين قوسيها {} ، وهو فى هذه الحالة "فراغ" أى لن يتم التقدم إلى السطر التالى إلا بعد أن يتم الضغط على المفتاح وعندها يصبح الشرط خطأ false فيتقدم تنفيذ البرنامج للسطر الذى يلى هذه الحلقة مباشرة .
• يجد المترجم حلقة for ويفهم المطلوب : عداد الحلقة هو المتغير x وقيمته الابتدائية هى الصفر – يتم تكرار عبارات الحلقة خمس مرات – فى نهاية تنفيذ كل تكرار تيتم تزايد عداد الحلقة بواحد ، وبعد كل تكرار يتم اختبار العداد فإذا انتهى عدد التكرارات الخمسة يخرج تنفيذ البرنامج إلى السطر الذى يلى هذه الحلقة مباشرة .
• نتيجة لذلك يتم تكرار العبارات : إضاءة الليد d0 لمدة نصف دقيقة ، ثم فصله لمدة نصف دقيقة ، وتلقائيا يتم تزايد x بواحد ، ويتكرر ذلك لخمس مرات (خمس ومضات) بعد نهاية الخمس ومضات (بعد 5 دقائق) تتزايد x لتكون x=5 وعندها يذهب تنفيذ البرنامج إلى بداية الحلقة فيجد أن الشرط أصبح false فيخرج يخرج تنفيذ البرنامج متخطيا حلقة for إلى السطر الذى يليها مباشرة ، حيث يجد هناك العبارة (y++ تزايد المتغير y بواحد .
• المتغير “y” لم يتم تعيين القيمة الابتدائية له فلا يوجد ضمان أكيد لقيمته السابقة حتى نضمن القيمة اللاحقة ،لذلك يجب تعيين القيمة الابتدائية له ، وعلى فرض أن القيمة الابتدائية بصفر فإنه سوف يتزايد بواحد ليصبح بعد 5 دقائق بواحد .
• السطر الذى يليه يخصص قيمة y إلى المنفذ portb ، إذا بعد 5 دقائق يصبح الطرف B0 مرتفع .
• بعد ذلك نصل إلى نهاية الحلقة الغير منتهية ، فيقفز تنفيذ البرنامج إلى بدايتها من جديد ، حيث يجب حلقة while المشروطة :
فإذا كان المفتاح مفتوح يتوقف تنفيذ البرنامج عندها وتكون النتيجة خمس ومضات على D0 وتنتهى تماما وبعدها يتن إضاءة الليد B0 فقط . وعند الضغط على المفتاح مرة أخرى تتكرر العملية ونحصل على المنفذ portb عدد مرات الضغط على المفتاح وهو نفس عدد مرات تكرار حلقة for .
إما إذا كان المفتاح ما زال مغلقا ، تتكرر العملية وتكون النتيجة ، خمس ومضات على D0 وزيادة خرج المنفذ PORTB بواحد فى كل مرة . فى أى لحظة يتم فيها فصل المفتاح سوف يتم تنفيذ العملية لآخر مرة بعدها يكون الوميض قد توقف ونشاهد عدد مرات تكرار حلقة for ككل على المنفذ PORTB فى شكل ثنائى .



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

الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,832
نشاط [ F.Abdelaziz ]
قوة السمعة:
قديم 05-05-2015, 05:12 PM المشاركة 59   
افتراضي الاتصال بين الميكروكونترولر PIC والكمبيوتر PC والمحاكاة ببرنامج ISIS مع المترجم CCS C


الاتصال بين الميكروكونترولر PIC والكمبيوتر PC والمحاكاة ببرنامج ISIS مع المترجم CCS C







البرنامج :

كود:
/******************************************************
     PIC16F877 RS232 Serial Communication Application
*******************************************************/
#include <16f877.h>     // 
#use delay (clock=4000000) // 
#define use_portb_lcd TRUE   // 
#include <lcd.c>   // 
#use rs232 (baud=9600, xmit=pin_C6, rcv=pin_C7, parity=N, stop=1) 
// RS232 protocol 9600 bit/s
// TX, RX pins as defined , C6,C7 
// no parity bit , stop 1 bit

char keyboard[80];  // defined an array name keyboard with 80-element 

#int_rda // Receive data available Interrupt  
void rda_isr () // When Receive data available do :
{
   disable_interrupts(int_rda); // Disables the specified interrupt
   output_high(pin_c5);  // Set pin RC5 to logic 1 
   gets(keyboard); 
   //gets (string), Reads characters (using GETC()) into the string 
   //until a RETURN (value 13) is encountered 
   // Read or Receive array string "keyboard" .
   printf("\n\rYou wrote the text>  %s\n",keyboard); 
   // new line , new row , send the string expressions and array keyboard via RS232,then new line 
   printf(lcd_putc,"\f%s",keyboard);  //Clear LCD and display keyboard array string .
   output_low(pin_c5); // Set pin RC5 to logic 0
   printf("\n\rEnter the text from the keyboard and enter key to exit>"); // new line,from start ,send the text string via RS232
}

/********* Main function********/

void main ( )
{
   
   output_low(pin_c5); // Initially RC5 LED => off and on in ISR 
   lcd_init();   // 

   printf("\r**************** Hello *********************"); //New lines end specified text via RS232 .
   printf("\n\rWhen you enter data from the keyboard will appear on the LCD\n\n"); //new line,from start send specified text via RS232 .
   printf("\n\rEnter the text from the keyboard and enter key to exit>"); //new line,from start send specified text via RS232.
   
   enable_interrupts(GLOBAL);  // enable all interrupts 

   while(1) // endless loop
   {
      enable_interrupts(int_rda); // enable rda interrupt 
   }
}
http://fathallaabdelaziz.forumarabia.com/



الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,832
نشاط [ F.Abdelaziz ]
قوة السمعة:
قديم 06-05-2015, 01:39 AM المشاركة 60   
افتراضي قياس جهد تناظرى وتحويله من تناظرى إلى رقمى وإلى جهد وعرضه على وحدة LCD وإرساله للعرض


قياس جهد تناظرى وتحويله من تناظرى إلى رقمى وإلى جهد وعرضه على وحدة LCD وإرساله للعرض على الكمبيوتر






البرنامج :

كود:
#include <16F877.h>
#device adc=10
#use delay(clock=4000000)
#include <LCD.C>
#use rs232(baud=9600, xmit=pin_c6, rcv=pin_c7, bits=8, parity=N)
//#define use_lcd_portb true

void main() {
   int16 q;
   float p;
   
 
  setup_psp(PSP_DISABLED);        // PSP 
  setup_timer_1(T1_DISABLED);     // T1 
  setup_timer_2(T2_DISABLED,0,1); // T2 
  setup_CCP1(CCP_OFF);            // CCP1 
  setup_CCP2(CCP_OFF);            // CCP2 
 
   setup_adc_ports(AN0);
   setup_adc(ADC_CLOCK_INTERNAL);//enables the a/d module and sets the clock to internal adc clock
     
   lcd_init();
   for (;;) {
      set_adc_channel(0);//the next read_adc call will read channel 0
      delay_us(10);//a small delay is required after setting the channel
      
      q = read_adc();//starts the conversion and reads the result
      
      p = 5.0 * q / 1024.0;
      //for LCD
      printf(lcd_putc, "\fADC = %4ld", q);
      printf(lcd_putc, "\nVoltage = %01.2fV", p);
      //for RS232
      printf("ADC = %4ld ", q);
      printf("Voltage = %01.2fV\r", p);  // 
      
      delay_ms(200);
      }
}





التعديل الأخير تم بواسطة : F.Abdelaziz بتاريخ 06-05-2015 الساعة 01:43 AM

الصورة الرمزية Sallam
Sallam
:: مهندس متميز ::
تاريخ التسجيل: Mar 2006
الدولة: Syria
المشاركات: 515
نشاط [ Sallam ]
قوة السمعة:
قديم 06-05-2015, 02:11 AM المشاركة 61   
افتراضي


تدريب : برنامج إنشاء ساعة بسيطة قابلة للإعداد (الضبط) باستخدام وحدة العرض LCD :

البرنامج :

كود:
//LCD Module Connections
//#define LCD_ENABLE_PIN  PIN_D0 
//#define LCD_RS_PIN      PIN_D1
//#define LCD_RW_PIN      PIN_D2 
//#define LCD_DATA4       PIN_D4                                    
//#define LCD_DATA5       PIN_D5                                    
//#define LCD_DATA6       PIN_D6                           
//#define LCD_DATA7       PIN_D7
//End LCD Module Connections

#include <16f877a.h>
#use delay (clock = 20000000) 
#include <lcd.c>


void main () // main function
   {
   int HOUR=0, MINUTE = 0, SECOND = 0;
   lcd_init();
   while (TRUE) // to repeat block. Infinite loop.
     {
     SECOND ++;
     if (SECOND> 59 || input (PIN_B0))
        {
        SECOND = 0;
        MINUTE ++;
        }
     if (MINUTE> 59 || input (PIN_B1))
        {
        MINUTE = 0;
        HOUR ++;
        }
     if (HOUR> 23) HOUR = 0;
     printf (lcd_putc, "\f%02u:%02u:%02u", HOUR, MINUTE, SECOND);
     delay_ms (1000);
     }
   }
النتيجة :





تحية من كل القلب للأستاذ فتح الله عبد العزيز

حقا دروس رائعة ومفهومة وواضحة جدا

اعمل على تطبيق وفهم كل مثال قبل الانتقال للتالي

ومن خلال التطبيق تظهر لدي بعض الملاحظات اشاركها مع حضرتك

في برنامج تدريب الساعة وجدت ان اضيف في بداية البرنامج وقبل حلقة while

تأخير زمني delay_ms(1000);
السبب ليحسب زمن ثانية قبل ان تعرضها الشاشة لأول مرة
void main()
{
int hour=0, minute=0, second=0;
lcd_init();
delay_ms(1000);
while(true)
{
second++;
if(second>59 || input(pin_b0))
فهل ما قمت به من تعديل صحيح او لا ؟

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


التعديل الأخير تم بواسطة : Sallam بتاريخ 06-05-2015 الساعة 02:15 AM

الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,832
نشاط [ F.Abdelaziz ]
قوة السمعة:
قديم 06-05-2015, 03:22 PM المشاركة 62   
افتراضي


تحية من كل القلب للأستاذ فتح الله عبد العزيز

حقا دروس رائعة ومفهومة وواضحة جدا

اعمل على تطبيق وفهم كل مثال قبل الانتقال للتالي

ومن خلال التطبيق تظهر لدي بعض الملاحظات اشاركها مع حضرتك

في برنامج تدريب الساعة وجدت ان اضيف في بداية البرنامج وقبل حلقة while

تأخير زمني delay_ms(1000);
السبب ليحسب زمن ثانية قبل ان تعرضها الشاشة لأول مرة

فهل ما قمت به من تعديل صحيح او لا ؟

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

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


الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,832
نشاط [ F.Abdelaziz ]
قوة السمعة:
قديم 06-05-2015, 04:41 PM المشاركة 63   
افتراضي تدريبات على وحدات العرض السفن سجمنت 7-Segmentمع المترجم CCS C التدريب الأول :


تدريبات على وحدات العرض السفن سجمنت 7-Segmentمع المترجم CCS C التدريب الأول :
تدريب بسيط لإنشاء عداد من “0” إلى “F” وهى تمثل نظام الأعداد السداسى عشر .
الدائرة الكهربية :




البرنامج :

كود:
/******************************************************
 Application Name: Display Counter 0,1,2,3.....F 
 *******************************************************/

#include <16f877.h>     // Microcontroller device 
#use delay(clock=4000000)   // Oscillator frequency used for delay function

int8 i;  // Declare 8-bit variable named i .

// Data values for common cathode 7segment display unit 0 , 1 , ...., F
const int digit[16]={0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7C, 0x07, 0x7F, 0x6F, 0x77, 0x7C, 0x39, 0x5E, 0x79, 0x71};

/********* MAIN FUNCTION ********/

void main ()
{
   
   output_b(0x00);  // Port B Initial value = 0 
   output_a(0x02);  // Pin RA1 at logic 1 , the other pins at logic 0 , cathode on 

   while(true)   // infinite loop
   {
      for(i=0;i<=15;i++) // Repeat 16 times , for loop
      {
         output_b(digit[i]); //Eeach time :Array elemene digits [i] value Send to port B
         delay_ms(500);      // Wait for 500 ms
      }
   }
}


التعديل الأخير تم بواسطة : F.Abdelaziz بتاريخ 06-05-2015 الساعة 04:48 PM

الصورة الرمزية Sallam
Sallam
:: مهندس متميز ::
تاريخ التسجيل: Mar 2006
الدولة: Syria
المشاركات: 515
نشاط [ Sallam ]
قوة السمعة:
قديم 06-05-2015, 07:23 PM المشاركة 64   
x4


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

مع تمنياتى بدوام التوفيق
شكرا لردك اللطيف

انا اتوق لتكملة دروسك القيّمة ولكن فهمي لدروسك يجعلني اتساءل عن تفاصيل كثيرة رغبة في وصولي لفهم الفكرة والمثال الذي تقدمهز

أنا حقيقة مستمتع بدروسك وأحاول متابعتها يوميا وحسب وضع الكهرباء عندنا

لك كل الشكر والتقدير.

أخوك سلام



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