명령어와 cpu의 사양이 뒤죽박죽입니다만. 인터넷에서 필수적인 것들을 모으고있습니다.
PINA는
입력된 값을 읽고
PORTA는
출력할 값을 읽고
DDRA는
그 포트의 방향을 정해준다.
DDRA 는 제일 처음에 0xFF 이런식으로 모두다 쓴다는 식으로 설정해준다. (LED 모두를 다 쓴다는거다.)
FF 가 16진수 인데 2진수로 11111111 이므로 LED 8개 다 사용한다!!!!
PORTA 는 출력할 값을 읽는다고 했는데
PORTA =0xCC 이런식으로 주어지게 되면 1100 1100 이렇게나온다(2진수로) 그러면 LED도 저런 식으로 똑같이 사용된다.
반대는 0x33; 00110011 이다
- VCC : 전원 전압 공급 핀
- GND : 접지핀
- XTAL1 ~ XTAL2 : 발진기 입력단자. 크리스탈 또는 오실레이터를 접속한다.
- TOSC1 ~ TOSC2 : 타이머/카운터에 공급되는 클록 발진기를 접속한다.
- AVCC, AGND : AVR 내부 A/D 변환기에 공급되는 전원 입력 단자. 보통 VCC 전원에 저역필터를 거친 전원을 접속한다.
- AREF : A/D 변환기의 기준 전압 입력핀으로 AVCC와 AGND사이의 전압을 인가한다.
- ALE : Address Latch Enable 신호로 외부 메모리 또는 I/O를 확장할 때 사용하는 핀이다.
- WR : 외부 메모리 또는 I/O를 확장할 때 사용하는 쓰기(Write) 신호
- RD : 외부 메모리 또는 I/O를 확장할 때 사용하는 읽기(Read) 신호
- RESET : 리셋 입력 핀
- PEN : 저 전압 직렬 프로그램 모드에서 사용하는 Program Enable 신호이다.
- Port A (PA7..PA0) : 양방향 포트로 내부 풀업이 되어있다.
- Port B (PB7..PB0) : 양방향 포트로 내부 풀업이 되어있다.
- Port C (PC7..PC0) : 양방향 포트로 내부 풀업이 되어있다.
- Port D (PD7..PD0) : 양방향 포트로 내부 풀업이 되어있다.
- Port E (PE7..PE0) : 양방향 포트로 내부 풀업이 되어있다.
- Port F (PF7..PF0) : 양방향 포트이고, A/D 변환기 입력 포트 또는 JTAG 프트로도 사용된다.
- Port G (PG4..PG0) : 양방향 포트로 5비트만 있다.
입출력 포트
총 53개의 입출력 포트를 가지고 있다.
포트 A 에 대해 알아보기로 한다.
<?xml:namespace prefix = o /><?xml:namespace prefix = o />
□ 포트 A 데이터 방향 레지스터 (DDRA) - Port A Data Direction Register
포트 A의 입출력 방향을 제어한다.
0 = 입력 방향
1 = 출력 방향
□ 포트 A 데이터 레지스터 (PORTA) - Port A Data Register
- 출력 모드 일 때
0 = Low 출력
1 = High 출력
- 입력 모드 일 때
0 = No Pull-up (3-state(HI-Z) 상태)
1 = Pull-up 상태
□ 포트 A 입력 핀 어드레스 (PINA) - Port A Input Pin Address
PINA는 레지스터가 아닌 입력 핀의 상태를 읽는데 사용한다.
8비트로 나타낼 수 있는 비트의 형태는 총 256가지가 됩니다.
signed라하면 -128 ~ 127까지의 정수를 표현하고
unsigned로하면 0 ~255까지 수를 표현할 수 있읍니다.
핀 값
#define SW1 0x00
#define SW2 0x02
#define SW3 0x04
#define SW4 0x08
#define SW5 0x10
#define SW6 0x20
#define SW7 0x40
#define SW8 0x80
if((PIND & SW2)==0x00) <= 스위치 2가 눌리지 않았다면
if((PIND & SW2)!=0x00) <= 스위치 2가 눌렸다면
차이점을 잘 봅시다.
if((PIND == 0x04) <= 스위치 2만 눌러져야합니다. 다른건 안되는거죠.
if((PIND & SW2) != 0x00) <= 스위치2만 눌리면 됩니다. 다른건 상관없습니다.
if(PIND ==0x00) 전부 눌리면 안되는 거죠
if(PIND !=0x00) 어느 하나라도 눌리면 되는 겁니다.
if((PIND &SW0)==0x00) 스위치 0이 눌리지 않았으면
if((PIND &SW0)!= 0x00 ) 스위치 0만 누르면 됩니다.