블로그 이미지
안녕1999

카테고리

전체 (3067)
자바스크립트 (20)
안드로이드 (14)
WebGL (4)
변비 (17)
정치,경제 (35)
C언어,ARM (162)
컴퓨터(PC, Note Book, 윈.. (41)
전자회로, PCB (27)
유머,안웃긴,GIF,동영상 (118)
국부론60 (71)
모듈(PCB) (3)
건강 (2)
FreeCAD (25)
PADS (43)
퇴직,퇴사,구직,취업 활동 (3)
C# (86)
엑셀 (8)
워드 (0)
LabView (6)
레고 (30)
FPGA (0)
Total
Today
Yesterday

달력

« » 2025.1
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31

공지사항

최근에 올라온 글

Build -> Configurations -> Add ...


Project Setting -> C/C++ -> General -> Prrprocessor definitions : 

_MBCS  대신, _UNICODE,UNICODE  추가


Project Setting -> Link-> Category -> Output -> Entry-point symbol : wWinMainCRTStartup

Posted by 안녕1999
, |
ARM Cortex M0 - W7500 인터럽트

- 26개의 인터럽트.
- 장치별로 1개의 통합 인터럽트 제공.
  예) UART0 rx, tx는  1개의 인터럽트에서 구분하여 처리해야함.
- 인터럽트 클리어 시켜주어야 함.

샘플코드(W7500x_it.c)
void UART0_Handler(void)
{    
    if(UART_GetITStatus(UART0,UART_IT_FLAG_RXI))
    {
        UART_ClearITPendingBit(UART0,UART_IT_FLAG_RXI);
        uart0_rx_cnt++;
    }
    else if(UART_GetITStatus(UART0,UART_IT_FLAG_TXI))
    {
        UART_ClearITPendingBit(UART0,UART_IT_FLAG_TXI);
        uart0_tx_cnt++;
    }
}
Table1 W7500P interrupt assignments
IRQ/NMI Device Description Address
NMI Watchdog Watchdog interrupt 0x0000_0008
IRQ[0] SSP0 SSP0 global interrupt 0x0000_0040
IRQ[1] SSP1 SSP1 global interrupt 0x0000_0044
IRQ[2] UART0 UART0 global interrupt 0x0000_0048
IRQ[3] UART1 UART1 global interrupt 0x0000_004C
IRQ[4] UART2 UART2 global interrupt 0x0000_0050
IRQ[5] I2C0 I2C0 global interrupt 0x0000_0054
IRQ[6] I2C1 I2C1 global interrupt 0x0000_0058
IRQ[7] GPIO0 GPIOA global interrupt 0x0000_005C
IRQ[8] GPIO1 GPIOB global interrupt 0x0000_0060
IRQ[9] GPIO2 GPIOC global interrupt 0x0000_0064
IRQ[10] GPIO3 GPIOD global interrupt 0x0000_0068
IRQ[11] DMA DMA channel 1 ~ channel 5 interrupt 0x0000_006C
IRQ[12] Dualtimer0 Dualtimer0 global interrupt 0x0000_0070
IRQ[13] Dualtimer1 Dualtimer1 global interrupt 0x0000_0074
IRQ[14] PWM0 PWM0 global interrupt 0x0000_0078
IRQ[15] PWM1 PWM1 global interrupt 0x0000_007C
IRQ[16] PWM2 PWM2 global interrupt 0x0000_0080
IRQ[17] PWM3 PWM3 global interrupt 0x0000_0084
IRQ[18] PWM4 PWM4 global interrupt 0x0000_0088
IRQ[19] PWM5 PWM5 global interrupt 0x0000_008C
IRQ[20] PWM6 PWM6 global interrupt 0x0000_0090
IRQ[21] PWM7 PWM7 global interrupt 0x0000_0094
IRQ[22] reserved   0x0000_0098
IRQ[23] ADC ADC acquisition end interrupt 0x0000_009C
IRQ[24] TCPIP TCPIP global interrupt 0x0000_00A0
IRQ[25] EXT_INT External pin interrupt 0x0000_00A4
IRQ[26] reserved   0x0000_00A8
IRQ[27] reserved   0x0000_00AC
IRQ[28] reserved   0x0000_00B0
IRQ[29] reserved   0x0000_00B4
IRQ[30] reserved   0x0000_00B8
IRQ[31] reserved   0x0000_00BC


w7500_isp_20150820_.zip

w7500_isp_20150401_.zip


'C언어,ARM' 카테고리의 다른 글

VC++ 6.0을 쓰지 말아야하는 이유  (4) 2016.05.03
한국형 CPU 코어 사업 첫 성과물 나온다  (0) 2016.04.05
CMSIS-DAP  (0) 2016.03.07
ARM Cortex M0 - GPIO  (0) 2016.03.07
Tightly Coupled Memory  (0) 2016.02.29
Posted by 안녕1999
, |

CMSIS-DAP

C언어,ARM / 2016. 3. 7. 17:03

DAP : Core-sight Debug Access Port

ARM사의 Cortex시리즈의 CPU는 제조사별로, 다양하게 존재하는데

제조사와 상관없이, 공용 다운로딩이 가능하도록 구현한것이다.


USB-다운로드보드+ARM CPU


"다운로드 보드"는 ARM CPU제조사별로 달라진다.

PC에서는 USB 외장메모리처럼 인식되고, 컴파일된 실행코드파일을

USB를 통해 파일 복사함으로써 다운로딩이 가능하다.

'C언어,ARM' 카테고리의 다른 글

한국형 CPU 코어 사업 첫 성과물 나온다  (0) 2016.04.05
ARM Cortex M0 - W7500 인터럽트  (0) 2016.03.07
ARM Cortex M0 - GPIO  (0) 2016.03.07
Tightly Coupled Memory  (0) 2016.02.29
mini_file_system  (0) 2016.02.01
Posted by 안녕1999
, |

ARM Cortex M0 - GPIO

C언어,ARM / 2016. 3. 7. 16:10

W7500x.h



CS – CMOS/Schmitt trigger input buffer select

P - PAD

YA – Analog Input (connect to ADC input)

Y – Digital Input 

IE – Input buffer enable 

     인터럽트가 아니고, 입력버퍼.

     1일때,  루프백신호 Y가 활성화 된다.(출력신호가 다시 들어옴. 어디다 쓰지?)

CS – CMOS/Schmitt trigger input buffer select 

PU – Pull-up enable 

A – Digital Output 

DS – Driving strength select

      L일때, 속도가 더 빠르다.




GPIO관련 레지스터는 3가지.


#define GPIOA   ((GPIO_TypeDef *) (GPIOA_BASE) )

#define GPIOB   ((GPIO_TypeDef *) (GPIOB_BASE) )

#define GPIOC   ((GPIO_TypeDef *) (GPIOC_BASE) )


#define PA_AFSR ((P_Port_Def *)   (P_AFSR_BASE + 0x00000000UL))  /* PA_XX Pad Alternate Function Select Register */

#define PB_AFSR ((P_Port_Def *)   (P_AFSR_BASE + 0x00000040UL))  /* PB_XX Pad Alternate Function Select Register */

#define PC_AFSR ((P_Port_Def *)   (P_AFSR_BASE + 0x00000080UL))  /* PC_XX Pad Alternate Function Select Register */


#define PA_PCR  ((P_Port_Def *)   (P_PCR_BASE + 0x00000000UL))   /* PA_XX Pad Control Register */

#define PB_PCR  ((P_Port_Def *)   (P_PCR_BASE + 0x00000040UL))   /* PB_XX Pad Control Register */

#define PC_PCR  ((P_Port_Def *)   (P_PCR_BASE + 0x00000080UL))   /* PC_XX Pad Control Register */



typedef struct
{
  __IO   uint32_t  DATA;            /* DATA Register (R/W),                        offset : 0x000 */ 
  __IO   uint32_t  DATAOUT;         /* Data Output Latch Register (R/W),           offset : 0x004 */
         uint32_t  RESERVED0[2];    
  __IO   uint32_t  OUTENSET;        /* Output Enable Set Register  (R/W)           offset : 0x010 */ 
  __IO   uint32_t  OUTENCLR;        /* Output Enable Clear Register  (R/W)         offset : 0x014 */ 
  __IO   uint32_t  RESERVED1;       /* Alternate Function Set Register  (R/W)      offset : 0x018 */ 
  __IO   uint32_t  RESERVED2;       /* Alternate Function Clear Register  (R/W)    offset : 0x01C */ 
  __IO   uint32_t  INTENSET;        /* Interrupt Enable Set Register  (R/W)        offset : 0x020 */ 
  __IO   uint32_t  INTENCLR;        /* Interrupt Enable Clear Register  (R/W)      offset : 0x024 */ 
  __IO   uint32_t  INTTYPESET;      /* Interrupt Type Set Register  (R/W)          offset : 0x028 */ 
  __IO   uint32_t  INTTYPECLR;      /* Interrupt Type Clear Register  (R/W)        offset : 0x02C */ 
  __IO   uint32_t  INTPOLSET;       /* Interrupt Polarity Set Register  (R/W)      offset : 0x030 */ 
  __IO   uint32_t  INTPOLCLR;       /* Interrupt Polarity Clear Register  (R/W)    offset : 0x034 */ 
  union {                       
    __I    uint32_t  INTSTATUS;     /* Interrupt Status Register (R/ )             offset : 0x038 */ 
    __O    uint32_t  INTCLEAR;      /* Interrupt Clear Register ( /W)              offset : 0x038 */
    }Interrupt;
         uint32_t RESERVED3[241];
  __IO   uint32_t LB_MASKED[256];   /* Lower byte Masked Access Register (R/W)     offset : 0x400 - 0x7FC  */
  __IO   uint32_t UB_MASKED[256];   /* Upper byte Masked Access Register (R/W)     offset : 0x800 - 0xBFC  */
} GPIO_TypeDef;



8비트 CPU보다 훨씬 복잡해보인다..

'C언어,ARM' 카테고리의 다른 글

ARM Cortex M0 - W7500 인터럽트  (0) 2016.03.07
CMSIS-DAP  (0) 2016.03.07
Tightly Coupled Memory  (0) 2016.02.29
mini_file_system  (0) 2016.02.01
C언어 함수  (1) 2016.01.31
Posted by 안녕1999
, |
※이 내용은 금융전문가의 의견이 아닙을 알려드립니다.
이 내용은 틀린 부분이 있을 수 도 있습니다.

1년 2000만원한도, 5년, 200-250만원까지 세금없음.

1년에 2000만원씩 5년을 부으면, 1억원이다.
1억원의 1%는 100만원.
5년후에 2-2.5%까지 세금이 없다는 것이다.
사실상, 얼마 안되는 이자 받아도, 세금을 안물리겠다는 말.
만약에 5년간 평균 5%수익이 난다면, 2.5%는 세금없고, 
나머지 2.5%는 15%가 아닌 약 10% 세금을 물려서, 
세금에서 약 5%정도의 추가 수익이 가능하다는 말.
5년후에 총 350만원의 수익이 발생했을때, 100만원은 15%가 아닌 10%세율적용으로
약 5만원이 이익.
만약 엄청난 수익을 거두어, 5년 후 총 수익이 1억원, 원금이 1억원 이라면.
9800만원에 대해 15%가 아닌 10%세율적용하여,
490만원정도 세금을 덜 낼 수 있다는 말이다.
그러나 현실에서는 10%수익도 어려운 상황임을 감안하면, 
(1000만원-250만원)*5%=37.5만원
1억원을 넣고, 5년후에 10%수익을 달성한다면, 약 37만원의 세금을 덜 내도 된다.
단, 펀드계좌의 성격이므로, 유지수수료 약 1%를 감안한다면,
사실상 평균적으로 이득이 거의 없을 수 도 있고,
-4-5%도 될 수 있다.

최대 1억까지 5년 보유하고, 수익이 엄청날 수록 이득인 계좌이나,
1억원을 5년간 묶고, 37만원 혜택을 본다는건 좀 이해하기 어렵다.
차라리, 부동산에 투자하면, 1년이면 35만원 건지고도 남겠다.

그러면 왜 금융권, 투신들은 고객유치에 광분하는가?
5년 고정이라는 점이 매력일것으로 추정된다.
5년이라면, 고객유치자금=자본금증가 를 의미할것이다.

재주는 정부가 부리고, 이득은 금융,투신이 가져가는 형태로 보여진다.
국민은 쥐꼬리 이자 받고...

※위 내용은 금융전문가의 의견이 아닙을 알려드립니다.
위 내용은 틀린 부분이 있을 수 도 있습니다.


Posted by 안녕1999
, |

Thumb : 스크롤바의 중간에 있으며, 마우스로 클릭하여, 스크롤이 가능한 버튼.

         스크롤 되는 페이지의 크기에 따라, 크기가 변한다.


typedef struct tagSCROLLINFO {

  UINT cbSize;

  UINT fMask;

  int  nMin;//스크롤되는 최소값

  int  nMax;//스크롤되는 최대값

  UINT nPage;//1페이지의 크기

  int  nPos;//현재위치

  int  nTrackPos;//마으스클릭한 상태로 이동중일때, 현재 위치. 읽기만 가능.

} SCROLLINFO, *LPCSCROLLINFO;


윈도우 좌표계는 논리좌표와 디바이스 좌표 2가지가 있고,

논리좌표는 스크롤 개념을 포함한 상대좌표를 말한다.

디바이스 좌표는 모니터나 윈도우의 좌측상단이 (0,0)이고 우측하단이 (right,bottom)인 절대 좌표이다.


화면은 픽셀단위좌표계를 사용할 수도 있고, cm, mm 같은 실세계좌표계를 사용할 수 도 있다.

cm,mm 좌표계는 모니터의 종류, 해상도, 크기 정보로, 실제 모니터에 표시되는 크기를 계산해주는것이다.

(가로/세로 비율만 곱해주면 된다.)

(따라서, 모니터의 종류나 해상도 등의 정보가 없을때는 안맞을것이다.)



스크롤바 정보를 설정하는 함수

int SetScrollInfo(

  _In_ HWND          hwnd,

  _In_ int           fnBar,//SB_CTL, SB_HORZ, SB_VERT

  _In_ LPCSCROLLINFO lpsi,

  _In_ BOOL          fRedraw

);

BOOL SetScrollRange( HWND hWnd, int nBar, int nMinPos, int nMaxPos, BOOL bRedraw );

int SetScrollPos( HWND hWnd, int nBar, int nPos, BOOL bRedraw ); 



윈도우 메세지

WM_HSCROLL, WM_VSCROLL

lParam=스크롤바 윈도우 핸들 HWND

HIWORD(wParam) : 현재위치(16비트 값이므로, 32비트 범위는 사용 불가.)

LOWORD(wParam) : SB_LINExxxx, SB_PAGExxxx

수평일때, SB_LINELEFT(왼쪽 화살표), SB_LINERIGHT(오른쪽 화살표), SB_PAGELEFT, SB_PAGERIGHT,

          SB_THUMBPOSITION(마우스 드래그 완료), SB_THUMBTRACK(마우스 드래그 중)

수직일때, SB_LINEUP(윗쪽 화살표), SB_LINEDOWN(아랫쪽 화살표), SB_PAGEUP, SB_PAGEDOWN



예제] 참고용으로만 사용.

HWND hscroll_H;
LRESULT CALLBACK WndProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam)
{
HWND hscroll;
switch(msg)
{
case WM_CREATE:
hscroll_H=CreateWindow("scrollbar",0,WS_CHILD | WS_VISIBLE | SBS_HORZ,
10,10,200,20,
hWnd,(HMENU)ID_SCRRED,g_hInst,0);
SetScrollRange(hscroll_H,SB_CTL,0,255,TRUE);
SetScrollPos(hscroll_H,SB_CTL,0,TRUE);
return 0;
case WM_HSCROLL:
hscroll=(HWND)lParam;
switch(hscroll)
{
case SB_LINELEFT:
TempPos=max(0,TempPos-1);
break;
case SB_LINERIGHT:
TempPos=min(255,TempPos+1);
break;
case SB_PAGELEFT:
TempPos=max(0,TempPos-10);
break;
case SB_PAGERIGHT:
TempPos=min(255,TempPos+10);
break;
case SB_THUMBTRACK:
TempPos=HIWORD(wParam);
break;
}
SetScrollPos((HWND)lParam,SB_CTL,TempPos,TRUE);
InvalidateRect(hWnd,0,FALSE);
return 0;
}
return(DefWindowProc(hWnd,msg,wParam,lParam));
}



MFC 코드

CScrollView는 사용하기는 편하지만, Win32로 작성할때는 골칫거리다.

void CScrollView::SetScrollSizes(int nMapMode, SIZE sizeTotal,

const SIZE& sizePage, const SIZE& sizeLine)

{

ASSERT(sizeTotal.cx >= 0 && sizeTotal.cy >= 0);

ASSERT(nMapMode > 0);

ASSERT(nMapMode != MM_ISOTROPIC && nMapMode != MM_ANISOTROPIC);


int nOldMapMode = m_nMapMode;

m_nMapMode = nMapMode;

m_totalLog = sizeTotal;


//BLOCK: convert logical coordinate space to device coordinates

{

CWindowDC dc(NULL);

ASSERT(m_nMapMode > 0);

dc.SetMapMode(m_nMapMode);


// total size

m_totalDev = m_totalLog;

dc.LPtoDP((LPPOINT)&m_totalDev);

m_pageDev = sizePage;

dc.LPtoDP((LPPOINT)&m_pageDev);

m_lineDev = sizeLine;

dc.LPtoDP((LPPOINT)&m_lineDev);

if (m_totalDev.cy < 0)

m_totalDev.cy = -m_totalDev.cy;

if (m_pageDev.cy < 0)

m_pageDev.cy = -m_pageDev.cy;

if (m_lineDev.cy < 0)

m_lineDev.cy = -m_lineDev.cy;

} // release DC here


// now adjust device specific sizes

ASSERT(m_totalDev.cx >= 0 && m_totalDev.cy >= 0);

if (m_pageDev.cx == 0)

m_pageDev.cx = m_totalDev.cx / 10;

if (m_pageDev.cy == 0)

m_pageDev.cy = m_totalDev.cy / 10;

if (m_lineDev.cx == 0)

m_lineDev.cx = m_pageDev.cx / 10;

if (m_lineDev.cy == 0)

m_lineDev.cy = m_pageDev.cy / 10;


if (m_hWnd != NULL)

{

// window has been created, invalidate now

UpdateBars();

if (nOldMapMode != m_nMapMode)

Invalidate(TRUE);

}

}


void CScrollView::UpdateBars()

{
// UpdateBars may cause window to be resized - ignore those resizings
if (m_bInsideUpdate)
return;         // Do not allow recursive calls

// Lock out recursion
m_bInsideUpdate = TRUE;

// update the horizontal to reflect reality
// NOTE: turning on/off the scrollbars will cause 'OnSize' callbacks
ASSERT(m_totalDev.cx >= 0 && m_totalDev.cy >= 0);

CRect rectClient;
BOOL bCalcClient = TRUE;

// allow parent to do inside-out layout first
CWnd* pParentWnd = GetParent();
if (pParentWnd != NULL)
{
// if parent window responds to this message, use just
//  client area for scroll bar calc -- not "true" client area
if ((BOOL)pParentWnd->SendMessage(WM_RECALCPARENT, 0,
(LPARAM)(LPCRECT)&rectClient) != 0)
{
// use rectClient instead of GetTrueClientSize for
//  client size calculation.
bCalcClient = FALSE;
}
}

CSize sizeClient;
CSize sizeSb;

if (bCalcClient)
{
// get client rect
if (!GetTrueClientSize(sizeClient, sizeSb))
{
// no room for scroll bars (common for zero sized elements)
CRect rect;
GetClientRect(&rect);
if (rect.right > 0 && rect.bottom > 0)
{
// if entire client area is not invisible, assume we have
//  control over our scrollbars
EnableScrollBarCtrl(SB_BOTH, FALSE);
}
m_bInsideUpdate = FALSE;
return;
}
}
else
{
// let parent window determine the "client" rect
GetScrollBarSizes(sizeSb);
sizeClient.cx = rectClient.right - rectClient.left;
sizeClient.cy = rectClient.bottom - rectClient.top;
}

// enough room to add scrollbars
CSize sizeRange;
CPoint ptMove;
CSize needSb;

// get the current scroll bar state given the true client area
GetScrollBarState(sizeClient, needSb, sizeRange, ptMove, bCalcClient);
if (needSb.cx)
sizeClient.cy -= sizeSb.cy;
if (needSb.cy)
sizeClient.cx -= sizeSb.cx;

// first scroll the window as needed
ScrollToDevicePosition(ptMove); // will set the scroll bar positions too

// this structure needed to update the scrollbar page range
SCROLLINFO info;
info.fMask = SIF_PAGE|SIF_RANGE;
info.nMin = 0;

// now update the bars as appropriate
EnableScrollBarCtrl(SB_HORZ, needSb.cx);
if (needSb.cx)
{
info.nPage = sizeClient.cx;
info.nMax = m_totalDev.cx-1;
if (!SetScrollInfo(SB_HORZ, &info, TRUE))
SetScrollRange(SB_HORZ, 0, sizeRange.cx, TRUE);
}
EnableScrollBarCtrl(SB_VERT, needSb.cy);
if (needSb.cy)
{
info.nPage = sizeClient.cy;
info.nMax = m_totalDev.cy-1;
if (!SetScrollInfo(SB_VERT, &info, TRUE))
SetScrollRange(SB_VERT, 0, sizeRange.cy, TRUE);
}

// remove recursion lockout
m_bInsideUpdate = FALSE;
}


Posted by 안녕1999
, |

소설 쓰기

카테고리 없음 / 2016. 3. 3. 23:00

소설? 시나리오? 예언?


아뭏든, 나도 사람인지라, 공상을 많이 한다.

주로 미래에 발생가능한 주재로...

전부 몽상이라는게 문제...


아뭏튼, 소설좀 써보고 싶은데, 방법도 모르겠고, 난 이과를 졸업했다.


인터넷 검색해보니, 

다음과 같은 내용이 눈에 띈다.


6. 작가를 꿈꾸는 어린 친구들이 있다면 반드시 ‘영어 글쓰기의 기본’ 부터 읽게하라.
- 위트에 가득 찬 시와 소설로 이름을 떨친 미국의 단편소설가이자 시인 도로시 파커(Dorothy Parker)


아....OTL...영어책을 써야, 베스트 셀러가 되....아니...좀 팔리지...

시작부터 어렵네...

어쨌든, 소설은 언젠가는 하고싶은 일이다.


당장 시작하라.....당장... 

Posted by 안녕1999
, |

실제로 모니터를 꺼버리는것은 아니다.

즉시 화면보호 상태로 진입해서, 절전기능을 하는것이 목표이다.


윈도우의 기능중에 일정시간 후에 화면보호 모드가 작동해도 되나,

이건 시간이 걸린다.


그래서 만들었다.

실행하자 마자, 화면보호 모드로 진입한다.

바로가기 등록해놓고, 점심먹으로 가거나, 자리를 비울때, 한번씩 실행해준다.


화면상의 모든 프로그램을 최소화 하고, 화면을 꺼버린다.


소스는 어딘가에 쳐박혀있다....(나도 몰라...)


요약 : 실행하면 즉시 화면보호

MonitorOff2.zip


Posted by 안녕1999
, |

데이터 세이버라고, 인터넷 통신 데이터를 줄여주는 프로그램이다.

원리는 내가 요청한 웹사이트를 구글서버에서 받아서, 압축한다음, 압축된것을 내게 보내준다.

그러므로, 속도는 약간 느리다.

또한 보안설정 웹사이트는 안된다.

핸드폰으로 웹서핑할때는 데이터가 절약되니, 좋다.


크롬 웹브라우져에서 돌아간다.(PC 도 되고, 핸드폰에서도 된다.)

설치하면, 툴바 우측상단에 파란색 동그라미+산(?) 이미지가 나타난다.

오늘 설치했는데, 약 21% 데이터량이 줄었다고한다.(원래 100바이트 받을것을, 79바이트만 받았다.)


부가적인 기능으로, 웹데이터가 압축되어 전달되므로, 보안이 향상된다.


2016.03.04 티스토리 로그인이 안되네요. 끄고 로그인해야함.


2016.03.16 데이터 세이버 ON/OFF하기가 불편하네요. 잘안되요...옵션창이 잘 안뜸.

요약 : 느리지만, 써볼만 함.

Posted by 안녕1999
, |

HDMI 는 영상+오디오 콘넥터, 케이블 관련 기술(협약)입니다.

HDMI 협회에서 관리합니다.

과거에는 영상케이블과 오디오 케이블이 분리되어 있어, 케이블 배선이 많았습니다.

HDMI가 등장하면서 부터, 영상+오디오, 전원 2개의 케이블만 있으면, TV나 모니터를 사용할 수 가 있게 되었습니다.

배선이 많이 간소화 되었지요.


그러나, 단점도 있습니다.

HDMI는 1-3GHz클럭으로 데이터를 전송하기 때문에, 에너지 측면에서 전송효율이 매우 안좋습니다.

고주파를 전송하기 위해서는 많은 에너지가 소모됩니다.

화면 해상도가 높은것도 원인입니다만, HDMI케이블 자체를 위한 전력 사용량도 엄청납니다.

또한 10m이상 장거리 연결이 어렵습니다. 물론, 증폭기등을 사용하면 30m도 된다고 합니다.

문제는 케이블 가격이 너무 비싸다는겁니다.

짧은것도 최소 1.5만원 정도 하며, 좋다고 하는것들은 3만원 이상 하기도 합니다.


소비자 입장에서는 HDMI를 사용하기위해, 여러가지로 돈이 나갑니다.

HDMI로고를 달기 위해서는 HDMI협회에 가입해야하고, 가입비+판매되는 칩당 얼마씩 비용을 지불해야 합니다.

당연하긴는 하지만, HDMI를 사용하는 댓가 치고는 저렴하지는 않습니다.

HDMI제품을 제조하는 업체에서는 이 비용을 제품 원가에 반영하고, 결국에는

소비자가 그 비용을 지불합니다.


HDMI가 좋은 점도 있지만, 전기를 많이 소모하고, 가격이 비싼것은 소비자에게는 안좋습니다.


좀 웃기지 않은 이야기를 하자면,

우리집에는 인터넷TV가 있고, 셋탑박스는 HDMI를 지원합니다.

설치기사는 HDMI케이블이 비싸니깐, 컴포지트 케이블(빨강, 노랑, 흰색) 5개로 TV를 연결해주고 갔습니다.

(케이블 가격 약 1천원. HDMI케이블은 최소 1만원)

TV를 보는 대부분의 사람들은 "이건 디지털 TV야"라고 그냥...봅니다.

HDMI가 연결되어 있는지 물어보는 사람은 없습니다.

그러면, 왜 HDMI지원되는 셋탑박스를 설치했고, HDMI가 되는 최신 TV를 샀을까요?

알고나면 좀 웃긴 이야기입니다....(여기까지 읽어도 이해 못하는 분이 절반이상)


HDMI 케이블과, 일반 컴포지트, 컴포넌트 케이블의 성능차이는 어느정도일까?

HDMI는 디지털 전송이므로, 화질의 열화 없이 매우 깨끗합니다.

이에 반해, DVI를 제외한 다른 케이블들은 아날로그 방식이고, 케이블의 길이가 길 경우,

화질의 열화가 매우 심해집니다.

1-2m  정도로, 케이블 길이가 짧은 경우에는 큰 차이가 없습니다.

HDMI에 관심이 있는 분들은 화질차이를 쉽게 느끼지만,

인터넷TV업체에서 이미 (압축해서)열화된 영상을 보기때문에, 대부분의 사람들은 잘 모릅니다.

결론은 HDMI  안써도, TV잘만 보고 있습니다.(웃긴가요?)


물론 HDMI케이블이 좋기는 합니다만, 디지털 방식이다 보니,

화면에 사각형 픽셀(점)이 그대로 보이는 경우도 많습니다.

사용자들은 "화면이 날카롭다.", "부드럽지 못하다" 등으로 표현을 합니다.

이런 문제는 오랫동안 사용했던, 아날로그 케이블을 연결하면, 돈 안들이고도 해결됩니다.

아날로그는 화면에 표시될때까지 열화가 진행되어, 영상이 부드럽게 보입니다.

열화가 심하면, 너무 뭉게져서 선명함이 사라집니다.

적당한 열화는 사람의 눈이 보기에는 더 자연스럽습니다.(날카롭지 않아서. 너무 선명하지 않아서)


TV를 비롯한 많은 광고매체들은 HDMI가 "매우 좋은"것이라고 일관되게 광고합니다.

(나쁜거라고 광고하면 팔리겠습니까?)

어쨌든, 소비자들의 인식은 "HDMI는 좋은것"이 되어 버렸습니다.

소비자가 (쓰지도 않는) HDMI를 찾으니, 제조업체들은 제품에 HDMI를 넣어야 합니다.

HDMI때문에 추가된 비용은 소비자가 지불하게 됩니다.


HDMI 와 비슷한 거의 무료인 콘넥터(케이블)인 "디스플레이 포트"라는 것도 있습니다.

HDMI와 거의 비슷하거나, 약간 더 좋은 스펙을 자랑합니다.

그러나, HDMI측에서 막대한 광고로 인해, 사람들은 디스플레이 포트의 존재 자체도 잘 모릅니다.

이쯤되면 광고의 승리입니다.


몇년전 PC에는 디스플레이 포트를 장착한 제품이 나왔으나, 모니터가 없으니, 무용지물이 되는 상황입니다.


HDMI 협회에서는 HDMI하나로, 엄청난 부를 축적하고 있습니다.

소비자의 주머니를 털어가고 있죠. 지금도. 그리고, 내일도...

소비자는 자신들의 주머니가 털린다는 사실도 모른채로...(과장된 비약)



HDCP(컨텐츠 보호)

HDMI와 함께 나온 HDCP라는것도 있는데, 사실 같이 나온건 아니지만, 비슷한 시기에 유명해졌습니다.

HDCP는 주로 동영상의 저작권 보호를 목적으로 만들어 졌다고 하나, 실상은 그렇지는 않습니다.

컨텐츠 보호의 가장 좋은 방법은, 영상물에 KBS,EBS등의 글자를 써 넣는 방법입니다.

사실상 HDCP만으로 컨텐츠 보호를 할 수 없습니다.

이는 처음부터 알고 있었고, 중국에서 HDCP를 무력화하는 제품이 나올거라는것도 다 예상된 사실입니다.

그러나, 이또한 광고의 승리로, "HDCP= 좋은것"이라는 공식이 사람들의 머릿속에 세겨졌습니다.

물론, 컨텐츠 보호가 좋은 측면도 있습니다만, 여기서는 그런것을 얘기하는것이 목적이 아닙니다.

컨텐츠 보호는 HDCP가 할 수 없는것이고, 그런 무용지물을 위해 사람들은 돈을 지불한다는것이 문제입니다.

게다가, HDCP지원이 안되는 모니터/DVD 등에서는 해당 영상물을 보는것 조차 어렵습니다.

소비자는 HDCP가 적용된 영상물을 사고, HDCP를 볼 수 있는 기계를 사야 합니다.

소비자 입장에서는 이중으로 돈을 지불하는겁니다.


아까도 말했지만, 영상물에 글자만 넣으면, 거의 완벽하게 컨텐츠 보호가 되는데도 말이죠.

사람들은 광고의 영향으로, HDCP는 좋은것 이라 생각하고, 이중으노 돈이 털리는것을 인지할 수 없습니다.

HDCP 는 완벽한 사기극입니다.

거의 무용지물을 고가에 팔아먹고 있으니 말입니다.

그래도 다행인것은 그 돈의 아주 적은 금액은 진짜로, 컨텐츠 발전에 투자가 되기는 합니다.

물론, 그 효과는 알 수 없을 만큼 작습니다.


요약 : 누군가, 합법적으로, 내 주머니에서, 돈을 털어가고 있다.

Posted by 안녕1999
, |

최근에 달린 댓글

글 보관함