Mục lục:

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

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

Video: Hướng dẫn lắp ráp AVR 7: 12 bước
Video: [Hướng Dẫn] Tự Lắp Đặt Dàn Karaoke gia đình: Đẩy, Vang, Nâng, Míc, Loa, Sub... CHUẨN NHẤT 2024, Tháng bảy
Anonim
Hướng dẫn lắp ráp AVR 7
Hướng dẫn lắp ráp AVR 7

Chào mừng đến với Hướng dẫn 7!

Hôm nay trước tiên chúng ta sẽ hướng dẫn cách tìm kiếm bàn phím, sau đó hướng dẫn cách sử dụng các cổng đầu vào Analog để giao tiếp với bàn phím. Chúng tôi sẽ nối bàn phím để mỗi lần nhấn phím gửi một điện áp duy nhất đến đầu vào tương tự, cho phép chúng tôi phân biệt bằng điện áp mà phím đã được nhấn. Sau đó, chúng tôi sẽ xuất số được nhấn vào bộ phân tích đăng ký của chúng tôi để hiển thị rằng mọi thứ đang diễn ra đúng như bình thường. xem xét mọi thứ trong một vài giai đoạn trên đường đi để thử và tìm ra cách tránh chúng. Chúng ta cũng sẽ hiểu tại sao việc sử dụng bộ chuyển đổi tương tự sang kỹ thuật số không phải là cách tốt nhất để điều khiển bàn phím mặc dù nó sử dụng ít cổng hơn trên bộ vi điều khiển của bạn.

  1. bàn phím. Bạn có thể mua một cái hoặc bạn có thể làm những gì tôi đã làm và nhặt một cái.
  2. 2 tiêu đề nữ cho bàn phím (nếu bạn đang tìm kiếm một tiêu đề)
  3. kết nối dây
  4. một breadboard
  5. 4 1 điện trở Kohm
  6. 1 điện trở 15 Kohm
  7. 1 điện trở 3.3 Kohm
  8. 1 điện trở 180 ohm
  9. 1 điện trở 680 ohm
  10. đồng hồ vạn năng kỹ thuật số
  11. máy phân tích của bạn từ Hướng dẫn 5

Bạn có thể bỏ qua một vài bước đầu tiên nếu bạn đã có bàn phím và không cần tìm bàn phím.

Đây là liên kết đến bộ sưu tập đầy đủ các hướng dẫn về trình biên dịch AVR của tôi:

Bước 1: Gom bàn phím 1

Gạt bàn phím 1
Gạt bàn phím 1
Gạt bàn phím 1
Gạt bàn phím 1
Gạt bàn phím 1
Gạt bàn phím 1
Gạt bàn phím 1
Gạt bàn phím 1

Cách đây rất lâu, khi thậm chí ông bà của bạn còn là những đứa trẻ, mọi người thường sử dụng những thiết bị trông kỳ lạ này, có dây cáp dài cắm vào tường, để liên lạc với nhau. Chúng được gọi là "điện thoại" và thường là những thứ bằng nhựa rẻ tiền tạo ra âm thanh khó chịu khi ai đó gọi cho bạn (không phải nhạc chuông "Justin Bieber" ngày nay cũng khó chịu như vậy). Trong mọi trường hợp, các thiết bị này có bàn phím trên chúng rất đơn giản có dây và do đó dễ dàng tìm kiếm và chúng có 2 phím phụ trên chúng ("quay số lại" và "đèn flash") từ bàn phím bạn có thể mua mà bạn có thể muốn sử dụng lại như "phím mũi tên", "phím menu" hoặc một cái gì đó khác. Vì vậy, chúng ta sẽ bắt đầu bằng cách tìm bàn phím từ một chiếc điện thoại cũ. Đầu tiên, lấy điện thoại (tôi sử dụng một chiếc GE như trong hình) và cạy nó ra để lộ dây điện, sau đó đục và tháo các núm nhựa nhỏ đang giữ bàn phím và tháo bàn phím ra.

Bước 2: Thu dọn bàn phím số 2

Gom bàn phím 2
Gom bàn phím 2
Gom bàn phím 2
Gom bàn phím 2
Gạt bàn phím 2
Gạt bàn phím 2

Bây giờ lấy một cái cưa PVC và cắt nhựa từ xung quanh các lỗ khóa và sau đó cắt xung quanh cạnh để có được độ sâu phù hợp để lại một bàn phím mỏng.

Sau đó, đặt bàn phím trở lại bằng cách sử dụng các chốt nhỏ còn lại sau khi bạn cắt bớt phần trên của chúng ở bước cuối cùng và sử dụng mỏ hàn để chỉ cần chọc bàn ủi nóng vào mỗi lỗ chốt sẽ làm chảy nhựa và trải ra trên bàn phím dưới cùng của bàn phím hình thành các "núm" mới sẽ giữ bàn phím ở đúng vị trí như trước đây.

Tôi thích tìm kiếm ba loa và có thể những thứ khác như công tắc và những thứ không có trên bảng. Tuy nhiên, lần này tôi sẽ không tìm kiếm các công tắc và những thứ khác vì chúng tôi có những mục tiêu khác vào lúc này. Ngoài ra, có một IC tuyến tính TA31002 trong đó có một chuông điện thoại. Biểu dữ liệu có thể dễ dàng tìm thấy và tải xuống trực tuyến với sơ đồ chân và các tính năng. Vì vậy, tôi sẽ để nó hàn vào bảng bây giờ và sau đó sẽ chơi với nó sau. Tôi muốn kết nối nó với một máy hiện sóng và xem những tín hiệu thú vị nào tôi có thể nhận được từ nó. Thậm chí có thể tạo ra một tiếng chuông cửa từ nó. Ai biết.

Dù sao sau khi bạn hoàn thành việc phá hủy điện thoại và nhặt các bộ phận, chúng tôi sẽ hoàn thành việc tạo bàn phím của chúng tôi.

Bước 3: Thu dọn bàn phím số 3

Gạt bàn phím 3
Gạt bàn phím 3
Gạt bàn phím 3
Gạt bàn phím 3
Gạt bàn phím 3
Gạt bàn phím 3

Sử dụng một bấc khử mùi và tháo các dây cáp ruy-băng từ dưới cùng của bàn phím, đảm bảo rằng các lỗ trên bảng mạch được rõ ràng và sau đó gắn hai tiêu đề cái lên bảng nơi có các lỗ. Bạn có thể sẽ phải cắt bớt tiêu đề của mình để chúng là tiêu đề 4 chân.

Bây giờ các tiêu đề đã được gắn vào, bạn có thể nối nó vào bảng mạch điện, lấy đồng hồ vạn năng và kiểm tra các phím bằng cách dán đồng hồ vạn năng qua các chân ngẫu nhiên và đo điện trở. Điều này sẽ cho phép bạn vạch ra các chìa khóa. Rất khó để biết các phím được nối dây với đầu ra như thế nào bằng cách nhìn vào mạch điện nhưng nếu bạn sử dụng đồng hồ vạn năng, bạn có thể cắm nó vào hai chân bất kỳ và sau đó nhấn các nút cho đến khi bạn thấy một số trên màn hình thay vì mạch hở.. Đây sẽ là sơ đồ chân cho phím đó.

Ánh xạ tất cả các phím đến các chân đầu ra theo cách này.

Bước 4: Nối bàn phím

Nối bàn phím
Nối bàn phím
Nối bàn phím
Nối bàn phím

Bây giờ hãy làm theo sơ đồ nối dây và đấu dây bàn phím vào breadboard của bạn.

Điều này sẽ hoạt động như thế nào là chúng ta sẽ đặt 5V vào phía bên trái và phía bên phải vào GND. Chân đầu tiên ở bên phải trong sơ đồ đi vào chân đầu tiên trong số các chân tương tự của chúng tôi trên vi điều khiển Atmega328p. Khi không có nút nào được nhấn, tín hiệu sẽ là 0V, và khi nhấn từng nút khác nhau, đầu vào của cổng analog sẽ nằm trong khoảng từ 0V đến 5V với một lượng khác nhau tùy thuộc vào phím nào đã được nhấn. Chúng tôi đã chọn các giá trị điện trở để mỗi đường dẫn sẽ chứa một điện trở khác với phần còn lại. Cổng tương tự trên vi điều khiển lấy tín hiệu tương tự và chia thành 1024 kênh khác nhau giữa 0V và 5V. Điều này có nghĩa là mỗi kênh có chiều rộng 5V / 1024 = 0,005 V / kênh = 5 mV / kênh. Vì vậy, cổng tương tự có thể phân biệt điện áp đầu vào miễn là chúng chênh lệch nhau hơn 5 mV. Trong trường hợp của chúng tôi, chúng tôi đã chọn các giá trị điện trở để hai lần nhấn phím bất kỳ sẽ gửi tín hiệu điện áp khác nhau nhiều hơn mức này để bộ vi điều khiển có thể dễ dàng quyết định phím nào đã được nhấn. Vấn đề lớn là toàn bộ hệ thống rất ồn, vì vậy chúng tôi sẽ cần chọn một dải điện áp để ánh xạ cho mỗi lần nhấn nút - nhưng chúng tôi sẽ đi sâu vào vấn đề đó một chút sau.

Lưu ý rằng chúng tôi có thể điều khiển bàn phím 14 nút chỉ bằng một dòng đầu vào duy nhất vào bộ điều khiển. Đó là một trong những khía cạnh hữu ích của đầu vào tương tự.

Bây giờ, nỗ lực đầu tiên của chúng tôi trong việc điều khiển bàn phím sẽ là nhấn phím gây ra ngắt, chương trình con ngắt sẽ đọc cổng đầu vào tương tự và quyết định phím nào đã được nhấn, sau đó nó sẽ xuất số đó tới chương trình con phân tích thanh ghi của chúng tôi, chương trình này sẽ hiển thị giá trị khóa trong hệ nhị phân trên 8 đèn LED mà chúng tôi đã thiết lập trong Hướng dẫn 5.

Bước 5: Chuyển Bàn phím đến Máy phân tích của bạn

Chuyển Bàn phím đến Máy phân tích của bạn
Chuyển Bàn phím đến Máy phân tích của bạn
Chuyển Bàn phím đến Máy phân tích của bạn
Chuyển Bàn phím đến Máy phân tích của bạn

Các hình ảnh cho thấy cách chúng tôi muốn nối bàn phím với bộ vi điều khiển để chúng tôi có thể xem kết quả đầu ra trên màn hình máy phân tích của mình. Về cơ bản, chúng tôi chỉ cần đấu dây đầu ra từ bàn phím đến chân 0 của PortC, còn được gọi là ADC0 trên ATmega328P.

Tuy nhiên, có một vài điều bổ sung. Chúng tôi cũng sẽ nối một nút tới PD2. I E. đi một dây từ đường ray 5V của bạn đến một nút và từ phía bên kia của nút đến PD2, và cuối cùng, chúng tôi muốn ngắt kết nối chân AREF khỏi đường ray 5V của chúng tôi và thay vào đó, để nó ngắt kết nối. Chúng tôi có thể chèn một tụ điện tách rời 0,1 microfarad nếu chúng tôi muốn. Đây là một tụ điện bằng gốm có ghi số 104 trên đó. Hai chữ số đầu tiên là số và chữ số cuối cùng là lũy thừa của 10, chúng tôi nhân nó với nó để nhận được câu trả lời trong picofarads (pico có nghĩa là 10 ^ -12), Vì vậy 104 có nghĩa là 10 x 10 ^ 4 picofarads, giống như 100 nanofarads (nano có nghĩa là 10 ^ -9), bằng 0,1 microfarads (micro có nghĩa là 10 ^ -6). Dù sao, tất cả điều này là ổn định chân AREF khi chúng ta có thể sử dụng nó làm chân tham chiếu của mình.

Chúng tôi cũng muốn có một điện trở 1 Mohm giữa PD2 và đất. Chúng tôi sẽ đặt PD2 làm chân đầu ra ở 0V và chúng tôi sẽ kích hoạt trên một cạnh tích cực tại chân đó. Chúng tôi muốn cạnh biến mất ngay lập tức khi chúng tôi nhả nút vì vậy chúng tôi sẽ chèn điện trở "kéo xuống" này.

Lý do mà chúng tôi muốn có nút là vì chúng tôi muốn kích hoạt bộ chuyển đổi Analog-to-Digital của mình tắt chân INT0 trên chip, cũng là PD2. Cuối cùng, chúng tôi muốn nhấn phím để kích hoạt ADC và cũng cung cấp đầu vào được chuyển đổi mà không có nút riêng biệt, nhưng do cách hoạt động của thời gian, chúng tôi sẽ bắt đầu bằng cách có một nút riêng để kích hoạt ADC và một khi chúng tôi ủi tất cả lỗi và tự tin rằng mọi thứ đang hoạt động bình thường, sau đó chúng tôi sẽ giải quyết các vấn đề về thời gian và tiếng ồn đi kèm với việc kích hoạt từ cùng một lần nhấn nút mà chúng tôi muốn đọc.

Vì vậy, hiện tại, cách nó hoạt động là chúng ta sẽ giữ một phím, sau đó nhấn nút để kích hoạt ADC, sau đó thả ra và hy vọng giá trị nhị phân của nút mà chúng ta đã nhấn sẽ hiển thị trên máy phân tích.

Vì vậy, hãy viết một số mã sẽ thực hiện được điều đó.

Bước 6: Chúng ta nên đặt công tắc chuyển đổi nào?

Chúng ta nên đặt công tắc bật tắt nào?
Chúng ta nên đặt công tắc bật tắt nào?

Trước tiên, hãy nghĩ về cách chúng ta sẽ viết mã này để bộ điều khiển có thể đọc đầu vào từ bàn phím và biến nó thành một giá trị số tương ứng với nút được nhấn. được tích hợp vào Atmega328p. Chúng tôi sẽ sử dụng AREF làm điện áp tham chiếu và đầu ra bàn phím của chúng tôi sẽ được kết nối với PortC0 hoặc PC0. Lưu ý rằng chân này còn được gọi là ADC0 cho Bộ chuyển đổi Analog-to-Digital 0. Có thể bạn nên đọc qua Phần 12.4 về ngắt cho ATmega328P và cả chương 24 trên Bộ chuyển đổi tương tự sang kỹ thuật số trước khi chúng ta hiểu đã bắt đầu hoặc ít nhất là có các phần đó sẵn sàng để tham khảo. các bit thanh ghi liên quan. Về cơ bản, chúng tương đương với các công tắc bật tắt cũ trên các máy tính đầu tiên. Bạn có thể bật công tắc BẬT hoặc TẮT, hoặc thậm chí lùi xa hơn, bạn sẽ cắm dây cáp giữa ổ cắm này với ổ cắm khác để các electron đến ngã ba trên đường sẽ tìm thấy một cánh cổng đóng và một cánh cổng khác mở ra buộc nó đi xuống một con đường khác trong mê cung của mạch và do đó thực hiện một nhiệm vụ logic khác. Khi viết mã bằng hợp ngữ, chúng ta có thể truy cập chặt chẽ vào các chức năng này của vi điều khiển, đây là một trong những điều hấp dẫn khi thực hiện nó ngay từ đầu. Nó là "động tay" hơn và ít diễn ra ở "hậu trường" như nó vốn có. Vì vậy, đừng nghĩ việc thiết lập các thanh ghi này là một công việc tẻ nhạt. Đây là điều làm cho hợp ngữ trở nên thú vị! Chúng tôi đang đạt được mối quan hệ rất cá nhân với hoạt động bên trong và logic của con chip và làm cho nó hoạt động chính xác những gì chúng tôi muốn - không hơn không kém. Không lãng phí chu kỳ đồng hồ. Vì vậy, đây là danh sách các công tắc chúng ta cần thiết lập:

  1. Tắt bit ADC giảm nguồn, PRADC, là bit 0 của thanh ghi PRR, vì nếu bit này được bật, nó sẽ tắt ADC. Thanh ghi giảm năng lượng về cơ bản là một cách để tắt nhiều thứ khác nhau sử dụng năng lượng khi bạn không cần đến chúng. Vì chúng tôi đang sử dụng ADC nên chúng tôi muốn đảm bảo rằng nó không bị vô hiệu hóa theo cách này. (Xem PRADC ở trang 46)
  2. Chọn kênh đầu vào tương tự là ADC0 bằng cách tắt MUX3… 0 trong thanh ghi ADC Multiplexer Selection (ADMUX) (Xem bảng 24-4 trang 249), những kênh này đã được tắt theo mặc định nên chúng tôi không thực sự cần làm điều này. Tuy nhiên, tôi bao gồm nó vì nếu bạn sử dụng một cổng không phải ADC0, bạn sẽ cần phải chuyển đổi các công tắc này cho phù hợp. Các sự kết hợp khác nhau của MUX3, MUX2, MUX1, MUX0 cho phép bạn sử dụng bất kỳ cổng tương tự nào làm đầu vào của mình và bạn cũng có thể thay đổi các cổng này một cách nhanh chóng nếu bạn muốn xem một loạt các tín hiệu tương tự khác nhau cùng một lúc.
  3. Tắt các bit REFS0 và REFS1 trong thanh ghi ADMUX để chúng tôi sử dụng AREF làm điện áp tham chiếu thay vì tham chiếu bên trong (Xem trang 248).
  4. Bật bit ADLAR trong ADMUX để kết quả được "điều chỉnh bên trái", chúng ta sẽ thảo luận về sự lựa chọn này trong bước tiếp theo.
  5. Đặt bit ADC0D trong Thanh ghi vô hiệu hóa đầu vào kỹ thuật số (DIDR0) để tắt đầu vào kỹ thuật số cho PC0. Chúng tôi đang sử dụng cổng đó cho đầu vào tương tự vì vậy chúng tôi cũng có thể tắt đầu vào kỹ thuật số cho nó.
  6. Đặt ISC0 và ISC1 trong Thanh ghi điều khiển ngắt ngoài A (EICRA) để chỉ ra rằng chúng ta muốn kích hoạt trên cạnh lên của tín hiệu điện áp tới chân INT0 (PD2), xem trang 71.
  7. Xóa các bit INT0 và INT1 trong thanh ghi mặt nạ ngắt ngoài (EIMSK) để chỉ ra rằng chúng tôi không sử dụng ngắt trên chân này. Nếu chúng tôi kích hoạt ngắt trên chân này, chúng tôi sẽ cần một trình xử lý ngắt tại địa chỉ 0x0002 nhưng thay vào đó chúng tôi thiết lập nó để tín hiệu trên chân này kích hoạt chuyển đổi ADC, quá trình hoàn thành sẽ được xử lý bởi ngắt hoàn thành chuyển đổi ADC tại địa chỉ 0x002A. Xem trang 72.
  8. Đặt bit Bật ADC (ADEN) (bit 7) trong thanh ghi trạng thái và điều khiển ADC A (ADCSRA) để bật ADC. Xem trang 249.
  9. Chúng tôi có thể bắt đầu một chuyển đổi duy nhất bằng cách đặt bit chuyển đổi bắt đầu ADC (ADSC) mỗi khi chúng tôi muốn đọc tín hiệu tương tự, tuy nhiên, hiện tại chúng tôi muốn nó tự động đọc bất cứ khi nào ai đó nhấn nút, vì vậy thay vào đó chúng tôi sẽ bật ADC Bit Bật tự động kích hoạt (ADATE) trong thanh ghi ADCSRA để việc kích hoạt được thực hiện tự động.
  10. Chúng tôi cũng đặt các bit ADPS2..0 (các bit AD Prescalar) thành 111 để xung nhịp ADC là xung nhịp CPU chia cho hệ số 128.
  11. Chúng tôi sẽ chọn nguồn kích hoạt ADC là PD2 mà còn được gọi là INT0 (Yêu cầu ngắt bên ngoài 0). Chúng tôi thực hiện việc này bằng cách chuyển đổi các bit khác nhau trong thanh ghi ADCSRB (Xem Bảng 24-6 trên trang 251). Trên bảng, chúng ta thấy rằng chúng ta muốn ADTS0 tắt, ADTS1 bật và ADTS2 tắt để ADC sẽ kích hoạt chân đó. Lưu ý nếu chúng tôi muốn liên tục lấy mẫu cổng tương tự như khi chúng tôi đang đọc một số tín hiệu tương tự liên tục (như lấy mẫu âm thanh hoặc thứ gì đó), chúng tôi sẽ đặt điều này thành Chế độ chạy tự do. Phương pháp chúng tôi đang sử dụng để thiết lập kích hoạt trên PD2 kích hoạt đọc ADC của cổng tương tự PC0 mà không gây ra ngắt. Ngắt sẽ đến khi quá trình chuyển đổi hoàn tất.
  12. Bật bit ADC Interrupt Enable (ADIE) trong thanh ghi ADCSRA để khi quá trình chuyển đổi tương tự sang kỹ thuật số hoàn tất, nó sẽ tạo ra một ngắt mà chúng ta có thể viết một trình xử lý ngắt và đặt tại.org 0x002A.
  13. Đặt bit I trong SREG để kích hoạt ngắt.

Bài tập 1: Đảm bảo bạn đã đọc các phần có liên quan trong biểu dữ liệu cho từng cài đặt ở trên để bạn hiểu điều gì đang xảy ra và điều gì sẽ xảy ra nếu chúng tôi thay đổi chúng thành cài đặt thay thế.

Bước 7: Viết trình xử lý ngắt

Trong bước cuối cùng, chúng tôi thấy rằng chúng tôi đã thiết lập nó sao cho cạnh tăng được phát hiện trên PD2 sẽ kích hoạt chuyển đổi tương tự sang kỹ thuật số trên PC0 và khi quá trình chuyển đổi này hoàn tất, nó sẽ tạo ra một ngắt ADC Conversion Complete. Bây giờ chúng ta muốn làm điều gì đó với ngắt này. Nếu xem Bảng 12-6 trên trang 65, bạn sẽ thấy danh sách các lần ngắt có thể xảy ra. Chúng ta đã thấy ngắt ĐẶT LẠI ở địa chỉ 0x0000 và ngắt Tràn bộ hẹn giờ / Bộ đếm0 ở địa chỉ 0x0020 trong các Hướng dẫn trước. Bây giờ chúng ta muốn xem xét ngắt ADC mà chúng ta thấy trong bảng ở địa chỉ 0x002A. Vì vậy, ở đầu mã hợp ngữ của chúng ta, chúng ta sẽ cần một dòng có nội dung:

.org 0x002Arjmp ADC_int

sẽ chuyển đến trình xử lý ngắt có nhãn ADC_int của chúng tôi bất cứ khi nào ADC đã hoàn thành một chuyển đổi. Vậy chúng ta nên viết trình xử lý ngắt như thế nào? Cách mà ADC hoạt động là thực hiện phép tính sau:

ADC = Vin x 1024 / Vref

Vì vậy, hãy để chúng tôi xem điều gì sẽ xảy ra nếu tôi nhấn nút "quay số lại" trên bàn phím. Trong trường hợp đó, điện áp trên PC0 sẽ thay đổi thành một giá trị nào đó, chẳng hạn 1,52V, và vì Vref ở mức 5V nên chúng ta sẽ có:

ADC = (1.52V) x 1024 / 5V = 311.296

và do đó, nó sẽ hiển thị dưới dạng 311. Nếu chúng ta muốn chuyển nó trở lại thành điện áp, chúng ta chỉ cần đảo ngược phép tính. Tuy nhiên, chúng tôi sẽ không cần phải làm điều này vì chúng tôi không quan tâm đến điện áp thực tế chỉ để phân biệt giữa chúng. Khi quá trình chuyển đổi kết thúc, kết quả được lưu trữ trong một số 10 bit được đặt trong thanh ghi ADCH và ADCL và chúng tôi đã làm cho nó được "điều chỉnh trái" có nghĩa là 10 bit bắt đầu từ bit 7 của ADCH và đi xuống bit 6 của ADCL (có tổng cộng 16 bit trong hai thanh ghi này và chúng tôi chỉ sử dụng 10 trong số chúng, tức là 1024 kênh). Chúng tôi có thể có kết quả "điều chỉnh bên phải" nếu chúng tôi muốn bằng cách xóa bit ADLAR trong thanh ghi ADMUX. Có thể chỉ là tiếng ồn, vì vậy chúng ta sẽ phân biệt các lần nhấn phím chỉ sử dụng 8 chữ số trên, nói cách khác, chúng ta sẽ chỉ cần nhìn vào ADCH để tìm ra nút nào đã được nhấn. đăng ký, chuyển đổi số đó thành giá trị bàn phím và sau đó gửi giá trị đó đến đèn LED của bộ phân tích đăng ký của chúng tôi để chúng tôi có thể xác minh rằng việc đẩy câu nói "9", sẽ làm cho đèn LED tương ứng với "00001001" sáng lên. Mặc dù vậy, trước tiên chúng ta cần xem những gì hiển thị trong ADCH khi chúng ta nhấn các nút khác nhau. Vì vậy, chúng ta chỉ cần viết một trình xử lý ngắt đơn giản chỉ gửi nội dung của ADCH đến màn hình phân tích. Vì vậy, đây là những gì chúng ta cần:

ADC_int: lds analyzer, ADCH; tải giá trị của ADCH vào phân tích EIFR của chúng tôi, 0; xóa cờ ngắt bên ngoài để nó sẵn sàng hoạt động trở lại

Bây giờ, bạn có thể chỉ cần sao chép mã từ trình phân tích của chúng tôi trong hướng dẫn 5 và thêm ngắt này và cài đặt chuyển đổi và chạy nó. Bài tập 2: Viết mã và chạy nó. Thấy rằng bạn nhận được ADCH hiển thị trên màn hình máy phân tích của bạn. Thử nhấn nhiều lần cùng một phím. Bạn có luôn nhận được cùng một giá trị trong ADCH không?

Bước 8: Lập bản đồ các giá trị khi nhấn phím

Lập bản đồ các giá trị khi nhấn phím
Lập bản đồ các giá trị khi nhấn phím

Việc chúng ta cần làm bây giờ là chuyển các giá trị trong ADCH thành các số tương ứng với phím đã được nhấn. Chúng tôi làm điều này bằng cách viết ra nội dung của ADCH cho mỗi lần nhấn phím và sau đó chuyển đổi nó thành một số thập phân như tôi đã làm trong hình. Trong quy trình xử lý ngắt của chúng tôi, chúng tôi sẽ xem xét toàn bộ phạm vi giá trị tương ứng với mỗi lần nhấn phím để ADC sẽ ánh xạ bất kỳ thứ gì trong phạm vi đó với một lần nhấn phím nhất định.

Bài tập 3: Thực hiện ma-p.webp

Đây là những gì tôi nhận được cho của tôi (của bạn rất có thể sẽ khác). Lưu ý rằng tôi đã thiết lập nó với một loạt các giá trị cho mỗi lần nhấn phím.

ADC_int:; Bộ phân tích xử lý ngắt bên ngoài; chuẩn bị cho số mới buttonH, ADCH; ADC cập nhật khi ADCH được đọc clccpi buttonH, 240brlo PC + 3; nếu ADCH lớn hơn thì đó là một máy phân tích 1ldi, 1; vì vậy tải phân tích với một trả về 1rjmp; và trả về nút clccpiH, 230; nếu ADCH lớn hơn thì máy phân tích 2brlo PC + 3ldi, 2rjmp trả về nút clccpiH, 217brlo PC + 3ldi phân tích, 3rjmp trả về nút clccpiH, 203brlo PC + 3ldi phân tích, 4rjmp trả về nút clccpiH, 187brlo PC + 3ldi phân tích, 5rjmp trở lại clcc nút 155brlo PC + 3ldi analyzer, 6rjmp return clccpi buttonH, 127brlo PC + 3ldi analyzer, 255; chúng tôi sẽ đặt flash làm tất cả nút trả về clccpi onrjmpH, máy phân tích 115brlo PC + 3ldi, nút clccpi trả về 7rjmpH, máy phân tích 94brlo PC + 3ldi, nút clccpi 8rjmp trả vềH, máy phân tích 62brlo PC + 3ldi, nút phân tích clccpi 9rjmp, máy phân tích 37brlo PC + 3ldi 0b11110000; dấu hoa thị là nửa trên cùng onrjmp return clccpi buttonH, 28brlo PC + 3ldi analyzer, 0rjmp return clccpi buttonH, 17brlo PC + 3ldi analyzer, 0b00001111; dấu thăng là nửa dưới onrjmp return clccpi buttonH, 5brlo PC + 3ldi analyzer, 0b11000011; quay số lại là máy phân tích ldi trả về 2rjmp trên cùng, 0b11011011; nếu không xảy ra lỗi, trả lại: reti

Bước 9: Mã và video cho phiên bản 1

Tôi đã đính kèm mã của mình cho phiên bản đầu tiên của trình điều khiển bàn phím. Trong phần này, bạn cần nhấn phím và sau đó nhấn nút để ADC đọc đầu vào từ bàn phím. Những gì chúng tôi muốn có là không có nút mà thay vào đó tín hiệu để thực hiện chuyển đổi đến từ chính việc nhấn phím. Bài tập 3: Lắp ráp và tải lên mã này và thử nó. Bạn có thể phải thay đổi các ngưỡng chuyển đổi khác nhau để tương ứng với điện áp nhấn phím của mình vì chúng có thể khác với của tôi. Điều gì sẽ xảy ra nếu bạn cố gắng sử dụng đầu vào từ bàn phím cho cả ADC0 và chân ngắt bên ngoài thay vì thông qua một nút? Tôi cũng sẽ đính kèm video về hoạt động của phiên bản đầu tiên của trình điều khiển phím bấm. trong mã của tôi có một phần khởi tạo Con trỏ ngăn xếp. Có nhiều thanh ghi khác nhau mà chúng ta có thể muốn đẩy và bật ra khỏi ngăn xếp khi chúng ta đang thao tác với các biến và những gì không và cũng có những thanh ghi mà chúng ta có thể muốn lưu và khôi phục sau này. Ví dụ, SREG là một thanh ghi không được bảo toàn giữa các ngắt, vì vậy các cờ khác nhau được thiết lập và xóa do kết quả của các hoạt động có thể bị thay đổi nếu một ngắt xảy ra ở giữa một cái gì đó. Vì vậy, tốt nhất là bạn đẩy SREG vào ngăn xếp ở đầu trình xử lý ngắt và sau đó bật lại ở cuối trình xử lý ngắt. Tôi đã đặt nó trong mã để hiển thị cách nó được khởi tạo và dự đoán cách chúng tôi sẽ cần nó sau này nhưng vì chúng tôi không quan tâm điều gì sẽ xảy ra với SREG trong quá trình ngắt trong mã của chúng tôi nên tôi đã không sử dụng ngăn xếp cho việc này. mà tôi đã sử dụng phép toán shift để đặt các bit khác nhau trong thanh ghi khi khởi tạo. Ví dụ trong dòng:

ldi temp, (1 <> sts EICRA, tạm thời

Lệnh "<<" trong dòng mã đầu tiên ở trên là một hoạt động thay đổi. Về cơ bản, nó lấy số nhị phân 1, là 0b00000001 và dịch chuyển nó sang trái bằng số ISC01. Đây là vị trí của bit có tên ISC01 trong thanh ghi EICRA. Vì ISC01 là bit 1, số 1 được chuyển sang vị trí bên trái 1 để trở thành 0b00000010. Tương tự như vậy thứ hai, ISC00, là bit 0 của EICRA và do đó, sự dịch chuyển của số 1 là 0 vị trí sang trái. Nếu nhìn lại tệp m328Pdef.inc mà bạn đã tải xuống trong hướng dẫn đầu tiên và đã sử dụng evrr kể từ đó, bạn sẽ thấy rằng đó chỉ là một danh sách dài các câu lệnh ".equ". Bạn sẽ thấy rằng ISC01 bằng 1. Trình lắp ráp thay thế mọi trường hợp của nó bằng 1 trước khi bắt đầu lắp ráp bất cứ thứ gì. Chúng chỉ là tên cho các bit thanh ghi để giúp con người chúng ta đọc và viết mã. Bây giờ, đường thẳng đứng giữa hai hoạt động shift ở trên là một phép toán logic "hoặc". Đây là phương trình:

0b00000010 | 0b00000001 = 0b00000011

và đây là những gì chúng tôi đang tải (sử dụng "ldi") vào tạm thời. Lý do mọi người sử dụng phương pháp này để tải các giá trị vào một thanh ghi là nó cho phép người ta sử dụng tên của bit thay vì chỉ một số và điều này làm cho mã dễ đọc hơn nhiều. Ngoài ra còn có hai kỹ thuật khác mà chúng tôi đã sử dụng. Chúng tôi sử dụng các hướng dẫn "ori" và "andi". Chúng cho phép chúng ta ĐẶT và XÓA các bit tương ứng mà không thay đổi bất kỳ bit nào khác trong thanh ghi. Ví dụ, khi tôi sử dụng

ori temp, (1

temp "hoặc" s này với 0b00000001 đặt 1 ở bit thứ 0 và giữ nguyên tất cả các phần còn lại. Ngoài ra khi chúng tôi viết

andi temp, 0b11111110

điều này thay đổi bit thứ 0 của nhiệt độ thành 0 và giữ nguyên tất cả các phần còn lại.

Bài tập 4: Bạn nên xem qua mã và chắc chắn rằng bạn hiểu từng dòng. Bạn có thể cảm thấy thú vị khi tìm ra các phương pháp tốt hơn để thực hiện công việc và viết một chương trình tốt hơn. Có hàng trăm cách để viết mã mọi thứ và tôi khá tin tưởng rằng bạn có thể tìm ra cách tốt hơn nhiều so với cách của tôi. Bạn cũng có thể tìm thấy lỗi và thiếu sót. Trong trường hợp đó, tôi chắc chắn muốn biết về chúng để chúng có thể được khắc phục.

Được rồi, bây giờ hãy xem liệu chúng ta có thể loại bỏ nút thừa đó không…

Bước 10: Mã cho phiên bản 2

Cách đơn giản nhất để loại bỏ nút này là chỉ cần loại bỏ nó hoàn toàn, quên đầu vào PB2 và chỉ cần chuyển ADC sang "Chế độ chạy tự do".

Nói cách khác, chỉ cần thay đổi thanh ghi ADCSRB sao cho ADTS2, ADTS1 và ADTS0 đều bằng không.

Sau đó, đặt bit ADSC trong ADCSRA thành 1, bit này sẽ bắt đầu chuyển đổi đầu tiên.

Bây giờ tải nó lên bộ vi điều khiển của bạn và bạn sẽ thấy rằng số chính xác xuất hiện trên màn hình khi bạn đang nhấn nút và chỉ khi bạn nhấn nút. Điều này là do ADC liên tục lấy mẫu cổng ADC0 và hiển thị giá trị. Khi bạn rời ngón tay khỏi nút, "nút nảy" sẽ khiến một vài giá trị ngẫu nhiên xảy ra rất nhanh và sau đó nó sẽ quay trở lại đầu vào 0V. Trong mã của chúng tôi, chúng tôi có 0V này xuất hiện dưới dạng 0b11011011 (vì phím bấm `0 'đã sử dụng giá trị hiển thị 0b00000000)

Đây không phải là giải pháp chúng tôi muốn mặc dù vì hai lý do. Đầu tiên, chúng tôi không muốn phải giữ nút. Chúng tôi muốn nhấn nó một lần và số được hiển thị (hoặc được sử dụng trong một số mã mới trong hướng dẫn sau). Thứ hai, chúng tôi không muốn liên tục lấy mẫu ADC0. Chúng tôi muốn nó thực hiện một lần đọc, chuyển đổi nó và sau đó ngủ cho đến khi một lần nhấn phím mới kích hoạt một chuyển đổi mới. Chế độ chạy tự do là tốt nhất nếu điều duy nhất bạn muốn bộ vi điều khiển làm là liên tục đọc một số đầu vào tương tự - như nếu bạn muốn hiển thị nhiệt độ thời gian thực hoặc thứ gì đó.

Vì vậy, chúng ta hãy tìm một giải pháp khác…

Bước 11: Làm thế nào để chúng ta thoát khỏi nút? Phiên bản 3

Làm thế nào để chúng ta thoát khỏi nút? Phiên bản 3
Làm thế nào để chúng ta thoát khỏi nút? Phiên bản 3

Có nhiều cách mà chúng tôi có thể tiến hành. Đầu tiên, chúng ta có thể thêm phần cứng để loại bỏ nút. Ví dụ, chúng ta có thể thử đặt một bóng bán dẫn vào mạch ở dòng đầu ra của phím bấm để nó lấy một dòng điện nhỏ từ đầu ra và gửi một xung 5V đến chân ngắt PD2.

Tuy nhiên, điều đó có lẽ sẽ quá ồn ít nhất và tệ nhất là nó sẽ không cho phép đủ thời gian để đọc chính xác khi nhấn phím vì đầu ra điện áp của bàn phím sẽ không có thời gian ổn định trước khi ghi ADC.

Vì vậy, chúng tôi muốn đưa ra một giải pháp phần mềm. Những gì chúng tôi muốn làm là thêm một ngắt trên chân PD2 và viết một trình xử lý ngắt cho nó gọi một lần đọc chân bàn phím. Nói cách khác, chúng tôi loại bỏ ngắt tự động kích hoạt khỏi ADC và thêm một ngắt bên ngoài gọi ADC bên trong nó. Bằng cách đó, tín hiệu để đọc ADC đến sau khi tín hiệu PD2 đã xảy ra và điều này có thể cho mọi thứ đủ thời gian để ổn định thành điện áp chính xác trước khi chân PC0 được đọc và chuyển đổi. Chúng tôi sẽ vẫn có một ngắt hoàn thành ADC xuất kết quả đến màn hình máy phân tích ở cuối.

Có lý? Hãy làm điều đó…

Hãy xem mã mới được đính kèm.

Bạn thấy những thay đổi sau:

  1. Chúng tôi đã thêm một rjmp tại địa chỉ.org 0x0002 để xử lý ngắt bên ngoài INT0
  2. Chúng tôi đã thay đổi thanh ghi EIMSK để chỉ ra rằng chúng tôi muốn ngắt trên chân INT0
  3. Chúng tôi đã thay đổi chân ADATE trong thanh ghi ADCSRA để tắt tính năng tự động kích hoạt
  4. Chúng tôi đã loại bỏ cài đặt ADCSRB vì chúng không liên quan khi ADATE tắt
  5. Chúng tôi không còn phải đặt lại cờ kích hoạt bên ngoài vì quy trình ngắt INT0 tự động thực hiện điều này khi nó hoàn thành - trước đây chúng tôi không có quy trình ngắt, chúng tôi chỉ kích hoạt ADC tắt tín hiệu tại chân đó, vì vậy chúng tôi phải xóa cờ đó bằng tay.

Bây giờ trong trình xử lý ngắt, chúng ta chỉ cần gọi một chuyển đổi duy nhất từ ADC.

Bài tập 5: Chạy phiên bản này và xem điều gì sẽ xảy ra.

Bước 12: Mã và video cho phiên bản làm việc

Như chúng ta đã thấy ở phiên bản trước, ngắt nút không hoạt động tốt vì ngắt được kích hoạt trên một cạnh lên đến chân PD2 và sau đó trình xử lý ngắt gọi chuyển đổi ADC. Tuy nhiên, ADC sau đó nhận được số đọc điện áp trước khi nó ổn định và vì vậy nó đọc vô nghĩa.

Những gì chúng ta cần là giới thiệu độ trễ giữa ngắt trên PD2 và đọc ADC trên PC0. Chúng tôi sẽ thực hiện việc này bằng cách thêm một bộ đếm thời gian / bộ đếm, một ngắt tràn bộ đếm và một quy trình trì hoãn. May mắn thay, chúng tôi đã biết cách làm điều này từ Hướng dẫn 3! Vì vậy, chúng tôi sẽ chỉ sao chép và dán mã có liên quan từ đó.

Tôi đã cung cấp mã kết quả và video hiển thị nó đang hoạt động.

Bạn sẽ nhận thấy rằng các bài đọc không chính xác như người ta mong đợi. Điều này có thể do một số nguồn:

  1. chúng tôi đang khai thác từ đầu ra điện áp của bàn phím để kích hoạt trên PD2, điều này ảnh hưởng đến việc đọc trong PC0.
  2. chúng tôi thực sự không biết phải trì hoãn bao lâu sau khi kích hoạt để có được kết quả đọc tốt nhất.
  3. phải mất một vài chu kỳ để quá trình chuyển đổi ADC hoàn tất, điều đó có nghĩa là chúng tôi không thể kích hoạt nhanh trên bàn phím.
  4. có thể có tiếng ồn trong chính bàn phím.
  5. Vân vân…

Vì vậy, mặc dù chúng tôi đã cố gắng để bàn phím hoạt động và giờ đây chúng tôi có thể sử dụng nó trong các ứng dụng bằng cách sử dụng các giá trị nhấn phím theo một số cách khác thay vì chỉ xuất chúng ra màn hình máy phân tích, nhưng nó không chính xác lắm và rất khó chịu. Đó là lý do tại sao tôi nghĩ rằng cách tốt nhất để kết nối bàn phím chỉ đơn giản là gắn mỗi đầu ra từ bàn phím vào một cổng khác nhau và quyết định phím nào được nhấn bởi cổng nào thấy điện áp. Điều đó thật dễ dàng, rất nhanh và rất chính xác.

Trên thực tế, chỉ có hai lý do tại sao người ta muốn điều khiển bàn phím theo cách chúng tôi đã làm ở đây:

  1. Nó chỉ sử dụng 2 trong số các chân trên bộ vi điều khiển của chúng tôi thay vì 8 chân.
  2. Đó là một dự án tuyệt vời để hiển thị các khía cạnh khác nhau của ADC trên vi điều khiển, khác với những thứ tiêu chuẩn mà bạn có thể tìm thấy ở đó như số đọc nhiệt độ, chiết áp xoay, v.v. Tôi muốn một ví dụ về các phép đọc đơn lẻ được kích hoạt và tự động kích hoạt chân cắm bên ngoài thay vì chỉ chạy chế độ ngốn CPU miễn phí.

Dù sao, đây là một vài bài tập cuối cùng dành cho bạn:

Bài tập 6: Viết lại trình xử lý ngắt hoàn chỉnh chuyển đổi ADC để sử dụng Bảng tra cứu. I E. Vì vậy, nó kiểm tra giá trị tương tự với mục đầu tiên trong bảng và nếu nó lớn hơn, nó trả về từ ngắt, nếu không thì nó tăng Z đến mục tiếp theo trong bảng và rẽ nhánh trở lại kiểm tra một lần nữa. Điều này sẽ rút ngắn mã và dọn dẹp thói quen ngắt và làm cho nó trông đẹp hơn. (Tôi sẽ đưa ra một giải pháp khả thi ở bước tiếp theo) Bài tập 7: Nối bàn phím của bạn với 8 chân trên bộ vi điều khiển và viết trình điều khiển đơn giản cho nó và trải nghiệm xem nó đẹp hơn bao nhiêu. Bạn có thể nghĩ ra một vài cách để làm cho phương pháp của chúng tôi hoạt động tốt hơn không?

Đó là tất cả cho hướng dẫn này. Tôi đã đính kèm phiên bản cuối cùng với các con trỏ. Khi chúng ta tiến gần hơn đến mục tiêu cuối cùng của mình, chúng ta sẽ sử dụng bàn phím một lần nữa trong Hướng dẫn 9 để chỉ ra cách điều khiển bảy màn hình phân đoạn với nó (và xây dựng một cái gì đó thú vị bằng cách sử dụng các phím phụ trên bàn phím điện thoại) và sau đó chúng ta sẽ Thay vào đó, hãy chuyển sang điều khiển mọi thứ bằng cách nhấn nút (vì phương pháp đó phù hợp hơn với sản phẩm cuối cùng mà chúng tôi đang xây dựng với các hướng dẫn này) và chúng tôi sẽ chỉ bỏ qua bàn phím.

Hẹn gặp lại các bạn trong lần sau!

Đề xuất: