2019.06.05 23:21

PY8C4247 IC를 가지고 Observer 모드로 하여 들어오는 블루투스 신호를 분석하고 있는데 2 ~ 3주간 사용하면 블루투스가 정상적으로 동작하지 않습니다. (블루투스 모듈 버젼은 3.40을 사용)

리셋을 하거나 프로그램을 다시 다운로드하여도 동일한 증상이 발생한 것을 보면 레지스터나 이런 부분의 문제가 아닌 듯 싶습니다. 

처음 1개가 비정상 동작 했을때 IC가 실장이 잘못 되었을 거라 생각했는데 3개째 같은 증상을 겪으니 그게 아닌 것 같다는 생각이 듭니다.(기간도 약 3주정도 사용하다보면 나오는게 동일하네요.) 원인을 찾아서 해결해야하는데 조금 막막하네요.

Posted by 초보 HW 엔지니어 로망와니

댓글을 달아 주세요

2019.06.05 21:30

 

 

 

 

 

 

 

 

 

 

 

 

클럭을 연결해주면 Period에 따른 시간이 표시됩니다. 다른 MCU처럼 계산하지 않아도 되는 점이 무척 편합니다.

 

 

 

Posted by 초보 HW 엔지니어 로망와니

댓글을 달아 주세요

2019.05.30 08:43

 

CPLD나 FPGA를 하시는 분들에게는 익숙하신 TopDesign에 들어가서 Timer를 찾아 생성하여 줍니다.(물론 CPLD나 FPGA에서는 이러한 라이브러리들이 지원되지 않아 만들어 쓰거나 구매하여 쓸 수 있습니다...)

생성한 후에는 빌드를 한번하여 주어야만 프로그램 라이브러리들이 생겨서 프로그램에서 사용할 수 있습니다.

 

/* Timer Interrupt */

CY_ISR(Timer_Int_Handler)
{
    DEBUGPRINT("Timer \r\n");
    Timer_ClearInterrupt(Timer_INTR_MASK_TC);
}


int main()
{   
    /* Start communication component */
    UART_Start();    
    
    /* Enable global interrupts */
    CyGlobalIntEnable;

    Timer_Start();
    Timer_Int_StartEx(Timer_Int_Handler);    
    
    /*Infinite Loop*/
    while(1){
    }
 }

 

Posted by 초보 HW 엔지니어 로망와니

댓글을 달아 주세요

2019.04.13 11:43

PSOC의 단점이자 장점

PLD 기반이기에 CPLD나 FPGA 제품처럼 디바이스를 변경하여 사용할 수 있는 부분입니다.

초기에 판매했던 개발보드와 나중에 판매하는 개발보드가 이름은 동일한데 칩이 변경되거나 기제품을 단종시켜버려서 넘어가야 하는 경우가 있어 난처할 때가 있습니다.

그럴때 디바이스를 아래와 같이 변경하여 사용하면 됩니다.

 

변경되는 화면이 일반 펌웨어 엔지니어들에게는 조금 생소합니다.

Keil이나 IAR 등에서도 IC를 변경하여 설정하고 사용하는 것이 있지만 그 선택하는 부분이 알테라의 디바이스 변경과 더 비슷한 느낌입니다. 사용하시는 분들은 당연히 아시겠지만 PLD와 MCU의 조합이기 때문입니다.

요즘 나오는 징크같은 칩을 보면 PSOC과 비슷하다는(사용법이 아닌 방식이) 느낌을 느낄 수 있습니다.

PSOC은 MCU에 더 중점을 뒀고 징크같은 경우는 PGA에 더 중점을 둔 것같습니다.(집적화가 갈수록 잘되니 남는 공간에 Core를 박아볼까? 이런 기분)

사이프레스에서 PSOC을 기존에도 그리고 현재에도 그리 중점적인 제품으로 생각하지 않는다는 느낌이라서 나중되면 매리트가 완전 사라지지 않을까라는 생각도 드네요. ㅠㅠ

 

Posted by 초보 HW 엔지니어 로망와니

댓글을 달아 주세요

2017.05.05 18:18

 

 

 

Posted by 초보 HW 엔지니어 로망와니

댓글을 달아 주세요

2012.05.16 23:19

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

제 하드웨어에 맞게 핀 설정을 하였습니다. 

 

 

 

 

 

 

 

OS를 사용하지 않고 Touch를 사용하기 위하여 GUI_X.c와 GUI_X_Touch.c를 선택하였씁니다. 

 

 

 

 .lib 파일과 GUIConf.h파일은 os를 사용하느냐, 터치를 사용하느냐에 따라 4가지로 분류되었습니다.

 

 

 

 

 

 

※ 조금 황당하기도 하고 어이없기도 했지만 PSoC Creator내의 자체 컴파일러인 GCC 4.4.1은 경로내의 .a파일을 지원하지 않았습니다. 그 때문에 Keil 컴파일러를 선택하여 컴파일 하였습니다.(.lib 파일을 선택)

터치 초기값을 넣어주기 위하여 위의 부분을 변경하였습니다.

초기처럼 뒤쪽이 ,0,0)으로 되어있다면 터치값을 가져오는 함수를 사용하더라도 터치를 제대로 읽어오지 못합니다. 

 

 

가로화면을 사용하기 위하여 LCD_SWAP를 1로 선택하였습니다.

SSD1963을 하용하기에 LCD_CONTROLLER을 66709로 변경하였습니다. 

 

 

가지고 있는 LCD의 설정에 맞게 LCD 초기값을 넣어줍니다.

 

 

LCD 화면 픽셀값에 맞게 설정하여줍니다.

 

이 모든 과정이 끝나면 아마 HELLO WORLD라는 화면을 LCD에서 볼 수 있을 거라고 생각됩니다.

 

emWinTest.vol1.egg

 

emWinTest.vol2.egg

 

emWinTest.vol3.egg

 

emWinTest.vol4.egg

 

emWinTest.vol5.egg

Posted by 초보 HW 엔지니어 로망와니

댓글을 달아 주세요

  1. 2012.05.22 16:10  댓글주소  수정/삭제  댓글쓰기

    비밀댓글입니다

2012.04.20 15:47

 1. UPDATE COMPONENTS를 선택합니다.

 

2. 구버젼 모듈들을 선택한 후 NEXT를 누르면 완료됩니다.(모두 업데이트가 되어있는 상태입니다.)

Posted by 초보 HW 엔지니어 로망와니

댓글을 달아 주세요

2012.04.20 14:44

 1. 기존에 만들어 놓은 PROJECT에서 BUILD SETTING로 들어갑니다.

 

 

2. APPLICATION TYPE를 기존 NOMAL에서 BOOTLOADABLE로 변경합니다.

 

 

3. DEPENDENCIES를 선택해 줍니다.

 

4. BOOTLOADER을 선택해줍니다.(프로젝트 생성시 이름을 잘못 기입해서 BOADLOADER로 되어있습니다.....)

 

5. 만들어 놓은 BOOTLOADER의 HEX 파일을 불러옵니다. 

 

 

 

6. BUILD를 해주면 완료됩니다. 

 

 

20120419_USBBOOTLOADER.zip

BOOTLOADER 예제 프로그램

Posted by 초보 HW 엔지니어 로망와니

댓글을 달아 주세요

2012.04.20 13:45

 1. PSoC Creator를 실행합니다.

 

2. Application Type에서 Bootloader를 선택합니다.

 

3. USBFS를 Sheet로 끌어옵니다.

 

4. USBFS설정에 들어갑니다. 

 

5. 화살표를 클릭해서 Import Descriptor Root를 선택합니다.

 

6. 아래 <PSoC Creator InstallDir>\psoc\content\ cycomponentlibrary\CyComponentLibrary.cylib \USBFS_v1_50\Custom\template\ 경로에서 xml 파일을 끌어옵니다.

 

7. 끌어오면 아래와 같은 설정이 적용되어있습니다.

Product ID로 PC Boot 프로그램에서 읽어오므로 설정을 잘 해주어야합니다.

 

8. USB 포트 핀을 설정해 줍니다.

 

9. 클럭을 설정해 줍니다.

 

10. 외부에 달려있는 크리스탈이 8MHz이므로 8MHz로 설정하였습니다.(원래 추천 사양은 24MHz)

 

 

11. IO COMPONENT를 USBFS로 설정해줍니다.

 

12. 빌드를 해주면 완료 됩니다.

 

 

bootloader.root.xml

Posted by 초보 HW 엔지니어 로망와니

댓글을 달아 주세요

2011.10.14 16:19


/* Code begins here */

#include <m8c.h>        // part specific constants and macros
#include "PSoCAPI.h"    // PSoC API definitions for all User Modules

void TransmitStatus (void);
void TX8_Wait(void);
void TX8_MultiChart(void);
void TX8_Init_Display(void);
void SetBaudRate (void);
int abs(int a);


WORD Detect_Count;

/*******************************************************************************
* Name     :    Delay
* Input    :    Number of loop cycles
* Output   :    None
*
* Function :    This routine generates software delay
*******************************************************************************/
void Delay(int iLoopCount)
{
     int iLoopIndex;
 
     /* at 12 MHZ operation, stop bits need to be high for 8us,
   * (25*4/12MHZ) = 8.33us each instruction is 4 clock cycles */
     for(iLoopIndex = 0; iLoopIndex <iLoopCount; iLoopIndex++);  
}

void main(void)
{
 LED_1_On();
    Delay(10000);    /* mark after break signal */
 LED_2_On();
    Delay(10000);    /* mark after break signal */
 LED_1_Off();
    Delay(10000);    /* mark after break signal */
 LED_2_Off();
 
 TX8_Init_Display();

 //Enable Global Interrupts.
 M8C_EnableGInt;

// TX8_Init_Display();//

 //Start CSD User Module.
 CSDADC_Start();
    //Sets the finger Thresholds for all the Sensors.
 CSDADC_SetDefaultFingerThresholds(); 
 //Initializes BaseLines for all the Sensors.
 CSDADC_InitializeBaselines(); 

 TX8_Init_Display();

 //Do continuously.
 while(1)
 {
  //Scan sensors.
  CSDADC_ScanSensor(0);
  
  //Update Baselines.
  CSDADC_UpdateSensorBaseline(0);


  //Send CapSense buttonsdata to the MultiChart
  TX8_MultiChart();

  //Send CapSense buttonsdata to the HyperTerminal
//  TransmitStatus();
 }
}

void SetBaudRate (void)
{
 //Now, set OSC_CR1 & OSC_CR3 registers to get desired baudrate (9600 bits/second).
 OSC_CR1 = 0xCB;  //Set VC1 & VC2 values
 OSC_CR3 = 0x01;  //Set VC3 value

// -- SETTING
// CPU CLOCK : SysClk/2
// VC1 : 1
// VC2 : 1
// VC3 SOURCE: VC2
// VC3 DIVIDER : 1
// SYSCLK SOURCE : INTERNAL 24MHZ
// 
// -- TX SET
// CLOCK : VC3
}

void TransmitStatus (void)
{
 BYTE bCounter, bTemp1, bTemp2;
 WORD wCentroid;
 
 bTemp1 = OSC_CR1;
 bTemp2 = OSC_CR3;
 
 SetBaudRate();
 
 //Start the TX8 user module
 TX8_Start(TX8_PARITY_NONE);
 
 //Come to beginning of the line & give space
 TX8_CPutString("\n\r");
 
 //Wait until last byte is transmitted
 TX8_Wait();

 wCentroid = CSDADC_waSnsDiff[0];

 TX8_PutSHexInt(wCentroid);   //Send the Centroid postion value to HyperTerminal
 
 //Wait until last byte is transmitted
 TX8_Wait();
 
 //Stop TX8 user module
 TX8_Stop();

 if(wCentroid >= 10)
    {
       Detect_Count++;
    }
 else
 {
       Detect_Count = 0;
  LED_1_Off();
  LED_2_Off();
 }
 if( Detect_Count >= 5)
    {
      Detect_Count = 0;
  LED_1_On();
  LED_2_On();
    }
 
 //Restore back the settings of OSC_CR1 & OSC_CR3
 OSC_CR1 = bTemp1;
 OSC_CR3 = bTemp2;
}

// When TX8_Wait() function is called, the execution stays in this function
// until the byte in TX Buffer is loaded into shift register & then transmitted completely.
void TX8_Wait(void)
{
 //wait until last byte is loaded into shift register
 while( !( TX8_bReadTxStatus() & TX8_TX_BUFFER_EMPTY ) );
 //wait for last byte of the above string to be transmitted
 while( !( TX8_bReadTxStatus() & TX8_TX_COMPLETE ) );
}

void TX8_MultiChart(void)//Cypress 에서 제공하는 MultiChart 사용시
{
 BYTE bCounter, bTemp1, bTemp2;
 WORD wCentroid;

// BYTE bTemp1, bTemp2;
 
 //CSD user module sets VC1, VC2 & VC3 dividers to the required values depending on Resolution
 //& Scanning speed of CSD (for details refer to parameters section of CSD datasheet).
 //But, for TX8 we may need different values of VC1, VC2 & VC3 to generate desired baud rate.
 //Hence, backup the OSC_CR1 (contains VC1 & VC2 setting) & OSC_CR3 (contains VC3 setting)
 //registers into bTemp1 & bTemp2 variables.
 bTemp1 = OSC_CR1;
 bTemp2 = OSC_CR3;
 
 SetBaudRate();
 
 //Start the TX8 user module
 TX8_Start(TX8_PARITY_NONE);
 
 TX8_PutCRLF(); // Send Header

 TX8_Write((char *) (CSDADC_waSnsResult), CSDADC_TotalSensorCount*2);
 TX8_Write((char *) (CSDADC_waSnsBaseline), CSDADC_TotalSensorCount*2);
 TX8_Write((char *) (CSDADC_waSnsDiff), CSDADC_TotalSensorCount*2);
 
 TX8_PutChar(0); // Send Tail
 TX8_PutChar((CHAR)0xFF);
 TX8_PutChar((CHAR)0xFF);

 //Wait until last byte is transmitted
 TX8_Wait();
 //Stop TX8 UM before changing the VC1, VC2 or VC3.
 TX8_Stop();
 
 wCentroid = CSDADC_waSnsDiff[0];

 if(wCentroid >= 10)
    {
       Detect_Count++;
    }
 else
 {
       Detect_Count = 0;
       LED_1_Off();
  LED_2_Off();
 }
 if( Detect_Count >= 5)
    {
      Detect_Count = 0;
  LED_1_On();
  LED_2_On();
    }
 
 //Restore back the settings of OSC_CR1 & OSC_CR3
 OSC_CR1 = bTemp1;
 OSC_CR3 = bTemp2;
}

void TX8_Init_Display(void)
{
 BYTE bTemp1, bTemp2;
 
 //CSD user module sets VC1, VC2 & VC3 dividers to the required values depending on Resolution
 //& Scanning speed of CSD (for details refer to parameters section of CSD datasheet).
 //But, for TX8 we may need different values of VC1, VC2 & VC3 to generate desired baud rate.
 //Hence, backup the OSC_CR1 (contains VC1 & VC2 setting) & OSC_CR3 (contains VC3 setting)
 //registers into bTemp1 & bTemp2 variables.
 bTemp1 = OSC_CR1;
 bTemp2 = OSC_CR3;
 
 SetBaudRate();
 
 //Start the TX8 user module
 TX8_Start(TX8_PARITY_NONE);

 //Display Title
 TX8_CPutString("\n\n\r  Cypress Semiconductor\n\r  CapSense with TX8");
 
 //Display the Table Header
 TX8_CPutString("\n\n\rBUTTON#   0    1    2    3    4      Slider Centroid Position \n\r");
 //Wait until last byte is transmitted
 TX8_Wait();
 //Stop TX8 UM before changing the VC1, VC2 or VC3.
 TX8_Stop();

 //Restore back the settings of OSC_CR1 & OSC_CR3
 OSC_CR1 = bTemp1;
 OSC_CR3 = bTemp2;
}

int abs(int a)
{
  if(a < 0)
  {
    return -a;
  }
  return a;
}

Posted by 초보 HW 엔지니어 로망와니

댓글을 달아 주세요

2011.10.08 09:41

Cypress 칩을 사용하면서 가장 좋았던 부분은 안에 모듈들이 들어있어 적은 핀이라도 원하는 패리패럴만을 골라서 넣을 수 있는 점이 매력이었고(넣을 수 있는 모듈수가 정해져 있어 타칩에 적은 패리패럴만을 쓸 수 있다는 점은 단점)원하는 핀에 매핑을 할 수 있어 아트웍이 쉽다는 점(물론 핀의 용도가 Fix된 것들도 있음.)과 드래그 앤 드롭으로 패리패럴을 구성하면 관련 함수들이 다 구현되어 나와 칩을 잘 몰라도 쉽게 구현 할 수 있다는 점이었습니다.(심지어는 LED 구동까지도....)
1. File -> New Project


2. 생성할 이름과 워크 시트이름을 넣고 저장할 장소를 선택합니다.


3. 사용할 칩을 선택합니다. 


4. 칩선택까지 끝내면 여타 칩을 사용하였던 사람들에겐 생소한 화면이 나옵니다.


5. 다른 칩들과 다르게 Cypress는 원하는 패리패럴을 직접 가져다 쓸 수 있게 되어있습니다.
저는 여기에서 UART와 정전용량 터치를 구현하기로 하겠습니다.
UART에서도 TX만 필요해서 봤더니 TX8이라는 모듈이 있습니다.
모듈을 끌어다 화면에 올리면 됩니다.


6. 모듈을 끌어다 화면에 올리면 그림과 같이 TX8이라는 모듈이 4개의 빈 모듈 중 1곳에 들어갑니다.
(모듈의 순서나 위치는 드래그 앤 드롭으로 옮길 수 있습니다.)


7. 다음으로 CSDADC라는 정전용량 센싱 모듈을 끌어다 올렸습니다.
(CSD를 써도 되고 CSD나 CSDADC에서도 몇가지 방식이 있는데 편한 방향으로 쓰시면 됩니다.)


8. 모듈 형식을 선택하고 나면 화면에 모듈이 올라옵니다.


9. 이제 원하는 모듈을 모두 선택했으니 핀 매핑을 해줍니다.
핀 연결할 곳에 가서 마우스 좌측 버튼을 눌러줍니다.


10. 연결할 열이 나오면 원하는 곳으로 선택해줍니다.(선택하는 열에 따라 매핑할 수 있는 포트가 다릅니다.)


11. 최종 핀에 연결될 라인도 같은 방식(마우스 좌측버튼)으로 핀과 연결해줍니다.




12. 핀의 풀업이나 풀다운 등을 구현할 때는 핀에서 마우스 좌측 버튼을 누르면 구성이 나오고 원하는 설정을 해주면됩니다.(여타 MCU에서 프로그램으로 하던 부분을 모두 여기서 설정할 수 있습니다.)


13. CSDADC의 핀매핑도 같은 방식으로 해줍니다.


14. 이제 감지되었는지 아닌 지를 LED로 확인하기 위해 LED 모듈을 올립니다.(처음엔 PRT0DR로 직접 제어를 했지만 LED 모듈까지 있는 것을 보고 감탄사 연발)


15. LED 모듈에 사용할 포트를 설정하고 Active 방식을 설정합니다.(아시겠지만 포트에서 직접 High, Low를 해주는 경우 Active High, Vcc 라인에서 LED를 통해 포트로 들어오는 경우 Active Low입니다.) 





16. 2번째 LED도 위와 같은 방식으로 설정하여 줍니다.


17. 하다보면 핀 번호를 잊어버리는 경우도 있는데 Cypress는 친절하게 핀아웃까지도 보여줍니다.
View -> Pinout Editer으로 시작되는 것을 선택하면 아래 그림과 같이 친절하게 인, 아웃인지까지도 나와줍니다. 



18. 이제 CSDADC에서 입력핀으로 사용할 포트를 설정하기 위해 CSD Wizard로 설정해줍니다.
우측 Workspace Explorer의 CSDADC(녹색)모듈에서 마우스 우측 버튼을 클릭하면 항목이 나옵니다.


19. 위저드 화면에서 Sliders는 사용하지 않으므로 Sliders의 숫자는 0으로 바꿨습니다.


20. 정전용량 터치 핀으로 사용할 핀에 우측 녹색으로 된 SW0을 드래그하여 원하는 핀에 놓아줍니다.
(우측내용에서 보시다시피 오렌지 색으로 된 핀에만 설정할 수 있습니다.)


21. 설정을 하고 나면 적색으로 변경되고 매핑된 핀의 이름이 나오게 됩니다.



22. 이제 프로그램을 짜기위해 소스 파일로 갑니다.
우측 Workspace Explorer에서 Source Files에서 main.c를 더블클릭해줍니다.




23. 프로그램 중 모듈들의 함수를 확인하기위해서는 우측 Workspace Explorer에서 Lib 내부의 헤더 파일을 참조하시면 됩니다.
모듈에 대한 모든 것들이 함수화 되어 있어서 MCU를 모르더라도 짤 수 있을 것 같아 보입니다.
(CSD 관련 모듈들은 노이즈 부분 관련 알고리즘까지 들어 있어서 여러모로 편했습니다. 초코렛 폰에 처음 적용되어 인기를 끌었던 Cypress지만 요즘은 여타칩들이 CSD관련 패리패럴이 없더라도 ADC 포트만 있으면 모두 정전용량 방식 터치 구현이 가능해져 매리트가 그다지 많지는 않아 보입니다. 거기다 단가도 동일 기능정도의 MCU가 1000원이하인데 비해 3000원의 가격은 너무 터무니 없이 비싼 견적이었습니다. 아무리 샘플이라고 하더라도요.)



 


 


 


Posted by 초보 HW 엔지니어 로망와니

댓글을 달아 주세요

2011.10.08 07:58

 

1. http://www.cypress.com/ 사이트에서 PSoc Designer를 검색하여 다운을 받습니다.(가입을 하셔야 다운 받을 수 있습니다.)


2. 다운 받은 PSoCDesignerSetup을 실행 시킵니다.(닷넷 2.0이 안 깔려있으면 중간에 다운 받을 수 있도록 자동으로 도와줍니다. 없으면 깔고 다시 설치하시면 됩니다.)

 

 

 

 

3. 자동 실행에 몸을 맡기고... 설치가 완료되면 PSoC Designer을 실행시킵니다.

4. 다운 받을 때 등록하셨던 아이디와 비번을 넣어줍니다.

5. 짜잔~~ PSoC Designer 실행화면...

 

 

 

Posted by 초보 HW 엔지니어 로망와니

댓글을 달아 주세요