I/O Interface, Polling, Current Sink + Source, Fan Out, Buffer, Voltage Translator
ตัวอย่างการต่ออุปกรณ์ต่อพ่วงเข้ากับ PIC16F877A
ความรู้พื้นฐานที่จำเป็นสำหรับ การเชื่อมต่ออุปกรณ์ต่อพ่วง การเชื่อมต่อไมโครคอนโทรลเลอร์เข้ากับอุปกรณ์ต่อพ่วงจำเป็นต้องเข้าใจ คุณสมบัติและการทำงานของอุปกรณ์ต่อพ่วง Timing Diagram ของสัญญาณต่างๆของอุปกรณ์ต่อพ่วง คุณสมบัติ ความสามารถและข้อจำกัดต่างๆทางกายภาพของวงจรหรือไอซี ดิจิตอลแต่ละตระกูล (Family)
คุณสมบัติของวงจรหรือไอซีดิจิตอล พารามิเตอร์ของแรงดันของวงจรดิจิตอล VIH แรงดันอินพุทต่ำสุดของโลจิก High VIL แรงดันอินพุทสูงสุดของโลจิก Low VOH แรงดันเอาท์พุทต่ำสุดของโลจิก High VOL แรงดันเอาท์พุทสูงสุดของโลจิก Low
คุณสมบัติของวงจรหรือไอซีดิจิตอล พารามิเตอร์ของแรงดันของไอซีตระกูลต่างๆ
คุณสมบัติของวงจรหรือไอซีดิจิตอล ในกรณีที่ต้องการนำไอซีต่างตระกูลกันมาใช้งานร่วมกัน จำเป็นจะต้อง พิจารณาพารามิเตอร์ต่างๆของแรงดันว่าสามารถต่อร่วมกันได้หรือไม่ สามารถต่อไอซีต่างตระกูลเข้าด้วยกันได้ในกรณีที่ VOH>VIH และ VOL<VIL เท่านั้น
คุณสมบัติของวงจรหรือไอซีดิจิตอล 3.3V to 5V MOSFET Voltage Translator Output 3.3 V เป็นโลจิก High NMOS จะ OFF ทำให้มีกระแส Source ไหลจาก ไฟเลี้ยงผ่าน R1 เข้า 5V Input Output 3.3 V เป็นโลจิก Low NMOS จะ ON ทำให้ 5V Input ต่อกับ Ground
คุณสมบัติของวงจรหรือไอซีดิจิตอล 3.3V to 5V DIODE OFFSET Voltage Translator Output 3.3 V เป็นโลจิก High D1 เป็น Forward Bias มีกระแสไหลจากไฟเลี้ยง 5V ผ่าน D1 ไปยังไฟเลี้ยง 3.3V ทำให้ 5V Input มีแรงดัน 4V เป็นโลจิก High Output 3.3 V เป็นโลจิก Low D2 เป็น Forward Bias มีกระแสไหลจากไฟเลี้ยง 5V ผ่าน D2 ลง Ground ทำให้ 5V Input มีแรงดัน 0.7V เป็นโลจิก Low
คุณสมบัติของวงจรหรือไอซีดิจิตอล 3.3V to 5V Transistor Voltage Translator Output 3.3 V เป็นโลจิก High Q1 ON และ Q2 OFF มีกระแสไหลจากไฟเลี้ยง 5V ผ่าน R 10K ทำให้ 5V Input เป็นโลจิก High Output 3.3 V เป็นโลจิก Low Q1 OFF และ Q2 ON มีกระแสไหลจากไฟเลี้ยง 5V ผ่าน Q2 ลง Ground ทำให้ 5V Input เป็น โลจิก Low
คุณสมบัติของวงจรหรือไอซีดิจิตอล 3.3V to 5V Transistor Clamp Voltage Translator Output 5 V เป็นโลจิก High Q1 ON มีกระแส Source จาก 5V Output ผ่าน R1 และ Q1 เข้าไฟเลี้ยง 3.3V ทำให้ 3.3V Input มีแรงดัน 4V เป็นโลจิก High Output 5 V เป็นโลจิก Low Q1 OFF มีกระแส Sink ไหลจาก 3.3V Input ผ่าน R1 ลง Ground ทำให้เป็นโลจิก Low
คุณสมบัติของวงจรหรือไอซีดิจิตอล 3.3V to 5V Transistor Clamp Voltage Translator CS และ CL เป็น C แฝงบนแผ่น PCB และข้าง ในไอซี หาค่า R1 และ R2 ที่ทำให้ 5*R2/(R1+R2) = 3.3
คุณสมบัติของวงจรหรือไอซีดิจิตอล การทนทานต่อสัญญาณรบกวน (Noise Immunity) เนื่องจาก VOH>VIH และ VOL<VIL ทำให้ไอซีดิจิตอลสามารถทนทาน ต่อสัญญาณรบกวนได้ในระดับหนึ่ง Noise Margin คือระดับแรงดันของสัญญาณรบกวนที่ไอซีสามารถ ทนได้
คุณสมบัติของวงจรหรือไอซีดิจิตอล Current Sink กระแสที่ไหลจาก Vcc ผ่านโหลดเข้าขา Output ของไอซีแล้วลง Ground Current Source กระแสที่ไหลจาก Vcc ออกจาก Output ของไอซี ผ่านโหลดแล้วลง Ground
คุณสมบัติของวงจรหรือไอซีดิจิตอล พารามิเตอร์ของกระแสของวงจรดิจิตอล IIH กระแสอินพุทต่ำสุดของโลจิก High IIL กระแสอินพุทต่ำสุดของโลจิก Low IOH กระแสเอาท์พุทสูงสุดของโลจิก High ที่ไอซีสามารถ Source ได้ VOL กระแสเอาท์พุทสูงสุดของโลจิก Low ที่ไอซีสามารถ Sink ได้ Icc(0) กระแสที่แหล่งจ่ายไฟต้องจ่ายให้กับไอซีเมื่อ Output เป็นโลจิก High Icc(1) กระแสที่แหล่งจ่ายไฟต้องจ่ายให้กับไอซีเมื่อ Output เป็นโลจิก Low
คุณสมบัติของวงจรหรือไอซีดิจิตอล Fan Out จำนวนสูงสุดของดิจิตอลไอซีแบบเดียวกันที่สามารถ ต่อกับ Output ของไอซี ดิจิตอลไอซีที่ดีจะต้องมีค่า Fan Out สูง ตัวอย่างเช่น ไอซีที่มีค่า Current Sink และ Source สูงสุดเท่ากับ 10mA สามารถต่อ Output กับไอซีที่มีค่า IIH และ IIH เท่ากับ 1mA ได้มากที่สุด 10 ตัว หรือมีค่า Fan-Out เท่ากับ 10
คุณสมบัติของวงจรหรือไอซีดิจิตอล การสูญเสียกำลัง (Power Dissipation) การสูญเสียกำลังเท่ากับ Vcc*Icc Icc เท่ากับกระแสเฉลี่ยที่ไหลออกจาก Vcc ของวงจรดิจิตอล Icc = (Icc(0) + Icc(1))/2
คุณสมบัติของวงจรหรือไอซีดิจิตอล ความเร็วในการทำงาน (Speed of Operation) Propagation Delay เป็นตัวกำหนดความเร็วในการทำงานของวงจร ดิจิตอล tpHL เป็นเวลาที่ Output เปลี่ยนจาก High เป็น Low tpLH เป็นเวลาที่ Output เปลี่ยนจาก Low เป็น High Propagation Delay = (tpHL+ tpLH)/2
คุณสมบัติของวงจรหรือไอซีดิจิตอล Figure of Merit Figure of merit ผลคูณของ Propagation Delay กับการสูญเสีย กำลัง propagation delay (ns) * power dissipation (mW) หน่วยเป็น pico joules ไอซีดิจิตอลทีดีจะต้องมีค่า Figure of Merit ต่ำ
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);