본문 바로가기

최근작업 삽질방

2009 .12-21일 작업하던거


#define PIO_ASR (*(volatile unsigned int *) 0xFFFFF470)//주변장치 A로 선택
#define PIO_BSR (*(volatile unsigned int *) 0xFFFFF474)//주변장치 B로 선택
#define PIO_PDR (*(volatile unsigned int *) 0xFFFFF404)//병렬 입출력 포트로 사용 금지


#define PIO_SODR (*(volatile unsigned int *) 0xFFFFF430) //출력
#define PIO_CODR (*(volatile unsigned int *) 0xFFFFF434) //출력 하지 않음
#define PIO_OER  (*(volatile unsigned int *) 0xFFFFF410) //출력 방향 설정
#define PIO_PER  (*(volatile unsigned int *) 0xFFFFF400) //병렬 입출력 제어 레지스터 병렬 입출력 포트로 사용한다.
#define PIO_PUDR (*(volatile unsigned int *) 0xFFFFF460) //풀업 금지 레지스터

#define PIO_IFER (*(volatile unsigned int *) 0xFFFFF420) //글리치 필터 사용허가 레지스터
#define PIO_IER (*(volatile unsigned int *) 0xFFFFF440)  //인터럽트 인에이플 레지스터
#define PIO_ISR (*(volatile unsigned int *) 0xFFFFF44C)  //인터럽트 스테이터스 레지스터


//---------- 전력 제어 설정
#define PMC_PCER (*(volatile unsigned int *) 0xFFFFFC10)

#define MASTERCLOCK 48000000

 

//--------- AIC  (인터럽트 ) 설정
#define AIC_IDCR (*(volatile unsigned int *) 0xFFFFF124) // 인터럽트 금지 레지스터
#define AIC_SVR ((volatile unsigned int *) 0xFFFFF080)    //  인터럽트 서비스 루틴 등록
#define AIC_SMR ((volatile unsigned int *) 0xFFFFF000)   //   인터럽트 설정

#define AIC_ICCR (*(volatile unsigned int *) 0xFFFFF128) //에지 검출기 클리어
#define AIC_IECR (*(volatile unsigned int *) 0xFFFFF120) // 인터럽트 허용 레지스터


//---------디버그유닛 레지스터
#define DBGU_BRGR (*(volatile unsigned int *) 0xFFFFF220)   //보레이트 설정 레지스터
#define DBGU_MR (*(volatile unsigned int *) 0xFFFFF204)    //모드 레지스터 (모드 설정, 패리티 설정)
#define DBGU_CR (*(volatile unsigned int *) 0xFFFFF200)    //제어 레지스터 (송수신 설정)
#define DBGU_SR (*(volatile unsigned int *) 0xFFFFF214)    //상태 레지스터
#define DBGU_THR (*(volatile unsigned int *) 0xFFFFF21C)   // 송신 홀딩 레지스터
#define DBGU_RHR (*(volatile unsigned int *) 0xFFFFF218)   // 수신 홀딩 레지스터

//-디버그 유닛 인터럽트 설정-//
#define DBGU_IER (*(volatile unsigned int *) 0xFFFFF208)   // 인터럽트 설정 레지스터
static int flag=0;
// unsigned int menu_index[3]=0;
unsigned int LED_NUM=0;
unsigned int DELAY_TIME=0;
int num;
unsigned int LED_SUM=0;
unsigned char STACK;

//--------- 딜레이 함수

void Delayms(unsigned int ms) //딜레이 함수..
{
 volatile unsigned int count, countmax = (MASTERCLOCK / 10000) * ms;

 for(count = 0; count < countmax; count++);
}

 

//문자열 전송 함수 -----------------------------------------------------------------

void DBGU_TX_char(unsigned int data)
{
 while(!(DBGU_SR & 0x0002)); //DBGU_SR 의  TXRDY=1송신 가능 상태이면
 DBGU_THR = data;//  함수로 부터 받아온 데이타를 수신 버퍼에 넣어라
}

 

// 문자열 전달  함수 --------------------------------------------------------------

void DBGU_STRING(char * string)  //문자를  받아 송신버퍼에 전달하는 함수
{
 while((*string!='\0'))
 {
  DBGU_TX_char(* string);
  string++;    //포인터 값 증가
 }
}

// 메뉴----------------------------------------------------------------------------
void MENU()
{
 DBGU_STRING("1 LED 갯수 입력\n\r");
 DBGU_STRING("2 DELAY 시간간격 입력\n\r" );
 DBGU_STRING("3 STRAT\r\n");
 DBGU_STRING("4 STOP\n\r");
 DBGU_STRING("5 PIT\n\r");
 DBGU_STRING("6 CDS(A/D컨버터\n\r");
}
//---------------------------문자 변환 함수 -------------------------------
void itoa(void)//배열의 인덱스+1     i= 배열의 할당받을 갯수 즉 변환할 (문자->숫자)의  갯수이다 

{

 unsigned int s;// 루프돌릴 변수
 unsigned char temp;// 임시버퍼를 받는 변수
 unsigned char BUFF[5]; // 5자리정수 받을 공간
 unsigned int val=0;//  복원되는 최종값
 unsigned int number=1;// 자리수 곱해질값
// unsigned int i;

 temp = DBGU_RHR;//
 
  if(temp<48 || temp >58)//0~9 범위 이외의 출력값 발생 ====> error!!askii 48(h)=0(d)    57(h)=9(d)
    DBGU_STRING("ERROR 0~9숫자 입력");
 
  else
  { 
     for(s=0;s<5;s++)
      BUFF[s]=0;// 임의의 5칸 배열의 초기화
   
   for(s=0;s<5;s++)
      BUFF[s]=temp-48;// 임의의 5칸 배열의 초기화
   
  
   if(s==5)// 6자리째가 되면
   {  for(s=4;s<=0;s--)
   {
    val+=BUFF[s]*number;// 자리수를 곱해준다
    number*=10;// 자릿수 증가
   }
  }
        s=0;
  }
 }
 /* else if(i==1)
  {
   if(temp < '0' || temp > '9')//  0~9 이외의 값은 에러처리함
    {
     DBGU_string("error");
     count =0;
    return;
    }
   
   if(count ==0)// 배열의 초기화
   { 
    for(num =0 ; num <25; num++)
    {
     pch[num]=0;
    } 
   }
   
   pch[count] = temp-48;//아스키코드   문자를 숫자로 변환
   count++;//인덱스값 증가 
   if(count == 5)//자리수 5까지
   {  
    num =1;
    val =0;
    for(count =4; count>=0; count--)// 인덱스 값에 맞추어 돌림
    {
     val+=pch[count]*num;// 낮은자리수 부터  구해서 쌓음
     num *= 10;// 자리수 올리기  높은 자리 먼저 배열 인덱스 0~4저장하고 증가시킴 가장 낮은수는 인덱스 4
   
    }
    val =val *10 -12;
    
    DBGU_Int(pch, val);// 배열에 초기 주소와  최종 값을 전송
    count =0;// 다시초기화
    i=0;;// 다시초기화
    }
   }
        
}
*/
 
 

//--------------------------------------------//LED 불키는 함수
/*void  DBGU_RX_char(void) //LED 불키는 함수
{
static int flag=0;

// flag ^=0x01;  //^<<< XOR 연산자 같으면0 다르면 1

if(flag==0)
{
PIO_SODR =0x000000ff;
flag=1;
Delayms(500);
}
else
{
PIO_CODR =0x000000ff;
flag=0;
Delayms(500);
DBGU_TX_char(DBGU_RHR);
}
}*/
void DBGU_RX_ISR(void)
{
 
 
 STACK=DBGU_RHR;
 
}
 /* //=============인 터 럽 트 메 인 ================================
void DBGU_RX_ISR(void)
{
 static unsigned char temp[4];
 unsigned int num=1, i;
 unsigned int p;
 unsigned char status;

 p=(unsigned int)PIT_PIVR;    
 //PIT 카운터 레지스터. PICNT 가장최근의 PIVR의 데이타 저장 12비트   //   CPIV: 현재 주기적시간 간격 타이머값 나타냄 20비트
 status = DBGU_RHR; //  인터럽트 서비스 루틴의 핵심
 */
 
//------------LED  겟수 입력함수------------------------------------

unsigned int LED_NUMBER(void)
{

 DBGU_STRING("키고자하는 LED 갯수는?(1~4) 입력\n\r");
 //menu_index[0]=1;//
 if(DBGU_SR&&0x01==1)//RXRDY==1);
 {
  LED_NUM=DBGU_RHR;//입력된 값을 LED_NUM에 저장
 }

}


// ---------------DELAY 시간 설정함수 ---------------------------------
unsigned int LED_DELAY(void)

{
 DBGU_STRING("DELAY 시간간격 입력");
 while(DBGU_SR==0x01)//RXRDY==1
  DELAY_TIME=DBGU_RHR;

}

//------------------ START 함수 -----------------------------------------------------
void START(void)

{
 if(LED_NUM!=0 && DELAY_TIME!=0)// led 갯수 와 delay 시간이 설정완료되어야 돈다
 {
  for(num=0;num<LED_NUM;num++)
  {
  LED_SUM |=1<<num;// led 켤 2진수 지정 
  }
 while(flag!=1) // 4 스탑버튼이 눌러지면 멈춘다 
  {
  PIO_SODR=LED_SUM; //켬
  Delayms(DELAY_TIME);
  PIO_CODR=0x0F;  //끔
  Delayms(DELAY_TIME);
  }
 }
 else if(LED_NUM ==0)//
 {DBGU_STRING("2 LED 갯수를 다시입력하세요");
 LED_NUMBER();
 DBGU_STRING("개\n\r");;
 }

 else if(DELAY_TIME==0)
 {DBGU_STRING("3 시간 설정을 다시하세요");
 LED_DELAY();
 }
}

//----------------------------STOP함수-----------------------
void STOP(void)
{
PIO_CODR = 0xff;
}
int main(void)
{


 unsigned int i, RxD;
 unsigned int data;

 PMC_PCER=(unsigned int)1<<2; //

 Delayms(50);

 PIO_OER  =0x000000ff;

 PIO_CODR =0x000000ff;

 PIO_ASR=(unsigned int)1<<9|(unsigned int)1<<10;//주변 장치 A로 PA9,PA10번 사용
 PIO_PDR=(unsigned int)1<<9|(unsigned int)1<<10;//


 DBGU_MR =0x00000800;// chmode = 정상 모드
 // par= 패리티 사용 하지 않음

 DBGU_BRGR = 26;    //보레이트 설정 115200

 DBGU_CR =0x00000150;//송신부 수신부 동작 시작


 DBGU_IER= 0x01; //수신 인터럽트 설정

 //인터럽트 설정 부분

 AIC_IDCR = (unsigned int) 1 <<1;// PIOA

 AIC_SVR[1] = (unsigned int)DBGU_RX_ISR; // 서비스 루틴 등록

 AIC_SMR[1] = 0x07; //인터럽트 모드 우선순위 설정

 AIC_ICCR=(unsigned int) 1 <<1;// sys 인터럽트

 AIC_IECR = (unsigned int) 1 <<1;// 인터럽트 허용

 DBGU_STRING("하이퍼 터미널 시작\n\r");
 MENU();
 if(DBGU_SR == 0x01)//RXRDY=1 수신된 데이타가 있으면

 {
  if(STACK==1) //메뉴가 1일때

   LED_NUMBER();

  else if(STACK==2)
 
   Delayms(DELAY_TIME);
 
  else if(STACK==3)
   START();

  else if(STACK==4)
  {
  STOP();
  flag=1;
  }
  /*else if(DBGU_RHR==5)
  {
  CDS_AD(int);
  }
  */
 }
 


return 0;

}

 

'최근작업 삽질방' 카테고리의 다른 글

arm ex  (0) 2010.01.21
영상처리 라벨링 - 자료구조 나무뿌리 먼져타기 삽질중  (0) 2010.01.12
미니프로젝트 영상처리 버튼 오류진행중.  (0) 2010.01.06
1-3일 삽질  (0) 2010.01.04
1228 삽질2  (0) 2009.12.28