ATMEGA128 RELAY 제어 실험

2023. 6. 1. 01:01Embedded/마이크로프로세서

728x90
  • RELAY 1
#include<avr/io.h>
#include<util/delay.h>
#define F_CPU 16000000UL

void Initial_set(void)
{
   DDRC=DDRC & ~(1<<PC7)&~(1<<PC6)|1<<PC4;
   PORTC=PORTC & ~(1<<PC4) |1<<PC6 |1<<PC7;
}
void Drive_red(void)
{

      PORTC |= 1<<PC4;
}

void Drive_green(void)
{
      PORTC &= ~(1<<PC4);
}

int main(void)
{
   unsigned char keyin;
   
   Initial_set();
   
      while(1) {
      if((PINC&1<<PC6) >>PC6 == 0){
         Drive_red();
      }
      else if((PINC&1<<PC7) >>PC7 ==0){
         Drive_green();
      }   
   }
   return 0;
}
  • 코드설명
   DDRC=DDRC & ~(1<<PC7)&~(1<<PC6)|1<<PC4;
   PORTC=PORTC & ~(1<<PC4) |1<<PC6 |1<<PC7;
bit 7 6 5 4 3 2 1 0
DDRC DDC7 DDC6 DDC5 DDC4 DDC3 DDC2 DDC1 DDC0
0 0 X 1 X X X X
PORTC PC7 PC6 PC5 PC4 PC3 PC2 PC1 PC0
1 1 X 0 X X X X

입력부분인 DDRC에선 푸쉬버튼인 7번핀과 6번핀을 입력으로 받았고 출력부분엔 릴레이가 연결된 4번핀을 출력으로 설정하였다.

 

void Drive_red(void)
{
      PORTC |= 1<<PC4;
}

6번핀에 연결된 푸쉬버튼을 누를시 4번핀에 연결된 릴레이가 1을 받아 빨간색LED가 작동되게 하는 코드 이다.

 

void Drive_green(void)
{
      PORTC &= ~(1<<PC4);
}

7번핀에 연결된 푸쉬버튼을 누를시 4번핀에 연결된 릴레이가 0을 받아 초록색LED가 작동되게 하는 코드이다.

 

      if((PINC&1<<PC6) >>PC6 == 0){
          Drive_red();
      }
      else if((PINC&1<<PC7) >>PC7 ==0){
          Drive_green();
      }
Bit 7 6 5 4 3 2 1 0
PINC PIN7 PIN6 PIN5 PIN4 PIN3 PIN2 PIN1 PIN0
1<<PC6 0 1 0 0 0 0 0 0
PINC&1<<PC6 0 PIN6 0 0 0 0 0 0
(PINC&1<<PC6) >>PC6 0 0 0 0 0 0 0 PIN6
Bit 7 6 5 4 3 2 1 0
PINC PIN7 PIN6 PIN5 PIN4 PIN3 PIN2 PIN1 PIN0
1<<PC7 1 0 0 0 0 0 0 0
PINC&1<<PC7 PIN7 0 0 0 0 0 0 0
(PINC&1<<PC7) >>PC7 0 0 0 0 0 0 0 PIN7

6번핀에 연결된 푸쉬버튼을 누를시 true값을 출력받아 Drive_red()함수가 실행되고 7번핀에 연결된 푸쉬버튼을 누를시 동일하게 true값을 출력받아 Drive_green()함수가 실행된다.

 


 

  • RELAY 2
#include<avr/io.h>
#include<util/delay.h>
#define F_CPU 16000000UL

void Initial_set(void)
{
   DDRC= (DDRC & ~(1<<PC7)&~(1<<PC6))|1<<PC4;
   PORTC= (PORTC & ~(1<<PC4)) |1<<PC6 |1<<PC7;
}
void Drive_red(void)
{
      PORTC =PORTC | 1<<PC4;
}
void Drive_green(void)
{
      PORTC = PORTC &~(1<<PC4);
}

int main(void)
{
   unsigned char keyin;
   Initial_set();
         while(1){
            keyin=PINC & (1<<PC7 | 1<<PC6);
            switch(keyin){
               case 0x8f:
                  Drive_red();   
               break;
               case 0x4f:
                  Drive_green();
               break;
               default:
               break;     
            }   
   }
   return 0;
}
  • 코드설명
unsigned char keyin;
keyin=PINC & (1<<PC7 | 1<<PC6);
Bit 7 6 5 4 3 2 1 0
1<<PC7 1 0 0 0 0 0 0 0
1<<PC6 0 1 0 0 0 0 0 0
1<<PC7 | 1<<PC6 1 1 0 0 0 0 0 0
PINC & (1<<PC7 | 1<<PC6) PIN7 PIN6 0 0 0 0 0 0

unsigned char keyin = 입력데이터를 받아 저장할 메모리를 확보하는 코드이다.

keyin코드는 7,6번 비트는 조사하고 나머지 비트들은 0으로 mask한다.

 

    switch(keyin){
               case 0x8f:
                  Drive_red();   
               break;
               case 0x4f:
                  Drive_green();
               break;

switch문에 keyin을 넣어 7,6번핀에 연결된 푸쉬버튼이 작동할시 코드가 실행된다. 0x8f7번 푸쉬버튼이 작동할시 Drive_red()함수가 실행되고 0x4f6번 푸쉬버튼이 작동하면 Drive_green()함수가 실행된다.

'Embedded > 마이크로프로세서' 카테고리의 다른 글

ATMEGA128 포토인터럽트 제어 실험  (0) 2023.06.01
ATMEGA128 Roullette 모형 제어  (0) 2023.06.01
ATMEGA128 Motor 제어 실험  (0) 2023.06.01
ATMEGA128 FND제어 실험  (0) 2023.06.01
ATMEGA128 LED 제어  (0) 2023.05.31