ATMEGA128 RELAY 제어 실험
2023. 6. 1. 01:01ㆍEmbedded/마이크로프로세서
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번핀에 연결된 푸쉬버튼이 작동할시 코드가 실행된다. 0x8f인 7번 푸쉬버튼이 작동할시 Drive_red()함수가 실행되고 0x4f인 6번 푸쉬버튼이 작동하면 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 |