티스토리 툴바


2009/06/05 18:15 분류없음
/* ========================================================================== */
/*    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 == 1break
          // if KEY2 & run_flag=1, ignore
                      Clear_time();    // if KEY2 & run_flag=0, clear time
                      break;
          default:    break;
        }
    }
}











posted by 롯데우승
 <PREV 1 2 3 4 5 6 7 8 9 ... 17    NEXT>