[항해99] 입출력과 네트워킹

정선모·2022년 2월 7일
0

CS

목록 보기
6/8

I/O포트

  • LED에 흐르는 전류를 제한하여 PB0와 LED가 타버리는일을 방지하기 위해서 LED와 저항을 직렬로 연결하였습니다.
  • 옴의 법칙에 따라 저항값은 (4.2 - 0.7)/0.01 = 350Ω 입니다.

DDRB는 각핀을 입력으로 쓸지 출력으로 쓸지 결정합니다.

PORTB는 출력 데이터를 저장하는 래치 입니다.

PINB는 핀의 값을 읽습니다.

버튼을 눌러라

  • R은 풀업(pull-up) 저항이라고 부릅니다.
  • 버튼이 눌렸을때 저항은 IRQ나 회로가 타지않게 V에서 흘러들어오는 전류를 제한하면서 IRQ에 논리 0 을 공급합니다.

  • 버튼을 눌렀다 뗐을때, 실제 신호는 오른쪽과 같이 들어갑니다.
  • 그 이유로 버튼에 연결된 금속조각이 접점에 닿을때, 접촉면이 안정될 때까지 여러번 되튕겨지면서(bounce) 발생합니다. 인터럽트 발생핀에 연결된 경우는 인터럽트가 여러 번 발생할 수 있습니다.
  • 바운스를 해결하기 위해 디바운스(debounce)를 할 필요가 있습니다.

  • 디바운스를 해결하기 위해 인터럽트 핸들러에 타이머를 설정하는 방법
    • 최초 인터럽트 시 타이머를 설정하는 방법
    • 인터럽트가 발생할 때마다 기존 타이머를 새 타이머로 재설정하는 것
  • 위의 방법도 기계 부품의 노후화 등의 이유로 타이머값을 정하기 어렵습니다.
  • 해결하기 위해선 소프트웨어로 구현하는편이 더 경제적입니다.
    • 대부분의 시스템에 있는 인터럽트를 주기적으로 만들어내는 타이머를 사용합니다.

  • 해당 I/O 포트의 상태는 INB라는 8비트 unsigned char 변수를 통해 읽을 수 있습니다.

  • 유한 임펄스 응답(FIR, finite impulse response)

  • FIR은 큐(queue)입니다.

  • FILTER_SIZE는 필터의 원소 개수입니다. 이 원소 개수는 버튼의 잡음(바운싱 정도)이 얼마나 많은지와 인터럽트가 얼마나 자주 걸리는지에 따라 정해야합니다.
💡 버튼이나 스위치가 설계된 방식일때, **바운스**가 발생하며, **디바운스**가 필요합니다. 디바운스는 하드웨어보다 소프트웨어를 활용하는게 경제적입니다. 소프트웨어 활용시 바운싱 정도에 따라 유연하게 조정이 가능합니다.

빛이 있으라

  • 가장 흔한 유형의 7 세그먼트(segment) 디스플레이
  • 16가지 전기적 접점(핀)이 필요하지만, 각 LED마다 핀을 1개씩 연결하고, 핀하나에는 모든 LED를 연결합니다. 이로인해 핀 개수를 줄이고 비용도 아낄수 있습니다.

  • 디스플레이의 애노드를 포트A에 연결하고 캐소드를 B에 연결해서 디스플레이를 멀티플렉스(multiplex) 하는것입니다.
  • 디스플레이 애노드는 병렬로 연결됩니다.
  • 이 디스플레이는 시각의 잔상효과(persistence of vision)을 활용합니다.
  • 시각의 잔상효과란 인간의 뇌와 눈이 1/24초보다 짧은간격으로 깜빡거리는경우, 빛이 계속 켜져 있는것으로 인식하는것입니다.
💡 7 **세그먼트** 디스플레이에서 **멀티플렉스** 방식으로 디스플레이를 연결합니다. 시각의 잔상효과를 활용합니다.

빛, 동작, 그리고 상호 연동

  • 버튼과 디스플레이의 입력도 멀티플렉싱 가능합니다.

  • 핀을 12개가아닌 3개만 추가하고, 상태를 스캔하는 코드를 타이머 인터럽트 핸들러와 함께 넣을수 있습니다.
  • 위 그림에서 B핀이 오픈컬렉터이거나 오픈드레인일 수 있는데, 오픈 컬렉터나 오픈드레인을 사용하지 않았을때에는 부품이 손상될 수 있습니다. 하지만 디스플레이 드라이버 회로가 이를 해결해주기 때문에, 오픈 드레인이나 오픈 컬렉터를 사용해 구현하지는 않습니다.
💡 오픈컬렉터, 오픈드레인의 경우 디스플레이 드라이버 회로가 문제해결하지 않으면, 부품 손상이 발생할 수도 있습니다.

밝기조절

  • 디스플레이의 듀티 사이클(dute cycle)을 조절하여 밝기를 조절할 수 있습니다.

  • 듀티사이클과 사람이 인지하는 밝기 사이에 관계는 선형이 아니라고 합니다.

그레이의 2ⁿ가지 그림자

  • 센서를 읽어서 모터, 바퀴, 놉 같은 회전축의 위치를 알아내야 하는경우가 발생합니다.
  • 회전축에 스위치를 넣거나 광센서가 읽을 수 있는 검은색과 흰색 점을 사용해 위치를 알아낼 수 있습니다.
  • 축의 위치를 2진수로 인코딩해야 합니다.

  • 8가지 위치에 관심이 있다면 인코더는 위와 같습니다.

  • 그러나 실상 기계적인 내성으로 인해 회로가 각 비트를 읽으면서 발생하는 전파지연으로 인한 문제가 생기고 위와같은 오류가 발생합니다.

  • 벨 전화 연구소의 미국 물리학자 프랭크 그레이(Frank Gray)가 각도가 달라질 때 비트가 하나씩만 달라지는 인코딩 방법을 발명했습니다. 이 인코딩 방법을 사용한 코드를 그레이 코드 라고 합니다.
💡 하드웨어와 소프트웨어의 연동을 위해선 고려해야할 부분이 많은것 같습니다.
profile
개발자가 되어가는 비전공자

0개의 댓글