الاثنين، 4 يونيو 2018

الموقتات الداخلية اردوينو - Internal Timers of Arduino

المكونات

اردوينو اونو او جينون اونو
دايود ضوئي
مقاومة 220 اوم

نظرة عامة
إذا كنت بحاجة إلى حساب وقت دقيق ، فأنت بحاجة إلى استخدام جهاز توقيت ، ولكن عادة ليس من السهل استخدام المؤقتات الداخلية لـ Arduino ، لذا أحاول في هذا البرنامج التعليمي شرح كيفية استخدامها بطريقة سهلة.

من الأهمية بمكان استخدام المؤقتات لأنك لا تستطيع فعل أي شيء أثناء وظيفة التأخير () ، ولكن باستخدام جهاز توقيت ، يمكنك القيام بكل شيء لأنه عندما تصل اللحظة ، تقوم بتنشيط المقاطعة.

أستخدم TIMER0 لأنه هو أسهل توقيت ، وربما أقوم في المستقبل بشرح الموقتات الأخرى.

كيف تعمل
أول شيء يجب أن تراه هو ورقة بيانات ATmega328P.
COUNTER BLOCK DIAGRAM
هذا هو مخطط كتلة العداد ، وبالنظر إلى هذا يمكنك فهم كيفية عمله.

يتلقى جهاز 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++;
}




ليست هناك تعليقات:

إرسال تعليق