본문 바로가기
💻 Microprocessor/캡스톤 챌린지

[2주차] (External Interrupt) Caston Challenge 4

by GroovyArea 2022. 10. 5.

※ 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를 사용하는 것이 좋겠다.

반응형