আমি ভেক্টর এবং পিনের নামকরণ ওভারল্যাপ বিভ্রান্তিকর বলে মনে করি
এটাই!
একটি বিঘ্নিত ভেক্টরের জন্য 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
...
}
সুতরাং যদি pins
0x01 হয় তবে আপনি জানেন এটি পিবি 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 */
}
}