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

   

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



3- تخصيص وإعداد معامل قسمة التردد Prescaler :
يخصص معامل القسمة عن طريق البرنامج إما للمؤقت Timer0 أو لمؤقت الحراسة . لتخصيص معامل القسمة للمؤقت Timer0 يجب مسح خانة التخصيص PSA .
البت PSA : بت تخصيص معامل القسمة Prescaler .
PSA=1 : تخصيص معامل القسمة لمؤقت الحراسة .
PSA=0 : تخصيص معامل القسمة لموديول المؤقت Timer0 .





قيمة معامل القسمة prescaler سوف تحدد كم عدد حواف المصدر سوف تؤدى إلى تزايد السجل TMR0 بواحد . يمكن إعداد معامل القسمة ليأخذ أحد قيم النسب الثمانية من 1:1 إلى 1:256 .
البتات PS2:PS0 : بتات اختيار معدل معامل القسمة Prescaler.

4- أعدادات مقاطعة المؤقت TIMER0
تمهيد:
سوف يأتى الوقت الذى تريد فيه أن يكرس المعالج إهتمامه , نتيجة لوقوع حدث ما , لمهمة أخرى (غير مهمته العادية التى يقوم بها) ويقوم بخدمتها مثل زيادة متغير عداد عندما يرتفع علم مقاطعة المؤقت T0IF نتيجة حدوث تجاوز overflow بسجل المؤقت TMR0 بدون الحاجة للتحقق من حالتها بصفة مستمرة .
يمكن تحقيق ذلك بسهولة عن طريق روتين خدمة المقاطعة “ISR”.
عندما تحدث المقاطعة , ويمكن أن يكون هناك أكثر من مقاطعة , يتوقف المعالج على الفور عما يفعل فى البرنامج العادى ويقفز إلى روتين خدمة المقاطعة لخدمة المقاطعة . بمجرد الانتهاء من تقديم هذه الخدمة يعود المعالج إلى ما كان يفعله فى البرنامج العادى قبل المقاطعة .

إعداد مقاطعة المؤقت TIMER0 :
يمكن الإعداد لتوليد مقاطعة عندما يتجاوز السجل TMR0 العد من 255 إلى 0 ويتم ذلك عن طريق سجل التحكم فى المقاطعة INTCON كما فى الشكل التالى :




يتم إعداد إى مقاطعة عن طريق ثلاثة بتات أساسية :
البت الأولى : "بت تمكين عموم المقاطعة" (GIE) , ويجب تمكينها GIE=1 لأن الحالة الافتراضية لها هى عدم التمكين GIE=0 . هذه البت تعمل كنوع من المفتاح الرئيسى الذى يجب رفعه (توصيله) set , GIE=1لتمكين قدرة الميكروكونترولر على المقاطعة . هذه البت سوف يتم مسحها clear "تلقائيا " GIE=0 كلما حدثت مقاطعة لضمان عدم حدوث أى مقاطعة أخرى خلال تنفيذ روتين خدمة المقاطعة . الحالة الافتراضية لهذه البت هى عدم التمكين GIE=0 .
لذلك بمجرد أن يكتمل روتين خدمة المقاطعة يجب جعل هذه البت GIE=1 مرة أخرى لتمكين المقاطعات فى المستقبل .
البت الثانية : " بت تمكين المقاطعة بالمؤقت Timer0 " (T0IE) , ويجب تمكينها T0IE=1 لأن الحالة الافتراضية لهذه البت هى عدم التمكين T0IE=0 .
البت الثالثة : " بت علم تجاوز المؤقت Timer0" (T0IF) . عند حدوث تجاوز Overflow تتحول هذه البت إلى الحالة المرتفعة T0IF=1 وتظل على هذه الحالة حتى يتم مسحها عن طريق بالبرنامج . هذه البت تحتاج لمسحها إذا كنا نريد مقاطعة أخرى T0IF=0.
ينصح باتباع الخطوات التالية عند إعداد أى مقاطعة وتتبع أى روتين خدمة المقاطعة :
1- مسح clear بت علم المقاطعة , وهى هنا T0IF=0 .
2- تمكين بت المقاطعة بالموديول المحدد , وهى هنا T0IE .
3- تمكين بت عموم المقاطعة GIE=1 .
الإعداد بهذه الخطوات سوف يضمن عدم حدوث المقاطعة خلال التهيئة للبدء والذى يتسبب فى نتائج غير متوقعة .
مثال لروتين خدمة مقاطعة المؤقت Timer0 :

كود:
void interrupt Timer0_ISR(void) { if (T0IE && T0IF) //are TMR0 interrupts enabled and //is the TMR0 interrupt flag set? { T0IF=0; //TMR0 interrupt flag must be cleared in software //to allow subsequent interrupts ++counter; //increment the counter variable by 1 }

اعلانات

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


مثال لروتين خدمة مقاطعة المؤقت Timer0 :

كود:
void interrupt Timer0_ISR(void) { if (T0IE && T0IF) //are TMR0 interrupts enabled and //is the TMR0 interrupt flag set? { T0IF=0; //TMR0 interrupt flag must be cleared in software //to allow subsequent interrupts ++counter; //increment the counter variable by 1 } }
مثال لبرنامج بسيط :
unsigned char counter; //counter variable to count //the number of TMR0 overflows /*---------------------------------------------------------- Subroutine: Timer0_ISR Parameters: none Returns: nothing This is the Interrupt Service Routine for Timer0 overflow interrupts. On TMR0 overflow the counter variable is incremented by 1 ----------------------------------------------------------*/ void interrupt Timer0_ISR(void) { if (T0IE && T0IF) //are TMR0 interrupts enabled and //is the TMR0 interrupt flag set? { T0IF=0; //TMR0 interrupt flag must be //cleared in software //to allow subsequent interrupts ++counter; //increment the counter variable //by 1 } }

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

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


تدريب على نظام عمل موديول المؤقت Timer0 كمؤقت Timer:
توليد تأخير زمنى بحوالى واحد ثانية باستخدام موديول Timer0 كمؤقت . تردد الكريستال 4 MHz لذلك يكون زمن دورة التعليمة هو واحد ميكروثانية 1s . لتوليد فترة تأخير بقيمة واحد ثانية يجب أن يعد المؤقت مليون دورة 1000000 . إذا استخدمنا "معامل قسمة" prescaler بالقيمة 256 فإن العد المطلوب يقل إلى 3906 . والآن إذا قمنا بتحميل سجل المؤقت TMR0 بقيمة ابتدائية قدرها 39 فإنه سوف يحدث له طفحان overflow بعد عدد من العد قدره 256-39 = 217 counts . ومن ثم يكون عدد مرات الطفحان اللازمة هى 18 مرة كما يلى :
3906 counts = 3906/217 = 18
بهذه الإعدادات بعد كل 18 طفحان لسجل المؤقت TMR0 (مع تحميله مسبقا بالقيمة 39) يكون قد إنقضى فترة زمنية قدرها واحد ثانية تقريبا . لمشاهدة النتيجة نجعل هذا الزمن يتسبب فى عمل وميض لليد .
الدائرة الكهربية :



البرنامج :
فى البداية نلقى نظرة على إعدادات سجل الخيارات وسجل التحكم فى المقاطعة :




كود:
/*PIC16F877A 1sec timer using TIMER0 Oscillator * 4MHz */ // Define LED connection sbit LED at RB0_bit; unsigned short Num;// overflow counter 0 .. 18 // Interrupt service routine void interrupt(){ Num ++; // Interrupt causes Num to be incremented by 1 if(Num == 18){ // after 1 sec period LED = ~LED; // Toggle LED every sec Num = 0; //clear again } TMR0 = 39; // TMR0 returns to its initial value INTCON.T0IF = 0; // Bit T0IF is cleared so that the interrupt could reoccur } void main() { TRISB = 0b00000000; // PORTB All Outputs LED = 0; Num = 0; // begin OPTION_REG = 0x07; // Prescaler (1:256) is assigned to the timer TMR0 TMR0 = 39; // Timer T0 counts from 39 to 255 INTCON = 0xA0; // Enable interrupt TMR0 and Global Interrupts do { // You main programs goes here } while(1); // infinite loop }


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


التدريب على نظام عمل موديول المؤقت Timer 0 كعداد counter :

سوف نستخدم موديول المؤقت Timer0 كعداد لعد نبضات الساعة الخارجية والتى تصل عن طريق الطرف RA4/T0CKI . نبضات الساعة الخارجية سوف يتم اشتقاقها من منبع التيار المتردد . منبع التيار المتردد المستخدم جيبى ذو جهد وتردد 220V, 50 Hz .
سوف يتم أولا تخفيض الجهد إلى إشارة بجهد وتردد 9 V, 50 Hz باستخدام محول تيار متردد . وقبل توصيل هذه الإشارة إلى الطرف T0CKI يجب تقويمها (توحيدها) وقطع (قص – تحديد) قيمة جهد الذروة عند +5V . الدائرة التالية تحول الجهد 9 V, 50 Hz AC voltage إلى موجة مربعة تقريبا بجهد +5V مناسبة كمدخل للعداد من الطرف T0CKI .


يتم توصيل الموجة المربعة إلى الطرف RA4/T0CKI للميكروكونترولر PIC16F877A . يبدأ السجل TMR0 من الصفر ويعد النبضات الواصلة فى فترة زمنية قدرها واحد ثانية . يتم عرض النتيجة على شاشة وحدة عرض LCD .عدد النبضات فى الثانية هو تردد الإشارة الواصلة وهو 50 Hz .
الدائرة الكهربية :




البرنامج :





كود:
/* Timer0 as a counter Oscillator * 4MHz */
// LCD module connections sbit LCD_RS at RB2_bit; sbit LCD_EN at RB3_bit; sbit LCD_D4 at RB4_bit; sbit LCD_D5 at RB5_bit; sbit LCD_D6 at RB6_bit; sbit LCD_D7 at RB7_bit; sbit LCD_RS_Direction at TRISB2_bit; sbit LCD_EN_Direction at TRISB3_bit; sbit LCD_D4_Direction at TRISB4_bit; sbit LCD_D5_Direction at TRISB5_bit; sbit LCD_D6_Direction at TRISB6_bit; sbit LCD_D7_Direction at TRISB7_bit; // End LCD module connections
// Define Messages char message1[] = "Frequency= Hz"; char *freq = "00";
void Display_Freq(unsigned int freq2write) { freq[0] = (freq2write/10)%10 + 48; // Extract tens digit-add 48 >> change to ASCII freq[1] = freq2write%10 + 48; // Extract ones digit add 48 >> change to ASCII // Display Frequency on LCD Lcd_Out(1, 11, freq); }
void main() {
TRISB = 0; // PORTB All Outputs TRISA = 0XFF; // INPUTS
OPTION_REG = 0b00101000; // Prescaler (1:1), TOCS =1 for counter mode
Lcd_Init(); // Initialize LCD Lcd_Cmd(_LCD_CLEAR); // CLEAR display Lcd_Cmd(_LCD_CURSOR_OFF); // Cursor off Lcd_Out(1,1,message1); // Write message1 in 1st row do {
TMR0=0; Delay_ms(1000); // Delay 1 Sec TIMER0 COUNT=Hz
Display_Freq(TMR0);
} while(1); // Infinite loop }


التعديل الأخير تم بواسطة : F.Abdelaziz بتاريخ 27-03-2012 الساعة 12:07 AM

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


برنامج متعدد المهام :
الدائرة الكهربية :



يقوم البرنامج بعمل مهمتين فى نفس الوقت , المهمة الظاهرة والعادية هى إصدار صوت من سماعة بصفة مستمرة , ومهمة فى الخلفية وهى وميض ليد عن طريق توليد نبضة كل واحد ثانية باستخدام موديول المؤقت Timer0 كمؤقت والمقاطعة بهذا المؤقت .
كود:
//STEP 1 Comments /*Name : LED & SOUNDER PICMICRO : PIC16F877A */ // STEP 2: definitions #define TEMP_LED 250 // Constant value , 250 ,defined as "TEMP_LED . #define LED PORTD.B0 //LED at pin RD0=PORTD.B0 defined as "LED" ' #define BUZZER PORTD.B1 //SOUNDER at pin RD1 = PORTD.B1 defined as "BUZZER" . #define T0IF INTCON.T0IF //Timer0 Interrupt Flag Bit INTCON.F0IF defined as "T0IF" // STEP 3 : Variable decleraion unsigned char TimerLed = 0; /*Variable : Char data type is an 8-bit so it can get to hold values up to 255 we need a maximum of 250,TEMP_LED , so it's fine */ //STEP 4 : Setting Function , Others void settings ( void ) // Setting Function { //PORTS Setting TRISD = 0 ; // PORTD as outputs // Setting the OPTION register OPTION_reg = 0b11000100; // bit 0 -> Prescaler Rate Select bit 0 >0 // bit 1 -> Prescaler Rate Select bit 0 >0 // bit 2 -> Prescaler Rate Select bit 0 >1 (3 bits 100= 1:32) // bit 3 -> Prescaler assigned to Timer0 >0 // bit 4 -> It does not matter >0 // bit 5 -> Timer0 Clock derived from internal clock cycle >0 // bit 6 -> It does not matter >1 // bit 7 -> pull-up resistors on port B disabled >1 // Set interrupt INTCON = 0b10100000; // bit 0 -> RBIF - Flag of interrupt ports B >0 // bit 1 -> INTF - Interrupt Flag of RB0/INT >0 // bit 2 -> T0IF - on Timer0 interrupt flag >0 // bit 3 -> RBIE, Interrupt on Port B disabled >0 // bit 4 -> INTE, Interrupt port RB0/INT disabled >0 // bit 5 -> TMR0IE, Interrupt on Timer0 enabled >1 // bit 6 -> PEIE, interrupt device disabled >0 // bit 7 -> GIE, Management Interrupt active >1 TMR0 = 100 ; // Set Timer0 to 100 , as initial value } //step 5 : main function void main ( ) { settings ( ) ; // Run Setting Function for ports and registers while ( 1 ) // run a loop { /*The only thing that I do during this endless cycle, is the reversal of the state of BUZZER each 200 micro-sec in order to generate a square wave of 2.5 KHz, which applied at the buzzer, in fact, causing it to emit a note at that frequency*/ Delay_us ( 200); BUZZER = 1; Delay_us ( 200); BUZZER = 0; }//end loop } // end main // STEP 6 : Interrupt Routine Service IRS /* This routine, having the attribute "interrupt" which called automatically whenever an interrupt occurs. in this routine , Timer0 will generate an interrupt every millisecond */ void interrupt ( ) { if( T0IF ) // Interrupt was caused by an overflow of Timer0? { TMR0 = 100 ; // Timer0 reloaded TimerLed ++; // Increment the timer for the blinking LED if( TimerLed >= TEMP_LED ) // If the time has passed TEMP_LED=250 { LED = LED^1 ; // Invert LED status to flash . TimerLed = 0 ; // Reloading the LED timer to start again } T0IF = 0 ; // Reset the interrupt flag of timer 0 } // end that occurred on Timer0 interrupt } // end of interrupt service routine


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


الدرس الثامن عشر :
برمجة وحدات العرض ذات السبع شرائح بطريقة الانتخاب Multiplexing

مقدمة :

تستخدم وحدات العرض ذات السبع شرائح 7-Sementلعرض أو إظهار الحروف أو الأرقام على شكل قطع مضيئة , المصدر الضوئى داخلى ويمكن رؤيته حتى فى الظلام حيث يوجد دايود مشع للضوء لكل قطعة .







لعرض الأرقام بين 0 و 9 يلزم سبع قطع أصطلح على تسميتها بالحروف A,B,C,D,E,F,G كما فى الشكل التالى :





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


طريقة إظهار الرقم أو الشكل:
لأظهار أى شكل ببساطة يتم توصيل on القطع المكونة له .
على سبيل المثال لعرض الرقم "1" يجب توصيل on لقطع (الليدات) B و C . ولعرض الرقم "2" يجب إضاءة القطع"A,B,D,E,G" , وبالمثل لأى شكل .

ملحوظة:
عرض الأرقام 6 و 9 يعتمد على دائرة التحكم وهى إما أن تكون بزيل (زائدة ) tail أو بدون (القطعة A للرقم 6 والقطعة D للرقم 9 ) بالطبع من المستحب إظهار هذا الجزء.


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




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


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

الكاثود المشترك أو الأنود المشترك :
لتقليل عدد الوصلات إلى العناصر فإن جميع الليدات تجمع من أحد طرفيها فى طرف مشترك . بذلك تقل الوصلات من 14 إلى 8 . فإذا تم تجميع أطراف الأنودات معا سمى الطرف أنود مشترك"common anode" أما إذا تم تجميع أطراف الكاثودات معا سمى الطرف كاثود مشترك "common cathode".
لذلك يوجد طريقتان لتغذية القطع (الليدات) . فإن كانت من نوع الأنود المشترك يتم توصيل الأنود المشترك إلى الجهد الموجب وكل قطعة تغذى بالجهد السالب على كاثودها . فى حالة الكاثود المشترك فإن الكاثود المشترك يوصل بطرف الجهد السالب ويم تغذية كل قطعة بالجهد الموجب على أنودها .


لأظهار الأعداد متعددة الخانات تستخدم وحدات عرض متعددة . فى هذه الحالة ينصح باستخدام المنتخبات وعمليات الإنتخاب multiplexingوذلك لسببين :
السبب الأول :
هو زيادة أخرى فى تقليل عدد الوصلات (تقل من 18 وصلة ألى 10 وصلات فى حالة عرض رقمين ومن 36 وصلة إلى 12 وصلة لعرض أربعة خانات بما فى ذلك العلامة العشرية ).



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



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