본문 바로가기
나의 전자 공부방/Atmega128a

1. Atmega128a 첫 사용기 (GPIO 설정)

by 나만의생각 2023. 3. 13.

Atmega128a를 사용할때 C언어를 사용합니다.

C 파일들을 차곡차곡 쌓아서 올리는것을 스택이라고하는데, 상위단계 파일들이 하위 단계의 파일들에게 의존하게 해서 main함수에는

간단한 함수를 사용합니다.


Gpio.h

1
2
3
4
5
6
7
8
9
void Gpio_writePin(volatile uint8_t *PORT, uint8_t pinNum, uint8_t state)
{
    if (state == GPIO_PIN_SET) {
        *PORT |= (1 << pinNum); // GPIO_PIN_SET
    }
    else {
        *PORT &= ~(1 << pinNum); // GPIO_PIN_RESET
    }
}
cs

함수들을 헤더파일을 이용하여 간단하게 나타내었습니다.

 

Gpio.c

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#include "Gpio.h"
 
void Gpio_initPort(volatile uint8_t *DDR, uint8_t dir)
{
    if (dir == OUTPUT) {
        *DDR = 0xff;
    }
    else {
        *DDR = 0x00;
    }
}
 
void Gpio_initPin(volatile uint8_t *DDR, uint8_t pinNum, uint8_t dir)
{
    if (dir == OUTPUT) {
        *DDR |= (1 << pinNum); // OUTPUT mode
    }
    else {
        *DDR &= ~(1 << pinNum); // INPUT mode
    }
}
 
void Gpio_writePort(volatile uint8_t *PORT, uint8_t data)
{
    *PORT = data;
}
 
uint8_t Gpio_readPort(volatile uint8_t *PIN)
{
    return *PIN;
}
 
void Gpio_writePin(volatile uint8_t *PORT, uint8_t pinNum, uint8_t state)
{
    if (state == GPIO_PIN_SET) {
        *PORT |= (1 << pinNum); // GPIO_PIN_SET
    }
    else {
        *PORT &= ~(1 << pinNum); // GPIO_PIN_RESET
    }
}
 
uint8_t Gpio_readPin(volatile uint8_t *PIN, uint8_t pinNum)
{
    return ((*PIN & (1 << pinNum)) != 0); // xxx1xxxx & 00010000 => 16
}
 
cs

 

 

 

1
2
3
4
5
6
7
8
9
10
11
#include "Gpio.h"
 
void Gpio_initPort(volatile uint8_t *DDR, uint8_t dir)
{
    if (dir == OUTPUT) {
        *DDR = 0xff;
    }
    else {
        *DDR = 0x00;
    }
}
cs

먼저 Gpio_initport 함수를 생성하여 Port를 초기화해줍니다.

OUTPUT모드면 0xff INPUT모드면 0x00입니다.

 

1
2
3
4
5
6
7
8
9
void Gpio_initPin(volatile uint8_t *DDR, uint8_t pinNum, uint8_t dir)
{
    if (dir == OUTPUT) {
        *DDR |= (1 << pinNum); // OUTPUT mode
    }
    else {
        *DDR &= ~(1 << pinNum); // INPUT mode
    }
}
cs

둘째로 Pin을 초기화해줍니다. 1이 output 0이 input이라하면

0번째 핀을 output모드 하고싶으면 xxxx xxx1 | | 0000 0001 이 되어 pin을 output모드로 사용시킵니다.

0번째 핀을 input 모드로 하고싶으면 xxxx xxx1 && 0000 0001 의 역인 xxxx xxx0 && 0000 0000이 되어 input 모드를 활성화합니다.

1
2
3
4
5
6
7
8
9
void Gpio_writePort(volatile uint8_t *PORT, uint8_t data)
{
    *PORT = data;
}
 
uint8_t Gpio_readPort(volatile uint8_t *PIN)
{
    return *PIN;
}
cs

 

*PORT에 data의 값을 저장시키고 불러옵니다.

*PIN 값을 리턴시켜줍니다.

1
2
3
4
5
6
7
8
9
void Gpio_writePin(volatile uint8_t *PORT, uint8_t pinNum, uint8_t state)
{
    if (state == GPIO_PIN_SET) {
        *PORT |= (1 << pinNum); // GPIO_PIN_SET
    }
    else {
        *PORT &= ~(1 << pinNum); // GPIO_PIN_RESET
    }
}
cs

pinNum의 데이터를 토대로 PORT를 입력,출력 시켜줍니다.

 

*Pin값으로 리턴시켜줍니다

 

 

다음내용은 다음에!!

'나의 전자 공부방 > Atmega128a' 카테고리의 다른 글

8. Atmega128을 사용하여 I2C통신 하기  (0) 2023.03.31