সিটিসি মোডে টাইমার 3 সেট করা - সারো লাইব্রেরির সাথে বিরোধ


10

আমি প্রতি সেকেন্ডে 800 বার একটি ফাংশন কল করতে একটি টাইমার সেট করতে চাই। আমি আরডুইনো মেগা এবং টাইমার 3 ব্যবহার করছি 1024 এর একটি প্রেসক্যালারের সাথে the

  • সিপিইউ ফ্রিক্স: 16 মেগাহার্টজ
  • টাইমার রেজোলিউশন: 65536 (16 বিট)
  • 16x10 ^ 6 /: মনোনীত prescaler দ্বারা বিভক্ত করা CPU- র ফ্রিকোয়েন্সি 1024 = 15625
  • বাকিগুলি কাঙ্ক্ষিত ফ্রিক্স 62500/800 = 19 এর মাধ্যমে ভাগ করুন ।
  • ফলাফলটি 1 টি ওসিআর 3 রেজিষ্টারে রাখুন।

আমি টিসিসিআর 3 বি এর রেজিস্ট্রার সেট করতে নীচের টেবিলটি ব্যবহার করেছি:

এখানে চিত্র বর্ণনা লিখুন

ভূল

কোডটি সংকলন করা অসম্ভব। এটি সংকলক দ্বারা ফিরে আসা ত্রুটি:

সার্ভো \ সার্ভো সিপি.পি: ফাংশনে '__vector_32': সি: \ প্রোগ্রাম ফাইল (x86) rdu আরডুইনো \ লাইব্রেরি \ সার্ভো / সার্ভো সিপিপি: 110: '__vector_32' এর একাধিক সংজ্ঞা অ্যাক্সেলপার্ট1_35.cpp.o: সি: \ প্রোগ্রাম ফাইলগুলি (x86) \ আরডুইনো / অ্যাক্সেলপার্ট1_35.ino: 457: প্রথমে এখানে সংজ্ঞায়িত সি: / প্রোগ্রাম ফাইল (x86) / আরডুইনো / হার্ডওয়্যার / সরঞ্জাম / এভিআর / বিন /.. / লিবি / জিসিসি / এভিআর / 4.3.2 /। ./../../../avr/bin/ld.exe: শিথিলকরণ অক্ষম করা: এটি একাধিক সংজ্ঞা দিয়ে কাজ করবে না

কোড

volatile int cont = 0;
unsigned long aCont = 0;
void setup()
{
 [...]
  // initialize Timer3
  cli();          // disable global interrupts
  TCCR3A = 0;     // set entire TCCR3A register to 0
  TCCR3B = 0;     // same for TCCR3B

  // set compare match register to desired timer count: 800 Hz
  OCR3A = 20;
  // turn on CTC mode:
  TCCR3B |= (1 << WGM12);
  // Set CS10 and CS12 bits for 1024 prescaler:
  TCCR3B |= (1 << CS30) | (1 << CS32);
  // enable timer compare interrupt:
  TIMSK3 |= (1 << OCIE3A);
  // enable global interrupts:
  sei();
}

void loop()
{
 // Print every second the number of ISR invoked -> should be 100
 if ( millis() % 1000 == 0)
 {
   Serial.println();
   Serial.print(" tick: ");
   Serial.println(contatore);
   contatore = 0;
 }
}

[...]

// This is the 457-th line
ISR(TIMER3_COMPA_vect)
{
    accRoutine();
    contatore++;
}

void accRoutine()
{
  // reads analog values
}

সার্ভো লাইব্রেরি দিয়ে বিরোধ কীভাবে সমাধান করবেন?

সমাধান

নিম্নলিখিত কোড ব্যবহার করে বিবাদ সমাধান হয়েছে। এটি সংকলন করে তবে 800Hz টাইমারের সাথে সম্পর্কিত কাউন্টারটি এর মান বাড়ায় না।

volatile int cont = 0;

void setup()
{
  Serial.begin(9600);
  // Initialize Timer
  cli();          // disable global interrupts
  TCCR3A = 0;     // set entire TCCR3A register to 0
  TCCR3B = 0;     // same for TCCR3B

  // set compare match register to desired timer count: 800 Hz
  OCR3B = 20;
  // turn on CTC mode:
  TCCR3B |= (1 << WGM12);
  // Set CS10 and CS12 bits for 1024 prescaler:
  TCCR3B |= (1 << CS30) | (1 << CS32);
  // enable timer compare interrupt:
  TIMSK3 |= (1 << OCIE3B);
  // enable global interrupts:
  sei();

  Serial.println("Setup completed");
}

void loop()
{
  if (millis() % 1000 == 0)
  {
    Serial.print(" tick: ");
    Serial.println(cont);
    cont = 0;
  }
}

ISR(TIMER3_COMPB_vect)
{
  cont++;
}

যেহেতু মূল সমস্যাটি সমাধান হয়ে গেছে, তাই আমি কাউন্টার বর্ধনের সমস্যা সম্পর্কিত এখানে আরও একটি প্রশ্ন তৈরি করেছি ।


আপনি কি নিজের প্রোগ্রামে সার্ডো লাইব্রেরি ব্যবহার করেন নাকি?
jfpoil ব্যাখ্যা

2
সার্ভো সিপ্পি সম্ভাব্য আইএসআরও করেন (টিআইএমআর 3_সিএমপিএ_ভেক্ট)
টিএমএ

1
পরিবর্তে টাইমার 1, 4 বা 5 ব্যবহার করুন।
গারবেন

1
সার্ভা COMPA এর জন্য টাইগার 1,3,4 এবং 5 মেগারের জন্য বাধা ফাংশনগুলি সংজ্ঞায়িত করে। সিএমপিবি ব্যবহার সম্পর্কে কীভাবে?
ব্রেট্যাম

1
আপনি ঠিক বলেছেন । তারা কেবলমাত্র সমস্ত টাইমারকে হগিং করছে। আমার ধারণা #define _useTimer3লাইনটি সরিয়ে আপনি লাইব্রেরিটি কিছুটা পরিবর্তন করতে হবে , বা #undef _useTimer3অন্তর্ভুক্ত করার পরে একটি ডানদিক চেষ্টা করার চেষ্টা করছেন ।
গারবেন

উত্তর:


4

দুর্ভাগ্যক্রমে, সার্ডো গ্রন্থাগারটি আর্দুইনো মেগায় যখন লোড হয় তখন টাইমার 1,3,4 এবং 5 এর সাথে আউটপুট তুলনা করে A (OCR * A) রাখে। প্রত্যেকের কাছে কেবল একটি আইএসআর থাকতে পারে, সুতরাং আপনি গ্রন্থাগারটি পরিবর্তন না করে সার্ভো ব্যবহার করার সময় আপনার নিজের টিমার * _COMPA_vect সংজ্ঞা দিতে পারবেন না।

তবে, প্রতিটি হার্ডওয়্যার টাইমার 2 আউটপুট তুলনা রেজিস্টারে সজ্জিত। সার্ভো কোনও টিমারের * _COMPB_vect বাধা দাবি করে না, তাই এগুলি ব্যবহারে নির্দ্বিধায় রয়েছে এবং ঠিক একইভাবে কাজ করে।

সার্ভো লাইব্রেরি ক্রিয়াকলাপগুলির জন্য আপনার নজর রাখা উচিত, এটি আপনার টাইমারটির কনফিগারেশন পরিবর্তন করতে পারে। ডিফল্ট অর্ডারটি মেগাসে 5,1,3,4 এবং প্রতিটি 12 সার্ভো দিতে হয়। এটি কেবলমাত্র টাইমারের প্রয়োজন হলে এটি কনফিগার করে, তাই আপনি 25 তম সার্ভো যোগ না করা পর্যন্ত আপনার টাইমার 3 ব্যবহার করে ভাল হওয়া উচিত।

আপনার কোডটি পরিবর্তন করতে, ওসিআর 3 এর পরিবর্তে ওসিআর 3 বি ব্যবহার করুন (আউটপুট তুলনা করুন রেজিস্টারগুলি) এবং টিআইএমএসকে 3-এ (আউটপুট তুলনা বিঘ্ন সক্ষম বিট) এর পরিবর্তে বিট ওসিআইই 3 বি সেট করুন। তারপরে আপনার ISR ফাংশনটি এতে পরিবর্তন করতে হবে ISR(TIMER3_COMPB_vect){}

সিটিসি মোডটি কেবল ওসিআর 3 এ নিয়ে কাজ করে, তবে আপনি যদি আপনার বাধা ফাংশনে টিসিএনটি 3 থেকে 0 সেট করেন তবে আপনি অনুরূপ আচরণ পেতে পারেন। ডাব্লুজিএম 12 ব্যবহারের ক্ষেত্রে সিটিসি মোড ঘুরিয়ে দেওয়া লাইনটি সরিয়ে ফেলতে ভুলবেন না।


ঠিক আছে ধন্যবাদ! কাউন্টার বাড়ানোর বিষয়ে কোন পরামর্শ ?
ইউজারকে
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.