Mục lục:
- Bước 1: Những gì bạn cần
- Bước 2: Đăng ký Đọc và Viết
- Bước 3: Đọc và Viết cầu chì
- Bước 4: Các lệnh khác
- Bước 5: Tùy chỉnh Shell
- Bước 6: Tóm tắt
Video: AVRSH: Vỏ thông dịch lệnh cho Arduino / AVR.: 6 bước (có hình ảnh)
2024 Tác giả: John Day | [email protected]. Sửa đổi lần cuối: 2024-01-30 13:37
Bạn đã bao giờ muốn được "đăng nhập" vào bộ vi điều khiển AVR của mình chưa? Bạn đã bao giờ nghĩ rằng sẽ rất tuyệt khi "mèo" vào sổ đăng ký để xem nội dung của nó? Bạn đã luôn muốn một cách để tăng và tắt các hệ thống phụ ngoại vi riêng lẻ của AVR hoặc Arduino của bạn trong * thời gian thực *? Tôi cũng vậy, vì vậy tôi đã viết AVR Shell, một shell giống UNIX. Nó giống UNIX vì nó gợi nhớ đến tài khoản shell mà bạn đã mua và sử dụng để chạy các chương trình xung đột nick irc của mình, cũng như có một hoặc hai lệnh chung. Nó cũng có một hệ thống tệp tương tự như UNIX extfs, sử dụng EEPROM bên ngoài, nhưng đó đã trở thành một dự án đối với chính nó, vì vậy tôi sẽ phát hành riêng mô-đun đó theo một hướng dẫn khác khi nó sẵn sàng sản xuất. Dưới đây là danh sách những việc bạn hiện có thể làm với AVR Shell:
- Đọc tất cả Thanh ghi hướng dữ liệu (DDRn), cổng và chân của bạn trong thời gian thực
- Ghi vào tất cả DDRn, cổng và chân cắm của bạn để bật động cơ, đèn LED hoặc đọc cảm biến trong thời gian thực
- Liệt kê tất cả các đăng ký đã biết trên hệ thống
- Tạo và lưu trữ các giá trị trong các biến do người dùng xác định được sao lưu bởi EEPROM.
- Tạo mật khẩu gốc và xác thực nó (được sử dụng để truy cập telnet)
- Đọc tốc độ đồng hồ CPU đã cấu hình
- Thay đổi tốc độ xung nhịp CPU của bạn bằng cách đặt bộ định mức trước
- Bắt đầu và dừng bộ định thời 16 bit để định thời gian cho nhiều thứ khác nhau
- Bật nguồn và / hoặc tắt nguồn các hệ thống phụ ngoại vi: Bộ chuyển đổi tương tự sang kỹ thuật số (ADC), Giao diện ngoại vi nối tiếp (SPI), Giao diện hai dây (TWI / I2C), UART / USART. Hữu ích khi bạn muốn giảm mức tiêu thụ điện năng của bộ vi điều khiển hoặc để kích hoạt một số chức năng nhất định.
- Được viết bằng C ++ với các đối tượng có thể tái sử dụng.
Tài liệu hướng dẫn này sẽ hướng dẫn cách cài đặt, sử dụng và tùy chỉnh avrsh.
Bước 1: Những gì bạn cần
Hướng dẫn này không yêu cầu nhiều ngoại trừ việc bạn:
- Có Arduino hoặc ATmega328P. Các AVR khác có thể hoạt động, nhưng bạn có thể cần phải sửa đổi mã để liệt kê bất kỳ thanh ghi nào là duy nhất cho MCU của bạn. Các tên chỉ cần khớp với những gì được liệt kê trong tệp tiêu đề duy nhất cho MCU của bạn. Nhiều tên đăng ký giống nhau giữa các AVR, vì vậy số dặm của bạn có thể thay đổi khi chuyển.
- Có một cách để kết nối với USART nối tiếp của Arduino / AVR của bạn. Hệ thống đã được thử nghiệm rộng rãi nhất với AVR Terminal, một ứng dụng Windows tạo kết nối nối tiếp qua cổng USB hoặc COM của bạn. Hoạt động với Arduinos bằng kết nối USB và bất kỳ AVR nào bằng USB-BUB từ Moderndevice.com. Các tùy chọn thiết bị đầu cuối khác bao gồm: Putty, minicom (Linux và FreeBSD), màn hình (Linux / FreeBSD), Hyperterminal, Teraterm. Tôi đã tìm thấy putty và teraterm gửi một số rác khi kết nối nên lệnh đầu tiên của bạn có thể bị cắt xén.
- Cài đặt và chạy chương trình cơ sở AVR Shell mà bạn có thể tải xuống từ các trang này hoặc luôn tải phiên bản mới nhất tại BattleDroids.net.
Để cài đặt AVR Terminal, chỉ cần giải nén và chạy nó. Để cài đặt chương trình cơ sở AVR Shell, hãy tải xuống và tải trực tiếp tệp hex lên và kết nối thiết bị đầu cuối nối tiếp của bạn ở 9600 baud hoặc tự biên dịch bằng "make" và sau đó "tạo chương trình" để tải lên hex. Lưu ý, bạn có thể cần thay đổi cài đặt AVRDUDE để phản ánh cổng COM của bạn. Lưu ý: Thuộc tính PROGMEM bị hỏng trong quá trình triển khai AVR GCC hiện tại cho C ++ và đây là một lỗi đã biết. Nếu bạn biên dịch nó, bạn sẽ nhận được nhiều thông báo cảnh báo nói rằng "cảnh báo: chỉ có thể đặt các biến khởi tạo vào vùng bộ nhớ chương trình." Ngoài việc gây khó chịu khi xem, cảnh báo này là vô hại. Vì C ++ trên nền tảng nhúng không nằm trong danh sách ưu tiên của AVR GCC, nên vẫn chưa biết khi nào điều này sẽ được khắc phục. Nếu bạn kiểm tra mã, bạn sẽ thấy nơi tôi đã thực hiện giải pháp thay thế để giảm cảnh báo này bằng cách triển khai các câu lệnh thuộc tính của riêng tôi. Tải xuống và cài đặt bất kỳ thứ gì bạn có thể cần để sau đó lật trang và nhận crackin '.
Bước 2: Đăng ký Đọc và Viết
AVR Shell được viết chủ yếu để truy cập một số cảm biến mà tôi đã kết nối với AVR của mình. Nó bắt đầu với một đèn LED đơn giản sau đó chuyển sang cảm biến ánh sáng, cảm biến nhiệt độ và cuối cùng là hai đầu dò siêu âm. avrsh có thể thiết lập các thành phần kỹ thuật số của các cảm biến này bằng cách ghi vào các thanh ghi điều khiển chúng. Thao tác với các thanh ghi AVR trong khi chạy Để có được danh sách tất cả các thanh ghi đã biết trên Arduino của bạn, hãy nhập:
in sổ đăng ký và bạn sẽ nhận được một bản in như thế này
Tôi biết về các đăng ký sau:
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 ASSR TWBR TWR1H OCR1AL OCR1AH OCR1BL OCR1BH TCCR2A TCCR2B TCNT2 OCR2A OCR2B ASSR TWBR TWR0 TW0 U U TW0 TWR U U TW0 TW0 Để xem cách các bit riêng lẻ được đặt trong bất kỳ thanh ghi nào, hãy sử dụng lệnh cat hoặc echo
con mèo% GPIOR0 Ở đây tôi đang yêu cầu trình thông dịch lệnh hiển thị hoặc lặp lại nội dung của Thanh ghi I / O Mục đích Chung # 0. Lưu ý dấu phần trăm (%) ở phía trước tên đăng ký. Bạn cần điều này để chỉ ra cho shell rằng đây là một từ khóa dành riêng để xác định một thanh ghi. Đầu ra điển hình từ lệnh echo trông như thế này
GPIOR0 (0x0) được đặt thành [00000000] Đầu ra hiển thị tên của thanh ghi, giá trị thập lục phân được tìm thấy trong thanh ghi và biểu diễn nhị phân của thanh ghi (hiển thị mỗi bit là 1 hoặc 0). Để đặt một bit cụ thể trong bất kỳ thanh ghi nào, hãy sử dụng toán tử "chỉ mục của" . Ví dụ: giả sử tôi muốn bit thứ 3 thành 1
% GPIOR0 [3] = 1 và shell sẽ cung cấp cho bạn một phản hồi cho biết đó là hành động và kết quả
GPIOR0 (0x0) được đặt thành [00000000] (0x8) được đặt thành [00001000] Đừng quên dấu phần trăm để cho biết trình bao bạn đang làm việc với một thanh ghi. Cũng lưu ý rằng bằng cách đặt bit thứ 3, đó là 4 bit vì AVR của chúng tôi sử dụng chỉ mục dựa trên số không. Nói cách khác, đếm đến bit thứ 3 bạn đếm 0, 1, 2, 3, đó là vị trí thứ 4, nhưng là bit thứ 3. Bạn có thể xóa một chút theo cách tương tự bằng cách đặt một bit thành 0. Bằng cách thiết lập các bit như thế này, bạn có thể thay đổi hoạt động của AVR một cách nhanh chóng. Ví dụ: bằng cách thay đổi giá trị khớp hẹn giờ CTC được tìm thấy trong OCR1A. Nó cũng cho phép bạn xem qua các cài đặt cụ thể mà bạn sẽ phải lập trình kiểm tra mã của mình, chẳng hạn như giá trị UBBR cho tốc độ truyền của bạn. Làm việc với DDRn, PORTn và PINn Các chân I / O cũng được gán cho các thanh ghi và có thể được đặt theo cách giống hệt nhau, nhưng một cú pháp đặc biệt đã được tạo ra để hoạt động với các loại thanh ghi này. Trong mã, có một quy trình bình thường để bật đèn LED hoặc thiết bị khác yêu cầu mức kỹ thuật số cao hoặc thấp. Nó yêu cầu thiết lập thanh ghi hướng dữ liệu để chỉ ra chân là cho đầu ra, và sau đó ghi 1 hoặc 0 vào bit cụ thể trong đúng cổng. Giả sử chúng tôi có một đèn LED được kết nối với chân kỹ thuật số 13 (PB5) và chúng tôi muốn bật nó lên, đây là cách thực hiện điều đó trong khi AVR của bạn đang chạy
đặt chân pb5 đầu ra ghim pb5 cao Đầu ra, ngoài việc có thể nhìn thấy đèn LED của bạn bật sáng, sẽ trông như thế này
root @ ATmega328p> đặt đầu ra chân pb5 Đặt pb5 cho đầu ra @ ATmega328p> ghi mức logic cao pb5 vào chân pb5 "Root @ ATmega328p>" là lời nhắc của shell cho biết nó đã sẵn sàng chấp nhận các lệnh từ bạn. Để tắt đèn LED, bạn chỉ cần ghi mức thấp vào chân cắm. Nếu bạn muốn đọc đầu vào kỹ thuật số từ một chân, hãy sử dụng lệnh đọc. Sử dụng ví dụ trên của chúng tôi
root @ ATmega328p> đọc pin pb5Pin: pb5 là CAO Ngoài ra, chỉ cần lặp lại thanh ghi pin điều khiển cổng ghim đó. Ví dụ: nếu chúng tôi có công tắc nhúng được kết nối với chân số 7 và 8 (PD7 và PD8), bạn có thể gửi lệnh
echo% PIND và shell sau đó sẽ hiển thị nội dung của thanh ghi đó, hiển thị cho bạn tất cả các trạng thái đầu vào / đầu ra của các thiết bị được kết nối và trạng thái của công tắc đang bật hay tắt.
Bước 3: Đọc và Viết cầu chì
Cầu chì là loại thanh ghi đặc biệt. Chúng kiểm soát mọi thứ từ tốc độ xung nhịp của bộ vi điều khiển của bạn đến các phương pháp lập trình có sẵn để chống ghi EEPROM. Đôi khi bạn sẽ cần thay đổi các cài đặt này, đặc biệt nếu bạn đang tạo một hệ thống AVR độc lập. Tôi không chắc bạn nên thay đổi cài đặt cầu chì của mình trên Arduino. Hãy cẩn thận với cầu chì của bạn; Bạn có thể tự khóa mình nếu bạn đặt chúng không chính xác. Ở đây, tôi sẽ chỉ cho bạn cách đọc lại các cầu chì của bạn tại thời điểm chạy để xem MCU của bạn đã thực sự đặt chúng như thế nào. Lưu ý rằng đây không phải là cài đặt thời gian biên dịch mà bạn nhận được từ các định nghĩa trong đó mà là các hợp nhất thực tế khi MCU đọc chúng tại thời gian chạy. Từ Bảng 27-9 trong biểu dữ liệu ATmega328P (sổ dữ liệu, giống như nó), các bit của Fuse Low Byte như sau:
CKDIV8 CKOUT SUT1 SUT0 CKSEL3 CKSEL2 CKSEL1 CKSEL0Một điều thú vị cần lưu ý là với cầu chì, 0 có nghĩa là được lập trình và 1 có nghĩa là bit cụ thể đó chưa được lập trình. Hơi phản trực giác, nhưng một khi bạn biết nó, bạn sẽ biết nó.
- CKDIV8 đặt xung nhịp CPU của bạn chia cho 8. ATmega328P xuất phát từ nhà máy được lập trình để sử dụng bộ dao động bên trong của nó ở 8MHz với CKDIV8 được lập trình (tức là được đặt thành 0) cung cấp cho bạn F_CPU hoặc tần số CPU cuối cùng là 1MHz. Trên Arduino, điều này được thay đổi vì chúng được cấu hình để sử dụng bộ dao động bên ngoài ở tần số 16MHz.
- CKOUT khi được lập trình sẽ xuất xung nhịp CPU của bạn trên PB0, là chân số 8 trên Arduinos.
- SUT [1..0] chỉ định thời gian khởi động cho AVR của bạn.
- CKSEL [3..0] đặt nguồn xung nhịp, chẳng hạn như bộ dao động RC bên trong, bộ dao động bên ngoài, v.v.
Khi bạn đọc các cầu chì của mình, nó sẽ được trả lại cho bạn ở dạng thập lục phân. Đây là định dạng mà bạn cần nếu bạn muốn viết cầu chì qua avrdude. Trên arduino của tôi, đây là những gì tôi nhận được khi đọc byte cầu chì thấp hơn:
root @ ATmega328p> đọc lfuseLower Fuse: 0xffVì vậy, tất cả các bit được đặt thành 1. Tôi đã thực hiện quy trình tương tự trên bản sao Arduino và nhận được cùng một giá trị. Kiểm tra một trong các hệ thống AVR độc lập của tôi, tôi nhận được 0xDA, đây là giá trị tôi đã đặt trước khi định cấu hình chip. Quy trình tương tự được sử dụng để kiểm tra các cầu chì High Fuse Byte, Extended Fuse Byte và Lock. Các byte cầu chì hiệu chuẩn và chữ ký đã bị vô hiệu hóa trong mã bằng chỉ thị tiền xử lý #if 0, bạn có thể thay đổi chỉ thị này nếu cảm thấy lộn xộn.
Bước 4: Các lệnh khác
Có một số lệnh khác mà trình thông dịch lệnh mặc định hiểu mà bạn có thể thấy hữu ích. Bạn có thể xem tất cả các lệnh được triển khai và phát hành trong tương lai bằng cách đưa ra trợ giúp hoặc menu tại dấu nhắc. Tôi sẽ nhanh chóng trình bày chúng ở đây vì chúng chủ yếu là tự giải thích. Cài đặt tần số đồng hồ CPU Bạn có thể tìm hiểu phần sụn của mình đã được cấu hình để sử dụng làm cài đặt đồng hồ CPU bằng lệnh fcpu:
root @ ATmega328p> fcpuCPU Tần suất: 16000000Đó là 16 triệu, hay 16 triệu herz, thường được gọi là 16 MHz. Bạn có thể thay đổi điều này một cách nhanh chóng, vì bất kỳ lý do gì, bằng lệnh đồng hồ. Lệnh này nhận một đối số: bộ đếm trước để sử dụng khi chia tốc độ đồng hồ của bạn. Lệnh đồng hồ hiểu các giá trị bộ định hạng trước này:
- ckdiv2
- ckdiv4
- ckdiv8
- ckdiv16
- ckdiv32
- ckdiv64
- ckdiv128
- ckdiv256
Sử dụng lệnh:
đồng hồ ckdiv2 khi tốc độ cpu của bạn là 16MHz sẽ dẫn đến tốc độ đồng hồ của bạn được thay đổi thành 8MHz. Sử dụng bộ định mức trước ckdiv64 với tốc độ đồng hồ ban đầu là 16MHz sẽ dẫn đến tốc độ đồng hồ cuối cùng là 250 KHz. Tại sao bạn muốn làm cho MCU của mình chậm hơn? Vâng, đối với một, tốc độ đồng hồ thấp hơn sẽ tiêu thụ ít năng lượng hơn và nếu MCU của bạn đang cạn kiệt pin trong hộp dự án, bạn có thể không cần nó chạy ở tốc độ cao nhất và do đó, có thể giảm tốc độ và giảm mức tiêu thụ điện năng, tăng tuổi thọ của pin. Ngoài ra, nếu bạn đang sử dụng đồng hồ cho bất kỳ loại vấn đề thời gian nào với MCU khác, chẳng hạn như triển khai UART phần mềm hoặc một số thứ tương tự, bạn có thể muốn đặt nó thành một giá trị cụ thể để dễ dàng có được tốc độ truyền đồng đều với tỷ lệ lỗi thấp hơn. Bật nguồn và tắt nguồn cho các hệ thống phụ ngoại vi Cũng lưu ý với việc giảm mức tiêu thụ điện năng đã đề cập trước đó, bạn có thể muốn giảm thêm điện năng bằng cách tắt một số thiết bị ngoại vi trên bo mạch mà bạn không sử dụng. Trình thông dịch lệnh và trình bao hiện có thể bật nguồn và tắt nguồn các thiết bị ngoại vi sau:
- Bộ chuyển đổi Analog-to-Digital (ADC). Thiết bị ngoại vi này được sử dụng khi bạn có cảm biến tương tự cung cấp dữ liệu (như nhiệt độ, ánh sáng, gia tốc, v.v.) và cần chuyển đổi nó thành giá trị kỹ thuật số.
- Giao diện ngoại vi nối tiếp (SPI). Bus SPI được sử dụng để giao tiếp với các thiết bị hỗ trợ SPI khác, như bộ nhớ ngoài, trình điều khiển LED, ADC bên ngoài, v.v. Các bộ phận của SPI được sử dụng cho lập trình ISP, hoặc ít nhất là các chân, vì vậy hãy cẩn thận khi tắt thiết bị này nếu bạn đang lập trình qua ISP.
- Giao diện hai dây. Một số thiết bị bên ngoài sử dụng bus I2C để giao tiếp, mặc dù chúng đang nhanh chóng được thay thế bằng các thiết bị hỗ trợ SPI vì SPI có thông lượng lớn hơn.
- USART. Đây là giao diện nối tiếp của bạn. Bạn có thể không muốn tắt tính năng này nếu bạn được kết nối với AVR thông qua kết nối nối tiếp! Tuy nhiên, tôi đã thêm điều này vào đây như một khung để chuyển sang các thiết bị có nhiều USART như ATmega162 hoặc ATmega644P.
- tất cả các. Đối số này đối với lệnh powerup hoặc powerdown sẽ bật tất cả các thiết bị ngoại vi được đề cập hoặc tắt tất cả chúng bằng một lệnh. Một lần nữa, hãy sử dụng lệnh này một cách khôn ngoan.
root @ ATmega328p> powerdown twiPowerdown của twi complete.root@ATmega328p> powerup twiPowerup của twi hoàn thành.
Bộ hẹn giờ Khởi động và Dừng Vỏ có bộ hẹn giờ 16 bit tích hợp sẵn để sử dụng. Bạn bắt đầu hẹn giờ bằng lệnh hẹn giờ:
hẹn giờ bắt đầuvà dừng bộ đếm thời gian với đối số dừng
hẹn giờ dừngBộ hẹn giờ này sẽ không xung đột với bộ hẹn giờ USART nội bộ. Xem mã để biết chi tiết triển khai của bộ hẹn giờ USART, nếu loại chi tiết đẫm máu đó khiến bạn quan tâm
root @ ATmega328p> hẹn giờ khởi động Xác thực Vỏ có thể lưu mật khẩu 8 ký tự vào EEPROM. Cơ chế mật khẩu này được tạo ra để hỗ trợ khả năng đăng nhập telnet, nhưng có thể được mở rộng để bảo vệ những thứ khác. Ví dụ: bạn có thể yêu cầu một số lệnh nhất định, như thay đổi giá trị thanh ghi, thông qua cơ chế xác thực.
root @ ATmega328p> passwd blah đã ghi mật khẩu gốc vào EEPROMỦy quyền chống lại anh ta mật khẩu (hoặc yêu cầu ủy quyền theo chương trình thông qua mã) bằng lệnh auth. Lưu ý rằng nếu bạn cố gắng thay đổi mật khẩu gốc và đã có mật khẩu gốc được đặt, bạn phải tự ủy quyền cho mình so với mật khẩu cũ trước khi được phép thay đổi mật khẩu mới
root @ ATmega328p> passwd flashy Trước tiên, bạn phải ủy quyền cho chính mình. Tất nhiên, bạn sẽ cần tải tệp avrsh.eep nếu bạn xóa phần sụn để khôi phục các giá trị và biến cũ của bạn. Makefile sẽ tạo tệp EEPROM cho bạn. Các biến Trình bao hiểu khái niệm về các biến do người dùng định nghĩa. Mã giới hạn điều này là 20, nhưng bạn có thể thay đổi điều đó nếu bạn muốn bằng cách thay đổi định nghĩa MAX_VARIABLES trong script.h. Bạn có thể lưu bất kỳ giá trị 16 bit nào (tức là bất kỳ số nào lên đến 65, 536) vào một biến sẽ được gọi lại sau này. Cú pháp tương tự như các thanh ghi ngoại trừ một dấu đô la ($) được sử dụng để biểu thị các biến cho trình bao. Liệt kê tất cả các biến của bạn bằng lệnh biến in
biến print Các biến do người dùng định nghĩa: Tên chỉ mục -> Giá trị (01): $ MIỄN PHÍ $ -> 0 (02): $ MIỄN PHÍ $ -> 0 (03): $ MIỄN PHÍ $ -> 0 (04): $ MIỄN PHÍ $ -> 0 (05): $ MIỄN PHÍ $ -> 0 (06): $ MIỄN PHÍ $ -> 0 (07): $ MIỄN PHÍ $ -> 0 (08): $ MIỄN PHÍ $ -> 0 (09): $ MIỄN PHÍ $ -> 0 (10): $ MIỄN PHÍ $ -> 0 (11): $ MIỄN PHÍ $ -> 0 (12): $ MIỄN PHÍ $ -> 0 (13): $ MIỄN PHÍ $ -> 0 (14): $ MIỄN PHÍ $ -> 0 (15): $ MIỄN PHÍ $ -> 0 (16): $ MIỄN PHÍ $ -> 0 (17): $ MIỄN PHÍ $ -> 0 (18): $ MIỄN PHÍ $ -> 0 (19): $ MIỄN PHÍ $ -> 0 (20): $ MIỄN PHÍ $ -> 0Hoàn thành. Đặt một biến
$ newvar = 25 $ timeout = 23245Nhận giá trị của một biến nhất định
root @ ATmega328p> echo $ newvar $ newvar 25Bạn có thể xem tất cả các biến mà bạn hiện đã khởi tạo bằng lệnh in mà bạn đã biết
Các biến do người dùng định nghĩa: Tên chỉ mục -> Giá trị (01): newvar -> 25 (02): thời gian chờ -> 23245 (03): $ MIỄN PHÍ $ -> 0 (04): $ MIỄN PHÍ $ -> 0 (05): $ MIỄN PHÍ $ -> 0 (06): $ MIỄN PHÍ $ -> 0 (07): $ MIỄN PHÍ $ -> 0 (08): $ MIỄN PHÍ $ -> 0 (09): $ MIỄN PHÍ $ -> 0 (10): $ MIỄN PHÍ $ -> 0 (11): $ MIỄN PHÍ $ -> 0 (12): $ MIỄN PHÍ $ -> 0 (13): $ MIỄN PHÍ $ -> 0 (14): $ MIỄN PHÍ $ -> 0 (15): $ MIỄN PHÍ $ -> 0 (16): $ MIỄN PHÍ $ -> 0 (17): $ MIỄN PHÍ $ -> 0 (18): $ MIỄN PHÍ $ -> 0 (19): $ MIỄN PHÍ $ -> 0 (20): $ MIỄN PHÍ $ -> 0Hoàn thành. Tên $ FREE $ chỉ cho biết rằng vị trí biến đó là miễn phí và chưa được gán tên biến.
Bước 5: Tùy chỉnh Shell
Bạn có thể tự do hack mã và tùy chỉnh nó theo nhu cầu của riêng bạn, nếu bạn muốn. Nếu tôi biết rằng tôi sẽ phát hành mã này, tôi đã tạo một lớp thông dịch lệnh và cấu trúc lệnh riêng biệt và chỉ cần lặp lại thông qua việc gọi một con trỏ hàm. Nó sẽ làm giảm số lượng mã, nhưng vì nó đứng shell phân tích cú pháp dòng lệnh và gọi phương thức shell thích hợp. Để thêm vào các lệnh tùy chỉnh của riêng bạn, hãy làm như sau: 1. Thêm lệnh của bạn vào danh sách phân tích cú pháp. phân tích cú pháp dòng lệnh và cung cấp cho bạn lệnh và bất kỳ đối số nào riêng biệt. Các đối số được truyền dưới dạng con trỏ tới con trỏ hoặc một mảng con trỏ, tuy nhiên bạn muốn làm việc với chúng. Điều này được tìm thấy trong shell.cpp. Mở shell.cpp và tìm phương thức ExecCmd của lớp AVRShell. Bạn có thể muốn thêm lệnh vào bộ nhớ chương trình. Nếu bạn làm vậy, hãy thêm lệnh trong progmem.h và progmem.cpp. Bạn có thể thêm lệnh vào bộ nhớ chương trình trực tiếp bằng cách sử dụng macro PSTR (), nhưng bạn sẽ tạo ra một cảnh báo khác thuộc loại được đề cập trước đó. Một lần nữa, đây là một lỗi đã biết khi làm việc với C ++, nhưng bạn có thể khắc phục lỗi này bằng cách thêm lệnh trực tiếp vào tệp progmem. *, Như tôi đã làm. Nếu bạn không ngại thêm vào việc sử dụng SRAM của mình, bạn có thể thêm lệnh như tôi đã minh họa bằng lệnh "đồng hồ". Giả sử bạn muốn thêm một lệnh mới có tên "newcmd". Truy cập AVRShell:: ExecCmd và tìm một nơi thuận tiện để chèn mã sau:
else if (! strcmp (c, "newcmd")) cmdNewCmd (args);Thao tác này sẽ thêm lệnh của bạn và gọi phương thức cmdNewCmd mà bạn sẽ viết trong bước tiếp theo. 2. Viết mã lệnh tùy chỉnh của bạn Trong cùng một tệp, hãy thêm mã lệnh tùy chỉnh của bạn. Đây là định nghĩa phương pháp. Bạn vẫn muốn thêm khai báo vào shell.h. Chỉ cần nối nó vào các lệnh khác. Trong ví dụ trước, mã có thể trông giống như thế này
voidAVRShell:: cmdNewCmd (char ** args) {sprintf_P (buff, PSTR ("Lệnh của bạn là% s / r / n", args [0]); WriteRAM (buff);}Có một số điều ở đây. Đầu tiên, "buff" là bộ đệm mảng 40 ký tự được cung cấp trong mã để bạn sử dụng. Chúng tôi sử dụng phiên bản bộ nhớ chương trình của sprintf vì chúng tôi đang chuyển nó một PSTR. Bạn có thể sử dụng phiên bản thông thường nếu muốn, nhưng hãy đảm bảo rằng bạn không vượt qua định dạng trong PSTR. Ngoài ra, các đối số nằm trong mảng args. Nếu bạn đã nhập "newcmd arg1 arg2", bạn có thể nhận được các đối số này với các chỉ số dưới args [0] và args [1]. Bạn có thể chuyển tối đa MAX_ARGS đối số, như được xác định trong mã. Hãy thoải mái thay đổi giá trị đó khi bạn biên dịch lại nếu bạn cần nhiều đối số hơn được truyền cùng một lúc. WriteLine và WriteRAM là các hàm toàn cục trả về các phương thức cùng tên của UART. Đối số thứ 2 cho hàm này là ngầm định. Nếu bạn không vượt qua được gì, một dấu nhắc lệnh sẽ được viết sau đó. Nếu yo chuyển giá trị 0 làm đối số thứ 2, thì lời nhắc sẽ không được ghi. Điều này rất hữu ích khi bạn muốn viết một số chuỗi riêng biệt để xuất trước khi dấu nhắc lệnh được trả lại cho người dùng. 3. Yêu cầu trình bao thực thi mã lệnh Bạn đã yêu cầu trình thực thi trình bao thực thi phương thức cmdNewCmd khi bạn thiết lập lệnh mới, nhưng hãy thêm nó vào tệp shell.h để đối tượng shell hiểu nó. Chỉ cần thêm nó vào bên dưới lệnh cuối cùng hoặc trước lệnh đầu tiên hoặc bất kỳ đâu trong đó. Biên dịch lại và tải chương trình cơ sở lên Arduino của bạn và lệnh mới của bạn có sẵn từ trình bao tại dấu nhắc.
Bước 6: Tóm tắt
Bạn nên biết cách cài đặt và kết nối với AVR / Arduino của mình và nhận lời nhắc trực tiếp trên bộ vi điều khiển đang chạy của bạn. Bạn biết một số lệnh sẽ kéo dữ liệu thời gian chạy từ MCU hoặc đặt các giá trị vào MCU một cách nhanh chóng. Bạn cũng đã được hướng dẫn cách thêm mã tùy chỉnh của riêng bạn để tạo các lệnh duy nhất của riêng bạn vào trình bao để tùy chỉnh thêm nó cho nhu cầu của riêng bạn. Bạn thậm chí có thể rút lại trình thông dịch lệnh để nó chỉ chứa các lệnh tùy chỉnh của bạn, nếu điều đó phù hợp với nhu cầu của bạn. như một quá trình học hỏi trong việc thực hiện của riêng bạn. Như mọi khi, tôi mong nhận được bất kỳ nhận xét hoặc đề xuất nào về cách cải tiến phần hướng dẫn này! Chúc bạn vui vẻ với AVR của bạn!
Đề xuất:
Công cụ kiểm dịch điện thoại cho chủ nghĩa tối giản kỹ thuật số!: 5 bước (có hình ảnh)
Phone Quarantimer for Digital Minimalism !: Đã quá nhiều lần tôi lấy điện thoại để kiểm tra thời tiết và cuối cùng lại rơi vào vòng xoáy truyền thông xã hội. Tôi cần một giá đỡ điện thoại.:) Đây là một giá đỡ điện thoại sẽ sáng lên khi bạn đặt điện thoại xuống. Ngoài ra, nó theo dõi thời gian bạn để nó
Máy quét thẻ cho máy giao dịch thẻ: 13 bước (có hình ảnh)
Máy quét thẻ cho máy giao dịch thẻ: Máy quét thẻ cho máy thẻ giao dịch Nhưng tóm lại, tôi và các con tôi đã tích lũy được một lượng lớn Thẻ giao dịch b
Hệ thống lái thông minh cho ô tô robot sử dụng động cơ bước của ổ đĩa mềm / CD cũ: 8 bước (có hình ảnh)
Hệ thống lái thông minh cho ô tô rô bốt sử dụng động cơ bước của ổ đĩa mềm / CD cũ: Hệ thống lái thông minh cho ô tô rô bốt Bạn đang lo lắng về việc tạo ra một hệ thống lái tốt cho ô tô rô bốt của mình? Đây là một giải pháp tuyệt vời chỉ sử dụng ổ đĩa mềm / CD / DVD cũ của bạn. hãy xem nó ra và có ý tưởng về nó
Tiêm chủng hay không? Dự án Quan sát khả năng miễn dịch của đàn gia súc thông qua mô phỏng dịch bệnh: 15 bước
Tiêm chủng hay không? Dự án Quan sát khả năng miễn dịch của đàn thông qua mô phỏng dịch bệnh: Tổng quan về dự án: Dự án của chúng tôi khám phá khả năng miễn dịch của đàn và hy vọng khuyến khích mọi người tiêm phòng để giảm tỷ lệ nhiễm bệnh trong cộng đồng của chúng tôi. Chương trình của chúng tôi mô phỏng cách một căn bệnh lây nhiễm sang một quần thể với các tỷ lệ tiêm chủng khác nhau
Tập lệnh giám sát dịch vụ cho máy chủ Linux: 4 bước
Service Monitor Script cho máy chủ Linux: Có một hệ thống ổn định, luôn chạy, ngay cả khi bạn đang sử dụng Linux có thể là một nhiệm vụ khó khăn. Đây có thể là một điều tồi tệ nếu bạn