C\C++/임베디드 시스템

임베디드시스템 릴레이 부저 제어 테스트

sundori 2023. 11. 18. 22:55

릴레이 부저 제어 테스트

LED_CONSET_CON은 각각 0x80000x8100의 주소를 할당받고, 부호 없는 문자형 포인터로 취급하며, 이러한 주소는 외부 I/O를 제어하는 데 사용한다.

#define LED_CON *((unsigned char *)0x8000)
#define SET_CON *((unsigned char *)0x8100)

 

Buzz, Relay1, Relay2는 특정 핀 번호에 할당하며, 그다음의 라인에서는 이러한 핀을 켜고 끄기 위한 비트 마스크를 정의한다.

#define Buzz 6
#define Relay1 0
#define Relay2 1

#define Relay1_on 1<<Relay1
#define Relay2_on 1<<Relay2
#define Buzz_on 1<<Buzz

#define Relay1_off 0<<Relay1
#define Relay2_off 0<<Relay2
#define Buzz_off 0<<Buzz

포트 B의 핀 0 및 1에 연결된 두 개의 스위치의 상태에 대한 별칭을 정의한다.

#define SW1 PINB.0
#define SW2 PINB.1

MCUCR 레지스터를 설정하여 외부 메모리 및 I/O 제어를 활성화한다.

일반적으로 메모리에 매핑된 I/O와 관련이 있다.

void main() {
    MCUCR = 0x80; // 외부 메모리와 I/O 제어를 활성화합니다.

외부 I/O를 0으로 설정하여 LED 및 제어 레지스터를 초기화한다.

    LED_CON = 0x00;
    SET_CON = 0x00;

main 함수로서 무한 루프에 진입하고 SW1SW2의 상태를 확인하며, 만약 SW1이 눌리면 LED를 켜고 Relay1, Relay2, 및 부저를 짧은 시간 동안 활성화한 다음 끄고 SW2가 눌리면 유사한 동작을 수행하지만 다른 설정으로 수행한다. delay_ms(100) 함수는 100 밀리초의 지연을 발생할 때 사용한다.

    while (1) {
        if (!SW1) { // 만약 SW1이 눌렸다면
            LED_CON = 0x01;
            SET_CON = Relay1_on | Relay2_on | Buzz_on;
            delay_ms(100); // 100ms 지연
            SET_CON = Relay1_on | Relay2_on | Buzz_off;
            LED_CON = 0x00;
        }
        if (!SW2) { // 만약 SW2이 눌렸다면
            LED_CON = 0x02;
            SET_CON = Relay1_off | Relay2_off | Buzz_on;
            delay_ms(100); // 100ms 지연
            SET_CON = Relay1_off | Relay2_off | Buzz_off;
            LED_CON = 0x00;
        }
    }
}

전체 코드

#include <mega128.h>
#include <delay.h>

// External I/O 레지스터 정의
#define LED_CON *((unsigned char *)0x8000)
#define SET_CON *((unsigned char *)0x8100)

// 핀 정의
#define Buzz 6
#define Relay1 0
#define Relay2 1

#define Relay1_on 1 << Relay1
#define Relay2_on 1 << Relay2
#define Buzz_on 1 << Buzz

#define Relay1_off 0 << Relay1
#define Relay2_off 0 << Relay2
#define Buzz_off 0 << Buzz

// 스위치 정의
#define SW1 PINB.0
#define SW2 PINB.1

void main() {
    // 외부 메모리와 I/O 제어 활성화
    MCUCR = 0x80;

    // 외부 I/O 초기화
    LED_CON = 0x00;
    SET_CON = 0x00;

    while (1) {
        // 만약 SW1이 눌렸다면
        if (!SW1) {
            // LED를 켜고 Relay1, Relay2, 그리고 부저를 짧은 시간 동안 활성화
            LED_CON = 0x01;
            SET_CON = Relay1_on | Relay2_on | Buzz_on;
            delay_ms(100); // 100ms의 지연 도입
            // Relay1, Relay2, 그리고 부저를 끄고 LED를 끔
            SET_CON = Relay1_on | Relay2_on | Buzz_off;
            LED_CON = 0x00;
        }

        // 만약 SW2이 눌렸다면
        if (!SW2) {
            // 다른 LED를 켜고 Relay1, Relay2, 그리고 부저를 짧은 시간 동안 활성화
            LED_CON = 0x02;
            SET_CON = Relay1_off | Relay2_off | Buzz_on;
            delay_ms(100); // 100ms의 지연 도입
            // Relay1, Relay2, 그리고 부저를 끄고 LED를 끔
            SET_CON = Relay1_off | Relay2_off | Buzz_off;
            LED_CON = 0x00;
        }
    }
}