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 |
|---|