뉴티씨



  • HOME
  • 고객지원
  • 자주하는 질문

 
코드비전에서의 비트제어
 글쓴이 : administrato…
작성일 : 11-07-21 21:47
조회 : 5,347  
코드비전에서의 비트제어관련된 내용입니다. 참고 바랍니다.

특이하게도 Codevison에서는 옛날 8051처럼 AVR도 PORTA.0 이런 식으로 제어할 수 있도록 만들어 두었는 데, 이는 첫 32개의 레지스터들에 대해서만 핀 확장명을 쓸 수 있도록 된 것으로 알고 있습니다.  이는 AVR의 개발 과정과 관련이 있는 데요. 처음 설계시 ATMEGA103 처럼 레지스터를 어드레스 0x3F까지만(ATMEGA128의 0x5F에 해당) 지원했었는 데요 PORTF 부터는 원래 없던 부분입니다. 이 부분을 신규로 만들어 내면서, 첨에 칩설계시 설계고려하지 않은 부분이라서 다른 구조로 설계해야 했습니다. 그래서, 어셈블리 명령어로 짜더라도, 명령어가 다릅니다.

포트 A~E는

        LDI        AL,0xFF                        ; initialize PORTB = output
        OUT      DDRB,AL
        LDI        AL,0b01010000                ; LED1,3 on
        OUT      PORTB,AL

라고 할 수 있는데,

PORTF는
        LDI        AL,0xFF                        ; PORTF = output
        STS      DDRF,AL
        LDI        AL,0x00
        STS      PORTF,AL
이렇게 해야 합니다.

아래는 일반 명령 방식으로 쉽게 짜는 방법을 기술해 두었으니 참고 바랍니다.  본사의 FAQ에 있는 내용입니다.

- 아래 -
8051 등에서는 비트별로 제어하는 함수들이 있었는 데 AVR에서는 그런 함수들이 잘 없어서,
불편해 하시는 분들을 많이 보았습니다.
예를 들어서, 8051에서는 P1.0 = 1; 이렇게 하면 포트 1의 0번 비트를 1로 쓸 수 있었지요.
무척 편리했습니다.  

그런데, 그렇게 하면 헥사 코드가 커지게 되어서, ICCAVR에서는 그러한 함수가 없습니다.
자체적으로 제작하여 사용해야 하지요. 그래서, 아래와 같이 만들어서 쓰곤 합니다.

아래는 비트 제어 하는 입출력 관련 정의입니다.
함수로 만들어도 쓰지만, 아래와 같이 define문으로 만들어 쓰면 편리하고 빠릅니다.
함수로 들어가지 않아도 되니까요. 함수로 들어가는 시간이 절약 되겠지요.

참고 하시길 바랍니다.

- 아래 1-
#define sbi(PORT, bit)        (PORT) |= (1 << (bit))
#define cbi(PORT, bit)        (PORT) &= ~(1 << (bit))

- 아래 2 -
#define        OUTPORT                        PORTC

#define        BIT_4                                0x10
#define        BIT_5                                0x20

#define        BIT4(m)                m?(OUTPORT|=BIT_4):(OUTPORT&=~BIT_4)
#define        BIT5(m)                m?(OUTPORT|=BIT_5):(OUTPORT&=~BIT_5)

아래 2처럼 하시면 나름 편리할 수도 있습니다.
하지만, 보통은 아래 1로 많이 씁니다.

입력 받는 것은

#define        INPORT                        PINC  

   unsigned char test4, test5;
   test4=INPORT&(0x10);
   test5=INPORT&(0x20);

이렇게 하시면 됩니다.


 
   
 


1