สารบัญ:

AVRSH: Command Interpreter Shell สำหรับ Arduino/AVR.: 6 ขั้นตอน (พร้อมรูปภาพ)
AVRSH: Command Interpreter Shell สำหรับ Arduino/AVR.: 6 ขั้นตอน (พร้อมรูปภาพ)

วีดีโอ: AVRSH: Command Interpreter Shell สำหรับ Arduino/AVR.: 6 ขั้นตอน (พร้อมรูปภาพ)

วีดีโอ: AVRSH: Command Interpreter Shell สำหรับ Arduino/AVR.: 6 ขั้นตอน (พร้อมรูปภาพ)
วีดีโอ: AVR Shell Command Interpreter 2024, กรกฎาคม
Anonim
AVRSH: Command Interpreter Shell สำหรับ Arduino/AVR
AVRSH: Command Interpreter Shell สำหรับ Arduino/AVR

เคยต้องการที่จะ "เข้าสู่ระบบ" กับไมโครคอนโทรลเลอร์ AVR ของคุณหรือไม่? เคยคิดบ้างไหมว่าการ "cat" การลงทะเบียนเพื่อดูเนื้อหานั้นคงจะดี คุณต้องการวิธีการเพิ่มและปิดระบบย่อยอุปกรณ์ต่อพ่วงของ AVR หรือ Arduino ใน *เรียลไทม์* หรือไม่? ฉันด้วย ฉันก็เลยเขียน AVR Shell ซึ่งเป็นเชลล์แบบยูนิกซ์ มันเหมือนกับ UNIX เพราะมันชวนให้นึกถึงบัญชีเชลล์ที่คุณออกไปและซื้อเพื่อเรียกใช้บอทชนกันของ irc nick ของคุณ เช่นเดียวกับการมีคำสั่งหรือสองคำสั่งที่เหมือนกัน นอกจากนี้ยังมีระบบไฟล์ที่คล้ายกับ UNIX extfs โดยใช้ EEPROM ภายนอก แต่นั่นเป็นโครงการสำหรับตัวเอง ดังนั้นฉันจะปล่อยโมดูลนั้นแยกกันภายใต้คำสั่งอื่นเมื่อพร้อมสำหรับการผลิต ต่อไปนี้คือรายการสิ่งที่คุณทำได้ด้วย AVR Shell:

  • อ่าน Data Direction Registers (DDRn) พอร์ต และพินทั้งหมดของคุณแบบเรียลไทม์
  • เขียนไปยัง DDRn, พอร์ต และพินทั้งหมดของคุณเพื่อเปิดมอเตอร์ ไฟ LED หรือเซ็นเซอร์อ่านแบบเรียลไทม์
  • รายการทะเบียนที่รู้จักทั้งหมดบนระบบ
  • สร้างและจัดเก็บค่าในตัวแปรที่ผู้ใช้กำหนดเองซึ่งสำรองโดย EEPROM
  • สร้างรหัสผ่านรูทและตรวจสอบความถูกต้อง (ใช้สำหรับการเข้าถึง telnet)
  • อ่านความเร็วสัญญาณนาฬิกา CPU ที่กำหนดค่าไว้
  • เปลี่ยนความเร็วสัญญาณนาฬิกาของ CPU โดยการตั้งค่าพรีสเกลเลอร์
  • เริ่มและหยุดตัวจับเวลา 16 บิตสำหรับจับเวลาของสิ่งต่าง ๆ
  • เปิดและ/หรือปิดระบบย่อยอุปกรณ์ต่อพ่วง: ตัวแปลงอนาล็อกเป็นดิจิตอล (ADC), อินเทอร์เฟซอุปกรณ์ต่อพ่วงอนุกรม (SPI), อินเทอร์เฟซสองสาย (TWI/I2C), UART/USART มีประโยชน์เมื่อคุณต้องการลดการใช้พลังงานของไมโครคอนโทรลเลอร์หรือเพื่อเปิดใช้งานฟังก์ชันบางอย่าง
  • เขียนใน C ++ พร้อมวัตถุที่ใช้ซ้ำได้

คำแนะนำนี้จะอธิบายการติดตั้ง ใช้งาน และปรับแต่ง avrsh

ขั้นตอนที่ 1: สิ่งที่คุณต้องการ

สิ่งที่คุณต้องการ
สิ่งที่คุณต้องการ

คำแนะนำนี้ไม่ต้องการอะไรมากยกเว้นคุณ:

  • มี Arduino หรือ ATmega328P AVR อื่นๆ ใช้งานได้ แต่คุณอาจต้องแก้ไขโค้ดเพื่อแสดงรายการรีจิสเตอร์ที่ไม่ซ้ำกับ MCU ของคุณ ชื่อจะต้องตรงกับสิ่งที่อยู่ในไฟล์ส่วนหัวเฉพาะสำหรับ MCU ของคุณ ชื่อทะเบียนหลายชื่อเหมือนกันระหว่าง AVR ดังนั้นระยะของคุณอาจแตกต่างกันไปเมื่อย้าย
  • มีวิธีเชื่อมต่อกับ USART อนุกรมของ Arduino/AVR ของคุณ ระบบได้รับการทดสอบอย่างกว้างขวางที่สุดด้วย AVR Terminal ซึ่งเป็นแอพ Windows ที่ทำการเชื่อมต่อแบบอนุกรมผ่านพอร์ต USB หรือ COM ของคุณ ทำงานร่วมกับ Arduinos โดยใช้การเชื่อมต่อ USB และ AVR ใดๆ โดยใช้ USB-BUB จาก Moderndevice.com ตัวเลือกเทอร์มินัลอื่นๆ ได้แก่ Putty, minicom (Linux และ FreeBSD), screen (Linux/FreeBSD), Hyperterminal, Teraterm ฉันพบผงสำหรับอุดรูและ teraterm ส่งขยะเมื่อเชื่อมต่อดังนั้นคำสั่งแรกของคุณอาจอ่านไม่ออก
  • ติดตั้งและใช้งานเฟิร์มแวร์ AVR Shell ซึ่งคุณสามารถดาวน์โหลดได้จากหน้าเหล่านี้ หรือรับเวอร์ชันล่าสุดที่ BattleDroids.net

หากต้องการติดตั้ง AVR Terminal เพียงแกะกล่องและเรียกใช้ ในการติดตั้งเฟิร์มแวร์ AVR Shell ให้ดาวน์โหลดและอัปโหลดไฟล์ hex โดยตรงและเชื่อมต่อเทอร์มินัลอนุกรมของคุณที่ 9600 baud หรือคอมไพล์ด้วยตัวเองด้วย "make" จากนั้น "make program" เพื่ออัปโหลดฐานสิบหก หมายเหตุ คุณอาจต้องเปลี่ยนการตั้งค่า AVRDUDE เพื่อให้สอดคล้องกับพอร์ต COM ของคุณ หมายเหตุ: แอตทริบิวต์ PROGMEM ใช้งานไม่ได้ในการใช้งาน AVR GCC ปัจจุบันสำหรับ C++ และนี่เป็นจุดบกพร่องที่ทราบ หากคุณคอมไพล์ คุณจะได้รับข้อความเตือนจำนวนมากว่า "คำเตือน: เฉพาะตัวแปรเริ่มต้นเท่านั้นที่สามารถวางลงในพื้นที่หน่วยความจำของโปรแกรมได้" นอกจากจะดูน่ารำคาญแล้ว คำเตือนนี้ไม่มีอันตราย เนื่องจาก C++ บนแพลตฟอร์มแบบฝังตัวนั้นไม่สูงในรายการลำดับความสำคัญของ AVR GCC จึงไม่ทราบว่าจะแก้ไขปัญหานี้เมื่อใด หากคุณตรวจสอบรหัส คุณจะเห็นว่าฉันได้แก้ไขที่ใดเพื่อลดคำเตือนนี้โดยใช้คำสั่งแอตทริบิวต์ของฉันเอง ค่อนข้างง่าย ดาวน์โหลดและติดตั้งอะไรก็ได้ที่คุณอาจต้องใช้ จากนั้นพลิกหน้าแล้วเริ่มแครกกัน

ขั้นตอนที่ 2: การอ่านและการเขียนทะเบียน

การอ่านและการเขียนทะเบียน
การอ่านและการเขียนทะเบียน

AVR Shell นั้นเขียนขึ้นเพื่อเข้าถึงเซ็นเซอร์บางตัวที่ฉันเชื่อมต่อกับ AVR เป็นหลัก มันเริ่มต้นด้วย LED ธรรมดา จากนั้นย้ายไปที่เซ็นเซอร์วัดแสง เซ็นเซอร์อุณหภูมิ และสุดท้ายไปที่ทรานสดิวเซอร์อัลตราโซนิกสองตัว avrsh สามารถตั้งค่าส่วนประกอบดิจิทัลของเซ็นเซอร์เหล่านี้ได้โดยการเขียนไปยังรีจิสเตอร์ที่ควบคุมพวกมัน การจัดการรีจิสเตอร์ AVR ขณะทำงาน หากต้องการรับรายการรีจิสเตอร์ที่รู้จักทั้งหมดบน Arduino ของคุณ ให้พิมพ์:

พิมพ์ทะเบียน แล้วคุณจะได้งานพิมพ์ออกมาหน้าตาแบบนี้

ฉันรู้เกี่ยวกับการลงทะเบียนต่อไปนี้:

TIFR0 PORTC TIFR1 PORTD TIFR2 DDRD PCIFR DDRB EIFR DDRC EIMSK PINB EECR PINC EEDR Pind SREG EEARL GPIOR0 EEARH GPIOR1 GTCCR GPIOR2 TCCR0A TCCR0B TCNT0 OCR0A OCR0B SPCR SPDR ACSR SMCR MCUSR MCUCR SPMCSR WDTCSR CLKPR PRR OSCCAL PCICR Eicra PCMSK0 PCMSK1 TIMSK0 TIMSK1 TIMSK2 ADCL ADCH ADCSRA ADCSRB ADMUX DIDR0 DIDR1 TCCR1A TCCR1B TCCR1C TCNT1L TCNT1H ICR1L ICR1H OCR1AL OCR1AH OCR1BL OCR1BH TCCR2A TCCR2B TCNT2 OCR2A OCR2B ASSRUC TWBR TWSR TWCR0BET TWDRA ราก TWDR หากต้องการดูว่าแต่ละบิตถูกตั้งค่าอย่างไรในรีจิสเตอร์ใด ๆ ให้ใช้คำสั่ง cat หรือ echo

แมว %GPIOR0 ที่นี่ฉันกำลังขอให้ล่ามคำสั่งแสดงหรือสะท้อนเนื้อหาของการลงทะเบียน I/O วัตถุประสงค์ทั่วไป #0 สังเกตเครื่องหมายเปอร์เซ็นต์ (%) หน้าชื่อทะเบียน คุณต้องการสิ่งนี้เพื่อระบุเชลล์ว่านี่คือคีย์เวิร์ดที่สงวนไว้ซึ่งระบุรีจิสเตอร์ เอาต์พุตทั่วไปจากคำสั่ง echo มีลักษณะดังนี้

GPIOR0(0x0) ตั้งค่าเป็น [00000000] ผลลัพธ์แสดงชื่อของรีจิสเตอร์ ค่าเลขฐานสิบหกที่พบในรีจิสเตอร์ และการแสดงไบนารีของรีจิสเตอร์ (แสดงแต่ละบิตเป็น 1 หรือ 0) ในการตั้งค่าบิตเฉพาะในการลงทะเบียนใด ๆ ให้ใช้ตัวดำเนินการ "index of" ตัวอย่างเช่น สมมติว่าฉันต้องการบิตที่ 3 เป็น 1

%GPIOR0[3] = 1 และเชลล์จะให้คำตอบแก่คุณโดยระบุว่าเป็นการกระทำและผลลัพธ์

GPIOR0(0x0) ตั้งค่าเป็น [00000000] (0x8) ตั้งค่าเป็น [00001000] อย่าลืมเครื่องหมายเปอร์เซ็นต์เพื่อบอกเชลล์ว่าคุณกำลังทำงานกับรีจิสเตอร์ นอกจากนี้ โปรดทราบด้วยว่าการตั้งค่าบิตที่ 3 จะเท่ากับ 4 บิต เนื่องจาก AVR ของเราใช้ดัชนีแบบ Zero-based กล่าวอีกนัยหนึ่ง นับถึงบิตที่ 3 คุณนับ 0, 1, 2, 3 ซึ่งเป็นตำแหน่งที่ 4 แต่บิตที่ 3 คุณสามารถล้างบิตในลักษณะเดียวกันโดยการตั้งค่าบิตเป็นศูนย์ ด้วยการตั้งค่าบิตเช่นนี้ คุณสามารถเปลี่ยนการทำงานของ AVR ได้ทันที ตัวอย่างเช่น โดยการเปลี่ยนค่าการจับคู่ตัวจับเวลา CTC ที่พบใน OCR1A นอกจากนี้ยังช่วยให้คุณดูการตั้งค่าเฉพาะที่คุณจะต้องตรวจสอบโค้ดโดยทางโปรแกรม เช่น ค่า UBBR สำหรับอัตราบอดของคุณ การทำงานกับ DDRn, PORTn และ PINn พิน I/O ยังถูกกำหนดให้กับรีจิสเตอร์และสามารถตั้งค่าได้ในลักษณะเดียวกันทุกประการ แต่มีการสร้างไวยากรณ์พิเศษขึ้นเพื่อทำงานกับรีจิสเตอร์ประเภทนี้ ในโค้ดมีกระบวนการปกติ เช่น การเปิด LED หรืออุปกรณ์อื่นๆ ที่ต้องการ high หรือ low แบบดิจิตอล ต้องมีการตั้งค่า Data Direction Register เพื่อระบุว่าพินนั้นใช้สำหรับเอาต์พุต จากนั้นเขียน 1 หรือ 0 ไปยังบิตเฉพาะในพอร์ตที่ถูกต้อง สมมติว่าเรามี LED ที่เชื่อมต่อกับพินดิจิตอล 13 (PB5) และเราต้องการเปิดใช้งาน นี่คือวิธีการดำเนินการในขณะที่ AVR ของคุณทำงาน

ตั้งค่าพิน pb5 เอาต์พุตเขียนพิน pb5 สูง เอาต์พุต นอกจากจะเห็น LED ของคุณติดแล้ว จะเป็นแบบนี้

root@ATmega328p> ตั้งค่าพิน pb5 outputSet pb5 สำหรับ outputroot@ATmega328p> เขียนพิน pb5 highWrote ลอจิกสูงถึงพิน pb5 "root@ATmega328p>" เป็นพรอมต์ของเชลล์ที่ระบุว่าพร้อมที่จะยอมรับคำสั่งจากคุณ หากต้องการปิดไฟ LED คุณเพียงแค่เขียนต่ำไปที่พิน หากคุณต้องการอ่านอินพุตดิจิตอลจากพิน ให้ใช้คำสั่ง read ใช้ตัวอย่างข้างต้นของเรา

root@ATmega328p> อ่านพิน pb5Pin: pb5 สูง อีกทางหนึ่ง เพียงสะท้อนพินรีจิสเตอร์ที่ควบคุมพอร์ตพินนั้น ตัวอย่างเช่น ถ้าเรามีดิปสวิตช์เชื่อมต่อกับพินดิจิตอล 7 และ 8 (PD7 และ PD8) คุณสามารถส่งคำสั่ง

เสียงก้อง %PIND จากนั้นเชลล์จะแสดงเนื้อหาของรีจิสเตอร์นั้น แสดงสถานะอินพุต/เอาต์พุตทั้งหมดของอุปกรณ์ที่เชื่อมต่อและสถานะของสวิตช์เปิดหรือปิด

ขั้นตอนที่ 3: การอ่านและการเขียนฟิวส์

การอ่านและการเขียนฟิวส์
การอ่านและการเขียนฟิวส์

ฟิวส์เป็นรีจิสเตอร์ชนิดพิเศษ พวกเขาควบคุมทุกอย่างตั้งแต่ความเร็วสัญญาณนาฬิกาของไมโครคอนโทรลเลอร์ของคุณไปจนถึงวิธีการตั้งโปรแกรมที่มีอยู่จนถึง EEPROM ที่ป้องกันการเขียน บางครั้ง คุณจะต้องเปลี่ยนการตั้งค่าเหล่านี้ โดยเฉพาะอย่างยิ่ง หากคุณกำลังสร้างระบบ AVR แบบสแตนด์อโลน ฉันไม่แน่ใจว่าคุณควรเปลี่ยนการตั้งค่าฟิวส์บน Arduino ระวังฟิวส์ของคุณ คุณสามารถล็อคตัวเองได้หากคุณตั้งค่าไม่ถูกต้อง ในคำแนะนำก่อนหน้านี้ ฉันสาธิตวิธีที่คุณสามารถอ่านและตั้งค่าฟิวส์ของคุณโดยใช้โปรแกรมเมอร์และ avrdude ของคุณ ที่นี่ ฉันจะแสดงวิธีอ่านฟิวส์ของคุณ ณ รันไทม์ เพื่อดูว่า MCU ของคุณตั้งค่าไว้อย่างไร โปรดทราบว่านี่ไม่ใช่การตั้งค่าเวลาคอมไพล์ที่คุณได้รับจากคำจำกัดความ แต่ฟิวส์จริงจะฟิวส์ขาดเมื่อ MCU อ่านค่าเหล่านั้นในขณะใช้งาน จากตารางที่ 27-9 ในแผ่นข้อมูล ATmega328P (สมุดข้อมูล คล้ายๆ กัน) บิตของ Fuse Low Byte มีดังนี้:

CKDIV8 CKOUT SUT1 SUT0 CKSEL3 CKSEL2 CKSEL1 CKSEL0สิ่งที่น่าสนใจที่ควรทราบคือเมื่อใช้ฟิวส์ 0 หมายถึงตั้งโปรแกรมและ 1 หมายถึงบิตนั้นไม่ได้ตั้งโปรแกรมไว้ ค่อนข้างขัดกับสัญชาตญาณ แต่เมื่อคุณรู้แล้วคุณจะรู้

  • CKDIV8 ตั้งค่านาฬิกา CPU ของคุณให้ถูกหารด้วย 8 ATmega328P มาจากโรงงานที่ตั้งโปรแกรมให้ใช้ออสซิลเลเตอร์ภายในที่ 8MHz โดยมี CKDIV8 ตั้งโปรแกรมไว้ (เช่น ตั้งค่าเป็น 0) ทำให้คุณมีความถี่ F_CPU หรือ CPU สุดท้ายที่ 1MHz สำหรับ Arduino สิ่งนี้มีการเปลี่ยนแปลงเนื่องจากมีการกำหนดค่าให้ใช้ออสซิลเลเตอร์ภายนอกที่ 16MHz
  • CKOUT เมื่อตั้งโปรแกรมจะส่งสัญญาณนาฬิกา CPU ของคุณบน PB0 ซึ่งเป็นพินดิจิตอล 8 บน Arduinos
  • SUT[1..0] ระบุเวลาเริ่มต้นสำหรับ AVR ของคุณ
  • CKSEL[3..0] ตั้งค่าแหล่งสัญญาณนาฬิกา เช่น ออสซิลเลเตอร์ RC ภายใน ออสซิลเลเตอร์ภายนอก ฯลฯ

เมื่อคุณอ่านฟิวส์ของคุณ ฟิวส์จะคืนเป็นเลขฐานสิบหก นี่คือรูปแบบที่คุณต้องการหากคุณต้องการเขียนฟิวส์ผ่าน avrdude บน Arduino ของฉัน นี่คือสิ่งที่ฉันได้รับเมื่ออ่านฟิวส์ไบต์ล่าง:

root@ATmega328p> อ่าน lfuseLower Fuse: 0xffดังนั้น บิตทั้งหมดถูกตั้งค่าเป็น 1 ฉันทำตามขั้นตอนเดียวกันกับโคลน Arduino และได้ค่าเท่ากัน ตรวจสอบหนึ่งในระบบ AVR แบบสแตนด์อโลนของฉัน ฉันได้รับ 0xDA ซึ่งเป็นค่าที่ฉันตั้งไว้เมื่อกำหนดค่าชิป ขั้นตอนเดียวกันนี้ใช้สำหรับตรวจสอบ High Fuse Byte, Extended Fuse Byte และ Lock fuses ไบต์ฟิวส์ของการปรับเทียบและลายเซ็นถูกปิดใช้งานในโค้ดด้วยคำสั่งตัวประมวลผลล่วงหน้า #if 0 ซึ่งคุณสามารถเปลี่ยนได้หากคุณรู้สึกว่ามีปัญหา

ขั้นตอนที่ 4: คำสั่งอื่นๆ

คำสั่งอื่นๆ
คำสั่งอื่นๆ

มีคำสั่งอื่นๆ อีกหลายคำสั่งที่ตัวแปลคำสั่งเริ่มต้นเข้าใจว่าคุณอาจพบว่ามีประโยชน์ คุณสามารถดูคำสั่งที่ใช้งานและออกในอนาคตทั้งหมดได้โดยการออกวิธีใช้หรือเมนูที่พรอมต์ ฉันจะรีบอธิบายไว้ที่นี่ เนื่องจากส่วนใหญ่เป็นคำอธิบายในตัวเอง การตั้งค่าความถี่สัญญาณนาฬิกาของ CPU คุณสามารถค้นหาสิ่งที่เฟิร์มแวร์ของคุณได้รับการกำหนดค่าเพื่อใช้เป็นการตั้งค่านาฬิกา CPU ด้วยคำสั่ง fcpu:

root@ATmega328p> fcpuCPU ความถี่: 16000000นั่นคือ 16 ล้านหรือ 16 ล้านเฮิรตซ์ หรือที่เรียกกันทั่วไปว่า 16 MHz คุณสามารถเปลี่ยนแปลงได้ทันทีไม่ว่าจะด้วยเหตุผลใดก็ตาม ด้วยคำสั่งนาฬิกา คำสั่งนี้ใช้อาร์กิวเมนต์เดียว: พรีสเกลเลอร์ที่จะใช้เมื่อหารความเร็วสัญญาณนาฬิกาของคุณ คำสั่งนาฬิกาจะเข้าใจค่าพรีสเกลเลอร์เหล่านี้:

  • ckdiv2
  • ckdiv4
  • ckdiv8
  • ckdiv16
  • ckdiv32
  • ckdiv64
  • ckdiv128
  • ckdiv256

การใช้คำสั่ง:

นาฬิกา ckdiv2 เมื่อความเร็ว cpu ของคุณคือ 16MHz จะส่งผลให้ความเร็วสัญญาณนาฬิกาของคุณเปลี่ยนเป็น 8MHz การใช้ prescaler ของ ckdiv64 ที่มีความเร็วสัญญาณนาฬิกาเริ่มต้นที่ 16MHz จะส่งผลให้ความเร็วสัญญาณนาฬิกาสุดท้ายอยู่ที่ 250 KHz ทำไมบนโลกคุณถึงต้องการทำให้ MCU ของคุณช้าลง? ประการหนึ่ง ความเร็วสัญญาณนาฬิกาที่ต่ำกว่าจะใช้พลังงานน้อยลง และหากคุณมี MCU แบตเตอรีหมดในกล่องหุ้มโครงการ คุณอาจไม่จำเป็นต้องใช้มันเพื่อให้ทำงานด้วยความเร็วสูงสุด ดังนั้นจึงสามารถลดความเร็วลงและลดการใช้พลังงานลงได้, เพิ่มอายุการใช้งานแบตเตอรี่ นอกจากนี้ หากคุณใช้นาฬิกาสำหรับปัญหาเรื่องเวลากับ MCU อื่น เช่น การใช้ซอฟต์แวร์ UART หรือสิ่งดังกล่าว คุณอาจต้องการตั้งค่าให้เป็นค่าเฉพาะที่ง่ายต่อการรับอัตราบอดที่ดีด้วย อัตราความผิดพลาดที่ต่ำกว่า การเปิดเครื่องและการปิดระบบย่อยอุปกรณ์ต่อพ่วง ในบันทึกเดียวกับการลดการใช้พลังงานที่กล่าวถึงก่อนหน้านี้ คุณอาจต้องการลดพลังงานเพิ่มเติมโดยการปิดอุปกรณ์ต่อพ่วงออนบอร์ดบางตัวที่คุณไม่ได้ใช้ ตัวแปลคำสั่งและเชลล์สามารถเปิดปิดอุปกรณ์ต่อพ่วงต่อไปนี้ได้:

  • ตัวแปลงอนาล็อกเป็นดิจิตอล (ADC) อุปกรณ์ต่อพ่วงนี้ใช้เมื่อคุณมีเซ็นเซอร์อะนาล็อกที่ให้ข้อมูล (เช่น อุณหภูมิ แสง ความเร่ง ฯลฯ) และจำเป็นต้องแปลงเป็นค่าดิจิทัล
  • อินเทอร์เฟซอุปกรณ์ต่อพ่วงแบบอนุกรม (SPI) บัส SPI ใช้เพื่อสื่อสารกับอุปกรณ์ที่เปิดใช้งาน SPI อื่นๆ เช่น หน่วยความจำภายนอก ไดรเวอร์ LED ADC ภายนอก เป็นต้น บางส่วนของ SPI ใช้สำหรับการเขียนโปรแกรม ISP หรืออย่างน้อยก็พิน ดังนั้นโปรดระมัดระวังเมื่อปิดเครื่อง หากคุณกำลังเขียนโปรแกรมผ่าน ISP
  • อินเทอร์เฟซแบบสองสาย อุปกรณ์ภายนอกบางตัวใช้บัส I2C เพื่อสื่อสาร แม้ว่าสิ่งเหล่านี้จะถูกแทนที่อย่างรวดเร็วด้วยอุปกรณ์ที่เปิดใช้งาน SPI เนื่องจาก SPI มีปริมาณงานมากกว่า
  • ยูเอสอาร์ท. นี่คืออินเทอร์เฟซแบบอนุกรมของคุณ คุณอาจไม่ต้องการปิดสิ่งนี้หากคุณเชื่อมต่อกับ AVR ผ่านการเชื่อมต่อแบบอนุกรม! อย่างไรก็ตาม ฉันได้เพิ่มสิ่งนี้ในที่นี้เป็นโครงร่างสำหรับการพอร์ตไปยังอุปกรณ์ที่มี USART หลายตัว เช่น ATmega162 หรือ ATmega644P
  • ทั้งหมด. อาร์กิวเมนต์ของคำสั่ง powerup หรือ powerdown นี้จะเปิดอุปกรณ์ต่อพ่วงทั้งหมดที่กล่าวถึงหรือปิดทั้งหมดด้วยคำสั่งเดียว ใช้คำสั่งนี้อย่างชาญฉลาดอีกครั้ง

root@ATmega328p> powerdown twiPowerdown ของ twi complete.root@ATmega328p> powerup twiPowerup ของ twi เสร็จสมบูรณ์

การเริ่มและหยุดจับเวลา เชลล์มีตัวจับเวลา 16 บิตในตัวที่พร้อมใช้งาน คุณเริ่มตัวจับเวลาด้วยคำสั่งตัวจับเวลา:

ตัวจับเวลาเริ่มและหยุดจับเวลาด้วยการหยุดอาร์กิวเมนต์

ตัวจับเวลาหยุดตัวจับเวลานี้จะไม่ขัดแย้งกับตัวจับเวลา USART ภายใน ดูรหัสสำหรับรายละเอียดการใช้งานตัวจับเวลา USART หากคุณสนใจรายละเอียดที่เต็มไปด้วยเลือด

root@ATmega328p> ตัวจับเวลา startStarted timer.root@ATmega328p> ตัวจับเวลาหยุดเวลาที่ผ่านไป: ~ 157 วินาที การตรวจสอบสิทธิ์ เชลล์สามารถเก็บรหัสผ่าน 8 อักขระลงใน EEPROM กลไกรหัสผ่านนี้สร้างขึ้นเพื่อรองรับความสามารถในการเข้าสู่ระบบ telnet แต่สามารถขยายได้เพื่อปกป้องสิ่งอื่น ๆ ตัวอย่างเช่น คุณอาจต้องการคำสั่งบางอย่าง เช่น การเปลี่ยนค่ารีจิสเตอร์ ผ่านกลไกการตรวจสอบสิทธิ์ ตั้งรหัสผ่านด้วยคำสั่งรหัสผ่าน

root@ATmega328p> passwd blahWrote root password ไปยัง EEPROMอนุญาตกับรหัสผ่านของเขา (หรือต้องมีการอนุญาตโดยทางโปรแกรมผ่านรหัส) ด้วยคำสั่ง auth โปรดทราบว่าหากคุณพยายามเปลี่ยนรหัสผ่านรูทและมีการตั้งค่ารหัสผ่านรูทไว้แล้ว คุณต้องอนุญาตตัวเองกับรหัสผ่านเก่าก่อนที่จะได้รับอนุญาตให้เปลี่ยนเป็นรหัสผ่านใหม่

root@ATmega328p> passwd blinky คุณต้องอนุญาตตัวเองก่อน root@ATmega328p> auth blahAuthorized.root@ATmega328p> passwd blinkyWrote รหัสผ่าน root ใหม่เป็น EEPROMแน่นอน คุณจะต้องโหลดไฟล์ avrsh.eep หากคุณลบเฟิร์มแวร์เพื่อคืนค่าค่าและตัวแปรเก่าของคุณ Makefile จะสร้างไฟล์ EEPROM ให้คุณ ตัวแปร เชลล์เข้าใจแนวคิดของตัวแปรที่ผู้ใช้กำหนด รหัสนี้จำกัดไว้ที่ 20 แต่คุณสามารถเปลี่ยนได้หากต้องการโดยเปลี่ยนคำนิยาม MAX_VARIABLES ใน script.h คุณสามารถบันทึกค่า 16 บิตใดๆ (นั่นคือ ตัวเลขใดๆ ที่สูงถึง 65, 536) ให้กับตัวแปรที่จะเรียกคืนในภายหลัง ไวยากรณ์คล้ายกับรีจิสเตอร์ยกเว้นเครื่องหมายดอลลาร์ ($) ใช้เพื่อแสดงถึงตัวแปรของเชลล์ ระบุตัวแปรทั้งหมดของคุณด้วยคำสั่งตัวแปรการพิมพ์

ตัวแปรการพิมพ์ตัวแปรที่ผู้ใช้กำหนด:ชื่อดัชนี -> ค่า (01): $FREE$ -> 0(02): $FREE$ -> 0(03): $FREE$ -> 0(04): $FREE$ -> 0(05): $FREE$ -> 0(06): $FREE$ -> 0(07): $FREE$ -> 0(08): $FREE$ -> 0(09): $FREE$ -> 0(10): $FREE$ -> 0(11): $FREE$ -> 0(12): $FREE$ -> 0(13): $FREE$ -> 0(14): $FREE$ -> 0(15): $FREE$ -> 0(16): $FREE$ -> 0(17): $FREE$ -> 0(18): $FREE$ -> 0(19): $FREE$ -> 0(20): $ฟรี$ -> 0เสร็จสมบูรณ์ตั้งค่าตัวแปร

$newvar = 25$ หมดเวลา = 23245รับค่าของตัวแปรที่กำหนด

root@ATmega328p> echo $newvar$ newvar 25คุณสามารถดูตัวแปรทั้งหมดที่คุณสร้างอินสแตนซ์ด้วยคำสั่ง print ที่คุณรู้อยู่แล้ว

ตัวแปรที่ผู้ใช้กำหนดเอง:ชื่อดัชนี -> ค่า (01): newvar -> 25(02): หมดเวลา -> 23245(03): $FREE$ -> 0(04): $FREE$ -> 0(05): $FREE$ -> 0(06): $FREE$ -> 0(07): $FREE$ -> 0(08): $FREE$ -> 0(09): $FREE$ -> 0(10): $ฟรี$ -> 0(11): $ฟรี$ -> 0(12): $ฟรี$ -> 0(13): $ฟรี$ -> 0(14): $ฟรี$ -> 0(15): $FREE$ -> 0(16): $FREE$ -> 0(17): $FREE$ -> 0(18): $FREE$ -> 0(19): $FREE$ -> 0(20): $ฟรี$ -> 0เสร็จสมบูรณ์ชื่อ $FREE$ บ่งชี้ว่าตำแหน่งของตัวแปรนั้นว่างและยังไม่ได้กำหนดชื่อตัวแปร

ขั้นตอนที่ 5: การปรับแต่งเชลล์

การปรับแต่งเชลล์
การปรับแต่งเชลล์

คุณมีอิสระที่จะแฮ็คโค้ดและปรับแต่งตามความต้องการของคุณเองได้หากต้องการ ถ้าฉันรู้ว่าฉันจะปล่อยรหัสนี้ ฉันจะสร้างคลาสตัวแปลคำสั่งและโครงสร้างคำสั่งแยกต่างหาก และทำซ้ำผ่านการเรียกตัวชี้ฟังก์ชัน มันจะลดจำนวนโค้ดลง แต่เนื่องจากเชลล์แยกวิเคราะห์บรรทัดคำสั่งและเรียกใช้เมธอดเชลล์ที่เหมาะสม หากต้องการเพิ่มคำสั่งที่กำหนดเอง ให้ทำดังต่อไปนี้: 1. เพิ่มคำสั่งของคุณในรายการแยกวิเคราะห์ คำสั่ง parser จะ แยกวิเคราะห์บรรทัดคำสั่งและให้คำสั่งและอาร์กิวเมนต์ใดๆ แยกจากกัน อาร์กิวเมนต์จะถูกส่งผ่านเป็นตัวชี้ไปยังพอยน์เตอร์ หรืออาร์เรย์ของพอยน์เตอร์ ไม่ว่าคุณจะต้องการทำงานกับมันอย่างไร พบได้ใน shell.cpp เปิด shell.cpp และค้นหาวิธีการ ExecCmd ของคลาส AVRShell คุณอาจต้องการเพิ่มคำสั่งในหน่วยความจำของโปรแกรม หากเป็นเช่นนั้น ให้เพิ่มคำสั่งใน progmem.h และ progmem.cpp คุณสามารถเพิ่มคำสั่งลงในหน่วยความจำโปรแกรมได้โดยตรงโดยใช้มาโคร PSTR() แต่คุณจะต้องสร้างคำเตือนประเภทที่กล่าวถึงก่อนหน้านี้อีก อีกครั้ง นี่เป็นจุดบกพร่องที่รู้จักซึ่งทำงานกับ C ++ แต่คุณสามารถแก้ไขได้โดยเพิ่มคำสั่งในไฟล์ progmem.* โดยตรงเหมือนที่ฉันได้ทำไปแล้ว ถ้าคุณไม่รังเกียจที่จะเพิ่มการใช้งาน SRAM ของคุณ คุณสามารถเพิ่มคำสั่งตามที่ฉันได้แสดงไว้ด้วยคำสั่ง "clock" สมมติว่าคุณต้องการเพิ่มคำสั่งใหม่ชื่อ "newcmd" ไปที่ AVRShell::ExecCmd และค้นหาตำแหน่งที่สะดวกในการแทรกรหัสต่อไปนี้:

อื่น if (!strcmp(c, "newcmd")) cmdNewCmd(args);สิ่งนี้จะเพิ่มคำสั่งของคุณและเรียกเมธอด cmdNewCmd ที่คุณจะเขียนในขั้นตอนถัดไป 2. เขียนโค้ดคำสั่งที่กำหนดเอง ในไฟล์เดียวกัน ให้เพิ่มโค้ดคำสั่งที่กำหนดเองของคุณ นี่คือนิยามวิธีการ คุณยังคงต้องการเพิ่มการประกาศใน shell.h เพียงผนวกเข้ากับคำสั่งอื่นๆ ในตัวอย่างก่อนหน้านี้ โค้ดอาจมีลักษณะดังนี้

voidAVRShell::cmdNewCmd(char ** args){ sprintf_P(buff, PSTR("คำสั่งของคุณคือ %s\r\n", args[0]); WriteRAM(buff);}มีหลายสิ่งหลายอย่างที่นี่ อย่างแรก "buff" คือบัฟเฟอร์อาร์เรย์ 40 ตัวที่มีให้ในโค้ดสำหรับการใช้งานของคุณ เราใช้เวอร์ชันหน่วยความจำโปรแกรมของ sprintf เนื่องจากเราส่ง PSTR ไปให้ คุณสามารถใช้เวอร์ชันปกติได้หากต้องการ แต่อย่าลืมส่งรูปแบบใน PSTR นอกจากนี้ อาร์กิวเมนต์ยังอยู่ในอาร์เรย์ args หากคุณพิมพ์ "newcmd arg1 arg2" คุณสามารถรับอาร์กิวเมนต์เหล่านี้ได้ด้วยตัวห้อย args[0] และ args[1] คุณสามารถส่งผ่านอาร์กิวเมนต์ได้สูงสุด MAX_ARGS ตามที่กำหนดไว้ในโค้ด อย่าลังเลที่จะเปลี่ยนค่านั้นเมื่อคุณคอมไพล์ใหม่ หากคุณต้องการส่งอาร์กิวเมนต์เพิ่มเติมจำนวนมากพร้อมกัน WriteLine และ WriteRAM เป็นฟังก์ชันส่วนกลางที่ส่งคืนเมธอดของ UART ที่มีชื่อเดียวกัน อาร์กิวเมนต์ที่ 2 ของฟังก์ชันนี้มีนัย ถ้าคุณไม่ผ่านอะไรเลย พรอมต์คำสั่งจะถูกเขียนหลังจากนั้น หากคุณส่ง 0 เป็นอาร์กิวเมนต์ที่ 2 พรอมต์จะไม่ถูกเขียน สิ่งนี้มีประโยชน์เมื่อคุณต้องการเขียนสตริงแยกกันหลายสตริงเพื่อส่งออก ก่อนที่พรอมต์คำสั่งจะถูกส่งคืนไปยังผู้ใช้ 3. ให้เชลล์รันโค้ดคำสั่ง คุณได้แจ้งให้เชลล์ดำเนินการรันเมธอด cmdNewCmd เมื่อคุณตั้งค่าคำสั่งใหม่ แต่เพิ่มลงในไฟล์ shell.h เพื่อให้อ็อบเจ็กต์เชลล์เข้าใจ เพียงเพิ่มไว้ด้านล่างคำสั่งสุดท้าย หรือหน้าคำสั่งแรก หรือที่ใดก็ได้ในนั้น เท่านี้ก็เรียบร้อย คอมไพล์ใหม่และอัปโหลดเฟิร์มแวร์ไปยัง Arduino ของคุณและคำสั่งใหม่จะพร้อมใช้งานจากเชลล์ที่พรอมต์

ขั้นตอนที่ 6: สรุป

คุณควรทราบวิธีติดตั้งและเชื่อมต่อกับ AVR/Arduino และรับข้อความแจ้งสดบนไมโครคอนโทรลเลอร์ที่ทำงานอยู่ คุณรู้จักคำสั่งต่างๆ ที่จะดึงข้อมูลรันไทม์จาก MCU หรือตั้งค่าต่างๆ ลงใน MCU ได้ทันที คุณยังได้เห็นวิธีการเพิ่มโค้ดที่คุณกำหนดเองเพื่อสร้างคำสั่งเฉพาะของคุณเองในเชลล์เพื่อปรับแต่งเพิ่มเติมตามความต้องการของคุณเอง คุณยังสามารถใช้ล่ามคำสั่งได้เพื่อให้มันมีแต่คำสั่งที่คุณกำหนดเองเท่านั้น หากมันตรงกับความต้องการของคุณ ฉันหวังว่าคุณจะชอบคำแนะนำนี้และ AVR Shell จะมีประโยชน์สำหรับคุณ ไม่ว่าจะเป็นตัวแปลคำสั่งแบบเรียลไทม์หรือ เป็นกระบวนการเรียนรู้ในการใช้งานของคุณเองเช่นเคยฉันหวังว่าจะได้รับความคิดเห็นหรือข้อเสนอแนะเกี่ยวกับวิธีการปรับปรุงคำแนะนำนี้ขอให้สนุกกับ AVR ของคุณ!

แนะนำ: