อธิบายโปรแกรมไฟวิ่ง 8 ดวง

Download Report

Transcript อธิบายโปรแกรมไฟวิ่ง 8 ดวง

Microcontroller
• ไมโครคอนโทรลเลอร ์เป็ นอุ ป กรณ ์
อิ เ ล็ ก ทรอนิ ก ส์ ที่ ใ ช้ ควบคุ ม อุ ป กรณ ์
ไฟฟ้าหรือระบบอิเล็กทรอนิกส์ตางๆ
่
• ไ ม โ ค ร ค อ น โ ท ร ล เ ล อ ร ์ นั้ น
เปรียบเสมือนคอมพิวเตอรขนาดเล็
กที่
์
ต้องการให้ทาอะไรก็เขียนโปรแกรมที่
ต้ อ ง ก า ร ใ ส่ ล ง ไ ป โ ด ย ที่ ต้ อ ง มี
ความสั ม พัน ธ กั
์ น ระหว่างอุ ป กรณ ์และ
Reduced Instruction Set
Computer (RISC)
• เป็ นไมโครโพรเซสเซอรชนิ
่ ี
์ ด หนึ่งทีม
ชุดคาสั่ งจานวนไมมากนั
ก ตรงขามกั
บ
่
้
CISC (Complex Instruction Set
Computer) คอมพิวเตอรแบบ
RISC
์
สามารถกระทาการตามคาสั่ งไดอย
้ าง
่
รวดเร็วมากเพราะคาสั่ งจะสั้ น
นอกจากนั้นชิพแบบ RISC ยังผลิตไดง้ าย
่
กวาอี
(เนื่องจากใช้จานวน
่ กดวย
้
RISC
• เป็ นสถาปัตยกรรมคอมพิวเตอรที
์ ่ นิยมใช้
ในปัจจุบน
ั และยังมีแนวโน้มจะเพิม
่ มาก
ขึน
้ เป็ นลาดับในอนาคต ทัง้ นี้เพราะการ
ี นึ่งทีท
่ าให้
ใช้สถาปัตยกรรมแบบนี้เป็ นวิธห
คอมพิวเตอรท
้ ปกติ หาก
์ างาน เร็วขึน
พิจารณาจานวนบิตทีเ่ ทากั
่ นระหวาง
่
สถาปัตยกรรม
• คอมพิวเตอรแบบ
CISC กับ RISC แลว
้
์
จะพบวาคอมพิ
วเตอรแบบ
RISC จะเร็ว
่
์
กวาแบบ CISC ประมาณ 3 เทา
RISC
• ใช้หลักการไปป์ไลน์ (pipeline) คือ
การทางานแบบคูขนานชนิ
ดเหลือ
่ มกัน
่
(overlap) ปกติแลวการท
างานใน 1
้
ชุดคาสั่ งจะใช้เวลามากกวา่ 1 วงรอบ
สั ญญาณนาฬิ กา (cycle) หากแต่
การทาคาสั่ งเหลานั
่ ้นให้มีการทางาน
ในลักษณะเป็ นแถว (pipe) และขนาน
กันดวย
จึงทาให้ไดค
ย
่ โดยรวม
้
้ าเฉลี
่
AVR
• AVR
เป็ นไมโครคอนโทรลเลอร ์
ตระกู ล หนึ่ ง ผลิต โดยบริ ษั ท Atmel
AVR มีสถาปัตยกรรมแบบ RISC มี
ความเร็วในการประมวลผล 1 คาสั่ ง
ตอ
่ 1 สั ญญาณนาฬิ กา ใช้พลังงาน
ตา่ โดยบางรุนใช
่
้ไฟเพียง 1.5 V 5.5 V เทานั
่ ้นและยังมีโหมดประหยัด
พลังงานอีก 6 โหมด ในบทความนี้
คุณสมบัตข
ิ อง
ATmega48/88/168
-มีหน่วยความจาสาหรับเก็บ
โปรแกรมแบบแฟลช(ROM)
ขนาด 4 กิโลไบต ์ สามรถเขียนลบไดประมาณ
10,000 ครัง้
้
-มีหน่วยความจาขอมู
้ ล(RAM)
ขนาด 512 ไบต ์
-มีหน่วยความจาขอมู
ี รอม
้ ลอีอพ
คุณสมบัตข
ิ อง
ATmega48/88/168
-มีพอรตอินพุตเอาตพุตใหใชงาน
้ ้
์
์
จานวน 23 ขา (PB0 ถึง PB7,
PC0 ถึง PC6, PD0 ถึง PD7)
-มีความเร็วในการประมวนผลสูงสุด
20 ลานค
าสั่ งตอ
ี่ วามถี่
้
่ 1 วินาทีทค
20 MHz
-มีโมดูลแปลงสั ญญาณอะนาลอกเป็ น
ดิจต
ิ อล(Analog-to-Digital
คุณสมบัตข
ิ อง
ATmega48/88/168
-มีโมดูลสรางสั
ญญาณ Pulse
้
width Modulator(PWM) 3 ชุด
6 ช่องสั ญญาณ
-มี
Timer/Counters ขนาด 8 บิต
2 ตัว และ 16 บิต 1 ตัว
ตาแหน่งขาของ ATmega48
ตัวถังแบบ PDIP
การตอใช
่
้งาน
ภาษาทีใ่ ช้เขียนโปรแกรม
ไมโครคอนโทรลเลอร ์
• ภาษาทีใ่ ช้เขียนโปรแกรม
ไมโครคอนโทรลเลอรมี
์ หลาย
ภาษา เช่น ภาษาเครือ
่ ง
,Assembly, BASIC, C เป็ นตน
้
แตละภาษาก็
มข
ี อดี
่
้ ขอเสี
้ ยแตกตาง
่
กันไป ในทีน
่ ี้จะใช้ภาษา C
เนื่องจากเขียนงายแก
ไข
่
้
โปรแกรมเขียนภาษา C สาหรับ
ไมโครคอนโทรลเลอร ์
• สาหรับโปรแกรมทีใ่ ช้เขียนนัน
้ ผม
จะใช้ …..C for AVR (โหลดทึน
่ ี่
http://www.esnack.ne) เนื่องจาก
เป็ นโปรแกรมทีใ่ ช้งานงายมี
่
ไลบรารีให้ใช้เพียบเหมาะสาหรับ
มือใหม่ การเขียนภาษา C นั้น
เขาไปอ
านที
่
้
่
โปรแกรมเขียนภาษา C สาหรับ
ไมโครคอนโทรลเลอร ์
• ผูที
่ พ
ี น
ื้ ฐานภาษา C อยูแล
้ ม
่ วคงไม
้
่
ตองอ
านแค
เรี
ิ เตอรต
้
่
่ ยนรูรี
้ จส
่
์ างๆของ
ไมโครคอนโทรลเลอรเพิ
่ เติมเทานั
้
่ น
์ ม
เริม
่ ตนด
C for
้ วยการลงโปรแกรม
้
AVR กอนคงไม
ยากส
าหรับทุกคนใน
่
่
นี้ เมือ
่ เปิ ดโปรแกรมครัง้ แรกใน
พืน
้ ทีท
่ างามมันจะมีตวั อยางการเขี
ยน
่
โปรแกรมเขียนภาษา C สาหรับ
ไมโครคอนโทรลเลอร ์
•
•
•
•
•
•
•
Software Download
WinAVR-20100110
AVR Studio 4.18
AVR Studio 4 Service Pack 2
Khazama AVR Programmer v.1.6.2
Driver
USBasp-windriver.2011-05-28.zip
Introduction to eSnack
คุณสมบัต ิ
• 1 x ATmega 88 Microcontroller
• 8 x LED
• 5 x Reflex Sensors with LEDs
status
• 1 x Buzzer
• 20 pin GPIO/Expansion
พอรต
่
์ i/o ตางๆของ
ATmega48
• ตามมาตรฐานสากลจะเรียกขาอินพุตเอาตพุ
์ ต
(ใช้ i/o แทนอินพุตเอาตพุ
ต"
่
์ ต)วา."พอร
์
ATmega8 นั้นมีพอรต
์ i/o อิสระให้ใช้งาน
ทัง้ หมด 23ขา โดยแบงออกเป็
น3กลุมคื
่
่ อ
พอรต
์ B มี 8ขา (PB0 ถึง PB7), พอรต
์ C
มี 7ขา (PC0 ถึง PC6)และพอรต
์ D มี 8
ขา (PD0 ถึง PD7) แตเนื
่ ่องจาก PC6 นั้น
เป็ นขา Reset ไมสามารถเอามาใช
่
้งานไดจึ
้ ง
เหลือพอรตให
้ใช้งาน 22พอรต
์
์ ความจริงก็
การกาหนดทิศทางของพอรต
์
• เมือ
่ เริม
่ โปรแกรม main สิ่ งแรกทีต
่ อง
้
ทาก็คอ
ื การกาหนดทิศทางของแตละ
่
พอรต
้นสามารถทีจ
่ ะให้
่
์ พอรตต
์ างๆนั
เป็ นอินพุตหรือเอาตพุ
้
่
์ ตก็ไดโดยการใส
คา่ คงทีใ่ ห้กับรีจส
ิ เตอร ์
DDRB สาหรับพอรต
์ B ทัง้ หมด
DDRC สาหรับพอรต
์ C ทัง้ หมด
การกาหนดทิศทางของพอรต
์
• คาคงที
น
่ ้น
ั เราจะใช้เลขฐาน2, ฐาน10หรือฐาน
่
16ก็ได้ ถาก
้ าหนดให้เป็ น "0" พอรตนั
์ ้นก็จะ
เป็ นอินพุตแตถ
่ าเป็
้ น "1" พอรตนั
์ ้นก็จะเป็ น
เอาตพุ
์ ต
• เช่น ตองการให
้
้พอรต
์ D ทัง้ หมดเป็ นอินพุต
เราก็พม
ิ พ ์ DDRD = 0x00; ลงไป 00 นั้นเป็ น
เลขฐาน16เมือ
่ แปลเป็ นเลขฐาน2ก็จะได้
00000000 โดยที่ 0 ตัวแรกนั้นจะกาหนด
ทิศทางของพอรต
อ
่ ยๆ
่
์ D7 และไลไปทางขวาเรื
การกาหนดสถานะของพอรต
์
เอาต
พุ
ต
• เมือ
่ กาหนดพอรตนั
้
น
ๆให
เป็
นเอาต
พุ
์
้
้ จะมา
์
์ ตแลวก็
กาหนดสถานะของพอรตนั
์ ้นๆ อีกที สามารถ
กาหนดสถานะของพอรตได
2แบบคื
อ 1(ไฟบวก)
้
์
และ 0(ไฟลบ)
• โดยกาหนดไดจากรี
จส
ิ เตอร ์ PORTB สาหรับ
้
พอรต
์ B ทัง้ หมด
• PORTC สาหรับพอรต
์ C ทัง้ หมด
• และ PORTD สาหรับพอรต
่
่
์ D ทัง้ หมด คาคงที
นั้นเราจะใช้เลขฐาน2, ฐาน10หรือฐาน16ก็ได้ ถา้
กาหนดให้เป็ น "0" พอรตนั
์ ้นก็จะมีสถานะเป็ น 0(
ไฟลบ) แตถ
้ น "1" พอรตนั
่ าเป็
์ ้นก็จะมีสถานะเป็ น
การอานค
าจากพอร
ตอิ
่
่
์ นพุต
• เมือ
่ เรากาหนดให้พอรตใดๆเป็
นพอรตอิ
์
์ นพุตเรา
จะสามารถมารถให้พอรตนั
์ ้นรับ สั ญญาณจาก
อุปกรณอื
่ ได้ อยางเช
่
่ นสวิตชเป็
้ ทา
์ น
์ น แลวก็
การอานค
าจากพอร
ตนั
่ เอามาเป็ นเงือ
่ นไข
่
่
์ ้นเพือ
ในการทางาน คาที
ต1พอร
ตจะมี
่ เ่ ราอานพอร
่
์
์
1 กับ 0 เทานั
ง้ 8 พอรตก็
่ ้นแตถ
่ าอ
้ านทั
่
์ จะ
อานได
ทั
า่
่
้ ง้ หมด 256 คา่ เราสามารถอานค
่
จากพอรตอิ
จส
ิ เตอร ์ PINB
้
์ นพุตไดจากรี
สาหรับพอรต
์ B ทัง้ หมด, PINC สาหรับพอรต
์
C ทัง้ หมดและ PIND สาหรับพอรต
์ D
ตัวอยางโปรแกรมพื
น
้ ฐาน
่
• โปรแกรมไฟกระพริบต1างๆ
ดวง
่
• void main() //เริม
่ โปรแกรมหลัก
{
DDRB.B0 = 1; //ให้พอรต
์ B0 เป็ นเอาตพุ
์ ต
while(1) //วนลูปแบบไมรู่ จบ
้
{
PORTB.B0 = 0; //ให้พอรต
์ B0 มีสถานะเป็ น 0
LED ดับ
Delay_ms(1000); //หน่วงเวลาให้ LED ดับ 1
วินาที
PORTB.B0 = 1; //ให้พอรต
์ B0 มีสถานะเป็ น 1
LED ติดสวาง
่
Delay_ms(1000); //หนวงเวลาให LED ติดสวาง
ตัวอยางโปรแกรมพื
น
้ ฐาน
่
ตางๆ
• void main() //เริม
่ โปรแกรมหลั
ก
่
{
DDRB.B0 = 1; //ให้พอรต
์ B0 เป็ นเอาตพุ
์ ต
PORTB.B0 = 0; //ให้พอรต
์ B0 มีสถานะ
เป็ น 0
while(1) //วนลูปแบบไมรู่ จบ
้
{
PORTB.B0 = ~PORTB.B0; //กลับสถานะ
พอรต
บสถานะเดิม
้
์ B0 ให้ตรงขามกั
Delay_ms(1000); //หน่วงเวลา 1 วินาที
}
ตัวอยางโปรแกรมพื
น
้ ฐาน
่
• โปรแกรมไฟกระพริบต2างๆ
่ ดวงติดสลับกัน
• void main() //เริม
่ โปรแกรมหลัก
{
DDRB = 0x03; //ให้พอรต
์ B0 และ B1 เป็ น
เอาตพุ
์ ต
PORTB.B0 = 0; //ให้พอรต
์ B0 มีสถานะเป็ น 0
PORTB.B1 = 1; //ให้พอรต
์ B1 มีสถานะเป็ น 1
while(1) //วนลูปแบบไมรู่ จบ
้
{
PORTB.B0 = ~PORTB.B0; //กลับสถานะพอรต
์
B0 ให้ตรงขามกั
บสถานะเดิม
้
PORTB.B1 = ~PORTB.B1; //กลับสถานะพอรต
์
B1 ให้ตรงขามกั
บสถานะเดิม
้
Delay_ms(1000); //หน่วงเวลา 1 วินาที
•
•
ตัวอยางโปรแกรมพื
น
้ ฐาน
่
โปรแกรมไฟวิง่ 8 ดวงตางๆ
่ ก
void main() //เริม
่ โปรแกรมหลั
{
DDRB = 0xFF; //ให้พอรต
์ B ทัง้ หมดเป็ นเอาตพุ
์ ต
while(1) //คาสั่ งวนลูปแบบไมรู่ จบ
้
{
j = 1; //ให้ตัวแปล j มีคาเท
่ ากั
่ บ 1
for(i=0;i<8;i++) //คาสั่ งวนลูปนี้ 8 รอบ
{
PORTB = j; //ให้พอรต
์ B เทากั
่ บตัวแปล j
j = j<<1; //เลือ
่ นขอมู
้ ลของตัวแปล j ไปทางซ้าย 1 บิท
Delay_ms(100); //หน่วงเวลา 0.1วินาที
}
}
}
อธิบายโปรแกรมไฟวิง่ 8
ดวง
• โปรแกรมนี้เป็ นโปรแกรมไฟวิง่ 8 ดวง
วิง่ เรียงกันไปเรือ
่ ยๆจนถึงดวงที่ 8
แลวจะกลั
บมาดวงที่ 1 อีกทีและจะเป็ น
้
แบบนี้ไปเรือ
่ ยๆ
• โปรแกรมนี้จะมีการใช้งานตัวแปลดวย
้
กอนเริ
ม
่ โปรแกรม main จะมีการตัง้
่
ชือ
่ และกาหนดชนิดของตัวแปลกอนนั
้น
่
ก็คอ
ื ตัวแปล i และ j
อธิบายโปรแกรมไฟวิง่ 8
ดวง
• คาสั่ ง for(i=0;i<8;i++) เป็ นคาสั่ งวน
ลูปแบบตัง้ เงือ
่ นไขเพือ
่ กาหนดจานวน
รอบทีต
่ องให
้
้มีการวนคาสั่ ง ซา้
(i=0;i<8;i++)
• หมายถึงในขณะเริม
่ ตนให
้
้ตัวแปล i มี
คาเท
่ ากั
่ บ 1 จากนั้นทาการตรวจสอบ
วาตั
่ วแปล I มีคาน
่ ้ อยกวา่ 8 หรือไม่
อธิบายโปรแกรมไฟวิง่ 8
ดวง
• จากตัวอยางก
าหนดให้มีการวนลูป
่
จานวน 8 รอบ
• คาสั่ ง j = j<<1; เป็ นคาสั่ งให้มีการ
เลือ
่ นบิทขอมู
้ ลของตัวแปล j ไป
ทางซ้าย 1 ตาแหน่ง คาสั่ ง
PORTB = j; ให้พอรต
่ ากั
่ บ
์ B มีคาเท
ตัวแปล j