반응형
 AVR의 출력 실험을 위한 LED 보드의 제작과 실험이다.
1. 회로도


2. 구현 


3. 실험 프로그램 1



[프로그램 설명]
DDRD는 Port D의 Data Direction Register 이다. DDRD는 Port D의 입력 모드와 출력 모드를 결정할 수 있도록 해준다. DDRD=0xFF로 설정하게 되면 모든 Port D의 핀들이 출력 모드가 된다. DDRD는 각 핀별로 입출력 모드를 조절할 수 있다. 예를 들어 DDRD=0x01로 설정하면 출력 모드는 1개의 핀만 출력모드로 만들어 준다.

PORTD는 Port D의 출력 값으로 0xFF를 하게 되면 모든 핀에 1을 출력하고 0x00으로 하게 되면 모든 핀에 0을 출력하게 된다.

for loop는 delay를 만들기 위함이다.

[실행 결과]


4. 실험 프로그램 2

[프로그램 설명]
이 프로그램은 AVR CPU의 Timer를 이용하여 LED를 점등 시키는 프로그램이다.  AVR의 Timer/Counter 모드는 맨 아래의 참고1을 참고하면 된다.
TCCR0 레지스러에 0x0D를 입력하면 (2진수 00001101) 비트 설정은 FOC0=0, WGM0=0 및 WGM1=1 로 CTC 모드, COM1=0 및 COM0=0 으로 OC0 핀 Disable, CS2=1 및 CS1=0 및 CS0=1로 clock source는 시스템 클럭/1024로 설정하였다. 여기에서는 16MHz 이므로
1/(16000000/1024)=1/16000000*1024=64 마이크로 세컨드가 된다.

OCR0 레지스터(Output Compare Register)는 클럭이 몇번 발생하고 인터럽트를 발생시키는지 설정하는 것으로 여기에서는 125로 설정하였다. 따라서 인터럽트 발생 주기는 64 us * 125 = 8000 us = 8 ms 가 된다.

TCNT0는 Timer/Count Register로 이 값은 프로그램이 실행되는 동안 몇번의 클럭주기가 지났는지 기록된다. 이 설정에서는 8ms 마다 TCNT0값이 하나씩 증가하게 된다. 여기에 다른 값을 입력하면 인터럽트 주기를 더 빠르게 할 수 있다. (즉 TCNT0가 OCR0와 일치하게 되면 인터럽트 발생)

TCNT0와 OCR0는 계속적으로 비교 되며 일치하게 되면 모드에 따라서 Output Compare Interrupt 를 발생시키거나 OC0 핀에 Waverform 출력을 생성하게 된다.

TIMSK는 OCIE0 를 enable 시키는 값을 (00000001 = 0x01) 설정한다.

cli() 함수는 Interrupt disable를 시키는 함수이고 sei()는 interrupt enable 시키는 함수이다.

SIGNAL 은 인터럽트 핸들러이며 SIG_OUTPUT_COMPARE0 는 Timer/Counter 0 Comapre Match일 경우로 설정된 인터럽트 벡터이다. (iom162.h에 설정) SIGNAL 함수 이외에 INTERRUPT 함수가 있는데 동작은 같고 차이는 SIGNAL은 함수 실행시 다른 인터럽트가 걸리지 않으며 INTERRUPT는 이 함수가 실행되는 동안 다른 인터럽트가 발생되는 것을 허용한다. SIGNAL 내부에서는 인터럽트가 125번 발생하면(timer_count를 비교) PORTD에 count값을 설정하고 count를 증가 시킨다. count가 0xFF가 되면 count는 0으로 clear한다. 따라서 125번의 인터럽트는 8ms*125 = 1000ms 로 1초가 된다. 즉 PORTD에 1초에 1씩 증가하여 출력하게 되는 프로그램인 것이다. 그런데 실제로는 상당히 빠르게 1씩 증가한다.(아래 동영상 참조)
[실행 결과]


참고1. AVR의 Timer/Count 모드에 대해서..
AVR은 3개의 타이머 모드를 가지고 있다. Normal, CTC, PWM 모드이다.
1) Normal 모드는 초기값부터 255까지 도달하게 되면 인터럽트를 발생시키고 다시 초기값으로 돌아가서 숫자 1씩 증가시키는 모드이다.
2) CTC는 Clear Time on Compare match 모드의 약자로 0부터 1씩 숫자가 증가하다고 프로그래머가 레지스터에 세팅한 값에 도달하면 인터럽트를 발생시키고 다시 0으로 돌아간다.
3) PWM 모드는 Pulse Width Modulation 으로 같은 펄스의 주파수나 파형의 길이를 변영하여 만든 신호이다. 이는 모터의 속도를 제어하거나, LED 밝기 등을 조절하는데 이용 가능하며 OC0, OC1A, OC1B, OC2, OC3A, OC3B 각 핀을 통해서 이러한 값을 주기적으로 출력하여 외부 장치를 제어 가능하다.

TCCR0 레지스터는 Timer/Counter 0 Control Register 약자로 타이머를 제어하는 레지스터이다. TCCR0는

의 8 비트로 구성된다.
1) FOC0 비트는 Force Output Compare 비트로 WGM 모드가 PWM 모드가 아닌 경우에 사용이 가능하며(즉 Normal 모드와 CTC 모드) FOC0 비트를 1로 설정하면 OC0(PB0, PLED0) 포트에 TCNT0 레지스터와 OCR0 레지스터가 Compare Match 되는 것과 같은 출력 신호를 내보낸다. 이때 COM 모드에 의해 출력 신호가 실제로 OC0 포트로 출력되는지 여부가 결정된다.
2) WGM00, WGM01 비트는 타이머의 동작 모드를 결정하는 비트이다. Waveform Generation Mode 비트이다. WGM 비트 설정에 따른 모드는 다음고 같다.

PWM 모드는 Phase Correct PWM과 Fast PWM 모드로 이용 가능하다.
3) COM 비트는
 - Compare Output Mode로 PWM 모드가 아닐 경우 다음의 의미를 가진다.

 - Fast PWM 모드일 경우

 - Phase Correct PWM 모드일 경우

4) CS 비트는 Clock Select 비트로 Timer/Counter에서 이용할 clock source를 선택한다.


TIMSK(Timer/Counter Interrupt Mask Register)의 비트 구성

TOIE0는 Timer0 Overflow Interrupt Enable 비트로 Normal 모드의 Timer Interrupt 가 기동하며 OCIE0(Timer 0 Output Compare Match Interrupt Enable) 비트는 CTC 모드의 Timer Interrupt가 발생한다.
반응형
Posted by alias
,