/* ========================================================================== */
/* Xtest09_3.c : Stop Watch by PIT Interrupt */
/* ========================================================================== */
#include "AT91SAM7S256.h"
#include "lib_AT91SAM7S256.h"
#include "OK7S256ads.h"
#include "project.h"
void LCD_2d(unsigned int number) /* display 2-digit decimal number */
{
LCD_data(number/10 + '0'); // 10^1
LCD_data(number%10 + '0'); // 10^0
return;
}
volatile unsigned int second, minute, hour; // time variable
volatile unsigned int run_flag; // stop watch run flag
void PIT_ISR(void) /* PIT interrupt service routine */
{
AT91F_PITGetPIVR(AT91C_BASE_PITC);
// clear PITS, PIT_PIVR을 읽어서 PIT_SR의 PITS를 클리어
second++; // increment 1/100 second
if(second == 6000) // second = 60 ?
{ second = 0; // if yes, second = 0 and minute++
minute++;
if(minute == 60 // minute = 60 ?
{ minute = 0; // if yes, minute = 0 and hour++
hour++;
if(hour == 100) // hour = 100 ?
hour = 0; // if yes, hour = 0
}
}
LCD_command(0xC2); // display hour
LCD_2d(hour);
LCD_command(0xC5); // display minute
LCD_2d(minute);
LCD_command(0xC8); // display second
LCD_2d(second/100);
LCD_command(0xCB); // display 1/100 second
LCD_2d(second%100);
return;
}
void Clear_time(void) /* clear time */
{
second = 0; // clear time
minute = 0;
hour = 0;
LCD_string(0xC0," 00:00:00.00 "); // clear display
return;
}
// 수신
unsigned char Recv_Char()
{
while(1)
{
if(((*DBGU_SR) & 0x1) == 0x1){
// DBGU_SR의 RXRDY비트가 1이면 읽기준비완료
break;
}
}
return *DBGU_RHR;
}
int main(void)
{
*DBGU_CR |= 0xC;
// DBGU_CR의 RSTTX, RSTRX 1로 셋, 송수신부 리셋 & 동작중지
*DBGU_IDR = 0xFFFFFFFF; // 관련 인터럽터 Disable
*PIO_ASR |= 0x600;
// PA9, 10번 핀의 Peripheral A 모드 활성 DRXD, DTXD 1로 셋
*PIO_BSR = 0; // Peripheral B 모드 비활성
*PIO_PDR |= 0x600; // PA9,10번 핀 병령 I/O포트모드 비활성화
*DBGU_BRGR = 156;//0x1A; // 115200bps의 CD는 26 = 0x1A
*DBGU_MR |= 0x800;
// 포트모드설정, 15,14비트(정상 모드 00), 11,10,9비트(패리티 없음 1xx)
*DBGU_CR |= 0x50; // 송수신 모드 활성, TXEN, RXEN 비트 1로 셋
MCU_initialize(); // initialize AT91SAM7S256 & kit
Delay_ms(50); // wait for system stabilization
LCD_initialize(); // initialize text LCD module
Beep();
AT91F_PITC_CfgPMC(); // enable peripheral clock for PIT
// PMC_PCER 주변장치 클록허용 레지스터(system controller에 클록의 공급허용)
AT91F_PITInit(AT91C_BASE_PITC,1,48); // enable and initialize PIT
// PIT 모드 레지스터인 PIT_MR레지스터의 PITEN을 1로 (시간간격 타이머 활성화)
AT91F_PITSetPIV(AT91C_BASE_PITC,30000-1); // 48MHz/16/30000 = 100Hz
// PIT_MR레지스터의 PIV = 30000-1
AT91F_PITEnableInt(AT91C_BASE_PITC); // initialize PIT interrupt
// PIT_MR레지스터의 PITIEN을 1로(PIT_SR의 PITS비트가 인터럽트 요청신호 pit_irq로 출력)
AT91F_AIC_ConfigureIt(AT91C_BASE_AIC,AT91C_ID_SYS,7,1,PIT_ISR);
// AIC_SVR[1] = PIT_ISR, AIC_SMR[1] = 0x47
AT91F_AIC_DisableIt(AT91C_BASE_AIC,AT91C_ID_SYS);
LCD_string(0x80, "** STOP WATCH **"); // display title
Clear_time(); // clear time and display
run_flag = 0; // default state
while(1)
{ switch(Recv_Char()) // key input
{ case '1' : if(run_flag == 0) // if KEY1 & run_flag=0, strat
{ run_flag = 1;
AT91F_AIC_EnableIt(AT91C_BASE_AIC,AT91C_ID_SYS); // AIC_IECR 인터럽트 허용
}
else // if KEY1 & run_flag=1, stop
{ run_flag = 0;
AT91F_AIC_DisableIt(AT91C_BASE_AIC,AT91C_ID_SYS); // AIC_IDCR 인터럽트 금지
}
break;
case '2' : if(run_flag == 1) break;
// if KEY2 & run_flag=1, ignore
Clear_time(); // if KEY2 & run_flag=0, clear time
break;
default: break;
}
}
}
|
|