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

20160317-업무일지-허도경-타이머카운터

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

클럭: 동작 주파수

주파수: 초당 진동수

∴클럭은 시간을 가진다.


분주비 64

분주비 결정 레지스터

64분주비로 250번 카운트시 0.001초 지났음을 확인




타이머카운트 내부인터럽트를 활성화하는 레지스터

Compare:비교방식-일정숫자에 다다르면 0에서 시작

overflow방식을 compare방식으로 하려면 시작 숫자를 올려서 맞추면 된다.

ex)


왼쪽과 오른쪽 방식은 다르지만 결과는 똑같다.



--------------------------------------------------------------------------------------------------------------------------

lcd.c

#include "lcd.h"

void LCD_Init(void)
{
     DDRC = (1<<RS)|(1<<RW)|(1<<EN); //C포트 3개 열기.(방향지정)
     DDRA = 0xff; //다 열어야 하므로
     CTL = (0<<RS)|(0<<RW)|(0<<EN); //열었던 C포트 3개 초기화(Low), 안 쓰는 상태로 만들기
     BUS = 0x00; //BUS도 0으로 만드는 작업.

     LCD_Inst(LCD_FUNC);
     LCD_Inst(LCD_DSP);
     LCD_Inst(LCD_ENT);
     LCD_Inst(LCD_CUR);
     LCD_Inst(LCD_CLR);
     LCD_Inst(LCD_HOME);  //이것들이 실행되어서 다 초기화 시킨다.
}

void LCD_Inst(unsigned char ucInst)
{
     volatile unsigned int uiCnt;

 CTL = CTL & ~(1<<RS); 
 CTL = CTL & ~(1<<RW);
 CTL = CTL & ~(1<<EN);  
 BUS = ucInst;
 for(uiCnt = 0; 30000>uiCnt; ++uiCnt);  //A구간

 //CTL = CTL & ~(1<<RS);
 //CTL = CTL & ~(1<<RW);
 //CTL = CTL & ~(1<<EN);
 //BUS = ucInst;
 for(uiCnt = 0; 30000>uiCnt; ++uiCnt);   //B구간

 //CTL = CTL & ~(1<<RS);
 //CTL = CTL & ~(1<<RW);
 CTL = CTL | (1<<EN);  //여기만 1로 바꿔주면 됨. 여기만 low로 바뀌니까. Enable 신호가 들어오면 LCD가 켜진다.
 //BUS = ucInst;
 for(uiCnt = 0; 30000>uiCnt; ++uiCnt);   //C구간

 //CTL = CTL & ~(1<<RS);
 //CTL = CTL & ~(1<<RW);
 CTL = CTL & ~(1<<EN); 
 //BUS = ucInst;
 for(uiCnt = 0; 30000>uiCnt; ++uiCnt);   //D구간

 //CTL = CTL & ~(1<<RS);
 //CTL = CTL & ~(1<<RW);
 //CTL = CTL & ~(1<<EN); 
 //BUS = ucInst;  //변함 없는 것들은 초기에만 입력하면 된다. 뒤로는 필요 없다.
 for(uiCnt = 0; 30000>uiCnt; ++uiCnt);   //E구간

}

void LCD_Data(unsigned char ucData)
{
       volatile unsigned int uiCnt;

 CTL = CTL | (1<<RS);  //원하는 자리에 0을 넣고 싶을 때. 11111111 -> 00010000(1>>RS).... 11111111 & 11101111(~) => 11101111
 CTL = CTL & ~(1<<RW); //high, low 무엇이 와도 상관없다.
 CTL = CTL & ~(1<<EN);  //반드시 low가 와야한다. 그래야 글이 출력이 안됨.  0이나 1와 와야하는 이유?
 BUS = ucData;
 for(uiCnt = 0; 30000>uiCnt; ++uiCnt);  //위에 네줄 지속시키는 소스.

 //CTL = CTL | (1<<RS);
 //CTL = CTL & ~(1<<RW);
 //CTL = CTL & ~(1<<EN);
 //BUS = ucData;
 for(uiCnt = 0; 30000>uiCnt; ++uiCnt);   //B구간

 //CTL = CTL | (1<<RS);
 //CTL = CTL & ~(1<<RW);
 CTL = CTL | (1<<EN);  //여기만 1로 바꿔주면 됨. 여기만 low로 바뀌니까. Enable 신호가 들어오면 LCD가 켜진다.
 //BUS = ucData;
 for(uiCnt = 0; 30000>uiCnt; ++uiCnt);   //C구간

 //CTL = CTL | (1<<RS);
 //CTL = CTL & ~(1<<RW);
 CTL = CTL & ~(1<<EN); 
 //BUS = ucData;
 for(uiCnt = 0; 30000>uiCnt; ++uiCnt);   //D구간

 //CTL = CTL | (1<<RS);
 //CTL = CTL & ~(1<<RW);
 //CTL = CTL & ~(1<<EN); 
 //BUS = ucData;  //변함 없는 것들은 초기에만 입력하면 된다. 뒤로는 필요 없다.
 for(uiCnt = 0; 30000>uiCnt; ++uiCnt);   //E구간

}

void LCD_STR(const char *cString)
{
     while(0!=*cString)
     {
          LCD_Data (*cString);
          ++cString;
     }


lcd.h

#ifndef __LCD_H__
#define __LCD_H__

#include"main.h"

#define RS  4
#define RW  5
#define EN  6

#define BUS  PORTA
#define CTL  PORTC

void LCD_Init(void);
//void LCD_Inst(void);
void LCD_Inst(unsigned char ucInst);
void LCD_Data(unsigned char ucData);
void LCD_STR(const char * cString);

#define LCD_CLR  0x01
#define LCD_HOME  0x02 //or 0X03
#define LCD_ENT  0x06 //S:0Shift OFF, I/D:1 Increase Mode
#define LCD_DSP  0x0F //D:1 /Display On C:1 Cursor on B:1 Blink On
#define LCD_CUR  0x14 //S/C:0 Shift Cursor OFF R/L:1
#define LCD_FUNC  0x38 //DL:1 Data length 8bit  N:1 2Line F:0 Font 5X8

#endif //__MAIN_H__

main.c

#include "main.h"
#include "lcd.h"
#include "tc0.h"
int main(void)
{
     char caTime[] = "00:00:00";
     volatile unsigned int uiSec;
 
     LCD_Init();
     //LCD_Data('A');
     //LCD_STR("APPLE");
     TC0_Init();
     sei();
     LCD_STR(caTime);

     uiSec=3673;
     while(1)
     {
          //LCD_Data('A');
          //TC0_MSDelay(1000);
          //caTime[7]='0'+3//askii code+3;
          caTime[7]='0'+((uiSec%60)%10);
          caTime[6]='0'+(uiSec/60);
          caTime[3]='0'+(((uiSec/60)%60)/10);
          caTime[4]='0'+(((uiSec/60)%60)%10);
          //caTime[1]='0'+((uiSec%60)%60);
          //caTime[0]='0'+((uiSec%60)%60);
          LCD_Inst(LCD_HOME); 
          LCD_STR(caTime);
  
     }

 return 0;

}


main.h
#ifndef __MAIN_H__
#define __MAIN_H__


#define DDRA (*((volatile unsigned char *)0x21))
#define PORTA (*((volatile unsigned char *)0x22))
#define PINA  (*((volatile unsigned char *)0x20))

#define PORTC (*((volatile unsigned char *)0x28))
#define DDRC (*((volatile unsigned char *)0x27))
#define PINC  (*((volatile unsigned char *)0x26))

#define EICRA  (*((volatile unsigned char *)0x69))
#define EICRB (*((volatile unsigned char *)0x6A))
#define SREG  (*((volatile unsigned char *)0x5F))
#define EIMSK (*((volatile unsigned char *)0x3D))
#define EIFR  (*((volatile unsigned char *)0x3C))

#define TIRF0 (*((volatile unsigned char *)0x35))
#define TIMSK0 (*((volatile unsigned char *)0x6E))
#define OCR0B (*((volatile unsigned char *)0x48))
#define OCR0A (*((volatile unsigned char *)0x47))
#define TCNT0 (*((volatile unsigned char *)0x46))
#define TCCR0B (*((volatile unsigned char *)0x45))
#define TCCR0A (*((volatile unsigned char *)0x44))

#define COM0A1 7
#define COM0A0 6
#define COM0B1 5
#define COM0B0 4
#define WGM01 1
#define WGM00 0

#define INT7  7
#define INT6  6
#define INT5  5
#define INT4  4
#define INT3  3
#define INT2  2
#define INT1  1
#define INT0  0

#define ISC7   6
#define ISC6   4
#define ISC5   2
#define ISC4   0
#define ISC3   6
#define ISC2   4
#define ISC1   2
#define ISC0   0

#define FOC0A 7
#define FOC0B 6
#define WGM02 3
#define CS02  2
#define CS01  1
#define CS00  0

#define OCIE0B 2
#define OCIE0A 1
#define TOIE0 0

#define sei()    __asm__ __volatile__ ("sei" ::)
#define sleep() __asm__ __volatile__ ( "sleep" "\n\t" :: )

void Init(void);
void Pont_Init(void);
void INT_Init(void);


void __vector_1 (void) __attribute__((signal, used, externally_visible));   //INT0
void __vector_2 (void) __attribute__((signal, used, externally_visible));
void __vector_21 (void) __attribute__((signal, used, externally_visible));

#endif //__MAIN_H__


tc0.c
#include "tc0.h"
volatile unsigned int uiMsec;

void TC0_Init(void)
{
     //TCCR0A = (0<<COM0A1)|(0<<COM0A0)|(0<<COM0B1)|(0<<COM0B0)|(0<<WGM01)|(0<<WGM00);//PWM에서봅시다.
     TCCR0B = (0<<FOC0A)|(0<<FOC0B)|(0<<WGM02)|(0<<CS02)|(1<<CS01)|(1<<CS00);
     //TCNT0 = 0X00;
     OCR0A = 250;
     //OCR0B = 0X00; //OCR0A와 비교.
     TIMSK0 = (0<<OCIE0B)|(1<<OCIE0A)|(0<<TOIE0);
     //TIRF0 = 0X00;
}
void __vector_21 (void)//0.001초마다 호출
{
     ++uiMsec;
}

void TC0_MSDelay(unsigned int uiDtime)
{
     if(uiDtime>1000)
     {
          uiDtime=1000;
     }
     uiMsec=0;
 while(uiMsec<uiDtime);
}

tc0.h
#ifndef __TC0_H__
#define __TC0_H__
#include"main.h"

void TC0_Init(void);
void __vector_21 (void);
void TC0_MSDelay(unsigned int uiDtime);

#endif
-----------------------------------------------------------------------------------------------



728x90