Phần cứng XOR cho các chân đầu ra trên vi điều khiển AVR

Bạn có biết rằng nhiều chip AVR có tùy chọn loại phần cứng hoặc (XOR) không tùy chọn khi nó liên quan đến mức logic của các chân đầu ra? Nếu bạn nhìn vào biểu dữ liệu (hình ảnh trên là ảnh chụp màn hình từ biểu dữ liệu Atiny13), bạn sẽ tìm thấy một phần trên chuyển đổi mã PIN. Nó chỉ ra rằng nếu bạn đặt một cổng làm đầu ra, hãy viết logic một đến thanh ghi pin tương ứng sẽ chuyển đổi mức logic nào đó. Điều này thực sự dễ dàng bỏ qua nếu bạn đang viết bằng C, nhưng tôi đã làm việc để học một chút ngôn ngữ trình biên dịch và thấy điều này rất hữu ích. Tiếp tục đọc sau giờ nghỉ và tôi sẽ cho bạn biết làm thế nào tôi xảy ra với thông tin này và những gì nó tốt cho.

Vì vậy, trước hết, hãy nói về lý do tại sao điều này không quan trọng lắm nếu bạn đang viết bằng mã C. Thông thường nếu bạn muốn chuyển một số chân đầu ra, bạn sẽ chỉ viết một lớp lót mà XOR với một bitmask:

1.
Portb ^ = 0xff;

Đây là một chút tốc ký C (tìm hiểu nhiều hơn về điều đó từ loạt bài hướng dẫn của tôi) thực hiện XOR trên các cấp đầu ra hiện tại và ghi kết quả trở lại cổng. Nhưng điều tương tự có thể được thực hiện trong phần cứng bằng cách viết bitmask vào thanh ghi PINB:

1.
Pinb = 0xff;

Bạn không thực sự quan tâm, bởi vì đó chỉ là một dòng mã. Trong thực tế, nó có thể đơn giản hơn với XOR PORTB vì nó có ý nghĩa nhiều hơn về mặt khái niệm. Nhưng trình biên dịch có thể kết thúc bằng cách sử dụng nhiều chu kỳ hơn nếu bạn đã viết cho thanh ghi pin.

Tôi đã xảy ra trên tính năng này vì tôi đã chớp mắt một số đèn LED như một cách để học trình biên dịch. Tôi đã có mã Lumble của mã trong một thói quen dịch vụ ngắt:

1.
2.
3.
4
ldi myreg, 0xff
trong intreg, portb
eor intreg, myreg
Out Portb, Intreg

Nó tải một bitmask vào một thanh ghi, tải trong logic hiện tại từ portb đến một thanh ghi khác, thực hiện XOR của hai và ghi kết quả trở lại PORTB. Điều này mất bốn chu kỳ và yêu cầu hai thanh ghi. Bits toggling là một hoạt động thô sơ Tôi đã rất ngạc nhiên, không có lệnh nào cho Xor Bits trực tiếp nên tôi bắt đầu tìm kiếm xung quanh. Tôi đã xem qua bài viết ngắn này tại AVR Freaks làm tôi tính năng chuyển đổi bit. Bây giờ tôi đã có thể giảm mã trình biên dịch của mình như sau:

1.
2.
LDI Intreg2, 0xFF; Temperity Sử dụng Intreg2 như một mặt nạ bit
ra pinb, intreg2; viết vào pinb hiệu ứng thực hiện độc quyền hoặc trên portb

Điều này dẫn đến cùng hiệu ứng bật tắt, nhưng chỉ mất hai chu kỳ và yêu cầu sử dụng chỉ một thanh ghi.

Những gì tôi tìm thấy nhiều thú vị là bất kể tôi sử dụng bao nhiêu chip AVR, không bao giờ thiếu những bất ngờ đang chờ đợi trong bảng dữ liệu.

Posted in Uncategorized

Leave a Reply

Your email address will not be published. Required fields are marked *