Mục lục:

Công tắc đọc với ATtiny2313: 9 bước
Công tắc đọc với ATtiny2313: 9 bước

Video: Công tắc đọc với ATtiny2313: 9 bước

Video: Công tắc đọc với ATtiny2313: 9 bước
Video: LÀM REMOTE ĐIỀU KHIỂN VOLUME AMPLI BẰNG ATTINY 13 ( PHẦN 2 HOÀN THIỆN) 2024, Tháng mười một
Anonim
Công tắc đọc với ATtiny2313
Công tắc đọc với ATtiny2313

Đã có một số Bảng hướng dẫn xử lý đầu ra từ ATtiny2313 và các thiết bị AVR tương tự. Ví dụ: https://www.instructables.com/id/Ghetto-Programming%3a-Getting-started-with-AVR-micro/, https://www.instructables.com/id/Drive-a-Stepper- Động cơ có-AVR-Vi xử lý /. Làm việc trên cái mới nhất từ The Real Elliot, cho thấy cách điều khiển động cơ bước, tôi thấy rằng sẽ thực sự hữu ích nếu có thể chạy các phần mã thay thế trong cùng một chương trình để tôi không phải lập trình lại ATtiny2313 từng thời gian tôi muốn thử một biến thể mã nhỏ (chẳng hạn như nửa bước hoặc chạy ngược lại bước). Mặc dù có thể dễ dàng viết mã bằng cách sử dụng câu lệnh switch / case để cho phép lựa chọn các biến thể thay thế, nhưng cần có một số cách chọn trường hợp. Điều đó có nghĩa là một số loại thiết bị đầu vào phải được đọc để kiểm soát trường hợp. May mắn thay, ATtiny2313 có rất nhiều chân I / O và được thiết kế tốt để đọc đầu vào từ các công tắc. Có thể hướng dẫn này sẽ chỉ ra cách đọc đầu vào và đưa ra quyết định dựa trên trạng thái của chúng. Vì chỉ điều đó thôi sẽ tạo ra một Hướng dẫn khá nhàm chán, tôi sẽ giải thích một cách đơn giản về cách sử dụng khả năng hẹn giờ / bộ đếm của ATtiny2313 để điều khiển một chiếc loa nhỏ như một tiếng bíp. Cũng sẽ có một sai sót nhỏ về các kỹ thuật gỡ lỗi đơn giản.

Bước 1: Thiết bị đầu vào

Thiết bị đầu vào
Thiết bị đầu vào
Thiết bị đầu vào
Thiết bị đầu vào

Có thể giảng dạy này được xây dựng dựa trên tác phẩm xuất sắc của The Real Elliot và sử dụng hệ thống phát triển ATtiny2313 Ghetto mà ông mô tả. Bảng dữ liệu ATtiny2313 từ Atmel là tài liệu tham khảo cuối cùng cho tất cả các chức năng, nhưng nó không nhất thiết phải dễ đọc. https://www.atmel.com/dyn/products/datasheets.asp?family_id=607 (Liên kết có tất cả các trang dữ liệu AVR, xác định vị trí 2313.) Hình vẽ cho thấy một bộ chuyển mạch đầu vào đơn giản. Đây chỉ đơn giản là một gói gồm bốn công tắc bật / tắt; còn được gọi là công tắc ném đơn, đơn cực (SPST). Thông thường, một kết nối, hoặc cực, của mỗi công tắc được gắn với đất trong khi kết nối còn lại được kéo lên cao thông qua một điện trở hạn chế dòng điện (10K hoặc hơn). Một đầu vào vi điều khiển được kết nối với cực với điện trở. Nếu công tắc mở, bộ vi điều khiển sẽ đọc đầu vào là HI. Nếu công tắc được đóng, bộ vi điều khiển sẽ đọc LO đầu vào. Tham khảo sơ đồ để biết thêm chi tiết. ATtiny2313 đơn giản hóa mọi thứ bằng cách cung cấp các điện trở kéo lên có thể lập trình trên các chân I / O khi chúng được cấu hình làm đầu vào. Điều này có nghĩa là các thiết bị chuyển mạch chỉ có thể có một cực được gắn với đất (LO) và cực còn lại được kết nối với đầu vào của bộ xử lý. Ví dụ đầu tiên chỉ hiển thị hai công tắc. Các công tắc được đọc và cấu hình bằng mã sau. Định cấu hình các công tắc làm đầu vào: (Không cần mã; đây là mã mặc định.) Bật điện trở kéo lên: PORTB = _BV (PB0) | _BV (PB1); Đọc đầu vào: but1 = ~ PINB & 0x03; Lưu ý sử dụng đảo ngược và che để nhận được giá trị chính xác.

Bước 2: Đèn nháy cho tín hiệu

Chúng tôi sẽ sử dụng hai công tắc này để nhấp nháy đèn LED một số lần có thể lập trình được. Đèn LED mà chúng tôi sẽ sử dụng sẽ là đèn nháy mà The Real Elliot đã nổi tiếng. Công tắc 1 và 2 sẽ được coi là hai chữ số nhị phân, vì vậy sự kết hợp có thể đại diện cho các số 0, 1, 2 và 3. Chương trình của chúng tôi sẽ đọc hai công tắc và nhấp nháy đèn LED số lần thích hợp, nhưng chỉ khi công tắc cài đặt đã thay đổi. Các công tắc được gỡ lỗi trong 500 mili giây (không được tối ưu hóa). Thuật toán gỡ lỗi khá đơn giản. Các công tắc được đọc và việc đọc được ghi chú. Nếu nó khác với giá trị oldBut (giá trị được lưu cuối cùng), thì chương trình sẽ bị trì hoãn trong 500 mili giây và các công tắc sẽ được đọc lại. Nếu giá trị giống với giá trị đã đọc trước đó, giá trị của oldBut sẽ được cập nhật và đèn LED sẽ nhấp nháy số lần được ngụ ý bởi giá trị nhị phân của hai công tắc. Lưu ý sự đảo ngược của giá trị vì một công tắc "bật" đọc LO. Các công tắc sẽ được quét liên tục để có những thay đổi tiếp theo. Vui lòng tham khảo Tài liệu hướng dẫn trước đó của The Real Elliot để tìm hiểu thêm về đèn nháy. Hãy xem https://www.ganssle.com/debouncing.pdf này để tìm hiểu thêm về gỡ lỗi chuyển mạch. Đây là mã ATtiny2313 cho ví dụ này. Khi hoạt động, chương trình này sẽ nhấp nháy đèn LED trên PB4 (chân vật lý 8) hai lần để cho biết nó đã được khởi tạo. Sau đó, nó sẽ đọc các công tắc một và hai, và nhấp nháy một đến ba lần tùy thuộc vào cài đặt công tắc bất cứ khi nào chúng được thay đổi. Khi các công tắc không thay đổi, đèn LED sẽ nhấp nháy chậm. Để chạy mã này, hãy tạo một thư mục mới (gọi là "Cơ bản" nếu bạn thích) và tải xuống tệp mã C sau và tạo tệp vào đó. Đổi tên Makefile1.txt thành Makefile. Sử dụng WinAVR, biên dịch chương trình và tải nó vào ATtiny2313 của bạn.

Bước 3: Một vấn đề nhỏ về gỡ lỗi

Nếu bạn giống như tôi (và mọi lập trình viên khác trên thế giới), bạn có thể đã trải qua những thời điểm khi mã "không có lỗi" mà bạn đã nhập và biên dịch cẩn thận không làm được những gì bạn mong đợi. Có lẽ nó chỉ đơn giản là không làm gì cả! Vậy vấn đề là gì? Làm thế nào bạn sẽ tìm ra? May mắn thay, có một số cách tiếp cận để mọi thứ hoạt động hiệu quả. (Nhận cuốn sách này để xử lý tuyệt vời chủ đề gỡ lỗi. Http://www.debuggingrules.com/) Tôi muốn đưa ra một vài gợi ý đơn giản liên quan đến chủ đề gỡ lỗi các ứng dụng vi điều khiển. Bước một là xây dựng trên bạn biết gì. Nếu bạn đã có đèn nháy hoạt động một lần, thì hãy sử dụng lại nó để xem bạn đang ở đâu trong chương trình của mình. Tôi muốn có đèn LED nhấp nháy hai lần để báo hiệu bắt đầu chương trình. Bạn có thể đặt mã để thực hiện việc này ban đầu khi bắt đầu chương trình của mình. Khi bạn biết rằng không có gì sai với phần cứng của mình, hãy tạo một chức năng để thực hiện việc nhấp nháy. Đây là chức năng tôi sử dụng./*------------------------------------------ ------------------------------ ** flashEm - chức năng nhấp nháy LED sử dụng PD4 ** PD4 phải được định cấu hình làm đầu ra. ** ------------------------------------------------ --------------------- * / void flashEm (uint8_t count) {while (count> 0) {PORTD = _BV (PD4); _delay_ms (1000); PORTD = ~ _BV (PD4); _delay_ms (1000); đếm--; }} Bây giờ có thể sử dụng chức năng này tại các điểm khác nhau trong mã của bạn như một tín hiệu cho thấy mã đã thực thi cho đến nay. Biết mã đang chạy có nghĩa là bạn có thể kiểm tra cẩn thận từng phần đã chạy, nhưng không thực hiện được những gì bạn mong đợi, để tìm lỗi. Thay đổi một thứ tại một thời điểm cũng là một kỹ thuật quan trọng để gỡ lỗi (được mô tả trong tài liệu tham khảo ở trên). Phương pháp cổ điển này hoạt động cùng với "phân chia và chinh phục": thực hiện các bước nhỏ để thêm chức năng tăng dần. Điều này có vẻ như là một cách tiếp cận chậm, nhưng nó không chậm bằng việc cố gắng gỡ lỗi một phần lớn mã không hoạt động cùng một lúc.

Bước 4: Gỡ lỗi thêm

Có nhiều lúc chúng ta muốn kiểm tra một phần mã bằng cách bỏ qua hầu hết các dòng trong đó, sau đó bật chúng lên từng dòng một khi chúng tôi xác minh từng dòng hoạt động. Thông thường, chúng tôi thực hiện việc này bằng cách "comment out" các dòng mà chúng tôi muốn bỏ qua. Một phần mở rộng của kỹ thuật này là cắt và dán một khối mã, bình luận bản gốc (để chúng ta không làm mất nó), và lấy đi bản sao. Có bốn cách dễ dàng để bình luận dòng. Đặt "//" trước một dòng sẽ nhận xét ra dòng đó. Việc kết hợp một hoặc nhiều dòng trong "/ *" và "* /" sẽ nhận xét ra toàn bộ phần. Để phương pháp này hoạt động hiệu quả, không được có dấu "* /" nào khác trong khối mã (ngoài phần cuối). Vì vậy, một kỷ luật hiệu quả là sử dụng // cho các nhận xét trong các khối mã và dành riêng cấu trúc / * * / cho các khối nhận xét và để nhận xét các phần của mã. và kết thúc phần bằng "#endif". Có thể kiểm soát chọn lọc hơn bằng cách sử dụng "#ifdef (mã định danh)" ở đầu khối và "#endif" ở cuối. Nếu bạn muốn khối được biên dịch, hãy sử dụng "#define (mã định danh)" trước đó trong chương trình. Lưu ý rằng các dấu ngoặc kép chỉ để nhấn mạnh và không được đưa vào. Việc kết hợp các kỹ thuật này sẽ cung cấp một cách tiếp cận hữu ích để gỡ lỗi các chương trình ATtiny2313 của bạn. Bạn có thể thấy những công cụ này hữu ích khi chúng tôi tiến hành thông qua Có thể hướng dẫn này.

Bước 5: Sử dụng Bộ hẹn giờ / Bộ đếm 0 cho tiếng bíp

Sử dụng Hẹn giờ / Bộ đếm 0 cho tiếng bíp
Sử dụng Hẹn giờ / Bộ đếm 0 cho tiếng bíp

ATtiny2313 có hai tài nguyên bộ đếm / bộ đếm thời gian mạnh mẽ: một 8-bit và một 16-bit. Chúng có thể được cấu hình như bộ tạo tần số, bộ điều khiển điều chế độ rộng xung thay đổi và thanh ghi so sánh đầu ra. Chức năng đầy đủ của chúng được mô tả trong 49 trang của bảng dữ liệu. Tuy nhiên, chúng tôi sẽ sử dụng một trường hợp đơn giản. Chỉ Bộ định thời / Bộ đếm 0 (bộ 8-bit) sẽ được sử dụng và nó sẽ được sử dụng đơn giản như một bộ tạo tần số. Tần số sẽ được chuyển đến một loa nhỏ để tạo ra tiếng bíp. Bộ định thời / Bộ đếm 0 được mô tả đầy đủ trong các trang 66 đến 83 của bảng dữ liệu ATtiny2313. Đọc kỹ tài liệu này sẽ cung cấp cho người dùng sự hiểu biết đầy đủ về Thời gian / Bộ đếm 0. Thật may mắn, một chế độ khá đơn giản, Clear Timer on Compare (CTC), là tất cả những gì cần thiết để tạo ra âm bíp mà chúng ta muốn.

Đối với chế độ chúng tôi sẽ sử dụng, hoạt động của Bộ đếm thời gian / Bộ đếm là thẳng tiến. Khi một tín hiệu đồng hồ được chọn, bộ đếm bắt đầu từ 0 và tăng từng xung đồng hồ. Khi giá trị của bộ đếm đạt đến giá trị trong Thanh ghi So sánh Đầu ra (TOP), bộ đếm sẽ đặt lại về 0 và bắt đầu đếm lại. Bit đầu ra được liên kết với Bộ định thời / Bộ đếm được chuyển đổi để tạo ra đầu ra sóng vuông. Điều này trực tiếp thúc đẩy bộ chuyển đổi âm thanh tạo ra âm thanh bíp. Một bộ chuyển đổi âm thanh TDK nhỏ tạo ra tiếng bíp. Một đơn vị phù hợp là Digikey 445-2530-ND, TDK SD1209T3-A1 (Tôi đã sử dụng phiên bản đầu của cái này). Đây là phiên bản 3 volt; phiên bản 5 volt cũng sẽ hoạt động mà tôi mong đợi. Tôi lái nó trực tiếp ra khỏi cổng đầu ra của Attiny2313 và nó có vẻ hoạt động tốt. Sparkfun có một thiết bị tương tự.

Bước 6: Cấu hình bộ hẹn giờ / bộ đếm 0

Chế độ CTC có thể được sử dụng để chuyển đổi đầu ra OC0A trên Chân 2, Cổng B (chân vật lý 14). Để kích hoạt đầu ra trên chân này, DDRB phải được thiết lập thích hợp. Mã C cho điều này giống như thiết lập đầu ra cho đèn nháy. DDRB = _BV (PB2); // Cổng B2 là đầu ra, bước tiếp theo là cung cấp tín hiệu đồng hồ và tải thanh ghi so sánh đầu ra để tạo ra dạng sóng dưới dạng tần số. Phương trình cho tần số kết quả được đưa ra trong bảng dữ liệu (trang 72). Các thuật ngữ trong phương trình sẽ được mô tả bên dưới. Đây là phương trình: fOC0A = fclk_I / O / 2 * N * (1 + OCR0A) Trong đó fOC0A: = tần số đầu ra fclk_I / O: = tần số nguồn đồng hồ N: = hệ số tỷ lệ đồng hồ OCR0A: = giá trị trong thanh ghi so sánh đầu ra cho Bộ định thời / Tần số nguồn của bộ đếm 0A. Clock Source, fclk_I / O Đây là tần số của xung nhịp hệ thống. Giá trị mặc định là 1MHz. Các bit CS00, CS01 và CS02 của TCCR0B kiểm soát lựa chọn này. Vì các bit này cũng chọn giá trị của N nên nó sẽ được mô tả tiếp theo. Các bit CS00, CS01 và CS02 của TCCR0B kiểm soát lựa chọn này. Bảng 41 trên trang 81 của bảng dữ liệu ATtiny2313 mô tả các kết hợp. Vì tần số gần 1kHz là mong muốn, các bit CS00 và CS01 của TCCR0B sẽ được đặt. Lưu ý rằng việc đặt tất cả ba bit thành 0, do đó không chọn nguồn đồng hồ, sẽ dừng đầu ra một cách hiệu quả. Đây là phương thức sẽ được sử dụng để bắt đầu và dừng tiếng bíp. Giá trịOP, OCR0 Giá trị này là giá trị TOP cho bộ đếm được tải vào thanh ghi so sánh đầu ra cho bộ định thời / bộ đếm 0A. Khi đạt đến giá trị này, bộ đếm sẽ được đặt lại về 0 và việc đếm sẽ bắt đầu lại cho đến khi đạt đến TOP và chu kỳ lặp lại. TOP dễ dàng sửa đổi, do đó tần số của tiếng bíp rất dễ thay đổi. Vì tần số gần 1kHz là mong muốn, nên TOP được đặt thành 7. (Lưu ý rằng bộ đếm trước có thể được đặt thành 8 và TOP được đặt thành 63. Kết quả tương tự - lựa chọn của bạn.) Tần số đầu ra, fOC0A Sử dụng phương trình để tính toán kết quả tần số đầu ra trong: fOC0A = 1, 000, 000/2 * 64 * (1 + 7) fOC0A = 977HzĐóng đủ! Đây là mã để tải thanh ghi so sánh đầu ra và thanh ghi điều khiển bộ đếm thời gian 0B. Vui lòng xem mã chương trình thực tế để hiểu cách chúng được sử dụng. OCR0A = 7; // Giá trị thời gian TCCR0B = _BV (CS01) | _BV (CS00); // Chọn đồng hồ bên trong & prescale = 8 TCCR0B = 0; // không có nguồn đồng hồ nào tắt âm báo Cài đặt Chế độ Thời gian / Bộ đếm Là chi tiết cuối cùng, chúng tôi sẽ chỉ định chế độ Bộ định thời / Bộ đếm mà chúng tôi mong muốn bằng cách đặt các bit thích hợp trong Thanh ghi Điều khiển Bộ định thời / Bộ đếm 0A. Chế độ CTC được chọn bằng cách cài đặt bit WGM01 như được mô tả trong Bảng 40, trang 79 của bảng dữ liệu. Vì chúng ta muốn đầu ra chuyển đổi mỗi chu kỳ, bit COM0A0 cũng cần được thiết lập như mô tả trong Bảng 34 trên trang 77. Đây là mã: TCCR0A = _BV (COM0A0) | _BV (WGM01); // Chế độ chuyển đổi CTC

Bước 7: Sử dụng bốn công tắc

Khi chúng tôi triển khai tiếng bíp, hãy mở rộng phần cứng và phần mềm của chúng tôi để xử lý bốn công tắc. Vì đầu ra của Bộ đếm hẹn giờ 0A nằm trên Cổng B, chân 2, chúng ta không thể chỉ cần nối thêm các thiết bị chuyển mạch tuần tự đến Cổng B. Một giải pháp dễ dàng là sử dụng Cổng D, nhưng hãy giữ cổng đó có sẵn cho các chức năng khác (có lẽ một động cơ bước). Vì vậy, hãy kết nối các công tắc bổ sung cho PB3 và PB4. Việc đọc các công tắc hầu như không thay đổi. Giá trị mặt nạ được thay đổi thành 0x1B (00011011 nhị phân) thành mặt nạ bit 2 cùng với 5, 6 và 7. Một thủ thuật khác được sử dụng để tạo số nhị phân 4 bit. Chuyển các bit 3 và 4 sang phải một bit và kết hợp chúng với các bit 0 và 1 thành một số nhị phân 4 bit. Đây là cú pháp C tiêu chuẩn để chuyển và kết hợp các bit, nhưng có thể người mới làm quen chưa biết rõ. but1a = (but1 & 0x03) | ((but1 & 0x18) >> 1); // but1 có chuyển đổi readIn hoạt động, chương trình sẽ nhấp nháy hai lần và bíp hai lần để báo hiệu khởi tạo. Bất cứ khi nào các công tắc được thay đổi, số mà chúng đại diện sẽ phát ra tiếng bíp. Khi các công tắc không thay đổi, đèn LED sẽ nhấp nháy. Để chạy mã này, hãy tạo một thư mục mới (gọi là Bíp nếu bạn thích) và tải xuống tệp mã C sau và tạo tệp vào đó. Đổi tên Makefile2.txt thành Makefile. Sử dụng WinAVR, biên dịch chương trình và tải nó vào Attiny2313 của bạn.

Bước 8: Sử dụng Switch / case Construct

Bước cuối cùng là "chỉ là phần mềm": Như đã hứa, chúng tôi sẽ triển khai cấu trúc switch / case. Mặc dù ví dụ này chỉ hiển thị hai hành động thay thế, nhưng phải rất rõ ràng cách sử dụng cấu trúc này để chọn một trong một số phần mã thay thế. Khi hoạt động, chương trình này giám sát các công tắc và nếu có thay đổi, nó sẽ phát ra tiếng bíp về số thích hợp nếu nó là số lẻ; nó sẽ nhấp nháy nếu số chẵn. Nó không làm gì trừ khi một công tắc thay đổi.

Để chạy mã này, hãy tạo một thư mục mới (gọi nó là Switch nếu bạn thích) và tải xuống tệp mã C sau và makefile vào đó. Đổi tên Makefile3.txt thành Makefile. Sử dụng WinAVR, biên dịch chương trình và tải nó vào Attiny2313 của bạn.

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

Phần kết luận
Phần kết luận

À chính nó đấy! Bây giờ bạn biết cách sử dụng công tắc để kiểm soát việc thực thi chương trình của mình bằng cách đọc chúng và chọn một hành động dựa trên cài đặt công tắc. Bạn cũng biết cách tạo ra tiếng bíp và cũng đã học được một số chiến lược gỡ lỗi.

Nếu bạn muốn kiểm tra sự hiểu biết của mình, hãy thử sửa đổi chương trình cuối cùng thành tiếng bíp ở âm vực cao nếu chẵn, bíp một nốt trầm nếu lẻ và nhấp nháy đèn LED liên tục nếu không có thay đổi trong các công tắc. quay lại phần gỡ lỗi để được trợ giúp.

Đề xuất: