การทดลองที่ 1 I/O Port 16F87X

???????พอร์ตของ PIC16F877 จะประกอบด้วย PORTA, PORTB, PORTC, PORTD และพอร์ตของ PIC16F873 จะประกอบด้วย PORTA, PORTB, PORTC ในแต่ละพอร์ตนอกจากจะเป็น Digital I/O ปกติแล้วบางพอร์ตยังทำงานเป็น analog อินพุต ได้ด้วย ก่อนการใช้งานต้อง config พอร์ตก่อน

หลังจาก Power on Reset แล้วโดยปกติแล้ว PORTA จะกำหนดให้เป็นโหมด Analog

??????โครงสร้างพอร์ตของ PIC จะต่างจาก MCS-51 ตรงที่มี Register ที่กำหนดทิศทางของข้อมูลว่าเป็นอินพุตหรือเอาต์พุต หรือเรียกว่า TRIS Register เช่น TRISA

??????ในการ Compile จะให้ไฟล์เอ้าพุตออกมา อาจจะอยู่ในนามสกุล COF หรือ HEX ให้เข้าไปกำหนดให้เป็น HEX ก่อนโดยการกด Project –> Build Options… –> Project –> Restore Defaults

รูปที่ 1

?

??????ตอนแรกผมกะว่าจะใช้้บอร์ดของ ETT ตัวนี้โปรแกรมผ่าน Parallel Port แต่ Port ผมพัง ผมเลยใช้วิธีถอด IC มาโปรแกรมเอา แล้วทีนี้เกิดการผิดพลาดใส่เจ้า 16F877A กลับด้าน มันเลยลาโลกไปซะ ผมเคยต่อไมโครคอนโทรลเลอร์ของ ATMEL พวก 89C52 และ AVR เวลาต่อกลับขั้ว IC มันก็ร้อนๆนะ แต่ไม่ถึงกับพัง พอมาใช้ PIC + ความสะเพร่าของผม ต่อกลับด้านพังไปหลายตัวแล้ว

??????ผมเลยหาเบอร์ตระกูล 16F87X ที่พอมีอยู่ ก็มี 16F873A น่าจะพอแก้ขัดกันได้ ใครจะใช้ 16F877 ก็เปลี่ยน Device ใน MPLAB ได้เลยนะครับ

รูปที่ 2 บอร์ดทดลอง CP-PIC877 V2.0 ของ ETT

รูปที่ 3 ทำการทดลองใน Proto board

รูปที่ 4 Schematic ที่ใช้ในการทดลอง

สำหรับตัวโหลดที่ใช้ในการทดลองผมทำขึ้นมาเองครับ ผมจะเอาตัวโหลดเสียบที่ Target Board แล้วทำการโปรแกรมผ่านทาง ICD2??

การทดลองนี้เราจะเขียน Code ให้ LED ที่ต่อยู่กับ PORTB ติดเรียงกันไปจาก

ในส่วนของค่า Configure ใน MPLAB เนื่องจากเรากำหนดไว้ใน code แล้ว

บรรทัดนี้ __CONFIG(XT & WDTDIS & PWRTEN & BORDIS & LVPDIS & DEBUGDIS & UNPROTECT);

เราจึงไม่ต้อง Configure ใน MPLAB อีก

//****************************************************************//
//Project : first873.mcp
//Description : I/O Port
//Device : PIC16F873A
//By : ThaiEmbedded 2006
//****************************************************************//

#include <pic.h>
#include <stdio.h>
#include <stdlib.h>

__CONFIG(XT & WDTDIS & PWRTEN & BORDIS & LVPDIS & DEBUGDIS & UNPROTECT);

unsigned char i;
unsigned char dat;
//——————————————————————————//
// Delay (mSec)
//——————————————————————————//
void dmsec (unsigned int Count)
{ unsigned char i;
????? while (Count)
????? {
????? ????? for (i=0;i<=100;i++);
????? ????? Count–;
????? }
}
//——————————————————————————//
// Main Program
//——————————————————————————//
void main ()
{
?????TRISB = 0b00000000; //Output mode
????? while(1) //Loop Forever
????? {
?????????? dat = 0×01;
?????????? for(i=0;i<8;i++)
?????????? {
?????????? ????PORTB = dat;
????? ????? ???dat <<= 1;
????? ????? ???dmsec(500);
?????????? }
????? }
}

Download Code การทดลองที่ 1

บทความอื่นๆที่เกี่ยวข้อง

Leave a Reply