본문 바로가기
코스웨어/16년 스마트컨트롤러

20160318_김도관_업무일지_타이머자동증가&스위치제어

by 알 수 없는 사용자 2016. 3. 25.
728x90
반응형

작업 :

1.LCD에 타이머 초시계

2.응용해서 스위치로 제어


개요:

1.타이머에 자동증가값을 넣어 초당 시간 출력

2.외부인터럽트로 각각 버튼을 눌렀을때 stop, 1분증가 , 리셋등의 명령


lcd.h


lcd.c


tczero.h


tczero.c

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
#include "tczero.h"
 
static volatile unsigned int uiMsec; //static외부에서 접근 불가
volatile unsigned int uiSec;
volatile unsigned int uiSState;
 
void TCZero_Init(void)
{
    //TCCR0A  = (0 << COM0A1)|(0 << COM0A0)|(0<< COM0B1) |(0 << COM0B0) |(0 << WGM01)|(0 << WGM00); // 현재는X 출력파형 X
    TCCR0B  = (0 << FOC0A) |(0 <<  FOC0B)|(0 << WGM02) |(0 << CS02)   |(0 <<  CS01)|(0 <<  CS00); //분주 비64 // CS02 ,CS01 ,CS00  0,1,1 
        
    OCR0A   = 250;     
    
    TIMSK0  = (0 << OCIE0B)|(1 <<  OCIE0A)|(0 <<  TOIE0); // A만 사용
    
    EICRA = (3 << ISC2)|(3 << ISC1)|(3 << ISC0); 
    EIMSK = (1 << INT2)|(1 << INT1)|(1 << INT0); 
 
    uiSState = __STOP__;
    return;
}
void __vector_21(void//0.001 초 마다 호출
{
    ++uiMsec;
    if(uiMsec >= 1000// 1초 시간 세는것 메인에서 안해도됨
    {
        uiMsec = 0;
        ++uiSec;
    }
}
 
void TCZero_MSDelay(unsigned int uiDtime)
{
    if( uiDtime > 1000// 인자검사 
    {
        uiDtime = 1000;
    }
    uiMsec = 0;
    while(uiMsec < uiDtime);
}
    
void __vector_1(void// 인터럽트 포트 D 1로 제어
{                            //토글 스위치
    volatile unsigned int uiCnt;
     if(uiSState == __STOP__)
    {
        TCCR0B  = (0 << FOC0A) |(0 <<  FOC0B)|(0 << WGM02) |(0 << CS02)   |(1 <<  CS01)|(1 <<  CS00);
        uiSState = __START__;
     }
    else
    {
        TCCR0B  = (0 << FOC0A) |(0 <<  FOC0B)|(0 << WGM02) |(0 << CS02)   |(0 <<  CS01)|(0 <<  CS00);
        uiSState = __STOP__;
    }
    for(uiCnt = 030000>uiCnt ; ++uiCnt);
    return;
}
 
void __vector_2(void)  // 리셋버튼
{    
    volatile unsigned int uiCnt;
    TCCR0B  = (0 << FOC0A) |(0 <<  FOC0B)|(0 << WGM02) |(0 << CS02)   |(0 <<  CS01)|(0 <<  CS00);
    uiSec = 0;
    uiSState = __STOP__;
     for(uiCnt = 030000>uiCnt ; ++uiCnt);
    
    return;
}
 
void __vector_3(void//   1분 증
{    
    volatile unsigned int uiCnt;
    uiSec=uiSec+60;
     for(uiCnt = 030000>uiCnt ; ++uiCnt);
    
    return;
}
cs

3번 : uiMsec 외부에서는 접근 못하게 static 선언

7번 : 타이머 초기화함수

주파수

분주비

클럭당 소요시간

기준시간

카운터

16000000

1

0.00000006250000000000

0.001

16000.000

 

8

0.00000050000000000000

0.001

2000.000

 

64

0.00000400000000000000

0.001

250.000

 

256

0.00001600000000000000

0.001

62.500

 

1024

0.00006400000000000000

0.001

15.625

 

분주비 64에 의해서 TCCR0B,OCR0A 설정

TIMSK 타이머/카운터 0~2 에서 발생하는 인터럽트를 개별적으로 허용하는 기능을 수행하는 레지스터 OCIE0A만 사용
22번 : vector21 함수 0.001초마다 호출
32번 : MSDelay 함수...느려지는문제로 인해 메인에서 사용안함
42번 : 토글 스위치 제어 정지및 시작하는 함수 , (PortD 1번를 사용하며 인터럽트발생시 회로에서 호출됨)
45번 : uiState가 Stop 상태일때 시작 , uiState가 Start 상태일때 Stop
55번 : 딜레이
59번 : 리셋 함수 (PortD 2번를 사용하며 인터럽트발생시 회로에서 호출됨)
TCCR0B 를 초기화 시키고 uiSec을 0, uiSState를 stop으로 만들어 시간을 0초로 다시 설정
70번 : 1분 증가 함수 uiSec에 60을 더해 1분 증가 시킴 (PortD 3번를 사용하며 인터럽트발생시 회로에서 호출됨)

main.h


main.c

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include "main.h"
#include "lcd.h"
#include "tczero.h"
 
int main(void)
{
    unsigned int uiTime;
    char caTime[] = "00:00:00";
    LCD_Init(); //
    TCZero_Init();
    sei();
    uiTime = uiSec = 0;//37543; //% 60;
    
    while(1)
    {
        
        caTime[7]='0'+uiSec%60%10;
        caTime[6]='0'+uiSec%60/10;
        caTime[4]='0'+uiSec/60%60%10;
        caTime[3]='0'+uiSec/60%60/10;
        caTime[1]='0'+uiSec/60/60%10;
        caTime[0]='0'+uiSec/60/60/10;
        LCD_Inst(LCD_HOME);
        LCD_Str(caTime);
        while(uiTime == uiSec); // 증가하지 않으면 멈춤
        uiTime = uiSec; //시간이 지나면 값이 입력됨
    }
    return 0;
}
cs

9번      : caTime 배열 초기화

10~11번 : LCD와 타이머 초기화

13번     : uiTime과 uiSec을 0으로 초기화

18~23번 : 각각 시,분,초를 비트단위로 자르고 2자리숫자를 한자리로 맞춰서 배열에 넣음

24번     : lcd home 호출

25번     : 문자열을 lcd에 출력

26번     : 시간이 튀는 문제를 방지하기위해 uiTime에 시간을 일단저장후 uiSec과 비교해서 시간값이 증가하면 uiTime에 입력




연결 :






출력:

Stop/Start 토글 스위치


1분 증가 스위치


리셋 스위치


728x90