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

MCU: PIC18F45K20

IDE: MPLAB X IDE v6.00

Compiler: XC8

 

안녕하세요.

이번 시간에는 데이터시트를 보고 PIC18F45K20의 GPIO를 제어하도록 해 보겠습니다

 

보드의 정보는 아래 링크에서 확인 할 수 있습니다.

DM164130-4 - PICKIT 44-PIN DEMO BOARD (PIC18F45K20) | Microchip Technology

 

Dynamic Dev Tool Page | Microchip Technology

Part Number: Quantity: Price per Unit (in USD): Total Amt:

www.microchip.com

 

 

1. System Clock 설정

    1) 내부 오실레이터 사용

    2) PLL 사용

 

2. GPIO 설정

 

 

 

 

우선 프로젝트가 생성되면 Source Files에 main.c를 생성해줍니다.

 

 

그러면 아래와 같이 작성된 파일이 생성됩니다.

 

#include <xc.h>

void main(void) {
    return;
}

 

 

 

1. System Clock 설정

아래 사진은 PIC18F45K20의 클럭 소스 블럭 다이어그램을 나타냅니다.

저희는 16MHz의 내부 오실레이터와 PLL을 사용할 것이기 때문에 빨간 라인을 따라 설정하게 됩니다.

 

FOSC<3:0>, OSCCON<1:0>, OSCCON<6:4>, OSCTUNE<6> 가 사용됩니다.

 

여기서 FOSC<3:0>은 CONFIG1H 레지스터 안에 있습니다. 

 

하지만 이를 코드로 직접 접근 할 수 없고 Set Configuration Bits 에서 설정해야합니다. Produection > Set Configuration Bits를 클릭합니다.

 

 

그러면 아래 이미지와 같은 Configuration Bits 창이 생성됩니다. 여기서 FOSC를 INTIO67로 설정하고, Watchdog Timer Enable bit를 OFF로 설정하겠습니다.

설정이 완료되면 아래 "Generate Source Code to Output 버튼을 클릭합니다.

그러면 Config Bits Source 창이 생성되며 안에 내용을 복사하여 main.c 의 맨 위에 붙여넣기 합니다.

 


// PIC18F45K20 Configuration Bit Settings

// 'C' source line config statements

// CONFIG1H
#pragma config FOSC = INTIO67   // Oscillator Selection bits (Internal oscillator block, port function on RA6 and RA7)
#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>

void main(void) {
    return;
}

 

이제 나머지 설정을 하겠습니다.

16MHz로 설정하기 위해 OSCCON.IRCF 필드를 7로 설정

PLL 적용하기 위해 OSCCON.SCS 필드를 0으로 설정, OSCTUNE.PLLEN 필드를 1로 설정합니다.

 

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

 

2. GPIO 설정

gpio설정을 위해서는 TRISx, PORTx, LATx 가 있습니다.

 

// EX) PORTD
TRISD: D포트 input(1) / Output(0) 설정

LATD: D포트 출력 Low(0) / High(1) 설정
PORTD: D포트 입력레벨 Read (=TRISD == 1), D포트 출력 Low(0), High(1) (=TRISD == 0) 설정

 

D포트라서 그렇지 아날로그 기능이 있는 포트의 경우 ANSELx 레지스터도 반드시 Digital로 설정해주어야 정상 동작합니다.  PIC을 처음 사용하는 많은 분들이 놓치는 부분입니다.

 

여기서 저는 D포트를 출력포트로 사용할 것이기 때문에 TRISD = 0x00으로 설정하고 1초마다 포트 출력이 토글되도록 프로그래밍 합니다.

 

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

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

void main(void) {
    
    Initialize_SystemClock();
    Initialize_Port();
    
    while(1) {
        LATD ^= 0xFF;
        __delay_ms(1000);
    }
    
    return;
}

 

위 코드를 컴파일하면 아래와 같이 _XTAL_FREQ를 식별할 수 없다는 에러 메세지가 나타납니다.

컴파일 아이콘

 

에러 메세지

 

이를 해결하기 위해 #define _XTAL_FREQ (64000000UL)을 main.c 상단에 넣어줍니다.

 

아래는 전체 코드 입니다.

// 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)

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

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

void main(void) {
    
    Initialize_SystemClock();
    Initialize_Port();
    
    while(1) {
        LATD ^= 0xFF;
        __delay_ms(1000);
    }
    
    return;
}

컴파일을 다시 하면 성공메세지가 나타납니다.

 

Make and Program Device Main Project 아이콘을 클릭하여 MCU에 프로그램을 넣습니다.

 

 

정상적으로 다운로드가 완료되었다면 Programming/Verify complete 메세지를 확인할 수 있고,

1초마다 PORTD가 토글되는 것을 볼 수 있습니다.

반응형

안녕하세요.

 

Microchip사의 8bit PIC을 사용하기 위한 MPLABX 환경을 구성해 보겠습니다.

 

우선 PIC은 MPLABX 라고 불리우는 IDE를 사용합니다. 아래 링크에서 다운 받아 줍니다.

MPLAB® X IDE | Microchip Technology

 

MPLAB® X IDE | Microchip Technology

MPLAB® X Integrated Development Environment (IDE) is an expandable, highly configurable software program that incorporates powerful tools to help you discover, configure, develop, debug and qualify embedded designs for most of our microcontrollers and di

www.microchip.com

 

컴파일러 종류에는 8bit MCU용 XC8, 16bit용 XC16, 32bit용 XC32가 있습니다.

저희는 8bit MCU를 사용할 것이기 때문에 XC8을 다운받아 설치합니다.

 

MPLAB® XC Compilers | Microchip Technology

 

MPLAB® XC Compilers | Microchip Technology

The MPLAB XC Network Server License is a shared license. It allows one person to compile at a time. Once used, the license remains captured by that person for 60 minutes, during which no one else can use it. If that person compiles again, the 60 minutes st

www.microchip.com

 

 

설치가 완료되었다면 MPLABX IDE를 실행합니다.

 

개발에 도움되는 대표적인 툴로는 초기화 코드를 자동 생성시켜주는 MPLAB Code Configurator(MCC)가 있습니다.

이것도 설치하겠습니다.

 

Tools->Plugins 메뉴를 선택합니다.

Available Plugins 탭으로 가서 MPLAB Code Configurator를 선택하고 Install 버튼을 클릭합니다.

Next를 누르면 설치가 진행되고 완료되면 재시작하도록 합니다.

 

 

재시작 되었을 때 위 사진 빨간 박스처럼 MCC 아이콘이 나타난다면 개발을 위한 환경설정은 끝났습니다.

 

반응형

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

[PIC][MPLABX][XC8]TIMER0 + 인터럽트  (0) 2022.06.17
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][XC8][MPLAB X][MCC] GPIO  (0) 2022.06.11
[XC8] 컴파일 Warning 메세지 띄우지 않기  (0) 2022.03.28

MCU: PIC18F45K20

IDE: MPLAB X IDE v6.00

Compiler: XC8

 

안녕하세요.

MCC를 이용하여 제가 가지고 있는 PIC18F45K20의 GPIO를 제어하도록 해 보겠습니다.

 

보드의 정보는 아래 링크에서 확인 할 수 있습니다.

DM164130-4 - PICKIT 44-PIN DEMO BOARD (PIC18F45K20) | Microchip Technology

 

Dynamic Dev Tool Page | Microchip Technology

Part Number: Quantity: Price per Unit (in USD): Total Amt:

www.microchip.com

 

회로도는 아래와 같습니다.

RD0~ RD7핀에 LED가 연결되어 있는것을 확인했습니다.

이것을 제어하도록 해 보겠습니다.

 

 

File->New Project 메뉴를 선택하여 프로젝트를 생성합니다.

 

Microchip Embedded 카테고리에 Standalone Project 프로젝트를 선택하고 Next >

 

 

Device 를 PIC18F45K20으로 선택하고 Tool은 알맞은 것으로 선택하고 Next >

 

 

설치된 XC8 컴파일러를 선택하고 Next > 

 

 

프로젝트 명과 위치를 선택하고, Encoding을 UTF-8로 설정하고 Finish. 

 

 

그럼 위와 같이  main.c 파일도 없는 프로젝트가 생성됩니다.

 

 

MCC 아이콘을 눌러 아래 페이지가 나타나면 Select MCC Classic을 클릭합니다.

 

 

Finish를 눌러줍니다.

 

 

조금 기다리다 보면 아래와 같은 화면이 나타납니다.

 

 

시스템 클럭 설정을 위해 왼쪽 메뉴에서 System Module을 눌러줍니다.

제가 가지고 있는 보드는 크리스탈이 달려있지 않아 내부 오실레이터(INTOSC)를 사용하도록 설정하고,

PLL을 사용하여 16MHz Current System clock으로 설정하도록 하겠습니다.

 

 

Pin Module에 PORT D에 output에 해당하는 자물쇠를 클릭하여 설정합니다.

 

이제 Generate 버튼을 눌러 프로젝트를 생성합니다.

 

 

Project 탭을 누르면 아래 화면과 같이 파일이 생성된 것을 볼 수 있습니다.

 

이제 main.c를 열어 1초마다 PORTD가 토글되도록 프로그래밍 해줍니다.

 

#include "mcc_generated_files/mcc.h"

/*
                         Main application
 */
void main(void)
{
    // Initialize the device
    SYSTEM_Initialize();

    // 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

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

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

    while (1)
    {
        PORTD ^= 0xFF;    // PORTD 토글
        __delay_ms(1000); // 1초 딜레이
        
        // Add your application code
    }
    //INTERRUPT_GlobalInterruptDisable();
}
/**
 End of File
*/

 

 

작성이 끝났다면 프로그래머(PICKIT4)를 회로 P1에 연결하고,

아래 버튼을 눌러 컴파일 &  PIC18F45K20에 다운로드 해 줍니다.

 

 

성공적으로 다운로드 되었다면 아래와 같이 Programming/Verify complete 메세지가 나타납니다.

 

 

이제 보드 PORTD에 연결되어있는 LED가 1초마다 깜빡이는것을 확인할 수 있습니다.

반응형

프로그램 작성하다 보면 함수로 기능은 만들어 놓고 호출하지 않는 경우가 생길 수 있습니다.

 

그렇게 되면 첨파일 할 때 아래와 같이 많은 warning 메세지가 발생하게 됩니다.

 

이 메세지를 안 나타나게 하기 위해서

 

프로젝트 Properties->XC8 Global Options ->XC8 Linker 메뉴에서 Additional options에 아래와 같이 작성하면 됩니다.

// 하나의 코드만 disable
--msgdisable=code1

// 여러 코드를 disable
--msgdisable=code1,code2,code3....

 

저는 520코드를 안 나타게 하기 위해 아래와 같이 작성했습니다.

 

 

 

위 설정을 하고 컴파일 하게 되면 아래와 같은 메세지가 나타마녀 520 코드를 가진 warning이 나타나지 않게 됩니다.

 

 

출처:PIC XC8 suppress or disable warning and error messages | Amixa Blog - Website & IT services in Western Pennsylvania

반응형

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

[PIC][MPLABX][XC8]TIMER0 + 인터럽트  (0) 2022.06.17
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

+ Recent posts