본문 바로가기

programming/MCU

ATmega128A::TIMER 실습과제

실습과제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