학습목표    1

학습주제    1

예습내용    1

실습방법    1

        1

TIMER/COUNTER

학습목표

타이머와 카운터의 사용방법을 공부한다.

학습주제

16.32 msec 마다 타이머가 동작하게 하고 led_status 값을 하나씩 증가 시키며 값이 0x80 마다 B포트 8개의 Led On 되게 한다. 그러므로 Led 16.32*255=4161msec (4.16)마다 동작하게 된다.

예습내용

 

실습방법

   

1.       프로젝트를 아래와 같이 초기화 한다.

 

(1)     헤더파일과 전역변수를 정의 한다.

(2)     타이머를 초기화 하는 함수를 만든다.

(3)     타이머 동작함수를 만든다.

#include <mega128.h>     

#include <stdio.h>  // (1)

 

unsigned char led_status=0x00; //(1)

char sbuf[20];

 

// Alphanumeric LCD Module functions

#asm

   .equ __lcd_port=0x1B

#endasm

#include <lcd.h>

        

// 타이머를 초기화 하는 함수를 만든다.                            (2)

// CPU 메뉴얼 "ATmega128((L)" 102페이지를 참조                         

void         init_timer(void){ 

              TCNT0=-255; /* 64usec * 255 = 16.32 msec period */

              TCCR0=7; /* CK(16MHz)/1024 = 15.625kHz : 64usec */

              TIMSK |= 1;                          /* TOIE0 = 1 */

}

 

// Timer 0 overflow interrupt service routine                            (3)

interrupt [TIM0_OVF] void timer0_ovf_isr(void) 

{

              TCNT0=-255; /* 64usec * 255 = 16.32 msec period */

 

              // move the LED

              led_status++;

              //if(led_status>0x01)

              //            led_status==0x00;

              sprintf(sbuf,"led_status: %02X",led_status);

        lcd_gotoxy(0,1);

        lcd_puts(sbuf); 

             

              // turn on the LED

              if(led_status>0x80)

                             PORTB=0x00;

              else

                             PORTB=0xff;

              //PORTB=led_status;

}

 

(4) 타이머와 LCD 메인프로그램에서 초기화 한다.

// LCD module initialization

lcd_init(16);

           

init_timer();

// Global enable interrupts

#asm("sei")   

 

//PORTB=led_status;

PORTB=0x00;

 

sprintf(sbuf,"START");

lcd_gotoxy(0,0);

lcd_puts(sbuf); 

 

while (1)

      {

      // Place your code here

 

      };

}

 

[전체 프로그램 보기]

 

처음