2010년 10월 10일 일요일

[매트랩] 이미지 처리 - 2

엣지 구하기

<소스>
img_edge = edge(img_bw,'sobel',0.05, 'vertical');

엣지를 구하는 방법은 다음과 같은 방법이 있다.

1. sobel

2. prewitt

3. log

4. reberts

5. canny

[매트랩] 이미지 처리 - 1

이미지 처리에 있어서 가장 우선 되어야 할 작업은

1. 이미지 리사이징(요즘 카메라 화질이 좋아서 이미지 처리를 위해 직접 작업을 하려면 쓸데없이 큰 경우가 많다.)
 - 개인적인 경험으로 보자면 이미지가 컸을때 엣지를 찾으려고 하면 생각보다 잘 찾아지지 않는 경우가 있었다.

2. 그레이 스케일로 변환

<소스>
clear all;

%%%% 이미지파일 로드
image_file = 'C:\Users\taxoo\Desktop\books.jpg';
img_org = imread(image_file);

%%%% 이미지 크기 변환
img_rgb = imresize(img_org, [375,500]);

%%%% 그레이스케일 변환
img_bw = rgb2gray(img_rgb);



2010년 6월 3일 목요일

Serial Port MFC

// SerialDlg.cpp : implementation file
//

#include "stdafx.h"
#include "Serial.h"
#include "SerialDlg.h"
#include "comm.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif


// CAboutDlg dialog used for App About

class CAboutDlg : public CDialog
{
public:
 CAboutDlg();

// Dialog Data
 enum { IDD = IDD_ABOUTBOX };

 protected:
 virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support

// Implementation
protected:
 DECLARE_MESSAGE_MAP()
};

CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{

}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
 CDialog::DoDataExchange(pDX);
}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
END_MESSAGE_MAP()


// CSerialDlg dialog

 


CSerialDlg::CSerialDlg(CWnd* pParent /*=NULL*/)
 : CDialog(CSerialDlg::IDD, pParent)
{
 m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CSerialDlg::DoDataExchange(CDataExchange* pDX)
{
 CDialog::DoDataExchange(pDX);
 DDX_Text(pDX, IDC_EDIT1, m_EditData);
 DDX_CBIndex(pDX, IDC_PORT, m_nSettingPort);
 DDX_CBIndex(pDX, IDC_BAUDRATE, m_nSettingBaud);
}

BEGIN_MESSAGE_MAP(CSerialDlg, CDialog)
 ON_WM_SYSCOMMAND()
 ON_WM_PAINT()
 ON_WM_QUERYDRAGICON()
 //}}AFX_MSG_MAP
 ON_BN_CLICKED(IDC_CHECK_COMM, &CSerialDlg::OnBnClickedCheckComm)
 ON_BN_CLICKED(IDOK, &CSerialDlg::OnBnClickedOk)
 ON_BN_CLICKED(IDCANCEL, &CSerialDlg::OnBnClickedCancel)
 ON_MESSAGE(WM_RECEIVEDATA,OnReceiveData)

END_MESSAGE_MAP()


// CSerialDlg message handlers

BOOL CSerialDlg::OnInitDialog()
{
 CDialog::OnInitDialog();

 // Add "About..." menu item to system menu.

 // IDM_ABOUTBOX must be in the system command range.
 ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
 ASSERT(IDM_ABOUTBOX < 0xF000);

 CMenu* pSysMenu = GetSystemMenu(FALSE);
 if (pSysMenu != NULL)
 {
  CString strAboutMenu;
  strAboutMenu.LoadString(IDS_ABOUTBOX);
  if (!strAboutMenu.IsEmpty())
  {
   pSysMenu->AppendMenu(MF_SEPARATOR);
   pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
  }
 }

 // Set the icon for this dialog.  The framework does this automatically
 //  when the application's main window is not a dialog
 SetIcon(m_hIcon, TRUE);   // Set big icon
 SetIcon(m_hIcon, FALSE);  // Set small icon

 // TODO: Add extra initialization here
 //for(int i=0; i<2; i++){
  m_Comm.SetHwnd(this->m_hWnd);
  LoadSettings();

 //}
 UpdateData(FALSE);

 return TRUE;  // return TRUE  unless you set the focus to a control
}

void CSerialDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
 if ((nID & 0xFFF0) == IDM_ABOUTBOX)
 {
  CAboutDlg dlgAbout;
  dlgAbout.DoModal();
 }
 else
 {
  CDialog::OnSysCommand(nID, lParam);
 }
}

// If you add a minimize button to your dialog, you will need the code below
//  to draw the icon.  For MFC applications using the document/view model,
//  this is automatically done for you by the framework.

void CSerialDlg::OnPaint()
{
 if (IsIconic())
 {
  CPaintDC dc(this); // device context for painting

  SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);

  // Center icon in client rectangle
  int cxIcon = GetSystemMetrics(SM_CXICON);
  int cyIcon = GetSystemMetrics(SM_CYICON);
  CRect rect;
  GetClientRect(&rect);
  int x = (rect.Width() - cxIcon + 1) / 2;
  int y = (rect.Height() - cyIcon + 1) / 2;

  // Draw the icon
  dc.DrawIcon(x, y, m_hIcon);
 }
 else
 {
  CDialog::OnPaint();
 }
}

// The system calls this function to obtain the cursor to display while the user drags
//  the minimized window.
HCURSOR CSerialDlg::OnQueryDragIcon()
{
 return static_cast<HCURSOR>(m_hIcon);
}


void CSerialDlg::OnBnClickedCheckComm()
{
 // TODO: Add your control notification handler code here
 UpdateData(TRUE);
 BOOL bCheck =((CButton*)GetDlgItem(IDC_CHECK_COMM))->GetCheck();
 if(bCheck)//통신시작
 {
 // for(int i=0; i<2; i++){

   if(m_Comm.OpenCommPort(&Int2TTY())!=TRUE)
   {
    CString str;
    str.Format("COM%d이 이미 사용중인지 확인하세요",m_nSettingPort);
    AfxMessageBox(str);

    ((CButton*)GetDlgItem(IDC_CHECK_COMM))->SetCheck(!bCheck);
    return;
   
   }
 

  GetDlgItem(IDC_CHECK_COMM)->SetWindowTextA("통신종료");
 
  GetDlgItem(IDC_PORT)->EnableWindow(FALSE);
  GetDlgItem(IDC_PORT2)->EnableWindow(FALSE);

  GetDlgItem(IDC_BAUDRATE)->EnableWindow(FALSE);
 }
 
 else{
  //for(int i=0; i<2; i++){
   m_Comm.CloseConnection();
  //}
  GetDlgItem(IDC_CHECK_COMM)->SetWindowTextA("통신시작");
  GetDlgItem(IDC_PORT)->EnableWindow(TRUE);
  GetDlgItem(IDC_PORT2)->EnableWindow(TRUE);
  GetDlgItem(IDC_BAUDRATE)->EnableWindow(TRUE);
 }
}
TTYSTRUCT CSerialDlg::Int2TTY()
{
 TTYSTRUCT tty;
 ZERO_MEMORY(tty);

 tty.byCommPort = (BYTE) m_nSettingPort;
 tty.byXonXoff = FALSE;
 tty.byByteSize = (BYTE)_nDataValues[m_nSettingData];
 tty.byFlowCtrl = (BYTE)_nFlow[m_nSettingFlow];
 tty.byParity = (BYTE)m_nSettingParity;
 tty.byStopBits = (BYTE)_nStopBits[m_nSettingStop];
 tty.dwBaudRate = (DWORD)_nBaudRates[m_nSettingBaud];
 return tty;
}
TTYSTRUCT CSerialDlg::LoadSettings()
{
 CWinApp *pApp = AfxGetApp();

 m_nSettingPort = pApp->GetProfileInt(CS_REGKEY_SETTINGS, CS_REGENTRY_PORT,1);
 m_nSettingParity = 0;
 m_nSettingBaud = pApp->GetProfileIntA(CS_REGKEY_SETTINGS, CS_REGENTRY_BAUD,1);
 m_nSettingData = 1;
 m_nSettingStop = 0;
 m_nSettingFlow = 0;

 return Int2TTY();

}
void CSerialDlg::SaveSettings()
{
 CWinApp *pApp = AfxGetApp();
 pApp->WriteProfileInt(CS_REGKEY_SETTINGS, CS_REGENTRY_PORT, m_nSettingPort);
 pApp->WriteProfileInt(CS_REGKEY_SETTINGS, CS_REGENTRY_PARITY,m_nSettingParity);
 pApp->WriteProfileInt(CS_REGKEY_SETTINGS, CS_REGENTRY_BAUD, m_nSettingBaud);
 pApp->WriteProfileInt(CS_REGKEY_SETTINGS, CS_REGENTRY_DATABITS, m_nSettingData);
 pApp->WriteProfileInt(CS_REGKEY_SETTINGS, CS_REGENTRY_STOPBITS, m_nSettingStop);
 pApp->WriteProfileInt(CS_REGKEY_SETTINGS, CS_REGENTRY_FLOW, m_nSettingFlow);
}
void CSerialDlg::OnBnClickedOk()
{
 // TODO: Add your control notification handler code here

 char start[] = {0x02, 0x00, 0xf0};
//for(int i=0; i<2; i++)
  m_Comm.WriteCommBlock(start,3);
// SaveSettings();
// CDialog::OnOK();
}

void CSerialDlg::OnBnClickedCancel()
{
// TODO: Add your control notification handler code here
// for(int i=0; i<2; i++)
// { 
  SaveSettings();
  m_Comm.CloseConnection();
 //}
  CDialog::OnCancel();
}
LONG CSerialDlg::OnReceiveData(UINT WParam, LONG a)
{
 int i;
 int nLen = WParam;
 CString str;

 UpdateData(TRUE);
 BYTE ch;
 int temp;

// for(int j=0; j<2; j++){
  for(i=0;i<nLen;i++)
  {
   ch =(int)m_Comm.abIn[i];
   str.Format("%x",ch);
   m_EditData += str;
  }
// }
 UpdateData(FALSE);
 return TRUE;
}

Serial Port 연결 (C)

//Comm.cpp Rs232c통신을 하기 위한 클래스
// 2001년 3월 26일 (주) 마이크로 로보트  S/W팀 정웅식
//
#include "stdafx.h"
#include "comm.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

IMPLEMENT_DYNCREATE(CComm, CObject)

// 통신프로토콜 Table
BYTE _nFlow[] = {FC_NONE,FC_DTRDSR,FC_RTSCTS,FC_XONXOFF};
// 통신 데이타 사이즈 테이블
int _nDataValues[] = {7,8};
// 통신속도 Table
int _nBaudRates[] = {// CBR_1200, CBR_2400, CBR_4800,
      CBR_9600, CBR_14400, CBR_19200,
      CBR_38400, CBR_56000, CBR_57600,
      CBR_115200,  };
BYTE _nStopBits[] = { ONESTOPBIT, TWOSTOPBITS };
//BOOL bTxEmpty=TRUE;

UINT ReceMessage;

CComm::CComm( )
{
 idComDev=NULL;
 fConnected=FALSE;
 bTxEmpty=TRUE;
}

CComm::~CComm( )
{
    DestroyComm();
}

//BEGIN_MESSAGE_MAP(CComm, CObject)
 //{{AFX_MSG_MAP(CComm)
  // NOTE - the ClassWizard will add and remove mapping macros here.
 //}}AFX_MSG_MAP
//END_MESSAGE_MAP()


/////////////////////////////////////////////////////////////////////////////
// CComm message handlers
//CommWatchProc()
//통신을 하는 프로세저 즉 데이타가 들어왔을대 감시하는
//루틴 본루틴은 OpenComPort 함수 실행시 프로시저로 연결됨
//OpenComPort 함수 참조
DWORD CommWatchProc(LPVOID lpData)
{
 DWORD       dwEvtMask ;
 OVERLAPPED  os ;
 CComm*      npComm = (CComm*) lpData ;
 char InData[COM_MAXBLOCK + 1];
 int        nLength ;
 //idCommDev 라는 핸들에 아무런 com 포트가 안붙어 있으면
 // 에라 리턴
 if ( npComm == NULL ||
  !npComm->IsKindOf( RUNTIME_CLASS( CComm ) ) )
  return (DWORD)(-1);

 memset( &os, 0, sizeof( OVERLAPPED ) ) ;


 os.hEvent = CreateEvent( NULL,    // no security
                            TRUE,    // explicit reset req
                            FALSE,   // initial event reset
                            NULL ) ; // no name
 if ( os.hEvent == NULL )
 {
  MessageBox( NULL, "Failed to create event for thread!", "comm Error!",
     MB_ICONEXCLAMATION | MB_OK );
  return ( FALSE ) ;
 }

 DWORD dwEventFlags = EV_BREAK | EV_CTS | EV_DSR | EV_ERR | EV_RING |
       EV_RLSD | EV_RXCHAR | EV_RXFLAG | EV_TXEMPTY;
 if (!SetCommMask(npComm->idComDev, dwEventFlags))
  return ( FALSE ) ;

 while (npComm->fConnected)
 {  
  dwEvtMask = 0;
 
  WaitCommEvent(npComm->idComDev, &dwEvtMask, NULL );
 
  if ((dwEvtMask & EV_BREAK) == EV_BREAK)
  {
   ;;;
  }
  else if ((dwEvtMask & EV_CTS) == EV_CTS)
  {
   ;;;
  }
  else if ((dwEvtMask & EV_ERR) == EV_ERR)
  {
   ;;;
  }
  else if ((dwEvtMask & EV_RING) == EV_RING)
  {
   ;;;
  }
  else if ((dwEvtMask & EV_RLSD) == EV_RLSD)
  {
   ;;;
  }
  else if ((dwEvtMask & EV_RXCHAR) == EV_RXCHAR)
  {   
   do
   {  
    memset(InData,0,80);
    if (nLength = npComm->ReadCommBlock((LPSTR) InData, COM_MAXBLOCK ))
    {
                  npComm->SetReadData(InData,nLength);
                  //이곳에서 데이타를 받는다.
         }
   }
   while ( nLength > 0 ) ;
   
  }
  else if ((dwEvtMask & EV_RXFLAG) == EV_RXFLAG)
  {
   ;;;
  }
  else if ((dwEvtMask & EV_TXEMPTY) == EV_TXEMPTY)
  {
   npComm->bTxEmpty = TRUE;
  }
 }
 
 CloseHandle( os.hEvent );

 return( TRUE );
}

//데이타를 읽고 데이타를 읽었다는
//메세지를 리턴한다.
void CComm::SetReadData(LPSTR data, int nLen)
{
 memcpy(abIn,data,nLen);
 //설정된 윈도우에 WM_RECEIVEDATA메세지를
 //날려주어 현제 데이타가 들어왔다는것을
 //알려준다.
 
 //SendMessage(m_hwnd,ReceMessage,nLen,0);
 SendMessage(m_hwnd,WM_RECEIVEDATA,nLen,0);
}

//메세지를 전달할 hwnd설정
void CComm::SetHwnd(HWND hwnd)
{
 m_hwnd=hwnd;
}

//com 포트를 열고 연결을 시도한다.
//OpenComport()

BOOL CComm::OpenCommPort(LPTTYSTRUCT lpTTY)
{           
 char       szPort[ 15 ] ;
 BOOL       fRetVal ;
 COMMTIMEOUTS  CommTimeOuts ;

 osWrite.Offset = 0 ;
 osWrite.OffsetHigh = 0 ;
 osRead.Offset = 0 ;
 osRead.OffsetHigh = 0 ;

 //이벤트 창구 설정
 osRead.hEvent = CreateEvent( NULL, TRUE, FALSE, NULL );
 if (osRead.hEvent == NULL)
 {
  return FALSE ;
 }
 osWrite.hEvent = CreateEvent( NULL,   TRUE,  FALSE,   NULL );
 if (NULL == osWrite.hEvent)
 {
  CloseHandle( osRead.hEvent );
  return FALSE;
 }

  
 if (lpTTY->byCommPort > COM_MAXPORTS)
  lstrcpy( szPort, "\\\\.\\TELNET" ) ;
 else
  wsprintf( szPort, "COM%d", lpTTY->byCommPort );

 // COMM device를 화일형식으로 연결한다.

 if ((idComDev =
  CreateFile( szPort, GENERIC_READ | GENERIC_WRITE,
                  0,                    // exclusive access
                  NULL,                 // no security attrs
                  OPEN_EXISTING,
                  FILE_ATTRIBUTE_NORMAL |
                  FILE_FLAG_OVERLAPPED, // overlapped I/O
                  NULL )) == (HANDLE) -1 )
  return ( FALSE ) ;
 else
 {
  //컴포트에서 데이타를 교환하는 방법을 char단위를 기본으로 설정하자
  SetCommMask( idComDev, EV_RXCHAR ) ;
  SetupComm( idComDev, 4096, 4096 ) ;
  //디바이스에 쓰레기가 있을지 모르니까 깨끗이 청소를 하자!
  PurgeComm( idComDev, PURGE_TXABORT | PURGE_RXABORT |
                                      PURGE_TXCLEAR | PURGE_RXCLEAR ) ;

    
  CommTimeOuts.ReadIntervalTimeout = 0xFFFFFFFF ;
  CommTimeOuts.ReadTotalTimeoutMultiplier = 0 ;
  CommTimeOuts.ReadTotalTimeoutConstant = 1000 ;
  CommTimeOuts.WriteTotalTimeoutMultiplier = 0 ;
  CommTimeOuts.WriteTotalTimeoutConstant = 1000 ;
  SetCommTimeouts( idComDev, &CommTimeOuts ) ;
 }

 fRetVal = SetupConnection(lpTTY) ;

 if (fRetVal)//연결이 되었다면 fRetVal TRUE이므로
 {
  fConnected = TRUE ;//연결되었다고 말해줌
  //프로시전를 CommWatchProc에 연결하니까 나중에 데이타가 왔다갔다
  //하면 모든 내용은 CommWatchProc가 담당한다.
  AfxBeginThread((AFX_THREADPROC)CommWatchProc,(LPVOID)this);
 }
 else
 {
  fConnected = FALSE ;
  CloseHandle( idComDev) ;
 }

 return ( fRetVal ) ;
}

//화일로 설정된 컴포트와 실질 포트와 연결을 시킨다.
//SetupConnection 이전에 CreateComPort를 해주어야 한다.
BOOL CComm::SetupConnection(LPTTYSTRUCT lpTTY)
{
 BOOL       fRetVal;
 DCB        dcb;

 dcb.DCBlength = sizeof( DCB ) ;

 GetCommState( idComDev, &dcb ) ;//dcb의 기본값을 받는다.


 dcb.BaudRate = lpTTY->dwBaudRate;
 dcb.ByteSize = lpTTY->byByteSize;
 dcb.Parity = lpTTY->byParity;
 dcb.StopBits = lpTTY->byStopBits;
 
 // setup hardware flow control FC_DTRDSR
 BOOL bSet = (BYTE)((lpTTY->byFlowCtrl & FC_DTRDSR) != 0);

 dcb.fOutxDsrFlow = bSet;
 
 if(bSet)
  dcb.fDtrControl = DTR_CONTROL_HANDSHAKE;
 else
  dcb.fDtrControl = DTR_CONTROL_ENABLE;
 
 // FC_RTSCTS
 bSet = (BYTE)((lpTTY->byFlowCtrl & FC_RTSCTS) != 0);
 dcb.fOutxCtsFlow = bSet;
 
 if(bSet)
  dcb.fRtsControl = RTS_CONTROL_HANDSHAKE;
 else
  dcb.fRtsControl = RTS_CONTROL_ENABLE;
 
 // setup software flow control FC_XONXOFF
 bSet = (BYTE)((lpTTY->byFlowCtrl & FC_XONXOFF) != 0);

 dcb.fInX = dcb.fOutX = bSet;
 dcb.XonChar = ASCII_XON;
 dcb.XoffChar = ASCII_XOFF;
 dcb.XonLim = 1;
 dcb.XoffLim = 1;
 
 // other various settings
 dcb.fBinary = TRUE;
 dcb.fParity = TRUE;

 fRetVal = SetCommState( idComDev, &dcb ) ; //변경된 Dcb 설정

 return ( fRetVal ) ;  
}

//컴포트로 부터 데이타를 읽는다.
int CComm::ReadCommBlock(LPSTR lpszBlock, int nMaxLength )
{
 BOOL       fReadStat ;
 COMSTAT    ComStat ;
 DWORD      dwErrorFlags;
 DWORD      dwLength;

 // only try to read number of bytes in queue
 ClearCommError( idComDev, &dwErrorFlags, &ComStat ) ;
 dwLength = min( (DWORD) nMaxLength, ComStat.cbInQue ) ;

 if (dwLength > 0)
 {
  fReadStat = ReadFile( idComDev, lpszBlock, dwLength, &dwLength, &osRead ) ;
  if (!fReadStat)
  {
          if(GetLastError() == ERROR_IO_PENDING)
   {
    OutputDebugString("\n\rIO Pending");
    // we have to wait for read to complete.  This function will timeout
    // according to the CommTimeOuts.ReadTotalTimeoutConstant variable
    // Every time it times out, check for port errors        
    while(!GetOverlappedResult(idComDev, &osRead,
     &dwLength, TRUE))
    {
     DWORD dwError = GetLastError();
     if(dwError == ERROR_IO_INCOMPLETE)
     {
      // normal result if not finished
      continue;
     }
     else
     {
      // CAN DISPLAY ERROR MESSAGE HERE
      // an error occured, try to recover
      ::ClearCommError(idComDev, &dwErrorFlags, &ComStat);
      if(dwErrorFlags > 0)
      {
       // CAN DISPLAY ERROR MESSAGE HERE
      }
      break;
     }
    }
   }
   else
   {
    // some other error occured
    dwLength = 0;
    ClearCommError(idComDev, &dwErrorFlags, &ComStat);
    if(dwErrorFlags > 0)
    {
     // CAN DISPLAY ERROR MESSAGE HERE
    }
   }
  }
   }
  
   return ( dwLength ) ;
}

// 컴포트에 데이터를 쓴다.
BOOL CComm::WriteCommBlock( LPSTR lpByte , DWORD dwBytesToWrite)
{
 DWORD  dwErrorFlags;
 BOOL        fWriteStat ;
 DWORD       dwBytesWritten ;
 COMSTAT ComStat;

 DWORD dwLength = dwBytesToWrite;

 bTxEmpty = FALSE;
 fWriteStat = WriteFile( idComDev, lpByte, dwBytesToWrite, &dwBytesWritten, &osWrite ) ;
 //if (dwBytesToWrite != dwBytesWritten)
 
 if(!fWriteStat)
 {
  if(GetLastError() == ERROR_IO_PENDING)
  {
   OutputDebugString("\n\rIO Pending");
   // 읽을 문자가 남아 있거나 전송할 문자가 남아 있을 경우 Overapped IO의
   // 특성에 따라 ERROR_IO_PENDING 에러 메시지가 전달된다.
   //timeouts에 정해준 시간만큼 기다려준다.
   while(!GetOverlappedResult(idComDev, &osWrite,
      &dwLength, TRUE))
   {
    DWORD dwError = GetLastError();
    if(dwError == ERROR_IO_INCOMPLETE)
    {
     // normal result if not finished
     continue;
    }
    else
    {
     // CAN DISPLAY ERROR MESSAGE HERE
     // an error occured, try to recover
     ::ClearCommError(idComDev, &dwErrorFlags, &ComStat);
     if(dwErrorFlags > 0)
     {
      // CAN DISPLAY ERROR MESSAGE HERE
      AfxMessageBox("ERROR");
     }
     break;
    }
   }
  }
  else
  { // some other error occured
   dwLength = 0;
   ClearCommError(idComDev, &dwErrorFlags, &ComStat);
   if(dwErrorFlags > 0)
   {
    // CAN DISPLAY ERROR MESSAGE HERE    
    AfxMessageBox("ERROR");
   }
  } 
 }

 return ( TRUE ) ;
}


//컴포트를 완전히 해제한다.
BOOL CComm::DestroyComm()
{
 if (fConnected)
  CloseConnection();

 if (osRead.hEvent!=NULL)
  CloseHandle( osRead.hEvent ) ;

 if (osWrite.hEvent != NULL)
  CloseHandle( osWrite.hEvent ) ;

 return ( TRUE ) ;
}

//연결을 닫는다.
BOOL CComm::CloseConnection()
{

   // set connected flag to FALSE

   fConnected = FALSE ;

   // disable event notification and wait for thread
   // to halt

   SetCommMask( idComDev, 0 ) ;


   EscapeCommFunction( CLRDTR ) ;
   EscapeCommFunction( CLRRTS ) ;


   PurgeComm( idComDev, PURGE_TXABORT | PURGE_RXABORT |
                                   PURGE_TXCLEAR | PURGE_RXCLEAR ) ;
   CloseHandle( idComDev ) ;
 
   return ( TRUE ) ;

}

void CComm::EscapeCommFunction(DWORD dwFunc)
{
 // TODO: Add your control notification handler code here
 ::EscapeCommFunction(idComDev,dwFunc);
}

2010년 5월 18일 화요일

[공모전] bada Developer Challenge (5/17개최)

1회 삼성 bada Developer Challenge가 개최됩니다.

 

세계대회 출전을 통해 역량을 키울 수 있는 좋은 기회가 될 것 같습니다.

 

공모전 세부 내용은 Bada 웹사이트를 통해 확인하실 수 있으며,

Bada SDK는 이미 Release 되어 사용할 수 있으니 바로 학습/개발 가능합니다

 

1차 제출 일정이 7월 말입니다.

 

- bada Developer Challenge 바로 가기

http://developer.bada.com/challenge/index.do?menu=MC01160200&utm_source=samsung&utm_medium=newsletter_kr&utm_campaign=dc

 

- bada SDK 다운로드 -

http://developer.bada.com/apis/docs/commonpage.do?menu=MC01040000&utm_source=samsung&utm_medium=newsletter_kr&utm_campaign=sdk

2010년 5월 9일 일요일

[Java] Serial Communication API (시리얼통신)

아직까지도 주요 통신 수단인 시리얼 통신(RS-232C)은 현재 J2SE에서 제공하고 있지 않다.


하지만 하드웨어 관련한 프로젝트를 해보면 알겠지만 매우 필요한 수단이다.


일단은 표준 API가 아니므로 추가적으로 설치해야하는데 다음 링크를 따라가보자


[링크] : http://java.sun.com/products/javacomm/index.html

[파일] : 

 

* 설치


1. 링크를 따라가면 화면 좌측으로 다운로드 링크가 있다. 따라가도록 하자.

 

2. 아래쪽으로 플랫폼을 선택할 수 있는데 윈도우라면 Generic을 선택한 후 다운로드를 진행한다.

    (현재는 로그인을 해야 다운로드가진행된다. 메일주소와 이름등만 적으면 되므로 가입후 진행하자)

 

2. 첨부파일 저장 후 comm.jar, javax.comm.properties, win32com.dll 파일을 java.exe 파일이 있는 C:\Program Files\Java\jdk1.6.0_18\bin (경로는 본인에 맞게)에 복사한다.


3. comm.jar를 클래스 패스에 추가시킨다.


4. 사용하려는 클래스에서 import javax.comm.*; 을 하여 사용한다.

 

 


* 사용예제


import java.io.*;

import javax.comm.*;
public class Rs232c {
    public static void main( String arg[] ) {
        try {
            CommPortIdentifier ports = CommPortIdentifier.getPortIdentifier( "COM1" );
            SerialPort port = ( SerialPort )ports.open( "RS232C", 1000 );
            port.setSerialPortParams( 9600,
                SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE );
            port.setFlowControlMode( SerialPort.FLOWCONTROL_NONE );
            OutputStream out = port.getOutputStream();
            String msg = "Serial Comm.\n";
            out.write( msg.getBytes() );
            out.flush();
            out.close();
            port.close();
        }
        catch( Exception e ) {
            System.out.println( "Error:" + e.getMessage() );
        }
    }
}

2010년 5월 7일 금요일

[GOCR] 소스분석 <gocr-0.48/src/ocr0.c/ocr0_oO()>

문자인식을 위한 프로젝트를 진행하기위해 gocr소스를 분석하였다.

일단 전체적으로 분석하기에는 구조가 조금 복잡한 면이 있어서

알파벳 o,O를 분석하는 함수인 ocr0_oO()를 분석하고자 한다.

 

static wchar_t ocr0_oO(ocr0_shared_t *sdata){...}

- 내부 사용 함수

 get_bw()

 num_cross()

 loop()

 setac()

 

1. char get_bw(int x0, int x1, int y0, int y1, pix * p, int cs, int mask)

  - Look for dots in the rectangular region x0 <= x <= x1 and y0 <= y <= y1 in pixmap p.  The two low order bits in mask indicate the color of dots to look for: If mask==1 then look for black dots (where a pixel value less than cs is considered black).  If mask==2 then look for white dots.  If mask==3 then look for both black and white dots. If the dots are found, the corresponding bits are set in the returned value.  Heavily used by the engine ocr0*.cc

  - pixmap p의 x0 <= x <= x1 와 y0 <= y <= y1 범위의 사각형 영역의 점을 찾는다. mask 변수의 하위 2비트는 찾으려고 하는 점들의 색을 나타낸다. : mask==1이면 검은점을 나타내고(cs보다 작은 값은 검은점으로), mask==2이면 흰점을 mask==3이면 검은점과 흰점 둘다 나타낸다. 특정 점을 찾아 그에 해당하는 리턴 값으로 셋팅된다. 주로 ocr0*.cc에서 쓰인다.

 

2. int num_cross(int x0, int x1, int y0, int y1, pix *p, int cs)

  - more general Mar2000 (x0,x1,y0,y1 instead of x0,y0,x1,y1! (history)) look for black crossings throw a line from x0,y0 to x1,y1 and count them follow line and count crossings ([white]-black-transitions)

  - ex: horizontal num_cross of 'm' would return 3
  - fail for:  .a... a-to-b counts no transitions, but there is
 *            ...#.
 *            ..#..
 *            .#..b

  - Mar2000보다 일반적인 형태로 x0,y0부터 x1,y1 선분에 있는 검은 색 교차지점(백-흑 변화)을 찾아 그 개수를 리턴한다.

  - 예) m의 가로 num_cross값은 3을 리턴한다.

 

3. int loop(pix *p,int x,int y,int l,int cs,int col, DIRECTION r)

  - move from x,y to direction r until pixel of color col is found or maximum of l steps return the number of steps done

  - x,y부터 r방향으로 이동하면서 col 색을 찾거나 최고 l스텝까지 이동하여 스텝값을 리턴한다.

 

4. int setac(struct box *b, wchar_t ac, int weight)

  - this function will be replaced by a call of setas() later

  - 이 함수는 추후 setas()로 대체될 것이다.

 

5. int setas(struct box *b, char *as, int weight)

  - set alternate chars and its weight, called from the engine if a char is recognized to (weight) percent can be used for filtering (only numbers etc) often usefull if Il1 are looking very similar
   should this function stay in box.c ??? weight is between 0 and 100 in percent, 100 means absolutely sure not final, not time critical (js) replace it by a string-function setaobj(*b,"string",weight) and let call setac the setas function

  - 서로 엇갈리는 문자들과 이 문자들의 가중치을 정하고, ........ ??? 가중치값은 0과 100퍼센트 사이값이다.

2010년 4월 26일 월요일

[방송정보] TV 컨텐츠 장르별/방송사별 사이트 및 서비스

* 서비스 제공 (2010.04.26 현재)

 

* EPG(한국) : http://schedule.epg.co.kr/new/tvguide/tvguide.php


* 포털사이트

  1. 네이버 : http://www.naver.com/

     - 오픈API : http://dev.naver.com/openapi/

       - 실시간급상승검색어, 지식in, 동영상, 이미지, 책, 영화, 영화인, 지역, 쇼핑, 자동차, 백과사전

       - 지도, 블로그검색, 카페검색, 카페글검색, 뉴스검색, 추천검색어, 바로가기, SyndicationAPI

     - TV편성표 : http://news.naver.com/main/broadcast.nhn?date=20100428&offset=1

       - date=날짜, offset=그룹번호_채널(임의지정)


  2. 다음 : http://www.daum.net/

     - TV편성표 : http://search.daum.net/search?w=tot&q=tv편성표

        - 프로그램정보 : http://movie.daum.net/tv/detail/main.do?tvProgramId=

           - ProgramId : 숫자(임의지정)


  3. 100hot : http://www.100hot.co.kr/ -> 분야별 사이트 랭킹


* 지상파

  1. MBC : http://www.imbc.com/

     - 전체검색, 프로그램, 방송인물, 동영상, 이미지, 부가정보, 뉴스

     - 로그인 후 서비스 제공

     - 전체검색(쿼리) : http://cue.imbc.com/totalSearch.aspx?query=


  2. KBS : http://www.kbs.co.kr/

     -


  3. SBS : http://www.sbs.co.kr/

     -


  4. EBS : http://www.ebs.co.kr/index.jsp

     -


 

* 장르별 정보 (2010.04.26 현재)

 

1. 드라마
  - 공포, 논픽션, 농어촌, 단막극/단편, 로드무비, 로맨틱코메디, 멜로, 모험, 뮤지컬, 미스터리/스릴러, 서부, 시대극, 시트콤, 애니메이션, 액션, 에로/성, 역사/사극, 어린이, 컬트, 코메디, 트렌디, 홈드라마, 환상/SF, 휴먼드라마

 

2. 영화 ->드라마
  - 공포, 논픽션, 농어촌, 단막극/단편, 로드무비, 로맨틱코메디, 멜로, 모험, 뮤지컬, 미스터리/스릴러, 서부, 시대극, 시트콤, 애니메이션, 액션, 에로/성, 역사/사극, 어린이, 컬트, 코메디, 트렌디, 홈드라마, 환상/SF, 휴먼드라마

 

3. 만화
  - 교육, 동화, 명랑, 명작, 모험, 순정, 스포츠, 액션/무협, 에로, 역사, 위인, 종교, 취미, 코믹, 탐정, 호러/심령, SF

 

4. 연예/오락
  1) 고전해학극
  2) 퀴즈
  3) 라이프/휴먼
  4) 마술/써커스
  5) 버라이어티
  6) 복권

      - 나눔로또 : http://www.645lotto.net/
      - 나눔로또_블로그 : http://blog.naver.com/nanumlotto -> RSS

      - 스포츠토토 : http://www.sportstoto.co.kr/
  7) 선발대회
  8) 성금/봉사
  9) 시상식
  10) 연애매거진
  11) 토크쇼
  12) 연예인/스타
  13) 영화가이드
  14) 오락게임쇼
  15) 인포테인먼트
  16) 진기/명기
  17) 코미디쇼
  18) 패션쇼
  19) 홈비디오
  20) 일반

 

5. 스포츠

  - 스포츠토토 : http://www.sportstoto.co.kr/
  1) 동계올림픽
  2) 아시안게임
  3) 올림픽
  4) 월드컵
  5) 야구

      - 한국야구위원회 : http://www.koreabaseball.com/
  6) 축구

      - 대한축구협회 : http://www.kfa.or.kr/main/main.asp

      - 프로축구연맹 : http://www.kleague.com/
  7) 배드민턴
  8) 스쿼시
  9) 테니스
  10) 농구

      - 프로농구연맹 : http://www.kbl.or.kr/
  11) 배구

      - 한국배구연맹 : http://www.kovo.co.kr/main/main.asp
  12) 핸드볼
  13) 하키
  14) 미식축구(football)
  15) 육상
  16) 마라톤
  17) 체조/에어로빅
  18) 사이클경주
  19) 자동차경주
  20) 수영
  21) 수상/수중
  22) 동계
  23) 스키
  24) 아이스하키
  25) 스케이트
  26) 마장/마술
  27) 권투(복싱)
  28) 레슬링
  29) 씨름
  30) 유도
  31) 골프

      - 한국프로골프협회 : http://www.koreapga.com/
  32) 볼링
  33) 사격/양궁
  34) 탁구
  35) 태권도

      - 대한태권도협회(KTA) : http://www.koreataekwondo.org/ -> 뉴스, 대회정보
  36) 일반
  37) 격투기

 

6. 취미/레저
  1) 가정공예
  2) 경륜
  3) 경마

      - 한국마사회 : http://race.kra.co.kr/ -> RSS
  4) 관광/여행

      - 한국관광공사 : http://korean.visitkorea.or.kr/
  5) 낚시
  6) 댄스
  7) 미용/건강
  8) 바둑

      - 한국기원 : http://www.baduk.or.kr/
  9) 애완동물
  10) 요리

      - 네이버 키친 : http://kitchen.naver.com/ -> 오늘의키친, 베스트키친, 새로올라온키친 등
  11) 자동차
  12) 컴퓨터
  13) 게임
  14) 일반
  15) 장기

 

7. 음악

  - 멜론 : http://www.melon.com/

  - 벅스 : http://www.bugs.co.kr/
  1) 강습
  2) 대중가요
  3) 국악/민요
  4) 댄스
  5) 동요
  6) 팝/락
  7) 뮤지컬/오페라
  8) 영화음악
  9) 올드가요
  10) 음악경연쇼
  11) 음악공연(연주회)
  12) 재즈
  13) 클래식
  14) 토크음악쇼
  15) 일반
  16) 가요순위쇼

 

8. 교육
  1) 유아
  2) 초등교육
  3) 중등교육
  4) 수능(초급,고급)
  5) 자격증
  6) 대학/방송대학
  7) 영어
  8) 일어
  9) 중국어
  10) 러시아어
  11) 프랑스어
  12) 독일어
  13) 기타외국어/회화
  14) 컴퓨터/인터넷
  15) 직업교육
  16) 교사
  17) 어린이
  18) 일반

 

9. 뉴스
  1) 뉴스
  2) 스포츠
  3) 경제(산업/부동산)
  4) 국제
  5) 날씨

      - 기상청_날씨 : http://www.kma.go.kr/weather/main.jsp
  6) 북한
  7) 일반

 

10. 시사/다큐
  1) 과학
  2) 국제
  3) 동물
  4) 라이프/휴먼
  5) 문화
  6) 사회
  7) 산업
  8) 역사
  9) 예술
  10) 인물
  11) 자연
  12) 토론/대담
  13) 풍물/기행
  14) 영화
  15) 환경(문제)
  16) 일반

 

11. 교양/정보
  1) 강좌
  2) 경제(산업)
  3) 공연(음악제외)
  4) 예술/문화
  5) 벤처
  6) 미술
  7) 방송/언론
  8) 문학
  9) 증권

      - 네이버_증권 : http://stock.naver.com/

      - 다음_증권 : http://stock.daum.net/
  10) 부동산

      - 네이버_부동산 : http://land.naver.com/

      - 다음_부동산 : http://realestate.daum.net/
  11) 의료건강
  12) 인테리어
  13) 일반
  14) 정보통신/인터넷
  15) 패션/뷰티
  16) 풍물
  17) 기념행사
  18) 불교

      - BBS 불교방송 : http://www.bbsi.co.kr/

      - 대한불교진흥원 : http://www.kbpf.org/ -> 불교뉴스
  19) 기독교

      - CTS 기독교TV : http://www.cts.tv/main/index_code.asp
  20) 천주교

      - PBC 평화방송 : http://web.pbc.co.kr/CMS/index.php

      - Goodnews : http://www.catholic.or.kr/
  21) 기타종교

 

12. 홈쇼핑

  - 네이버 오픈 API(쇼핑) : http://dev.naver.com/openapi/apis/data/shop
  1) 가구
  2) 가전
  3) 가정/주방/생활용품
  4) 건강/레포츠
  5) 골프용품
  6) 보석/시계
  7) 뷰티
  8) 수산물
  9) 식품
  10) 인테리어
  11) 자동차 용품
  12) 종합
  13) 침구
  14) 컴퓨터/사무기기
  15) 패션/의류
  16) 기타

 

13. 성인
  - 성인(일반), 영화, 드라마, 리얼리티, 토크, 버라이어티, 코미디

[장르] TV 프로그램 장르구분

TV 프로그램 장르구분(EPG.CO.KR)

 

 

1. 드라마

- 공포, 논픽션, 농어촌, 단막극/단편, 로드무비, 로맨틱코메디, 멜로, 모험, 뮤지컬, 미스터리/스릴러, 서부, 시대극, 시트콤, 애니메이션, 액션, 에로/성, 역사/사극, 어린이, 컬트, 코메디, 트렌디, 홈드라마, 환상/SF, 휴먼드라마

2. 영화 ->드라마

- 공포, 논픽션, 농어촌, 단막극/단편, 로드무비, 로맨틱코메디, 멜로, 모험, 뮤지컬, 미스터리/스릴러, 서부, 시대극, 시트콤, 애니메이션, 액션, 에로/성, 역사/사극, 어린이, 컬트, 코메디, 트렌디, 홈드라마, 환상/SF, 휴먼드라마

3. 만화

- 교육, 동화, 명랑, 명작, 모험, 순정, 스포츠, 액션/무협, 에로, 역사, 위인, 종교, 취미, 코믹, 탐정, 호러/심령, SF

4. 연예/오락

- 고전해학극, 퀴즈, 라이프/휴먼, 마술/써커스, 버라이어티, 복권, 선발대회, 성금/봉사, 시상식, 연애매거진, 토크쇼, 연예인/스타, 영화가이드, 오락게임쇼, 인포테인먼트, 진기/명기, 코미디쇼, 패션쇼, 홈비디오, 일반

5. 스포츠

- 동계올림픽, 아시안게임, 올림픽, 월드컵, 야구, 축구, 배드민턴, 스쿼시, 테니스, 농구, 배구, 핸드볼, 하키, 미식축구(football), 육상, 마라톤, 체조/에어로빅, 사이클경주, 자동차경주, 수영, 수상/수중, 동계, 스키, 아이스하키, 스케이트, 마장/마술, 권투(복싱), 레슬링, 씨름, 유도, 골프, 볼링, 사격/양궁, 탁구, 태권도, 일반, 격투기

6. 취미/레저

- 가정공예, 경륜, 경마, 관광/여행, 낚시, 댄스, 미용/건강, 바둑, 애완동물, 요리, 자동차, 컴퓨터 게임, 일반, 장기

7. 음악

- 강습, 대중가요, 국악/민요, 댄스, 동요, 팝/락, 뮤지컬/오페라, 영화음악, 올드가요, 음악경연쇼, 음악공연(연주회), 재즈, 클래식, 토크음악쇼, 일반, 가요순위쇼

8. 교육

- 유아, 초등교육, 중등교육, 수능(초급,고급), 자격증, 대학/방송대학, 영어, 일어, 중국어, 러시아어, 프랑스어, 독일어, 기타외국어/회화, 컴퓨터/인터넷, 직업교육, 교사, 어린이, 일반

9. 뉴스

- 뉴스, 스포츠, 경제(산업/부동산), 국제, 날씨, 북한, 일반

10. 시사/다큐

- 과학, 국제, 동물, 라이프/휴먼, 문화, 사회, 산업, 역사, 예술, 인물, 자연, 토론/대담, 풍물/기행, 영화, 환경(문제), 일반

11. 교양/정보

- 강좌, 경제(산업), 공연(음악제외), 예술/문화, 벤처, 미술, 방송/언론, 문학, 증권, 부동산, 의료건강, 인테리어, 일반, 정보통신/인터넷, 패션/뷰티, 풍물, 기념행사, 불교, 기독교, 천주교, 기타종교

12. 홈쇼핑

- 가구, 가전, 가정/주방/생활용품, 건강/레포츠, 골프용품, 보석/시계, 뷰티, 수산물, 식품, 인테리어, 자동차 용품, 종합, 침구, 컴퓨터/사무기기, 패션/의류, 기타

13. 성인

- 성인(일반), 영화, 드라마, 리얼리티, 토크, 버라이어티, 코미디

2010년 4월 24일 토요일

[Open API] 네이버 오픈 API

[링크] : http://dev.naver.com/openapi/


1. 컨텐츠 API
 - 실시간 급상승 검색어 : 영역별, 주제별 쿼리
 - 지식in : 지식인 검색
 - 동영상
 - 이미지
 - 전문자료 : 학술 논문, 레포트, 전문 기관의 보고서 등 신뢰도 높은 자료

2. 데이터 API
 - 책 : 제목, 저자명, 목차, ISBN, 출판사
 - 영화 : 장르별 검색
 - 영화인 : 영화배우
 - 지역 : 네이버 지역서비스에 등록된 각 지역별 업체 및 상호 검색 결과, 네이버 지도 API와 쉽게 연동
 - 쇼핑 : 상품의 상세정보 및 최저가격 정보
 - 자동차 : 자동차 차종, 출시년도별
 - 백과사전 : 두산백과사전 EnCyber, 위키백과에서 제공하는 백과사전

3. 지도 API
 - 자바스크립트 지도
 - 플래시 지도

4. 검색 API
 - 블로그검색
 - 카페 검색
 - 카페글 검색
 - 웹문서 검색
 - 뉴스 검색

5. 기능 API
 - 추천검색어 : 네이버 검색어의 패턴을 분석해 이용자들이 입력한 검색어 중 연관도가 높은 검색어 추천
 - 성인 검색어 판별
 - 오타변환 : 한/영 키를 잘못 설정하였을 경우 오타수정
 - 바로가기 : 네이버에서 선정한 웹사이트의 바로가기
 - Syndication API : [링크를 통해 확인]

* API Key : API사용시 키 값이 필요하다. 로그인후 발급 받도록 한다.
* 쿼리는 하루 25000번 제한이 있다.

2010년 4월 22일 목요일

[Android] 안드로이드 가상기기 생성하기

안드로이드 액티비티를 실행하기 전에 안드로이드 가상기기를 생성해야 에뮬레이터가 제대로 동작한다.

안드로이드 가상기기는 AVD(Android Virtual Devices)라고 칭한다.

Android SDK를 찾을 수 없다는 에러가 뜨는 경우
 - 안드로이드 이클립스 플러그인 설치과정에서 SDK의 경로를 지정해 주지 않은 경우이다.
 -  window - preferences 실행 후 Android 선택 -> SDK Location에 해당 경로를 추가해준다.

안드로이드 가상기기 생성

1. window - Android SDK and AVD Manager 실행

2. Available Packages 선택한 후 자신이 원하는 버전의 플랫폼을 설치해 준다.
   (모두설치해도 상관없지만 이번 경우에는 최신버전인 API7을 모두 설치해 주었다.)

3. 선택후 우측하단의 Install Selected 클릭하여 설치한다.

4. 설치후 Android SDK and AVD Manager의 Virtual Devices 선택후 New 버튼을 누른다.

5. 다음과 같이 설정해 주었다. 이름은 마음껏 지정해도 되며 타겟은 자신이 원하는 것으로 하면 된다.
   SD 카드의 경우 그냥 1기가로 하였으며 나머지는 기본 세팅이다.

6. 설정후 화면이다. 필요한 만큼 생성하고 골라서 사용해도 된다.

7. 이제 설정한 AVD중 하나를 선택한 후 Start를 눌러주면~ 이런저런 창이 뜨다가 에뮬레이터가 뜨는것을 볼 수 있다. ^^

안드로이드 설치 관련 추천 블로그 : http://drkein.tistory.com/ (자세하게 설명되어 있네요 ^^)

[Android] 안드로이드 개발환경 구축하기

안드로이드의 경우 자바로 프로그램을 작성하며 개발환경 대부분도 자바기반으로 되어있다.

 

그러므로 개발하려는 PC에 해당 JDK(Java Development Kit)가 설치되어 있어야 한다.

 

안드로이드 SDK는 다음 사이트에서 다운 받을 수 있다.

 

각자 자신의 개발환경(윈도우즈, 맥OS, 리눅스)에 따라 파일을 다운받아 사용하도록 하자


JDK 다운로드

http://www.sun.com/download/index.jsp?cat=Java%20%26%20Technologies&tab=3&subcat=Java


안드로이드 SDK 다운로드

http://developer.android.com/sdk/index.html


이클립스 다운로드

http://www.eclipse.org/downloads/


 

* 환경 구성 과정


1. 해당 파일 다운로드


2. JDK 설치


3. 안드로이드 SDK의 경우 별도의 설치 과정이 없으므로 자신이 원하는 위치에 압축을 풀어둔다.


4. (windows 설치시) 환경변수에서 Path 항목을 찾아 tools 디렉토리 경로를 추가한다.

   (linux 설치시) ~/.bash_profile 또는 ~/.bashrc 파일을 열어 tools 디렉토리 경로를 PATH 환경변수에 추가한다.

   (Mac OS X 설치시) 사용자별 홈 디렉토리의 .bash_profile 파일을 열어 tools 디렉토리 경로를 PATH 환경변수에 추가한다.(없다면 생성후 추가)


5. 이클립스 설치 - 클래식 버전(다른버전도 큰 문제는 없을듯...), 마찬가지로 원하는 위치에 압축풀기.


6. 안드로이드 이클립스 플러그인 설치

    - 이클립스 실행 후 설치 관리자 (help-install new software) 실행

    - Add 버튼 클릭 후 항목 : Android       URL : http://dl-ssl.google.com/android/eclipse/ 추가.

    - Developer Tools 항목의 Android DDMS, Android Development Tools 항목 모두 설치.


7. 액티비티 실행 전 안드로이드 가상 기기(AVD) 생성 할것. 링크 : [AVD 생성하기]


8. 끝. ^^



예제 코드 다운로드 : http://apress.com/book/sourcecode


2010년 4월 20일 화요일

UX에 관하여

참 경계가 어려운게 ux 아닐까 한다.

디자인일까?

기술일까?

여전히 많은 사람들이 ux를 디자인이라고 보고 있는 지금

실질적으로 개발자들은 관심이 그닥 없는듯 하다.

뭐, 나역시 개발자긴하지만...

어쩌면 ux는 디자인도 아니고 기술이라고 할 수도 없는 그 중간의 것은 아닐까.

디자인을 아무리 이쁘게 해놔도 구현이 불가능한 디자인이면 필요가 없고

구현일 기똥차게 잘해도 디자인이 구리면 안팔리듯이..

 

그런 상업과 기술과 디자인의 애매하지만 꽤 멋질수 있는 하나의 블루오션이 아닐까 싶다~

꽤 많은 자료가 정리되어 있는 블로그이다.

 

그리고 ux적인 system idea에 대한 pdf를 첨부했다

읽어보도록 :) 꽤 유용한 자료에요 ㅎㅎㅎ돈주고 사야하지만 어찌어찌 구한자료

 

참고blog :: http://blog.naver.com/caerang?Redirect=Log&logNo=60353086

2010년 4월 13일 화요일

Java 관련 용어 정리

* JDK : Java Development Kit (Java 용 SDK(Software development kit))


* JAVA의 3가지 SDK
   1. J2ME (Micro-Edition) : Real-time, Phone, PDA 같은 AP 개발용.
   2. J2SE (Standard-Edition) : 일반적인 Java 개발 환경.
   3. J2EE (Enterprise-Edition) : Server-side 개발 환경.


* JDK 와 JRE

JDK : Java 개발자가 Java 기반 프로그램을 개발 할 수 있도록 컴파일러, 툴 등을 제공한다. (개발자용)

JRE(Java Runtime Environment) : Java 프로그램을 실행하기 위한 환경이다. (개발자, 사용자)


2010년 4월 11일 일요일

[매트랩] exp(j*n*pi)

exponential 그래프

1. exp(j*n*pi) , (-10 <= n <= 10 , n은 정수)

>> n = -10 : 1 : 10;
>> y = exp(j * n * pi);
>> plot(n,y);

* Warning: Imaginary parts of complex X and/or Y arguments ignored 발생함.

2010년 4월 6일 화요일

[Datasheet] MC33883

[Datasheet] : mc33883.pdf


[News] 거리 가로등이 통신 중계기로 변신 - 아이뉴스


거리 가로등이 통신 중계기로 변신
SK텔레콤, 친환경 네트워크 기술 개발
2010년 04월 06일 오전 09:39
강은성기자 esther@inews24.com

서울 근교 나들이 장소로도 유명한 경기도 가평군 가평읍. 그 읍내를 환하게 수놓는 가로등은 단순 조명이 아니다.

SK텔레콤이 구축한 이동통신 중계기이면서도 주변 환경과 조화를 이루고 야간조명으로도 사용할 수 있는 새로운 장치다.



SK텔레콤(대표 정만원)은 가평읍의 이같은 가로등형 중계기를 포함해 친환경 네트워크 기술을 대거 공개하고, 차세대 네트워크 구축에 활용함으로써 '그린 ICT' 환경 조성에 앞장서겠다고 6일 발표했다.

SK텔레콤은 최근 ▲가로등형 중계기 ▲저전력 증폭기(GaN 앰프) ▲고효율 태양광 중계기 ▲친환경 올인원 안테나 등 총 4종의 차세대 친환경 네트워크 기술 개발을 완료했다.

특히 SK텔레콤은 미관상 중계기 설치가 어려웠던 공원·아파트단지·도로변 등에 가로등형 중계기를 점진적으로 설치해 이동통신 영역을 확대하는 한편, 가로등을 필요로 했던 지역사회도 기여한다는 방침이다.

3월말 이동통신 중계기용으로 상용화에 성공한 저전력 증폭기(GaN앰프)는 질화갈륨 트랜지스터를 이용해 에너지 효율을 대폭 높여 중계기의 소모전력을 46%(1300W → 700W) 개선한 장비다.

이 장비는 세계 최초로 상용화된 제품으로써, 현재 구축된 중계기의 10%에 저전력 증폭기를 적용하면 연간 4천5백 톤의 이산화탄소 배출 저감 효과를 기대할 수 있다.

고효율 태양광 중계기는 기존 태양광전지에 저전력 소자를 적용하고 충/방전 알고리즘을 최적화하여 에너지 효율을 50% 향상시킨 장비로, 1개소당 연간 167Kg의 이산화탄소 배출 저감 효과가 기대된다.

4세대 이동통신에 적용할 수 있는 친환경 올인원 안테나는 다수의 작은 안테나를 조합해 하나의 안테나로 구성함으로써, 안테나 수를 줄이면서도 전파의 방사를 효율적으로 제어할 수 있다.

회사측은 미관 개선 및 소모전력 절감 효과를 얻을 수 있어 특히 빌딩이 많은 도심지역에 유용할 것으로 평가하고 있다.

SK텔레콤은 이번에 공개한 친환경 네트워크 기술을 빠르면 하반기부터 적용하여 차세대 네트워크 구축에 활용하고, 그린 네트워크를 위해 차세대 친환경 기술 개발에 박차를 가한다는 방침이다.

SK텔레콤 임종태 네트워크기술원장은 "가로등형 중계기와 저전력 증폭기 개발 성공을 토대로 친환경 기술 연구를 본격적으로 진행하고 있다"며 "환경과 기술이 자연스럽게 조화될 수 있도록 차세대 네트워크에 기술을 대폭 적용할 예정"이라고 밝혔다.

한편 SK텔레콤은 태양광과 풍력을 이용한 신재생에너지 기지국/중계기를 전력 공급이 어려운 국립공원 내 등산로, 도서지역 위주로 점진적으로 확대해 나갈 계획이다.

신재생에너지 기지국/중계기는 현재 십이동파도, 관탈도, 대관령옛길 등 전국 25개 국소에 설치되어, 등산객 및 조업어선의 비상통신용으로 도움을 주고 있다.


IT는 아이뉴스24, 연예스포츠는 조이뉴스24   <Copyright ⓒ 아이뉴스24. 무단전재 및 재배포 금지>
본 기사는 저작권법의 보호를 받으며 기사의 원형을 변형하거나 훼손하는 것을 금지합니다

[News] 천안함수색, 이 해저로봇이 있었다면 - ZDNet Korea

천안함수색, 이 해저로봇이 있었다면
이재구 국제과학전문기자 jklee@zdnet.co.kr 2010.04.06 / AM 11:50
[지디넷코리아]침몰한 천안함 수색에 이 로봇이 있었다면 더 빨리, 희생자없는 수색도 가능하지 않았을까?

씨넷이 5일(현지시간)소개한 이 로봇은 심해저에서 온도차에 따라 스스로 에너지를 공급하는 로봇이다. 해저 500미터까지 300회나 다이빙하면서 해저생물과 지형을 샅샅이 모니터하고 지도까지 만든다. 

 

보도에 따르면 미항공우주국(NASA·나사)를 비롯한 연구진들은 지난 해 11월부터 3개월간 하와이섬 인근 바다에서 이 심해저 자율로봇을 성공적으로 테스트한 데 이어 이를  다음단계의 해저실험에 투입했다고 말했다. 이 로봇은 오직 해저 수온변화에 의해서 에너지를 보급받아 가동돼 별도의 에너지공급도 필요없다.
▲ 나사가 개발한 심해저 로봇 솔로트렉이 바닷속에 투입되고 있다.
음파를 쏘아 해저의 모습을 그래픽으로 찍어내기도 하는 이 솔로트렉 로봇은 나사,미해군,샌디에이고해양연구소,샌디에이고대학(UCSD)이 공동 개발한 것이다.
이들 연구진은 솔로트렉이 전적으로 해저의 온도변화 에너지에 의해 가동되는 자율 로봇이라고 밝혔다. 

 

솔로트렉은 따뜻하고 얕은 지역에서 깊이에 따라 더 차가운 깊은 바다로 움직일때의 온도변화를 이용한다. 이 로봇은 상변화물질로 알려진 10개의 매끄러운 물질이 담긴 외부 관을 가지고 있다.
이 물질은 따뜻한 얕은 물에서는 녹아서 확산되며 깊은 물에서는 단단해지면서 수축한다.
따뜻한 수온에 의한 내부 물질 확대는 기기 내부의 기름을 압착해 수소모터를 움직이고 이는 솔로트렉배터리를 재충전하게 된다.

 

무게 87.5kg의 이 로봇 시스템은 부표제어와 과학적,GPS및 통신기기도 가동하면서 수심 500m까지 300번이상, 다이빙할 수 있다. 
▲ 심해저 로봇 솔로트렉이 3개월간 하와이 해변을 돌아다닌 궤적 지도 사진. 나사가 개발한 이 로봇은 지난해 11월부터 3개월간 심해저실험을 했다. (Credit: NASA/JPL/U.S. Navy/Scripps Institute of Oceanography)>
솔로 트렉을 공동 개발한 나사의 잭 존스는 “사람들은 소비 에너지보다도 더 많은 에너지를 생산해 내는 영구 기계를 꿈꿔왔다”면서 “이 시스템은 주변에너지를 소비하므로 진정한 영구기관은 아니지만 수명의 제한없는 에너지공급에 힘입어 지속적으로 해양 상태를 모니터할 수 있다”고 말했다.

 

원래 솔로트렉은 원형(프로토타입)상태로서 주임무는 과학자들에게 미래에 만들어질 연구선에 에너지를 공급하는 방법을 제공할 수 있는 가능성을 찾도록 도와주기 위해 고안됐다. 

 

그러나 나사는 이와 똑같은 기술이 바닷속을 돌아다니면서 기후데이터는 물론 해양생물을 모니터링하고 해저지형지도를 만들며, 해저감시까지 할 수 있는 로봇제조에도 사용될 수 있다고 말했다.


▶ 글로벌 IT의 중심 언론 <메가뉴스>
▶ IT뉴스는 <지디넷코리아>, 게임트렌드는 <게임스팟코리아>
▶ 스마트폰으로 읽는 실시간 IT뉴스 <모바일지디넷>
[저작권자ⓒ메가뉴스 & ZDNet & CNET. 무단전재 및 재배포 금지]

2010 UCC 페스티발(2010 UCC Festival)

행사명 : 2010 UCC 페스티발(2010 UCC Festival)

참가신청서(클릭)

개요 : 본 대회는 IT 분야에 대학교 학생이 한 팀이 되어 한백전자 제품을 활용한 창의적인 아이디어를 바탕으로 작품 개발자가 직접 제작한 콘텐츠를 발표합니다.

목적 : ㈜한백전자는 IT Convergence, Green IT, 지능형 로봇, LabVIEW,  RFID, USN, 임베디드시스템, 마이크로프로세서, DSP, FPGA, SoC, 기초전기전자, 광통신, 이동통신 등 다양 분야의 교육용 플랫폼을 개발하고 있습니다.  많은 학교에서 기자재로 활용하고 있는 장비를 이용하여 창의적인 아이디어를 바탕으로 한 작품을 발표하고 기술을 공유하기 위한 자리입니다.

제작 방법 
㈜한백전자 제품을 활용한 작품을 제작한 후 작품에 대한 설명을 동영상으로 제작하여 발표합니다.
동영상 발표는 10분이내 발표로 제작을 하며 반드시 지도교수님 메시지 넣어 주세요.(지도교수님 메시지는 격려, 축하, 조언 등 10초이상 들어갑니다.)

제출 방법

웹하드 제출 :  
www.webhard.co.kr 에 GUEST 폴더(올리기 전용)에 업로드 바랍니다.

아이디 : HANBACK2010
비밀번호 : hanback2010

(학교+이름.Zip)압축파일로 업로드 바랍니다.

제출파일

1. 작품동영상(작품 사이즈 1280x720 ,용량 2G 이내, 형식 AVI , 필히 10분 미만으로 제작바랍니다.)
2. 작품보고서(PPT)
3. 소스파일
4. 참가신청서
5. 동영상 첫화면 캡처후 제출 바랍니다


상금
㈜한백전자에 홈페이지 등록(1건 등록 시 10만원 지급)
2010년 총 1,000만원 지급예정


심사내용
창의적 아이디어 작품으로 ㈜한백전자 제품을 잘 활용한 작품이면 됩니다.
발표 된 내용은 재현이 가능해야 합니다. (소스 및 작품 설명 자세히 해 주세요.)


유의사항
제출된 작품은
http://kr.youtube.com/ 에 업로드 후 ㈜한백전자 홈페이지에 등록하여 작품을 공유합니다.
(회원 다운로드 가능하도록 합니다.)
기존에 발표된 내용과 유사한 경우 제외 하도록 합니다.
보내주신 소중한 자료는 뉴스레터에 소개하거나 별도의 책자 발행등에 활용할 수도 있습니다.
(출처 공지합니다.)

문의처
㈜한백전자 기획홍보부 042-610-1176~1177,
snp@hanback.co.kr 

2010 창의 설계 경진대회(CDF 2010)

행사명 : 2010 창의 설계 경진대회(CDF 2010)

대회 개요 : 본 대회는 IT 분야에 대학교 학생이 한 팀이 되어 한백전자 제품을 활용한 창의적인 아이디어를 바탕으로 작품을 출품하는 대회입니다.

대회 목적 : ㈜한백전자는 IT Convergence, Green IT, 지능형 로봇, LabVIEW,  RFID, USN, 임베디드시스템, 마이크로프로세서, DSP, FPGA, SoC, 기초전기전자, 광통신, 이동통신 등 다양 분야의 교육용 플랫폼을 개발하고 있습니다.  많은 학교에서 기자재로 활용하고 있는 장비를 이용하여 창의적인 아이디어를 바탕으로 한 작품을 발표하고 기술을 공유하기 위한 자리입니다.

일정( 2010년 3월 15일 ~ 2010년 11월 12일)

참가 접수

기간 : 2010년 3월 15일 ~ 10월 15일

방법 : 참가신청서(클릭) 작성하여
snp@hanback.co.kr 접수(1팀 4인 이하 구성, 참가 접수기간 중 접수하신 분께는 지속적으로 안내 드립니다.)

보고서 접수

기간 : 2010년 10월 25일 ~ 10월 29일 18시까지
방법 : 보고서(홈페이지 양식 다운) 작성하여
snp@hanback.co.kr 접수

최종 발표일시 : 2010년 11월 12일(금)
장소 및 발표 방법 등은 추후 최종보고서 합격자에 통보 함


시상내역

대상(1팀) : 상금 300만원
최우수상(2팀) : 상금 100만원(4년제, 전문대 각 1팀)
우수상(3팀) : 상금 50만원
장려상(3팀) : 상금 30만원
특별상(상장 및 부상) : 한국전자통신연구원장상, 대한전자공학회장상, 전자신문사장상,
한국컴퓨터정보학회장상
지정부문 특별상 : Core-A를 활용한 SoC기반의 응용 어플리케이션 및 하드웨어 IP개발


유의사항
심사위원 구성 : ㈜한백전자 주관기관 및 후원사 임직원으로 4인이상
심사내용 : 아이디어 창의력(25%), 작품완성도(25%), 실용성(25%), 제품활용성(25%)
제품활용성은 ㈜한백전자 제품을 적절하게 사용했는지에 대한 평가항목입니다.
기타 자세한 내용은 수시로 홈페이지에 공지 하도록 하겠습니다.


문의처
㈜한백전자 기획홍보부 042-610-1176~1177,
snp@hanback.co.kr 

2010년 4월 5일 월요일

[경진대회] 지능형 SoC 로봇워 2010

○ 대회명칭
  - 지능형 SoC 로봇워 2010
 
○ 참가팀 접수
  - 일정: 2010년 4월 1일 ~ 5월 31일
  - 참가자격: 대학(원)생을 포함한 2인 이상 6인 이하로 구성된 팀
  - 접수방법: 지능형 SoC 로봇워 홈페이지 => http://www.socrobotwar.org
  - 경기종목: "SoC Taekwon Robot", "HURO-Competition"
 
○ 사전설명회
  - 일정: 4월 초
  - 장소: 대전, 서울, 대구
  - 대회 및 SoC Platform 소개
 
○ 지능형 SoC 로봇워 설명회
  - 일정: 2010년 6월 초
  - 장소: 대전 KAIST
  - 대회운영 설명 및 SoC Platform 소개
 
○ 출전자격 TEST (Taekwon Robot)
  - 일정: 2010년 6월 말
  - 장소: 대전 KAIST
  - 방식: PC와 PC용 카메라(USB카메라)를 이용한 영상인식 S/W 제작 데모심사를 통해 본선 진출팀 선발
   * 영상인식 알고리즘, 인식물체의 난이도 및 인식률, S/W의 완성도 및 안정성을 평가)
  - 선발: 10팀 선발
 
○ 본선 진출팀 교육
  - 일정: 2010년 7월 초
  - 장소: 대전 KAIST
  - 대회에 제공되는 두뇌보드에 대한 이론/실습교육
  - 로봇에 대한 모션 프로그램 이론/실습교육
 
○ 본선대회
  - 일정: 2010년 10월 28일 ~ 31일
  - 장소: 일산 KINTEX
 
○ 문의
  - Tel. 042-350-8929
  - Fax. 042-350-8930
  - E-mail. socrobot@kaist.ac.kr
대회와 관련, 자세한 내용은 홈페이지를 참고하시기 바랍니다.
(위 내용은 사정에 따라 변경될 수 있음을 알려드립니다.)

[AVR] 16Bit_Timer1.h / 16Bit_Timer1.c

/******************************************************
**
** 16Bit_Timer1.h
**
** Version : 1.0
** Target : ATmega128
** Created : 2010.01.15
** Author : Chang-Su Lee (ELCO Kookmin Univ.)
** Reference : Datasheet
**
******************************************************/


#ifndef __16BIT_TIMER1_H__
#define __16BIT_TIMER1_H__

void Counter1_Init();
unsigned int Counter1_Get_Value();

void Timer1_CTC_Init();
void Timer1_CTC_Control(unsigned char flag); // Compare match 인터럽트 인에이블
void Timer1_CTC_SetTimer(unsigned int top);

void Timer1_PC_PWM_Init(); // TOP가 ICR1인 모드 (OC1A, OC1B, OC1C 모두에서 PWM출력 가능)
void Timer1_PC_PWM_Set_TOP(unsigned int top);
void Timer1_PC_PWM_Set_OC1A_Duty(unsigned int Duty);
void Timer1_PC_PWM_Set_OC1B_Duty(unsigned int Duty);
void Timer1_PC_PWM_Set_OC1C_Duty(unsigned int Duty);

void Timer1_Fast_PWM_Init(); // TOP가 ICR1인 모드 (OC1A, OC1B, OC1C 모두에서 PWM출력 가능)
void Timer1_Fast_PWM_Set_TOP(unsigned int top);
void Timer1_Fast_PWM_Set_OC1A_Duty(unsigned int Duty);
void Timer1_Fast_PWM_Set_OC1B_Duty(unsigned int Duty);
void Timer1_Fast_PWM_Set_OC1C_Duty(unsigned int Duty);

void Timer1_PFC_PWM_Init(); // TOP가 ICR1인 모드 (OC1A, OC1B, OC1C 모두에서 PWM출력 가능)
void Timer1_PFC_PWM_Set_TOP(unsigned int top);
void Timer1_PFC_PWM_Set_OC1A_Duty(unsigned int Duty);
void Timer1_PFC_PWM_Set_OC1B_Duty(unsigned int Duty);
void Timer1_PFC_PWM_Set_OC1C_Duty(unsigned int Duty);

#endif








/*******************************************************
**
** 16Bit_Timer1.c
**
** Version : 1.0
** Target : ATmega128
** Created : 2010.01.15
** Author : Chang-Su Lee (ELCO Kookmin Univ.)
** Reference : Datasheet
**
******************************************************/


#include <avr/io.h>
#include "16Bit_Timer1.h"

/*********************************************************
** 모드: Normal모드
** 기능: 카운트 값의 클리어가 카운팅 동작 중에는 이루어 지지 않기 때문에 항상 최대값 0xFFFF까지
** 카운팅을 수행한 후 다시 0x0000부터 카운팅을 수행하게 된다. 또한 0xFFFF에서 0x0000으로
** 바뀌는 순간에 Overflow인터럽트가 발생하게 된다.
** 단순하게 증가하는 타이머/카운터이므로 외부에서 입력되는 펄스 수를 세는 카운터 동작으로
** 사용하는데 적합하다.
*********************************************************/


void Counter1_Init()
{
TCCR1A = 0x00; // COM1A1 = 0,COM1A0 = 0,COM1B1 = 0,COM1B0 = 0,COM1C1 = 0,COM1C0 = 0,WGM11 = 0,WGM10 = 0
// PWM출력핀인 OC1A~OC1C의 상태는 COM1A1~COM1C0의 레지스터들로 설정한다.
TCCR1B = 0x06; // ICNC1 = 0,ICES1 = 0, 0,WGM13 = 0,WGM12 = 0,CS12 = 1,CS11 = 1,CS10 = 0
// ICNC1과 ICES1 레지스터는 입력캡쳐 기능을 설정하는 레지스터이다. 이는 어떤신호가 해당
// 핀으로 들어오면 타이머의 값을 ICR1레지스터에 저장시키는 기능이다.
// CS12, CS11, CS10레지스터는 프리스케일러의 분주비를 선택하는 기능이다. (clk/256)

TCCR1C = 0x00; // FOC1A = 0,FOC1B = 0,FOC1C = 0, 0, 0, 0, 0, 0
// 이 레지스터는 강제로 비교매치가 된 것과 같은 출력을 내보낸다. PWM 모드가 아닌 경우에만
// 유효하다. 특별한 경우가 아니라면 이비트는 0으로 둔다.
TIMSK &= 0xC3; // OCIE2 = 0,TOIE2 = 0,TICIE1 = 0, OCIE1A = 0, OCIE1B = 0,TOIE1 = 0,OCIE0 = 0,TOIE0 =0
// 타이머/카운터 인터럽트를 개별적으로 허용하는 기능을 수행하는 레지스터이다.
TIFR = 0x00; // OCF2 = 0,TOV2 = 0,ICF1 = 0,OCF1A = 0,OCF1B = 0,TOV1 = 0,OCF0 = 0, TOV0 = 0
// 인터럽트 플랙 레지스터이다.
ETIMSK &= 0xFE; // 0, 0,TICIE3 = 0, OCIE3A = 0,OCIE3B = 0, TOIE3 = 0,OCIE3C = 0, OCIE1C = 0
// TIMSK와 같은 기능이다.
ETIFR = 0x00; // 0, 0,ICF3 = 0,OCF3A = 0,OCF3B = 0,TOV3 = 0,OCF3C = 0,OCF1C = 0
// TIFR과 같은 기능이다.
SFIOR = 0x00; // TSM = 0, 0, 0, 0, ACME = 0,PUD = 0, PSR0 = 0,PSR321 = 0
// 프리스케일러를 리셋시키는 기능의 레지스터이다. 특별한 경우가 아니라면 0으로 둔다.
}

unsigned int Counter1_Get_Value()
{
return (TCNT1H<<8)+TCNT1L;
}

/***************************************************************
** 모드: CTC(Clear Timer on Compare Match)모드 (TOP이 OCR1X인 모드이다.)
** 기능: 이 모드에서는 타이머/카운터 레지스터의 값이 출력비교 레지스터 OCR1X의 값과 일치하면 그 다음
** 클럭 사이클에서 0으로 클리어된다. 따라서, 이모드에서는 클록 입력에 의하여 타이머/카운터
** 레지스터의 값이 항상 0x0000~OCR1의 범위에서 계수동작이 반복되며, TCNT1의 값이 증가하다가 OCR1X
** 레지스터 값과 같게 되면 그 다음 주기에 출력비교 인터럽트가 요청된다.
**************************************************************/


void Timer1_CTC_Init()
{
TCCR1A = 0x00; // COM1A1 = 0,COM1A0 = 0,COM1B1 = 0,COM1B0 = 0,COM1C1 = 0,COM1C0 = 0,WGM11 = 0,WGM10 = 0
// PWM출력핀인 OC1A~OC1C의 상태는 COM1A1~COM1C0의 레지스터들로 설정한다.
TCCR1B = 0x0C; // ICNC1 = 0,ICES1 = 0, 0,WGM13 = 0,WGM12 = 1,CS12 = 1,CS11 = 0,CS10 = 0
// ICNC1과 ICES1 레지스터는 입력캡쳐 기능을 설정하는 레지스터이다. 이는 어떤신호가 해당
// 핀으로 들어오면 타이머의 값을 ICR1레지스터에 저장시키는 기능이다.
// CS12, CS11, CS10레지스터는 프리스케일러의 분주비를 선택하는 기능이다. (clk/256)
TCCR1C = 0x00; // FOC1A = 0,FOC1B = 0,FOC1C = 0, 0, 0, 0, 0, 0
// 이 레지스터는 강제로 비교매치가 된 것과 같은 출력을 내보낸다. PWM 모드가 아닌 경우에만
// 유효하다. 특별한 경우가 아니라면 이비트는 0으로 둔다.

SFIOR = 0x00; // TSM = 0, 0, 0, 0, ACME = 0,PUD = 0, PSR0 = 0,PSR321 = 0
// 프리스케일러를 리셋시키는 기능의 레지스터이다. 특별한 경우가 아니라면 0으로 둔다.
TIMSK &= 0xEF; // OCIE2 = 0,TOIE2 = 0,TICIE1 = 0, OCIE1A = 0, OCIE1B = 0,TOIE = 0,OCIE0 = 0,TOIE0 =0
// 타이머/카운터 인터럽트를 개별적으로 허용하는 기능을 수행하는 레지스터이다.
TIFR = 0x00; // OCF2 = 0,TOV2 = 0,ICF1 = 0,OCF1A = 0,OCF1B = 0,TOV1 = 0,OCF0 = 0, TOV0 = 0
// 인터럽트 플랙 레지스터이다.
}

void Timer1_CTC_Control(unsigned char flag) // Compare match 인터럽트 인에이블
{
if( flag )
TIMSK |= 0x10; // OCR1A의 인터럽트 Enable (조정하여 OCR1B, OCR1C 도 Enable시킬수 있다.)
else
TIMSK &= 0xEF; // Disable
}

void Timer1_CTC_SetTimer(unsigned int top)
{
OCR1A = top;
}

/**********************************************************
** 모드: Phase Correct PWM모드
** 기능: PC PWM 모드는 높은 분해능의 PWM 출력 파형을 발생하는데 유용하다. 이 동작 모드에서는 타이
** 머/카운터 레지스터의 계수동작이 상향 카운터로서 0x0000~TOP까지 증가하였다가 다시 하향 카운터
** 로서 TOP~0x0000으로 감소하는 동작을 반복적으로 수행한다.
** ICR1을 TOP로 사용하는 모드는 캡쳐기능을 사용할 수 없고 OCR1A를 TOP로 사용하는 모드는
** PWM을 OC1B, OC1C 두 핀으로만 출력할 수 있다.
**************************************************************/


void Timer1_PC_PWM_Init() // TOP가 ICR1인 모드 (OC1A, OC1B, OC1C 모두에서 PWM출력 가능)
{
TCCR1A = 0xAA; // COM1A1 = 1,COM1A0 = 0,COM1B1 = 1,COM1B0 = 0,COM1C1 = 1,COM1C0 = 0,WGM11 = 1,WGM10 = 0
// PWM출력핀인 OC1A~OC1C의 상태는 COM1A1~COM1C0의 레지스터들로 설정한다.
TCCR1B = 0x14; // ICNC1 = 0,ICES1 = 0, 0,WGM13 = 1,WGM12 = 0,CS12 = 1,CS11 = 0,CS10 = 0 (clk/256)
// ICNC1과 ICES1 레지스터는 입력캡쳐 기능을 설정하는 레지스터이다. 이는 어떤신호가 해당
// 핀으로 들어오면 타이머의 값을 ICR1레지스터에 저장시키는 기능이다.
// CS12, CS11, CS10레지스터는 프리스케일러의 분주비를 선택하는 기능이다.
TCCR1C = 0x00; // FOC1A = 0,FOC1B = 0,FOC1C = 0, 0, 0, 0, 0, 0
// 이 레지스터는 강제로 비교매치가 된 것과 같은 출력을 내보낸다. PWM 모드가 아닌 경우에만
// 유효하다. 특별한 경우가 아니라면 이비트는 0으로 둔다.

SFIOR = 0x00; // TSM = 0, 0, 0, 0, ACME = 0,PUD = 0, PSR0 = 0,PSR321 = 0
// 프리스케일러를 리셋시키는 기능의 레지스터이다. 특별한 경우가 아니라면 0으로 둔다.
DDRB |= 0xE0;
}

void Timer1_PC_PWM_Set_TOP(unsigned int top)
{
ICR1 = top;
}

void Timer1_PC_PWM_Set_OC1A_Duty(unsigned int Duty)
{
OCR1A = Duty;
}

void Timer1_PC_PWM_Set_OC1B_Duty(unsigned int Duty)
{
OCR1B = Duty;
}

void Timer1_PC_PWM_Set_OC1C_Duty(unsigned int Duty)
{
OCR1C = Duty;
}

/**********************************************************
** 모드: Fast PWM모드
** 기능: Fast PWM모드는 높은 주파수의 PWM 출력 파형을 발생하는데 유용하다. 이 동작 모드에서는
** 타이머/카운터 레지스터 TCNT1의 계수동작이 항상 0x0000~TOP의 범위에서 증가
** 하는 방향으로만 반복적으로 수행되며, 이때 타이머/카운터 레지스터 TCNT1의 값은 항상 출력비교
** 레지스터 OCR1의 값과 비교되어 OC1X, 의 출력신호를 변형시킨다.
** ICR1을 TOP로 사용하는 모드는 캡쳐기능을 사용할 수 없고 OCR1A를 TOP로 사용하는 모드는
** PWM을 OC1B, OC1C 두 핀으로만 출력할 수 있다.
** OCR1X의 값을 바꾸는 순간 비대칭 파형을 발생하기 때문에 듀티를 자주 바꿔줄 필요가 있을때
** 이모드는 적합하지 않다.
**************************************************************/


void Timer1_Fast_PWM_Init() // TOP가 ICR1인 모드 (OC1A, OC1B, OC1C 모두에서 PWM출력 가능)
{
TCCR1A = 0xAA; // COM1A1 = 1,COM1A0 = 0,COM1B1 = 1,COM1B0 = 0,COM1C1 = 1,COM1C0 = 0,WGM11 = 1,WGM10 = 0
// PWM출력핀인 OC1A~OC1C의 상태는 COM1A1~COM1C0의 레지스터들로 설정한다.
TCCR1B = 0x1C; // ICNC1 = 0,ICES1 = 0, 0,WGM13 = 1,WGM12 = 1,CS12 = 1,CS11 = 0,CS10 = 0 (clk/256)
// ICNC1과 ICES1 레지스터는 입력캡쳐 기능을 설정하는 레지스터이다. 이는 어떤신호가 해당
// 핀으로 들어오면 타이머의 값을 ICR1레지스터에 저장시키는 기능이다.
// CS12, CS11, CS10레지스터는 프리스케일러의 분주비를 선택하는 기능이다.
TCCR1C = 0x00; // FOC1A = 0,FOC1B = 0,FOC1C = 0, 0, 0, 0, 0, 0
// 이 레지스터는 강제로 비교매치가 된 것과 같은 출력을 내보낸다. PWM 모드가 아닌 경우에만
// 유효하다. 특별한 경우가 아니라면 이비트는 0으로 둔다.

SFIOR = 0x00; // TSM = 0, 0, 0, 0, ACME = 0,PUD = 0, PSR0 = 0,PSR321 = 0
// 프리스케일러를 리셋시키는 기능의 레지스터이다. 특별한 경우가 아니라면 0으로 둔다.
DDRB |= 0xE0;
}

void Timer1_Fast_PWM_Set_TOP(unsigned int top)
{
ICR1 = top;
}

void Timer1_Fast_PWM_Set_OC1A_Duty(unsigned int Duty)
{
OCR1A = Duty;
}

void Timer1_Fast_PWM_Set_OC1B_Duty(unsigned int Duty)
{
OCR1B = Duty;
}

void Timer1_Fast_PWM_Set_OC1C_Duty(unsigned int Duty)
{
OCR1C = Duty;
}

/**************************************************************
** 모드: Phase and Frequency Correct PWM모드
** 기능: Phase Correct PWM모드와 매우 유사하며 출력비교 레지스터가 삼각파의 저점에서 갱신되므로
** 이를 수정하여 듀티비를 가변하거나 PWM의 주기를 변경하더라도 항상 대칭적인 PWM 출력을
** 발생하게 되는 장점을 가진다. 따라서 이 모드는 PWM 출력의 듀티비와 스위칭 주파수를 모두 변경
** 하여야 하는 응용에 적합하다.
***********************************************************/


void Timer1_PFC_PWM_Init() // TOP가 ICR1인 모드 (OC1A, OC1B, OC1C 모두에서 PWM출력 가능)
{
TCCR1A = 0xA8; // COM1A1 = 1,COM1A0 = 0,COM1B1 = 1,COM1B0 = 0,COM1C1 = 1,COM1C0 = 0,WGM11 = 0,WGM10 = 0
// PWM출력핀인 OC1A~OC1C의 상태는 COM1A1~COM1C0의 레지스터들로 설정한다.
TCCR1B = 0x14; // ICNC1 = 0,ICES1 = 0, 0,WGM13 = 1,WGM12 = 0,CS12 = 1,CS11 = 0,CS10 = 0 (clk/256)
// ICNC1과 ICES1 레지스터는 입력캡쳐 기능을 설정하는 레지스터이다. 이는 어떤신호가 해당
// 핀으로 들어오면 타이머의 값을 ICR1레지스터에 저장시키는 기능이다.
// CS12, CS11, CS10레지스터는 프리스케일러의 분주비를 선택하는 기능이다.
TCCR1C = 0x00; // FOC1A = 0,FOC1B = 0,FOC1C = 0, 0, 0, 0, 0, 0
// 이 레지스터는 강제로 비교매치가 된 것과 같은 출력을 내보낸다. PWM 모드가 아닌 경우에만
// 유효하다. 특별한 경우가 아니라면 이비트는 0으로 둔다.

SFIOR = 0x00; // TSM = 0, 0, 0, 0, ACME = 0,PUD = 0, PSR0 = 0,PSR321 = 0
// 프리스케일러를 리셋시키는 기능의 레지스터이다. 특별한 경우가 아니라면 0으로 둔다.
DDRB |= 0xE0;
}

void Timer1_PFC_PWM_Set_TOP(unsigned int top)
{
ICR1 = top;
}

void Timer1_PFC_PWM_Set_OC1A_Duty(unsigned int Duty)
{
OCR1A = Duty;
}

void Timer1_PFC_PWM_Set_OC1B_Duty(unsigned int Duty)
{
OCR1B = Duty;
}

void Timer1_PFC_PWM_Set_OC1C_Duty(unsigned int Duty)
{
OCR1C = Duty;
}