Tuesday, December 17, 2013

GM3188 User Guide PDF

내가 GM3188 메뉴얼을 찾아 30분동안 해맸다.

모토로라사이트는 그저 카타로그에 불가.


문서보기(View document)

어쨋든 올린다.

Monday, December 16, 2013

24비트 비트맵을 디더링된 16비트 비트맵으로 변환 (Convert 24bit bitmap to 16bit with dithering)

아래 그림은 원본임 (Original 25bit bmp)



24비트 이미지를 포토샵에서 16bit bmp 파이롤 저장하면 병신같은 결과가 나타난다.


아래그림은 포토샵에서 저장한것. (16bit bmp from photoshop)



포토샵은 16비트 이미지 저장을 시키면 그냥 모자란 컬러들을 버린다.

그래서 그라데이션 표현이 계단이된다.

디더링을 하면 해결되는데 문제는 디더링은 256 color 나 1bit 컬러로 Color space를 변환할때만 된다는것이고 16bit bmp  저장시에는 그런 옵션이 없다.

따라서 별도의 프로그램을 사용하면 되는데, 그것은 바로..



16bit bmp converted by "ReduceBitDepthCpp.exe"


사용 방법은 매우 간다.

명령창에서 ReduceBitDepthCPP -f bmp  source.bmp out.bmp  식으로 실행하면 된다.



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를 이용하여 이를 대신하여 프로그램을 작성하려 하고 있고

곧 소스를 올릴 예정이다.


Wednesday, May 15, 2013

ASUS N56V 노트북에 SSD 장착, Windows 7 설치

기본적으로 N56V 에는 등신같은 Windows 8 이 설치되어있다.

물건을 사자마자 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, 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.

    

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가 되도록 지정해본다.



주파수는 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 {