SEGGER Embedded Studio 버전: V6.32b (64bit)

SDK 버전: nRF52_SDK_17.1.0_ddde560

Example 프로젝트 : examples > ble_peripheral > ble_app_hrs

 

안녕하세요.

 

NRF52를 테스트 하기 위해 ble_app_hrs 프로젝트를 빌드했는데 다음과 같은 에러를 만났습니다.

_vfprintf.h 에러

 

_vfprintf.h: No such file or directory

 

해결책으로

SEGGER_RTT_Syscalls_SES.c 를 Exclude From Build 합니다.

 

 

 

 

Exclude from build 적용된 화면

 

적용 후 프로젝트를 Rebuild 하면 빌드가 성공을 볼 수 있습니다.

 

 

 

간혹 버전에 따라 .text, .rodata 사이즈 에러를 볼 수도 있습니다.

 

이를 해결하기 위해서 다음 포스팅을 확인해 보세요.

[NRF52][SEGGER].text is larger than specified size :: 취미 블로그 (tistory.com)

 

[NRF52][SEGGER].text is larger than specified size

SEGGER Embedded Studio 버전: V6.32b (64bit) SDK 버전: nRF52_SDK_17.1.0_ddde560 Example 프로젝트 : examples > ble_peripheral > ble_app_uart 안녕하세요. NRF52를 테스트 하기 위해 ble_app_uart 프로젝트..

jeonhj.tistory.com

 

 

이상입니다.

 

감사합니다.

 

 

출처

nRF5 SDK 17.1.0 examples is not compiling in latest SES (6.20a) - Nordic Q&A - Nordic DevZone - Nordic DevZone (nordicsemi.com)

 

nRF5 SDK 17.1.0 examples is not compiling in latest SES (6.20a) - Nordic Q&A - Nordic DevZone - Nordic DevZone

 

devzone.nordicsemi.com

 

반응형

SEGGER Embedded Studio 버전: V6.32b (64bit)

SDK 버전: nRF52_SDK_17.1.0_ddde560

Example 프로젝트 : examples > ble_peripheral > ble_app_uart

 

 

안녕하세요.

 

NRF52를 테스트 하기 위해 ble_app_uart 프로젝트를 빌드했는데 다음과 같은 에러를 만났습니다.

 

.text is larger than specified size
.rodata is larger than specified size

 

단지 Build를 했을 뿐인데.. 

 

구글링을 해 보니

flash_placement.xml 파일에서 메모리맵을 정의하는데, 여기서 .text와 .rodata의 size를 4바이트로 제한시켜 놓았습니다.  예제 코드를 Build해서 메모리 사용을 보면 Flash와 Ram 영역이 모두 KB단위로 이를 초과하기 때문에 발생하는 에러입니다. SEGGER Studio 버전에 따라 해당 에러가 나타나는것 같습니다.

 

메모리 제한

 

ble_app_uart프로젝트 메모리 사용량

 

 

프로젝트 내에 있는 flash_placement.xml 을 열어 .text 와 .rodata에 size를 제한한 것을 지워줍니다.

flash_placement.xml  파일 위치

 

size가 지워진 화면

 

flash_placement.xml  파일 저장후

 

Segger Studio에서 Close Solution

 

그리고 다시 솔루션을 연 후 Rebuild를 하면 정상적으로 Build가 성공하는 것을 볼 수 있습니다.

 

 

 

이상입니다.

감사합니다.

 

출처

빌드 오류 - 북유럽 Q&A - 노르딕 데브존 - 노르딕 데브존 (nordicsemi.com)

 

Build error - Nordic Q&A - Nordic DevZone - Nordic DevZone

 

devzone.nordicsemi.com

 

반응형

'MCU > NRF' 카테고리의 다른 글

[NRF52] 내부 온도 값 읽기  (1) 2022.09.14
[NRF52][SEGGER] repairing  (0) 2022.07.25
[NRF52][SEGGER]__vfprintf.h 에러 해결  (0) 2022.07.24
[nrf52]unknown type name '__printf_tag_ptr' 해결  (4) 2022.05.12

Nuxt: 2.15.3

 

Vue 프레임워크의 SSR(Server Side Rendering)인 Nuxt에서 Three.js 적용하는 법을 알아봅시다.

 

우선 Three.js를 설치합니다.

 

npm i --save three

 

 

설치하고 공식 manual 페이지에 있는 Drawing lines 예제를 작성합니다.

여기서 저는 Line 색을 빨강색(0xff0000)으로 변경했습니다.

 

Drawing lines – three.js docs (threejs.org)

 

three.js docs

 

threejs.org

 

 

 

<template>
  <div class="container" style="position:absolute">
  </div>
</template>

<script>
import * as THREE from 'three';

let camera, scene, renderer;

export default {
    name: 'TheCanvas',
    data: function() {

      return {
        
      }
    },
    mounted: function() {
      scene = new THREE.Scene();
      renderer = new THREE.WebGLRenderer();
      
      renderer.setSize( window.innerWidth, window.innerHeight );
      document.body.appendChild( renderer.domElement );

      camera = new THREE.PerspectiveCamera( 45, window.innerWidth / window.innerHeight, 1, 500 );
      camera.position.set( 0, 0, 100 );
      camera.lookAt( 0, 0, 0 );

      var material = new THREE.LineBasicMaterial( { color: 0xff0000 } );
      var points = [];
      points.push( new THREE.Vector3( - 10, 0, 0 ) );
      points.push( new THREE.Vector3( 0, 10, 0 ) );
      points.push( new THREE.Vector3( 10, 0, 0 ) );

      const geometry = new THREE.BufferGeometry().setFromPoints( points );
      const line = new THREE.Line( geometry, material );
      scene.add( line );
      renderer.render( scene, camera );
    }
}

</script>

<style>
</style>

 

 

작성이 완료되었으면 nuxt를 실행시킵니다.

 

npm run dev

 

빌드가 완료되고 페이지를 접속하면 다음과 같은 메세지를 보게 됩니다.

 

 

 

 

이를 해결하기 위해 nuxt.config.js > build에 

 

다음과 같이 입력합니다.

 

export default {
  ...
  
  ...
  
  
  ...
  // Build Configuration: https://go.nuxtjs.dev/config-build
  build: {
    transpile: [
      "three"
    ],
  }
}

 

그리고 다시 Nuxt를 실행하면

 

정상적인 페이지를 볼 수 있습니다.

 

 

 

출처

vue.js - How do I import Three.js into my Nuxt project - Stack Overflow

 

How do I import Three.js into my Nuxt project

I want to import modules in examples folder in THREE.js such as OBJLoader into my Nuxt Project. I can import main folder of THREE, but error occurs when trying to import modules in examples folder.

stackoverflow.com

Nuxt - The build Property (nuxtjs.org)

 

The build Property

Nuxt lets you customize the webpack configuration for building your web application as you want.

nuxtjs.org

 

반응형

MSChart 확장 라이브러리에 MSChart Extension 이 있다.

이 라이브러리를 사용하면 Zoom과 Pan, Cursor 기능을 쉽게 사용할 수 있다.

 

GitHub - Code-Artist/MSChartExtension: Windows Forms MSChart Extensions Method

 

GitHub - Code-Artist/MSChartExtension: Windows Forms MSChart Extensions Method

Windows Forms MSChart Extensions Method. Contribute to Code-Artist/MSChartExtension development by creating an account on GitHub.

github.com

 

이 라이브러리를 사용중에 Cursor를 프로그램적으로 지우고 싶었는데 아무리 해도 지울 수 있는 방법이 없었다.

 

Cursor

 

라이브러리를 분석해보니까 ClearCursor1() 메소드가 있었다.

그런데 접근한정자가 private인 것이다..

 

MSChartExtension Library의 일부

 

메소드 안을 보니 RemoveAnnotation을 하는 것이다.

 

그래서 chart의 Annotations 속성을 보니 Count가 4개가 있었다.

{chartAreaName}Cursor_1X

{chartAreaName}Cursor_1Y

{chartAreaName}cursor1_Label_BG

{chartAreaName}cursor1_Label

 

 

 

이 네개의 Annotation을 RemoveAnnotation을 호출하여 제거하도록 하였다.

chartMain.RemoveAnnotation(chartMain.ChartAreas[0].Name + "Cursor_1X");
chartMain.RemoveAnnotation(chartMain.ChartAreas[0].Name + "Cursor_1Y");
chartMain.RemoveAnnotation(chartMain.ChartAreas[0].Name + "cursor1_Label");
chartMain.RemoveAnnotation(chartMain.ChartAreas[0].Name + "cursor1_Label_BG");

 

 

그랬더니 잘 지워진다.

 

반응형

IDE: STM32CubeIDE 1.6.1

STM32CubeMX v6.3.0

MCU: STM32F407ZGT

 

CubeIDE를 사용하여 DSP 라이브러리를 사용하도록 해보겠습니다.

 

STM32CubeMX를 열어 STM32F407ZGT로 선택하였습니다.

 

DSP 라이브러리를 사용하기 위해 아래 위치에 있는 "Software Packs > Select Components"를 클릭합니다.

 

Software Packs 메뉴

 

여기서 CMSIS DSP가 보입니다. Selection을 Library로 선택하고 OK를 해 줍니다.

만약 ARM.CMSIS가 설치 되어 있지 않다면 Install을 해 줍니다.

CMSIS DSP Library 선택

 

그러면 왼쪽 탭에 Software Packs 메뉴가 생기고 ARM.CMSIS.5.6.0을 클릭하여 CMSIS DSP를 체크해 줍니다.

 

CMSIS DSP 체크

 

 

클럭과 프로젝트 옵션 선택 해 주고 

 

Generate Code를 해 줍니다.

 

STM32CubeIDE로 가서 해당 프로젝트를 Import하여 프로젝트 구조를 보면 아래와 같이 Middlewares에 libarm_cortexM4lf_math.a 와 arm_math.h가 포함된 것을 확인 할 수 있습니다.

 

이제 main.c 에 #include "arm_math.h" 를 넣어주고 컴파일을 해 봅니다.

/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "gpio.h"

/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "arm_math.h"
/* USER CODE END Includes */

/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */

/* USER CODE END PTD */

/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */
/* USER CODE END PD */

/* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM */

/* USER CODE END PM */

/* Private variables ---------------------------------------------------------*/

/* USER CODE BEGIN PV */

/* USER CODE END PV */

/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
/* USER CODE BEGIN PFP */

/* USER CODE END PFP */

/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */

/* USER CODE END 0 */

/**
  * @brief  The application entry point.
  * @retval int
  */
int main(void)
{
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  /* USER CODE BEGIN 2 */

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}

 

 

이제 STM32에서 DSP 라이브러리를 사용할 준비를 마쳤습니다.

 

프로젝트 속성에 가면 다음과 같은 부분이 설정되어 있는것을 확인 할 수 있습니다.

반응형

MCU: PIC18F45K20

IDE: MPLAB X IDE v6.00

Compiler: XC8 v2.36

 

 

데이터시트를 참조하여 인터럽트를 사용하여 타이머를 구동해 보도록 해 보겠습니다.

 

File > New Project를 클릭하여 프로젝트를 생성합니다.

Standalone Project 선택 후 Next >

 

알맞는 Device를 선택하고 Next >

 

Compiler 선택하고 Next >

 

 

Project Name, Location 설정하고 Finish

 

 

프로젝트 생성 완료

 

main.c 파일을 생성합니다.

 

 

기본 설정 코드는 아래 링크에서 사용했던 것을 사용합니다.

[PIC][MPLABX][XC8] GPIO :: 취미 블로그 (tistory.com)

 

[PIC][MPLABX][XC8] GPIO

MCU: PIC18F45K20 IDE: MPLAB X IDE v6.00 Compiler: XC8 안녕하세요. 이번 시간에는 데이터시트를 보고 PIC18F45K20의 GPIO를 제어하도록 해 보겠습니다 보드의 정보는 아래 링크에서 확인 할 수 있습니다. DM164..

jeonhj.tistory.com

 

 

 

 

1. Timer0 레지스터

아래는 타이머0의 블럭 다이어그램입니다.

 

 

타이머 0 인터럽트 플래그인 TMR0IF는

8Bit Mode에서는 TMR0가 255 -> 0 으로 되었을 때

16Bit Mode에서는 TMR0가 65535 - > 0 으로 되었을 때 

1로 설정됩니다.

 

TMR0ON: Timer0 Enable / Stop 설정

T08BIT: Timer0 8 bit / 16 bit 설정

T0CS : 클럭 소스 설정

T0SE: Timer0 Source Edge 설정 (T0CS = 1일때 유효)

PSA: 분주비 Enable / Disable 설정

T0PS: 분주비 설정

 

여기서 저는 클럭 소스를 Fosc/4로 설정하고, 16Bit Timer에 1:8의 분주비를 사용하겠습니다.

 

T0CON = 0b00000010;

 

 

2. Timer0 시간계산

Time = 4 / Fosc * Prescaler * Counter

 

 

저는 

16Bit Timer에 

Fosc = 64000000

Prescaler = 8

Counter = 2000

으로 설정하면 

 

4 / 64000000 * 8 * 2000 = 0.001 = 1ms가 됩니다.

 

즉 Timer0가 2000을 세면 1ms마다 인터럽트가 걸리도록 세팅합니다.

 

PIC18F45K20의 타이머는 기본적으로 0, 1, 2, ... 처럼 숫자를 올리는 UP Timer 입니다.

16Bit 모드에서 2000을 세면 인터럽트가 걸리기 위해서는 65535 - 2000  값으로 설정해 주어야 합니다.

 

65535 - 2000 = 63535 = 0xF82F

 

이 값을 TMR0H와 TMR0L 에 값을 써줍니다.

void Initialize_Timer0(void)
{
    T0CON = 0b00000010;
    TMR0H = 0xF8;
    TMR0L = 0x2F;
}

 

 

3. 인터럽트 설정

다음은 PIC18F45K20의 인터럽트 로직입니다.

 

위 TMR0 인터럽트가 걸리기 위한 조건은 다음과 같습니다.

 

TMR0IF == 1 && TMR0IE == 1 && TMR0IP  == 1

&&

GIEH / GIE == 1

 

PIC 18F45K20 은 인터럽트 벡터가 0x0008h, 0x0018h 두개가 있습니다.

높은 우선순위로 설정된 인터럽트 (xxIP == 1)는 0x0008h 인터럽트 벡터 번지에서 발생되고

낮은 우선순위로 설정된 인터럽트 (xxIP == 0)는 0x0018h 인터럽트 벡터 번지에서 발생됩니다.

 

 

저는 TMR0 인터럽트를 사용하기 위해서 다음과 같이 설정합니다.

 

void Initialize_Interrupt(void)
{
    INTCON = 0b10100000;
    INTCON2 = 0b00000100;
}

 

이제 인터럽트 벡터 함수를 만들어 주어야 합니다.

MPLAB_XC8_C_Compiler_User_Guide_for_PIC.pdf 파일을 보면 인터럽트에 대한 내용이 있습니다.

XC8 User Guide 문서에 나와있는 interrupt 벡터 함수 예제

 

위를 바탕으로 다음과 같이 함수를 만들어 줍니다.

volatile uint32_t tick = 0;

void TMR0_ISR(void)
{
    tick++;
}

void __interrupt(high_priority) InterruptManager (void)
{
    if(INTCONbits.TMR0IE == 1 && INTCONbits.TMR0IF == 1)
    {
        TMR0H = 0xF8;
        TMR0L = 0x2F;
        INTCONbits.TMR0IF = 0;
        TMR0_ISR();
    }
}

 

타이머0 인터럽트가 발생하면 TMR0H, TMR0L 값을 63535로 다시 설정하고 tick 변수 값을 1 증가시키도록 하였습니다.

 

또 TMR0IF 비트 설명을 보면 

TMR0 register has overflowed (must be cleared by software)

라고 software로 clear 시켜주어야 한다고 되어 있기 때문에 

INTCONbits.TMR0IF = 0;

코드도 넣어주었습니다.

 

이제 Timer0와 인터럽트 설정이 끝났습니다.

 

이제 초기화 함수를 부르는 코드와 1초마다 PORTD를 토글 시키는 코드를 작성합니다.

// PIC18F45K20 Configuration Bit Settings

// 'C' source line config statements

// CONFIG1H
#pragma config FOSC = INTIO67     // Oscillator Selection bits (HS oscillator, PLL enabled (Clock Frequency = 4 x FOSC1))
#pragma config FCMEN = OFF      // Fail-Safe Clock Monitor Enable bit (Fail-Safe Clock Monitor disabled)
#pragma config IESO = OFF       // Internal/External Oscillator Switchover bit (Oscillator Switchover mode disabled)

// CONFIG2L
#pragma config PWRT = OFF       // Power-up Timer Enable bit (PWRT disabled)
#pragma config BOREN = SBORDIS  // Brown-out Reset Enable bits (Brown-out Reset enabled in hardware only (SBOREN is disabled))
#pragma config BORV = 18        // Brown Out Reset Voltage bits (VBOR set to 1.8 V nominal)

// CONFIG2H
#pragma config WDTEN = OFF      // Watchdog Timer Enable bit (WDT is controlled by SWDTEN bit of the WDTCON register)
#pragma config WDTPS = 32768    // Watchdog Timer Postscale Select bits (1:32768)

// CONFIG3H
#pragma config CCP2MX = PORTC   // CCP2 MUX bit (CCP2 input/output is multiplexed with RC1)
#pragma config PBADEN = ON      // PORTB A/D Enable bit (PORTB<4:0> pins are configured as analog input channels on Reset)
#pragma config LPT1OSC = OFF    // Low-Power Timer1 Oscillator Enable bit (Timer1 configured for higher power operation)
#pragma config HFOFST = ON      // HFINTOSC Fast Start-up (HFINTOSC starts clocking the CPU without waiting for the oscillator to stablize.)
#pragma config MCLRE = ON       // MCLR Pin Enable bit (MCLR pin enabled; RE3 input pin disabled)

// CONFIG4L
#pragma config STVREN = ON      // Stack Full/Underflow Reset Enable bit (Stack full/underflow will cause Reset)
#pragma config LVP = ON         // Single-Supply ICSP Enable bit (Single-Supply ICSP enabled)
#pragma config XINST = OFF      // Extended Instruction Set Enable bit (Instruction set extension and Indexed Addressing mode disabled (Legacy mode))

// CONFIG5L
#pragma config CP0 = OFF        // Code Protection Block 0 (Block 0 (000800-001FFFh) not code-protected)
#pragma config CP1 = OFF        // Code Protection Block 1 (Block 1 (002000-003FFFh) not code-protected)
#pragma config CP2 = OFF        // Code Protection Block 2 (Block 2 (004000-005FFFh) not code-protected)
#pragma config CP3 = OFF        // Code Protection Block 3 (Block 3 (006000-007FFFh) not code-protected)

// CONFIG5H
#pragma config CPB = OFF        // Boot Block Code Protection bit (Boot block (000000-0007FFh) not code-protected)
#pragma config CPD = OFF        // Data EEPROM Code Protection bit (Data EEPROM not code-protected)

// CONFIG6L
#pragma config WRT0 = OFF       // Write Protection Block 0 (Block 0 (000800-001FFFh) not write-protected)
#pragma config WRT1 = OFF       // Write Protection Block 1 (Block 1 (002000-003FFFh) not write-protected)
#pragma config WRT2 = OFF       // Write Protection Block 2 (Block 2 (004000-005FFFh) not write-protected)
#pragma config WRT3 = OFF       // Write Protection Block 3 (Block 3 (006000-007FFFh) not write-protected)

// CONFIG6H
#pragma config WRTC = OFF       // Configuration Register Write Protection bit (Configuration registers (300000-3000FFh) not write-protected)
#pragma config WRTB = OFF       // Boot Block Write Protection bit (Boot Block (000000-0007FFh) not write-protected)
#pragma config WRTD = OFF       // Data EEPROM Write Protection bit (Data EEPROM not write-protected)

// CONFIG7L
#pragma config EBTR0 = OFF      // Table Read Protection Block 0 (Block 0 (000800-001FFFh) not protected from table reads executed in other blocks)
#pragma config EBTR1 = OFF      // Table Read Protection Block 1 (Block 1 (002000-003FFFh) not protected from table reads executed in other blocks)
#pragma config EBTR2 = OFF      // Table Read Protection Block 2 (Block 2 (004000-005FFFh) not protected from table reads executed in other blocks)
#pragma config EBTR3 = OFF      // Table Read Protection Block 3 (Block 3 (006000-007FFFh) not protected from table reads executed in other blocks)

// CONFIG7H
#pragma config EBTRB = OFF      // Boot Block Table Read Protection bit (Boot Block (000000-0007FFh) not protected from table reads executed in other blocks)

// #pragma config statements should precede project file includes.
// Use project enums instead of #define for ON and OFF.


#include <xc.h>
#define _XTAL_FREQ (64000000UL)

volatile uint32_t tick = 0;

void Initialize_SystemClock(void)
{
    OSCCONbits.IRCF = 0b111;
    OSCCONbits.SCS = 0b00;
    OSCTUNEbits.PLLEN = 1;
}

void Initialize_Port(void)
{
    TRISD = 0x00;
}

void Initialize_Timer0(void)
{
    T0CON = 0b00000010;
    TMR0H = 0xF8;
    TMR0L = 0x2F;
}

void Run_Timer0(void)
{
    T0CONbits.TMR0ON = 1;
}

void Stop_Timer0(void)
{
    T0CONbits.TMR0ON = 0;
}

void Initialize_Interrupt(void)
{
    INTCON = 0b10100000;
    INTCON2 = 0b00000100;
}

void TMR0_ISR(void)
{
    tick++;
}

void __interrupt(high_priority) InterruptManager (void)
{
    if(INTCONbits.TMR0IE == 1 && INTCONbits.TMR0IF == 1)
    {
        TMR0H = 0xF8;
        TMR0L = 0x2F;
        INTCONbits.TMR0IF = 0;
        TMR0_ISR();
    }
}

void main(void)
{
    uint32_t time = 0;
    
    Initialize_SystemClock();
    Initialize_Port();
    
    Initialize_Timer0();
    Initialize_Interrupt();
    
    Run_Timer0();
    
    while (1) {
        if (tick - time > 1000) {
            time = tick;
            PORTD ^= 0xFF;
        }
    }
    return;
}

 

반응형

'MCU > PIC' 카테고리의 다른 글

Microchip Programmer & Debugger  (0) 2022.06.15
[PIC][MPLABX][XC8][MCC]TIMER0 + 인터럽트  (0) 2022.06.15
[PIC][MPLABX][XC8] GPIO  (0) 2022.06.14
[PIC][MPLABX][XC8] 개발환경 구축  (0) 2022.06.11
[PIC][XC8][MPLAB X][MCC] GPIO  (0) 2022.06.11
[XC8] 컴파일 Warning 메세지 띄우지 않기  (0) 2022.03.28

현재 Microchip 홈페이지에 나오는 디버거의 종류로는 아래와 같이 7종류가 있습니다.

 

디버거 별 사용할 수 있는 MCU와 IDE가 나와 있으니 잘 확인해 보고 선택해야 할 것 같습니다.

 

저는 개인적으로는 PICKIT4를 추천드립니다. (한국마이크로칩사에서도 이걸 추천하더라고요..)

 

 

출처: Programmers and Debuggers | Microchip Technology

 

Programmers and Debuggers | Microchip Technology

We offer a selection of programmers and debuggers to support your development using PIC®, AVR® and SAM microcontrollers (MCUs) and dsPIC® Digital Signal Controllers (DSCs). They deliver seamless compatibility and feature graphical, drag-and-drop progr

www.microchip.com

 

반응형

MCU: PIC18F45K20

IDE: MPLAB X IDE v6.00

Compiler: XC8 v2.36

 

 

MCC로 프로젝트를 생성하고 인터럽트를 사용하여 타이머를 구동해 보도록 해 보겠습니다.

 

File > New Project를 클릭하여 프로젝트를 생성합니다.

Standalone Project 선택 후 Next >

 

알맞는 Device를 선택하고 Next >

 

Compiler 선택하고 Next >

 

Project Name, Location 설정하고 Finish

 

프로젝트 생성 완료

 

MCC 버튼을 눌러 설정을 불러옵니다.

 

이 버튼이 없다면,  [PIC][XC8][MPLABX] 개발환경 구축 :: 취미 블로그 (tistory.com)

 

[PIC][XC8][MPLABX] 개발환경 구축

안녕하세요. Microchip사의 8bit PIC을 사용하기 위한 MPLABX 환경을 구성해 보겠습니다. 우선 PIC은 MPLABX 라고 불리우는 IDE를 사용합니다. 아래 링크에서 다운 받아 줍니다. MPLAB® X IDE | Microchip Techno..

jeonhj.tistory.com

여기를 참조하여 설치를 해 주세요.

 

 

잠시 기다리면 다음 화면이 나옵니다. Select MCC Classic 버튼을 클릭합니다

Select MCC Classic 클릭

 

라이브러리 선택 페이지인데 사용하지 않으므로 Finish 버튼을 눌러줍니다.

Finish 클릭

 

 

잠시 기다리면 MCC 프로젝트가 생성됩니다.

 

MCC 프로젝트 생성 완료

 

1. System Module 설정

저의 보드에는 크리스탈이 달려있지 않으므로 내부 Oscillator 블럭을 사용하고 PLL을 사용하도록 설정하겠습니다.

 

2. 타이머0 설정

Device Resources에 TMR0를 +클릭합니다

TMR0 Resource 추가

 

 

그러면 Peripherals에 TMR0가 나타나게 되고

저는 1ms마다 인터럽트가 발생되도록 아래와 같이 설정했습니다.

TIMER 0 설정

 

3. 인터럽트 설정

System > Interrupt Module 페이지로 가면 TMR0 인터럽트가 Enabled 된 것을 확인합니다.

 

TMR0 인터럽트 Enabled 설정

 

4. GPIO 설정

타이머가 정상 동작하는지 눈으로 확인하기 위해 GPIO를 설정해줍니다.

저는 PORTD0~7번 핀을 Output으로 설정하겠습니다.

GPIO 설정

설정이 완료되었으면 Generate 버튼을 눌러 코드를 생성합니다.

 

코드 Generate

 

MCC 프로젝트를 종료하려면 MCC 버튼을 다시 누르면 됩니다.

 

 

이제 프로젝트 트리를 보면 다음과 같이 코드 파일이 생성된 것을 볼 수 있습니다.

 

Main.c에 다음과 같이 작성해주었습니다.

#include "mcc_generated_files/mcc.h"

/*
                         Main application
 *  1ms마다 인터럽트를 발생시켜 tick을 증가시키고,
 *  1초마다 PORTD 출력을 토글시키기
 */

volatile uint32_t tick = 0;

void TIMER0_InterruptHandler(void){
    tick ++;
}

void main(void)
{
    uint32_t time = 0;
    // Initialize the device
    SYSTEM_Initialize();

    // Timer0 인터럽트 핸들러 설정
    TMR0_SetInterruptHandler(TIMER0_InterruptHandler);
    // If using interrupts in PIC18 High/Low Priority Mode you need to enable the Global High and Low Interrupts
    // If using interrupts in PIC Mid-Range Compatibility Mode you need to enable the Global and Peripheral Interrupts
    // Use the following macros to:

    // Enable the Global Interrupts
    INTERRUPT_GlobalInterruptEnable();

    // Disable the Global Interrupts
    //INTERRUPT_GlobalInterruptDisable();

    // Enable the Peripheral Interrupts
    //INTERRUPT_PeripheralInterruptEnable();

    // Disable the Peripheral Interrupts
    //INTERRUPT_PeripheralInterruptDisable();

    while (1)
    {
        // 1초마다 PORTD 토글
        if (tick - time >= 1000) {
            time = tick;
            PORTD ^= 0xFF;
        }
        // Add your application code
    }
}
/**
 End of File
*/

 

컴파일 하고, 프로그램을 다운로드 해 줍니다.

 

다운로드가 완료되면 1초마다 PORTD가 토글되는 것을 볼 수 있습니다.

반응형

'MCU > PIC' 카테고리의 다른 글

[PIC][MPLABX][XC8]TIMER0 + 인터럽트  (0) 2022.06.17
Microchip Programmer & Debugger  (0) 2022.06.15
[PIC][MPLABX][XC8] GPIO  (0) 2022.06.14
[PIC][MPLABX][XC8] 개발환경 구축  (0) 2022.06.11
[PIC][XC8][MPLAB X][MCC] GPIO  (0) 2022.06.11
[XC8] 컴파일 Warning 메세지 띄우지 않기  (0) 2022.03.28

+ Recent posts