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
'마이크로프로세서' 카테고리의 다른 글
LED를 이용해서 2차원 패턴 만들기 (0) | 2020.05.25 |
---|---|
스위치 입력을 사용하는 LED 점등 & 채터링 (0) | 2020.05.25 |
입출력포트 & LED 점등해보기 (0) | 2020.04.21 |
출력(LED) & 입력(스위치버튼) 회로 구성 (0) | 2020.04.21 |
ATmega128 개발 도구 (0) | 2020.04.21 |
ATmega128 보드 (0) | 2020.04.21 |
ATmega128의 EEPROM (추가메모리) (0) | 2020.04.21 |