Mục lục:

Hướng dẫn lắp ráp AVR 1: 5 bước
Hướng dẫn lắp ráp AVR 1: 5 bước

Video: Hướng dẫn lắp ráp AVR 1: 5 bước

Video: Hướng dẫn lắp ráp AVR 1: 5 bước
Video: Cách lắp bo avr ổn định điện áp máy phát an toàn cho thiết bị không cháy - lh 0982871662 2024, Tháng mười một
Anonim
Hướng dẫn lắp ráp AVR 1
Hướng dẫn lắp ráp AVR 1

Tôi đã quyết định viết một loạt các hướng dẫn về cách viết các chương trình hợp ngữ cho Atmega328p, vi điều khiển được sử dụng trong Arduino. Nếu mọi người vẫn quan tâm, tôi sẽ tiếp tục phát hành một tuần hoặc lâu hơn cho đến khi tôi hết thời gian rảnh, nếu không mọi người sẽ ngừng đọc chúng.

Tôi đang chạy Arch linux và tôi đang làm việc trên atmega328p-pu được thiết lập trên breadboard. Bạn có thể làm theo cách tương tự như tôi hoặc bạn có thể chỉ cần cắm arduino vào máy tính của mình và làm việc trên vi điều khiển theo cách đó.

Chúng tôi sẽ viết các chương trình cho 328p giống như chương trình có trong hầu hết các arduino nhưng bạn cần lưu ý rằng các chương trình và kỹ thuật tương tự này cũng sẽ hoạt động với bất kỳ bộ vi điều khiển Atmel nào và sau này (nếu có hứng thú), chúng tôi sẽ làm việc với một số những cái khác cũng vậy. Bạn có thể tìm thấy chi tiết của bộ vi điều khiển trong các tờ dữ liệu Atmel và Hướng dẫn sử dụng Bộ hướng dẫn. Tôi đang đính kèm chúng với hướng dẫn này.

Đây là những gì bạn sẽ cần:

1. Một breadboard

2. Arduino hoặc chỉ vi điều khiển

3. Một máy tính chạy Linux

4. Trình hợp dịch avra sử dụng git: git clone https://github.com/Ro5bert/avra.git hoặc nếu bạn đang sử dụng ubuntu hoặc hệ thống dựa trên debian, chỉ cần nhập "sudo apt install avra" và bạn sẽ nhận được cả trình hợp dịch avr và avrdude. TUY NHIÊN, nếu bạn nhận được phiên bản mới nhất bằng github thì bạn cũng sẽ nhận được tất cả các tệp bao gồm cần thiết, nói cách khác, nó đã có các tệp m328Pdef.inc và tn85def.inc.

5. avrdude

Bạn có thể tìm thấy toàn bộ hướng dẫn về trình biên dịch AVR của tôi tại đây:

Bước 1: Xây dựng Ban kiểm tra

Xây dựng Ban kiểm tra
Xây dựng Ban kiểm tra

Bạn có thể chỉ cần sử dụng arduino của mình và làm mọi thứ trong các hướng dẫn này nếu bạn muốn. Tuy nhiên, vì chúng ta đang nói về mã hóa bằng hợp ngữ, triết lý của chúng ta vốn dĩ là loại bỏ tất cả các mối nguy hiểm và tương tác trực tiếp với chính bộ vi điều khiển. Vì vậy, bạn không nghĩ rằng nó sẽ vui hơn nếu làm theo cách đó?

Đối với những người bạn đồng ý, bạn có thể kéo vi điều khiển ra khỏi arduino của mình và sau đó bắt đầu bằng cách xây dựng "Breadboard Arduino" bằng cách làm theo hướng dẫn tại đây:

Trong hình, tôi cho thấy thiết lập của mình bao gồm hai Atmega328p độc lập trên một breadboard lớn (tôi muốn có thể giữ hướng dẫn trước có dây và được tải trên một vi điều khiển trong khi làm việc trên vi điều khiển tiếp theo). Tôi có nguồn điện được thiết lập để thanh ray trên cùng là 9V và tất cả các nguồn khác là 5V từ bộ điều chỉnh điện áp. Tôi cũng sử dụng một bảng đột phá FT232R để lập trình các chip. Tôi đã mua chúng và tự đặt các bộ nạp khởi động vào chúng, nhưng nếu bạn chỉ rút một bộ ra khỏi Arduino thì đã ổn rồi.

Lưu ý rằng nếu bạn đang thử điều này với ATtiny85 thì bạn có thể tải Sparkfun Tiny Programmer tại đây: https://www.sparkfun.com/products/11801# và sau đó chỉ cần cắm nó vào cổng USB trên máy tính của bạn. Trước tiên, bạn sẽ cần cài đặt bộ nạp khởi động trên Attiny85 và cách dễ nhất là sử dụng Arduino IDE. Tuy nhiên, bạn sẽ cần nhấp vào tệp và tùy chọn, sau đó thêm URL bảng mới này: https://raw.githubusercontent.com/damellis/attiny/ide-1.6.x-boards-manager/package_damellis_attiny_index.json sẽ cho phép bạn cài đặt bộ nạp khởi động (nếu ATtiny85 của bạn chưa có.)

Bước 2: Cài đặt Assembler và Avrdude

Bây giờ bạn có thể tải xuống và cài đặt trình hợp dịch và avrdude từ các liên kết được cung cấp trong bước đầu tiên của hướng dẫn này. Có khả năng là nếu bạn đã làm việc với Arduino thì bạn đã cài đặt avrdude.

Sau khi bạn đã cài đặt avra, bạn sẽ nhận thấy rằng có một thư mục con đi kèm với nó được gọi là "nguồn" và bên trong thư mục đó là một loạt các tệp bao gồm. Đây là tất cả các bộ vi điều khiển mà bạn có thể lập trình với avra. Bạn sẽ nhận thấy ngay rằng không có tệp nào cho 328p mà chúng tôi đang sử dụng ở đây. Tôi đã đính kèm một cái. Tệp phải được gọi là m328Pdef.inc và bạn nên đặt bên trong thư mục include hoặc bất kỳ nơi nào khác mà bạn thích. Chúng tôi sẽ đưa nó vào các chương trình hợp ngữ của chúng tôi. Tất cả điều này là cung cấp cho từng thanh ghi trong tên bộ vi điều khiển từ bảng dữ liệu để chúng ta không phải sử dụng tên hệ thập phân của chúng. Tệp bao gồm ở trên chứa "chỉ thị pragma" vì nó được thiết kế cho lập trình C và C ++. Nếu bạn cảm thấy mệt mỏi khi thấy trình hợp dịch phun ra các khiếu nại "bỏ qua chỉ thị pragma", chỉ cần truy cập tệp và xóa hoặc nhận xét tất cả các dòng bắt đầu bằng #pragma

Được rồi, bây giờ bạn đã sẵn sàng vi điều khiển, trình hợp dịch sẵn sàng và lập trình viên của bạn đã sẵn sàng, chúng ta có thể viết chương trình đầu tiên của mình.

Lưu ý: Nếu bạn đang sử dụng ATtiny85 thay vì ATmega328P thì bạn cần một tệp bao gồm khác có tên tn85def.inc. Tôi cũng sẽ đính kèm nó (lưu ý rằng tôi phải gọi nó là tn85def.inc.txt để Guiductables cho phép tôi tải nó lên.) TUY NHIÊN, nếu bạn có trình hợp dịch avra từ github thì bạn đã có cả hai tệp này với nó. Vì vậy, tôi khuyên bạn nên lấy và tự biên dịch: git clone

Bước 3: Xin chào Thế giới

Mục tiêu của hướng dẫn đầu tiên này là xây dựng chương trình đầu tiên tiêu chuẩn mà người ta viết khi học bất kỳ ngôn ngữ mới nào hoặc khám phá bất kỳ nền tảng điện tử mới nào. "Chào thế giới!." Trong trường hợp của chúng tôi, chúng tôi chỉ muốn viết một chương trình hợp ngữ, lắp ráp nó và tải nó lên bộ vi điều khiển của chúng tôi. Chương trình sẽ làm cho đèn LED bật sáng. Làm cho đèn LED "nhấp nháy" như chúng làm cho chương trình Arduino hello world bình thường thực sự là một chương trình phức tạp hơn nhiều trong hợp ngữ và vì vậy chúng tôi sẽ không làm điều đó. Chúng ta sẽ viết đoạn mã "trần trụi" đơn giản nhất với những sợi lông tơ không cần thiết tối thiểu.

Đầu tiên kết nối một đèn LED từ PB5 (xem sơ đồ sơ đồ chân) còn được gọi là Digital Out 13 trên arduino, với điện trở 220 ohm, sau đó đến GND. I E.

PB5 - LED - R (220 ohm) - GND

Bây giờ để viết chương trình. Mở trình soạn thảo văn bản yêu thích của bạn và tạo một tệp có tên "hello.asm"

; xin chào.asm

; bật đèn LED được kết nối với PB5 (đầu ra kỹ thuật số 13). bao gồm "./m328Pdef.inc" ldi r16, 0b00100000 ra DDRB, r16 ra PortB, r16 Bắt đầu: rjmp Bắt đầu

Trên đây là mã. Chúng tôi sẽ xem xét từng dòng một trong một phút, nhưng trước tiên hãy đảm bảo rằng chúng tôi có thể làm cho nó hoạt động trên thiết bị của bạn.

Sau khi bạn đã tạo tệp, sau đó trong một thiết bị đầu cuối, bạn lắp ráp nó như sau:

avra xin chào.asm

điều này sẽ tập hợp mã của bạn và tạo một tệp có tên hello.hex mà chúng tôi có thể tải nó lên như sau:

avrdude -p m328p -c stk500v1 -b 57600 -P / dev / ttyUSB0 -U flash: w: hello.hex

nếu bạn đang sử dụng arduino breadboard, bạn sẽ phải nhấn nút đặt lại trên arduino breadboard ngay trước khi thực hiện lệnh trên. Lưu ý rằng bạn cũng có thể phải thêm sudo ở phía trước hoặc thực thi nó dưới dạng root. Cũng lưu ý rằng trên một số arduino (như Arduino UNO), bạn có thể sẽ phải thay đổi tốc độ bit thành -b 115200 và cổng -P / dev / ttyACM0 (nếu bạn gặp lỗi từ avrdude về chữ ký thiết bị không hợp lệ, chỉ cần thêm - F vào lệnh)

Nếu mọi thứ đã hoạt động như bình thường, bây giờ bạn sẽ có một đèn LED sáng lên….. "Hello World!"

Nếu bạn đang sử dụng ATtiny85 thì lệnh avrdude sẽ là:

avrdude -p attiny85 -c usbtiny -U flash: w: hello.hex

Bước 4: Hello.asm Từng dòng một

Để kết thúc hướng dẫn giới thiệu này, chúng ta sẽ xem qua từng dòng chương trình hello.asm để xem nó hoạt động như thế nào.

; xin chào.asm

; bật đèn LED được kết nối với PB5 (đầu ra kỹ thuật số 13)

Mọi thứ sau dấu chấm phẩy đều bị trình hợp dịch bỏ qua và do đó hai dòng đầu tiên này chỉ đơn giản là "nhận xét" giải thích những gì chương trình thực hiện.

.include "./m328Pdef.inc"

Dòng này yêu cầu trình hợp dịch bao gồm tệp m328Pdef.inc mà bạn đã tải xuống. Bạn có thể muốn đặt tệp này vào một thư mục chứa các tệp bao gồm tương tự và sau đó thay đổi dòng trên để trỏ đến nó ở đó.

ldi r16, 0b00100000

ldi là viết tắt của "tải ngay lập tức" và yêu cầu trình hợp dịch lấy một thanh ghi đang hoạt động, r16 trong trường hợp này và tải một số nhị phân vào đó, 0b00100000 trong trường hợp này. Số 0b phía trước nói rằng số của chúng ta ở dạng nhị phân. Nếu chúng tôi muốn, chúng tôi có thể đã chọn một cơ số khác, chẳng hạn như hệ thập phân. Trong trường hợp đó, số của chúng tôi sẽ là 0x20, là hệ thập phân cho 0b00100000. Hoặc chúng ta có thể đã sử dụng 32 là số thập phân cơ số 10 cho cùng một số.

Bài tập 1: Hãy thử thay đổi số ở dòng trên thành thập phân và sau đó thành thập phân trong mã của bạn và xác minh rằng nó vẫn hoạt động trong từng trường hợp.

Mặc dù vậy, sử dụng nhị phân là đơn giản nhất vì cách thức hoạt động của Cổng và Thanh ghi. Chúng ta sẽ thảo luận về các cổng và thanh ghi của atmega328p chi tiết hơn trong các hướng dẫn trong tương lai nhưng bây giờ tôi sẽ chỉ nói rằng chúng ta đang sử dụng r16 làm "thanh ghi làm việc" của chúng ta, nghĩa là chúng ta sẽ sử dụng nó như một biến mà chúng ta lưu trữ số trong. "Thanh ghi" là một tập hợp 8 bit. Có nghĩa là 8 điểm có thể là 0 hoặc 1 (`` tắt '' hoặc `` bật '). Khi chúng ta tải số nhị phân 0b00100000 vào thanh ghi bằng dòng trên, chúng ta chỉ cần lưu trữ số đó trong thanh ghi r16.

ra DDRB, r16

Dòng này yêu cầu trình biên dịch sao chép nội dung của thanh ghi r16 vào thanh ghi DDRB. DDRB là viết tắt của "Data Direction Register B" và nó thiết lập các "chân" trên PortB. Trên bản đồ sơ đồ chân của 328p, bạn có thể thấy rằng có 8 chân có nhãn PB0, PB1,…, PB7. Các chân này đại diện cho các "bit" của "PortB" và khi chúng tôi tải số nhị phân 00100000 vào thanh ghi DDRB, chúng tôi đang nói rằng chúng tôi muốn PB0, PB1, PB2, PB3, PB4, PB6 và PB7 được đặt làm chân INPUT vì chúng có 0 là trong chúng và PB5 được đặt làm chân OUTPUT vì chúng tôi đặt 1 vào vị trí đó.

ra PortB, r16

Bây giờ chúng ta đã cố định hướng của các chân, bây giờ chúng ta có thể đặt điện áp trên chúng. Dòng trên sao chép cùng một số nhị phân từ thanh ghi lưu trữ r16 của chúng tôi sang PortB. Điều này đặt tất cả các chân thành 0 volt ngoại trừ chân PB5 thành HIGH là 5 volt.

Bài tập 2: Lấy một đồng hồ vạn năng số, cắm dây dẫn đen vào đất (GND) rồi thử từng chân từ PB0 đến PB7 với dây dẫn đỏ. Các điện áp trên mỗi chân có chính xác là điện áp tương ứng với việc đặt 0b00100000 vào PortB không? Nếu có cái nào không phải, bạn nghĩ tại sao lại như vậy? (xem bản đồ ghim)

Bắt đầu:

rjmp Bắt đầu

Cuối cùng, dòng đầu tiên ở trên là "nhãn" đánh dấu một vị trí trong mã. Trong trường hợp này, ghi nhãn vị trí đó là "Bắt đầu". Dòng thứ hai cho biết "chuyển tương đối đến nhãn Bắt đầu." Kết quả thực là máy tính được đặt vào một vòng lặp vô hạn chỉ tiếp tục quay trở lại Bắt đầu. Chúng tôi cần điều này bởi vì chúng tôi không thể để chương trình kết thúc hoặc rơi khỏi vách đá, chương trình phải tiếp tục chạy để đèn tiếp tục sáng.

Bài tập 3: Xóa hai dòng trên khỏi mã của bạn để chương trình rơi xuống vực. Điều gì xảy ra? Bạn sẽ thấy một cái gì đó giống như chương trình "nhấp nháy" truyền thống được Arduino sử dụng làm "chào thế giới!" Của họ. Bạn nghĩ tại sao nó hoạt động theo cách này? (Hãy nghĩ về những gì phải xảy ra khi chương trình rơi xuống vực…)

Bước 5: Kết luận

Nếu bạn đã đạt được điều này cho đến nay thì xin chúc mừng! Bây giờ bạn có thể viết mã lắp ráp, lắp ráp nó và tải nó vào bộ vi điều khiển của bạn.

Trong hướng dẫn này, bạn đã học cách sử dụng các lệnh sau:

ldi hregister, số tải một số (0-255) vào thanh ghi nửa trên (16-31)

out ioregister, đăng ký các bản sao một số từ một thanh ghi đang hoạt động vào một thanh ghi I / O

rjmp label nhảy đến dòng của chương trình được gắn nhãn bởi "label" (không thể cách xa hơn 204 hướng dẫn - tức là nhảy tương đối)

Giờ đây, những điều cơ bản này không còn nữa, chúng ta có thể tiếp tục viết những đoạn mã thú vị hơn cũng như các mạch và thiết bị thú vị hơn mà không cần phải thảo luận về cơ chế biên dịch và tải lên.

Tôi hy vọng bạn đã thích hướng dẫn giới thiệu này. Trong hướng dẫn tiếp theo, chúng tôi sẽ thêm một thành phần mạch khác (một nút) và mở rộng mã của chúng tôi để bao gồm các cổng đầu vào và các quyết định.

Đề xuất: