페이지

글목록

2017년 2월 27일 월요일

[IC 소개] 앞으로 사용할 MCU 키트 소개.

오늘도 사장님께서, 선물로 여러가지 장나감들을 사 주셨다. ^^.

1. XMOS MCU 개발 키트.(8-CORE,2000 MIPS)

2. STM32F769 개발 키트(CORTEX-M7)


3. STM32F030 개발 키트 (CORTEX-M0)



선물인가? 짐인가? (똥인가? 된장인가?)

[nordic BLE] J-Link f/w 복구 방법

간만에, nordic nRF51-DK (PCA10028) 을 사용하게 됐는데,
KEIL 에서 어찌어찌 하다보니 JLINK 가 업데이트 되고나서 LD5(LED)가 빨리 깜박이면서,
동작이 안됐습니다.

예전에도 한 번 같은 일을 겪었었는데, 기억이 하나도 안나서 구글에서 검색해서 겨우 알았습니다.
(더우기, 제 USB-HUB 는 가끔 USB 장치를 인식하지 못하는 경우가 많아서, 
컴퓨터의 일반 USB 포트에 연결해야 정상 동작을 하는 놈이여서 엄청 고생을 했네요)

J-LINK 복구 방법은 간단합니다.

1. NORDIC 홈페이지에서 nRF5x-OB-JLINK-IF 를 눌러서 J-LINK Firmware 를 다운 받습니다.



2. PCA10028 보드의 리셋 버튼을 누르고 USB 전원을 연결(POWER ON RESET)하면, 
   LD5(LED)가 약간 늦은 주기로 플래슁한다.

3. 이와 동시에 USB Drive 가 1개 생성되면, 1번과정에서 받아둔 J-LINK Firmware 를 copy-to-paste 한다.
4. 복구 끝.

2017년 2월 24일 금요일

[ALLEGRO] 각종 Part FootPrint 를 무료로 주는 사이트

알레그로로 Footprint 를 만들려고 하는데 너무 귀찮아서,
유튜브를 찾아보다 발견했습니다. 아마도 가장 귀찮은 것이 풋프린트 새로 만드는 것일겁니다.

다음 사이트로 가셔서 풋프린트 다운 받으시면 됩니다.


Importing 하는 방법은 다음의 유튜브 영상을 참조 하시기 바랍니다.



2017년 2월 18일 토요일

[IC 소개] TR 작은 사이즈 NPN/PNP

요새 기술이 대단하네요. TR 크기가 1x1 mm 밖에 안되네요. 헐~~. 그것도 듀얼(2-ch).

[NPN-2-Channel]


[PNP-2-Channel]

[PSOC5] LED Driver 콤퍼넌트 테스트 (새로 추가된 녀석 ^^)

이번에는 꽤 유용한 콤포넌트가 PSOC5에 추가되었다.
DMA 를 사용해서 CPU에 부담이 없이, LED 메트릭스를 Dynamic Scan 방식으로 제어가능하다.
또한 PWM으로 LED 밝기 조절 기능까지 들어있고, 7-SEGMENT 와 심지어 14,16 SEGMENT 도 콘트롤할 수 있다.

저는 7-SEGMENT 와 LED 비트제어 만, 제공되는 여러 함수를 이용해서 사용해 봤는데,
14,16-SEGMENT 는 써 본적이 없네요.

아뭏든 LED를 더 많이 제어하려면, MCU 중에서 다리가 많고 싼놈으로 고르시기 바랍니다.
이 콤포넌트는 seg out 이 24개까지, com out이 8개까지 가능해서,
동시에 출력 가능한 최대 LED 갯수는 24 x 8 = 192개이다.

예전에 LED 드라이브 IC 를 4천원에 SPI/I2C 방식으로 MCU에 붙여서 사용했었는데,
포트가 좀 필요하지만 LED 드라이브 IC를 안 써도 된다. 
대신 TR을 포트 갯수 만큼 달아 줘야 하지만 가격 대 성능비는 괜찮은 것 아닌가? (IC 크기가 문제없는 곳이라면)

프로그램에서는, 제공되는 함수로 디스플레이를 바꾸고 싶을 때 한번만 레지스터를 써 주면 끝이다.
계속 타이밍에 맞춰서 출력해 줘야하는 수고스러움 없이, 관심 끄고 다른 프로그램 코딩하면 되겠다.

다음은 PSOC5 에 연결할 COMMON-Cathode 타입의 7-SEGMENT 회로도 중, 
전류를 증폭하기 위해서 사용한 TR 회로 입니다.
PNP TR 출력에 연결된 저항을 바꿔서 최대 밝기를 조절해 줄 수 있다. 
다이나믹 스캔 방식이라 저항을 너무 크게 달지 않는 것이 좋다. (크면 어둡다)
대략 51 옴 정도 달면 적당할 듯 하다. (전류가 너무 많이 흐르게 했을까요? 다시한번 확인을 해 봐야겠네요.)
오렌지 색 1608 LED가 전압강하 2.2V 이네요.
따라서 전원을 3.3V 사용시 LED를 통해 흐르는 전류를 20mA로 만들려면,
1.1V(3.3V-2.2) / 0.02 = 55 옴 으로, 전력은 55*0.02*0.02(R x I x I) = 0.022W 입니다.
즉 1/45 W 네요. ^^.

51옴 정도 달면 되겠습니다.





다음은 TR 에 연결되는 FND 와 LED 회로 입니다.


위와같이 회로는 준비 됐고, PSOC5 의 새로 생긴 콤포넌트인 LED Segment and Matrix Driver [v1.10] 을 살펴보자.
TopDesign.cysch 에, 일단 제가 다 만들어 놓은 콤포넌트를 보겠습니다.
세그먼트 출력 8개, 코먼 출력 8 개로 7-SEGMENT 7개와 8개의 LED를 제어하도록 구성했습니다.



다음은 다리가 많은 모델로 고른 PSOC5 IC 입니다. 다리는 많은데 가격은 좀 비싼 놈입니다. 제가 열전대 값을 읽으려고 20-비트 ADC가 있는 놈으로 고르다 보니 가격이 비싸져버렸네요.
저와 같은 용도가 아니면 다리가 좀 많고 가격이 싼 PSOC5를 고르는 게 좋습니다.



다음은 콤포넌트 설정입니다. 여러가지를 설정할 수 있는데, 최대 출력 개수는 segment 24, common 8개 이고,
스캔 주기도 조정할 수 있습니다. 적당히 테스트하면서 조정하면 됩니다. 
나머지 설정들은 보면 아시겠죠? (common Cathode/Anode 에 따라 드라이브 타입을 조정해 주시면 되고, 내부 클럭으로 돌릴지 외부 클럭으로 돌릴지, 밝기 조절을 할지 말지.. 등이 있습니다)



이렇게 설정을 마치고 나면 자동으로 LED 드라이브 파일이 생성되고, 우와 함수 참 다양하죠?
테스트용으로는 몇 개 안쓸 것입니다. ^^



다음은 제가 만든 코드 예제 입니다.
7개의 7-SEGMENT 에 1,2,3,4,5,6,7 이 켜지고 , LED 8개가 다음과 같이 켜질 것입니다.
실제 7-SEGMENT 와 LED가 켜진 사진을 못 올리는 것이, 맡겨 놓은 회사에서 회로를 잘못 바꿔서 최종으로 
Common-Anode 타입으로 만들어 와서 지금 설명하는 내용과 좀 다릅니다. 이해 바랍니다.


다음은 main.c 파일에 있는, 테스트용으로 제가 만든 예제 소스코드입니다. (아주 간단하게~~^^)
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
32
33
34
35
36
/* ========================================
 *
 * Copyright YOUR COMPANY, THE YEAR
 * All Rights Reserved
 * UNPUBLISHED, LICENSED SOFTWARE.
 *
 * CONFIDENTIAL AND PROPRIETARY INFORMATION
 * WHICH IS THE PROPERTY OF your company.
 *
 * ========================================
*/
#include "project.h"
int main(void)
{
    LED_Driver_1_Start();
    
    CyGlobalIntEnable; /* Enable global interrupts. */
    /* Place your initialization/startup code here (e.g. MyInst_Start()) */
    LED_Driver_1_PutChar7Seg('1',0);
    LED_Driver_1_PutChar7Seg('2',1);
    LED_Driver_1_PutChar7Seg('3',2);
    LED_Driver_1_PutChar7Seg('4',3);
    LED_Driver_1_PutChar7Seg('5',4);
    LED_Driver_1_PutChar7Seg('6',5);
    LED_Driver_1_PutChar7Seg('7',6);
    LED_Driver_1_SetDisplayRAM(0x55,7);
    
    for(;;)
    {
        /* Place your application code here. */
    }
}
/* [] END OF FILE */
cs



마지막으로 위의 내용에서 설명드린 것과 그대로 동작하는 프로젝트 파일을 첨부합니다. [Link File]

[PSOC5] TR(MMBT3904),열전대 온도측정(프로그램 첨부)

이전 글에 TR(MMBT3904)의 내부 다이오드를 이용해서 오도 측정하는 방법 중, 
H/W 상의 설명은 충분하다고 생각이 됩니다.
(사실 저도 정확하게 잘 모릅니다. 그냥 실제로 써 먹을 수만 있으면 된다고 생각하고 있습니다. ^^)

다이오드 온도 센싱을 위해 수학함수 쓰다가 컴파일러 오류 나서 고치고,
온도 값을 받아서 UART 에 floating point 로 출력하다가 컴파일러 오류나서 고치다 보니 한동안 멍~하네요.

이제 겨우 본론으로, 간단하게(저도 잘 모르는 관계로) 다이오드 온도측정과 열전대 온도측정에 관해서 말씀 드리겠습니다.
일단 동작은 모두 잘 됩니다.

다이오드(TR 내부의 다이오드) 온도센싱의 회로도와 열전대 회로도를 다시 한번 올려 보겠습니다.

[#1 다이오드 온도측정 회로도]




[#2 열전대 온도측정 회로도]



추가로 이번에 안 사실인데, 열전대를 거꾸로 달면 온도가 올라갈수록 전압이 낮아져서 온도가 떨어지는 것처럼 동작하더군요.
주의 : 열전대는 방향이 있습니다. 


다음은 PSOC5 의 콤포넌트를 배치하는 Topdesign.cysch 입니다.


다른 MCU와 좀 색다른 프로그램 환경이지만, 
1. Differential 20-Bit ADC 5ch 사용하고, 
2. current mode DAC 1개 , 
3. 칩내부 온도 센싱 (프로그램에서는 사용 안했음),
4. 열전대 온도 테이블 계산 콤포넌트,
5. UART 1개
를 사용했습니다.

[첨부한 예제 프로그램 설명]
Diode 로 측정된 온도를 프로그램에서는 Cold Junction Temperature 라고 부르고,
열전대로 측정한 온도를 Hot Junction Temperature 라고 부르더군요.
2개의 온도를 측정해서(물론 여러가지 처리를 합니다. sw 노이즈 필터, 열전대 테이블 보상 등등),
서로 더해주면 최종 열전대로 측정된 온도가 나옵니다.
이것을 UART로 출력 합니다.

이정도면 됐을까요? 이해 안되시면 댓글에 질문하시고, 저도 잘 모르지만 한번 해 본 것밖에 차이는 없습니다. ^^

예제 파일 첨부합니다. [link file]

[PSOC5] printf/sprintf 함수에서 floating point 값 표시 (컴파일러 버그)

아~ 놔.. 열통 터지네. 이번에는 sprintf 함수에 아무리 float 값을 써도 이상하게 나와서 찾아보니,
이것도 컴파일러 문제일 듯 하네요. 또 라이브러리쪽에 뭘 써 넣어야 하는군요.

다음과 같이 수정하면 printf/sprintf 함수에서 floating point 값을 표시할 수 있습니다.

1. 프로젝트를 클릭하고, 다시 마우스 우클릭한 다음 Build Setting 을 클릭.






2. Linker 의 Use newlib-nano Float Format 을 True 로 고치고, 
command line 의 Custom Flags 에 -u _printf_float 라고 써 넣음.


[PSOC5] 수학 함수(log 함수) 사용 방법(컴파일러 버그)

열전대의 온도를 측정하기 위해, 다이오드로 열전대의 콘넥션 부분의 온도를 측정해야 한다.

열전대는 두 선의 상대적인 온도차를 측정하는 것이기 때문에 현재 온도값이 필요하므로,
현재 TR(MMBT3904) 안에 있는 다이오드로 온도를 측정하도록 회로를 구성하고 프로그램을 만들었다.

그런데, 다이오드 온도측정에 필요한 함수 중에 log() 라는 수학함수가 있다.
이 함수를 쓰려면 #include <math.h> 만 추가해 주면 에러가 났다.

이유야 어떻든 불편하긴 한데, 컴파일러의 문제로 생각된다.
사용자의 기술적인 문제는 아니므로, 원인을 알 필요는 없다.

이 문제를 해결하려면, 다음과 같이 하면 된다.

1. 프로젝트를 클릭하고, 다시 마우스 우클릭한 다음 Build Setting 을 클릭.


2. 아래 그림처럼 Linker 를 클릭하고 Additional Libraries 에 m 이라고 써준다.

2017년 2월 17일 금요일

[IC 소개] 다이오드로 온도 측정하는 방법

제품에 온도 센서로, 일반적으로 흔히 사용하는 TR(MMBT3904)를 적용해 봤습니다.
20bit - ADC 를 사용해서 CPU 가격이 올라가서 부담되시면 12비트 ADC 회로도 Cypress에서 제공하고 있습니다.

저는 열전대를 사용해야 하므로 좀 더 정밀한 ADC가 필요해서 20비트 ADC를 사용하다 보니,
TR쪽도 남은 ADC 채널에 연결했습니다. 열전대는 각 단자의 온도차만 센싱을 할 수 있어서, 기준 온도가 필요합니다.
그래서 열전대가 위치한 가장 가까운 곳에 이 TR 온도센서를 연결하게 되었습니다.
이 TR 센서는 다른 온도센서보다 정말 저렴합니다. 10원정도 밖에 안하거든요. ^^

범용 트랜지스터를 선택하는 이유는 덜 엄격한 정확도 요구 사항과 함께 매우 낮은 트랜지스터 비용입니다.

[왜 TR의 다이오드를 사용하는가?]
일반 다이오드 제조사와 종류가 어마어마 하게 많고 특성도 각각 많이 달라서, 그나마 Transistor에 들어있는

다이오드가 훨씬 더 규격적이고 제조사마다 차이가 적어서 그렇다고 합니다.

[실제 회로기판에 장착된 사진]


참고자로로서 Cypress 의 AN60590 문서가 있고, 샘플 프로그램도 함께 제공되어 있어서 사용했습니다.
문서를 좀 더 자세히 읽어 봐야 하는데, 읽어 봐도 너무 어려운 수학,물리 계산식들이 나와서 정확히 적용은 못하고 있습니다.
하지만 온도에 따라서 값이 오르고 내리는 것은 확실헀습니다.

테스트를 해 보니, TR을 딥타입 --> SMD 타입으로 바꿔서 사용해서 그런지 온도 값이 너무 높게 나오더라고요. ^^
아마도 딥타입(TO-92)과 SMD 타입(SOT-23)의 특성이 좀 다른 것 같습니다.
TR 자료를 좀 더 찾아보니 다음과 같은 내용이 있네요. TR이 패키지마다 온도 특성이 다르네요.

이 내용으로 적당한 계산값을 찾아 봐야 할 것 같은데, 해 보고 자료 업데이트 하겠습니다.


[업데이트]
좀 더 구글링을 해서 자료를 찾아봤습니다. 그 결과, 온도의 차이는 Package의 차이때문에 생기는 문제는 아닌 것 같습니다.온도의 차이는 IDEALITY FATOR 에 따라 발생하는데,  제조 회사마다 IDEALITY FATOR가 조금씩 다르다고 합니다.다음은 MICROCHIPS 사에서 제공하는 TR 특성 조사 문서입니다.
http://ww1.microchip.com/downloads/en/AppNotes/00001838A.pdf

여기서 테스트에 사용한 TR에도 MMBT3904가 있었습니다. 제가 사용한 TR의 제조사를 몰라서 팩터값을 잘 모르겠네요.만약 TR로 온도를 측정하려고 한다면 제조사와 파트넘버를 잘 보고 사야겠습니다.
아니면 IDEALITY FATOR를 측정하는 방법을 알아야 하고, 측정 장비도 있어야 겠고 고생할 시간도 있어야 겠죠.


다음은 위의 링크에서 추출한 제조사 별 TR 특성표입니다.



다음은 제가 PSOC5에서 적용한 TopDesign.cysch 회로입니다.


참고로 한 AN60590 문서의 ref 회로는 다음과 같고요.


이 예제 프로그램에서 TR의 특성에 따른 상수(Ideality Fator)가 있는데, 
이 값을 일단은 대 충 바꿔서 현재 온도와 비슷하게 맞췄습니다.
아직까지 실제 온도와는 좀 다른 것 같은데, 이 값을 고치는 것은 맞는 것 같습니다.
다음은 이 상수가 위치해 있는 singleDiode.h 파일의 내용입니다.
(위의 Microchips 사의 TR 특성표 참조)

예제의 값은 다음과 같고, 
1
2
3
4
/* For the 2N3904 transistor that comes with the CY8CKIT-025 kit,
*  the ideality factor of 1.004 is used.
**********************************************************************************/
#define IDEALITY_FACTOR ((float)1.004)
cs

제가 수정한 값은 다음과 같습니다.
1
2
3
4
5
/* For the 2N3904 transistor that comes with the CY8CKIT-025 kit,
*  the ideality factor of 1.004 is used.
**********************************************************************************/
//#define IDEALITY_FACTOR ((float)1.004)
#define IDEALITY_FACTOR ((float)1.15)
cs


2017년 2월 15일 수요일

[ESP8266] MAC Address 읽기

MAC Address 읽는 함수로 ESP-8266 IC 내부의 2가지 MAC Address 를 읽을 수 있습니다.
참고한 사이트 주소는 다음과 같습니다.
http://www.esp8266.com/viewtopic.php?f=29&t=3587


아직 네트웍 개념이 없어서 잘은 모르겠지만,
1개는 일반 맥 어드레스이고(MAC{STA]) , 또 하나는 Wifi 단독 Server ?(MAC[SOFTAP]) 용 MAC Address 입니다.

Soft AP 는 공유기에 붙이지 않고, 8266가 단독으로 SSID,Password 를 치고 연결할 때
사용하는 방식 으로 알고 있습니다. 
그 뭐시냐... 핸드폰으로 Wifi 스캔하면 SSID가 보이죠. (^^ 공부 좀 더 해야겠네요.)

자 나중에 공부 더 해서 추가할께요.
아뭏든, 아두이노 IDE 에서 스케치 소스 코드만 있으면 실험 가능합니다.

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
32
33
#include <ESP8266WiFi.h>
 
uint8_t MAC_array[6];
char MAC_char[18];
 
 
void setup() {
  char ser_tx_buff[100];
  
  Serial.begin(115200);
 
  Serial.println();
  // put your setup code here, to run once:
 
  Serial.print("MAC[STA] ->");
  WiFi.macAddress(MAC_array);
  for (int i = 0; i < sizeof(MAC_array); ++i){
    sprintf(MAC_char,"%s%02x:",MAC_char,MAC_array[i]);
  }
  Serial.println(MAC_char);  
 
  MAC_char[0]=0;
  Serial.print("MAC[SOFTAP] ->");
  WiFi.softAPmacAddress(MAC_array);
  for (int i = 0; i < sizeof(MAC_array); ++i){
    sprintf(MAC_char,"%s%02x:",MAC_char,MAC_array[i]);
  }
  Serial.println(MAC_char);  
}
 
void loop() {
  // put your main code here, to run repeatedly:
}
cs

[ESP8266] Chip Information 읽기

원래는 Chip ID 만 알려고 했다가,
구글링을 해 보니, 더 많은 정보를 얻을 수 있었습니다.

다음 사이트에서 참고했습니다.
https://github.com/adafruit/ESP8266-Arduino

그냥 스케치 프로그램만 건드리면 되네요.

소스 코드는 다음과 같습니다.



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
32
void setup() {
  char ser_tx_buff[100];
  
  Serial.begin(115200);
 
  Serial.println();
//ESP.getFreeHeap();// returns the free heap size.
//ESP.getChipId();// returns the ESP8266 chip ID as a 32-bit integer.
//Several APIs may be used to get flash chip info:
//ESP.getFlashChipId();// returns the flash chip ID as a 32-bit integer.
//ESP.getFlashChipSize();// returns the flash chip size, in bytes, as seen by the SDK (may be less than actual size).
//ESP.getFlashChipSpeed();// returns the flash chip frequency, in Hz.
//ESP.getCycleCount();// returns the cpu instruction cycle count since start as an unsigned 32-bit. This is useful for accurate timing of very short actions like bit banging.
  sprintf(ser_tx_buff,"1. getFreeHeap = %d\n\r",ESP.getFreeHeap());
  Serial.print(ser_tx_buff);
  sprintf(ser_tx_buff,"2. getChipId = %d\n\r",ESP.getChipId());
  Serial.print(ser_tx_buff);
  sprintf(ser_tx_buff,"3. getFlashChipId = %d\n\r",ESP.getFlashChipId());
  Serial.print(ser_tx_buff);
  sprintf(ser_tx_buff,"4. getFlashChipSize = %d\n\r",ESP.getFlashChipSize());
  Serial.print(ser_tx_buff);
  sprintf(ser_tx_buff,"5. getFlashChipSpeed = %d\n\r",ESP.getFlashChipSpeed());
  Serial.print(ser_tx_buff);
  sprintf(ser_tx_buff,"5. getCycleCount = %d\n\r",ESP.getCycleCount());
  Serial.print(ser_tx_buff);
  // put your setup code here, to run once:
}
 
void loop() {
  // put your main code here, to run repeatedly:
 
}
cs

[ESP8266] SPI 통신 테스트 (ARDUINO IDE)

SPI 통신 테스트를 하려고 보니까, 
함수가 크게 2가지로 나눠서 볼 수 있는데, 특히 transferBytes(uint8_t * out, uint8_t * in, uint32_t size)함수는 
설명을 읽어 보아도 잘 모르겠어서 직접 테스트를 해 보게 되었습니다.

먼저 2가지라고 말씀 드린 함수는 대표적으로 다음과 같습니다.
PC의 다음 위치의 SPI.CPP 파일에 정의되어 있습니다.
C:\Users\trion\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.3.0\libraries\SPI
1. void SPIClass::transferBytes(uint8_t * out, uint8_t * in, uint32_t size)
2. void SPIClass::writeBytes(uint8_t * data, uint32_t size)

관련된 비슷하거나 파생된 함수는 몇가지 더 있습니다만, 이 2가지 함수가 많은 데이터를 보내면서
테스트하기에 적합해서 2가지 함수로 테스트를 진행했습니다.

하드웨어 구성은 예전에 테스트하다가 중단하고 그냥 놔둔 Serial Nand Flash IC(W25N01GxxIG)를 사용해서
ESP-8266의 HSPI 포트에 연결했습니다. 얼마 전까지 SD-Card 를 연결했던 포트죠.


[ESP-8266 개발 키트에서 사용한 SPI 포트들] 


NAND 랑 연결을 하고 테스트를 크게 2가지로 진행했습니다.
1. 10 바이트 전송.
  - writeBytes() 함수와 transferBytes() 함수의 차이점은 읽기가 되는지 안되는지의 차이 입니다.
    transferBytes() 함수로도 쓰기 기능만 사용할 수 있고 writeBytes() 함수가 약간 더 빠름니다.
  - 쉽게 말하면, writeBytes() 함수는 Write 전용, transferBytes() 함수는 Full Duplex 통신이라고 볼 수 있다.
  - 다음의 그림은 writeBytes() 함수와 읽기/쓰기 겸용(Full Duplex)으로 사용한 transferBytes() 함수의 전송속도 차이를 보여주는 신호 파형이다.



 2. 100 바이트 전송.
다음은 이 2개의 함수에서 대용량 바이트를 전송할 경우의 특성을 살펴 보았다.
여러 바이트를 전송할 경우에, ESP IC는 기본으로 다른 칩에서의 DMA 기능처럼 SCLK가 끊어짐 없이 출력되었다.
하지만 64-Byte 마다 약간의 딜레이가 있다. 
이 딜레이는  transferBytes() 함수에서 읽기 기능을 사용했을 경우 크게 늘어난다. 
읽기 기능을 사용하지 않으면 두 함수의 64 Byte 간의 딜레이의 차이는 별로 없다.
[transferBytes() 함수의 특성]



 [writeBytes() 함수의 특성]



다음은 아두이노 IDE 툴에서 사용한 프로그램 소스 코드입니다.
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
#include <Arduino.h>
#include "SPI.h"
#include "HardwareSerial.h"
#define nSPI_CS   4
void setup() {
  int i;
  uint8_t in_buf[100],out_buf[100];
  char ser_tx_buf[100];
  
  delay(1000);
  
  Serial.begin(115200);
  // put your setup code here, to run once:
  digitalWrite(nSPI_CS, HIGH);
  pinMode(nSPI_CS, OUTPUT);
  pinMode(SCK, SPECIAL);  ///< GPIO14
  pinMode(MISO, SPECIAL); ///< GPIO12
  pinMode(MOSI, SPECIAL); ///< GPIO13
  SPI1C = 0;
  SPI.setFrequency(20000000); ///< 20MHz
  SPI1U = SPIUMOSI | SPIUDUPLEX | SPIUSSE;
  SPI1U1 = (7 << SPILMOSI) | (7 << SPILMISO);
  SPI1C1 = 0;
  for (i=0;i<10;i++)
  {
    out_buf[i] = i;
  }
    out_buf[0= 0x9F;
    out_buf[1= 0;
    out_buf[2= 0;
    out_buf[3= 0;
    out_buf[4= 0;
    
  digitalWrite(nSPI_CS, LOW);
  // 10 Byte Transfer
  //SPI.transferBytes(out_buf,in_buf,10);
  //SPI.writeBytes(out_buf,10);
  // 100 Byte transfer
  //SPI.transferBytes(out_buf,in_buf,100);
  //SPI.transferBytes(NULL,NULL,100);
  //SPI.transferBytes(out_buf,NULL,100);
  //SPI.transferBytes(NULL,in_buf,100);
  SPI.writeBytes(out_buf,100);
  digitalWrite(nSPI_CS, HIGH);
  sprintf(ser_tx_buf,"\n\nSPI Test Program in:%02X,%02X,%02X,%02X,%02X\n\r",in_buf[0],in_buf[1],in_buf[2],in_buf[3],in_buf[4]);
  Serial.print(ser_tx_buf);
}
void loop() {
  // put your main code here, to run repeatedly:
}
cs

2017년 2월 14일 화요일

PCB 10조각에 만원? 중국 회사.

100 mm x 100 mm PCB를 10조각에 $10에 제작해 준다고 합니다.

간혹 인터넷에서 이런 곳을 이용하는 사람들을 봤었는데,
요새 Windows 10으로 바꾸고 나서 orcad Layout을 느려서 못 쓰니까 PSB 아트웍을 안하게 되네요.

알레그로 좀 공부해서 한 번 맡겨봐야 겠습니다.



2017년 2월 13일 월요일

[ESP-8266] 저장된 SSID/Password 지우기 (Arduino IDE)

어디서 저장이 된 것인지 잘 모르겠지만,
SSID 와 Password가 저장되어서 지우고 싶을 때가 있다.

그럴 땐, 이렇게.. (ARDUINO IDE 에서 사용하는 함수이다.)

WiFi.disconnect();

[PSOC5] EEPROM 테스트

PSOC5 는 EEPROM 테스트 관련 글이 없어서 약간 시간을 내서 글을 올려 봅니다.

물론 예제에서도 참고할 수 있는데, 예제가 너무 복잡해 보이네요.
또한 제가 사용할 때는, EEPROM 을 따로 Erase를 할 필요가 없었는데.. 
예제에서는 항상 Erase를 하고 Write를 하는게 좀 이상했습니다.

이번에 테스트한 보드는, Cypress에서 많이 파는 CY8CKIT-059 로 진행했습니다.
사용한 콤포넌트는 Port 입력 1개(TACT Switch)와 UART 만 사용했습니다.

byte(unsigned char) 타입 데이터 2개와 uint(unsigned 16 bit) 타입 데이터 2개를 스위치를 1번 누를 때마다,
1씩 증가하도록 하고 EEPROM 에 저장을 했습니다.
그리고 리셋 버튼을 누르면 EEPROM에 저장된 값을 UART 로 출력해서 EEPROM의 동작을 확인했습니다.

보드의 외형과 사용하는 포트들은 다음과 같습니다.



다음은 PSOC Creeator 의 컴포넌트 설계도입니다. (TopDesign.cysch)


다음은 실제 PSOC5 IC의 사용하는 포트입니다.



다음은 프로그램 테스트 과정입니다.

1. 처음 프로그램을 다운로드하고 UART 로 출력되는 내용 (EEPROM에 저장되는 값들을 초기화하여 Write 한다)



2. 스위치를 3번 눌러서 값을 3증가시켜서 저장하고 UART로 출력. 리셋 버튼을 눌러 EEPROM 값을 읽어 확인.



3. 전원을 OFF --> ON 해서 정말로 데이터가 남아 있는지도 확인.


psoc 소스 코드 첨부합니다.