패턴을 변경한 LED 점등

마이크로프로세서

2020. 5. 24. 21:44

[그림] 저번 수업 때 점등 패턴
[그림] 이전 소스코드

 

1. 패턴을 변경한 LED 점등

[그림] 패턴 점등을 위한 소스코드

  • 이전처럼 LED를 특정한 패턴으로 점등하는 것이 아니라, (0x5D = 0101 1101, 부논리로 0만 점등)
  • 패턴이 시간에 따라 변경되게 해서 움직이면서 출력해보자.
  • 간단하게 생각해서 While문에서 PORTA에 계속 다른 값을 넣어줘보자.
  • 1111 1110인 0xFE부터 0111 1111인 0x7F까지 변경되게끔 입력해서 넣어보자. (부논리로 0만 점등)

 

2. 문제발생 1 : 너무 빠른 패턴 변화

[그림] 교수님은 초인이라서 다 보인다고 하신다...

  • 우리가 사용 중인 ATmega128은 16MHz의 속도를 가진다.
  • 초당 1600만회의 연산을 수행하기 때문에, while문 안의 패턴이 너무 빠르게 점등되서
  • 아래 처럼 모든 LED가 전부 점등된 것 처럼 보인다 (엄청 빠르게 켜졌다 꺼졌다 하는 것)
  • 때문에 LED 점등 중간중간에 시간을 지연해주는 함수를 추가해야한다.

 

3. Rough한 시간지연함수 구현

  • 위 처럼 시간 지연함수를 구현해보았다. asm은 어셈블리 명령을 실행해주는 함수이다.
  • asm("nop"::);는 no operation으로 아무 것도 하지 않는 명령어를 의미한다.
  • for루프를 돌면서 2000번의 "nop"를 실행하면, 대략 1ms정도 시간이 지연된다.
  • 이 msec_delay를 점등 패턴 사이사이에 넣어서 1초 마다 패턴이 변하게 해보자.
  • 정수 n을 입력받아서 n msec을 지연하는 함수를 구현하였고, 아래처럼 패턴이 1초마다 변경된다.

[그림] 패턴 변경

 

4. 코드 리팩토링

[그림] 리팩토링한 코드

  • 패턴이 만약 100개, 1000개처럼 많아지면, 모든 패턴 변경 사이에 시간 지연지연 함수를 삽입해야한다.
  • 이는 매우 지저분한 코드가 될 수 있고, 실수가 발생하기 매우 좋은 코드이다. 
  • 때문에 배열과 루프를 사용하여 코드를 위와 같이 리팩토링 하였다. 동작은 이전과 동일하다.

 

5. 라이브러리 delay함수 사용

  • asm("nop"::)를 사용하여 구현한 지연함수는 프로세서의 상태나 종류에 따라 지연 시간이 크게 변한다
  • 이런 시스템을 실제 공장제어 등에서 사용한다면 시스템 자체가 매우 불안할 가능성이 있다.
  • 때문에 보다 정교하게 구현된 libc.a의 _delay_ms 함수를 사용하여 시간지연함수를 새로 구현해본다.
  • 이를 통해 보다 정교한 패턴 LED 점등을 구현할 수 있다.

 

6. Reference

 

마이크로 프로세서 및 실습 Ⅰ

마이크로 프로세서 및 실습

www.kocw.net