Atmega328 은 port register 을 통해서 각각의 pin 의 상태를 제어 할 수 있다 .
register 는 3가지 종류가 있는데 밑의 D port 를 예로 들어서
PORTD (The Port D Data Register) : 출력 핀 일때 high 인지 low 인지
DDRD (The Port D Data Direction Register) : 입력 핀 인지 출력 핀 인지 결정
PIND (The Port D Input Pins Address) : 핀의 상태를 읽는다 .
PIND 에 값을 주면 해당 bit 의 PORTD 의 bit 가 토글 된다.
책에서는 PIND 는 쓰지 말해 했으니까 쓰지 말자
저는 7번 PIN 을 사용할 꺼라서 PROTD 7 BIT 를 1로 채워주고 DDRD 또한 1로 해줘야 한다.
1000 0000 = 128 = 0x80 임으로
REGD_MODE = 0x80
#include<stdio.h>
#define REGD_MODE (*((volatile unsigned char *)0x2B)) // 헤더 파일에 존재하지만 정의해봄
#define REGD_WRITE (*((volatile unsigned char *)0x2A))
#define REGD_READ (*((volatile unsigned char *)0x29))
#define REGC_MODE (*((volatile unsigned char *)0x28))
#define REGC_WRITE (*((volatile unsigned char *)0x27))
#define REGC_READ (*((volatile unsigned char *)0x26))
#define REGB_MODE (*((volatile unsigned char *)0x25))
#define REGB_WRITE (*((volatile unsigned char *)0x24))
#define REGB_READ (*((volatile unsigned char *)0x23))
void setup()
{
Serial.begin(9600);
}
void loop()
{
REGD_MODE = 0x80;
Serial.print("REGD_MODE :");
Serial.println(REGD_MODE);
delay(500);
REGD_WRITE = 0x80; // 7번 핀 출력
//-----------토글 실험 --------
REGD_READ = 0x40;
Serial.print("REGD_READ :");
Serial.println(REGD_MODE);
delay(500);
REGD_READ = 0x40;
Serial.print("TOGLE :");
Serial.println(REGD_MODE);
delay(500);
}
0X40 을 PIND 에 넣어주면 PORTD 값의 PORTD6 값이 토글 된다.
128 = 1000 0000
192 = 1100 0000
그리고 다시 0X40 을 넣어주면 한번더 토글 해서 원래 값으로 돌아 간다.
물론 7번 포트에 꼿은 LED 또한 잘 빛나고 있다 .
마스크 입력
register 는 한번에 입력 해야 함으로 원래 저장 되어 있는 나머지 bit 는 건드리지 않고 자신이 원하는 bit만 설정 하기 위해서 마스크 입력을 사용한다.
#include<stdio.h>
#define REGD_MODE (*((volatile unsigned char *)0x2B))
#define REGD_WRITE (*((volatile unsigned char *)0x2A))
#define REGD_READ (*((volatile unsigned char *)0x29))
#define REGC_MODE (*((volatile unsigned char *)0x28))
#define REGC_WRITE (*((volatile unsigned char *)0x27))
#define REGC_READ (*((volatile unsigned char *)0x26))
#define REGB_MODE (*((volatile unsigned char *)0x25))
#define REGB_WRITE (*((volatile unsigned char *)0x24))
#define REGB_READ (*((volatile unsigned char *)0x23))
void setup()
{
Serial.begin(9600);
}
void loop()
{
REGD_MODE = 0x80;
Serial.print("REGD_MODE :");
Serial.println(REGD_MODE);
REGD_WRITE = 0x80;
delay(2000);
REGD_READ = 0x40;
REGD_WRITE = REGD_WRITE | 0x40; // 마스크 입력
Serial.print("REGD_READ :");
Serial.println(REGD_MODE);
delay(500);
}
'공부,일 > atmega328P' 카테고리의 다른 글
atmega 328p PWM & timer counter (1) 분주비 , 타이머 vs 카운터 (0) | 2021.07.27 |
---|---|
ISR() 분석 - 전처리문 분석 (0) | 2021.07.20 |
i/o register 0x0(0x20)메모리 주소의 의미 (기본기) (0) | 2021.07.20 |
EEPROM 사용하기 (0) | 2021.07.18 |
ATmega328P 기본 개념 정리(기본기) (0) | 2021.07.15 |
댓글