Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- ring counter
- Linked List
- verilog
- half adder
- dataflow modeling
- BASYS3
- structural modeling
- LED
- KEYPAD
- gpio
- java
- vivado
- soc 설계
- FND
- prescaling
- Algorithm
- Recursion
- i2c 통신
- stop watch
- D Flip Flop
- hc-sr04
- test bench
- behavioral modeling
- DHT11
- uart 통신
- ATMEGA128A
- atmega 128a
- Edge Detector
- Pspice
- pwm
Archives
- Today
- Total
거북이처럼 천천히
Pointer 본문
1. 환경 : Microchip Studio
2. 목표 : Pointer 개념을 활용하여 GPIO Control 함으로서 Pointer의 개념 정비 및 기본 활용 학습
3. 구현 내용 : Shift 연산자와 Bit OR 연산자를 이용하여 1번쩨 비트 ~ 7번째 비트까지 누적하여 LED 출력
4. Source code
- main.c
- controlLED.c (LED에 관한 함수)
- common.h (라이브러리, 기본 헤더 파일을 include 한 파일)
- personal.h (함수 원형 선언 및 상수 선언)
#include "personal.h"
int main(void) {
initDDR();
// 임의의 데이터를 초기화
uint8_t data = PORTD1;
while(1) {
control_LED(&data);
}
}
#include "personal.h"
// 1. initialization Data Direction Registor.
void initDDR() {
// PORT D의 8핀을 출력으로 정의 및 설정
DDRD = 0xff;
}
// 2. GPIO Output
void GPIO_Output(uint8_t data) {
PORTD = data;
}
// 3. Left shift + accumulation
void left_shift(uint8_t *p_data) {
// accumulation
*p_data = *p_data<<1;
*p_data |= PORTD1;
GPIO_Output(*p_data);
}
// 4. Right shift + accumulation
void right_shift(uint8_t *p_data) {
// accumulation
*p_data >>= 1;
GPIO_Output(*p_data);
}
// 5. Control LED
void control_LED(uint8_t *data) {
PORTD = *data;
_delay_ms(TIME);
for(uint8_t i=0; i<7; i++) {
left_shift(data);
_delay_ms(TIME);
}
for(uint8_t i=1; i<8; i++) {
right_shift(data);
_delay_ms(TIME);
}
}
#ifndef COMMON_H_
#define COMMON_H_
#define F_CPU 16000000UL
#include <avr/io.h>
#include <util/delay.h>
#endif /* COMMON_H_ */
#ifndef PERSONAL_H_
#define PERSONAL_H_
#include "common.h"
// define constant
#define TIME 200
// function prototype.
void initDDR();
void GPIO_Output(uint8_t data);
void left_shift(uint8_t *p_data);
void right_shift(uint8_t *p_data);
void control_LED(uint8_t *data);
#endif /* PERSONAL_H_ */
※ 일반적인 C언어에서의 Pointer의 개념 및 사용과 크게 다르지 않다.
5. 구현
'Embedded Programming (AVR) > Atmega 128A (실습)' 카테고리의 다른 글
Data Direction Register의 비트 단위로 Control (0) | 2024.05.26 |
---|---|
궁금증 정리 노트 - Atmega128A (0) | 2024.05.25 |
Separate Compilation (0) | 2024.05.25 |
Atmega128a의 변수 정리 (0) | 2024.05.25 |
GPIO - LED control (2) (0) | 2024.05.25 |