본문 바로가기

Hacked Brain/embeddedland.net

80c196kc - (5) 포트를 이용하자.

출처 :
임베디드 커뮤니티 [W.O.E]
cafe.naver.com/okh0217

5.. 포트를 이용하자.

80c196kc는 8비트씩 5개의 입출력 포트를 가지고 있다.

-포트 0  ---A/D 컨버터를 위한 아날로그/디지탈 입력전용

-포트1  --- 준 양방향 포트

-포트 2 --- 세가지 종류(준 양방향 입력과 출력)

-포트 3,4 --- 어드레스/데이터 버스 겸한 오픈드레인 양방향 포트


5-1.준양방향성 포트

준양방향 포트란 입력,출력,또는 입출력으로 다 사용할수 있는 만능(?) 포트이다. 단,사용자가 몇가지 조건을 맞추어주어야 하는데 어떤 것이 있는지 보자.

(이것 때문에 ‘쌍’이 아닌 ‘준’이라는 이름이 붙었다고 함...)


입력으로 쓸 때

준양방향성 포트에서 신호를 읽어들이려면 먼저 해당 포트에 1을 출력하고 읽어야한다. 

“0”을 써넣은 상태에서 입력을 하면 현재 포트 핀 상태는 0을 유지하고 있기 때문에 입력신호에 관계없이 0만 read 한다.

리셋이 되면 1로 초기설정되지만 소프트웨어로 입/출력을 바꿔 사용할 경우에는 주의하여야함.



스위치에 연결해서 입력으로 사용할 때 

딥스위치를 포트 1에 연결해서 입력으로 사용하는 경우를 생각해보자.


위 그림과 같은 경우에 스위치가 ON되어있는 상태에서(read) 출력을 1로(write)하면? 당연히 쇼트되어버린다.

혹은 반대로 외부에 Vcc로 연결되어있는 스위치에 0을 쓰는것도 마찬가지이다.     

해결 방법은 다음과 같은 두가지가 있다.

-소프트웨어적 : 입력(read)으로 사용하는 핀에 절대 값을 쓰면(write) 안된다.

                      위의 그림과 같은 경우는 1을 쓰면 안되겄지..

-하드웨어적 : 1K 저항 직렬 연결  -->적절한 전류값으로 제한

              저항대신 TTL이나 CMOS 게이트같은 과도한 양의 전류를 흡수하지 않는 디바이스를 달아도 된다.


읽기 → 변경 →쓰기 작업

   orb ioport1 , #10000001b

   xorb ioport1, #1000000b

위와같이 xorb 혹은 orb 같은 명령은 포트에서 현재값을 읽어서 바로 변경하고 바로 포트에 쓰기를 한다.

그러나 위의 작업이 원하는데로 결과를 낼 수 없는 포트가 있는데 바로 포트0과 같은 입력전용핀이나 포트2중에서도 출력만 가능한 핀들이다.

입,출력(읽기용 버퍼회로를 가지고있지않다) 전용핀은 동시에 두가지를 할 수 없는게 당연하게 보인다.

그러나 입출력 둘다 되는 준양방향포트에도 주의해야할 것이 있다.


만약 입력값이 “0”일때 읽기-변경-쓰기 작업후 입력핀의 값에 0을 쓸 경우도 있게된다.

근데 이 때 만약 외부적으로 1이 쓰여지고있다면 회로가 short 되는 것이다.


이런 것을 방지하기위해선 포트에 쓸값을 백업용 변수에서 변경시키고 출력으로 내보내야한다.

  ldb p1data ,    ioport1

  xorb p1data , #10000000b

  ldb ioport1 ,    p1data


※8051에는 이러한 오동작을 막기 위하여 read-modify-write 명령에서는 핀을 읽지 않고

   출력 래치를 읽도록 되어 있다.


5-2.포트 3과 포트 4

2가지 기능

- 오픈 드레인 출력을 가지는 쌍 양방향성 포트

- 외부 메모리를 쓸 때 메모리 컨트롤러를 사용하는 시스템 버스이다.

CPU의 EA 핀이 0이면 시스템 버스로 동작하고 1이면 외부 메모리를 호출할 경우에만 시스템 버스로 동작한다.