본문 바로가기
공부,일/atmega328P

Register 이용해서 LED 켜기

by fromnothing1 2021. 7. 16.

출처:https://steemit.com/kr/@codingart/49-avr-ddrd-portd-led-on-off
atmega328p chip

 

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

}

 

 

댓글