PIC

PIC IO PORT Test

롬돌이 2022. 12. 23. 16:56
반응형

1. 개요 : I/O 포트를 테스트 해 본다.

Port ABI/O 포트를 테스트 해 본다.

Port A While 문 속에서 토글 시키고, Port B는 타이머 인터럽트를 발생시켜서 동작시킨다.

 

2. Main 함수

void main(void)

{

char i = 0;                              // 변수 설정

/* 16MHz 설정방법*/   

IRCF1 = 1;                              // Configuration bit 설정 시 PLLON 시켰으므로

IRCF0 = 1;                              // OSCCON 레지스터의 IRRCF1:0 비트를 11

                                          // 설정해서 Main Clock16MHz로 설정한다.

while(ICSS==0);                        // ICSS가 셋 될 때 까지 기다린다. 0.5% 안정상태까지.

/* 16MHz 설정완료*/   

 

GPIO_Initialize();                       // GPIO 설정

Timer1_Initialize();                     // Timer 1 초기화

TMR1ON = 1;                          // Timer 1 Start

while(1){                                // Loop

for(i=0;i<0xff;i++);          // Delay

PORTA = ~PORTA;          // Port A Toggle

}

return;

}

 

2. GPIIO 초기화

void GPIO_Initialize(void)

{

ANSELB = 0x00;  // PIC16F722APort B에도 아날로그 핀이 있어 디지털 사용시

                                // 아날로그 속성을 비활성화 시켜야한다.

TRISB = 0x00;     // TRISBPort BIn/Out을 설정하는 레시스터로, 0일 경우 해당

                                // 핀은 Output, 1일 경우 해당 핀을 Input으로 설정된다.

PORTB = 0xFF;   // 출력 설정 후 High를 출력 시킨다.

   

ANSELA = 0x00; // PIC16F722APort A가 아날로그 핀이어서 디지털 사용시

                                // 아날로그 속성을 비활성화 시켜야한다.

 

TRISA = 0x00;    // TRISAPort BIn/Out을 설정하는 레시스터로, 0일 경우 해당

                                // 핀은 Output, 1일 경우 해당 핀을 Input으로 설정된다.

PORTA = 0xFF;   // 출력 설정 후 High를 출력 시킨다.

GIE = 1;           // Global Interrupt Enable 설정

}

 

3. Timer 1 초기화 : 16비트 타이머

void Timer1_Initialize(void)

{

TMR1CS1 = 0;    // TMR1CS1:0 01로 설정하여 Timer 1의 클럭을 시스템 클럭으로

                     // 설정한다.

TMR1CS0 = 1;

T1CKPS1 = 1;     // T1CKPS1:011로 설정하여 1:8 Prescale value로 설정한다.

T1CKPS0 = 1;     // 16MHz를 사용하므로 타이머 1의 클럭은 2MHz를 사용한다.

                     // 따라서 0.5us당 타이머 1의 값이 1 증가한다.

T1OSCEN = 1;    // LP 오실레이터 활성화 제어 비트, 타이머 1의 오실레이터 입력

                     // 회를 활성화시킴

T1SYNC = 0;      // 타이머 1을 외부클럭으로 사용할 때 사용하는 것임 시스템 클럭과

                     // 외부 클럭 입력을 동기화 시키도록 할 경우 사용함

PIR1bits.TMR1IF = 0;       // 타이머 1 플래그 클리어

PEIE = 1;          // 주변장치 인터럽트 활성화 비트 셋

TMR1IE = 1;      // 타이머 1 인터럽트 활성화 비트 셋

}

 

4. 인터럽트 서비스 루틴

* 인터럽트 서비스 루틴 설정시 아래와 같이 사용해야한다.

void + __(underbar 2)+interrupt()+ISR(void)

여기서 underbar까지는 이해가 됐는데 “interrupt”뒤에 “( )”를 꼭 붙여야 한다. 일반적으로 다른 IC들은 안붙인거 같은데

 

void __interrupt() ISR(void)

{

    if(PIR1bits.TMR1IF)     // 타이머 1 overflow 인터럽트 발생시 해당 인터럽트 플래그를 확인

    {

        TMR1L = (unsigned char)(61439); // 타이머 1의 하위 카운터 레지스터 값 재적재

        TMR1H = (unsigned char)(61439 >> 8); // 타이머 1의 상위 카운터 레지스터 값 재적재

        PORTB = ~PORTB;          // PORTB 토글

        PIR1bits.TMR1IF=0;          // 타이머 1 오버플로우 플래그 클리어

    }

}

 

5. PIR1 설정

// Register: PIR1

#define PIR1 PIR1

extern volatile unsigned char           PIR1                __at(0x00C);

// PIR1을 어드레스 0x00C로 설정

#ifndef _LIB_BUILD

asm("PIR1 equ 0Ch");      // _LIB_BUILD가 없으면 어셈으로 PIR10Ch에 할당

#endif

// bitfield definitions

typedef union {

    struct {

        unsigned TMR1IF                 :1;          // PIR10번 비트

        unsigned TMR2IF                 :1;          // PIR11번 비트

        unsigned CCP1IF                 :1;          // PIR12번 비트

        unsigned SSPIF                  :1;           // PIR13번 비트

        unsigned TXIF                   :1;           // PIR14번 비트

        unsigned RCIF                   :1;           // PIR15번 비트

        unsigned ADIF                   :1;          // PIR16번 비트

        unsigned TMR1GIF                :1;         // PIR17번 비트

    };

} PIR1bits_t;

extern volatile PIR1bits_t PIR1bits __at(0x00C);

PIR1에대한 구조체 선언 및 어드레스 할당.

 

6. Build

해당 프로젝트를 우측마우스버튼으로 선택해서 팝업 창에서 Build를 선택한다.

 

make -f nbproject/Makefile-default.mk SUBPROJECTS= .build-conf

make[1]: Entering directory 'D:/Program/GoodPL/PIC16F722A/TestADC2/TestADC2.X'

make  -f nbproject/Makefile-default.mk dist/default/production/TestADC2.X.production.hex

make[2]: Entering directory 'D:/Program/GoodPL/PIC16F722A/TestADC2/TestADC2.X'

"C:\Program Files\Microchip\xc8\v2.40\bin\xc8-cc.exe"  -mcpu=16F722A -c   -mdfp="C:/Program Files/Microchip/MPLABX/v6.05/packs/Microchip/PIC16Fxxx_DFP/1.3.42/xc8"  -fno-short-double -fno-short-float -O0 -fasmfile -maddrqual=ignore -xassembler-with-cpp -mwarn=-3 -Wa,-a -DXPRJ_default=default  -msummary=-psect,-class,+mem,-hex,-file  -ginhx32 -Wl,--data-init -mno-keep-startup -mno-osccal -mno-resetbits -mno-save-resetbits -mno-download -mno-stackcall -mdefault-config-bits   -std=c99 -gdwarf-3 -mstack=compiled:auto:auto     -o build/default/production/newmain.p1 newmain.c

::: advisory: (2049) C99 compliant libraries are currently not available for baseline or mid-range devices, or for enhanced mid-range devices using a reentrant stack; using C90 libraries

"C:\Program Files\Microchip\xc8\v2.40\bin\xc8-cc.exe"  -mcpu=16F722A -Wl,-Map=dist/default/production/TestADC2.X.production.map  -DXPRJ_default=default  -Wl,--defsym=__MPLAB_BUILD=1   -mdfp="C:/Program Files/Microchip/MPLABX/v6.05/packs/Microchip/PIC16Fxxx_DFP/1.3.42/xc8"  -fno-short-double -fno-short-float -O0 -fasmfile -maddrqual=ignore -xassembler-with-cpp -mwarn=-3 -Wa,-a -msummary=-psect,-class,+mem,-hex,-file  -ginhx32 -Wl,--data-init -mno-keep-startup -mno-osccal -mno-resetbits -mno-save-resetbits -mno-download -mno-stackcall -mdefault-config-bits -std=c99 -gdwarf-3 -mstack=compiled:auto:auto      -Wl,--memorysummary,dist/default/production/memoryfile.xml -o dist/default/production/TestADC2.X.production.elf  build/default/production/newmain.p1     

::: advisory: (2049) C99 compliant libraries are currently not available for baseline or mid-range devices, or for enhanced mid-range devices using a reentrant stack; using C90 libraries

 

Memory Summary:

    Program space        used    5Fh (    95) of   800h words   (  4.6%)

    Data space           used     6h (     6) of    80h bytes   (  4.7%)

    EEPROM space         None available

    Configuration bits   used     2h (     2) of     2h words   (100.0%)

    ID Location space    used     4h (     4) of     4h bytes   (100.0%)

 

make[2]: Leaving directory 'D:/Program/GoodPL/PIC16F722A/TestADC2/TestADC2.X'

make[1]: Leaving directory 'D:/Program/GoodPL/PIC16F722A/TestADC2/TestADC2.X'

 

BUILD SUCCESSFUL (total time: 1s)

Loading code from D:/Program/GoodPL/PIC16F722A/TestADC2/TestADC2.X/dist/default/production/TestADC2.X.production.hex...

Program loaded with pack,PIC16Fxxx_DFP,1.3.42,Microchip

Loading completed

 

Make에 관련된 내용들이 나타나면서 Build 발생한다.

 

7. Debug

다시 프로젝트화면에서 프로젝트를 우측 마우스 클릭으로 선택하고 “Deug”를 선택한다.

위와 같은 창이 나타날 수 있으며(처음에만 나타남),

 

Tool을 선택해 주고 OK를 누른다.

주의 사항이 나타난다.

MPLAB IDE에서 선택된 것은 PIC16F722A인데 디버그 툴에 연결된 실물이 같은 것인지 확인해야한다. 3.3V 장치를 연결시켰다면 디버거가 디바이스 ID를 확인할 때 망가질 수도 있으니 5V 장치를 선택해라. 진행하기를 원하느가?

 

..이런..내용이다.

 

OK를 누르면

*****************************************************

 

 

 

Connecting to MPLAB PICkit 4

 

Currently loaded versions:

Application version...........00.08.54

Boot version..................01.00.00

Script version................00.05.35

Script build number...........86fedc5c2e

Tool pack version ............1.13.1519

Target voltage detected

Target device PIC16F722A found.

Device Revision Id  = 0x4

Device Id = 0x1b20

 

Calculating memory ranges for operation...

 

Erasing...

 

The following memory area(s) will be programmed:

program memory: start address = 0x0, end address = 0x7f

configuration memory

 

Programming/Verify complete

 

Running

와 같은 메시지가 나타나면서 동작이 이루어진다.

 

8. 결과 

https://youtube.com/shorts/gg0NXbQgp_w?feature=share 

 

 

반응형