16비트 타이머/카운터
출처 : ATmega128로 배우는 마이크로컨트롤러 프로그래밍
8비트와의 큰 차이점은 오버플로 인터럽트가 2^16-1까지 카운트 가능하고,
3개의 비교 일치 인터럽트가 존재하며, 입력 캡처가 존재한다는 것이다.
즉 분주기가 256일 때의 오버클록 1주기를 확인하면
1/16M * 256 * 2^16 = 약 1초이다.
8비트보다 2^8만큼 길어진 모습이다.
TCNTn 레지스터
출처 : ATmega128로 배우는 마이크로컨트롤러 프로그래밍
H와 L로 나뉘어 각각 8비트씩 16비트를 셀 수 있게 되어있다.
기본적으로 분주비가 없을 때 4.096ms의 간격으로 인터럽트가 발생한다.
출처 : ATmega128로 배우는 마이크로컨트롤러 프로그래밍
8비트에서 했던 내용 중에 16비트로 바뀌고 분주비를 256으로 설정하여
1초마다 LED가 점멸하게 구현한 코드이다.
주의할 점은 16비트는 1,3번을 사용하기에 위해서 예시로 TCCR1B와 같이
1번을 사용했다는 것이다. 과거 8비트에서는 0번을 사용했다.
TCCR1B 레지스터 - 분주비
출처 : ATmega128로 배우는 마이크로컨트롤러 프로그래밍
8비트와 큰 차이점은 외부 클록의 여부이다. 16비트의 경우 외부 클록에 대한 설정도 있어서
8비트와의 차이를 가지게 되니 이에 주의해야 한다.
TIMSK, ETIMSK 레지스터 - 인터럽트 활성화
출처 : ATmega128로 배우는 마이크로컨트롤러 프로그래밍
맨 위에서 말했듯이 5개의 인터럽트에 대해 각각의 활성화 비트가 존재한다.
TIMSK의 경우 TOIE1 비트는 오버플로 인터럽트, OCIE1B, OCIE1A는 비교일치 인터럽트,
TICIEE1은 입력 캡처 활성화 비트이고,
ETIMSK의 경우 OCIE1C가 비교일치 C의 활성화 비트이다.
출처 : ATmega128로 배우는 마이크로컨트롤러 프로그래밍
출처 : ATmega128로 배우는 마이크로컨트롤러 프로그래밍
비교 일치 A를 활성화하여 FFFFF에서 7FFFF마다 비교 일치가 발생한다.
이는 2^15로 기존 1초에서 0.5초로 줄은 것이다.
즉 다시말해, 0.5초마다 LED가 점멸하게 설계한 코드이다.
아래는 서로 다른 점멸 주기를 가진 경우이다.
이 때 비교 일치 3개와 오버플로를 이용하면 된다.
출처 : ATmega128로 배우는 마이크로컨트롤러 프로그래밍
출처 : ATmega128로 배우는 마이크로컨트롤러 프로그래밍
출처 : ATmega128로 배우는 마이크로컨트롤러 프로그래밍
각각 개별적 활성화 및 전역적 활성화를 해주고,
각각의 비교 일치 주기마다 발생했을 때 해당하는 비트의 LED를
키거나 끄는 코드를 작성한 것이다.
그렇기에 최종적으로 비교일치+오버플로 형태의 주기를 구현할 수 있다.
이는 TCNT1=0와 같은 초기화가 진행되면 구현할 수 없다는 점을 주의해야 한다.
파형 생성
출처 : ATmega128로 배우는 마이크로컨트롤러 프로그래밍
비교 일치 발생 시 지정된 핀을 통해 신호를 출력하는 것이 가능하다.
16비트의 경우 1,3번이다. 위에서 사용한 1번의 경우 PB5~7을 담당하고 있다.
- TCCR1A, TCCR1B 레지스터 : 파형 생성 제어
출처 : ATmega128로 배우는 마이크로컨트롤러 프로그래밍
TCCR1A의 7~2번은 2개씩 쌍을 이루어 비교 일치 발생 시 각 파형 생성기의 동작을 설정한다.
1과 0은 파형 생성 모드를 결정하는데 사용한다.
TCCR1B의 7번은 입력 캡처 시 사용하고, 6번은 하강, 상승 선택, 4~3은 파형 생성 모드에 사용한다.
출처 : ATmega128로 배우는 마이크로컨트롤러 프로그래밍
PWM을 제외한 정상과 CTC인 0,4,12를 집중하면 된다.
12번은 입력 캡처 발생 시에 TCNTn을 초기화한다.
참고로 PWM은 다음 포스팅에서 다룰 예정이다.
출처 : ATmega128로 배우는 마이크로컨트롤러 프로그래밍
3개 중에 1 세트인 COM1An 비트를 통해 파형 생성이 비트에 따라 어떻게 바뀌는지 확인한 내용이다.
출처 : ATmega128로 배우는 마이크로컨트롤러 프로그래밍
추가로 TCCR1C 레지스터의 모습인데, 이 중 하나라도 세트가 되면 비교 일치가 발생한 효과와 같다.
입력 캡처
특정 이벤트가 발생한 경우 그 시간을 기록하기 위해 사용한다.
출처 : ATmega128로 배우는 마이크로컨트롤러 프로그래밍
TCCR1B의 6번이 0이면 하강 엣지에서, 1이면 상승 엣지에서 입력 캡처가 발생한다.
즉 ICR1 레지스터에 ICP1(PD4) 핀에 입력의 변화가 발생하면 TCNT1의 값을 기록한다.
출처 : ATmega128로 배우는 마이크로컨트롤러 프로그래밍
ISR은 입력캡처가 발생했을 때 실행된다.
위의 경우 ICP1핀에 풀업 저항을 통해 연결된 버튼을 누른 경우 입력 캡처가 발생한다.
이를 통해 버튼을 누르면 TCNT1과 ICR1을 출력하는데 이 둘의 값은 같다.
연습 문제
출처 : ATmega128로 배우는 마이크로컨트롤러 프로그래밍
분주비와 개별적 인터럽트 허용 부분이 빈 칸이다.
이는 오버플로 인터럽트 허용과 분주비 256을 넣어주면 된다.
답 :
TCCR1B |= (1<< CS12);
TIMSK |= (1<< TOIE1);
'대학교' 카테고리의 다른 글
자바 - (9) 상속 (3) | 2023.11.21 |
---|---|
자바 - (8) 패키지와 접근 제한자 (3) | 2023.11.21 |
파이썬 - (6) 여러 가지 자료형 (1) | 2023.11.15 |
데이터구조 - (7) 정렬 -1 (1) | 2023.11.15 |
마이크로프로세서 - (9) 8비트 타이머/카운터 (1) | 2023.11.12 |