※ Caston Challenge 2번, 3번 문제는 하드웨어적 구성이기 때문에 생략하겠습니다.
문제
- 스위치 1은 Falling Edge로
- 스위치 2는 Rising Edge로 설정
- AVR 명령어(PORT 입출력)를 사용하여 Interrupt 실험
- 스위치 1 Debounce 회로를 설계
- 스위치 2 일반 회로로 설계
- 스위치 1 LED 4개가 LSB 부터 하나씩 누적하여 On, LCD에는 1행에는 “Falling Edge” Display하고, 2행에는 현재 LED가 몇개 On 되었는지 개수를 Display
- 스위치 2 LED 4개가 MSB 부터 하나씩 이동하면서 On, LCD에는 1행에는 “Rising
Edge”라고 Display, 2행에는 MSB 기준으로 첫번째 LED를 1이라고 했을 때, 현재 몇 번 째 LED가 On 되어 있는지 위치를 Display
문제 이해
문제에 나온 순서 그대로 회로를 구성하여 진행하면 될 것 같다.
LSB, MSB가 오랜만에 듣는 개념이라 led 포트의 비트를 잘 조작해야 될 것 같다.
코드
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
#define led1 22
#define led2 23
#define led3 24
#define led4 25
#define sw1 2
#define sw2 3
volatile int state = HIGH;
volatile int count_sw1 = 0;
volatile int count_sw2 = 4;
const byte interruptPin1 = 2;
const byte interruptPin2 = 3;
void setup() {
// put your setup code here, to run once:
pinMode(led1, OUTPUT);
pinMode(led2, OUTPUT);
pinMode(led3, OUTPUT);
pinMode(led4, OUTPUT);
pinMode(sw2, INPUT_PULLUP);
lcd.init();
lcd.backlight();
noInterrupts();
interrupts();
attachInterrupt(digitalPinToInterrupt(interruptPin1), leastToMost, FALLING);
attachInterrupt(digitalPinToInterrupt(interruptPin2), mostToLeast, RISING);
}
void loop() {
if (count_sw1 > 0 && count_sw1 < 5) {
lcd.clear();
lcd.print("Falling Edge");
lcd.setCursor(0, 2);
lcd.print(count_sw1);
}
if (count_sw1 >= 5) {
count_sw1 = 0;
PORTA = 0x01;
}
if (count_sw2 < 4 && count_sw2 >= 0) {
lcd.clear();
lcd.print("Rising Edge");
lcd.setCursor(0, 1);
lcd.print(count_sw1);
}
if (count_sw2 < 0) {
count_sw2 = 0;
PORTA = 0x04;
}
}
void leastToMost() {
count_sw1++;
PORTA = 0x01 << count_sw1;
}
void mostToLeast() {
count_sw2--;
PORTA = 0x04 >> count_sw2;
}
- LCD는 I2C 통신이 가능한 LCD를 이용
- 인터럽트 핀 2개를 지정하여 Falling, Rising 인터럽트 설정
- 인터럽트 발생 시 count 변수를 이용하여 비트를 조작했다.
I2C LCD를 사용하면서 디스플레이가 계속 깨지는 일이 발생했다.
알아보니, I2C도 인터럽트가 필요한데, 그 과정에서 내가 설정한 인터럽트와 동시에 꼬인 이유가 있을 수 있다고 들었다.
인터럽트를 사용하는 실험에서는 일반 LCD를 사용하는 것이 좋겠다.
반응형
'💻 Microprocessor > 캡스톤 챌린지' 카테고리의 다른 글
[6주차] (Led Matrix) Capston Challenge (0) | 2022.10.13 |
---|---|
[5주차] (Timer Counter Interrupt) Capston Challenge (0) | 2022.10.09 |
[2주차] Capston challenge 1 (0) | 2022.09.12 |