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

   

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



التدريب الثانى : إنشاء عداد بمفتاح ضاعط أو بحساس لعد الأشياء من “0” إلى “99” باستخدم وحدتى عرض سفن سيجمنت مع المترجم CCS C .



البرنامج :

كود:
/******************************************************
 Application : Button , Objects up counter 0-99 , 7-segment 2-units Display without transistors  
 *******************************************************/
#include <16f877.h>     // 
#use delay(clock=4000000)   // Gecikme fonksiyonu için kullan‎lan osilatِr frekans‎ belirtiliyor

#define   display_1   pin_a0      //display unit-1 comm-catode , from lift i.e. for Tens
#define   display_2   pin_a1      // display unit-2 comm-catode , for Units
#define   buton      pin_a2      // use button as pin_a2 

char units=0, tens=0, count=0;       // declare char variables

// 10 Data values for common cathode display 0,1,2....9
const int digit[10]={0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7C, 0x07, 0x7F, 0x6F};

/********* main program********/

void main ()
{
   
   output_high(display_1);      // initially disable display unit-1 , high , and ...
   output_high(display_2);      // initially disable display unit-2 , high

   while(true)
   {
      ////////////////////calculations ///////////////////
         units=count%10;  // get units digit by Calculating the remainder of cout/10 
         tens=count/10;   // get ten digit by calculated count/10
      ////////////////////Display Units ////////////////////////
         output_low(display_2);  // enable display uint-2  ,units on  
         output_b(digit[units]); // send display data information , units 
         delay_ms(5);             // small delay
         output_high(display_2);   // disable display uint-2 , units off 
        /////////////////////////Display Tens//////////////////////// 
       output_low(display_1);  // enable display uint-1 , tens on 
         output_b(digit[tens]);  // send display data information 
         delay_ms(5);             // small delay
       output_high(display_1);   // disable display uint-1 , tens off 
      ////////////////////////test button //////////////////////////////////
       
         if (input(buton))  // If The count up button is pressed >>>>
         {
            delay_ms(10);   // 1- button debounce 

            count++;         // 2- counter variable increases by 1
         ////////////////////special cases /////////////////////
            if (count==100)  // and if count reach 100 , then rest it 
              count=0;      //reset count variable 
        ///////////////////////and >>>>>>>>>>//////////////////////////
            while(input(buton))  // Processing cycle until the button is released , no increasing 
            {
               output_low(display_2);  // enable unit 
               output_b(digit[units]); // display unuts
               delay_ms(5);             // small delay 
               output_high(display_2);   // disable units 
            
               output_low(display_1);  // enable tens 
               output_b(digit[tens]);  // display tens 
               delay_ms(5);             // small delay 
               output_high(display_1);   // disable tens 
            }
         }
   }
}

http://fathallaabdelaziz.forumarabia.com/

اعلانات

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


التدريب الثالث : التدريب الثانى : إنشاء عداد بمفتاح ضاعط أو بحساس لعد الأشياء من “0” إلى “99” باستخدم وحدتى عرض سفن سيجمنت مع استخدام ترانزستورات ومع المترجم CCS C .

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




البرنامج :

كود:
/******************************************************
 Application : Button , Objects up counter 0-99 , 7-segment 2-units Display with transistors  
 *******************************************************/
#include <16f877.h>     // 
#use delay(clock=4000000)   // Gecikme fonksiyonu için kullan‎lan osilatِr frekans‎ belirtiliyor

#define   display_1   pin_a0      //display unit-1 comm-catode , from lift i.e. for Tens
#define   display_2   pin_a1      // display unit-2 comm-catode , for Units
#define   buton      pin_a2      // use button as pin_a2 

char units=0, tens=0, count=0;       // declare char variables

// 10 Data values for common cathode display 0,1,2....9
const int digit[10]={0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7C, 0x07, 0x7F, 0x6F};

/********* main program********/

void main ()
{
   
   output_low(display_1);      // initially disable display unit-1 , high , and ...
   output_low(display_2);      // initially disable display unit-2 , high

   while(true)
   {
      ////////////////////calculations ///////////////////
         units=count%10;  // get units digit by Calculating the remainder of cout/10 
         tens=count/10;   // get ten digit by calculated count/10
      ////////////////////Display Units ////////////////////////
         output_high(display_2);  // enable display uint-2  ,units on  
         output_b(digit[units]); // send display data information , units 
         delay_ms(5);             // small delay
         output_low(display_2);   // disable display uint-2 , units off 
        /////////////////////////Display Tens//////////////////////// 
       output_high(display_1);  // enable display uint-1 , tens on 
         output_b(digit[tens]);  // send display data information 
         delay_ms(5);             // small delay
       output_low(display_1);   // disable display uint-1 , tens off 
      ////////////////////////test button //////////////////////////////////
       
         if (input(buton))  // If The count up button is pressed >>>>
         {
            delay_ms(10);   // 1- button debounce 

            count++;         // 2- counter variable increases by 1
         ////////////////////special cases /////////////////////
            if (count==100)  // and if count reach 100 , then rest it 
              count=0;      //reset count variable 
        ///////////////////////and >>>>>>>>>>//////////////////////////
            while(input(buton))  // Processing cycle until the button is released , no increasing 
            {
               output_high(display_2);  // enable unit 
               output_b(digit[units]); // display unuts
               delay_ms(5);             // small delay 
               output_low(display_2);   // disable units 
            
               output_high(display_1);  // enable tens 
               output_b(digit[tens]);  // display tens 
               delay_ms(5);             // small delay 
               output_low(display_1);   // disable tens 
            }
         }
   }
}

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

الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,832
نشاط [ F.Abdelaziz ]
قوة السمعة:
قديم 06-05-2015, 11:51 PM المشاركة 67   
افتراضي التدريب الرابع : إنشاء عداد تصاعدى تنازلى من “0” إلى “99” باستخدم وحدتى عرض سفن سيجمن


التدريب الرابع : إنشاء عداد تصاعدى تنازلى من “0” إلى “99” باستخدم وحدتى عرض سفن سيجمنت مع الدائرة المتكاملة 7448 وبدون استخدام ترانزستورات ومع المترجم CCS C .
الدائرة الكهربية :





البرنامج :

كود:
/******************************************************
 UP/ Down Counter 0-99 using 7448 without transistors
*******************************************************/
#include <16f877.h>     //
#use delay(clock=4000000)   // 

#define    increase      pin_a0   //  use increase instead of pin_a0 
#define   decrease       pin_a1   // use decrease instead of pin_a1 

char units=0, tens=0, count=0; // int variables, declaration 
// Data values for common cathode display
const int digit[10]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09};//

/********* main function********/

void main ()
{
  
   while(true)     // endless loop
   {
       output_b(digit[units]|(0b00100000)); // enable units display , disable tens display , send units data using bit maske by OR 
       delay_ms(5);                          // short delay
       ////////////////////////////////////////////////////////////////
      output_b(digit[tens]|(0b00010000));  // enable tens display , disable units display , send tens data using bit maske by OR 
       delay_ms(5);                          // short delay
      ////////////////increase button //////////////////////////////////////////
       if (input( increase))   // test if increase button is pressed
       {
      /////////////////////increment //////////////////////
          count++;    // count value is increased by 1
      ///////////////////calculations //////////////////////////
          units=count%10;;         // Calculating units digit
          tens=count/10;           // Calculating tens digit
      //////////////test button condition///////////////////////////////////
          while(input( increase))     // Wait until increase button is not pressed 
          {
             output_b(digit[units]|(0b00100000)); // enable units display , disable tens display , send units data using bit maske by OR 
             delay_ms(5);                          // short delay
             //////////////////////////////////////
          output_b(digit[tens]|(0b00010000));  // enable tens display , disable units display , send tens data using bit maske by OR 
             delay_ms(5);                          // short delay
          }
        }
      /////////////////decrease button///////////////////////
      
      if (input(decrease)&&(count!=0))   // test if decrease button is pressed AND count not equal zero 
       {
         /////////////////////////////////////////////
          count--;     // count value is decreased by 1
      //////////////////////calculations ////////////////////////////
         units=count%10;;         // Calculating units digit
         tens=count/10;           // Calculating tens digit
         //////////////////est button condition////////////////
          while(input(decrease))      // Wait until decrease button is not pressed
          {
             output_b(digit[units]|(0b00100000)); //  enable units display , disable tens display , send units data using bit maske by OR 
             delay_ms(5);                          // short delay
             output_b(digit[tens]|(0b00010000));  // enable tens display , disable units display , send tens data using bit maske by OR 
             delay_ms(5);                          // short delay

          }
       }
       if (count==100)   // if ount value is 100 >>> reset it to zero 
          count=0;
    }
}
http://fathallaabdelaziz.forumarabia.com/


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


تدريبات على وحدات العرض السفن سجمنت 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
      }
   }
}
استاذي المحترم

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

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

#include <16f877a.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
   {
      a:   
    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
        
        if(i==15)
            {
            for(i=15;i>=0;i--)
               {
                output_b(digit[i]);
                delay_ms(500);
                if(i==0)goto a;
               }
            
            }
      }
   }  
 }
اشكرك مجددا


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


اصبحت الدروس تتدرج اكتر في الصعوبة

ارجو ان اقدر على مواكبتك بالدروس

كل التوفيق والنجاح


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


اصبحت الدروس تتدرج اكتر في الصعوبة

ارجو ان اقدر على مواكبتك بالدروس

كل التوفيق والنجاح
أخى الكريم شكرا جزيلا لك

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


الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,832
نشاط [ F.Abdelaziz ]
قوة السمعة:
قديم 19-05-2015, 05:38 PM المشاركة 71   
افتراضي الموديول CCP ووضع تعديل عرض النبضة PWM مع المترجم CCS C - البرنامج الأساسى :


الموديول CCP ووضع تعديل عرض النبضة PWM مع المترجم CCS C - البرنامج الأساسى :

يمكن استخدام الموديول CCP ،فى وضع تعديل عرض النبضة PWM ، لتوليد إشارة خرج تتغير مع بالزمن ، وهو ما يوفر شكل موجى لنبضة الخرج مع إمكانية ضبط الفترة المرتفعة بالنسبة للفترة المنخفضة . حالة الخرج المرتفع ، تسمى دورة الخدمة duty cycle (وهى الجزء الفعال المؤثر للشكل الموجى ككل ) ، يتم التعبير عنها كنسبة مئوية من الفترة الكلية لشكل موجة النبضة ( الحالة المرتفعة والحالة المنخفضة ) . على سبيل المثال ، دورة خدمة بالقيمة “50%” تعطى موجة خرج لها فترة مرتفعة مساوية للفترة المنخفضة [(Th / Th+Tl) * 100] .




البرنامج التالى يبين البرنامج الأساسى لخطوات إعداد setup وتعيين set وضع PWM :

كود:
// Pulse Width Modulation Program Source Code
// PWM output, MCU clock = 4 MHz

#include <16F877A.h>

void main()
{
While(true)
	{
setup_ccp1(ccp_pwm); 			// Select timer and mode
set_pwm1_duty(500); 			// Set on time
setup_timer_2(T2_DIV_BY_16,248,1); 	// Clock rate & output period
}
}
يوفر المترجم CCS C الدوال التالية :
الدالة setup_ccp1() :
تحدد وضع تشغيل الموديول CCP .

الدالة setup_timer_2() :
تتحكم فى الفترة الزمنية الكلية لموجة تعديل عرض النبضة PWM ، هذه الدالة لها 3 وسائط arguments أو بارامترات:
• الوسيط الأول يحدد معامل نسبة القسمة السابق للمؤقت prescaler ، وهى فى هذه الحالة “16” .
• الوسيط الثانى يعطى الفترة الزمنية للخرج من “1” إلى “255” مرة ضعف الفترة الزمنية لساعة الدخل .
• الوسيط الثالث يحدد معامل نسبة القسمة اللاحق postscaler .

الدالة set_pwm1_duty() :
تحدد دورة الخدمة . القيمة المعطاة تكون فى المدى “0-1023” ، كقيمة ابتدائية لعداد 10 بت . القيمة “500” تعطى نسبة فترة مرتفعة إلى فترة منخفضة حوالى 50% .

يتم توليد موجة PWM بشكل مستمر بعد إتمام الإعداد . قيم دورة الخدمة (500) ، الفترة الكلية (248) المستخدمة فى هذا البرنامج تنتج خرج على الطرف CCP1 بتردد 250 Hz (4 ms) ، وبنسبة زمن ارتفاع إلى زمن انخفاض 50% مع ساعة ميكروكونترولر بتردد 4-MHz .

طريقة حساب الفترة الزمنية الكلية :
يتم تشغيل المؤقت Timer2 من ساعة التعليمات عند 1 MHz (Fosc/4) . بعد المقياس السابق ، تكون الفترة الزمنية للساعة 16 μ s ويقوم المؤقت بالعد حتى “248” ، ويحدث تجاوز overflow عند حوالى 16 x 248 x 3968 μ s أى حوالى 4 ms ( لقد تم استخدام الرقم 248 بدلا من الرقم 250 لضبط الزمن ) . قيمة المقياس اللاحق تم تحديدها بواحد “1” .






الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,832
نشاط [ F.Abdelaziz ]
قوة السمعة:
قديم 19-05-2015, 09:01 PM المشاركة 72   
افتراضي استخدام وضع تعديل عرض النبضات PWM فى توليد نبضات متغيرة العرض :


استخدام وضع تعديل عرض النبضات PWM فى توليد نبضات متغيرة العرض :
الدائرة الكهربية :



البرنامج :

كود:
//Variable Duty Cycle  Pulses 
#include <16F877A.h>
#use delay(clock=4000000)
int16 i; // variable for loop counter 0-1024
void main() 
{
setup_timer_2(T2_DIV_BY_1,224,1);   //1- setup timer2 for Clock rate & output period
setup_ccp1(CCP_PWM);               //2- etup  CCP1 for PWM mode 
   while(true)
   {
      for (i=0;i<1024;i++)
      {
         set_pwm1_duty(i);   //4- Set on time , Duty cycle  
         delay_ms(25);
      }
   }
}



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