কোন পিনটি একটি পিসিআইএনটি বিঘ্ন ঘটায় তা নির্ধারণ করছে?


9

আমি কি এই ভেবে সঠিক হয়েছি যে আপনার যদি দুটি পিন একই এভিআর পিসিআইএনটি বাধাগ্রস্থ করে, যেমন পিসিআইএনটি 0 বা পিসিআইএনটি 1 পিনের কারণে পিসিআইএনটি 0 ভেক্টর - আমার মনে হয় ভেক্টর এবং পিনের নামকরণের ওভারল্যাপটি বিভ্রান্ত করছে) কোন পিনটি নির্ধারণের একমাত্র উপায় (গুলি) বাধাগ্রহণের ফলে প্রতিটি বিঘ্নিত হওয়ার পরে তাদের রাজ্যটি রেকর্ড করে এবং পিসিএমএসকেএন সক্ষম হওয়া সমস্ত পিনের পূর্বের এবং বর্তমান মানের তুলনা করে?


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

@ gl3829 আমি সঠিকভাবে বুঝতে পারলে পতাকাগুলি পিনের প্রতি গ্রুপ হয়
টম ডেভিস

উত্তর:


11

আমি ভেক্টর এবং পিনের নামকরণ ওভারল্যাপ বিভ্রান্তিকর বলে মনে করি

এটাই!

একটি বিঘ্নিত ভেক্টরের জন্য 8 টি পৃথক বহিরাগত পিন রয়েছে তার কারণ হ'ল পিসিবি লেআউট করা আরও সহজ করা বা অন্য পিনের ক্রিয়াকলাপের সাথে দ্বন্দ্ব থাকলে কোনও আলাদা পিন ব্যবহার করা।

আমি কি ভেবেছি সঠিক ... কোন পিন (গুলি) বাধাগ্রস্থ করেছে তা নির্ধারণের একমাত্র উপায় হ'ল প্রতিটি বাধা দেওয়ার পরে তাদের রাজ্যটি রেকর্ড করা এবং পিসিএমএসকেএন সক্ষম হওয়া সমস্ত পিনের পূর্বের এবং বর্তমান মানের তুলনা করা?

খুব সুন্দর, আপনাকে কেবল PB0 (PCINT0) এবং PB1 (PCINT1) এর বিষয়ে যত্নশীল হতে দিন say সুতরাং পিন পরিবর্তন সক্ষম মুখোশ PCMSK0 0x03 সেট করা হবে।

// External Interrupt Setup
...

volatile u_int8 previousPins = 0; 
volatile u_int8 pins = 0; 

ISR(SIG_PIN_CHANGE0)
{
    previousPins = pins; // Save the previous state so you can tell what changed
    pins = (PINB & 0x03); // set pins to the value of PB0 and PB1
    ...
}

সুতরাং যদি pins0x01 হয় তবে আপনি জানেন এটি পিবি 0 ছিল ... এবং যদি আপনাকে কী পরিবর্তিত হয় তবে এটির তুলনা করা আপনার যদি প্রয়োজন হয় তবে আপনি যা previousPinsভাবছিলেন ঠিক তেমনই।

কিছু ক্ষেত্রে মনে রাখবেন, pinsপিনের বাধাপ্রাপ্ত হওয়ার পরে তবে তার আগে রাষ্ট্রের পরিবর্তন থাকলে সঠিক হতে পারে না pins = (PINB & 0x03)

অন্য বিকল্পটি হ'ল প্রতিটি ভেক্টর থেকে একটি পিনের সাথে পৃথক বিঘ্নিত ভেক্টর ব্যবহার করা যাতে আপনি জানেন যে কোনটি পরিবর্তিত হয়েছে। আবার, এই কিছু বিষয়, বিঘ্ন অগ্রাধিকার মত এবং একবার CPU- র ISR প্রবেশ করে, বিশ্বব্যাপী বিট সক্ষম বিঘ্ন I-bitমধ্যে SREG, তাই সাফ করা হবে যে সব অন্যান্য বিঘ্নিত অক্ষম করা হয়েছে যে আপনার বিরতি ভিতরে এটি সেট করতে পারেন যদিও তুমি যদি চাও, যে would একটি নেস্টেড বাধা হতে।

আরও তথ্যের জন্য, মেগাএভিআর ডিভাইসগুলির জন্য বাহ্যিক বাধা ব্যবহার করে আতেলের অ্যাপ নোটটি একবার দেখুন

হালনাগাদ

এখানে একটি সম্পূর্ণ কোড উদাহরণস্বরূপ আমি শুধু পাওয়া যায় এখানে

#include <avr/io.h>
#include <stdint.h>            // has to be added to use uint8_t
#include <avr/interrupt.h>    // Needed to use interrupts
volatile uint8_t portbhistory = 0xFF;     // default is high because the pull-up

int main(void)
{
    DDRB &= ~((1 << DDB0) | (1 << DDB1) | (1 << DDB2)); // Clear the PB0, PB1, PB2 pin
    // PB0,PB1,PB2 (PCINT0, PCINT1, PCINT2 pin) are now inputs

    PORTB |= ((1 << PORTB0) | (1 << PORTB1) | (1 << PORTB2)); // turn On the Pull-up
    // PB0, PB1 and PB2 are now inputs with pull-up enabled

    PCICR |= (1 << PCIE0);     // set PCIE0 to enable PCMSK0 scan
    PCMSK0 |= (1 << PCINT0);   // set PCINT0 to trigger an interrupt on state change 

    sei();                     // turn on interrupts

    while(1)
    {
    /*main program loop here */
    }
}

ISR (PCINT0_vect)
{
    uint8_t changedbits;

    changedbits = PINB ^ portbhistory;
    portbhistory = PINB;

    if(changedbits & (1 << PB0))
    {
    /* PCINT0 changed */
    }

    if(changedbits & (1 << PB1))
    {
    /* PCINT1 changed */
    }

    if(changedbits & (1 << PB2))
    {
    /* PCINT2 changed */
    }
}

ভেক্টর পিসিআইএনটি [0-2] সহ মেগায় তিনটি পিন পরিবর্তন বাধা রয়েছে, তবে সেগুলির প্রতিটি পিনের সেট দ্বারা ট্রিগার করা হয়। আমার প্রশ্নটি সেটে থাকা পিনগুলির মধ্যে কোনটি বাধাগ্রস্থ করেছিল তা কীভাবে আলাদা করা যায় সে সম্পর্কে question
টম ডেভিস

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

@ গ্যারেট: আপনি কি বুঝতে পেরেছিলেন যে আপনার মূল উদাহরণে কেউ সহজেই নির্ধারণ করতে পারে যে এটি পতন বা উত্থিত প্রান্ত যা বাধা সৃষ্টি করেছিল? (ভাল, যদি না উভয় পিনগুলি একই মুহূর্তে পরিবর্তিত হয় ... তবে এই ক্ষেত্রে কেবল কালো যাদুটিই সহায়তা করে) (পূর্ববর্তী পিনস> পিনস): পতনীয় প্রান্ত (পূর্ববর্তী পিনস <পিনস): উত্থিত প্রান্ত সম্ভবত এটি উপরে বর্ণিত মূল্যবান is

@ টমড্যাভিস পিনবিতে পিসিআইএনটি ০--, পিনসি পিসিআইএনটি ৮-15-১ etc ইত্যাদি কভার করেছে
এক্রির্ক

0

নতুন ATTINY সিরিজের INTFLAGSরেজিস্টার আপনাকে জানাবে যে কোন পোর্ট বিট বাধাগ্রস্থ করেছে।

এখানে ডেটাশিট থেকে উদ্ধৃত অংশ:

বিটস 7: 0 - আইএনটি [7: 0]: পিন ফ্ল্যাগ বিঘ্নিত আইএনটি পতাকা সেট করা হয় যখন পিন পরিবর্তন / রাষ্ট্র পিনের ইনপুট সংবেদনের সাথে মেলে। পতাকাটির বিট স্থানে একটি '1' লিখলে পতাকা সাফ হবে।

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