Input pins 1.5 clock cycle delay를 갖는다.
- Read Operation을 실행하기 1.5 clock cycle 전에 input Pin의 상태가 안정되어야 한다
I/O 관련 프로그램을
- Transportabel
- Readable
- More bug free 하게 작성하기 위해 아래와같이 작성한다.
//PORTF의 PF0,PF1를 Output Port로 정의 하는 경우
DDRF |= b00000011; //와 같이 코딩 하는 것 보다 아래 와 같이 코딩 하는 것이 보다 적정 하다.
DDRF |= ( 1<< PF0) | (1 << PF1);
ATmega2560 Header File 사용
WinAVR\avr\include\avr\iom2560.h와 iomxx0_1.h File에 Port 사용에 관련된 정의가 있다.
- Header File 예
define PORTB _SFR_IO8(0x05)
#define PB7 7
#define PB6 6
#define PB5 5
#define PB4 4
#define PB3 3
#define PB2 2
#define PB1 1
#define PB0 0
iomxx0_1.h 에서 define을 이용해 정의한 symbol은 아래와 같이 이해하기 쉬운 프로그램 작성을 가능하게 한다.
PORTB = 0x05;
DDRB = 0x0A;
DDRB |= (1 << DDB2) | (1 << DDB0);
temp0 = PINB;
AND, OR, XOR 논리 연산을 이용한 Bit Operation
// PORTB의 5번 Bit를 Toggle(XOR 연산을 이용) 하는 예
PORTB = PORTB ^ 0x20; // invert
PORTB ^= 0x20;
// 웟 Coding을 압축 한 Coding 예, 윗 Coding과 동일한 결과을 얻는다.
// PORTB의 7번 Bit와 2번 Bit를 1로 Setting(OR 연산을 이용) 하는 Coding 예
PORTB = PORTB | 0x84;
PORTB |= (1 << PB7)|(1 << PB2) ;
// 윗 Coding과 동일한 결과를 얻는다. 그러나 보다 읽기(프로그램을 이해 하기) 쉽고 보다 Portable 한 Code 이다.
// PORTB의 0번 Bit와 1번 Bit를 0로 Clear(AND 연산을 이용) 하는 Coding 예
PORTB = PORTB & 0xfc;
PORTB &= ~((1 << PB0)|(1 << PB1));
// 윗 Coding과 동일한 결과를 얻는다. 그러나 보다 읽기(프로그램을 이해 하기) 쉽고 보다 Portable 한 Code 이다.
Mask를 사용 하여 개별 Bit 값을 알 수(Testing 할 수) 있다.
// Port D 의 PD0 bit 가 1 인가를 Test 한다.
if(PIND & 0x01){take_some_action();}
위 예에서 와 같이 Data의 특정 Bit가 연산 결과에 중요한 영향을 미치 도록 하는 상수를 Mask라 한다.
/*
이 예에서는 PIND Rg의 특정 Bit(이 예에서는 0번째 Bit)가
if 연산 결과를 결정 하도록 하기 위한 상수(이 예에서는 0x01)가 Masking 목적으로 사용 되었다.
*/
// D5 Bit가 0 인가를 Test 한다.
if(~PIND & 0x20){take_action();} // 0x20 이 Mask로 사용 되었다.
- avr-libc function bit_is_set() 과 bit_is_clear() 를 사용 하여 아래와 같이 프로그램 할 수도 있다.
if (bit_is_set(PINC, PC2)) {return 0;}
while (bit_is_clear(SPSR,SPIF)) {}
'arduino,avr' 카테고리의 다른 글
Atmega 2560(아두이노 메가) pin map, 기본 포트설정 (0) | 2022.04.02 |
---|---|
adc (0) | 2022.02.24 |
주사위led 연습문제 (0) | 2022.02.23 |
아두이노/avr serial통신 (0) | 2022.02.22 |
아두이노 기초 : L LED점멸 (0) | 2022.02.21 |