المكونات
اردوينو اونو او جينون اونو
دايود ضوئي
مقاومة 220 اوم
نظرة عامة
إذا كنت بحاجة إلى حساب وقت دقيق ، فأنت بحاجة إلى استخدام جهاز توقيت ، ولكن عادة ليس من السهل استخدام المؤقتات الداخلية لـ Arduino ، لذا أحاول في هذا البرنامج التعليمي شرح كيفية استخدامها بطريقة سهلة.
من الأهمية بمكان استخدام المؤقتات لأنك لا تستطيع فعل أي شيء أثناء وظيفة التأخير () ، ولكن باستخدام جهاز توقيت ، يمكنك القيام بكل شيء لأنه عندما تصل اللحظة ، تقوم بتنشيط المقاطعة.
أستخدم TIMER0 لأنه هو أسهل توقيت ، وربما أقوم في المستقبل بشرح الموقتات الأخرى.
كيف تعمل
أول شيء يجب أن تراه هو ورقة بيانات ATmega328P.
هذا هو مخطط كتلة العداد ، وبالنظر إلى هذا يمكنك فهم كيفية عمله.
يتلقى جهاز metaler نبضًا من دورة الساعة ثم يمررها إلى Control Logic ، وبالتالي يزيد Log Control من سجل TCNTn بمقدار 1.
الآن يمكننا مقارنة قيمة TCNTn بقيمة محددة. عندما يصل سجل TCNTn إلى هذه القيمة ، ستعرف أنه يتم تمريره في وقت محدد.
هذه الطريقة تسمى وضع CTC لـ "Clear Timer on Compare". تتم مقارنة قيمة سجل TCNTn بسجل OCRn ، عندما تحدث مطابقة مقارنة TOVn يولد مقاطعة.
هناك شيء آخر مهم هو أداة التحضير ، مع هذا يمكنك إنشاء أقسام مختلفة من الساعة ، في الواقع 16MHz هو أكثر من اللازم ، ولكن بفضل وحدة التحضير ، يمكنك إنشاء بعض submultiples منه. هذا يعتمد على تكوين سجل TCCR0B.
شيء آخر مهم هو تحديد قيمة التسجيل OCRn لحساب وقت معين ، تحتاج إلى القليل من الرياضيات.
أعلم أن كل هذا يمكن أن يبدو معقدًا للغاية ولكني متأكد من أن الشفرة أدناه ستوضح كل سؤال.
في هذه الحالة ، نقوم بتنشيط طلب المقاطعة كل 0.1 ثانية.
TCCR0A|=(1<<WGM01); //Set the CTC mode
OCR0A=0xF9; //Set the value for 1ms
TIMSK0|=(1<<OCIE0A); //Set the interrupt request
sei(); //Enable interrupt
TCCR0B|=(1<<CS01); //Set the prescale 1/64 clock
TCCR0B|=(1<<CS00);
ISR(TIMER0_COMPA_vect){ //This is the interrupt request
}
من المهم تعيين أداة التحذير في النهاية لأنه بعد هذه التعليمات يبدأ الموقت في العد ، إذا احتجت إلى إيقافها ، يجب إعادة ضبط كل بتات TCCR0B.
/* This program turns on and off a LED on pin 13 each 1 second using an internal timer */ int timer=0; bool state=0; void setup() { pinMode(13,OUTPUT); TCCR0A=(1<<WGM01); //Set the CTC mode OCR0A=0xF9; //Value for ORC0A for 1ms TIMSK0|=(1<<OCIE0A); //Set the interrupt request sei(); //Enable interrupt TCCR0B|=(1<<CS01); //Set the prescale 1/64 clock TCCR0B|=(1<<CS00); } void loop() { //in this way you can count 1 second because the nterrupt request is each 1ms if(timer>=1000){ state=!state; timer=0; } digitalWrite(13,state); } ISR(TIMER0_COMPA_vect){ //This is the interrupt request timer++; }
ليست هناك تعليقات:
إرسال تعليق