반응형

 

안드로이드 스튜디오에서 AppCompatActivity 를 상속받을 때 해당 클래스를 찾을 수 없다고 발생할 경우의 해결 방법이다.

 

build.gradle 파일을 열면 하단에,

 

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:appcompat-v7:21.0.3'
}

이와 같이 입력되어있을 것이다. 아래와 같이 appcompat의 버전을 바꾸어준다.

 

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:appcompat-v7:22.1.0'

}

 

이후 해당 build.gradle을 Sync Now 시켜주면 해결된다.

반응형
반응형

TW2836 칩은 4채널 비디오 제어가 가능한 IC이다. 가격도 13불이나 된다.

 

4개 채널을 입력 받아서 한 채널로 출력을 내보내주는데 4CH 블랙박스를 예로 들 수 있다.

 

LCD에 4채널 비디오를 화면에 4분할해서 표시하는 역할을 이 IC가 하게 된다.

 

급히 ABOV MCU로 해당 칩을 제어할 일이 생겼었는데, 해당 칩의 내장된 I2C 기능을 쓰기에는 시간도 부족하였고 스터디가 안된 상태여서 그냥 GPIO I2C로 제어를 해보았다.

 

I2C는 비교적 SPI 통신보다는 훨씬 간단하다고 생각된다.. 그리고 클럭 주파수가 정확히 안맞더라도 알아서 잘 동작하는 경우가 많다.

 

대부분 I2C 통신 규격이 비슷하지만 칩마다 타이밍차트가 조금씩 다르고 프로토콜도 조금씩 다르므로 데이타시트를 유심히 봐야한다.

 

 

 

위는 TW2836 칩의 I2C 프로토콜이다.

 

내가 이 칩을 컨트롤하면서 좀 이상하다고 생각되는 부분이 READ 프로토콜쪽이다.

 

READ 프로토콜을 보면 DATA를 2바이트씩 읽을 수 있게 되어있다.

 

그래서 난 당연히 앞의 DATA를 상위 8비트에 넣고 뒤의 DATA를 하위 8비트에 넣어서 16비트 데이타로 받았는데,

 

값은 이상하게 출력되었다. 그래서 오실로스코프로 확인해본 결과 데이타가 8비트로 들어오는 것이었다...

 

확인안해보았으면 삽질만 하고 있을 뻔 했다. 데이타시트가 잘못된 것인지, 다른 의도가 있는 건지는 모르겠다..

 

결국은 앞의 DATA 후 ACK 체크하는 부분을 빼버리고, DATA 후 NACK만 체크하여 READ를 구현하니 잘 되었다.

 

 

 

위 이미지는 타이밍차트이다. 통신 프로토콜을 맞게 보내더라도 위 타이밍이 안맞으면 칩은 응답하지 않는다.

 

보통은 대충 딜레이 넣어서 통신해도 다 타이밍 내에 들어오기 때문에 문제될 일은 드문데 그래도 마이컴의 동작주파수 등 여러 조건을 잘 따져보아야 삽질을 방지할 수 있다.

 

아래는 GPIO I2C로 제어한 코드이다.

 

void i2c_init(void)
{
	P0IO |= 0xC0;  //Set SCL, SDA to output
	SCL = 1;  // Set SCL, SDA High
	SDA = 1;
}

void i2c_start(void)
{
	//start
	P0IO |= 0xC0;  //Set SCL, SDA to output
	SDA = 1;
	SCL = 1;  // Set SCL, SDA High
	Delay_us(7);

	SDA = 0;	// Clear SDA
	Delay_us(7);
 	SCL = 0;	// Clear SCL
	Delay_us(7);
}

void i2c_stop(void)
{
	P0IO |= 0x80;	// Set SDA to output
	SDA = 0;	// Clear SDA Low
	Delay_us(7);

	SCL = 1;	// Set SCL High
	Delay_us(7); 
	SDA = 1; // Set SDA High

 	P0IO &= (~0xC0);	// Set SDA to Input
}

void write_i2c_byte(unsigned char byte)
{
	unsigned char i = 0;

	P0IO |= 0x80;		// Set SDA to output
	
	for (i = 0; i < 8 ; i++)
	{
		if((byte & 0x80)==0x80)	SDA = 1;	// Set SDA High
		else					SDA = 0;	// Clear SDA Low

		SCL = 1;		// Set SCL High, Clock data
		_nop_();
		byte = byte << 1;	// Shift data in buffer right one
		SCL = 0;		// Clear SCL
		_nop_();
	}
	SDA = 0; //listen for ACK
	P0IO &= (~0x80);

	SCL = 1;		
	_nop_();_nop_();
	SCL = 0; 
	_nop_();_nop_(); //Clear SCL.
	P0IO |= 0x80;		// Set SDA to Output
}

unsigned char read_i2c_byte(unsigned char ch)
{
	unsigned char i, buff=0;

	P0IO &= (~0x80);	// Set SDA to input

	for(i=0; i<8; i++)
	{
		_nop_();_nop_();
		SCL = 1;	
		_nop_();_nop_();// Set SCL High, Clock bit out
		buff <<= 1;

		// Read data on SDA pin
		if ((P0&0x80) == 0x80) {
			buff |= 0x01;
		}
		SCL = 0; // Clear SCL
		_nop_();_nop_();
	}
   	if(ch == 0) //ACK
	{
		SDA = 1; //SDA HIGH.
	}
	else //NACK.
	{
		SDA = 0; //SDA LOW.
	}
	SCL = 1;		
	_nop_();_nop_();
	SCL = 0; //SCL LOW.
	SDA = 1; //SDA HIGH.
	_nop_();_nop_();
	P0IO |= 0x80;	// Set SDA to Output

	return buff;
}

unsigned int read_word(unsigned char slave, unsigned char page_address, unsigned char index_address)
{
	unsigned int temp;
	unsigned char ucHibyte = 0;
	unsigned char ucLobyte = 0;
	unsigned char ucNack = 0;

	ucHibyte=0;
	ucLobyte=0;

	i2c_start();
	write_i2c_byte(slave);
	write_i2c_byte(page_address);
	write_i2c_byte(index_address);

	i2c_start();
	write_i2c_byte(slave+1);

	ucLobyte=read_i2c_byte(1);
	//ucHibyte=read_i2c_byte(1);
	
	i2c_stop();

   	temp = (ucHibyte<<8) + ucLobyte;

	return temp;
}

void write_word(unsigned char slave, unsigned char page_address, unsigned char index_address, unsigned char value)
{
	i2c_start();
	write_i2c_byte(slave);
	write_i2c_byte(page_address);
	write_i2c_byte(index_address);
	write_i2c_byte(value);
	i2c_stop();
}

 

 

 

반응형
반응형

 

이번에는 RECT 충돌 방법에 대해 알아보려고 한다.

 

일반적으로 타일 방식 맵을 사용하는 게임에서 사각형 충돌을 많이 사용한다.

 

가장 기초가 되는 충돌 방식이고 이를 응용하여 다양한 충돌 방식을 생각해볼 수도 있다.

 

 

 

위 이미지는 사각형 충돌이 다양한 형태로 발생할 수 있다는 것을 보여준다.

 

초록색 사각형이 캐릭터이고 빨간색 사각형이 장애물이라 가정해보자.

 

캐릭터는 밑으로 부딪힐 수도 있고 좌우 혹은 위로 부딪힐 수가 있다.

 

이것을 어떻게 처리해야 모든 충돌 조건을 처리할 수 있을까?

 

그전에 RECT의 기본 속성부터 알아보자. RECT 속성은 4개가 존재한다. (LEFT, TOP, RIGHT, BOTTOM)

 

LEFT(X1)은 사각형의 왼쪽 모서리를 의미한다.

TOP(Y1)은 사각형의 위쪽 모서리를 의미한다.

RIGHT(X2)는 사각형의 오른쪽 모서리를 의미한다.

BOTTOM(Y2)는 사각형의 아래쪽 모서리를 의미한다.

 

초록색 사각형의 특정 모서리가 빨간색 사각형의 특정 모서리를 넘어서는지 조건을 비교하여 충돌 처리 함수를 만들 수가 있다.

 

C++에서는 IntersectRect() 함수를 제공해주어서 편리하지만, 자바에서는 아쉽게도 직접 만들어써야한다.

 

아래는 두개의 사각형을 비교하는 충돌 처리 함수이다.

 

public static boolean IsIntersect(int x1, int y1, int w1, int h1, int x2, int y2, int w2, int h2)
{
        if(x1 + w1 >= x2 && x1 <= x2 + w2 && y1 + h1 >= y2 && y1 <= y2 + h2)
        {
            return true;
        }

        return false;
 }

 

함수 인수를 RECT 속성으로 나열해버려서 그런지 조금 복잡해보이는 감이 있지만, 코드 자체는 무진장 간단하다.

 

조건식을 풀어보면, 아래와 같다.

 

아래 조건 하나하나 위의 그림 충돌 상태에도 적용이 되는지 확인해보자.

 

1. 첫번째 사각형의 오른쪽 모서리가 두번째 사각형의 왼쪽 모서리를 넘어야 한다.

2. 첫번째 사각형의 왼쪽 모서리가 두번째 사각형의 오른쪽 모서리를 넘지 않는다.

3. 첫번째 사각형의 아래쪽 모서리가 두번째 사각형의 위쪽 모서리를 넘어야 한다.

4. 첫번째 사각형의 위쪽 모서리가 두번째 사각형의 아래쪽 모서리를 넘지 않는다.

 

맨 위의 그림 4개를 보면 위 조건 4개가 모두 만족하여 true를 반환하게 된다.

 

그 외의 조건은 당연히 충돌되지 않으므로 false를 반환하게 된다.

 

반응형

+ Recent posts