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..................................................................
ไม่มีความคิดเห็น:
แสดงความคิดเห็น