แผงวงจรพ่วง (peripheral board)cpj/204223/slides/h5-peri.pdf · 2016-10-14 ·...
TRANSCRIPT
แผงวงจรพว่ง (Peripheral Board)
ปฏิบติัการเก่ียวกบัวศิวกรรมคอมพิวเตอร์
(01204223)
ผศ.ดร.ชยัพร ใจแกว้ และ ผศ.ดร.อภิรกัษ์ จนัทรส์รา้ง
ภาควชิาวศิวกรรมคอมพิวเตอร์
คณะวศิวกรรมศาสตร ์มหาวทิยาลยัเกษตรศาสตร์
แผงวงจรพว่ง
จุดเช่ือมตอ่กบัเมนบอรด์ วงจรแสดงผล LED สามสี วงจรสวิตชอิ์นพทุ วงจรวดัแสง
เฮดเดอรไ์ฟล ์avr/io.h
ใชค้ าสัง่ #include <avr/io.h> เพื่อดึงนิยามรีจีสเตอร์
ส าหรบัควบคุมอินพุทและเอาทพ์ุท
ภายในไฟลม์ีการนิยามมาโครส าหรบั
รีจีสเตอรก์ าหนดทิศทาง I/O: DDRB, DDRC, DDRD
รีจีสเตอรเ์ขียนลอจิกเอาทพ์ทุ: PORTB, PORTC, PORTD
รีจีสเตอรอ์่านลอจิกอินพุท: PINB, PINC, PIND
ค่าต าแหน่งบิตของขาต่าง ๆ เช่น PC0, PC1
ฯลฯ
วงจรแสดงผล LED สามสี
เช่ือมเขา้กบัขา PC0..PC2
การใชง้าน:
ตั้งค่ารีจีสเตอร์ DDRC ใหข้า PC0..PC2 เป็นเอาทพ์ุท
เขียนลอจิก 1 ในบิตของรีจีสเตอร์ PORTC เพื่อใหไ้ฟติด
เขียนลอจิก 0 ในบิตของรีจีสเตอร์ PORTC เพื่อใหไ้ฟดบั
(ทบทวน) กฎของโอหม์
V
I
0R
I
V+ -
V
I
R
I
V+ -
V
I
I
VR
I
V+ -
R
อุปกรณไ์ดโอดและ LED
V
I
I
V+ -
Vd
V
I
I
Vd
V+ -
Vd
R
𝑅 =𝑉 − 𝑉𝑑
𝐼
แบบฝึกหดั – ไฟว่ิงสามสี (chase.c)
เขียนเฟิรม์แวรใ์ห ้LED บนบอรด์พว่งไล่ติดทีละสี
ตามล าดบั แดง เหลือง เขียว วนไปเรื่อย ๆ
:
แต่ละดวงสวา่งนาน 0.5 วินาที
แบบฝึกหดั – นบัเลข 0 ถึง 7 (count.c)
เขียนเฟิรม์แวรใ์ห ้LED สามสีแสดงผลค่า 0,1,2,…,6,7,0,1,…
ในรูปฐานสอง โดยแต่ละค่าใหแ้สดงผลคา้งไว ้0.5 วนิาที
เร่ิมตน้
ผ่านไป 0.5 วินาที
ผ่านไป 0.5 วินาที
ผ่านไป 0.5 วินาที
ผ่านไป 0.5 วินาที
ผ่านไป 0.5 วินาที
: :
: :
วงจรสวิตซอิ์นพทุ
ต่อกบัขา PC3
เมื่อสวติซถ์ูกกด ขา PC3 จะถูกต่อลงกราวนด์
การใชง้าน:
ตั้งค่ารีจีสเตอร์ DDRC ใหข้า PC3 เป็นอินพุท
เขียนลอจิก 1 ลงท่ีบิต PC3 ของรีจีสเตอร์ PORTC เพ่ือเปิดใชง้าน
pull-up resistor
อ่านค่าบิต PC3 ของรีจีสเตอร์ PINC เพ่ือตรวจสอบสถานะของ
สวิตช์
ตวัตา้นทานพลูอพั
ไมโคร-
คอนโทรลเลอร์ I = ~0
Input
R
Vin
Pull-up Resistor
VCC
โครงสรา้ง I/O ภายในชิป (แตล่ะขา)
รูปจากหวัขอ้ 18.2 ของดาตา้ชีต ATmega48/88/168
VCCภายในชิป
ภายนอกชิป
แบบฝึกหดั – นบัสวิตช์ดว้ย LED
(sw-count-led.c)
นับจ านวนครั้งท่ีสวติชถ์ูกกด แสดงจ านวนครั้งในรูป
เลขฐานสองดว้ย LED (เร่ิมนับ 0 เมื่อกดเกิน 7 ครั้ง)
เร่ิมตน้
กดแลว้ปล่อย
กดแลว้ปล่อย
กดแลว้ปล่อย
กดแลว้ปล่อย
กดแลว้ปล่อย
: :
: :
Contact Bounce
เกิดจากหน้าสมัผสักระเพื่อมขณะกดหรือปล่อยสวติซแ์บบ
กลไก
ลอจิก
เวลา
1
0
จงัหวะท่ีสวติชถู์กก (หรือปล่อย)
ท่ีมา: วกิิพีเดยี
วิธีแกไ้ข Contact Bouncing
แกไ้ขทางฮารด์แวร์
ใชว้งจร RC กรองสญัญาณ
ความถ่ีสูงออก
แกไ้ขทางซอฟตแ์วร์
เพิ่มค าสัง่หน่วงเวลาสั้น ๆ เมื่อตรวจสอบไดว้า่
สวติชม์ีการเปล่ียนสถานะ
วงจรวดัแสง
เชื่อมกบัขา PC4
ใชต้วัตา้นทานแปรค่าตามแสง (Light Dependent
Resistor หรือ LDR) ผสมกบัวงจรแบ่งแรงดนั
สญัญาณท่ีขา PC4 เป็นสญัญาณประเภทแอนะล็อก
การใชง้านตอ้งอ่านค่าแรงดนัจาก PC4 แบบแอนะล็อก
41
44
RLDR
RVCCVPC
สญัญาณดิจทิลัและสญัญาณแอนะล็อก
บนัทึกขอ้มูลแบบ
ดิจทิลั 2 ระดบั
(1 บิต)
บนัทึกขอ้มูลแบบ
ดิจทิลั 1024 ระดบั
(10 บิต)
0
1
0
1023สญัญาณแอนะล็อก
0V
5V
สญัญาณดิจิทลั0V
5V
0
1
วงจรแปลงสญัญาณแอนะล็อกเป็นดิจทิลั
ตวัอยา่งฟังกช์นัส าหรบัใชง้าน ADC
uint16_t read_adc(uint8_t channel){
ADMUX = (0<<REFS1)|(1<<REFS0) // ระบุใหใ้ช ้VCC เป็นแรงดนัอา้งอิง (Vref) และ
| (0<<ADLAR) // บนัทึกผลลพัธชิ์ดขวาในคูรี่จีสเตอร์ ADCH/ADCL
| (channel & 0b1111); // ตั้งค่า MUX เป็นค่า channel
ADCSRA = (1<<ADEN) // เปิดวงจร ADC| (1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0) // ใชค้วามเร็ว 1/128 ของคล็อกระบบ
| (1<<ADSC); // สัง่วงจร ADC ใหเ้ร่ิมตน้การแปลง
while ((ADCSRA & (1<<ADSC))) // รอจนบิต ADSC กลายเป็น 0 ซ่ึงหมายถึงการแปลงเสร็จส้ิน
;
return ADCL + ADCH*256; // ผลลพัธถู์กเก็บอยูใ่นรีจีสเตอร์ ADCL และ ADCH
// สามารถใช ้return ADC ไดเ้ช่นกนั
}
คา่ท่ีไดเ้ป็นไปตามสูตร 𝐴𝐷𝐶 =𝑉𝑖𝑛⋅1024
𝑉𝑟𝑒𝑓โดยมีคา่สูงสุดท่ี 1023
วิธีเรียกใชง้านฟังกช์นั read_adc()
ระบุหมายเลขช่องสญัญาณ (channel) เป็นอารก์ิวเมนต์
ค่าท่ีคืนมาใหเ้ป็น uint16_t แต่มีค่าสูงสุดท่ี 1023
uint16_t result = read_adc(4);
uint16_t result = read_adc(PC4);
uint8_t result = read_adc(PC4);
มาโคร ADCL/ADCH และ ADC
มาโคร ADCL ADCH และ ADC ถูกนิยามไวใ้นเฮดเดอร์ avr/io.h
ผลลพัธก์ารขยาย
uint8_t adc_low = ADCL;uint8_t adc_high = ADCH;uint16_t adc = ADC;
uint8_t adc_low = (*(volatile uint8_t *)(0x78));uint8_t adc_high = (*(volatile uint8_t *)(0x79));uint16_t adc = (*(volatile uint16_t *)(0x78));
แบบฝึกหดั – แสงสามระดบั (light-3.c)
อ่านความเขม้แสงจากขา PC4
ตีความแสงเป็นสามระดบั และแสดงระดบัแสง
ดว้ย LED สามสี
สภาพแสงมืด
สภาพแสงสวา่งมาก
สภาพแสงปานกลาง
แบบฝึกหดั – แสงแปดระดบั (light-8.c)
อ่านความเขม้แสงจากขา PC4
ตีความผลลพัธเ์ป็น 8 ระดบั (0-7)
น าระดบัท่ีตีความไดม้าแสดงผลบน LED ในรูปเลขฐานสอง
(ไบนารี) 3 บิต
แนวทาง: น าบิต 9..7 จากผลลพัธ ์ADC มาแสดงผล
ความสวา่ง 0 (มืดสุด)
ความสวา่ง 2
ความสวา่ง 1
ความสวา่ง 3
ความสวา่ง 4
ความสวา่ง 6
ความสวา่ง 5
ความสวา่ง 7 (สวา่งสุด)