สารบัญ:
2025 ผู้เขียน: John Day | [email protected]. แก้ไขล่าสุด: 2025-01-13 06:58
นี่คือจุดเริ่มต้นของซีรีส์ที่จะสอนคุณตั้งโปรแกรมไมโครคอนโทรลเลอร์ AVR ด้วย Bascom AVR
ทำไมฉันถึงทำเช่นนี้
ตัวอย่างโปรแกรมส่วนใหญ่ในซีรีส์นี้ คุณสามารถสร้างด้วย Arduino
บางอย่างง่ายกว่าและยากกว่า แต่ในตอนท้ายทั้งคู่จะทำงานบนคอนโทรลเลอร์เดียวกัน
แต่วิธีการเขียนโปรแกรมจะแตกต่างกันในทุกสภาพแวดล้อมการพัฒนา Arduino ต้องการไลบรารีสำหรับทุกอย่าง ยกเว้นฟังก์ชันพื้นฐาน Bascom ยังใช้งานได้กับห้องสมุด แต่ฉันแทบไม่ต้องรวมไว้ด้วย ด้วย Arduino การตั้งค่าเฉพาะฮาร์ดแวร์ทั้งหมดจะทำผ่านไลบรารี คุณมีอิทธิพลน้อยมากต่อพลังที่แท้จริงของไมโครคอนโทรลเลอร์ เริ่มต้นด้วยตัวจับเวลาที่ตัวควบคุมมี ด้วย Arduino คุณต้องมีห้องสมุดอีกครั้ง หากคุณมีตัวจับเวลาจนกว่าจะทำงาน ห้องสมุดอื่นอาจขัดแย้งกับการตั้งค่าของคุณ ที่ bascom คุณสามารถเข้าถึงฮาร์ดแวร์ทั้งหมดได้ฟรี รวมถึงบูตเซกเตอร์ที่ Arduino ครอบครองอยู่ ตัวอย่างเช่น ห้องสมุดบางแห่งที่ bascom จะถามคุณว่าคุณต้องการใช้ตัวจับเวลาตัวใด ในทางกลับกัน เนื่องจาก Arduino ทำให้ง่ายต่อการสร้างไลบรารีด้วยตัวคุณเอง มันจึงทำให้เป็นแพลตฟอร์มที่ฮาร์ดแวร์และเซ็นเซอร์ใหม่มักจะมีไลบรารีโดยตรง สิ่งที่มักเกี่ยวข้องกับการวิจัยจำนวนมากที่ bascom และหน้าที่ต่างๆ ที่ห้องสมุดมักจะใช้จะต้องถูกรวมเข้ากับโค้ดของโปรแกรมอย่างระมัดระวัง แต่ข่าวดีก็คือชุมชน bascom ก็ใหญ่มากเช่นกัน ซึ่งเป็นเหตุผลว่าทำไมทุกแนวคิดจึงมีทางออก
ดังนั้นส่วนหนึ่งขึ้นอยู่กับโครงการที่ใช้สำหรับสภาพแวดล้อมการพัฒนาและอีกส่วนหนึ่งขึ้นอยู่กับความรู้ความชำนาญของผู้เขียนโปรแกรม
แต่ทำไมฉันถึงทำซีรีส์นี้ ด้านหนึ่งช่วยประหยัดเงินได้มาก ฉันไม่ต้องซื้อบอร์ด Arduino สำหรับทุกโครงการ ตัวอย่างเช่น: Arduino uno ที่ไม่มีชื่อมีราคาประมาณ 12 ยูโร ตัวควบคุมที่อยู่บนนั้นมีราคาเพียง 2.5 ยูโร โดยมีวงจรขั้นต่ำที่จำเป็นสำหรับฟังก์ชันที่เสถียร โดยมีราคาประมาณ 4 ยูโร ในทางกลับกัน คุณสามารถเลือกชิป avr ทั้งหมดที่รองรับได้ atmegas 8 ถึง 256 และ attiny 8 ถึง 2313 และ xmega หลายประเภทที่ฉันไม่มีประสบการณ์ หากคุณต้องการใช้เซอร์โวและเซ็นเซอร์อัลตราโซนิกที่สามารถจดจำมือได้ เช่น จากนั้นเปิดฝาถังขยะ คุณสามารถใช้ชิปที่เล็กที่สุด มีเหตุผลมากมายในการเรียนรู้ภาษาที่สอง
มาเริ่มกันเลย
เสบียง
นี่คือรายการชิ้นส่วนขั้นต่ำที่จำเป็นสำหรับการทำงานที่มั่นคงของชิปและการตั้งโปรแกรม
เขียงหั่นขนมสำหรับการทดสอบ
Atmega 8-16PU (ดีกว่าถ้าคุณซื้อ 2 หรือ 3 ถ้าคุณฆ่าพวกเขาโดยไม่ได้ตั้งใจ)
7805 5V ตัวควบคุมแรงดันไฟฟ้า
ตัวต้านทาน 10Kohm
ตัวเก็บประจุแบบฟิล์ม 100nF
ตัวเก็บประจุด้วยไฟฟ้า 10µF
ตัวเก็บประจุด้วยไฟฟ้า 100µF
สายไฟสำหรับเขียงหั่นขนม
Windows PC 7/8/8.1/10
ISP Programmer (ฉันจะใช้ USBasp ที่นี่คุณสามารถซื้อได้ที่ amazon ด้วยเงินเพียงเล็กน้อย)
Bascom AVR (คุณสามารถดาวน์โหลด DEMO ได้ที่นี่ ทุกฟังก์ชั่นปลดล็อกแล้ว แต่คุณสามารถเขียนโค้ดได้จนถึงขนาด 4Kb เท่านั้นซึ่งเพียงพอสำหรับโค้ดจำนวนมาก)
ส่วนเสริม:
ไฟ LED พร้อมตัวต้านทาน
สวิตช์กด
ชิ้นส่วนเฉพาะโครงการ
ขั้นตอนที่ 1: การติดตั้ง Bascom และ Setup
ดาวน์โหลดไฟล์และติดตั้ง Bascom AVR ติดตั้งทุกส่วนรวมถึงช่องทำเครื่องหมายสุดท้ายหลังจากติดตั้ง
หลังจากนั้นรีบูตพีซีของคุณ มิฉะนั้น bascom จะไม่เริ่มทำงาน
หลังจากรีบูตเริ่มต้น bascom
ไปที่ตัวเลือก -> โปรแกรมเมอร์ และเลือก USBasp จากรายการ บันทึกการตั้งค่าและปิด Bascom
ใช้โปรแกรมนี้เพื่อติดตั้ง usbasp หลังจากนั้นให้รีบูทพีซีของคุณอีกครั้ง ตอนนี้เชื่อมต่อ USBasp กับพีซีของคุณแล้วเริ่มตัวจัดการอุปกรณ์ USBasp ควรปรากฏที่อุปกรณ์ libusb
Stat Bascom อีกครั้งและสร้างไฟล์ใหม่ บันทึกลงในพีซีของคุณและกดปุ่ม F7 บนแป้นพิมพ์ของคุณ
คอมไพเลอร์เริ่มต้นและคอมไพล์โปรแกรมเปล่า ตอนนี้คุณสามารถทดสอบการทำงานของโปรแกรมเมอร์ได้
กดปุ่ม F4 บนแป้นพิมพ์เพื่อเริ่มหน้าต่างโปรแกรมเมอร์ ไปที่ชิป -> ระบุเพื่อเริ่มการโต้ตอบ ไฟ LED จาก USBasp ควรกะพริบสั้น ๆ คุณควรได้รับข้อความเช่นรหัสชิป FFFFFF ไม่สามารถอ่านอุปกรณ์ได้ นั่นเป็นสัญญาณที่ดีว่าโปรแกรมเมอร์กำลังทำงาน แต่ไม่พบชิป
ตอนนี้เราสามารถเริ่มสร้างวงจรแรกได้แล้ว
ขั้นตอนที่ 2: มาดูชิปกันดีกว่า
หากคุณดูที่พินเอาต์ของชิป ดูเหมือนว่าชิปจะไม่มีความคล้ายคลึงกับบอร์ด Arduino แน่นอนว่าเราใช้ Atmega8 และ Arduino uno คือ Atmega328 แต่ Pinout นั้นเกือบจะเหมือนกัน แต่เขาชิปของบอร์ด Arduino Uno มีฟังก์ชั่นมากกว่า นี่คือชื่อของหมุด VCC และ GND เป็นพินสำหรับแหล่งจ่ายไฟ
AREF และ AVCC เป็นพินสำหรับแรงดันอ้างอิงและแหล่งจ่ายไฟสำหรับตัวแปลงอนาล็อกเป็นดิจิตอล
PB 0-7 PC 0-6 PD 0-7 เป็นพินเอาต์พุตอินพุตเอนกประสงค์ที่มีหลายตำแหน่ง
รีเซ็ตพินเป็นสิ่งที่ชื่อพูด เพื่อรีสตาร์ทชิป บรรทัดเหนือชื่อรีเซ็ตหมายถึงการปฏิเสธ นั่นหมายความว่า ในการรีเซ็ตชิป คุณต้องดึงมันลงมาที่ 0V
สำหรับหมุดต่อไปนี้จะมีคำแนะนำแยกต่างหากในเร็ว ๆ นี้
RXD TXD เป็นพินฮาร์ดแวร์สำหรับการสื่อสารแบบอนุกรม UART
INT0 INT1 คือหมุดขัดจังหวะฮาร์ดแวร์
XCK /T0 UART แหล่งสัญญาณนาฬิกา / Timer/Counter0 แหล่งสัญญาณนาฬิกา
พิน XTAL /TOSC ใช้สำหรับคริสตัลภายนอกสูงสุด 16MHz (รุ่นต่าง ๆ สูงถึง 20MHz) / พินคริสตัลสำหรับ RTC ภายใน
T1 คล้ายกับ T0
พิน AIN ใช้สำหรับเครื่องเปรียบเทียบอนาล็อก
ICP1 คล้ายกับ T0/T1
OC1A เป็นพินเอาต์พุตฮาร์ดแวร์สำหรับ pwm timer1 channel A
ชิป SS /OC2 เลือกพินสำหรับ SPI / ชอบ OC1B แต่ช่อง B
MOSI MISO SCK/ OC2 เป็นพิน SPI ของฮาร์ดแวร์และพินสำหรับการเขียนโปรแกรม /PWM output timer2
ADC0 ถึง ADC5 เป็นอินพุตแบบอะนาล็อก
SDA SCL คือพินสำหรับฮาร์ดแวร์ I2C
ชิปปกติสามารถทำงานได้ตั้งแต่ 4, 5V ถึง 5, 5V Atmega 8L สามารถทำงานได้ด้วยแรงดันไฟฟ้าที่ต่ำกว่ามาก
คุณจะเห็นว่าชิปตัวนี้สามารถทำอะไรได้มากกว่าที่ Arduino Uno ดูเหมือนจะทำไม่ได้ แต่ Arduino สามารถทำได้เช่นกัน คุณต้องตั้งโปรแกรมเท่านั้น
ขั้นตอนที่ 3: วงจรแรก
ถึงเวลาสร้างวงจรแรกของคุณแล้ว
โดยทั่วไปแล้ววงจรแรกคืออะไร? ถูกต้อง! มากะพริบ LED กันเถอะ
LED เชื่อมต่อกับ PB0 ตัวต้านทานถัดจากชิปมี 10k โอห์ม
ตัวต้านทานถัดจาก LED มี 470 โอห์ม
ตอนนี้คุณสามารถเชื่อมต่อ USBasp กับ Atmega ตามที่แสดงในภาพ
แต่ก่อนที่คุณจะเปิดเครื่องให้เราเขียนโปรแกรมก่อน
ขั้นตอนที่ 4: เขียนโปรแกรมแรก
สร้างไฟล์ใหม่ใน Bascom แล้วพิมพ์ข้อความต่อไปนี้
$regfile "m8def.dat"
$crystal = 1000000 config portb.0 = เอาต์พุต do portb.0 = 1 รอ 1 portb.0 = 0 รอ 1 ลูป
หลังจากนั้นคอมไพล์โดยกด F7 บนคีย์บอร์ดของคุณ
ตอนนี้เราสามารถตั้งโปรแกรมชิปได้โดยกด F4 หน้าต่างโปรแกรมเมอร์จะปรากฏขึ้น ตอนนี้ได้เวลาเปิดเครื่องจากเขียงหั่นขนม คุณควรใช้บางอย่างระหว่าง 6 ถึง 12 โวลต์
ตอนนี้ไปที่ชิป -> โปรแกรมอัตโนมัติ หากหน้าต่างโปรแกรมเมอร์ปิดโดยอัตโนมัติ แสดงว่าการเขียนโปรแกรมสำเร็จ
ไฟ LED ควรกะพริบในความถี่หนึ่งวินาที
คราวนี้มาดูโปรแกรมให้ละเอียดยิ่งขึ้นเพื่อทำความเข้าใจไวยากรณ์
$regfile "m8def.dat"
$crystal = 1000000
ด้วย $regfile เราจะบอกคอมไพเลอร์ถึงประเภทของชิปที่ใช้แล้ว ชื่อของชิป Arduino จะเป็น "m328pdef.dat"
ด้วย $crystal เราบอกความเร็ว cpu ของเขาประมาณ 1MHz
config portb.0 = เอาต์พุต
นั่นหมายความว่า PB0 ควรทำหน้าที่เป็นเอาต์พุต
อย่างไรก็ตาม ตัวย่อ PB0 หมายถึงพอร์ต B บิต 0 ชิปแบ่งออกเป็นหลายพอร์ต แต่ละพอร์ตจะได้รับจดหมายเพื่อระบุตัวตนที่ชัดเจน และแต่ละพอร์ตพินเล็กน้อยตั้งแต่ 0 ถึง 7 ตัวอย่างเช่น ฉันสามารถเขียนไบต์ที่สมบูรณ์ลงในรีจิสเตอร์เอาต์พุตพอร์ต ซึ่งจะส่งออกผ่านพินพอร์ตแต่ละตัว
ทำ
ห่วง
นี่คือสิ่งที่ใน Arduino คำสั่ง void loop หมายถึง ระหว่างสองคำสั่งนั้นจะทำซ้ำตลอดไป (มีข้อยกเว้นแต่เพิ่มเติมเกี่ยวกับเรื่องนั้นในภายหลัง)
Portb.0 = 1
รอ 1 portb.0 = 0 รอ 1
ที่นี่เราสร้างการกะพริบของไฟ LED
Portb.0 = 1 บอกให้ชิปเปลี่ยนเอาต์พุต PB0 เป็น 5V
คำสั่ง wait 1 ให้ชิปรอหนึ่งวินาที หากคุณต้องการเปลี่ยนไฟ LED ให้เร็วขึ้น คุณต้องแทนที่คำสั่ง wait ด้วย waitms ตอนนี้ คุณสามารถป้อนเวลาในขณะนี้ในหน่วยมิลลิวินาที เช่น waitms 500. (waitus หมายถึงรอเป็นนาโนวินาที)
Portb.0 = 0 บอกให้ชิปเปลี่ยนเอาต์พุต PB0 เป็น 0V
ขั้นตอนที่ 5: เพิ่มปุ่มเพื่อใช้อินพุต
ตอนนี้เราเพิ่มปุ่มเพื่อให้ไฟ LED สว่างขึ้นหากกดปุ่ม
ใส่ปุ่มตามที่แสดงในภาพ
ตอนนี้พิมพ์ในโปรแกรมติดตาม
$regfile "m8def.dat"
$crystal = 1000000 config portb.0 = output config portd.7 = อินพุต Portd.7 = 1 ทำถ้า pind.7 = 0 แล้ว portb.0 = 1 อื่น ๆ portb.0 = 0 ลูป
หากคุณอัปโหลดโปรแกรมนั้นไปยังชิป ไฟ LED จะสว่างขึ้นเมื่อกดปุ่มเท่านั้น แต่ทำไม?
โปรแกรมเริ่มต้นเหมือนกับครั้งสุดท้ายจนถึง
config portd.7 = อินพุต นั่นหมายความว่าพิน PD7 ที่เชื่อมต่อกับปุ่มทำหน้าที่เป็นอินพุต
Portd.7 = 1 ไม่เปลี่ยนพินให้สูง แต่เปิดใช้งานตัวต้านทานการดึงภายในของ Atmega
คำสั่ง if ดูแปลก ๆ เล็กน้อยหากคุณคุ้นเคยกับ Arduino
ถ้าคุณใช้คำสั่ง if คุณต้องใช้คำสั่ง "then" ในตัวอย่างนี้ คำสั่ง if ใช้สำหรับการดำเนินการคำสั่งเดียว หากคุณต้องการใช้คำสั่งเพิ่มเติม คุณต้องเขียนแบบนี้
ถ้า pind.7=0 แล้ว
portb.0=1 บางรหัส บางรหัส บางรหัสอื่น portb.0 = 0 end if
สำหรับการใช้คำสั่ง if คุณต้องใช้คำสั่ง "end if" ในตอนท้าย
ที่ยังมีความสำคัญอยู่ บางทีคุณอาจเคยเห็นแล้ว อินพุตไม่ได้ถูกสอบถามด้วย portx.x แต่ด้วย pinx.x. คุณสามารถจำได้ง่าย เอาต์พุตมี "o" (พอร์ต) ในคำและอินพุตมี "i" (พิน)
ตอนนี้ถึงตาคุณแล้วที่จะเล่นสนุก
คำสั่งถัดไปของฉันจะมาเร็ว ๆ นี้ (คำสั่งมาตรฐานเช่น while, select case, for และ variables)
หากคุณชอบคำแนะนำของฉันและต้องการเพิ่มเติมบอกฉันในความคิดเห็น