로그인회원등록 내글장바구니주문조회현재접속자
 상품 검색








 게시판 검색





 
 
회원등록 비번분실


온라인 입금계좌
ㆍ기업은행
ㆍ219-043192-01-028
ㆍ이건영

      거래은행 바로가기
 
 Arduino Open Source
아듀이노 함수의 상세설명
작성자 avrtools™        
작성일 2010/10/30
ㆍ추천: 0  ㆍ조회: 2366   
  8비트 포트의 단일비트 조작방법
AVR의 비트 조작방법
AVR 칩에는 여러개의 포트가 있는데, 한개의 포트는 8개의 비트로 되어 있습니다.
포트D를 예로 들면, 비트 번호로는  PD0 부터 PD7 까지 입니다.
 
다른 비트의 상태는 전혀 모르며, 일절 건드리고 싶지 않고,
포트 D의 6번 비트를 High로 만들려면? 방법이 있습니다. 
 
비트 출력 방법
포트 중에서 1개의 비트를 1과 OR 논리 연산하여 출력하면 됩니다.
PORTD |= (1<<6);   // 비트 OR 명령으로 포트 D의 6번 비트를 무조건 1로 세트합니다.
 
그렇다면, 만일 포트 D의 6번 비트를 Low로 만들려면?
포트 중에서 1개의 비트를 0과 AND 논리 연산하여 출력하면 됩니다.
PORTD &=  ~(1<<6);   // 비트 OR 명령으로 포트 D의 6번 비트를 무조건 0으로 세트합니다.
 
비트를 0으로 만들기 위해, 먼저 해당 비트 6에 들어 갈 1을 ~(NOT 논리연산)으로 뒤집어서 0으로 만들고,
마지막에 포트의 6번 비트와 뒤집은 비트를 AND 논리 연산하면 한개의 비트만 0으로 됩니다.
 
비트 입력 방법
마지막으로 포트에 있는 8개의 비트 중에서 1개의 비트 값을 읽으려면?
if (PIND & (1<<2))   // 포트 D의 8개 비트 중에서 2번 비트의 값을 읽는다.
{
    // 만일 PD2 비트값이 1 이면 여기를 실행하게 된다, 자신이 처리할 코드를 넣는다.

}
else
{

    // 만일 PD2 비트값이 0 이면 여기를 실행하게 된다, 자신이 처리할 코드를 넣는다
}
 
비트 조작의 응용
자, 이제는 비트 입력과 비트 출력을 이용한 응용을 할 단계입니다.
단일 비트의 상태를 읽어서, 단일 비트에 연결된 LED를 제어하려고 하면?
   PORTD |= (1<<5);    // 예: 포트D의 비트 5를 1로 세트한다.
   PORTD &= ~ (1<<5);    // 예: 포트D의 비트 5를 0으로 리셋한다. 

 
입력 포트의 풀업 방법
입력 핀의 외부에 풀업 저항을 달지 않고, 펌웨어에서 풀업이 가능합니다.
void port_init()
{
    // 포트D의 입출력을 D7 부터 D4 까지는 0000 이므로 출력으로 설정
    // 포트D의 입출력을 D3 부터 D0 까지는 1111 이므로 입력으로 설정
    DDRD =0x0F;       
    // 포트D의 D3 부터 D0 까지 입력으로 설정된 비트를 1111로 출력하여 풀업한다
    PORTD =0x0F;
} 

고급 비트 설정방법 
조금 더 발전하기 위해, 비트를 설정하는 방법을 고급으로 만들어 보겠습니다.
 
SPI 포트를 초기화하는 예를 들면, 우선 각 비트들을 출력은 0으로, 입력은 1로 만듭니다.
다음, 각 비트를 OR 연산하여 바이트로 만든 다음, 목적지 SFR인 DDRx 나 PORTx 로 출력합니다.
 
// SPI 초기화: PB2(SCK), PB0(MOSI), PB3(nCS)는 입력, PB1(MISO)는 출력으로 설정
 DDRB = ((0 << PB0) | (1 << PB1) | (0 << PB2) | (0 << PB3));
 PORTB = ((0 << PB0) | (0 << PB1) | (0 << PB2) | (0 << PB3));

 
위에서 0<<PB0는 DDRB의 0번 비트를 0 (출력)으로 설정합니다
또한 1 << PB1은 DDRB의 1번 비트를 1 (입력)로 설정합니다.

한개의 포트를 입출력으로 쓰는 팁
포트B를 예를 들어 설명한다면 포트B의 SFR은 DRRB, PORTB, PINB 가 있습니다.
예, 출력을 0으로 작동하고, 입력 또한 0으로 읽히면 출력이 작동 상태라고 읽을 수 있습니다.
 
DDRB는 포트B의 입출력을 설정하는 SFR로 0 이면 출력,  1 이면 입력입니다. 
PORTB는 포트B의 출력으로 0 이면 Low, 1 이면 High로 출력됩니다.
만일 PORTB를 읽는다면, 단순히 직전에 출력된 상태를 읽게 됩니다. (포트의 상태를 읽는 것이 아닙니다)
PINB는 포트B가 출력으로 설정 되었다 하더라도, 포트에 연결된 입출력상태를 읽을 수 있습니다.

실제로 1개의 포트 핀을입출력으로 쓰는 경우는 별로 없고,
대부분 출력과 입력이 공용인 인터 페이스에서 입력을 할 때와 출력을 할 떄 마다,
필요에 따라서 DDR로 입출력 방향을 바꾸어 주고, 출력을 하든지, 입력을 합니다.
 
만일 핀 외부에 풀업 저항이 없을 떄 입력을 설정하고,
스위치 만 연결된 포트를 읽는 다면 잡음만 들어 올 수 있으므로,
먼저 필요한 PORTx의 해당 비트를 1로 만들어 PORTx에 출력하여 풀업을 하고,
이어서 DDRx를 입력으로 설정한 다음, 포트를 PINx로 읽습니다.

고급 포트 읽기 방법
주 함수의 순환상태 안에서 주함수를 처리하는 틈틈이 입력 포트를 읽는 방법을 사용하면,
더욱 빠르게 입력상태를 읽어서 처리해야 한다면, 또한, 언제라도 매우 빠르게 사라지는 입력상태를 읽어야 한다면? 
입력이 없을 때도, 매번 입력을 빼놓지 않고, 일정 간격 마다, 주함수에서 읽어 주어야 하므로,,,  
결국 주함수의 처리시간이 늘어 지거나, 주함수 처리 시간이 부족한 현상이 발생하게 됩니다.  

타이머 초기화 함수는 Freerun 상태로 보통 1~10 ms 정도의 간격으로
Overflow 가로채기를 발생하게 만들어 주고,
타이머 Overflow 가로채기(interrupt) 함수에서 입력 포트를 일정한 간격으로 읽어서,
그 결과를 간단하게 나마 처리한 다음,

주함수에서 읽을 수 있도록 광역변수에 저장하는 방법을 사용해야 합니다. 
 
또한, 매번 타이머 Overflow 가로채기에서 읽어낸 입력포트의 값을 
먼저번 가로채기 때 읽은 값과 비교하여, 변화가 있으면,
미리 준비한 입력변수에 남는 비트를 이용하여 입력플랙을 1로 세트해 줍니다.
이 입력플랙 비트를 주함수에서 입력분기 지점에서 여유있게 읽어 보고,
플랙비트의 변화에 따라 주함수를 처리합니다.
  
어떻습니까? 이렇게 처리하면,
구태여 복잡한 RTOS 함수뭉치를 사용하지 않아도, 고급 입출력 처리가 가능합니다.
멀티 타스킹 처리방법을 사용한 고급 함수뭉치 처럼,
고급 펌웨어는 한층 품격이 높아진 입출력 처리능력을 가지게 됩니다.  

이 프로그램은 무료 소프트웨어로, 신체와 재산 상의 어떤 위험과 손해를 보상하지 않습니다.
이 프로그램은 GNU 무료 소프트웨어 배포규정을 따릅니다.
Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA
AVRTOOLS™
 
   
  0
9999
윗글 아듀이노 PWM 출력과 타이머1 전용명령
아래글 직렬포트에서 문자를 받아 숫자 int로 저장
    N         제목    글쓴이 작성일 조회 추천
판매상품의 사용설명서는 다른 자료실에,,, avrtools™ 2011/08/30 (화) 1461 0
23 LCD 문자표시 (신형) avrtools™ 2012/04/12 (목) 2102 0
22 아듀이노 멜로디 연주 avrtools™ 2008/08/22 (금) 3455 0
21 아듀이노 4비트 LCD (구형) avrtools™ 2008/09/02 (화) 4302 0
20 아듀이노 가변저항 avrtools™ 2008/08/26 (화) 3074 0
19 직렬 데이터 이동(shift) 출력 avrtools™ 2012/04/10 (화) 1712 0
18 디지털 신호의 펄스폭을 측정하는 함수 avrtools™ 2012/04/10 (화) 1974 0
17 EEPROM 읽기, 쓰기 함수 avrtools™ 2012/04/10 (화) 2281 0
16 변수의 크기 avrtools™ 2012/04/10 (화) 1613 0
15 플레시 메모리에 상수를 저장하고 읽는 함수 avrtools™ 2012/04/10 (화) 1897 0
14 소프트웨어 Serial 함수 avrtools™ 2012/04/10 (화) 1794 0
13 아듀이노 터치스위치 [3] avrtools™ 2008/08/11 (월) 4105 0
12 아듀이노 shiftOut avrtools™ 2008/09/10 (수) 3364 0
11 아듀이노 스위치와 LED점등 avrtools™ 2008/08/13 (수) 4635 0
10 아듀이노의 주파수 출력 함수 avrtools™ 2009/10/20 (화) 2737 0
9 One Button Switch Library avrtools™ 2012/03/09 (금) 1841 0
8 아듀이노 논리연산 avrtools™ 2008/08/26 (화) 3005 0
7 아듀이노 PS2 키보드 읽기 avrtools™ 2008/09/10 (수) 4072 0
6 아듀이노 가로채기 함수 avrtools™ 2008/08/23 (토) 3186 0
5 아듀이노 전용명령 avrtools™ 2008/09/16 (화) 3914 0
4 아듀이노 PWM 출력과 타이머1 전용명령 avrtools™ 2008/08/19 (화) 3562 0
3 8비트 포트의 단일비트 조작방법 avrtools™ 2010/10/30 (토) 2366 0
2 직렬포트에서 문자를 받아 숫자 int로 저장 avrtools™ 2012/04/08 (일) 1682 0
1 직렬통신포트의 초기화 avrtools™ 2012/04/06 (금) 1469 0
1

바구니 : 0
 보관함 : 0
오늘뷰 : 0
HOME   |   회사소개   |   제휴안내   |   회사위치   |   서비스이용 약관   |   개인정보 보호정책   |   사이트맵
17015 경기도 용인시 기흥구 동백중앙로16번길 16-25, 508호. 전화 : 031-282-3310
사업자 등록번호 : 697-47-00075 / 대표 : 이건영 / 업태 : 제조업 / 종목 : LED조명, LED전원, 제어장치.
개인정보 관리책임자 : 홈페이지 관리자 . Copyright ⓒ2016 아크레즈 (ACLEDS INC.)
HOME TOP PREVNEXT 0 0 0