'2008/04/19'에 해당되는 글 4건

  1. 2008.04.19 [MFC] 비트맵 파일 저장 3
  2. 2008.04.19 Bitmap / 16bit rgb565 to 24bit RGB888 3
  3. 2008.04.19 XScale (PXA***) 에서 GPIO 1
  4. 2008.04.19 영문통화표(phonetic code) 1


 BITMAPFILEHEADER bmFileHeader;
 BITMAPINFOHEADER bmInfoHeader;

 // BMP 헤더
 bmFileHeader.bfSize  = sizeof(BITMAPFILEHEADER);
 bmFileHeader.bfType  = 0x4D42;
 bmFileHeader.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
 
 bmInfoHeader.biSize    = sizeof(BITMAPINFOHEADER);
 bmInfoHeader.biWidth   = 320; // 너비
 bmInfoHeader.biHeight   = 240; // 높이
 bmInfoHeader.biPlanes   = 1;
 bmInfoHeader.biBitCount   = 24; // 색상 비트
 bmInfoHeader.biCompression = 0;
 bmInfoHeader.biSizeImage = bmInfoHeader.biWidth * bmInfoHeader.biHeight * (bmInfoHeader.biBitCount/8);

 bmInfoHeader.biXPelsPerMeter = 0;
 bmInfoHeader.biYPelsPerMeter = 0;
 bmInfoHeader.biClrUsed = 0;
 bmInfoHeader.biClrImportant = 0;

 // BMP는 아래에서 위로 저장되는 형식이기 때문에 순서대로 저장하면 뒤집히므로 파일로 저장할 데이터를 뒤집기
 SPixel* rgbTemp = new SPixel[BUFSIZE]; // 파일저장할 데이터를 보관할 임시공간
 for(int i=0; i<BUFSIZE; i++) {
  rgbTemp[i].r = g_rgb[BUFSIZE-1-i].r;
  rgbTemp[i].g = g_rgb[BUFSIZE-1-i].g;
  rgbTemp[i].b = g_rgb[BUFSIZE-1-i].b;
 }

 // 파일로 저장
 CFile file;
 file.Open(_T("파일명"), CFile::modeNoTruncate | CFile::modeCreate | CFile::modeReadWrite );
 file.Write(&bmFileHeader, sizeof(BITMAPFILEHEADER));
 file.Write(&bmInfoHeader, sizeof(BITMAPINFOHEADER));
 file.Write(rgbTemp, bmInfoHeader.biSizeImage);
 file.Close();
 
 delete rgbTemp;

 AfxMessageBox(strFilename + _T("\nwas saved"));

Posted by freezn

void Conv16bit565_TO_24bitRGB(USHORT rgb565, BYTE *r, BYTE *g, BYTE *b)
{
 // 16비트로 RGB를 표현하는 RGB 565에서 R,G,B값을 각각 분리해낸다.
 // 각 비트를보면 다음과 같이 되어있다.
 // RRRRRGGGGGGBBBBB (R: Red, G: Green, B: Blue)

 BYTE red = (rgb565 & 0xF800) >> 11;
 BYTE green = (rgb565 & 0x7E0) >> 5;
 BYTE blue = (rgb565 & 0x1F);

 *r = red << 3;
 *g = green << 2;
 *b = blue << 3;
}

그러므로 24bit -> 16bit -> 24bit 식으로 변환해보면 red, green, blue에서 각각 3,2,3 비트씩 손실이 일어나는 것임을 알 수 있다.
(이렇게 단순히 비트를 죽이는 방법 말고 다른 방법을 쓴다면 조금 더 살릴 수 있을 진 모르겠다.)
RRRRRRRRGGGGGGGGBBBBBBBB 에서
XXXRRRRRXXGGGGGGXXXBBBBB 으로


16bit rgb 555 에서는?

XRRRRRGGGGGBBBBB 이렇게 16bit를 구성 (X는 더미비트)

32bit XRGB 에서는?
XXXXXXXXRRRRRRRRGGGGGGGGBBBBBBBB

Posted by freezn
삽질기행/잡다정보2008. 4. 19. 12:22

GPLR (Level)
Read Only
해당 핀의 High/Low 상태 확인 (해당 비트가 1이면 High)

GPDR (Direction)
Read/Write
핀의 경로 설정. 0이면 Input, 1이면 Output.

GPSR (Set) / GPCR (Clear)
Write Only (Read도 되던가?ㅡ.ㅡ;)
GPSR - 핀에 High를 Set함(1로 만듬), GPCR의 반대 기능
GPCR - 핀을 Low로 떨어뜨림(0으로 만듬), GPSR의 반대 기능

GRER (Rising Edge) / GFER (Falling Edge)
Write Only (Read도 되던가?ㅡ.ㅡ;)
핀 레벨엣지 감시. GRER의 해당 비트를 1로 만들면 Rising을, GFER의 해당 비트를 1로 만들면 Falling을 감시한다. 검출된 결과는 GEDR의 해당 비트가 1로 됨으로 써 알 수 있다.

사용자 삽입 이미지

GEDR (Edge Detect)
Read/Write
GRER/GFER에서 지정한 핀에서 Edge가 확인하면 해당 비트가 1로 바뀐다.
해당 핀의 비트에 1을 주면 Edge가 검출되었다고 1로 세팅되었던 비트가 0으로 clear된다.

GAFR (Alternate Function)
Write Only
이놈만 한 핀당 2비트다.
회로 설계에 따라 어찌할지 정해야한다.
(초짜 SW쟁이라 잘 모르겠다 -_-; 그냥 HW팀에서 해달라는대로 해줬다.)

00 : General Purpose I/O
01 : alternate function 1
10 : alternate function 2
11 : alternate function 3


---------------------------------------------
example.

GPIO핀 하나에 LED를 물렸다.
이 LED를 켜려면?

GPDR의 해당 비트는 1로 되어있어야한다.
그리고 해당 GPSR에 1을 준다.
끄려면?
GPDR의 해당 비트는 1로 되어있어야한다.
그리고 해당 GPCR에 0을 준다.

장치로부터 Level Edge 인터럽트를 받고자 하며, Rising과 Falling 둘다 필요한데 상황에 따라 처리할 내용이 다르다. 구분은 어떻게?
일단 GRER과 GFER을 모두 세팅해놓는다.
GEDR 감시로 인터럽트 발생을 확인한다.
Edge가 발생되면 GPLR로 핀레벨을 확인하여 확인된 Edge가 Rising인지 Falling인지 알 수 있다.

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

오늘의 잡템.

사용자 삽입 이미지

급조한거지만 비트를 한 눈으로 못읽는 나같은 이들을 위해 만든(사실을 나를 위해-_-;)
2가지 기능을 가진 잡템 -_-;

(GPLR을 예로 들면 GPLR0은 0~31, GPLR1은 32~63을 담당한다.)
핀번호 넣고 gen을 눌러주면 된다.

현재 세팅하는 값을 알기 위한 기능으로 Reg2GPIO -_-;;
GPLR2에서 읽힌 값이 0x80000000 이었다면 이게 몇번 핀들을 의미하는지 알기 위한 기능 ㅡ.ㅡ;;

invalid-file

GPIO Bit 계산기


나말고 다른 사람에게 쓸모가 있을지는 모르겠다 -_-;

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

아래는 내가 쓰려고 대충 만든것보다 좋아뵈는거 있어서 퍼왔다. ㅎㅎ




(1)해당 비트에 마우스를 가져다가 클릭해 보세요. 값이 변화를 보일 것입니다.
(2)직접 값을 입력하고 싶을 때는 HEX 창이나 DEC창에 값을 입력 한 이후 TEST 버튼을 눌러보세요.
(3)해당 값의 반전(NOT) 을 취하고 싶을 경우 해당 버튼을 누르세요
(4)해당 값을 원하는 수만큼 쉬프트 시키고 싶을 경우 쉬프트 할 비트수를 입력하고 좌/우 화살표(<<, >>)을 눌러 보세요.
(5)두개의 이진값을 &(AND), |(OR), ^(XOR) 합니다.
(6)To Result 버튼은 연산의 결과를 (1)번의 비트표시창으로 연동시켜 줍니다. 눌러보세요. 1번 윈도우의 비트값이 변화를 보일 것입니다.
(7)어드레스 베이스 값에 원하는 오프셋값을 더하고 빼는 것을 도와 줍니다.
(8)연산의 바로 직전 값을 확인 할 수 있도록 해 줍니다.
(9)Mapping Bits 버튼은 비트 값을 파일로 만들어서 INPUT 시킬 수 있는 기능 인데 사용법을 모르겠습니다.

http://www.hongikcom.com/zb/view.php?id=technote&page=2&sn1=&divpage=1&sn=off&ss=on&sc=on&select_arrange=headnum&desc=asc&no=28

Posted by freezn
삽질기행/잡다정보2008. 4. 19. 11:43
A 알파(alpa)
B 브라보(bravo)
C 찰리(charlie)
D 델타(delta)
E 에코(echo)
F 폭스트롯(foxtrot)
G 골프(golf)
H 호텔(hotel)
I 인디아(india)
J 줄리엣(juliett)
K 킬로(kilo)
L 리마(lima)
M 마이크(mike)
N 노벰버(november)
O 오스카(oscar)
P 파파(papa)
Q 퀘백(quebec)
R 로미오(romeo)
S 세라또는 시에라(sierra)
T 탱고(tango)
U 유니폼(uniform)
V 빅터(victor)
W 위스키(whiskey)
X 엑스레이(x-ray)
Y 양키(yangkee)
Z 줄루(zulu)
Posted by freezn