পিন পরিবর্তন ব্যাঘাতের সঠিক ব্যবহার


10

আমি চাপযুক্ত বোতামগুলি সনাক্ত করতে পিন চেঞ্জ ইন্টারফেটগুলি ব্যবহার করার চেষ্টা করছি। এখন অবধি আমি এই ধরণের বাধা নিয়ে কখনই কাজ করি নি এবং কিছু সমস্যা আছে তাই আমি এটি নিশ্চিত করতে চাই যে এটি সঠিক ব্যবহার কিনা।

আমি যদি ডেটশিটটি ঠিকঠাক পেয়েছি তবে পিন পরিবর্তন বাধাদান ব্যবহার করতে নিম্নলিখিত জিনিসগুলি অবশ্যই করা উচিত:

  1. আপনি পিসিএমএসকে রেজিস্ট্রারে কোন পিনগুলি নিয়ন্ত্রণ করতে চান তা সেট করুন
  2. পিন পরিবর্তন বিঘ্নিত নিয়ন্ত্রণের জন্য পিনগুলি রেজিস্টার সক্ষম করুন (পিসিআইসিআর)
  3. বাধা সক্ষম করুন
  4. সংশ্লিষ্ট বাধা ভেক্টর ব্যবহার করুন

প্রকল্প: সরল মুডল্যাম্প, 4 টি বোতামের মাধ্যমে রঙগুলি নিয়ন্ত্রণ করা।

সেটআপ:

  • Atmega168A-জন্য Pu
  • 4 মিনি পুশ বোতাম সুইচ
  • আমার 3 ওয়াটের আরজিবি এলইডি নিয়ন্ত্রণ করতে মোসফেসগুলি

আমি এখানে যে কোডটি ব্যবহার করছি এটি প্রত্যাশার মতো কাজ করছে না:

#include <avr/io.h>
#include <stdint.h>
#include <avr/interrupt.h>
#include <util/delay.h>

#define BUTTON1 (1<<PC5) 
#define BUTTON2 (1<<PC4) 
#define BUTTON3 (1<<PC3) 
#define BUTTON4 (1<<PC2) 

#define GREEN   (1<<PB1) 
#define BLUE    (1<<PB2) 
#define RED     (1<<PB3) 

void init() {

        // enable LED
        DDRB |= GREEN;
        DDRB |= BLUE;
        DDRB |= RED;

        // button pullups
        PORTC |= BUTTON1;
        PORTC |= BUTTON2;
        PORTC |= BUTTON3;
        PORTC |= BUTTON4;

        // pin change interrupts for buttons
        PCMSK1 |= PCINT13;
        PCMSK1 |= PCINT12;
        PCMSK1 |= PCINT11;
        PCMSK1 |= PCINT10;

        // enable pin change for buttons
        PCICR |= PCIE2;

        sei();

}

ISR(PCINT2_vect) {

                PORTB = BLUE;
}


void ledTest() {

                PORTB ^= RED;
                _delay_ms(250);
                PORTB ^= RED;
                _delay_ms(250);
                PORTB ^= RED;
                _delay_ms(250);
                PORTB ^= RED;


                PORTB ^= BLUE;
                _delay_ms(250);
                PORTB ^= BLUE;
                _delay_ms(250);
                PORTB ^= BLUE;
                _delay_ms(250);
                PORTB ^= BLUE;

                PORTB ^= GREEN;
                _delay_ms(250);
                PORTB ^= GREEN;
                _delay_ms(250);
                PORTB ^= GREEN;
                _delay_ms(250);
                PORTB ^= GREEN;
}

int main() {

        init();
        ledTest();

        _delay_ms(500);
        PORTB |= GREEN;

        while(1) {
                _delay_ms(100);
        }
}

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

প্রশ্ন: আমি যেভাবে বাধা ব্যবহার করার চেষ্টা করছি তা কি সঠিক?

আমার সেটআপ নিয়ে সমস্যা:

  • বোতাম 1-3 সম্পূর্ণ উপেক্ষা করা হয়।
  • বাটন 4 এমেগাটির রিসেটটি ট্রিগার করছে

আমি যা পরীক্ষা করেছিলাম:

  • বোতামগুলি কোনওভাবেই রিসেট পিনের সাথে সংযুক্ত নয়
  • বোতামগুলি টিপলে জিএনডি-র সাথে সঠিকভাবে সংযুক্ত রয়েছে
  • বোতামগুলি টিপতে না পারলে জিএনডি-তে সংযুক্ত থাকে না
  • যদি আমি বাধা ছাড়াই এগুলি ব্যবহার করি তবে বোতামগুলি দুর্দান্তভাবে কাজ করে eg

    if (! (PINC & BUTTON4)) {PORTB ^ = ব্লু; }

  • 16MHZ বাহ্যিক স্ফটিক / অভ্যন্তরীণ স্ফটিক
  • রাউটিংয়ে কোনও ত্রুটি
  • আমি পিমেডব্লিউআর এবং জিএনডি-র মধ্যে এমেগায় একটি 100nF ক্যাপাসিটার ব্যবহার করছি
  • ভিসিসি ()), জিএনডি (৮), জিএনডি (২২), এভিসিসি (২০) সংযুক্ত রয়েছে (যেহেতু আমার কাছে এআরএফ প্রয়োজন নেই, এটি সংযুক্ত নয়)

আপনার পিসিআইই 1 পতাকা দরকার (পিসিআইই 2 নয়) এবং পিসিআইএনটি 1_ভেেক্ট (পিসিআইএনটি 2 নয়)
মাইক্রোথেরিয়ান

পিসিআইই 1 কেন? আমি সি রেজিস্টার ব্যবহার করছি, সুতরাং আমি যদি এটি গণনা করি তবে এটি এ (পিসিআইই 0), বি (পিসিআইই 1), সি (পিসিআইই 2) হবে? যাইহোক, আমি এটি PCIE1 nad PCINT1_vect দিয়ে চেষ্টা করেছি এবং আমি বোতাম টিপলে কোনও প্রতিক্রিয়া নেই।
ইকক্স

1
এই জাতীয় কার্যভারে অর্টোগোনালটি ধরে নেওয়া কিছুটা ঝুঁকিপূর্ণ হতে পারে। এই বিশেষ ক্ষেত্রে, আপনি প্রায় সঠিক হতে হবে , এটিএমগা 168 এর কোনও বন্দর এ নেই ব্যতীত কোনও ক্ষেত্রেই আমি ডেটাশিট এবং পিনআউট দিয়ে চলেছি। অন্য টিপ-অফটি হ'ল আপনি পিসিআইই 2 ব্যবহার করছেন তবে পিসিএমএসকে 1-তে বিট স্থাপন করছেন; এটি সম্ভবত সঠিক হতে পারে না (দুর্ভাগ্যক্রমে, আমি জানি না কেন আপনার সংশোধিত স্কেচটি এখনও কাজ করছে না)।
মাইক্রোথেরিয়ান

ধন্যবাদ, আমি আরও বুঝতে পেরেছি যে ডিবাগিং সফটওয়্যারগুলির সংমিশ্রণ যা
স্বনির্মিত

উত্তর:


14

পিন পরিবর্তন বিঘ্নগুলি সাধারণত বোতামের ক্রিয়াগুলি সনাক্ত করার জন্য ভাল উপায় নয়। এটি কারণ যান্ত্রিক বোতামগুলি বাউন্স করে এবং আপনি প্রচুর অর্থহীন বাধা পেতে পারেন এবং তারপরেও আপনাকে এখনও যাইহোক ডিবাউসিং করতে হবে।

আরও ভাল উপায় হ'ল প্রতি 1 এমএস (1 কেএইচজেড হার) এর মতো পর্যায়ক্রমিক বাধা দেওয়া। বেশিরভাগ প্রসেসরের ক্ষেত্রে এটি দীর্ঘ সময়, সুতরাং বিরতিতে ব্যয় করা সময়ের ভগ্নাংশটি ছোট হবে। প্রতিটি বিঘ্নিত বাটন স্থিতি কেবল নমুনা। আপনি যদি পর পর 50 এমএসে নতুন রাজ্যটি দেখে থাকেন তবে একটি নতুন বোতামের রাজ্য ঘোষণা করুন। 50 টি এমএস বেশিরভাগ বোতামের বাউন্সের চেয়ে লম্বা, তবে এখনও এটি যথেষ্ট সংক্ষিপ্ত রয়েছে যাতে লোকেরা ল্যাগটি লক্ষ্য করে না এবং যত্ন করে না।

মনে রাখবেন যে আপনি একই সময়সী 1 এমএস বাধায় একাধিক বোতামও পরিচালনা করতে পারেন। আপনার কেবলমাত্র প্রতিটি বোতামের জন্য একটি কাউন্টার দরকার one

উদ্বোধনের সময় আরও:

কখনও কখনও, এই ক্ষেত্রে হিসাবে, কেউ বলে 50 এমএস একটি দীর্ঘ সময় একটি দীর্ঘ সময়। এটি মানুষের দ্বারা চাপা সাধারণ বোতামগুলির ক্ষেত্রে সত্য নয়। এটি স্টপ ওয়াচের মতো খুব টাইমিং-সমালোচনামূলক অ্যাপ্লিকেশনগুলিতে একটি সমস্যা হতে পারে তবে এখন পর্যন্ত আমি এটির মধ্যে চলে যাইনি। আমি ১৯৮০ এর দশকের গোড়ার দিকে এই বিষয়ে পরীক্ষা দিয়েছি এবং প্রচুর অন্যান্য লোকেরও রয়েছে।

এটি সত্য যে টিপিকাল পুশবটন বাউন্স সময় প্রায় 10 এমএস, প্রায় 25 এমএস দ্বারা স্থির হয়। আত্মপ্রকাশ সময় সীমিত ফ্যাক্টর মানুষের উপলব্ধি হয়। 50 এমএসের চেয়ে কিছুটা ছোট যেখানে লোকেরা যখন এটির সন্ধান না করে তখন কোনও বিলম্ব লক্ষ্য করা শুরু করে। তারপরেও এটি বিরক্তিকর হতে অনেক বেশি সময় নেয়। কোনও ক্ষেত্রে 50 মাইল থেকে 0 এমএসের বিলম্বের মধ্যে পার্থক্য সনাক্ত করা সম্ভব হয় যদি তারা বিশেষত এটি সন্ধান করে তবে এটি একটি বোতামটি চাপ দেওয়া এবং কিছু ঘটতে দেখা এবং দেরি সম্পর্কে চিন্তা না করা থেকে বেশ আলাদা।

50 এমএস তাই একটি ভাল উদ্বোধন সময় কারণ বিলম্ব সাধারণ অ্যাপ্লিকেশনগুলিতে উপলব্ধি সীমা নীচে, বিরক্তি সীমা থেকে নীচে এবং বেশিরভাগ স্যুইচের বাউন্স সময়ের উপরে above আমি স্যুইচগুলি পেয়েছি যা প্রায় দীর্ঘ সময়ের জন্য বাউন্স করেছিল, তাই আপনি সম্ভবত উপলব্ধি সীমাতে চাপ দিতে পারেন যেহেতু আলগা করার মতো কিছুই নেই।

আমি 50 মিমি ডেবিউন সময় ব্যবহার করে ফার্মওয়্যার-ডাবন্সেড বোতাম সহ অনেকগুলি পণ্য করেছি। একবারও কোনও গ্রাহক বিলম্বের বিষয়টি লক্ষ্য করে উল্লেখ করেন নি। তারা সকলেই ইস্যু ছাড়াই বাটনগুলি ঠিকঠাক কাজ হিসাবে গ্রহণ করেছে।


1
50 মিমি কিছু ক্ষেত্রে খুব দীর্ঘ হতে পারে (সাধারণত, 10-20 মিমি মানুষের উপলব্ধি সীমা, এবং এটি অস্বীকার করার জন্য যথেষ্ট হওয়া উচিত) তবে এখানে বর্ণিত পদ্ধতিটি যাওয়ার উপায়।
লাস্লোলো ভালকো

1
@ লাজলো: না, সাধারণ ক্ষেত্রে 50 এমএস খুব বেশি দীর্ঘ হয় না। আমার উত্তর ছাড়াও দেখুন।
অলিন ল্যাথ্রপ

আমি 50 মিমি চেষ্টা করেছিলাম যা আমার পক্ষে ভাল কাজ করে :-) আমি এখনও আগ্রহী কেন পিন পরিবর্তন বাধাগ্রস্থ হচ্ছে না (বাউন্সিং স্টাফের পাশে), তবে এটি কার্যকর :-) ধন্যবাদ।
ইকক্স

1

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


-1

"পিন পরিবর্তন বাধাগুলি বোতামের ক্রিয়াগুলি সনাক্ত করার জন্য সাধারণত ভাল উপায় নয়" "

ভুল। পিসি আইএনটি সেরা বিকল্প। আপনি যদি কোনও বোতামের স্থিতি পরীক্ষা করতে পোলিং ব্যবহার করেন তবে বেশিরভাগ সময় কিছুই করা হবে না। আপনি অনেক মূল্যবান সিপিইউ সময় নষ্ট করেন। পিসি INT কেবলমাত্র অনুরোধের ভিত্তিতে ক্রিয়া সম্পাদনের অনুমতি দেয়।

"এটি কারণ যান্ত্রিক বোতামগুলি বাউন্স করে, এবং আপনি প্রচুর অর্থহীন বাধা পেতে পারেন এবং তারপরেও আপনাকে যে কোনও উপায়ে ডিবাউসিং করতে হবে।"

বাউন্স সম্পর্কে সঠিক। তবুও, আপনার কোনও বাধা রুটিনের ভিতরে একটি বোতাম / স্যুইচ করা কখনই উচিত নয় (একই কারণ: সিপিইউ সময় নষ্ট)। আইএসআরগুলি আসলে সংক্ষিপ্ত এবং দক্ষ, কোড-বুদ্ধিযুক্ত বোঝানো হয়েছে। কেবল হার্ডওয়্যার ডিবাউনিং ব্যবহার করুন। আপনার সফ্টওয়্যার পরিষ্কার রাখুন!

হার্ডওয়্যার ডিবাউনিং আরও সুবিধাজনক, এখানে দেখুন / আরসি ডেবিউন করুন + রেফারেন্সের জন্য স্মিট ট্রিগার । আমি এটি পিসি আইএনটি-র সাথে অসংখ্যবার ব্যবহার করেছি, এটি কখনই ব্যর্থ হয় না।

সুতরাং হ্যাঁ, আপনি একটি বোতামের অবস্থা পেতে পিসি INT ব্যবহার করতে পারেন (এবং হওয়া উচিত)। তবে আপনাকে যথাযথ হার্ডওয়্যার ডিবাউসিংও করতে হবে।


2
সফ্টওয়্যার বিতরণ একটি বৈধ পন্থা, এবং বেশিরভাগ সময় সামান্য অতিরিক্ত সিপিইউ ওভারহেড অপ্রাসঙ্গিক হয় ant আপনার হার্ডওয়্যারটিতে সাধারণত উত্সাহ দেওয়া উচিত বলা সর্বোত্তমভাবে প্রশ্নবিদ্ধ। আপনাকে সব ক্ষেত্রে হার্ডওয়্যার ডিবাউসিং করতে হবে তা বলা ঠিক ফ্ল্যাট আউট।
অলিন ল্যাথ্রপ

বেশিরভাগ অ্যাপ্লিকেশনগুলিতে নিয়ন্ত্রক বেশিরভাগ সময় নিষ্ক্রিয় হয়ে মূল লুপটি চালাচ্ছেন। এছাড়াও, আইপি স্টেট চেক সম্পাদনের জন্য প্রয়োজনীয় সিপিইউ সময় এবং সম্ভাব্য বর্ধনযোগ্য একটি ভেরিয়েবল ন্যূনতম। সফ্টওয়্যারটিতে সাধারণ ডিবাউনিং কার্যকর করা প্রায় "ফ্রি" এর জন্য আসে, হার্ডওয়্যারটির জন্য অর্থ ব্যয় হয়। এবং কয়েক সেন্টে হাসবেন না, অ্যাসেম্বলির পাশাপাশি অর্থ ব্যয় হবে এবং আপনি যদি কোনও পণ্যকে মাঝারি থেকে উচ্চ পরিমাণে চালনা করেন তবে তা তুচ্ছ নয়। এটি সত্য যে আইএসআর সময়টি খুব কম রাখা উচিত, তবে এটি এই ক্ষেত্রে খুব কমই যুক্তি। এটি সম্ভবত আরও সমালোচনামূলক হয় যদি পিসি INT আইএসআর একটানা 50 বার বাউন্সিংয়ের কারণে গুলি চালায়।
Rev1.0

@ নেলসন, 'সিপিইউ সময় নষ্ট করা' কিছু প্রয়োগের ক্ষেত্রে এবং অন্য অনেকের ক্ষেত্রে নয় not সিপিইউ সময় সমালোচনামূলক এমন পরিস্থিতিতে আপনার উত্তরটি যোগ্য করে তোলা উচিত।
ব্যবহারকারী 1139880
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.