Busan IT/ARM Controller2015. 8. 19. 16:43

==================================Outline====================================

Interrupt Code

초음파 센서 SRF05

Timer/Counter

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

Interrupt Code


#include <project.h>


unsigned char DBGU_RX()
{
  while0 == (*AT91C_DBGU_CSR & AT91C_US_RXRDY) );  //reciever inactive status holding here

  return *AT91C_DBGU_RHR;    //Data read from DBGU_RHR register  
}

void DBGU_TX(char ucData)
{
  while0 == (*AT91C_DBGU_CSR & AT91C_US_TXRDY) );  //transmitter inactive status holding here

  *AT91C_DBGU_THR = ucData;    //put data into THR register

  return;
}

void DBGU_STR(const char * cpStr)
{
  while0 != *cpStr)
  {
    DBGU_TX(*cpStr);
    ++cpStr;
  }
}

void DBGU_Init_Polling()      //initiating
{
  *AT91C_PIOA_PDR = AT91C_PA9_DRXD | AT91C_PA10_DTXD; //Turn off other function in PIOA
  *AT91C_PIOA_ASR = AT91C_PA9_DRXD | AT91C_PA10_DTXD; //DBGU Debug Transmit Data & DBGU Debug Receive Data
  //*AT91C_DBGU_CR = AT91C_US_RSTRX | AT91C_US_RSTTX; //(DBGU) Reset Transmitter&Reciever
  *AT91C_DBGU_CR = AT91C_US_RSTTX | AT91C_US_RSTRX;    // Reset Receiver and Transmitter  
  *AT91C_DBGU_MR = AT91C_US_CHMODE_NORMAL | AT91C_US_PAR_EVEN; //Normarl mode, Even Parity
  *AT91C_DBGU_BRGR = DBGU_CD;              //CD setting
  *AT91C_DBGU_CR = AT91C_US_RXEN | AT91C_US_TXEN;    //Enable Receiver and Transmitter    
}
void DBGU_Menu()
{
  DBGU_STR("1. LCD Print\n\r");
  DBGU_STR("m. Menu Print\n\r");    
}

void DBGU_RX_ISR()
{  
  //while(*AT91C_DBGU_RHR == 0);
  switch((*AT91C_DBGU_RHR & 0x000000FF))
  {
    default   :  DBGU_STR("Wrong Instruction\n\r");
          DBGU_Menu();
          break;
          
    case 'M'  :  DBGU_Menu();
          break;    
      
    case 'm'  :  DBGU_Menu();
          break;    
          
    case '1'  :  LCD_Inst(LCD_INST_CLR);
          LCD_Print("Hello World");
          break;
          
  }
  
  //RX TX Enable
}

void DBGU_Init_ISR()      //initiating RX with interrupt
{
  *AT91C_PIOA_PDR = AT91C_PA9_DRXD | AT91C_PA10_DTXD; //Turn off other function in PIOA
  *AT91C_PIOA_ASR = AT91C_PA9_DRXD | AT91C_PA10_DTXD; //DBGU Debug Transmit Data & DBGU Debug Receive Data
  //*AT91C_DBGU_CR = AT91C_US_RSTRX | AT91C_US_RSTTX; //(DBGU) Reset Transmitter&Reciever
  *AT91C_DBGU_CR = AT91C_US_RSTTX | AT91C_US_RSTRX;    // Reset Receiver and Transmitter  
  *AT91C_DBGU_MR = AT91C_US_CHMODE_NORMAL | AT91C_US_PAR_EVEN; //Normarl mode, Even Parity
  *AT91C_DBGU_BRGR = DBGU_CD;              //CD setting


  *AT91C_AIC_IDCR  = 1<<AT91C_ID_SYS;    // SYS인터럽트 핀 커맨드 비 활성화 
  
  AT91C_AIC_SVR[AT91C_ID_SYS] = (unsigned int)DBGU_RX_ISR;  // 핸들러 등록  
  AT91C_AIC_SMR[AT91C_ID_SYS] = AT91C_AIC_SRCTYPE_POSITIVE_EDGE|
                  AT91C_AIC_PRIOR_LOWEST;        // 동작모드 및 우선순위 결정
  *AT91C_AIC_ICCR  = 1<<AT91C_ID_SYS;    // 커맨드 레지스터 클리어    
  *AT91C_DBGU_IER  = AT91C_US_RXRDY;  //RXRDY 레지스터 활성화  
  *AT91C_AIC_IECR   = 1<<AT91C_ID_SYS;  // SYS 인터럽트 핀 인터럽트 활성화
  
  *AT91C_DBGU_CR = AT91C_US_RXEN | AT91C_US_TXEN;    //Enable Receiver and Transmitter      

}




void DBGU_Init()
{
  DBGU_Init_ISR();
}

 

초음파 센서 SRF05

 

센서는 센서의 감지 값을 직접 변환하여 사용해야 하지만 센서 모듈은 사용자가 직접 프로그래밍 과정을 거치지 않고 작동 원리를 알지 않아도 사용자가 바로 사용할 수 있도록 제공된다.

 

 

//음속 : 340m/s

 

 

 

Timer/Counter

 

초음파 센서를 작동시키기 위해서는 Timer/Counter와 인터럽트를 사용해야 한다.

 

ARMTimer/Counter에 대해서 배워보자.


 

Timer/Counter를 사용하기 위해 PMC에서 클럭을 공급해 주어야 한다. TC_CMR을 사용하아 T/C를 조작해야 한다.


 

카운터가 최대 값에 도달한 후 0으로 떨어질 수도 있지만 숫자가 서서히 감소할 수도 있다.

이를 이용하여 다양한 파형을 만들 수 있다.

반응형

'Busan IT > ARM Controller' 카테고리의 다른 글

Timer/Counter  (0) 2015.09.07
주파수와 ARM 메모리맵  (0) 2015.08.28
ARM UART Interrupt  (0) 2015.08.14
ARM USART(2)  (0) 2015.08.12
ARM USART  (0) 2015.08.11
Posted by newind2000