내가 GM3188 메뉴얼을 찾아 30분동안 해맸다.
모토로라사이트는 그저 카타로그에 불가.
문서보기(View document)
어쨋든 올린다.
Tuesday, December 17, 2013
Monday, December 16, 2013
24비트 비트맵을 디더링된 16비트 비트맵으로 변환 (Convert 24bit bitmap to 16bit with dithering)
그래서 그라데이션 표현이 계단이된다.
디더링을 하면 해결되는데 문제는 디더링은 256 color 나 1bit 컬러로 Color space를 변환할때만 된다는것이고 16bit bmp 저장시에는 그런 옵션이 없다.
따라서 별도의 프로그램을 사용하면 되는데, 그것은 바로..
ReduceBitDepthCPP.exe(http://adtsai.blogspot.kr/2011/03/high-quality-dithering-for-windows.html) 이다.
Tuesday, November 26, 2013
STM32F103 내부 플래시 메모리 읽기 쓰기 ( Read, write internal flash memory )
// 헤더파일 추가
#include "stm32f10x_flash.h"
// 소스추가 stm32f10x_flash.c
// 마지막 블럭에 넣는것으로 가정
// low(LD),medium(MD) density는 블럭이 1KB, High(HD) density는 2KB 단위임.
//HD 이면서 메모리가 512KB 인경우 마지막 블럭은 255번임
// 어드레스는 0x08000000 + 255* 2048 => 0x0807F800
#define StartAddr ((u32)0x0807F800)
#define EndAddr ((u32)0x0807F8FF)
//HD 이면서 메모리가 64KB 인경우 마지막 블럭은 255번임
// 어드레스는 0x08000000 + 63* 2048 => 0x0801F800
#define StartAddr ((u32)0x0801F800)
#define EndAddr ((u32)0x0801F8FF)
// MD 이면서 메모리가 64KB 인경우 마지막 블럭은 63번임
// 어드레스는 0x08000000 + 63* 1024 => 0x0800FC00
#define StartAddr ((u32) 0x0800FC00)
#define EndAddr ((u32) 0x0800FCFF)
//구조체 읽기 쓰기:
typedef struct
{
unsigned char a;
unsigned char b;
unsigned char c;
} TEST_STRUCT;
void test_read()
{
// 구조체 읽기:
TEST_STRUCT t;
memcpy( &t, (TEST_STRUCT* ) StartAddr, sizeof( t ));
TEST_STRUCT x;
memcpy( &x, &t, sizeof(t));
// 이제 t.a, t.b, t.c 에 값이 들어있음.
}
void test_write()
{
// 구조체 쓰기
TEST_STRUCT w;
w.a = 1;
w.b = 2;
w.c = 3;
unsigned int * p_w = (unsigned int *)&w;
int byte_align = 0;
if( (sizeof(w) % 4) > 0)
byte_align = 1; // 구조체가 32비트단위가 아닌경우 마지막 떨거지들에 대한처리.
FLASH_Unlock();
FLASH_ErasePage(StartAddr);
for( int i=0; i< sizeof( w ) / 4 + byte_align ; i++)
{
FLASH_ProgramWord(StartAddr + (i*4) , p_w[i] );
}
FLASH_Lock();
}
HAL 버전에서는
#include "stm32f1xx_hal_flash.h"
#define StartAddr ((unsigned int)0x0807F800)
#define EndAddr ((unsigned int)0x0807F8FF)
HAL_FLASH_Unlock();
FLASH_PageErase( StartAddr );
HAL_FLASH_Program( FLASH_TYPEPROGRAM_WORD, StartAddr, 1234);
HAL_FLASH_Lock();
Sunday, June 2, 2013
XLSX 파일 읽기
ADO로 xls 파일은 쉽게 열어서 읽을 수 있지만 xlsx 파일을 ADO로 여는것은 사실상 불가능하다.
특히 배포용 프로그램을 만든다면 이건 방법이 없다.
따라서 다른 방법을 찾아야 하는데 다음과 같은 이유로 해결이 가능하다.
1. xlsx 파일은 zip 압축 파일이고 풀면 xml 들이 나온다.
2. 각 xml 들 중에서 내용만 추출한다면 SharedString xml 과 worksheet xml 만 분석하면된다.
이 방법으로 codeproject.com 에서 xlsx 로 검색하면 소스들이 나온다.
나는 일반적인 xml parser를 이용하여 이를 대신하여 프로그램을 작성하려 하고 있고
곧 소스를 올릴 예정이다.
특히 배포용 프로그램을 만든다면 이건 방법이 없다.
따라서 다른 방법을 찾아야 하는데 다음과 같은 이유로 해결이 가능하다.
1. xlsx 파일은 zip 압축 파일이고 풀면 xml 들이 나온다.
2. 각 xml 들 중에서 내용만 추출한다면 SharedString xml 과 worksheet xml 만 분석하면된다.
이 방법으로 codeproject.com 에서 xlsx 로 검색하면 소스들이 나온다.
나는 일반적인 xml parser를 이용하여 이를 대신하여 프로그램을 작성하려 하고 있고
곧 소스를 올릴 예정이다.
Wednesday, May 15, 2013
ASUS N56V 노트북에 SSD 장착, Windows 7 설치
기본적으로 N56V 에는 등신같은 Windows 8 이 설치되어있다.
물건을 사자마자 SSD 도 장착했고 Windows 7 을 설치하려 했더니 Starting Windows 라고 나오더니 뻣어버린다.
Bios setup에서 CSM 을 Enable 시키고 pxe 뭐시기도 Enable 시키고 설치하면 설치가 된다.
끝~
물건을 사자마자 SSD 도 장착했고 Windows 7 을 설치하려 했더니 Starting Windows 라고 나오더니 뻣어버린다.
Bios setup에서 CSM 을 Enable 시키고 pxe 뭐시기도 Enable 시키고 설치하면 설치가 된다.
끝~
Tuesday, May 7, 2013
dialogic api 로 녹음중 통화 끊김 감지. dialogic api detect disconnected using dual tone
dialogic global call api를 이용한 녹음.
녹음 중 전화를 끊어버린 상황을 감지하는 소스플그램임.
This source program presents how to detect disonnected while recording.
dual tone (480, 30, 620, 40) is korean standard. find your self what tone using in your country.
//CH_DEV는 LINE 번호임. 1채널인경우 1임.
#define CH_DEV 1
CString CDialogicLib::Record(CString savefilename, int timeout_sec )
{
CString result="";
DV_TPT tpt[10]; /* termination parameter table */
DX_XPB xpb;
xpb.nSamplesPerSec = DRT_11KHZ;
xpb.wFileFormat = FILE_FORMAT_WAVE;
xpb.wDataFormat = DATA_FORMAT_ALAW;
xpb.wBitsPerSample = 8;
#define TID_1 101
dx_clrtpt(tpt,4);
tpt[0].tp_type = IO_CONT;
tpt[0].tp_termno = DX_MAXDTMF;
tpt[0].tp_length = 1;
tpt[0].tp_flags = TF_MAXDTMF;
// Terminate on Loop Current Drop (call disconnect)
tpt[1].tp_type = IO_CONT;
tpt[1].tp_termno = DX_LCOFF;
tpt[1].tp_length = 1; // I have also tried 3
tpt[1].tp_flags = TF_LCOFF;
tpt[2].tp_type = IO_CONT;
tpt[2].tp_termno = DX_MAXTIME; /* Function Time */
tpt[2].tp_length = (timeout_sec * 10); /* 10 seconds (100 msec resolution timer) */
tpt[2].tp_flags = TF_MAXTIME; /* Edge-triggered */
tpt[3].tp_type = IO_EOT;
tpt[3].tp_termno = DX_TONE;
tpt[3].tp_length = TID_1;
tpt[3].tp_flags = TF_TONE;
tpt[3].tp_data = DX_TONEON;
dx_deltones(CH_DEV);
dx_blddt(TID_1, 480, 30, 620, 40,TN_LEADING );
dx_addtone(CH_DEV,NULL,0);
dx_enbtone( CH_DEV, TID_1, DM_TONEON | DM_TONEOFF );
dx_clrdigbuf(CH_DEV);
dx_setevtmsk(CH_DEV, GCEV_DISCONNECTED);
/* Start 11KHz A-law recording */
if (dx_recwav(CH_DEV, savefilename, tpt, &xpb,PM_TONE|EV_SYNC) == -1)
{
return "ERROR";
}
else
{
dx_clrdigbuf(CH_DEV);
switch(ATDX_TERMMSK(CH_DEV))
{
case TM_MAXDTMF:
return "SUCCESS";
case TM_LCOFF :
result = "LCOFF";
break;
case TM_TONE:
result ="TONE";
break;
case TM_MAXTIME:
result = "MAXTIME";
break;
}
return "UNKNOWN";
}
}
Thursday, May 2, 2013
dx_gtcallid 가 전화번호를 못알아내는 경우. (dx_gtcallid not working)
Ring 이 3번 정도 울린 후에 dx_gtcallid 를 호출하면 상대방의 전화번호를 알 수 있다.
Call dx_gtcallid after ring more then 3 times.
example)
if (dx_wtring(CH_DEV, 3, DX_OFFHOOK, 10000) != -1)
{
dx_gtcallid( ..... );
return true;
}
else
return false; //timeout
Tuesday, April 23, 2013
V-Ray for Sketchup 에서 displacement 가 안될때 ( v-ray for sketchup displacement not working )
해결1. Displacement 는 물체가 Group이 되어있어야 된다.
solution 1. convert to group for object, try render.
해결1. 1번 후에도 마찬가지라면 Surface 를 Reverse 시켜보자.
solution 2. after solution 1, In sketchup. Reverse surface and try again.
그래도 안된다면 Sketchup 의 번전을 살펴보자. 8.0.3117 버전에는 displacement mapping 이 안되는 버그가 있는듯하다.
Check your sketchup version. If you have 8.0.3117 then uninstall fucking that version. and install 8.0.4811 version or higher.
Monday, March 18, 2013
Friday, March 15, 2013
COG-C144MVGI-08's LCD Controller S6B3306 datasheet
COG-C144MVGI-08's LCD Controller S6B3306 datasheet
click bellow link for download.
Good luck electronic guys!.
https://drive.google.com/file/d/1AClOnNoDKKZzJaRbcxFQfkYtMWj--m-6/view?ths=true
click bellow link for download.
Good luck electronic guys!.
https://drive.google.com/file/d/1AClOnNoDKKZzJaRbcxFQfkYtMWj--m-6/view?ths=true
Monday, February 25, 2013
STM32F103에서 PB3를 GPIO로 사용
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd (RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE);
// Remap 기능을 사용하기 위해서는 RCC_APB3Periph_AFIO를 Enable시켜야 한다.
GPIO_PinRemapConfig (GPIO_Remap_SWJ_JTAGDisable, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3
GPIO_InitStructure.GPIO_Speed = 알아서;
GPIO_InitStructure.GPIO_Mode = 알아서;
GPIO_Init (GPIOB, & GPIO_InitStructure);
만약 Jtag 관련 GPIO를 설정 한 후 JTAG 이나 SWD 기능이 동작하지 않게 되어 프로그램을 주입할 수가 없게되면
CPU의 리셋 스위치를 연타해가며 주입해보면 들어가짐.
If you cannot download a program to STM32F103 CPU cause wrong Port B setting (all jtag disabled ), try press reset button of target board many times very fast while download.
RCC_APB2PeriphClockCmd (RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE);
// Remap 기능을 사용하기 위해서는 RCC_APB3Periph_AFIO를 Enable시켜야 한다.
GPIO_PinRemapConfig (GPIO_Remap_SWJ_JTAGDisable, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3
GPIO_InitStructure.GPIO_Speed = 알아서;
GPIO_InitStructure.GPIO_Mode = 알아서;
GPIO_Init (GPIOB, & GPIO_InitStructure);
만약 Jtag 관련 GPIO를 설정 한 후 JTAG 이나 SWD 기능이 동작하지 않게 되어 프로그램을 주입할 수가 없게되면
CPU의 리셋 스위치를 연타해가며 주입해보면 들어가짐.
If you cannot download a program to STM32F103 CPU cause wrong Port B setting (all jtag disabled ), try press reset button of target board many times very fast while download.
Tuesday, January 29, 2013
TINA, TL072를 이용한 오디오 레벨검출회로
오디오 관련 회로에서 CPU의 ADC를 이용하여 오디오 신호의 레벨을 검출하기 위한 회로이다.
물론 간단한 RC회로를 만들어서 사용할 수도 있지만 미약한 신호에 대한 증폭을 필요로 하는 경우가 많기때문에 OP-AMP를 하나 넣고 다이오드,캐패시터,저항을 이용한 회로를 만들었다.
실제 음성 파일을 VG1의 소스로 지정하여 Transient Analysis를 돌렸다.
CPU에서는 VM1의 +핀 부분을 ADC의 입력으로 삼아 사용하면 쉽게 레벨을 검출할 수 있을것이다.
무료 SPICE 툴 TINA의 간단한 사용방법
TINA는 TI에서 제공하는 SPICE-Based Analog Simulation Program 이다.
TI사의 OP-AMP 들과 그 외 각종 아날로그 IC를 시뮬레이션 해볼 수 있으며,
제공되지 않는 OP-AMP는 특성을 입력하여 사용할 수 있다.
나는 실력이 없어서 그냥 TINA에서 제공하는 OP-AMP만 사용하고 주로 R-C-L 회로의
검증을 주로 하고 있다.
http://www.ti.com/tool/tina-ti 에서 TINA-TI 를 Download 해서 설치한다.
다운로드 용량은 약 86MB
설치는 모두 디폴트 옵션을 사용하여 설치하면 별 문제 없다.
Windows 7, Windows XP 모두 설치됨.
1. TINA를 실행한 후 아래처럼 OPAMP와 전원을 놓는다.
2. 아래와같이 나머지 회로도 다 그린다. VM1 은 Voltage meter(전압측정기)이다.
이 회로는 그냥 단순한 OP-AMP 증폭회이다.
3. 회로도의 OP-AMP를 더블클릭하면 아래처럼 OP-AMP 의 모델을 지정할 수 있다.
4. 전압 신호원 (VG1)의 특성은 아래처럼 싸인파로 Vp-p가 1V가 되도록 지정해본다.
아래처럼 결과가 나왔다. 입력 Vp-p 가 1V 인것이 Vp-p가 2V로 증폭이 된 결과물이다.
5. 이번에는 주파수 특성을 알아본다.
AC Transfer Characteristic (AC 변환 특성)을 시험해볼때에는 필요한 주파수를 지정한다.
아래처럼 주파수별 Gain 특성과 위상 특성이 표시된다.
이번 회로는 보통 품질의 음성(오디오)를 위한 증폭회로이므로 100hz ~ 20khz 사이에서 평탄한 위상과 게인 특성을 보이면 되므로 이정도면 필요한 결과를 얻었다.
6. 완성된 회로도를 저장하고, 별도의 디자인 툴을 이용해서 PCB를 만들어 사용한다.
TI사의 OP-AMP 들과 그 외 각종 아날로그 IC를 시뮬레이션 해볼 수 있으며,
제공되지 않는 OP-AMP는 특성을 입력하여 사용할 수 있다.
나는 실력이 없어서 그냥 TINA에서 제공하는 OP-AMP만 사용하고 주로 R-C-L 회로의
검증을 주로 하고 있다.
http://www.ti.com/tool/tina-ti 에서 TINA-TI 를 Download 해서 설치한다.
다운로드 용량은 약 86MB
설치는 모두 디폴트 옵션을 사용하여 설치하면 별 문제 없다.
Windows 7, Windows XP 모두 설치됨.
1. TINA를 실행한 후 아래처럼 OPAMP와 전원을 놓는다.
2. 아래와같이 나머지 회로도 다 그린다. VM1 은 Voltage meter(전압측정기)이다.
이 회로는 그냥 단순한 OP-AMP 증폭회이다.
3. 회로도의 OP-AMP를 더블클릭하면 아래처럼 OP-AMP 의 모델을 지정할 수 있다.
4. 전압 신호원 (VG1)의 특성은 아래처럼 싸인파로 Vp-p가 1V가 되도록 지정해본다.
주파수는 500hz로 정했다.
5. 이제 시뮬레이션을 해볼 시간. 먼저 Transient Analysis를 해본다. 시간에 따른 VG1과 VM1의 전압을 표시해줄것이다.
아래처럼 결과가 나왔다. 입력 Vp-p 가 1V 인것이 Vp-p가 2V로 증폭이 된 결과물이다.
5. 이번에는 주파수 특성을 알아본다.
AC Transfer Characteristic (AC 변환 특성)을 시험해볼때에는 필요한 주파수를 지정한다.
아래처럼 주파수별 Gain 특성과 위상 특성이 표시된다.
이번 회로는 보통 품질의 음성(오디오)를 위한 증폭회로이므로 100hz ~ 20khz 사이에서 평탄한 위상과 게인 특성을 보이면 되므로 이정도면 필요한 결과를 얻었다.
6. 완성된 회로도를 저장하고, 별도의 디자인 툴을 이용해서 PCB를 만들어 사용한다.
Monday, January 28, 2013
정신이 없을때 하기 쉬운 실수
int D = 1234;
void function_xxx()
{
char D;
printf( "%d", D );
}
이렇게 해놓고.. 아놔.. 왜 D가 이상한 숫자가 나오지? 1234가 나와야 하는데..라고 생각하며 삽질을 할 수 있다.
C언어에서 변수의 사용은 가까운놈이 우선이므로 전역변수 D보다 로컬변수 D가 우선이므로 1234가 나올리가 없다.
전역변수 사용시 극히 주의하고 전역변수는 이름을 특별히 지어서 해깔리지 않도록 한다.
각자 개인차가 있겟지만 예를 들어 전역은 G_xxx 식으로 변수 이름을 지어주자. 아니면
별도의 구조체나 클래스의 맴버로 만든 후 static 변수로 만들어놓고 쓰던가.
Sunday, January 20, 2013
CPort 사용중 링크에러 SetPortW 가 없다고 나온다면?
#ifdef UNICODE
#define SetPortW SetPort
#else
#define SetPortA SetPort
#endif
내용을 CPort.hpp 의 에 추가해준다.
아래내용처럼.
// CodeGear C++Builder
// Copyright (c) 1995, 2009 by Embarcadero Technologies, Inc.
// All rights reserved
// (DO NOT EDIT: machine generated header) 'Cport.pas' rev: 21.00
#ifndef CportHPP
#define CportHPP
#pragma delphiheader begin
#pragma option push
#pragma option -w- // All warnings off
#pragma option -Vx // Zero-length empty class member functions
#pragma pack(push,8)
#include <System.hpp> // Pascal unit
#include <Sysinit.hpp> // Pascal unit
#include <Windows.hpp> // Pascal unit
#include <Messages.hpp> // Pascal unit
#include <Classes.hpp> // Pascal unit
#include <Sysutils.hpp> // Pascal unit
#include <Inifiles.hpp> // Pascal unit
#include <Registry.hpp> // Pascal unit
//-- user supplied -------------------------------
#ifdef UNICODE
#define SetPortW SetPort
#else
#define SetPortA SetPort
#endif
namespace Cport
{
Subscribe to:
Posts (Atom)