আমি কীভাবে আরডুইনোর সাথে টাইমার বাধা তৈরি করব?


9

আমি আরডুইনোর সাথে একটি সময় দেরি বাধা তৈরি করার চেষ্টা করছি। আমি বাধা () ফাংশনটি ব্যবহার করতে চাই, কারণ এটি একটি অভ্যন্তরীণ বাধা।

উদাহরণ: ধরা যাক, আমি কেবল বাধার সময় সহ হালকা ঝলকানো এবং বন্ধ করতে চাই।

স্যাম্পল কোড রয়েছে তবে এটি বাহ্যিক বাধা (সংযুক্তি আন্তঃবিধ) () ব্যবহার করে। আমি অভ্যন্তরীণ বাধা ব্যবহার করেই থাকতে চাই।


2
আমি মনে করি যে কর্টুক যে বিন্দুটি দেখিয়েছিল তা হ'ল সংযুক্তি আন্তঃসংশ্লিষ্ট একটি বিমূর্ত জিনিস, আপনি কোনও বাহ্যিক উপাদান সংযুক্ত করছেন না :)
ক্লাবচিও

এই নিবন্ধটি আপনাকে সাহায্য করতে পারে। engblaze.com/…
শেঠ আর্চার ব্রাউন

উত্তর:


10

নোহ স্টাহলের ব্লগে টাইমার 2 দিয়ে একটি এলইডি জ্বলানোর উদাহরণ রয়েছে । এটি এবং ডেটা শিটের সাহায্যে আপনি যেটি বাধাগুলি ব্যবহার করতে চান তার সাথে এটি খাপ খাইয়ে নিতে সক্ষম হবেন - অর্থাত্‍, বাধা যার স্বাভাবিক ক্রিয়াকলাপটি আপনি সর্বাধিক দিতে পারেন বা সংশোধন করতে ইচ্ছুক। টাইমার 2 সাধারণত কিছু পিডব্লিউএম ফাংশনের জন্য ব্যবহৃত হয়।

তার উদাহরণ এটিমেগা 2560 উদ্ধৃত করে; আমি এটিও নিশ্চিত করতে পারি যে এটি এটিএমগ 328 পি-তেও কাজ করে। আরও দরকারী আরডুইনো বিঘ্নিত উদাহরণগুলির জন্য তার সাইটের চারপাশে দেখুন।

সম্পাদনা:

এখানে আমার সামান্য সম্পাদিত - বেশিরভাগ মন্তব্যে - নোহের কোডের সংস্করণ। আপনি কোনও সম্পর্কিত ডেটা-স্ট্রাকচার বা হার্ডওয়্যার শুরু করার পরে আরডুইনো সেটআপ () ফাংশন থেকে টাইমার 2 ইনিট () কে কল করুন কারণ আপনার সময়টি করার পরে - এবং বিঘ্নিত হওয়া শুরু হবে।

এফ / প্রাক্তন, আমি এটি একটি 3-সংখ্যার 7-সেগমেন্ট ডিসপ্লেতে মাল্টিপ্লেক্সে ব্যবহার করেছি তাই আমি টাইমারটি শুরু করার আগে, আমি ডিসপ্লে I / O রেজিস্টারগুলি আরম্ভ করেছিলাম এবং যেখানে আইএসআর এটির সন্ধান করবে সেখানে প্রদর্শন তথ্য ফাঁকা করে দেই।

ডেটা-শিট থেকে কিছু দরকারী টাইমিং ডেটার মন্তব্যে একটি সারণী রয়েছে এবং অন্য সময় নির্ধারণের পরিকল্পনাটি সেট আপ করার জন্য রেফারেন্সের জন্য আমার নিজস্ব গণনা রয়েছে।

আইএসআর () ম্যাক্রো একটি সাধারণ ক্রিয়াকলাপের প্রবেশ এবং প্রস্থানের পরিবর্তে কোনও আইএসআরটির জন্য বাধা প্রবেশ-এবং প্রস্থান-কোড তৈরি এবং সঠিক বিঘ্নিত ভেক্টরের সাথে সংযোগ স্থাপনের যত্ন নেয়। সেই ফাংশনের বাকি অংশটি হ'ল) ​​1 প্রতিটি বিঘ্নে চালানো কোড এবং 2) পরবর্তী বিঘ্নের জন্য টাইমার পুনরায় সেট করতে কোড কোড।

যেমনটি লেখা আছে, এটি একটি .pde বা .ino স্কেচে (বা একটি .cpp ফাইল, যদি আপনি গ্রহনটি ব্যবহার করেন, এফ / প্রাক্তন) এ ফেলে দেওয়া উচিত। স্কেচের জন্য # নির্দিষ্ট এলইডিপিন প্রয়োজন, এবং সেটআপ () কে টাইমার 2 ইনিট () কল করতে হবে। লুপ ফাংশন খালি হতে পারে বা নাও হতে পারে; এলইডি ডাউনলোডের উপর ঝলকানি শুরু করা উচিত (ভাল, আক্ষরিকভাবে, টাইমার 2 ইনিট () বলা হওয়ার পরে)।

/*
 * From sample interrupt code published by Noah Stahl on his blog, at:
 * http://arduinomega.blogspot.com/p/arduino-code.html
 * 
 */


/*** FUNC

Name:           Timer2init

Function:       Init timer 2 to interrupt periodically. Call this from 
                the Arduino setup() function.

Description:    The pre-scaler and the timer count divide the timer-counter
                clock frequency to give a timer overflow interrupt rate:

                Interrupt rate =  16MHz / (prescaler * (255 - TCNT2))

        TCCR2B[b2:0]   Prescaler    Freq [KHz], Period [usec] after prescale
          0x0            (TC stopped)     0         0
          0x1                1        16000.        0.0625
          0x2                8         2000.        0.500
          0x3               32          500.        2.000
          0x4               64          250.        4.000
          0x5              128          125.        8.000
          0x6              256           62.5      16.000
          0x7             1024           15.625    64.000


Parameters: void

Returns:    void

FUNC ***/

void Timer2init() {

    // Setup Timer2 overflow to fire every 8ms (125Hz)
    //   period [sec] = (1 / f_clock [sec]) * prescale * (255-count)
    //                  (1/16000000)  * 1024 * (255-130) = .008 sec


    TCCR2B = 0x00;        // Disable Timer2 while we set it up

    TCNT2  = 130;         // Reset Timer Count  (255-130) = execute ev 125-th T/C clock
    TIFR2  = 0x00;        // Timer2 INT Flag Reg: Clear Timer Overflow Flag
    TIMSK2 = 0x01;        // Timer2 INT Reg: Timer2 Overflow Interrupt Enable
    TCCR2A = 0x00;        // Timer2 Control Reg A: Wave Gen Mode normal
    TCCR2B = 0x07;        // Timer2 Control Reg B: Timer Prescaler set to 1024
}



/*** FUNC

Name:       Timer2 ISR

Function:   Handles the Timer2-overflow interrupt

Description:    Maintains the 7-segment display

Parameters: void

Returns:    void

FUNC ***/

ISR(TIMER2_OVF_vect) {
    static unsigned int led_state = 0; // LED state

    led_state = !led_state;         // toggles the LED state
    digitalWrite(TOGGLE_PIN, led_state);

    TCNT2 = 130;     // reset timer ct to 130 out of 255
    TIFR2 = 0x00;    // timer2 int flag reg: clear timer overflow flag
};

(@কোর্টুক: আপনি যে মন্তব্যটি উল্লেখ করেছেন তা হ'ল আমার বেশ কয়েকটি ভাষ্যকারের পর্যবেক্ষণ এবং এটি ব্যক্তিগতভাবে আপনার লক্ষ্য ছিল না এবং এটি অপ্রয়োজনীয় ছিল I আমি ক্ষমা চেয়ে নিচ্ছি এবং আমি এটিকে সরিয়ে দিয়েছি you) আপনার পরামর্শ অনুসারে আমি আমার উত্তরটি প্রসারিত করেছিলাম এবং আমি আশাবাদী যে এটি এখন কেবল প্রদর্শনীই নয়, পাশাপাশি শিক্ষণীয়ও। এতে আমি নিজের ব্যবহারের জন্য কোডটিতে লিখেছি এমন মন্তব্যগুলি অন্তর্ভুক্ত রয়েছে (অর্থ: যদি আমি এখন থেকে তাদের 6 মাস বুঝতে পারি তবে অন্য কেউও সক্ষম হবেন) পাশাপাশি সেই সাথে কয়েকটি "কীভাবে ব্যবহার করবেন" নির্দেশাবলী উত্তর. আপনার পরামর্শের জন্য ধন্যবাদ।
জে রবার্ট

মনে রাখবেন যে 32 এবং 128 এর প্রিসকেলগুলি টাইমার0 এবং টাইমার 1 এর জন্য উপলব্ধ নয় (atmega328 এর সাথে কমপক্ষে)।
tuupola

এটি জানা ভাল - ধন্যবাদ। আমি এটি টাইমার 2 (এখনও অবধি) জন্য ব্যবহার করি এবং এটি মূলত একটি ড্রপ-ইন।
জে রবার্ট

5

AttachInterrupt () ফাংশন আসলে একটি পিন উপর একটি বহিস্থিত অবস্থা পরিবর্তন করার একটি ইন্টারাপ্ট সংযোজনের হয়, এটি অন্য কোন অপশন নেই।

উপর একই পৃষ্ঠায় মোড অপশন হিসেবে তালিকাভুক্ত করা হয়:

মোড সংজ্ঞা দেয় যখন বিঘ্ন ঘটানো উচিত should চারটি প্রতিযোগিতা বৈধ মান হিসাবে পূর্বনির্ধারিত:

  • যখনই পিনটি কম হয় তখন বাধাটি ট্রিগার করতে LOW ,
  • যখনই পিনটির মান পরিবর্তন হয় তখন বিঘ্নকে ট্রিগার করতে পরিবর্তন করুন
  • যখন পিনটি নিম্ন থেকে উচ্চে চলে যায় তখন ট্রিগার করার জন্য বেড়ে ওঠা ,
  • পরে যাচ্ছে যখন উচ্চ থেকে নীচে যায় তার জন্য কল করুন।

খারাপ সংবাদের ধারক হওয়ার জন্য দুঃখিত, আমি এটি প্রথম যে বিষয়গুলির সন্ধান করেছি of


আমি মনে করি যে তার অর্থ হ'ল তিনি বাহ্যিক ডিভাইসের পরিবর্তে একটি অভ্যন্তরীণ টাইমার ব্যবহার করতে চান ... তবে আমি
আরডিনোকে

@ ক্লাব্যাচিও, আমি বলছি যে কেবলমাত্র বাহ্যিক ট্রিগার ব্যবহার করা বিকল্প, অভ্যন্তরীণ টাইমার ফাংশন নেই।
কর্টুক

আহ্, ভাল :) তবে কমপক্ষে আড়ডিনো বোর্ডগুলির কি টাইমার রয়েছে?
ক্লাবচিও

হ্যাঁ, তারা এভাবেই বিলম্বের মতো কাজগুলি সম্পাদন করে।
কর্টুক

1
@ আইকারাস 74৪ টি এটিমেগা 328-তে সত্যিই 3 টি টাইমার রয়েছে (একটি 16 বি এবং দুটি 8 বি) তবে এটি সমস্তই আরডুইনো দ্বারা ব্যবহৃত হয়। একটি বিলম্ব () এবং মিলিস () এর মতো ফাংশনগুলির জন্য ব্যবহৃত হয় এবং তিনটিই পিডব্লিউএম এর জন্য ব্যবহৃত হয় (আপনি আরডুইনো আইডিইতে 'init ()' ফাংশন, ফাইল 'ওয়্যারিং.সি' তে আরও তথ্য পেতে পারেন)।
ভাস্কো

2

পিডাব্লুএম-এর এই নিবন্ধটি আরডুইনো টাইমারগুলির ব্যবহার সম্পর্কে আপনার অনেক সন্দেহকে সাফ করবে। দুটি 8-বিট টাইমার এবং আরডুইনোতে একটি 16-বিট টাইমার রয়েছে। সরাসরি টাইমারগুলিতে আইএসআর ফাংশনটি হুক করার জন্য কোনও উচ্চ-স্তরের এপিআই নেই, এটি আরডুইনো এসডিকে (অর্থাত একটি স্ট্যান্ডার্ড লাইব্রেরি হিসাবে) দিয়ে পাঠানো হয়েছে, তবে বিশেষ-ফাংশন-রেজিস্টার এবং বিট-গাণিতিক / সেট করার কিছুটা নিম্ন-স্তরের পদ্ধতি তাদের উপর অপারেশন। তবে সেখানে টাইমার ওয়ান নামে একটি ব্যবহারকারী অবদান গ্রন্থাগার রয়েছে ।


আরডুইনো উল্লেখ করা হচ্ছে তার উপর নির্ভর করে এখানে বেশ কয়েকটি বিভিন্ন টাইমার সংমিশ্রণগুলি সম্ভব রয়েছে। উত্তর বিভ্রান্তিকর।
আপাতদৃষ্টিতে তাই

@ সিমিংলিও, কি বিস্তারিত বলবেন? আপনি যদি আরডিনো হার্ডওয়্যার সম্পর্কে কথা বলছেন তবে নোট করুন যে উত্তরটি প্রশ্নের প্রসঙ্গে এবং প্রশ্নটি জিজ্ঞাসা করার সময়টিও।
icarus74

আরডুইনো মেগা (এটিএমগা 1280 ভিত্তিক) প্রকাশিত হয়েছিল ২ 2009 শে মার্চ ২০০৯, এবং মেগা 2560 (এটিমেগা 2560) এই প্রশ্ন জিজ্ঞাসা করার আগেই উভয়ই 24 সেপ্টেম্বর 2010 এ মুক্তি পেয়েছিল। উভয় মাইক্রোকন্ট্রোলারের উত্তরে নির্দিষ্ট করা 2x 8 বিট এবং 1x 16 বিট টাইমার / কাউন্টার রয়েছে।
আপাতদৃষ্টিতে তাই

আমি এখনও অবধি দেখা বেশিরভাগ মিথস্ক্রিয়াগুলিতে ডিউডিলানোভ বা ইউনো অর্থাৎ 328 সিরিজ ভিত্তিক বোর্ডগুলির মতো বোঝাতে আরডুইনোর একটি দ্ব্যর্থহীন রেফারেন্স পেয়েছি। অন্যান্য বোর্ডগুলি সর্বদা ইউপি সিরিজের নং দ্বারা সুস্পষ্টভাবে যোগ্য হয়ে উঠেছে। বা মেগা, ন্যানো, মাইক্রো ইত্যাদি যাইহোক, আমি বিনীতভাবে সংশোধনটি গ্রহণ করব। এই প্রসঙ্গে, একটি ব্যাখ্যা আরও ভাল।
icarus74

1

আরডুইনো এটিএমইগা 328 এ তিনটি টাইমার ব্যবহার করছে। Timer1(১ b বিট) 5 এবং 6 পিনের পিডব্লিউএম আউটপুট এর মত delay()এবং জন্য ব্যবহৃত millis()হয় অন্য দুটি টাইমার - Timer0এবং Timer2পিন 3, 9, 10, 11-এ PWM আউটপুট জন্য ব্যবহৃত হয়।

সুতরাং, টাইমার বিঘ্নের জন্য কোনও আরডুইনো ফাংশন নেই। কিন্তু, একটি উপায় আছে. আপনি টাইমার বিঘ্ন সক্ষম করতে এই কোডটি ব্যবহার করতে পারেন Timer2:

ISR(TIMER2_OVF_vect) {
  // Interrupt routine.
}

void setup() {
  // Enable Timer2 interrupt.
  TIMSK2 = (0<<OCIE2A) | (1<<TOIE2);
}

void loop() {
  // Your main loop.
}

আমি এই কোডটি পরীক্ষা না করেই লিখেছি, সুতরাং এটি সম্ভব যে আমি কোনও ভুল করেছি। যে ক্ষেত্রে, চেক উপাত্তপত্র p.156,

আপনি যদি টাইমার ফ্রিকোয়েন্সি (প্রেসকেলার) পরিবর্তন করতে চান তবে কেবল রেজিস্টার পরিবর্তন করুন TCCR2A। আরও তথ্যের জন্য ডেটাশিট পৃষ্ঠা 153 দেখুন But তবে আপনি যদি টাইমারের ফ্রিকোয়েন্সি পরিবর্তন করেন তবে আপনি দুটি আউটপুট পিনগুলিতে পিডব্লিউএম সিগন্যালের ফ্রিকোয়েন্সিও পরিবর্তন করেন!


এটিমেগা 328 এ এএফআইকি Timer0এবং Timer2এটি 8 বিট এবং কেবল Timer116 বিট।
tuupola

না, এটি সঠিক নয়। এটি টাইমার 1, টাইমার 1 নয়, এটি দেরি () এবং মিলিস () এবং পিডব্লিউএম আউটপুট 5 এবং 6 এর জন্য ব্যবহৃত হয়। টাইমার0 একটি 8-বিট টাইমার। উদাহরণস্বরূপ আর্দুইনো টাইমারস এবং বাধা দেখুন
পিটার মর্টেনসেন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.