เขียนโปรแกรม VB6 Interface AVR ATMEGA16

ในการใช้งานไมโครคอนโทรลเลอร์บางครั้งเราก็ต้องการที่จะให้ไมโครคอนโทรลเลอร์ไปแสดงผลที่คอมพิวเตอร์ หรือไม่ก็ใช้คอมพิวเตอร์ในการควบคุมไมโครคอนโทรลเลอร์ ผมเองก็ไม่ได้เรียนด้านเขียนโปรแกรมมา ก็อาศัยอ่านในอินเตอร์เนตเอาบ้าง ห้องสมุดบ้าง ลองผิดลองถูกบ้างจนพอเป็น

สำหรับการทดลองนี้ผมยังคงใช้ ATMEGA16 คู่กับ CodeVisionAVR อีกตามเคยสำหรับวงจรก็ตามรูปที่ 1 เลยครับ จะใช้วิธีต่อลงแผ่นปริ๊นอเนกประสงค์เอาหรือทำ PCB ก็แล้วแต่สะดวกเลยครับ และ Tool ที่ใช้ในการเขียนโปรแกรมผมใช้ Visual Basic V6 ครับ สำหรับการทดลองนี้ผมก็ได้ CodeWizardAVR มาช่วยจัดการ initial ค่าต่างๆ ทำให้เขียนโปรแกรมได้ง่ายขึ้น

null

รูปที่ 1 วงจรที่ใช้ในการทดลอง

ในการทดลองนี้ผมจะให้ไมโครคอนโทรลเลอร์รับค่ามาจากคอมพิวเตอร์แล้วแสดงผลที่ 7 Segment , LED และควบคุม Relay ผมออกแบบให้มี SW1-SW4 รับค่าจากการกดไปแสดงที่คอมพิวเตอร์ได้ในส่วนของโปรแกรม VBจะมีส่วน GUI ที่เป็น Input และ Output ส่วนที่เป็น Input ได้แก่

  • TxtValue.text – TextBox ไว้รับข้อมูลจาก User ไปแสดงผลที่ 7Segment
  • Command1 – CommandButton ใช้กดส่งข้อมูลจาก TxtValue.text ออกไปยัง Serial Port
  • Command2….Command5 – CommandButton ใช้กดส่งข้อมูลปิด/เปิด LED
  • Command6….Command7 – CommandButton ใช้กดส่งข้อมูลปิด/เปิด Relay

ส่วนที่เป็น Output

  • Shape1…..Shape4 – Shape จะติดสว่างเมื่อกดสวิตช

หลักการมีอยู่ว่าผมตั้ง Timer3 ไว้ให้ทำงานวนลูปไปถามไมโครคอนโทรลเลอร์ว่ามีการกดสวิตช์หรือไม่ หลังจากที่ไมโครคอนโทรลเลอร์ได้ค่า Command ที่ถูกส่งมาจาก RS232 แล้วก็จะส่งสถานะของสวิตช์กลับไป โดย Timer3 กำหนดให้มี Interval = 150mS โปรแกรมจะรับส่งข้อมูลอยู่ตลอดเวลาเสมือนว่า Real-Time สำหรับ Command ที่ใช้ส่งไปยัง ATMEGA16 เป็น Command ที่ตั้งขึ้นมาเองง่ายๆเป็น ASCII Code

MSComm1.Output = “:RD03″ + vbCrLf

ในฝั่งของไมโครคอนโทรลเลอร์จะตอบกลับไปด้วย Command ตัวเลขสีแดง “1101″ ที่ต่อท้ายจาก RD03 หมายถึงค่าที่อ่านได้จากสวิตช์ทั้ง 4 ตัว

“;RD031101” + CrLf

ในการทำงาน Timer3 จะวนอ่านข้อมูลไป แต่เมื่อมีการกดปุ่ม Edit (Command1) จะส่งตัวเลขใน TxtValue.text ไปยัง ATMEGA16

MSComm1.Output = “:WR01″ + TxtValue.Text + vbCrLf

เมื่อมีการกดปุ่ม Command2 หรือ Command5 (CommandButton) จะ ส่งข้อมูลปิด/เปิด LED ไปยัง ATMEGA16

เมื่อมีการกดปุ่ม Command6 หรือ Command4 (CommandButton) จะ ส่งข้อมูลปิด/เปิด RELAY ไปยัง ATMEGA16

Private Sub LEDcmd()
Dim buff As Integer
If RELAY Then buff = 1
If LED1 Then buff = buff + 2
If LED2 Then buff = buff + 4MSComm1.Output = “:WR02″ + CStr(buff) + vbCrLf
End Sub

ทำการทดลอง

ต่อสาย RS232 จากบอร์ดไปยังคอมพิวเตอร์ เปิดโปรแกรม ตั้งค่าการสื่อสารดังรูป

กด CommPort —> Port Open เริ่มต้นการสื่อสาร

เริ่มทำการทดลองโดยการใส่ตัวเลข “+0089″ แล้วกดปุ่ม Edit จะเห็นที่ 7 Segment แสดงผล 89 ทำการทดลอง LED ต่อ กดปุ่ม LEDx ON/OFF ทำการตอบสนองถูกต้อง กดปุ่ม Relay3 ON/OFF ทำการตอบสนองถูกต้อง อันสุดท้ายทำการกดปุ่ม SW1 และ SW4 ที่หน้าจอ VB Shape1 และ Shape4 จะเปลี่ยนเป็นสีเขียว เมื่อปล่อยมือจะกลับเป็นสีแดง

สำหรับ Code ของ Visual Basic ที่ใช้ในการทดลองนี้ผมดัดแปลงมาจาก Sample ที่อยู่ใน MSDN ส่วน Code ที่ผมแก้ใหม่ ใช้ในการทดลองสามารถดาวน์โหลดได้ข้างล่างนี้ี่ครับ

Download

Visual Basic6 Code Mscomm.zip

CodeVisionAVR Code Code_cvavr_232.zip

หากมีข้อสงสัย Comment ได้เลยนะครับ

Lab 1 AVR I/O Port

หลังจากที่ได้ติดตั้ง CodeVisionAVR ไปแล้วเรามาทำการทดลองเลยครับ การทดลองนี้จะทดลองเกี่ยวกับ I/O Port ของ AVR ขา PORT ของ AVR จะมี Register ที่เกียวข้องอยู่ 3 Register

1. Data Register – PORTx คือค่าที่ต้องการส่งไปยัง PORT

2. Data Direction Register – DDRx เป็น Register ที่ใช้กำหนดทิศทางของ port ว่าจะให้เป็นอินพุตหรือเอาต์พุต ถ้ามีค่าเป็น “1″ จะเป็นเอาต์พุต ในทางตรงกันข้ามถ้ามีค่าเป็น “0″ จะเป็นการกำหนดให้พอร์ตนั้นเป็นอินพุต

3. Port Input Pins – PINx เป็นค่าอินพุตของพอร์ตนั้นสามารถอ่านได้อย่างเดียว

นอกจาก Register 3 ตัวแล้วยังมี Register ที่กำหนดว่าจะให้พอร์ตนั้นมีการ Pull-up หรือไม่ โดยการสั่งให้ pull-up ทำได้โดยให้บิต PUD ใน SFIOR(Speacial Function I/O Register) มีค่าเป็น “0″ จะได้ความสัมพันธ์ดังตารางที่ 1

ตารางที่ 1 Port/Pin Configuration

หลังจากที่ได้เรียนรู้หลักการคร่าวๆ ไปแล้วเรามาลองต่อวงจรทดลองกันเลยครับ

?คลิกที่รูปเพื่อขยายภาพ

รูปที่ 1 วงจรการทดลอง

การทดลองนี้ผมกำหนดให้ PORT A1 และ A2 เป็นเอาต์พุตซึ่งจะแสดงผลที่ LED และ PORT B3 และ A5 จะเป็นอินพุต รับค่าจากสวิตช์ เมื่อทำการกดสวิตช์ SW1 (PINB.0) LED1(PORTA.2) ก็จะติด และเมื่อทำการกดสวิตช์ SW2 (PINA.5) LED2(PORTA.1) ก็จะติด

รูปที่ 2 ทำการทดลอง

หลังจากโปรแกรม HEX file ลง IC แล้ว ถ้าไม่ได้ผลลัพธ์ดังข้างบนให้ลองเช็คไฟที่จุดต่างๆดูครับ โดยเฉพาะขา RESET จะต้องมีค่าเป็น “1″ ถึงจะทำงาน หลังจากการทดลองนี้คิดว่าคงจะพอเข้าใจหลักการทำงานของ Port I/O มากขึ้นนะครับ

Download Code การทดลองที่ 1

เริ่มต้นใช้งาน CodeVisionAVR

เมื่อพูดถึงไมโครคอนโทรลเลอร์ในบ้านเรา AVR จะเป็นอีกหนึ่งตระกูลที่มีผู้ใช้เป็นจำนวนมาก ในการเขียนโปรแกรมสามารถเขียนได้หลายภาษาเช่นกัน ในวันนี้ผมจะแนะนำการเริ่มต้นใช้งาน CodeVisionAVR ตัวนี้จะเป็น Software ลิขสิทธ์นะครับ แต่สามารถทดลองใช้ได้โดยการ Download ตัว demo จากเวบมาลองใช้

หลังจากลงโปรแกรมเสร็จแล้วเรามาเริ่มกันเลยครับ ของผมจะเป็น Version 1.24.0 Standard ถ้าหน้าจอไม่เหมือนกับของผมอาจเป็นไปได้ว่า เพราะ Version ที่ต่างกัน

1. ทำการเปิดโปรแกรมขึ้นมา จะใช้วิธีดับเบิ้ลคลิกที่ Desktop ก็ได้ครับ คลิก File —> New

รูปที่ 1

2. เลือก Project แล้วกด OK

รูปที่ 2

3. จะมีหน้าต่างมาถามเราว่าต้องจะสร้างโปรเจคด้วย CodeWizardAVR หรือเปล่า ให้กด Yes ไปครับ ตรงนี้จะเป็น Feature ที่เด่นอย่างนึงของ CodeVisionAVR เราสามารถ initial & Config ได้โดยการคลิกๆๆ

รูปที่ 3

4. เราจะเจอ Tab อยู่หลายอย่าง ให้ตั้งค่าตามที่ต้องการ

รูปที่ 4

  • Chip เบอร์ AVR ที่ใช้งาน, ความถี่ที่ใช้ี่ ชนิดของโปรแกรม
  • Ports ไว้กำหนดว่าเป็นอินพุต/เอาต์พุต Pull up
  • External IRQ Enable ขาอินเตอร์รัปภายนอก
  • Timers ตั้งรูปแบบการทำงาน Timer รวมทั้ง Watchdog
  • USART การรับส่งข้อมูลผ่านพอร์ตอนุกรม
  • Analog Comparator ใช่/ไม่ใช้ Analog Comparator
  • ADC ตั้งค่า ADC ภายในของ AVR
  • LCD กำหนดพอร์ตที่ใช้งานจอ LCD มีฟังก์ชัน LCD ให้ ไม่ต้องเขียนฟังก์ชันเอง
  • ฺBit-Banged กำหนดพอร์ต ที่ใช้ติดต่อกับ DS1302
  • Project Information ไว้เขียนรายละเอียดเกี่ยวกับโปรเจค
  • SPI ตั้งค่าการใช้งาน SPI
  • I2C ตั้งค่าการใช้งาน I2C เลือก I2C device
  • 1 Wire ตั้งค่าการใช้งาน 1 Wire (DS1820)
  • 2 Wire (I2C) ตั้งค่าเพิ่มเติม I2C

5. หลังจากที่ตั้งค่าเสร็จแล้ว ให้เลือก Generate, Save and Exit โปรแกรมจะทำการ Generate Code ตามที่เราตั้งค่าไว้ในขั้นตอนที่ 4

รูปที่ 5

6. ตั้งชื่อ File โดยปกติจะตั้งชื่อว่า main

รูปที่ 6

7. ตั้งชื่อโปรเจค

รูปที่ 7

8. ตั้งชื่อ CodeWizardAVR โปรเจค

รูปที่ 8

9. หลังจากคลิก Save ในขั้นตอนที่ 8 แล้ว โปรแกรมจะ Generate โปรเจคมาให้ เราสามารถเพิ่ม Code เพิ่ม File .h, .C เข้าไปในโปรเจคได้เลย

รูปที่ 9

10. เมื่อเขียนโปรแกรมเสร็จแล้วให้กด Shift+F9 เพื่อ Compile โปรแกรมที่เราเขียนไป ถ้าไม่มีข้อผิดพลาดจะเห็น หน้าต่างขึ้นมาดังรูปที่ 10

รูปที่ 10

11. File .HEX ที่ได้มาจากการ Compile จะอยู่ในโฟลเดอร์โปรเจคที่เราเซฟไว้ หลังจากนั้นเรานำ .HEX ไป burn ใส่ IC เป็นอันเสร็จครับ :) บทความหน้าผมจะสร้างโปรเจคง่ายๆไว้ทดลองกันครับ