การทดสอบเอาต์พุตของ PIC18F โดยการเชื่อมต่อกับ LED


2.1     ทฤษฏีที่เกี่ยวข้อง

การส่งข้อมูลออกที่พอร์ตของ Microcontroller PIC
PIC ในแต่ละเบอร์จะมีพอร์ตการใช้งานไม่เท่ากันซึ่งมีตั้งแต่ 2 พอร์ตจนถึง 5 พอร์ตแล้วแต่เบอร์ที่เลือกใช้ สำหรับ PIC18F4520 จะมีอยู่ 5 พอร์ตคือ พอร์ต A, B, C, D และ E สามารถใช้งานเป็นพอร์ตอินพุตและพอร์ตเอาต์พุตได้ทั้ง 5 พอร์ตและสามารถกระทำคำสั่งในระดับบิตและไบต์ได้ในการเขียนโปรแกรมส่งข้อมูลออกจากพอร์ตสามารถเขียนได้หลายรูปแบบดังนี้

           1.1.1 การส่งข้อมูลออกพอร์ตแบบพอร์ต
           รูปแบบ     PORTX= (ค่าข้อมูล);
Xหมายถึง ชื่อ พอร์ต
                             ค่าข้อมูล คือ 0 - FF
           ตัวอย่าง   PORTD = 0xFF;
                             หมายถึง  ส่งลอจิก "1" หรือ 5 V ออกพอร์ต D
                        PORTD= 0;
                             หมายถึง  ส่งลอจิก "0" หรือ 0 V ออกพอร์ต D

          1.1.2 การส่งข้อมูลออกพอร์ตแบบบิต
           รูปแบบ     PORTXbits.ชื่อบิต= (ค่าข้อมูล);
Xหมายถึง ชื่อ พอร์ต
                             ค่าข้อมูล คือ 1 หมายถึง ลอจิก "1" หรือ ไฟ 5V
                                             0 หมายถึง ลอจิก "0" หรือ ไฟ 0V
           ตัวอย่าง   PORTDbits.RD0 = 1;
                             หมายถึง  ส่งลอจิก "1" หรือ 5 V ออกพอร์ต D ขา RD0
                        PORTDbits.RD0 = 0;
                             หมายถึง  ส่งลอจิก "0" หรือ 0 V ออกพอร์ต D ขา RD0
2.2 วงจรที่เกี่ยวข้อง


รูปที่ 1.1การเชื่อมต่อ LED กับไมโครคอนโทรลเลอร์

­
การทดลองที่ 2.1เขียนโปรแกรมควบคุมการกระพริบติดดับของ LED

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <p18F4550.h>// ผนวกกับไลบารีหลัก
#include <delays.h>// ผนวกกับไลบารีสำหรับหน่วงเวลา
#pragma configFOSC = HS,WDT = OFF
#pragma config LVP = OFF
voiddelay_ms(intms)// ฟังก์ชันสำหรับหน่วงเวลา
{
    for(;ms>0;ms--)
    {
                Delay1KTCYx(5);
            }          
}          
void main(void)
{
            TRISD = 0x00;// กำหนด PORTD เป็น Output
            while(1)
            {
            PORTD = 0xFF;// กำหนด PORTD เป็น 1 ทั้งหมด
delay_ms(200);// ผนวกกับไลบารีหลัก
                     PORTD = 0;// กำหนด PORTD เป็น 0 ทั้งหมด
delay_ms(200); // หน่วงเวลา 200ms
            }          
}          

อธิบาย
บรรทัดที่ 1       ผนวกเฮดเดอร์ไฟล์ที่ชื่อว่า p18F4550.h ซึ่งเป็นไลบารีเกี่ยวกับตัวไอซี
บรรทัดที่ 2       ผนวกเฮดเดอร์ไฟล์ที่ชื่อว่า delays.hซึ่งเป็นไลบารีเกี่ยวกับการหน่วงเวลาการทำงานของ CPU
บรรทัดที่ 3,4    เป็นการกำหนดคุณสมบัติเริ่มต้น(Configuration Setting) การทำงานของPIC18 ในแต่ล่ะเบอร์จะมีรายละเอียดที่แตกต่างกัน สำหรับ PIC18F4550 มีรายละเอียดดังตารางต่อไปนี้
         
ตารางที่ 2-1 ความถี่ออสซิลเลเตอร์ที่เลือกใช้งาน (Oscillator Selection)

OSC = LP
ใช้คริสตอลพลังงานต่ำต่อที่ขา RA6/RA7
OSC = XT
ใช้คริสตอล/เรโซเนเตอร์ที่ความถี่ 1-4 MHz ต่อที่ขา RA6/RA7
OSC = HS
ใช้คริสตอล/เรโซเนเตอร์ที่ความถี่สูง 4-25 MHz ต่อที่ขา RA6/RA7
OSC = RC
ใช้ R กับ C ภายนอกที่ขาพอร์ต OSC1/CLKI/RA7 ที่ขา OSC2/CLKO/RA6 จะให้สัญญาณนาฬิกาที่มีความถี่เอาต์พุตเท่ากับ Fosc/4
OSC = EC
ใช้สัญญาณนาฬิกาภายนอกที่ขา OSC1/CLKI/RA7 และที่ขา OSC2/CLKO/RA6 จะให้สัญญาณนาฬิกาที่ความถี่เอาต์พุต Fosc/4
OSC = ECIO6
ใช้สัญญาณนาฬิกาภายนอกที่ขา OSC1/CLKI/RA7 และที่ขา OSC2/CLKO/RA6 จะเป็นขาพอร์ตอินพุตเอาต์พุต(RA6)
OSC = HSPLL
ใช้คริสตอล/เรโซเนเตอร์ที่ความถี่สูงกับเฟสล็อกลูป (PLL)
OSC = RCIO6
ใช้ R กับ C ภายนอกที่ขาพอร์ต OSC1/CLKI/RA7 ที่ขา OSC2/CLKO/RA6 จะเป็นขาพอร์ตอินพุตเอาต์พุต(RA6)
OSC = INTIO67
ใช้ความถี่ออสซิลเลเตอร์ภายในขาพอร์ต RA6/RA7 เป็นอินพุตเอาต์พุตแบบดิจิตอล
OSC = INTO7
ใช้ความถี่ออสซิลเลเตอร์ภายในขาพอร์ต RA6 จะให้สัญญาณนาฬิกาที่ความถี่เอาต์พุต Fosc/4 และขา RA7 เป็นอินพุตเอาต์พุตแบบดิจิตอล

          เนื่องจากบอร์ดทดลองที่ใช้งานใช้ความถี่คริสตอลออสซิลเลเตอร์จากภายนอกต่อที่ RA6 และ RA7 ที่ความถี่เท่ากับ 20 MHz จึงกำหนดเป็น OSC = HS
บรรทัดที่ 5       ฟังก์ชัน Delay_ms() ฟังก์ชันหน่วงเวลาในหน่วย มิลิวินาที โดยนำฟังก์ชัน Delay1KTCYx() มาประยุกต์สร้างฟังก์ชันหน่วงเวลาในหน่วย มิลลิวินาที เนื่องจากฟังก์ชัน Delay1KTCYx() จะหน่วงเวลาในหน่วย 1000Tcy
                   เมื่อเรีกใช้งานฟังก์ชัน Delay1KTCYx() โดยผ่านค่าอาร์กิวเม้นต์ให้กับฟังก์ชันเท่ากับ 1 ดังนี้ Delay1KTCYx(1) ฟังก์ชันจะใช้เวลาในการหน่วงเวลาเท่ากับ
Tcy = Fosc/4, Fosc = 20MHz
1 cycle-count           =        1000Tcy
                             =        1000x[1/(Fosc/4)]
                             =        1000x[1/(20MHz/4)]
                             =        1000x0.2        Us
                             =        200              Us


หากต้องการหน่วงเวลา 1 มิลลิวินาทีจะหาได้จาก
ที่เวลา 200 Us            =        1 cycle-count
          1ms              =        (1msx1)/200us
                             =        0.005K
                             =        5 cycle-count
ดังนั้นถ้าต้องการหน่วงเวลาที่ 1 มิลลิวินาที จะต้องส่งค่าอาร์กิวเม้นต์เท่ากับ 5 ดังนี้ Delay1KTCYx(5) จะได้เวลา 1 มิลลิวินาที

บรรทัดที่ 14     กำหนด PORTD เป็น เอาต์พุต
บรรทัดที่ 17     กำหนด PORTD ตั้งแต่ RD0 – RD7 มีค่าเท่ากับ 1 แสดงในตารางที่ 1.4

RD7
RD6
RD5
RD4
RD3
RD2
RD1
RD0
Bit7
Bit6
Bit5
Bit4
Bit3
Bit2
Bit1
Bit0
1
1
1
1
1
1
1
1

จากตารางสามารถเขียนได้ 2 แบบ คือ
1. เขียนในรูปเลขฐานสอง จะได้เป็น 0b11111111;
2. เขียนในรูปเลขฐานสิบหกจะได้ 0xFF;
หมายเหตุ   ถ้าเขียนในรูปเลขฐานสองจะขึ้นตอนด้วย 0b____ เสมอ
               ถ้าเขียนในรูปเลขฐานสิบหกจะขึ้นตอนด้วย 0x____ เสมอ
บรรทัดที่ 18     หน่วงเวลา 200ms
บรรทัดที่ 19     กำหนด PORTD ตั้งแต่ RD0 – RD7 มีค่าเท่ากับ 0แสดงในตารางที่ 1.4

RD7
RD6
RD5
RD4
RD3
RD2
RD1
RD0
Bit7
Bit6
Bit5
Bit4
Bit3
Bit2
Bit1
Bit0
0
0
0
0
0
0
0
0

บรรทัดที่ 20     หน่วงเวลา 200ms
การทดลองที่ 2.1
1. ทำการแก้โค้ดโปรแกรมในบรรทัดที่ 17 จาก “PORTD = 0xFF” เป็น “PORTD = 0xF0” และในบรรทัดที่ 19 จาก “PORTD = 0x00” เป็น “PORTD = 0x0F” และบันทึกผลลงในตารางที่ 2-2
2. ทำการแก้โค้ดโปรแกรมในบรรทัดที่ 17 จาก “PORTD = 0xFF” เป็น “PORTD = 0xCC” และในบรรทัดที่ 19 จาก “PORTD = 0x00” เป็น “PORTD = 0x33” และบันทึกผลลงในตารางที่ 2-2
3. ทำการแก้โค้ดโปรแกรมในบรรทัดที่ 17 จาก “PORTD = 0xFF” เป็น “PORTD = 0xAA” และในบรรทัดที่ 19 จาก “PORTD = 0x00” เป็น “PORTD = 0x55” และบันทึกผลลงในตารางที่ 2-2
4. ทำการแก้โค้ดโปรแกรมในบรรทัดที่ 18 จาก “Delay_ms(200)” เป็น “Delay_ms(1000)”
ผลจากการทดลอง................................................................................................................................
ตารางที่ 2-2 ตารางบันทึกผลการทดลอง
ให้ 1แทนสภานะการติดของ LED  ให้ 0แทนสภานะการดับของ LED


LED1
LED2
LED3
LED4
LED5
LED6
LED7
LED8
1.








2.








3.








  
การทดลองที่ 2.2เขียนโปรแกรมไฟวิ่ง LED 4 ดวง

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <p18F4550.h>// ผนวกกับไลบารีหลัก
#include <delays.h>// ผนวกกับไลบารีสำหรับหน่วงเวลา
#pragma configFOSC = HS,WDT = OFF
#pragma config LVP = OFF
int i;
void delay_ms(intms) // ฟังก์ชันสำหรับหน่วงเวลา
{
for(;ms>0;ms--)
    {
                Delay1KTCYx(5);
}          
}          
void main(void)
{
            TRISD = 0x00;// กำหนด PORTD เป็น Output
            LATD = 0x00;
            while(1)
            {
                        PORTD = 0x01;// กำหนด PORTD เป็น 0x01 หรือ 0b00000001
                        for(i=0;i<4;i++)
                        {
                                    delay_ms(200);// หน่วงเวลา 200ms
                                    LATD = PORTD<<1; // เลื่อน PORTD ทีล่ะ 1 บิต
                        }          
            }          
}          

อธิบาย
บรรทัดที่ 19     กำหนด PORTD = 0x01;
บรรทัดที่ 20     ใช้คำสั่ง for วนลูปเพิ่มค่า i ขึ้นทีล่ะ 1 แล้วให้ PORTD เลื่อนบิตไปทางซ้ายทีล่ะ 1 บิต
บรรทัดที่ 23     PORTD เลื่อนบิตไปทางซ้ายทีล่ะ 1 บิต

การทดลองที่ 2.2
1. ทำการแก้โค้ดโปรแกรมในบรรทัดที่ 20 จาก “for(i=0;i<4;i++)” เป็น“for(i=0;i<7;i++)”
ผลจากการทดลอง............................................................................................................................
..............................................................................................................................................................

2. ทำการแก้โค้ดโปรแกรมในบรรทัดที่19 จาก “PORTD = 0x01” เป็น “PORTD = 0x80” และบรรทัดที่ 23จาก “LATD = PORTD<<1;” เป็น “LATD = PORTD>>1;”
ผลจากการทดลอง................................................................................................................................................................................................................................................................................................................................

การทดลองที่ 2.3โปรแกรมไฟวิ่งจากข้างนอกเข้าสู่ข้างใน

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include <p18F4550.h>// ผนวกกับไลบารีหลัก
#include <delays.h>// ผนวกกับไลบารีสำหรับหน่วงเวลา
#pragma configFOSC = HS,WDT = OFF
#pragma config LVP = OFF
char led[4] = {0x81,0x42,0x24,0x18};// กำหนดตัวแปร led เก็บค่ารีจิสเตอร์
int i;
voiddelay_ms(unsigned intms)// ฟังก์ชันหน่วงเวลา
{
            for(;ms>0;ms--)
            {
                        Delay1KTCYx(5);
            }          
}          
void main(void)
{
            TRISD = 0x00;     // กำหนด PORTD เป็น Output
            PORTD = 0;                    // เคลียร์ PORTD
            i = 0;// กำหนดตัวแปร i เท่ากับ 0
            while(1)
            {
                        for(i=0;i<4;i++)
                        {
                                    PORTD = led[i];// ส่งค่ารีจีสเตอร์ในตัวแปร led ให้ PORTD
                                    delay_ms(200); // หน่วงเวลา 200ms
                        }
                        for(i=3;i>=0;i--)
                        {
                                    PORTD = led[i];// ส่งค่ารีจีสเตอร์ในตัวแปร led ให้ PORTD
                                    delay_ms(200);// หน่วงเวลา 200ms
                        }                      
            }          
}

อธิบาย
บรรทัดที่ 5       กำหนดตัวแปรชื่อ led เป็นแบบอาร์เรย์ เก็บค่ารีจิสเตอร์ของ PORTD
บรรทัดที่ 21     ใช้คำสั่ง for วนลูปเพิ่มค่า i ขึ้นทีล่ะ 1 แล้วนำไปอ้างเป็นตำแหน่งอาร์เรย์ของตัวแปร led แล้วนำมาแสดงที่ PORTD
บรรทัดที่ 26     ใช้คำสั่ง for วนลูปลดค่า i ขึ้นทีล่ะ 1 แล้วนำไปอ้างเป็นตำแหน่งอาร์เรย์ของตัวแปร led แล้วนำมาแสดงที่ PORTD


การทดลองที่ 2.3

1. ทำการลบโค้ดโปรแกรมจากบรรทัดที่ 21 ถึง 30 แล้วพิมพ์ใหม่เป็น
PORTD = led[2];
delay_ms(300);
PORTD = led[3];
delay_ms(300);
ผลจากการทดลอง............................................................................................................................
..........................................................................................................................

2. ทำการลบโค้ดโปรแกรมจากบรรทัดที่ 26 ถึง 30 แล้วคอมไพล์
ผลจากการทดลอง............................................................................................................................
..........................................................................................................................   










แบบฝึกหัดท้าย
กำหนดให้ X คือ ตำแหน่ง LED ตอนดับ
กำหนดให้ O คือ ตำแหน่ง LED ตอนติด
1. จงเขียนโปรแกรมให้ LED0-4 กระพริบติดดับ โดยมีความถี่ในการกระพริบ 1 ms
2. จงเขียนโปรแกรมให้ LED0 กระพริบติดดับ โดยมีความถี่ในการกระพริบ 1 msควบคุมเป็นPORT
3. จงเขียนโปรแกรมให้ LED0 กระพริบติดดับ โดยมีความถี่ในการกระพริบ 1 msควบคุมเป็น Bit
4. จงเขียนโปรแกรมให้ LED0 – LED7 ติดเป็นรูปที่กำหนด
X O X O        X O X O..................................................................
O X O X        O X O X..................................................................
5. จงเขียนโปรแกรมให้ D0 – D7 ติดดังรูปที่กำหนด โดยมีความถี่ในการติดดับ 300 ms
          O X X X         X X X X..................................................................
          X O X X         X X X X..................................................................
          X X O X         X X X X..................................................................
          X X X O         X X X X..................................................................
          X X X X         O X X X..................................................................
          X X X X         X O X X..................................................................
          X X X X         X X O X..................................................................
          X X X X         X X X O..................................................................

6. จงเขียนโปรแกรมให้ D0 – D7 ติดดังรูปที่กำหนด โดยมีความถี่ในการติดดับ 300 ms
O X X X         X X X O..................................................................
X O X X         X X O X..................................................................
X X O X         X O X X..................................................................
X X X O         O X X X..................................................................
X X X O         O X X X..................................................................
X X O X         X O X X..................................................................
X O X X         X XO X..................................................................
O X X X         X X X O..................................................................

7. จงเขียนโปรแกรมให้ D0 – D7 ติดดังรูปที่กำหนด โดยมีความถี่ในการติดดับ 300 ms
X X X X         X X O O..................................................................
X X X X         O O X X..................................................................
X X O O        X X X X..................................................................
O O X X        X X X X..................................................................

8. จงเขียนโปรแกรมให้ D0 – D7 ติดดังรูปที่กำหนด โดยมีความถี่ในการติดดับ 300 ms
X X X O         O X X X..................................................................
X X O X         X O X X..................................................................
X O X X         X X O X..................................................................
O X X X         X X X O..................................................................
X O X X         X X O X..................................................................
X X O X         XO X X..................................................................
X X X O         O X X X..................................................................
9. จงเขียนโปรแกรมให้ D0 – D7 ติดดังรูปที่กำหนด โดยมีความถี่ในการติดดับ 300 ms
X X X X         X X X O..................................................................
X X X X         X X O X..................................................................
X X X X         X O X X..................................................................
X X X X         O X X X..................................................................
X X X O         X X X X..................................................................
X X O X         X X X X..................................................................
X O X X         X X X X..................................................................
O X X X         X X X X..................................................................
O O X X        X X X X..................................................................
X X O O        X X X X..................................................................
X X X X         O O X X..................................................................
X X X X         X X O O..................................................................
10. จงเขียนโปรแกรมให้ D0 – D7 ติดดังรูปที่กำหนด โดยมีความถี่ในการติดดับ 300 ms
O X X X         X X X X..................................................................
O O X X        X X X X..................................................................
O O O X        X X X X..................................................................
O O O O       X X X X..................................................................
O O O O       O X X X..................................................................
O O O O       O O X X..................................................................
O O O O       O O O X..................................................................
O O O O       O O O O..................................................................
O O O O       O O O X..................................................................
O O O O       O O X X..................................................................
O O O O       O X X X..................................................................
O O O O       X X X X..................................................................
O O O X        X X X X..................................................................
O O X X        X X X X..................................................................
O X X X         X X X X..................................................................


ไม่มีความคิดเห็น:

แสดงความคิดเห็น