ฉันกำลังพยายามใช้การขัดจังหวะการเปลี่ยนพินเพื่อตรวจจับปุ่มกด จนถึงตอนนี้ฉันไม่เคยทำงานกับการขัดจังหวะแบบนี้และมีปัญหาบางอย่างดังนั้นฉันจึงต้องการตรวจสอบให้แน่ใจว่านี่เป็นการใช้งานที่ถูกต้องหรือไม่
หากฉันได้รับแผ่นข้อมูลถูกต้องสิ่งต่อไปนี้จะต้องทำเพื่อใช้ขัดจังหวะการเปลี่ยนพิน:
- ตั้งค่า PIN ใดที่คุณต้องการควบคุมในการลงทะเบียน PCMSK
- เปิดใช้งานการลงทะเบียน PIN สำหรับการเปลี่ยนการควบคุมการขัดจังหวะพิน (PCICR)
- เปิดใช้งานการขัดจังหวะ
- ใช้เวกเตอร์ขัดจังหวะที่สอดคล้องกัน
โครงการ: Simple Moodlamp, ควบคุมสีด้วยปุ่ม 4 ปุ่ม
ติดตั้ง:
- Atmega168A-PU
- สวิตช์ปุ่มกดขนาดเล็ก 4 ปุ่ม
- MOSFETS เพื่อควบคุมไฟ LED RGB 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);
}
}
หมายเหตุ: ปุ่มควรจะถูกหักออก เนื่องจากฉันพยายามทำตามขั้นตอนนี้และไม่ควรจะเป็นอย่างยิ่งสำหรับการเปิดไฟ LED ฉันจึงเพิกเฉยที่นี่
คำถาม:วิธีที่ฉันพยายามใช้อินเทอร์รัปต์นั้นถูกต้องหรือไม่?
มีปัญหากับการตั้งค่าของฉัน:
- Buttons1-3 จะถูกละเว้นโดยสิ้นเชิง
- Button4 กำลังเรียกใช้การรีเซ็ต atmega
สิ่งที่ฉันตรวจสอบ:
- ปุ่มต่างๆไม่ได้เชื่อมต่อกับ PIN รีเซ็ต
- ปุ่มเชื่อมต่อกับ GND อย่างถูกต้องหากกด
- ปุ่มไม่ได้เชื่อมต่อกับ GND หากไม่ได้กด
ปุ่มทำงานได้ดีถ้าฉันใช้มันโดยไม่ขัดจังหวะเช่น:
ถ้า (! (PINC & BUTTON4)) {PORTB ^ = BLUE; }
- 16MHZ คริสตัลภายนอก / คริสตัลภายใน
- ข้อผิดพลาดใด ๆ ในการกำหนดเส้นทาง
- ฉันใช้ตัวเก็บประจุ 100nF ระหว่าง PWR และ GND กับ atmega
- VCC (7), GND (8), GND (22), AVCC (20) เชื่อมต่อกัน (เนื่องจากฉันไม่ต้องการ AREF, ไม่ได้เชื่อมต่อ)