본문으로 바로가기

[AVR] AVR GPIO 컨트롤 (sbit)

category 프로그램 이야기/AVR 2022. 7. 10. 00:34
728x90
반응형

  내가 주로 사용했던 MCU가 Siliconlab사의 C8051인데 MCU 치고는 성능은 좋으나 가격이 좀 되어서 민수 분야에서는 사용이 좀 어려운 소자였다. 그러나 내 기준에서는 컴파일러 사용이 매우 용이하고 IDE가 구형으로 업데이트가 안되고 있긴 하지만(8bit 기준) 여튼 편리했었다.

 그러나 뭐 이게 요즘 자재 난과 주변에 사용하는 사람이 적은 관계로 주로 Atmega나 PIC 그리고 요즘 대세인 ARM인 STM32를 사용하고 그러다보니 8051에서 사용하는 기능이 아쉬운 것이 몇개가 있다.

 그중 대표적인 것이 sbit 기능....물론 이건 PIC에도 있긴 하지만 AVR에는 없다. 못찾은 것인지 모르겠지만 비슷하게 define해서 사용하는 건 봤어도 구현이 똑같이 되지 않는다. 여튼 그런 이유로 sbit을 나름 편리하게 구현하려고 고민하였는데 대부분 이렇게 사용하고 있었다.

sbi와 cbi를 사용하고 있었고 여기에 rbi를 추가해서 사용하면 될 것 같았다. 그러나 이렇게 쓰기에는 불편하다.

sbit의 장점은 처음 포트에 GPIO를 초기화 할 때 회로에서 지정한 이름으로 이름 지정이 가능하고 이를 bit 단위로 제어를 쉽게 할 수 있다. 

예를 들면 PORT0에 0번핀이 Enable이다면

sbit  Enable= P0^2;

이렇게 하면 읽을 때는 그냥 Enable을 읽으면 되고 쓸때도 마찬가지로 Enable=1;하면 출력이 나간다.

그러나 sbi는

출력을 1로 나가게 하려면 sbi(PORT0,0) 이런식으로 지정해야 하고 0이면 cbi를 사용해야 한다. 만들어 놓은 rbi로 읽어야 하고....물론 포트와 핀번호를 define해서 사용해도 되긴 하지만 이것도 영 아니다.

 그래서 이걸 이용해서 그냥 define을 3가지로 해 버리는 선택을 하니 비슷하게 할 수 있다.

 이런 식으로 RBI, SBI, CBI를 처리해 놓으면 차후 1로 할 때는 nHPA1_EN_SBI, 0은 nHPA1_EN_CBI, 읽을 때는 nHPA1_EN_CBI로 하면 된다. 물론 타이핑이야 대충 기억만 한다면 자동완성이 되니 뭐......

 여튼 이렇게 이용하니 무지 편했다. 참고로 RBI에 bool을 사용한건 bool로 안하면 나중에 조건 같은데서 사용할 때 귀찮고 shift도 할 때 불편해서 그냥 비트로 만들어버리는게 편해서 저렇게 사용한다.

728x90
반응형