আমি চাপযুক্ত বোতামগুলি সনাক্ত করতে পিন চেঞ্জ ইন্টারফেটগুলি ব্যবহার করার চেষ্টা করছি। এখন অবধি আমি এই ধরণের বাধা নিয়ে কখনই কাজ করি নি এবং কিছু সমস্যা আছে তাই আমি এটি নিশ্চিত করতে চাই যে এটি সঠিক ব্যবহার কিনা।
আমি যদি ডেটশিটটি ঠিকঠাক পেয়েছি তবে পিন পরিবর্তন বাধাদান ব্যবহার করতে নিম্নলিখিত জিনিসগুলি অবশ্যই করা উচিত:
- আপনি পিসিএমএসকে রেজিস্ট্রারে কোন পিনগুলি নিয়ন্ত্রণ করতে চান তা সেট করুন
- পিন পরিবর্তন বিঘ্নিত নিয়ন্ত্রণের জন্য পিনগুলি রেজিস্টার সক্ষম করুন (পিসিআইসিআর)
- বাধা সক্ষম করুন
- সংশ্লিষ্ট বাধা ভেক্টর ব্যবহার করুন
প্রকল্প: সরল মুডল্যাম্প, 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 ক্যাপাসিটার ব্যবহার করছি
- ভিসিসি ()), জিএনডি (৮), জিএনডি (২২), এভিসিসি (২০) সংযুক্ত রয়েছে (যেহেতু আমার কাছে এআরএফ প্রয়োজন নেই, এটি সংযুক্ত নয়)