페이지

글목록

2016년 3월 26일 토요일

[try_term] c#으로 통신 터미날 만들기 #3

안녕하세요, 다시 시간이 조금 나서 C# 공부를 시작했습니다.

오랜만에 다시하니 또 다 까먹어서 힘드네요.

이번에는 예전에 main 창에서 메뉴의 "시리얼포트"를 눌렀을 때, Connection 창을 1개 뜨도록 했는데
이 Connection창에서 여러가지 동작을 추가해 보겠습니다.

먼저 창이 뜨는데 까지는 예전 글에서 다뤘는데, 창이 뜰 때 기본으로 실행하는 함수인 xxx_Load() 함수를 만들어 보겠습니다.
오랜만에 다시 해서 또 다시 소스 파일에 코드를 직접 입력하는 우를 범해서 아무리 실행해도 초기화가 안되더군요.


다시 한 번 기억해야 겠습니다.
Load 함수는 반드시 전체 창을 선택해서 더블클릭이나 Enter Key를 눌러야 자동으로 생성되어 동작한다는 점을..


       private void frmConnection_Load(object sender, EventArgs e)
        {
        }

다음으로 콤보박스의 항목(Item) 리스트를 입력하고 그 중에 디폴트로 어떤 값을 선택하는 방법을 다뤄 보겠습니다.
1. 먼저 항목 리스트를 입력할 콤보박스를 선택하고 마우스로 우클릭을 합니다.

2. 항목 편집을 클릭하면 편집 창이 뜹니다.

3. 편집 창에 1줄에 1 항목씩 텍스트를 입력합니다.

4. 실행 시 입력한 항목들이 나타나고, 이것을 선택 할 수 있습니다.


5. 그러면 처음 실행시 여러 항목들 중, 기본(디폴트)으로 특정 항목을 선택해서 보여주려면 어떻게 할까요?
선택한 콤보박스의 파라메터 중 SelectedIndex 라는, 항목을 선택하는 것이 있습니다.
아까 만들었던 Load 함수 안에 각각의 콤보박스의 SelectedIndex 값에 처음 시작시 사용할 항목의 인덱스를 넣어주면 됩니다.
인덱스의 시작은 0 입니다.


        private void frmConnection_Load(object sender, EventArgs e)
        {
            // 사용가능한 시리얼 포트 얻기
            try
            {
                cbPortName.Items.AddRange(SerialPort.GetPortNames());
            }
            catch { }

            if (cbPortName.Items.Count > 0)
                cbPortName.SelectedIndex = 0;  // 컴포트 정보가 없을 경우 컴포트의 0번째를 사용


            cbBaudRates.SelectedIndex = 7;
            cbDataBit.SelectedIndex = 1;
            cbParityBit.SelectedIndex = 0;
            cbStopBit.SelectedIndex = 0;
            cbFlowControl.SelectedIndex = 2;

        }



다음으로 c# 초보라서 엄청 헤맨 것이 1개 있습니다.
마우스로만 '확인' 버튼을 눌러야 마무리 과정을 거쳐 창을 닫는데, 콤보박스에 항목을 선택하고 Enter 키를 눌렀을 때도
확인 버튼을 누른 것과 같이 동작하도록 해 보겠습니다.
xxx_KeyUp() 이라는 함수가 있는데, 키가 눌렸다가 떨어질 때 발생하는 이벤트에 의해 동작하는 함수입니다.
이 함수를 이용하여 특정 콤포넌트에서 키가 떨어졌을 때, 해당 함수가 생행되는 원리 입니다.
이 함수 내에서 키가 Enter 키인지를 체크해서 '확인' 버튼이 눌렸을 때의 동작을 강제로 실행하게 합니다.


        private void cbPortName_KeyUp(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter) btnOk.PerformClick();
        }
        private void cbBaudRates_KeyUp(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter) btnOk.PerformClick();
        }
        private void cbDataBit_KeyUp(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter) btnOk.PerformClick();
        }
        private void cbParityBit_KeyUp(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter) btnOk.PerformClick();
        }
        private void cbStopBit_KeyUp(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter) btnOk.PerformClick();
        }
        private void cbFlowControl_KeyUp(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter) btnOk.PerformClick();
        }
        private void tb_DelayCh_KeyUp(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter) btnOk.PerformClick();
        }
        private void tb_DelayLine_KeyUp(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter) btnOk.PerformClick();
        }


그런데 여기서부터가 문제였습니다. 아무리 Enter 키를 눌러도 생각한데로 동작이 안되는 것입니다.
원인은 이벤트와 함수가 연결되어있지 않아서 였습니다.

이 함수에 이벤트를 연결하려면, 
1. 디자인 파일탭으로 가서 해당 콤포넌트의 속성 창의 이벤트 아이콘을 클릭합니다.

2. '키' 항목의 KeyUp 의 우측 파라메터에서 선택한 콤포넌트에 해당하는, 아까 소스코드에 만들어 놓았던 xxx_KeyUp() 함수를 선택해 줍니다.


3. 그리고 나서 빌드하고 실행해 보면 잘 동작합니다. (휴.. 이건 제가 아무리 구글 검색을 해봐도 못 찾아서 자체 노동력으로 해결했습니다)


마지막으로 시리얼 포트에 대한 내용을 맛보기로 하나 다뤄 보겠습니다.
포트 이름은 현재 있는 포트내에서 선택을 해야 되기 때문에, 아얘 없을 수도 있고 매번 이름이 달라서,
현재 존재하는 포트이름을 스캔해서 표시해야 합니다.
SerialPort.GetPortNames() 함수를 이용해서 현재 포트 이름들을 가져옵니다.
Load 함수에서 이 함수를 이용해서 포트이름을 나타내는 콤보박스에 포트들을 정렬해서 리스트 항목에 넣어 표시합니다.

코드 예제)


        private void frmConnection_Load(object sender, EventArgs e)
        {
            // 사용가능한 시리얼 포트 얻기
            try
            {
                cbPortName.Items.AddRange(SerialPort.GetPortNames());
            }
            catch { }

            if (cbPortName.Items.Count > 0)
                cbPortName.SelectedIndex = 0;  // 컴포트 정보가 없을 경우 컴포트의 0번째를 사용


            cbBaudRates.SelectedIndex = 7;
            cbDataBit.SelectedIndex = 1;
            cbParityBit.SelectedIndex = 0;
            cbStopBit.SelectedIndex = 0;
            cbFlowControl.SelectedIndex = 2;

        }

[dialog] 생산라인툴(PLT:Product Line Tool) 소개

dialog 칩의 양산시 다운로드 툴인 PLT 를 소개합니다.

처음에, '이게 도대체 뭐하는 물건인고?' 생각 했는데 아주 괜찮은 툴인것 같습니다.
위 그림에서 10-PIN Header 가 16개 있는데, 이곳에 DA14xxx 제품을 연결해서 동시에 다운로드가 가능합니다.

이 10-PIN Header 에 연결되는 제품을 메뉴얼에서는 DUT(Device Under Test)라고 부릅니다.

핀 연결은 다음과 같습니다.
다이얼로그 툴인 Smartsnippets 를 써 보신분은 아시겠지만, 
JTAG가 없어도 UART로 SPI,I2C,OTP,RAM 에 프로그램이 가능합니다.

그와 마찬가지의 원리로 PLT는 USB to 16 x UART 와 몇 개의 GPIO 출력으로 다이얼로그 DA14xxx 제품에
프로그램을 다운로드 가능하고, X-TAL 의 Calibration , RF Verify 작업도 가능합니다.

추가적인 기능으로, 보드 어드레스의 시작 번지를 지정해주면 각 제품을 다운로드 할 때마다 어드레스가 
1씩 Count Up 되면서 구워집니다.

위의 그림에서 보시면 총 7개의 핀이 연결되는데, 
메뉴얼을 보면 XTAL Calibration Pulse 핀은 UART RX 핀으로 대체 가능하므로 총 6개의 핀만 있으면 됩니다.
또, OTP에 프로그램할 것이 아니라면 VPP 도 필요없죠.(5PIN?)

툴과 DUT의 핀연결표는 다음과 같습니다. 



그런데, UART TX/RX 는 특정 핀을 사용해야 하는지? 를 다이얼로그에 문의해 본 결과 
P0.4 (TXD),P0.5(RXD)로 사용해야 한답니다.

다음 그림이 SPI FLASH 메모리와 UART 핀을 같이 사용하는 회도도 예입니다.

다이얼로그사에 PLT 관련해서 메일로 문의했던 내용을 올려봅니다.

라인툴(PLT : Product Line Tool)을 아직 구입 전인데회로도를 라인툴과 연결할 것을 예상하여 설계하려고 합니다.
저희 회사에서는 현재 SPI 외부 메모리를 사용하는 DA14580 DSPS 프로파일을 사용하고 있고,
또 다른 용도의 장치에서는 DSPS의 프로그램을 조금 고쳐서 SPI FLASH 의 부팅시 쓰는 영역를 제외한안 쓰는 부분을 데이터 메모리로 사용도 하고 있습니다.

RX  MISO  같이 사용, CTS  MOSI  같이 사용. PLT(Product Line Tool) 사용하고자  ,
URX,UTX J1 헤더에 (외부 SPI FLASH  부팅하고, UART  사용하는 DSPS 회로도 #1) 같이 연결해서 SPI FLASH 또는 OTP  데이터를 Read/Write.

(예상 문제 : DA14580 F/W 동작할 외부 SPI FLASH 최초 부팅 이미지 로딩 기능 외에도 데이터메모리의 용도로 읽고 쓰는 경우 URX,CTS 쓰레기 데이터가 들어올  있다.)

따라서 다음과 같이 회로(외부 SPI FLASH  부팅하고, UART  사용하는 DSPS 회로도 #2) 연결하려고하는데,
아직 라인툴을 구입 전이라서 UTX,URX  포트를 이동해도 괜찮은지 묻고 싶습니다.
UART 부팅하는 경우는 없어서 P0.4,P0.5   맞춰서 연결할 필요는 없다고 생각이 듭니다.

부팅  데이터메모리용도의 SPI FLASH 메모리와 UART  사용하는 DA14580 DSPS 프로그램에 라인툴을 연결할 어떻게 최적의 포트 연결을 하는지 도움 요청 드립니다.



 한가지 질문 드립니다.

라인툴 매뉴얼을 보니 위의 연결 예제 회로가 있는데위의 4k7 풀다운 저항을 라인툴과 DUT (ex:DA14580 DSPS 장치)
연결을 해야하는 건가요?

또한밑의 Anti Ringing Solution  선택 사항인  같습니다만,
/아래 회로 예를   적용을 하자면 다음과 같이 DA14580  (DUT) 회로도 작성하면 될까요?

답변)
저희 Reference PLT (production line tool) 또는 EVK  통해 code download시에 특별하게 UART Rail  SPI rail 겹쳐 있으셔도 문제가되지 않으십니다.

1) UART I/F  통해 PLT  DA14580 통신시 SPI memory down (CS port low setting) 되어 High impedance 유지됨으로 Flash memory영향을 받지 않습니다.

2) 또한 DA14580 Flash memory 와의 I/F (Write or Read)  UART에는 영향을 받지 않습니다.  

3) DA14580 PLT  첨부파일에 적용된 회로도 대로 만들어 졌습니다현재 팀장님 회로도와 저희 Reference (DA14580+External flash memory) 회로도가 동일합니다.  

2016년 3월 21일 월요일

[dialog] DSPS 통신 관련 이모저모? ^^

안녕하세요, 오랜만입니다.

회사일이 너무 많아서, 글을 못 썼습니다. 쓰고 싶은 내용은 너무 많은데, 시간이 안나네요. ^^

요새, 스마트 도어락을 개발 의뢰를 받는 바람에, 
PSOC4 의 터치키 와 Proximity Sensor(터치 키의 일종인데 50cm 가량의 거리에서 사람의 접근을 감지) 를 회로설계하고,
433MHz RF Transceiver I/F , CC430F5137(MSP430 CPU+ RF Transceiver) , DA14583 DSPS Profile , NFC 리더 IC 등등을
일단 회로 설계를 하고 아트웍까지 직접하는 바람에 1주일을 거의 밤새고 이제 겨우 끝났습니다.

그리고 나니, 회사 Flexible LED Sign 제품의 프로그램을 Update 해봤습니다.
이번에 Update 한 내용은 DA14583 으로 DSPS를 구현해서 ARM 칩에 붙이고, 예전에 개발 외주를 맡겼던
스마트폰용 앱으로 LED sign 에 여러가지 명령을 전송하고 응답을 받는 내용입니다.

현재, DSPS 를 통해 흐름제어 없이 스마트폰으로부터 X-modem 프로토콜로 SPI FLASH 메모리에 쓰기 포함해서 
약 3-MByte 의 데이터를 약 10KByte/sec 의 속도로 전송이 가능했습니다. 

앱개발자의 말에 따르면 간간이 딜레이를 넣어서 DA14583의 FIFO가 Overflow 되지 않게 하여 HW 흐름제어 없이도 동작이 가능했다고 합니다.

뭐 일반 명령어 쯤이야 아무런 문제가 안되는데, 대용량 데이터를 흐름제어 없이도 정확하게 송수신이 가능하다는 점을 말씀드리고자  합니다.

잠깐 저희 회사 현재 개발중인 LED sign 소개해 볼까요? ^^;
2.5mm 두께에, 
SPI FLASH(128Mbit)에 다이얼로그 칩의 DSPS 프로파일로 스마트폰으로부터 이미지를 다운받아서 
풀칼라 LED 32 x 32 사이즈를 최대 98Hz로 디스플레이 합니다.
다이얼로그 DSPS 를 통해서 스마트폰으로 각종 제어도 가능합니다.
아, 이번엔 인조가죽에 플렉시블 LED를 적용해 봤습니다. ^^

동영상을 나중에 한번 올려 볼텐데, 일단 사진 자료만 올려 봅니다.





2016년 3월 7일 월요일

[try_term] c#으로 통신 터미날 만들기 #2

지난 번 폼 만들기에 이어서, 마지막에 추가해서 만들었던 폼을 수정해 봤습니다.

테라텀(Tera Term)의 시리얼 포트 설정를 모델로 삼아 폼을 똑같이 만들어 봤습니다.



위의 새로 만든 frmConnection.cs [디자인] 은 도구상자에서 다음과 같은 폼들을 사용해서 만들었습니다.



이제 프로그램을 실행했을 때, 메인 Form 의 메뉴에서 설정->시리얼 포트(S) 를 클릭하면 위의 포트설정 창이 뜨도록 해 보겠습니다. 


먼저 frmMain.cs[디자인] 탭으로 가서, 메뉴의 설정->시리얼포트(S) 를 더블 클릭하합니다.





설정->시리얼포트(S) 를 더블 클릭하면 private void 시리얼포트ToolStripMenuItem_Click() 함수가 자동으로 frmMain.cs 파일에 생깁니다. 자세한 위치는 다음과 같습니다.



frmConnection m_ClassConnection = new frmConnection();
frmConnection 타입의 객체 m_ClassConnection 을 만듭니다.

그리고 나서 private void 시리얼포트ToolStripMenuItem_Click() 함수 안에 윈도우 창을 여는 함수를 넣어 줍니다.
(참고로 현재 문법이 많이 딸려서 설명이 좀 안됩니다. ^^)


(코드)
namespace try_term
{
    public partial class frmMain : Form
    {
        frmConnection m_ClassConnection = new frmConnection();
        public frmMain()
        {
            InitializeComponent();
        }

        private void 시리얼포트ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            m_ClassConnection.ShowDialog();
        }
    }
}

위와 같이 코드를 추가하고, 실행했을 때.. 메뉴의 설정->시리얼 포트를 클릭하니까 시리얼 포트 설정 창이 떴음을 확인했습니다.



그리고, C# 을 오늘 연습하다 한참 해멘 것이 있었습니다.
이 프로그램을 실행하자 마자, 시리얼포트 설정창을 뜨게 해 보려고 했는데...
분명히 제대로 한 것 같은 데 생각대로 안됐었습니다.

그 이유는,  제가 예제 소스만을 보고 frmMain_Load() 함수를 코드를 직접 쳐서 넣었는데,
frmMain_Load() 함수는 컴파일러에 의해서 자동으로 만들어 지는 함수였습니다.


이 함수는 frmMain.cs[디자인] 탭에서 윈도우 창의 대가리를 더블클릭 하면 생성됩니다.



Load 이벤트 함수는, 절대 코드를 예제 보고 쳐 넣으면 안되는 것이네요. 2시간 헤맸네요. ㅜㅜ



이 함수를 Load 이벤트 함수라고도 하는데, 일반 함수가 아닌 특수한 의미의 함수입니다.
폼이 생성될 때, 처음으로 실행되는 함수가 load 이벤트 함수이므로, 이 함수 안에 m_ClassConnection.ShowDialog(); 코드를 넣어 주면 되겠죠? ^^

수정한 프로그램을 실행 시켰더니, 처음에 먼저 시리얼포트 설정 창이 뜨고, 이 참을 닫으면 메인창이 나타났습니다.
그리고 나서 메뉴의 설정->시리얼포트를 클릭하니까, 다시 시리얼 포트 설정 창이 떴습니다.
생각대로 잘 됐음을 확인했습니다.


최종 코드는 다음과 같습니다.



(소스 코드)
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO.Ports;
using System.IO;

namespace try_term
{
    public partial class frmMain : Form
    {
        frmConnection m_ClassConnection = new frmConnection();

        public frmMain()
        {
            InitializeComponent();
        }

        private void 시리얼포트ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            m_ClassConnection.ShowDialog();
        }

        private void frmMain_Load(object sender, EventArgs e)
        {
            m_ClassConnection.ShowDialog();
        }
    }
}

[DUAL BL] 4-Mbps TI Simply Blue 모듈[CC2564MODx]

CC2564MODx Bluetooth® Host Controller Interface (HCI) Module

Dual 모드 지원하는 브루투스 모듈인데, 사이즈가 7x7 mm 네요.

속도는 4Mbps.

가격은 8$

FCC,CE 인증 받았고요.

데이터 시트 링크 : http://www.ti.com/lit/ds/symlink/cc2564moda.pdf  

모듈 안에 들어있는 CC2564 칩의 가장 작은 패키지는  54-BGA,DSBGA 라고 하는데, 생김새는 다음과 같습니다.

그런데 아무리 찾아봐도 사이즈를 모르겠네요. 

2016년 3월 5일 토요일

[try_term] c#으로 통신 터미날 만들기 #1

예전부터 c# 책을 사서 출퇴근시 읽곤 했는데,
정리가 안되어 블로그에 글을 쓰면서 자료를 남기고자 합니다.

자료를 정리를 안하다 보니, 매번 처음부터 다시 시작하고 다음 번에 연결해서 프로그램을 만들어보고자 할 때
전혀 생각이 안나는군요.

윈도우 프로그램으로 예전에 Labview 를 주로 쓰다가, c#으로 갈아타려고 했는데 배워야 할 것이 많아서
아직도 거의 기초를 해메고 있습니다.

일단, 펌웨어 테스트시 주로 UART 통신을 많이 하니까 터미날 프로그램을 만들어 보려고 합니다.

다행히 여기저기 참고할 사이트가 많네요.

먼저 비주얼 스투디오를 깔았고, 새로운 프로젝트를 이름은 try_term 으로 만들었습니다.
여기에 MenuStrip SplitContainer,TextBox 를 추가했습니다.

*1번 : SplitContainer, 참조 사이트 링크

나중에 툴팁이라는 것을 사용하기위해 설명이 잘된 사이트를 찾아 보았습니다. (링크)
툴팀의 정의 : Tooltip 컨트롤은 특정 컨트롤에 마우스를 올려 놓으면 간단한 도움말을 보여줄 때 쓰여지는 컨트롤이다.

아, 그리고 이 프로그램을 참고한 사이트(링크)가 있는데, 처음에는 이 프로그램 소스랑 비슷하게 해보고
점점 프로그램을 추가/수정해 나아갈 것입니다. 참 많은 도움이 됩니다.
원 제작자의 디자인은 아래와 같습니다.


그래서 위의 디자인처럼 SplitContainer 를 넣고, 설정을 
Dock : None 으로 전체 프레임에서 떨어뜨려 놓았고, 
Anchor : Bottom,Left,Right 로 하여 전체 프레임을 마우스로 변경해도 왼쪽,오른쪽,아래에 붙어서 같은 비율로 조정됩니다.

다음은 SplitContainer 의 왼쪽과 오른쪽에 TextBox 를 넣고 dock 를 Fill 로 설정하여 전체 크기에 맞게 조정되도록 설정했습니다.


그리고 TextBox 의 우측 위의 > 아이콘을 누르면 MultiLine 으로 만들 수 있습니다.

다음으로 메뉴를 만드는 기능인 MenuStrip 을 왼쪽 도구상자에서 끄집어다 왼쪽 위에다 붙여서 편집 합니다.
#1 설정,시리얼 포트,통신 끊기
#2 전송,파일 보내기,X-modem 전송

다음으로 또 다른 윈도우 폼을 만들어 봅시다. 이 기능은 나중에 메뉴를 선택하면 또 다른 창을 띄우기 위한 용도로 쓰일 예정입니다.
[새로운 폼 만들기]



이름을 frmConnection.cs 로 하고 추가를 눌렀더니 다음과 같이 폼이 새로 만들어 졌습니다.