성엽이
KKIMSSI
성엽이
전체 방문자
오늘
어제
  • 분류 전체보기 (454)
    • :) (2)
    • C프로그래밍이론 (9)
    • C++프로그래밍 (64)
      • STL (1)
    • C# (2)
    • Visual studio 10.0 (9)
    • AT91SAM7S256 (21)
    • 논리회로 (14)
    • AVR2560 (11)
    • TCPIP (16)
    • NetWork (4)
      • Ubuntu Linux (2)
    • Assembly (21)
    • UNIX 프로그래밍 (6)
    • RFID 분석 (1)
    • Win32 API (7)
    • Cortex-M3 (4)
    • Unity (91)
    • Flutter (9)
    • OwnProject (11)
      • It's mine (5)
      • 마인드스톰 실습 (1)
      • 보고서 자료 (2)
      • RPi B+ (2)
    • ETC (25)
      • 상식 (3)
    • MFC (40)
    • PostgeSQL (18)
    • 영상제어 (6)
      • VFW_영상처리 (1)
    • Python (0)
    • Java (30)
      • SpringBoot (2)
      • Javascript (1)
      • JSP (13)
      • Spring (8)
    • Oracle (4)
      • SQL (3)
    • HTML (6)
      • Thymeleaf (1)
      • CSS (1)
      • Bootstrap (3)
    • IDE (1)
      • VS Code (1)
    • Android (2)
    • Privacy Policy (0)
    • MYSQL (2)
      • MariaDB (2)
    • AWS (5)
    • 개인공부 (0)

블로그 메뉴

  • 홈
  • 태그
  • 미디어로그
  • 위치로그
  • 방명록
  • 관리자
  • 글쓰기

공지사항

인기 글

태그

  • MFC
  • 문자열 나누기
  • WINAPI
  • ARM Reverse Engineering
  • Boot Code 분석

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
성엽이

KKIMSSI

카테고리 없음

2013.05.31_AVR_Timer/Counter

2013. 6. 3. 10:27

▶ Timer.c

#include "Timer.h"

static volatile unsigned int ui_Tic;  // 0.001초 카운터를 세기위해서.

void Timer0_Init(void)
{
  TCCR0A = ((0<<WGM00) | (0<<WGM01) | (0<<COM0A0) | (0<<COM0A1) |(0<<COM0B0) |(0<<COM0B1)) ;  // 노말모드
  TCCR0B = ((0<<CS02) | (1<<CS01) | (1<<CS00) | (0<<WGM02));  // 분주비 64로 설정.

  TCNT0 = Tic_Start;  // 오버플로수 시작값 설정.
  TIMSK0 = (1<<TOIE0);  // 

  SREG = ((SREG) | (1<<Global_Interrupt_Enable));    // 모든 인터럽트 켜주기.
}

void __vector_23(void)  // 타이머핸들러.
{
  ++ui_Tic;        // Tic 을 계속 올려줌.
  TCNT0 = Tic_Start;  // 다시 불러줌.
  return;
}

void MS_DELAY(unsigned int ui_ms)
{
  ui_Tic = 0;
  TCNT0 = Tic_Start;
  while(ui_ms > ui_Tic);  // ui_Tic 이 0.01초 마다 계속 인터럽트되서 ++ui_Tic 됨.
  return;        // 1000번이 다되면 1초가됨.
}


▶ Timer.h

#ifndef  _TIMER_H_
#define  _TIMER_H_ 

#define  TCCR0    (*((volatile unsigned int *)0x44))  // 타이머/카운터 제어레지.
#define  TCCR0A    (*((volatile unsigned char *)0x44))  // 타이머/카운터 제어레지.
#define  TCCR0B    (*((volatile unsigned char *)0x45))
#define  TCNT0    (*((volatile unsigned char *)0x46))  // 카운터값을 저장하는 레지.
                          // 카운터 세어주는 레지.
/***** 인터럽트 기능 설정 레지스터 ******/
#define  TIMSK0    (*((volatile unsigned char *)0x6E))

/*****  타미어/카운터 0 제어 레지 A 설정 ***/
#define  WGM00     0
#define  WGM01     1
#define  COM0B0    4
#define  COM0B1    5
#define  COM0A0    6
#define  COM0A1    7

/*****  타미어/카운터 0 제어 레지 B 설정 ***/
#define  CS00     0
#define  CS01     1
#define  CS02     2
#define  WGM02    3    
#define  FOC0B    6
#define  FOC0A    7

/***** 상태 레지스터 SREG *****/
#define  SREG    (*((volatile unsigned char *)0x5F))
#define  Global_Interrupt_Enable    7    // I
#define  T            6
#define  H            5
#define  S            4
#define  V            3
#define  N            2
#define  Z            1
#define  C            0

/***** 분주비 설정 라인 ****/
#define  MCK      16000000
#define  Prescale    64
#define  Tic_Start    (255-(MCK/Prescale/1000))    // 오버플로우 시작값을 설정해줌.

/***** 인터럽트 기능 허용 ***/
#define  OCIE0B    2
#define  OCIE0A    1
#define  TOIE0     0


void Timer0_Init(void);
void Timer_Handler(void);
void MS_DELAY(unsigned int );
void __vector_23(void) __attribute__ ((signal, used, externally_visible));  // 핸들러가 지정되어있음.
                                                                  // 번호만 지정해주면 컴파일러가 직접 
#endif // _TIMER_H_                                              // 벡터테이블로 넣어줌. ARM 이랑 다름.



▶ Main.c

#include "Lcd.h"
#include "Timer.h"

int main(void)
{  
  Timer0_Init();

  DDRA = 0xFF;
  
  while(1)
  {
    MS_DELAY(1000);
    PORTA = 0x00;
    MS_DELAY(1000);
    PORTA = 0xFF;
  }
  while(1) ;
  return 0;  
}


저작자표시 (새창열림)
    성엽이
    성엽이

    티스토리툴바