1. 개요 : I/O 포트를 테스트 해 본다.
Port A와 B의 I/O 포트를 테스트 해 본다.
Port A는 While 문 속에서 토글 시키고, Port B는 타이머 인터럽트를 발생시켜서 동작시킨다.
2. Main 함수
void main(void)
{
char i = 0; // 변수 설정
/* 16MHz 설정방법*/
IRCF1 = 1; // Configuration bit 설정 시 PLL을 ON 시켰으므로
IRCF0 = 1; // OSCCON 레지스터의 IRRCF1:0 비트를 11로
// 설정해서 Main Clock을 16MHz로 설정한다.
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; // PIC16F722A는 Port B에도 아날로그 핀이 있어 디지털 사용시
// 아날로그 속성을 비활성화 시켜야한다.
TRISB = 0x00; // TRISB는 Port B의 In/Out을 설정하는 레시스터로, 0일 경우 해당
// 핀은 Output, 1일 경우 해당 핀을 Input으로 설정된다.
PORTB = 0xFF; // 출력 설정 후 High를 출력 시킨다.
ANSELA = 0x00; // PIC16F722A는 Port A가 아날로그 핀이어서 디지털 사용시
// 아날로그 속성을 비활성화 시켜야한다.
TRISA = 0x00; // TRISA는 Port B의 In/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:0을 11로 설정하여 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가 없으면 어셈으로 PIR1을 0Ch에 할당
#endif
// bitfield definitions
typedef union {
struct {
unsigned TMR1IF :1; // PIR1의 0번 비트
unsigned TMR2IF :1; // PIR1의 1번 비트
unsigned CCP1IF :1; // PIR1의 2번 비트
unsigned SSPIF :1; // PIR1의 3번 비트
unsigned TXIF :1; // PIR1의 4번 비트
unsigned RCIF :1; // PIR1의 5번 비트
unsigned ADIF :1; // PIR1의 6번 비트
unsigned TMR1GIF :1; // PIR1의 7번 비트
};
} 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

'PIC' 카테고리의 다른 글
PIC16F1947 - I2C(Master Mode) (0) | 2025.04.16 |
---|---|
PIC16F1947 - I2C (0) | 2025.01.20 |
PIC16F1947 - PWM(Enhanced Mode) (1) | 2025.01.16 |
PIC16F1947 - HFINTOSC (0) | 2025.01.16 |
MPLAB X IDE 설치 및 사용 준비 (0) | 2022.12.23 |