실습과제1
Normal Mode 실습
#define F_CPU 16000000UL
#include <util/delay.h>
#include <avr/io.h>
#include <avr/interrupt.h>
ISR(TIMER0_OVF_vect)
{
static int i=0;
if(i) i=!i;
else i=1;
PORTB=i;
}
int main(void)
{
cli();
DDRB|=0x01;
ASSR=0x00;
TCCR0=0x07;
OCR0=0x00;
TCNT0=0x00;
TIFR&=0xFE;
TIMSK|=0x01;
sei();
while(1)
{
_delay_ms(300);
}
return 0;
}
PB0핀에서 약 30Hz(16M/1024/256/2)
실습과제2
CTC Mode 실습
#define F_CPU 16000000UL
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
void timer0_init();
int main()
{
timer_init();
while(1){_delay_ms(100);}
return 0;
}
void timer0_init()
{
cli();
DDRB|=0x11;
ASSR=0x00;
TCCR0=0x1f;
OCR0=0x07;
TCNT0=0x00;
TIFR&=0xFC;
TIMSK|=0x02;
sei();
}
ISR(TIMER0_COMP_vect)
{
static int i=0;
if(i) i=!i;
else i=1;
PORTB=i;
}
OC0(PB4)핀, PB0핀에서 약 1kHz(16M/2/1024/8)신호가 관측됨
실습과제3
실습과제2번 분할컴파일
[timer.h]
#ifndef TIMER_H_
#define TIMER_H_
#define F_CPU 16000000UL
#include <avr/io.h>
#include <avr/interrupt.h>
void timer0_init();
#endif /* TIMER_H_ */
[main.c]
#icnlude "timer.h"
#include <util/delay.h>
int main()
{
timer_init();
while(1){_delay_ms(100);}
return 0;
}
[timer.c]
#include"timer.c"
void timer_init()
{
cli();
DDRB|=0x11;
ASSR=0x00;
TCCR0=0x1f;
OCR0=0x07;
TCNT0=0x00;
TIFR&=0xFC;
TIMSK|=0x02;
sei();
}
ISR(TIMER0_COMP_vect)
{
static int i=0;
if(i) i=!i;
else i=1;
PORTB=i;
}
실습과제4
Fast PWM Mode 실습
#include "timer.h"
#include <util/delay.h>
int main()
{
cli();
DDRB|=0x10;
ASSR=0x00;
TCCR0=0x6c;
OCR0=0xff/2;
TCNT0=0x00;
TIFR &=0xFC;
TIMSK &=~(0x03);
sei();
while(1){_delay_ms(100);}
return 0;
}
OC0핀에서 약 976Hz(16M/64/256)의 50% 듀티비를 갖는 PWM신호 관측됨
실습과제5
PC PWM Mode 실습
#define F_CPU 16000000UL
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
int main()
{
cli();
DDRB|=0x10;
ASSR=0x00;
TCCR0=0x64;
OCR0=0xff/2;
TCNT0=0x00;
TIFR&=0xfc;
TIMSK &=~(0x03);
sei();
while(1)
{
_delay_ms(100);
}
return 0;
}
OC0핀에서 약 49016M/64/51050% 듀티비를 갖는 PWM신호 관측됨
실습과제6
1초 주기로 LED를 on/off 하는 프로그램을 작성하시오
[timer.h]
#ifndef TIMER_H_
#define TIMER_H_
#define F_CPU 16000000UL
#include <avr/io.h>
#include <avr/interrupt.h>
void timer0_init();
#endif /* TIMER_H_ */
[main.c]
#include "timer.h"
#include "led.h"
#include <util/delay.h>
int main()
{
timer_init();
led_init();
while(1)
{
_delay_ms(10);
}
return 0;
}
[timer.c]
#include "timer.h"
#include "led.h"
void timer0_init()
{
cli();
//DDRB|=0x11;
ASSR=0x00;
TCCR0=0x0c;
OCR0=250;
TCNT0=0x00;
TIFR&=0xFC;
TIMSK|=0x02;
sei();
}
ISR(TIMER0_COMP_vect)
{
static int cnt=0;
static int mode=0;
static int ledon=0;
mode=cnt/500;
cnt++;
if(mode==1) //0.5sec -->led on
{
ledon=1;
}
else if(mode==2)
{
ledon=0;
cnt=0;
}
if(ledon)
{
led0_on();
led1_on();
led2_on();
led3_on();
}
else
{
led0_off();
led1_off();
led2_off();
led3_off();
}
}
실습과제7
1초 주기로 LED를 on/off하는 프로그램
타이머 0으로 LED0,1 1초 주기로 on/off
타이머 2로 LED2,3 2초 주기로 on/off
[timer.h]
#ifndef TIMER_H_
#define TIMER_H_
#define F_CPU 16000000UL
#include <avr/io.h>
#include <avr/interrupt.h>
void timer0_init();
void timer2_init();
#endif /* TIMER_H_ */
[main.c]
#include "timer.h"
#include "led.h"
#include <util/delay.h>
int main()
{
timer0_init();
timer2_init();
led_init();
while(1)
{
_delay_ms(10);
}
return 0;
}
[timer.c]
#include "timer.h"
#include "led.h"
void timer0_init()
{
cli();
//DDRB|=0x11;
ASSR=0x00;
TCCR0=0x0c;
OCR0=250;
TCNT0=0x00;
TIFR&=0xFC;
TIMSK|=0x82;
sei();
}
void timer2_init()
{
cli();
ASSR=0x00;
TCCR2=0x0c;
OCR2=125;
TCNT2=0x00;
sei();
}
ISR(TIMER0_COMP_vect)
{
static int cnt=0;
static int mode=0;
static int ledon=0;
mode=cnt/500;
cnt++;
if(mode==1) //0.5sec -->led on
{
ledon=1;
}
else if(mode==2)
{
ledon=0;
cnt=0;
}
if(ledon)
{
led0_on();
led1_on();
}
else
{
led0_off();
led1_off();
}
}
ISR(TIMER2_COMP_vect)
{
static int cnt=0;
static int mode=0;
static int ledon=0;
mode=cnt/500;
cnt++;
if(mode==1) //1sec -->led on
{
ledon=1;
}
else if(mode==2)
{
ledon=0;
cnt=0;
}
if(ledon)
{
led2_on();
led3_on();
}
else
{
led2_off();
led3_off();
}
}
실습과제8
하이퍼터미널에서 듀티비를 입력 받아 1kHz의 PWM 신호를 출력해주는 프로그램을 작성하시오.
[timer.h]
#ifndef TIMER_H_
#define TIMER_H_
#define F_CPU 16000000UL
#include <avr/io.h>
#include <avr/interrupt.h>
void timer0_init();
void ocr0_init(int duty);
#endif /* TIMER_H_ */
[main.c]
#include "usart.h"
#include "timer.h"
#include <util/delay.h>
int main()
{
int duty;
usart0_init();
timer0_init();
usart0_printf("\033[H\033[J");
while(1)
{
usart0_printf("input duty (0~100)");
duty = usart0_getintnum();
usart0_printf("input duty (0~100): %d\n",duty);
ocr0_init(duty);
usart0_printf("duty: %d, ocr0: %d\n",duty,OCR0);
//_delay_ms(100);
}
return 0;
}
[timer.c]
#include "timer.h"
#include "led.h"
void timer0_init()
{
cli();
DDRB |= 0x10;
ASSR =0x00;
TCCR0 = 0x6c; //fast pwm mode, clear OC0, 64분주 16M/64/256=976Hz 0110_1100
OCR0 = 64;
TCNT0 = 0x00;
TIFR &= 0xfc;
TIMSK &= ~(0x03);
sei();
}
void ocr0_init(int duty)
{
OCR0 = duty*256/100;
}
1)duty =25
2)duty =50
3)duty =75
'programming > MCU' 카테고리의 다른 글
ATmega128A::Linetracer 실습과제 (0) | 2020.03.29 |
---|---|
ATmega128A::StepMotor 실습과제 (0) | 2020.03.29 |
ATmega128A::Sensor 실습과제 (0) | 2020.03.29 |
ATmega128A::UART 실습과제 (0) | 2020.03.29 |
ATmega128A::DIO 실습과제 (0) | 2020.03.29 |