signed short get_data_word(unsigned char *dat)

{

  // little endian..

  data_word.byte[0]=dat[1];  

  data_word.byte[1]=dat[0];  


  // big endian..

  //data_word.byte[1]=dat[1];  

 // data_word.byte[0]=dat[0];


data_word.value = data_word[0];

data_word.value += data_word[1]<<8;  


  return data_word.value;

}


//----------------------------------------------------------------------------------------------------------------------------------------

//**datasheet에서 endian을 확인하자

//**unsigned vs signed

//char 형식은 8비트이므로 signed char은 -128~127의 범위를 표현할 수 있고 unsigned chare은 0~255의 표현범위를 가진다.

//**endian

//little endian은  레지스터의 낮은값부터 메모리의 낮은 번수에 차례로 저장되는 방식. 표준 방식

//big endian은 레지스터의 높은 값부터 메모리의 낮은 번수에 차례로 저장되는 방식.



int trans_data_to_degree(unsigned char *sdata) // sdata : roll(2)+pitch(2)+yaw(2)+chk(2)

{

  int n;

  long chk=0, chk1=0;


//----------------------------------------------------------------------------------------------------------------------------------------

//**char가 8비트 처리 단위라면 int은 CPU마다 처리 단위가 다르다.

//ex. char val8; // 8bit 정수형

//ex. int ival; // 16bit

//ex. long int ival; //32bit

//**포인터 변수 선언

//char * : main문에서 char *변수를 선언했다.

//ex. *sdata++ : 이 코드의 의미는 sdata의 포인터가 가르키는 값을 1만큼 더한것



///////////// checksum /////////////////

chk=0x55+0x55;

  for(n=0;n<6;n++) 

{

chk+=sdata[n]; 

}


//----------------------------------------------------------------------------------------------------------------------------------------

// 8bit 처리단위에서 처음 2번째까지의 레지스터에는 0x55값이 저장되고, 나머지 6개의 레지스터에 차례대로 data가 저장된다.


chk1=get_data_word(&sdata[6]);

//Printint_hex(chk);

//Printint_hex(chk1);

  if(chk != get_data_word(&sdata[6]))

  {

    //Serial.println("checksum error!");

    

    return 0; //   

  }


  DegRoll = get_data_word(&sdata[0]) / 100.;

  DegPitch = get_data_word(&sdata[2]) / 100. * -1;

  DegYaw   = get_data_word(&sdata[4]) / 100.;


//0x55;0x55; -> data 입력을 시작받겠다

//8bit 레지스터 표현

//sdata : roll(2)+pitch(2)+yaw(2)+chk(2)


  return 1;


//왜 return 1?


}


int recieve_data(unsigned char data)

{    

   

static char b='a';


//----------------------------------------------------------------------------------------------------------------------------------------

//static 변수는 단 한번만 초기화 할 뿐 함수 내에서 초기값이 사라지지 않고 계속 유지된다.


//printch_hex(data);

 

//utch(b);


switch(b){


//----------------------------------------------------------------------------------------------------------------------------------------

//switch조건문은 case뒤의 값과 일치하는 경우 분기된다.


case 'a':

if(0x55 == data){ //data를 입력받겠다

b='b';

check_all_recieve = 0;

}

break;


case 'b':

if(0x55 == data){

b='c';

SCna=0; // Scna는 8비트 레지스터의 위치

}

else{

b='a';

}


check_all_recieve = 0;

break;


case 'c':

if(SCna!=8)

{ SBuf[SCna] =  data; // SBuf는 8비트 레지스터의 이름

SCna++;

check_all_recieve = 0;

}

else if(8 == SCna)  // roll(2byte),pitch(2byte),yaw(2byte),checksum(2byte) 

             { //putch('d');

b='a';

                SCna=0;

                check_all_recieve = 1

             }

break;

}


int map(double degree, double d_min, double d_max, double r_min, double r_max)

{

int result = (degree - d_min) * ((r_max-r_min)/(d_max-d_min))+r_min ; 


return result;

}


SIGNAL(SIG_UART1_RECV)      //데이터가 오면 인터럽트가 일어남

{   

unsigned char data;

data = UDR1;

 if(recieve_data(data)==1)  //roll(2byte),pitch(2byte),yaw(2byte),checksum(2byte) all recieve!!!

    {  

     if(trans_data_to_degree(SBuf)==1)  

    {

val_1 = map(DegRoll, -90, 90, 0, 1000);//앞뒤

Printlint(val_1);

//val_2 = map(DegPitch, -90, 90, 0, 1000);//좌우

_delay_ms(20);

    

    }

    }


    

}   


ISR(BADISR_vect)

{

//for(;;) 

  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 라이프코리아트위터 공유하기
  • shared
  • 카카오스토리 공유하기