मैं दबाए गए बटन का पता लगाने के लिए पिन चेंज इंटरप्ट का उपयोग करने की कोशिश कर रहा हूं। अब तक मैंने कभी इस तरह के व्यवधानों के साथ काम नहीं किया है और कुछ समस्याएं हैं, इसलिए मैं यह सुनिश्चित करना चाहता हूं कि यह सही उपयोग हो।
अगर मुझे डेटशीट सही मिली तो पिन चेंज इंटरप्ट का उपयोग करने के लिए निम्नलिखित चीजें करनी चाहिए:
- PCMSK रजिस्टर में वह पिन सेट करें जिसे आप नियंत्रित करना चाहते हैं
- पिन चेंज इंटरप्ट कंट्रोल (PCICR) के लिए पिन रजिस्टर को सक्षम करें
- बीच में सक्षम करें
- संबंधित इंटरप्ट वेक्टर का उपयोग करें
प्रोजेक्ट: सिंपल मूडलैंप, कलर्स को 4 बटन्स के जरिए कंट्रोल किया गया।
सेट अप:
- Atmega168A-पीयू
- 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 को पूरी तरह से नजरअंदाज कर दिया जाता है।
- Button4, Atmega के एक रीसेट को ट्रिगर कर रहा है
जिन चीजों की मैंने जाँच की:
- बटन किसी भी तरह से रीसेट पिन से जुड़े नहीं हैं
- यदि दबाया गया तो बटन ठीक से GND से जुड़े होते हैं
- बटन दबाए जाने पर GND से कनेक्ट नहीं होते हैं
यदि मैं बिना किसी बाधा के उनका उपयोग करता हूं, तो बटन अच्छी तरह से काम करते हैं, जैसे:
अगर ((PINC और BUTTON4)) {PORTB ^ = BLUE; }
- 16MHZ बाहरी क्रिस्टल / आंतरिक क्रिस्टल
- राउटिंग में कोई त्रुटि
- मैं atmga पर PWR और GND के बीच 100nF कैपेसिटर का उपयोग कर रहा हूं
- वीसीसी (7), जीएनडी (8), जीएनडी (22), एवीसीसी (20) जुड़े हुए हैं (क्योंकि मुझे एरेएफ की जरूरत नहीं है, इसके कनेक्ट नहीं हैं)