[ 간략 설명 ]
◈ Timer Count, AVR, ATmega128
◈
◆◆ ATmega128, Timer Count : LED 제어 P.226 ◆◆
/*
Timer Count P.226
타이머 카운터 0의 normal mode 를 사용하여
오버플로어 인터럽트가 발생 -> LED 1bit shift 'ON'
TCNT0 = 0 , 프리스케일러 = 1024분주
0302A_TimerCount_p226.c
*/
#include <mega128.h>
unsigned char Led = 0xfe;
void main(void)
{
//포트 초기화
DDRC = 0xff; // port C 출력 설정
PORTC = Led; // port C에 초기값 출력
// 인터럽트 초기화
TCNT0 = 0x00; // 타이머 카운터 0 레지스터 초기값
TIMSK = 0x01; // TOIE0 = 1;
TCCR0 = 0x07; // 일반모드, 프리스케일 = CK / 1024
SREG = 0x80; // 전역 인터럽트 인에이블 비트 I 셋
ASSR = 0x00;
while(1); // 무한 루프
}//end main
// 타이머 카운터 0 오버플로우 서비스 루틴
// 인터럽트 발생 주기 1/16us * 1024주기 * 256 = 16.384[ms]
interrupt [TIM0_OVF] void Timer_int0(void){
// LED 순차 점멸
Led <<=1;
Led |= 0x01;
if( Led == 0xff ) Led = 0xfe;
PORTC = Led;
}//endTIM0
◆◆ ATmega128, Timer Count : FND 제어 P.227 ◆◆
/*
Timer Count FND제어 P.227
T/C 0의 normal mode 를 사용 > 오버플로어 인터럽트 발생
> FND 숫자 1증가
인터럽트 주기 최대 TCNT0 = 0, 프리스케일러 1024분주
0302B_TimerCount_p227.c
*/
#include <mega128.h>
#include <delay.h>
void Seg1_out(int);
int Num = 0;
char Seg_pat[10] = { 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f };
void main()
{
DDRB = 0xff; // 7-SEG output
DDRF = 0x10; // TR control
TIMSK = 0x01; // TOIE0 = 1;
TCCR0 = 0x07; // CS02 CS01 CS00 = 1024분주
TCNT0 = 0x00;
SREG = 0x80;
while(1);
}//end main
interrupt [TIM0_OVF] void Timer_int0(void){
Seg1_out(Num);
if( Num == 9 ){
Num = 0;
}//endif
Num++;
}//endTIM0
void Seg1_out(int Num){
int i;
for( i = 0 ; i < 10 ; i++){
PORTF = 0b11100000;
PORTB = Seg_pat[Num];
delay_ms(100);
PORTF = 0b11110000;
}//endfor
}//endSeg1_out
◆◆ ATmega128, Timer Count : FND, LED 제어 P.228 ◆◆
/*
Timer Count FND 제어 P.228
T/C 0 mormal mode > overflow interrupt
> LED 1bit shift , FND 0 ~9 count
TCNT0 = 0, 1024분주
0302C_TimerCount_p228.c
*/
#include <mega128.h>
#include <delay.h>
char Seg[10] = { 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7c, 0x27, 0x7f, 0x67 };
int N1 = 0, N10 = 0 , Num = 0, i;
char Led = 0xfe;
void main()
{
DDRF = 0xff;
DDRB = 0xff;
DDRC = 0xff;
PORTC = Led;
TIMSK = 0x01;
TCCR0 = 0x07;
TCNT0 = 0x00;
SREG = 0x80;
while(1);
}//end main
interrupt [TIM0_OVF] void Timer_int0(void){
Num++;
N1 = Num % 10;
N10 = Num/10;
for( i = 0 ; i < 60 ; i++){
PORTF = 0xe0;
PORTB = Seg[N1];
delay_ms(5);
PORTF = 0xd0;
PORTB = Seg[N10];
if( Num > 99 ) Num = 0 ;
delay_ms(5);
}//endfor
Led = Led << 1 | 0x01;
if( Led == 0xff) Led = 0xfe;
PORTC = Led;
}//endTIM0
◆◆ ATmega128, Timer Count : FND, LED 제어 P.229 ◆◆
/*
Timer Count FND, LED 제어 P.229
interrupt 60times (= 1sec) > LED shift ON, OFF
> FND display
0302D_TimerCount_p229.c
*/
#include <mega128.h>
#include <delay.h>
unsigned char Seg_dis[10] = { 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f };
unsigned char Led = 0xfe;
unsigned char Cnt = 0, Seg = 0;
void main(void)
{
DDRB = 0xff;
DDRC = 0xff;
DDRF = 0xf0;
PORTF = 0b11100000;
TIMSK = 0x01;
TCCR0 = 0b00000111; // 0x07;
TCNT0 = 0x00;
SREG = 0x80;
PORTC = Led;
PORTB = Seg_dis[Seg];
//while(1);
}//end main
interrupt [TIM0_OVF] void Timer_int0(void){
Cnt++;
if( Cnt == 60 ){ // interrupt 60times > 1 shift
Cnt = 0;
Seg++; // Segment display
Led = ( Led <<= 1 ) | 0x01; // LED shift
if( Led == 0xff){
Led = 0xfe; // reset
Seg = 0;
}//endif
PORTC = Led;
PORTB = Seg_dis[Seg];
}//endif
}//endTIM0