Tôi đang cố gắng sử dụng các ngắt thay đổi pin để phát hiện các nút nhấn. Cho đến bây giờ tôi chưa bao giờ làm việc với các loại ngắt này và có một số vấn đề, vì vậy tôi muốn chắc chắn rằng đây có phải là cách sử dụng đúng không.
Nếu tôi có bảng dữ liệu đúng, những điều sau đây phải được thực hiện để sử dụng ngắt thay đổi pin:
- Đặt mã PIN bạn muốn kiểm soát trong đăng ký PCMSK
- Cho phép đăng ký mã PIN để kiểm soát ngắt thay đổi pin (PCICR)
- Kích hoạt ngắt
- Sử dụng vectơ ngắt tương ứng
Dự án: Tâm trạng đơn giản, Màu sắc được điều khiển thông qua 4 nút.
Thiết lập:
- Atmega168A-PU
- 4 công tắc nút bấm mini
- MOSFET để điều khiển đèn LED RGB 3 watt của tôi
Đây là mã tôi đang sử dụng không hoạt động như mong đợi:
#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);
}
}
Lưu ý: Các nút nên được công bố. Vì tôi đang cố gắng từng bước một và không nên bật đèn LED, tôi đã bỏ qua nó ở đây.
Câu hỏi: Cách tôi đang cố gắng sử dụng các ngắt có đúng không?
Sự cố với thiết lập của tôi:
- Các nút1-3 hoàn toàn bị bỏ qua.
- Nút 4 đang kích hoạt thiết lập lại atmega
Những điều tôi đã kiểm tra:
- Các nút không được kết nối với mã PIN đặt lại
- Các nút được kết nối đúng với GND nếu được nhấn
- Các nút không được kết nối với GND nếu không được nhấn
Các nút hoạt động độc đáo nếu tôi sử dụng chúng mà không bị gián đoạn, ví dụ:
if (! (PINC & BUTTON4)) {PORTB ^ = BLUE; }
- Tinh thể ngoài / tinh thể trong 16MHZ
- Bất kỳ lỗi trong định tuyến
- Tôi đang sử dụng một tụ điện 100nF giữa PWR và GND trên atmega
- VCC (7), GND (8), GND (22), AVCC (20) được kết nối (vì tôi không cần ISF, nó không được kết nối)