본문 바로가기
C++ 200제/코딩 IT 정보

Atmega128 입출력 포트(I/O port) 설정 실수 = 파형으로 발견

by vicddory 2017. 2. 17.

Atmega128 입출력 포트(I/O port) 설정 실수 = 파형으로 발견


I/O 입출력 포트의 출력이 이상한 파형을 보이는 예와 그 원인을 트러블의 일례로서 소개한다. 이는 필자가 특정 시스템을 개발할 때 직면했던 케이스이다.


원인은 단순한데, 그림 A와 같이 Atmega128 로직 IC라고는 생각할 수 없는 이상한 파형을 보고 '이것은 뭐야?"라고 생각했다.


'이거 뭐야?'


로직 IC - 원인을 알 수 없는 이상한 파형로직 IC - 원인을 알 수 없는 이상한 파형

<그림 A. I/O 포트에 이상한 파형이 나타났다면 설정을 실수했을 수도 있다>




출력하고자 했는데 입력으로, 게다가 내부 풀업이 ON되어 있었다.


  • 개발에 사용한 마이크로컴퓨터는 ATmega328P이다.
  • 목적은 입출력 포트BH의 비트 3~비트 1(PB3~PB1)을 출력 포트로 하여 토글시키는 것이었다.
  • 그래서 초기 설정으로서 다음과 같은 코드를 썼다.


위의 코드로 PB3~PB1을 출력(원래라면 DDRB = 0x0e)으로 해야 할 곳을 실제는 'DDRB = 0xe0'으로 해서 PB7~PB5가 출력이 되었던 것이다.


또한, 'PORTB=0x0f'의 경우는 이 레지스터 PORTB는 포트가 입력이면(출력이면 출력 비트용 레지스터이지만) 내부 풀 업을 ON/OFF하는 기능이 되어 PB3~PB0의 내부 풀업을 유효하게 했던 것이다.




여기에서 'Atmega128 출력 포트를 토글'하기 위한 의도로 메인 루프를 다음과 같이 했었다.


1
PORTB ^= 0x0e// XOR 기술
cs


필자는 입출력 포트를 토글하려는 생각이었는데 실제는 내부 풀 업을 토글하고 있었던 것이다.


그 때문에 그림 A와 같이 다음과 같은 이상한 동작이 Atmega128 발생했던 것이다.


토글의 스피드를 빠르게 하면 "L"이 나오지 않는다.


"H"에서 "L"로의 전이 때문에 "L"이 무뎌진다.


L레벨이 덜걱거린다.


이해하고 보면 그럴 수도 있겠다고 생각할 수 있지만, '타산지석'으로 삼기를 바란다.


참조 - 전자기술 2015년 9월, 67p

Atmega128 입출력 포트(I/O port) 설정 실수 = 파형으로 발견

댓글