ออกแบบ Power save mode dsPIC

ลองออกแบบลดพลังงาน MCU dsPIC30F4011 ให้ใช้กับ Battery 9V โดยออกแบบทั้ง Software และ Hardware ให้ประหยัดพลังงานแบบสุดๆ

ตั้งค่า TRIS register กำหนดให้เป็น Output จะกินไฟน้อยกว่า Config เป็น Input

TRISB = 0;
TRISC = 0;
TRISD = 0;
TRISE = 0;
TRISF = 0;

ลองวัดกระแสดูแล้วกินไฟสถานะ Idle เฉพาะ dsPIC เพียง 19 uA ก็กินไฟน้อย แต่คงไม่เท่ากับ TI

สอนการใช้งาน Protel99SE ตอนที่ 3 สร้าง Net และเดินลาย PCB

หลังจากที่ไม่ได้ update บทความซะนาน วันนี้พอมีเวลาเลยมา update บทความกันต่อ สำหรับบทความ Protel99SE ตอนนี้ก็เป็นตอนที่ 3 แล้ว ใครที่อ่านแล้วงงๆ สามารถย้อนกลับไปอ่านตอนที่1 และ 2 ได้ที่ Link ข้างล่างนี้ครับ

ในตอนนี้ก็เข้มข้นขึ้นเรื่อยๆ เราจะมาเรียนรู้การสร้าง Net และเดินลาย PCB ผมมีคำถามมาถามท่านผู้อ่านครับ Net คืออะไร? ถ้าเปิด Dictionary แปลก็คงจะบอกว่าตาข่าย ก็ไม่ผิดครับ แต่ใน schematic เรานิยามว่ามันคือ ส่วนที่เชื่อมถึงกัน เพื่อให้ดูแล้วเข้าใจง่ายๆ ลองดูภาพด้านล่างประกอบครับ

บริเวณที่เน้นสีเขียวเป็นเส้นที่เชื่อมต่อขา K ของ LED1, ขา C ของ Q1 และ ขา+ ของ C2 ส่วนที่เชื่อมถึงกันนี้เราเรียกว่า Net ครับ

ในการออกแบบ PCB โดย Protel99SE เราสามารถตั้งชื่อ Net ได้เองหรือให้โปรแกรมสร้าง Net ให้ก็ได้ ผมแนะนำว่าส่วนสำคัญของวงจรที่ใช้อ้างอิงเราควรจะสร้าง Net เองครับ ชื่อมันจะได้สื่อให้เข้าใจง่าย เช่น VCC, GND เป็นต้น

เพื่อให้เข้าใจง่ายขึ้นผมจะสร้าง Net มา 2 อัน โดยการกดปุ่ม Net จาก Wiring Tools แล้วไปวางตำแหน่งดังรูปข้างล่าง ตั้งชื่อ Net ว่า LED1 และ LED2

งานต่อไปของเราก็คือกำหนด Footprint ให้กับอุปกรณ์อย่างเช่น LED1 ใช้ Footprint แบบไหน Surface หรือแบบมีขา เราต้องไปกำหนดไว้ก่อนครับ วิธีการใส่ Footprint ลงไปในแต่ละอุปกรณ์ก็ทำได้ง่ายๆ โดยการ double click เข้าไปที่อุปกรณ์ แล้วใส่ Footprint ที่ต้องการลงไป Footprint ที่ใส่ลงไปต้องมีอยู่ในโปรแกรมแล้วนะครับถึงจะใช้ได้ ถ้าไม่มีก็ต้องสร้างขึ้นมาใหม่

ใส่ค่า Footprint ลงไปจนครบ ตามนี้ครับ

C1 = RAD-0.1
C2 = RAD-0.1

LED1 = RAD-0.1
LED2 = RAD-0.1

R1 = AXIAL-0.4
R2 = AXIAL-0.4
R3 = AXIAL-0.4
R4 = AXIAL-0.4
R5 = VR-4

Q1 = TO92C
Q2 = TO92C

ต่อไปเป็นขั้นตอนสร้าง Net เนื่องจากเราไม่ได้สร้าง Net ครบทุก Net ดังนั้นเราต้องให้โปรแกรมสร้าง Net ที่เหลือให้ครบ ไปที่ Design —> Create Netlist… แล้วกด OK

จากนั้นโปรแกรมก็จะสร้างไฟล์ .NET ขึ้นมา 1 ไฟล์ก็ยังไม่ต้องไปสนใจไฟล์นี้นะครับ มันเป็นรายละเอียดว่า Net นี้ต่อกับอุปกรณ์ไหนบ้าง จากนั้นออกไปที่หน้า Documents โดยการคลิก TAB ด้านบน

เราจะสร้างไฟล์ PCB กันต่อ คลิกขวา New…? เลือก PCB Document แล้ว OK? ตั้งชื่อง่ายๆว่า PCB1.PCB ละกัน ถ้า double click PCB1.PCB ก็จะเจอกับความว่างเปล่า กลับมาที่ Schematic กันต่อ เราจะเอา schematic ที่สร้างไว้ไปทำเป็น PCB

ไปที่ Design —> Update PCB… แล้วกดปุ่ม Execute

ถ้าไม่มีอะไรผิดพลาด อุปกรณ์จะไปโผลที่หน้า PCB1.PCB แล้ว ถ้าไม่เจออุปกรณ์ให้กดปุ่ม Page Down(ย่อลง) เพื่อย่อขนาดจอ หาอุปกรณ์ ส่วนมากมันจะชอบวางให้ที่ตำแหน่ง ขวา-บน เมื่อหาเจอแล้ว ให้กดปุ่ม Page Up(ซูม) เพื่อขยาย

จะเห็นได้ว่าอุปกรณ์อยู่ใน Room หรือซี่สีเขียวๆ ให้กด E แล้วตามด้วย D แล้วไปจิ้มที่ Room ซะเพื่อลบมั้นทิ้งไป

ต่อไปเราก็จัดวางอุปกรณ์ใหม่เพื่อความสวยงามและง่ายต่อการเดินลายทองแดง มี Tip นิดนึงว่า การหมุนอุปกรณ์ไปเป็นมุม 90 องศาทำได้ง่ายๆโดยการ เอาเมาส์คลิกค้างที่อุปกรณ์ตัวนั้นแล้วกด spacebar อุปกรณ์จะหมุนไปครั้งละ 90 องศา

ใครที่สังเกตุหน่อยอาจจะมาท้วงผมว่า BC547 ตำแหน่งขาไม่ได้เป็นแบบนี้ และ LED ก็ไม่ได้หน้าตาแบบนี้ ใช่แล้วครับที่มันไม่ match กันเป็นเพราะว่าเรายังไม่ได้สร้าง Library ของอุปกรณ์เหล่านั้นขึ้นมา ก็เลยใช้ Footprint ที่มีอยู่ในโปรแกรมไปก่อน แล้วในตอนต่อไปเราจะมาคุยกันถึงเรื่องการสร้าง Library

เมื่อจัดอุปกรณ์เข้าที่เข้าทางแล้ว เราจะสร้างกรอบของ PCB ขึ้นมาเพื่อเป็นพื้นที่ของ PCB ขอบของ PCB เราจะใช้ Layer KeepOutLayer ครับ

ให้คลิก KeepOutLayer และที่ PlacementTools เลือก Place lines….. จากนั้นลากเส้นตีกรอบเลยครับ

เริ่มเห็นเป็นรูปเป็นร่างขึ้นมาแล้ว ต่อไปเรามาลากเส้นทองแดงกัน ก่อนที่จะลากเส้นทองแดงเห็นข้อผิดพลาดอย่างหนึ่ง ที่ R5 ขา 2 ไม่มี Net ไปถึง จริงๆแล้วขา 1-2 ต้องเป็น Net เดียวกัน ไม่เป็นไรผิดได้ก็แก้ได้ครับ

ย้อนกลับไปที่ schematic ใหม่ลากสายใหม่ให้เหมือนรูปด้านล่าง ตรงที่ผม hi light สีแดงไว้

จากนั้น Design —> Create Netlist… และ Design —> Update PCB… เหมือนที่ทำก่อนหน้านี้แหล่ะครับ ในหน้า PCB ก็จะถูกแก้ไขตาม schematic

ในการเดินลายทองแดงสำหรับ PCB หน้าเดียวเรานิยมใช้ Bottom Layer แต่ถ้าเป็น PCB 2 หน้าเราจะใช้ Top Layer และ Bottom Layer เลือก BottomLayer ที่ TAB ด้านล่างแล้วตามด้วย Interactively route connections

การเดินลายทองแดงโดยใช้ Interactively route connections จะเดินตาม Net เดียวกัน ถ้ามีการลากลายทองแดงไปยังจุดที่ไม่ใช่ Net เดียวกันจะขึ้น Error สีเขียว

2 นาทีผ่านไปผมก็ลากเส้นแบบคร่าวๆ ไม่เน้นสวยงามเสร็จแล้ว เขียนไปเขียนมาชักยาว ไว้ตอนหน้ามาเรียนรู้เรื่อง Rule กันหน่อย เป็นกฏต่างๆของการเดินลาย PCB เช่นจะให้ Track กว้างเท่าไหร่ ระยะห่างระหว่างอุปกรณ์เท่าไหร่ แล้วตอนสุดท้ายค่อยมาสร้าง Library กัน บทความตอนนี้จะไม่เน้นเรื่องความถูกต้องของรูปร่างอุปกรณ์เท่าไหร่นัก ต้องการให้เข้าใจถึงกระบวนการสร้าง Schematic, Net และ PCB หากใครทำตามแล้วมีข้อสงสัยก็ comment มาถามได้ครับ ถ้าตอบได้ก็จะตอบให้ ตอนหน้าเจอกันใหม่ครับ

เขียนโปรแกรม MCS-51 ขยาย Port Input แบบไม่จำกัดด้วย CD4021

ในการออกแบบให้ microcontroller รับอินพุตดิจิตอลวิธีที่ตรงไปตรงมาที่สุดคือการต่อกับ Port ของ microcontroller โดยตรง แต่ถ้าอินพุตมีจำนวนมากซัก 10-20 อินพุต เราจะทำยังไง หลายคนอาจจะใช้วิธี Scan Keyboard เอา วิธีนี้มีข้อจำกัดตรงที่แต่ละอินพุตไม่อิสระต่อกัน เพราะต่อแบบ matrix

แล้วมีวิธีที่ดีกว่านี้อีกไหม? คำตอบคือมีครับ คือใช้ Shift register รับข้อมูลแบบขนาน แล้วให้สัญญาณออกมาเป็นแบบอนุกรม (Parallet in/ Serial put) โดยใช้ IC CD4021 ภายใน IC จะประกอบไปด้วย flip-flop เมื่อเราส่ง clock ไป 1ลูก data ที่ flip-flop จะส่งไปยังตัวถัดไป ถ้าเราส่ง clock ไป 8 ลูก เราก็จะได้ data จาก 8 อินพุต

จากรูปจะเห็นว่าเอาต์พุตของ flip-flop ตัวซ้าย จะเป็นอิพุตของ flip-flop ตัวขวาไปเรื่อยๆ สำหรับ data จะอยู่ที่ขา Q6, Q7, Q8 เวลาใช้งานจริงเราต่อที่ Q8 ตัวเดียวก็พอครับ ส่วน Q6, Q7 ก็ปล่อยลอยไว้ IC CD4021 1 ตัวจะต่ออินพุตได้ 8 อินพุต แต่เราสามารถต่อ IC CD4021อนุกรมกันไปได้เรื่อยๆ โดยต่อ Q8 เข้ากับ Serial input ไปเรื่อยๆ

ทีนี้มาดูในส่วนของการเขียนโปรแกรมกัน โปรแกรมตัวอย่างจะใช้ 89S52 MCS-51 เบอร์ยอดนิยมของผม

ด้านล่างจะเป็น function อ่านค่าจาก CD4021 ที่ที่อ่านได้จะ return กลับมา

//===============================================//
//??? ??? ??? ??? ??? ??? ??? ??? ?? Read data from CD4021
//===============================================//
unsigned char read_cd4021()
{
unsigned char i,a,inport,dat;

STR = 1;
STR = 0;
a = 4;??? while(a)??? a–;
dat = 0;
for (i=0;i<8;i++)
{
inport = DAT;
dat <<= 1;
dat |= inport;

CLK = 1; ??? a = 4;??? while(a)??? a–;
CLK = 0;??? ??? a = 4;??? while(a)??? a–;

}
STR = 1;

return(dat);
}

อันนี้ main()

//———————————————————–//
// Main
//———————————————————–//
void main()
{
init();
dmsec(200);??? ??? ??? //at least 100 mS
init_lcd();
dmsec(200);??? ??? ??? //at least 100 mS

show_portval_lcd();
while(1)
{
port_present = read_cd4021();
if(port_last!=port_present)
{
port_last = port_present;
show_portval_lcd();
dmsec(200);
}
}
}

ในการทดลองนี้ผมจะต่อ LCD 16×2 แสดงผลค่าที่อ่านได้จาก port โดยใช้อินพุตเป็น DIP Switch ขนาด 8 สวิตช์ มาดูส่วนของวงจรกันต่อ

การทดลองนี้ต่อ IC CD4021 ลง Proto board ครับ ทดลองเสร็จก็ไปใช้งานอื่นๆได้ต่อสะดวกดี ต่ออุปกรณ์เสร็จแล้ว ทดลองกันเลยดีกว่า

ในตอนสวิตช์ไม่สับลง GND ก็แสดงค่า 255 อันนี้ถูกต้องครับ ต่อมาสับสวิตช์ 1 และ 2 ไปที่ GND ถ้าเทียบเป็นเลขฐาน 2 จะได้ 11111100 = 252 สังเกตุว่าเท่ากับที่หน้าจอ LCD แสดงผล เป็นอันว่าอ่านค่าได้ถูกต้อง

Download

datasheet CD4021

source code CD4021(zip)