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(;;)
'Bitdol' 카테고리의 다른 글
[밸런싱로봇] BLDC motor (0) | 2017.08.20 |
---|---|
[밸런싱로봇] IMU센서 제어하기 2 (0) | 2017.08.11 |
[밸런싱로봇] 아트메가로 센서값(각도값) 받기 (0) | 2017.08.07 |
[밸런싱로봇]1. 어디서 부터 접근을? (0) | 2017.07.31 |
[신입생교육과정]Assignment 7. 외부인터럽트 (0) | 2017.07.25 |
최근댓글