บทที่ 3 การรับ และส่งข้อมูลจากภายนอก และการเขียนโปรแกรม เทอดศักดิ์ ลิ่วหาทอง สาขาวิชาอิเล็กทรอนิกส์ สถาบันเทคโนโลยีพระจอมเกล้าเจ้าคุณทหารลาดกระบัง
I/O Ports PIC มี I/O Port ชนิดต่างๆเพื่อใช้ติดต่อกับอุปกรณ์ต่อพ่วงผ่าน เช่น Digital I/O Ports Analog to Digital Converter Port Pulse Width Modulation (PWM) Ports
โครงสร้างของ I/O Ports ทุก Port ของ PIC สามารถกำหนดให้เป็น Input หรือ Output Port ก็ได้ ทุก Port จะมี Register อยู่ 3 ตัวคือ TRIS Register ใช้กำหนดให้ Port เป็น Input (TRIS=1) และ Output (TRIS=0) Port Register ใช้เก็บค่าที่อ่านได้จากอุปกรณ์ต่อพ่วง LAT Register ใช้เก็บค่าที่จะส่งไปให้อุปกรณ์ต่อพ่วง
ข้อห้ามของการนำเอา Output กับ Output มาต่อเชื่อมกัน เช่นถ้า Output ของ Not Gate ตัวบนเป็น 1 และตัวล่างเป็น 0 จะทำให้ไม่สามารถบอกได้ว่า Y มีสถานะเป็น 1 หรือ 0 และโดยปกติจะทำให้ Not Gate พังเสียหายได้
Tristate Buffer ถ้าต้องการนำ Output ของวงจรดิจิตอลมาต่อเชื่อมกันจะต้องต่อผ่าน Tristate Buffer เสมอ ถ้าขา Enable เป็น 0 จะทำให้ Output มีสถานะเป็นไปตามสถานะของ Input แต่ถ้าขา Enable เป็น 1 จะทำให้ Output มีสถานะเป็น High Impedance Tristate Buffer
โครงสร้างของ I/O Ports ถ้าต้องการให้ Port เป็น Input Port จะต้องเซ็ทให้ TRIS = 1 เพื่อให้ Output ของ Tristate Buffer ตัวบนเป็น High Impedance เพื่อตัดการเชื่อมต่อของ LAT ออกจากอุปกรณ์ต่อพ่วงที่อยู่ภายนอก ถ้าต้องการให้ Port เป็น Output Port จะต้องให้ TRIS = 0 เพื่อให้ Output ของ Tristate Buffer มีสถานะเดียวกับสถานะของ LAT
โครงสร้างของ I/O Ports
I/O Port ของ PIC18F8722 PWR = Power Supply O = Output I = Input ANA = Analog Signal DIG = Digital Output ST = Schmitt Buffer Input TTL = TTL Buffer Input X = Don’t Care
I/O Port ของ PIC18F8722
I/O Port ของ PIC18F8722
I/O Port ของ PIC18F8722
I/O Port ของ PIC18F8722
I/O Port ของ PIC18F8722
I/O Port ของ PIC18F8722
I/O Port ของ PIC18F8722
I/O Port ของ PIC18F8722
#include <p18f8722.h> #include <adc.h> #include <delays.h> #include <timers.h> #define NUMBER_OF_LEDS 8 #pragma code void main(void) { char LED[] = { 0b00000001, 0b00000011, 0b00000111, 0b00001111, 0b00011111, 0b00111111, 0b01111111, 0b11111111 }; int i=0; ADCON1 = 0b00001110; TRISAbits.TRISA5 = 1; TRISBbits.TRISB0 = 1; TRISD = 0; PORTD = 1; while(1) { if(PORTAbits.RA5==0) i++; if(i==8) i=7; PORTD = LED[i]; while(PORTAbits.RA5==0); } if(PORTBbits.RB0==0) i--; if(i<0) i=0; while(PORTBbits.RB0==0);
#include <p18f8722.h> #include <adc.h> #include <delays.h> #include <timers.h> #define NUMBER_OF_LEDS 8 #pragma code void main(void) { char LED[] = { 0b00000001, 0b00000011, 0b00000111, 0b00001111, 0b00011111, 0b00111111, 0b01111111, 0b11111111 }; int i=0; ADCON1 = 0b00001110; TRISAbits.TRISA5 = 1; TRISBbits.TRISB0 = 1; TRISD = 0; PORTD = 1; while(1) { if(PORTAbits.RA5==0) i++; if(i==8) i=7; PORTD = LED[i]; while(PORTAbits.RA5==0); } if(PORTBbits.RB0==0) i--; if(i<0) i=0; while(PORTBbits.RB0==0);