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

   

الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,832
نشاط [ F.Abdelaziz ]
قوة السمعة:
قديم 28-07-2017, 10:57 PM المشاركة 9   
افتراضي



موديول المؤقت Timer2 :
موديول المؤقت Timer2 هو مؤقت 8-bit بقاسم تردد سابق prescaler وقاسم تردد لاحق postscaler . هذا الموديول يمكن أن يستخدم مع موديول تعديل عرض النبضة PWM . السجل TMR2 هو سجل قابل للقراءة والكتابة ويتم مسحه عند أى إعادة Reset للجهاز .
ساعة الدخل (Fosc/4) لها خيار لقاسم تردد سابق بنسبة 1:1, 1:4,1:16 ، يتم اختيارها بواسطة بتات التحكم
T2CKPS1:T2CKPS0 (T2CON<1:0>) .
الموديول Timer2 له سجل فترة 8-bit يسمى PR2 .
يتم تزايد المؤقت Timer2 من 00h حتى يطابق السجل PR2 عندئذ يتم يعود reset إلى الصفر 00h عند دورة التزايد التالية . السجل PR2 هو سجل قابل للقراءة والكتابة . عند الإعادة Reset يتم تهيئة السجل PR2 بالقيمة FFh .
الخرج المطابق للسجل TMR2 يذهب خلال مقياس التردد اللاحق 4-bit postscaler ( يعطى مقياس 1:1 إلى 1:16 ) ، لتوليد المقاطعة بالمؤقت TMR2 ، بتحديد علم البت TMR2IF (PIR1<1>) .
يمكن غلق المؤقت Timer2 عن طريق مسح بت التحكم TMR2ON (T2CON<2>) ، لتقليل استهلاك القدرة .



الشكل التالى يبين سجل التحكم فى المؤقت Timer2 :





صيغة حساب زمن المقاطعة بالمؤقت Timer2 :

كود:
T = machine cycle * prescaler * postscaler * PR2
Machine cycle = 4 / Fosc
مثال :

كود:
Using a clock of 12Mhz, prescaler 1:16 and postscaler 1:16.
T = (4/12) * 16 * 16 * 255 = 21760us = 21.7ms
البرنامج :

كود:
void  interrupt () {
PORTB .F1 = ~ PORTB .F1 ; // reverses the state of pin RB1
PIR1 .TMR2IF = 0 ; // clears the interrupt flag
}
	
void  main () {
INTCON .GIE = 1 ; // enable global interruption
INTCON .PEIE = 1 ; // enable interruption of peripherals
PIE1 .TMR2IE = 1 ; // enable interrupt of TIMER2
T2CON = 0b01111111 ; // Postcaler 1:16, TIMER2 on and prescaler 1:16;
TRISB .F1 = 0 ; // define pin RB1 as output
PORTB .F1 = 0 ; / Sets pin RB1 as initial state at low level
PR2 = 255 ; // sets the value for PR2
}

اعلانات

الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,832
نشاط [ F.Abdelaziz ]
قوة السمعة:
قديم 28-07-2017, 11:25 PM المشاركة 10   
افتراضي


تدريب على المقاطعة باستخدام المؤقتات
الغرض
• استخدام المؤقتات TMR0, TMR1 , TMR2 .
• استخدام المقاطعات .
ربما لاحظت وجود عيب عند تنفيذ التأخير عند استخدام الحلقات.
في مثل تلك الحالة يكون الميكروكونترولر 'أسير' ولا يفعل شيئا. ببساطة ينتظر لحين مرور بعض الوقت.
هذا الوقت الضائع ترفا غير مقبول لذلك يجب تطبيق بعض الطرق الأخرى .

هل تتذكر موضوع المؤقتات ؟
هل تتذكر موضوع المقاطعات ؟
هذا التدريب يصنع رابط بينهما بطريقة عملية .

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




فكرة البرنامج :

• مطلوب توفير تأخير طويل بما يكفى لملاحظة التغيرات على المنفذ . يستخدم لذلك الموقت TMR0 مع تخصيص "معامل القسمة " prescaler لهذا الغرض.
• يتم إنشاء مقاطعة عند كل حدوث طفحان overflow بسجل المؤقت TMR0 فيتم تنفيذ روتين المقاطعة وفى كل مرة يقوم روتين المقاطعة تلقائيا بتزايد المتغير "cnt" بواحد .
• عندما تصل القيمة الموجودة بهذا المتغير إلى 400 يتم تزايد المنفذ port B بواحد وتظهر النتيجة على شكل إضاءة ليدات .
يتم تنفيذ الإجراء بأكمله من 'وراء الكواليس، مما يمكن الميكروكونترولر بعمل شىء آخر .

النتيجة :
إضاءة الليدات الثمانية المتصلة بالمنفذ PORT B بشكل يمثل الأرقام من 1 إلى 255 بالنظام الثنائى أى من 00000001 إلى 11111111 .



حساب زمن المقاطعة :

كود:
(4/8MHz) * prescaler * (255-96)
0.5 * 32 * 159 = 2544us = 2.544ms
2.544 * 400 times = 1 sec

البرنامج :

كود:
unsigned cnt;                 	// Define variable cnt

void interrupt() {
    cnt++;                    	// Interrupt causes cnt to be incremented by 1
    TMR0 = 96;               	// Timer TMR0 is returned its initial value
    INTCON = 0x20;           	// Bit T0IE is set, bit T0IF is cleared
}

void main() {

    OPTION_REG = 0x84;         // Prescaler is assigned to timer TMR0
    TRISB = 0;               	// All port B pins are configured as outputs
    PORTB = 0x0;              	// Reset port B

    TMR0 = 96;                	// Timer T0 counts from 96 to 255
    INTCON = 0xA0;            	// Enable interrupt TMR0

    cnt = 0;                  	// Variable cnt is assigned a 0
    
    do {                      	// Endless loop

        if (cnt == 400) {    	// Increment port B after 400 interrupts
            PORTB = PORTB++;  	// Increment number on port B by 1
            cnt = 0;          	// Reset variable cnt
        }

    } while(1);
}
المقاطعة باستخدام المؤقت TMR1 :
فى هذه الحالة يتم تمكين المقاطعة بعد حدوث طفحان فى المؤقت TMR1 والمكون من السجلين
(TMR1H, TMR1L). مزيج من تغيرات الخانات فى المنفذ PORT B يختلف عن البرنامج السابق حيث يتم إضاءة الأربعة خانات الأولى ثم بعد فترة التأخير تنطفأ ويتم إضاءة الأربع خانات الأخيرة وبعد فترة التأخير تتكرر العملية .



حسابات زمن المقاطعة :

كود:
TMR1H = 0x80; // Set initial value for timer TMR1
TMR1L = 0x00;  // TMR1 = 32768
(4/8MHz) * prescaler * (65535 – 32768 ) 
0.5 * 1 * 32767 = 16383.5 us = 16.384 ms
16.384 ms * 76 times = 1.2 sec
البرنامج :

كود:
unsigned short cnt; // Define variable cnt
void interrupt() {
cnt++ ; // Interrupt causes cnt to be incremented by 1
PIR1.TMR1IF = 0; // Reset bit TMR1IF
TMR1H = 0x80; // TMR1H and TMR1L timer registers are returned
TMR1L = 0x00; // their initial values
}
void main() {
PORTB = 0xF0; // Initial value of port B bits
TRISB = 0; // Port B pins are configured as outputs
T1CON = 1; // Set timer TMR1 , prescaler 1:1 
PIR1.TMR1IF = 0; // Reset bit TMR1IF
TMR1H = 0x80; // Set initial value for timer TMR1
TMR1L = 0x00;
PIE1.TMR1IE = 1; // Enable interrupt on overflow
cnt = 0; // Reset variable cnt
INTCON = 0xC0; // Enable interrupt (bits GIE and PEIE)
do { // Endless loop
if (cnt == 76) { // Change port B state after 76 interrupts
PORTB = ~PORTB; // Number in port B is inverted
cnt = 0; // Reset variable cnt
}
} while (1);
}

المقاطعة باستخدام المؤقت TMR2
• فى هذه الحالة تحدث المقاطعة بعد حدوث طفحان للمؤقت TMR2 .
• يتم إنشاء دالة جديدة تسمى Replace والتى لا تنتمى للغة السى وتستخدم فى عكس حالة أطراف المنفذ .
النتيجة إضاءة الليدات الفردية والانتظار لفترة ثم العكس أى إضاءة الليدات الزوجية والانتظار لفترة ثم تكرار العملية .



حسابات زمن المقاطعة :

كود:
(4/Fosc) * prescaler * postscaler * PR2
(4/8MHz) * 16 * 16 * 255 = 32640 us = 32.640 ms 
32.640 * 30 times = 1 sec
البرنامج :

كود:
unsigned short cnt; // Define variable cnt
void Replace() {
PORTB = ~PORTB; // Define new function ‘Replace’
} // Function inverts port state
void interrupt() {
if (PIR1.TMR2IF) { // If bit TMR2IF = 1,
cnt++ ; // Increment variable cnt by 1
PIR1.TMR2IF = 0;// Reset bit and
TMR2 = 0; // reset register TMR2
}
}
// main
void main() {
cnt = 0; // Reset variable cnt
PORTB = 0b10101010; // Logic state on port B pins
TRISB = 0; // All port B pins are configured as outputs
T2CON = 0xFF; // Set timer2, prescaler=16, postscaler=16,TMR2ON 
TMR2 = 0; // Initial value of timer register TMR2
PIE1.TMR2IE = 1; // Enable interrupt
INTCON = 0xC0; // Set bits GIE and PEIE
while (1) { // Endless loop
if (cnt > 30) { // Change PORTB after more than 30 interrupts
Replace(); // Function Replace inverts the port B state
cnt = 0; // Reset variable cnt
}
}
}

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

MJELEC
:: مهندس ::
تاريخ التسجيل: Aug 2017
المشاركات: 6
نشاط [ MJELEC ]
قوة السمعة:
قديم 09-08-2017, 11:31 AM المشاركة 11   
افتراضي


https://www.youtube.com/watch?v=d384wy9joIc TMR1


MJELEC
:: مهندس ::
تاريخ التسجيل: Aug 2017
المشاركات: 6
نشاط [ MJELEC ]
قوة السمعة:
قديم 09-08-2017, 11:32 AM المشاركة 12   
افتراضي


https://www.youtube.com/watch?v=5hL5e6zix5o TMR2


أشرف عبدالشافى
:: عضو .. ::
تاريخ التسجيل: Dec 2010
الدولة: مصر
المشاركات: 40
نشاط [ أشرف عبدالشافى ]
قوة السمعة:
قديم 10-08-2017, 01:00 AM المشاركة 13   
افتراضي


تسلم أيدك يابشمهندس



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