Khi IO bị giới hạn trên một uC, làm thế nào để bạn di chuyển logic ra khỏi uC?


8

Chẳng hạn, nếu bạn có một Arduino với 4 chân IO kỹ thuật số, làm thế nào bạn có thể thắp sáng độc lập> 4 đèn LED, hoặc đọc trạng thái của> 4 nút?


Bạn hỏi về PIC trong tiêu đề, và sau đó tham khảo một Arduino!
Leon Heller

2
@LeonHeller: Sau đó yêu cầu làm rõ và / hoặc tự chỉnh sửa câu hỏi. Mặc dù trong trường hợp này, người ta chỉ có thể phụ "uC" cho PIC / Arudino.
Chris Laplante

2
Tôi đồng ý phần cứng là rẻ hơn để duy trì.
jippie

3
@jippie - Và sau đó, người trả lời đam mê là: "Bạn gái là gì?" :-)
stevenvh

1
Tôi sẽ đề nghị xem xét lại câu trả lời được chấp nhận của bạn. Ignacio's không chính xác (có ba tín hiệu chứ không phải hai), ví dụ của Bruno hoàn chỉnh hơn (ví dụ Ignacio không đề cập đến đầu vào) có một giải pháp ban đầu để lưu một pin phụ.
stevenvh

Câu trả lời:


4

Một thanh ghi thay đổi, chẳng hạn như 74595 sẽ cho phép bạn có nhiều đầu ra chỉ với 2 kết nối: pin dữ liệu và pin đồng hồ. Bạn đặt chân dữ liệu thành giá trị tiếp theo bạn muốn di chuyển vào thanh ghi, sau đó xung pin đồng hồ.


Thật tuyệt. Vì vậy, tôi đã đọc nó và chỉ để làm rõ, với một trong số đó tôi có thể có 8 đầu ra chạy từ việc sử dụng tối đa 2 chân arduino? Tôi cho rằng tôi không thể sử dụng chúng làm đầu vào quá?
cheesysam

3
@cheesysam - "Với hai bạn có thể có 16 đầu ra. Với ba, 24, v.v.". Điều đó không đúng. Bạn cần 3 chân: dữ liệu, đồng hồ và chốt, bất kể bạn muốn kết nối bao nhiêu thiết bị. Câu trả lời của Bruno chính xác hơn. Ngoài ra, đừng nói về 74595, đó là công nghệ TTL nguyên bản, đã bị chết và bị chôn vùi trong nhiều thập kỷ. Bạn muốn 74HC595.
stevenvh

1
@stevenvh: "... với một trong những đầu ra tôi có thể có 8 đầu ra ...". Ngoài ra, bạn có chắc họ không muốn 74AC595? 74F595? 74LVX595?
Ignacio Vazquez-Abrams

1
@Ignacio - "với hai .." thật khó hiểu, có thể được đọc là "với hai I / Os", giống như tôi đã làm. Lấy làm tiếc. 74F595? Đối với xung nhịp bởi bộ điều khiển 16 MHz? Tôi không nghĩ vậy. 74F rất ngốn điện và tốc độ không mang lại cho bạn bất kỳ lợi ích nào. 74LVX chỉ có 3,3 V, vì vậy không có giao diện với Arduino. Có gì sai với 74HC? Đó là gia đình logic tiêu chuẩn.
stevenvh

2
"Có gì sai với 74HC?" Hoàn toàn không có gì. Có gì sai khi bỏ qua "XX"?
Ignacio Vazquez-Abrams

7

Bruno đã trả lời tốt, nhưng tôi muốn ghi lại một vài điều.

Khét tiếng 70 mA
Các 74HC595 thường được sử dụng như I / O mở rộng, và như thường được sử dụng để kiểm soát một loạt các đèn LED. Những gì thường bị bỏ qua là bạn có thể vận hành nó ra khỏi spec theo cách này. Bảng dữ liệu nói rằng tổng nguồn cung hiện tại không được lớn hơn 70 mA, Xếp hạng tối đa tuyệt đối (AMR), vì vậy bạn nên tránh xa điều đó bằng một số lợi nhuận. Do đó, 8 đèn LED ở 10 mA là quá nhiều và ở 20 mA, bạn sẽ vượt quá AMR không dưới 130%! Giới hạn có thể là do công suất hiện tại của các dây liên kết, và khi đó dòng điện quá cao có thể không chỉ làm giảm hiệu suất của bộ phận, mà còn khiến nó bị hỏng vĩnh viễn nếu dây đó bị đứt.

Nhưng đêm qua tôi thức dậy vì tôi có An Idea . Giới hạn 70 mA dành cho cả Icc và dòng điện mặt đất, vậy tại sao không chia tổng số của chúng tôi hoặc 80 mA và để Icc có một nửa của nó và dòng điện mặt đất nửa còn lại? Tất cả những gì bạn phải làm là tham chiếu 4 đèn LED xuống đất (hoạt động ở mức cao) và 4 đến Vcc khác (hoạt động ở mức thấp). Sau đó, hiện tại của trước đây đến từ Icc, hiện tại của những người khác đi xuống đất. Bạn sẽ có thể sử dụng đèn LED 15 mA theo cách này. (Thật đơn giản đến nỗi tôi cảm thấy mình như một thằng ngốc không nghĩ đến điều đó sớm hơn.)

Đồng hồ kết hợp
tôi nghĩ Bruno đã lưu một pin I / O bổ sung bằng cách kết hợp đồng hồ của người đăng ký thay đổi với chốt. Có vẻ như tôi đã giải thích sai câu trả lời của anh ấy. Tôi vẫn muốn mở rộng về tùy chọn này.

Điều gì xảy ra sau đó? Bảng trên trang 5 của biểu dữ liệu cho biết:

nội dung của thanh ghi ca chuyển qua; nội dung trước đó của thanh ghi thay đổi được chuyển sang thanh ghi lưu trữ và các giai đoạn đầu ra song song

(đánh dấu bằng tôi)
Vì vậy, đó không phải là dữ liệu mới mà là dữ liệu trước đó đang được chốt. Không phải là một vấn đề thực sự, chỉ cần đảm bảo thay đổi một bit giả để thêm dữ liệu cuối cùng, hoặc mọi thứ sẽ sai một pin.

Kết hợp đồng hồ cũng có nghĩa là các đầu ra sẽ chuyển đổi mọi lúc trong khi bạn chuyển dữ liệu mới vào. Chức năng của chốt thực sự là để tránh điều đó. Trong nhiều trường hợp, điều này sẽ không thành vấn đề, nếu bạn có thể làm nhanh, nhưng trong trường hợp xấu nhất bạn có thể nhận được các hiệu ứng không mong muốn. Trường hợp xấu nhất có thể là sử dụng 74HC595 để ghép một màn hình ở tần số quét rất cao + có chuỗi thanh ghi dịch chuyển rất dài + có tất cả 1 ngoại trừ một 0, đèn LED tắt + phòng tối. Vì đèn LED nhìn thấy tất cả 1 người đi qua thường xuyên trong một căn phòng tối, nó có thể phát sáng rất yếu.

Hoặc nếu bạn kết hợp ghép kênh tần số cao đó với đầu ra điều khiển rơle. Tất cả các số 0 và sau đó là 1 cho rơle có thể có nghĩa là đầu ra của rơle không đủ dài để kéo vào.

Cấp, đó là những trường hợp cực đoan, nhưng tôi sẽ giữ đồng hồ nối tiếp và chốt tách biệt bất cứ khi nào có thể nếu bạn muốn ghép kênh, hoặc nếu không có tốc độ cập nhật cao.


1
+1 ý tưởng tuyệt vời bạn đã có đêm qua! Chưa bao giờ thấy điều này được đề cập ở bất cứ đâu cho đến bây giờ. Mặt khác, tôi nghĩ rằng bạn đã giải thích sai câu trả lời của Bruno. Ông có nghĩa là kết hợp tín hiệu đồng hồ của 74XX595 và 74XX165 với nhau và kết hợp tín hiệu chốt của 74XX595 và 74XX165 với nhau.
m.Alin

@ m.Alin - Vâng, dường như tôi đã làm. Cảm ơn đã chỉ ra rằng. Tôi sẽ chỉnh sửa câu trả lời của mình, nhưng hãy để nó như một khả năng.
stevenvh

Tất nhiên, đó chắc chắn là một khả năng mà những người khác đã khuyến nghị. Thật đáng để giải quyết nó.
m.Alin

@ m.Alin - Tôi nghĩ lý do trước đây nó không được sử dụng là vì người dùng không biết về giới hạn 70 mA hoặc không quan tâm :-(. Bây giờ tôi đã rời khỏi văn phòng bằng sáng chế! ;-)
stevenvh

3
Trở lại đã. Văn phòng đã đóng cửa. Họ đều ở trong nhà thờ.
stevenvh

6

Tôi đồng ý với Ignacio về việc sử dụng 74XX595, đăng ký song song ra ngoài để mở rộng đầu ra, nhưng thực sự bạn sẽ cần 3 kết nối, một cho dữ liệu , một cho đồng hồ và một chốt cho phép sẽ chuyển dữ liệu từ thanh ghi dịch chuyển nội bộ đến các chốt đầu ra.

Sơ đồ 74LS595

Để mở rộng các đầu vào, bạn có thể sử dụng 74XX165, song song trong thanh ghi dịch chuyển ra nối tiếp, điều này sẽ cho phép có tối đa 8 nút trên mỗi 74XX165.

nhập mô tả hình ảnh ở đây

Điểm hay của phương pháp này là bạn có thể tạo chuỗi nhiều thanh ghi thay đổi cho phép tăng số lượng đầu vào hoặc đầu ra, và tốt hơn, bạn có thể kết hợp 74XX595 và 74XX165 cho phép và bạn có bất kỳ số lượng đầu vào hoặc đầu ra nào.

Bên cạnh đó, bạn có thể chia sẻ tín hiệu đồng hồ và chốt giảm số lượng kết nối cần thiết và đơn giản hóa rất nhiều phần mềm. Bằng cách này, bạn sẽ chỉ cần 4 kết nối cho bất kỳ số lượng nào của bất kỳ thanh ghi thay đổi này:

  • Đồng hồ (Được chia sẻ với tất cả các thanh ghi thay đổi)
  • Latch Enable (Được chia sẻ với tất cả các thanh ghi thay đổi)
  • Data In (Đã kết nối với đầu ra nối tiếp của thanh ghi dịch chuyển cuối cùng trong chuỗi)
  • Dữ liệu ra (Đã kết nối với đầu vào nối tiếp của thanh ghi dịch chuyển đầu tiên trong chuỗi)

Biên tập

Khi tôi đang tìm kiếm một sơ đồ, tôi tìm thấy trên trang web này một cách rất thông minh để giảm xuống còn 3 số lượng kết nối cần thiết. Nó bao gồm việc sử dụng cùng một pin cho đầu vào và đầu ra dữ liệu.

Phần mềm sẽ làm một cái gì đó như thế này cho mỗi xung đồng hồ:

  1. Định cấu hình pin làm đầu ra
  2. Đặt giá trị dữ liệu
  3. Gửi xung đồng hồ
  4. Định cấu hình pin làm đầu vào
  5. Đọc dữ liệu

Biểu đồ


1
Việc quan tâm quá mức có thể chỉ kiểm soát các chuỗi đầu ra của thanh ghi thay đổi như thế này với một chân đầu ra duy nhất, và có thể là các đầu ra đầu vào như đầu ra. Hỏi tôi làm sao tôi biết :-). Điều này đạt được bằng cách sử dụng độ trễ R / C trên dữ liệu và chốt, với đồng hồ được kết nối trực tiếp với chân đầu ra. Trình tự chính xác phụ thuộc vào cực kích hoạt cạnh tương đối cho đồng hồ và chốt nhưng chúng thường được thiết kế để hoạt động cùng nhau theo cách này.
Russell McMahon

Và như tôi đã nói trong câu trả lời của tôi, bạn có thể kết hợp cả hai đồng hồ, do đó bạn chỉ cần hai chân. Đó là một ý tưởng thông minh, nhưng tôi sẽ không nêu lên điều này lần thứ hai. Một lần là đủ :-)
stevenvh

Tôi không thấy sự cần thiết phải chuyển đầu ra cuối cùng của 74HC595 thành 74HC165. Bất cứ ai có thể giải thích điều này? Theo tôi hiểu, 16 xung đồng hồ sẽ đủ cho cả hai, đặt đầu ra của 2 x 74HC595 (16 đầu ra) và đọc đầu vào của 2 74HC165 (16 đầu vào), không có kết nối này.

@Dario: Có đầu ra cuối cùng từ nguồn cấp 74HC595 vào 74HC165 là cách "miễn phí" cho phép bộ điều khiển biết rằng chuỗi sẽ không dài hơn một độ dài nhất định để xác định chuỗi được kết nối và thời gian tồn tại . Nếu có thể chấp nhận đồng hồ ở mức thấp nhất là '595' khi khởi động và nếu '165 đầu tiên sẽ có ít nhất một mức đầu vào cao, mã thậm chí có thể xác định có bao nhiêu' 595 'và' 165 '.
supercat

5

Nick đề cập đến các bộ mở rộng I / O và chúng chắc chắn đáng để xem xét. Digikey liệt kê hơn một nghìn trong số họ, tôi sẽ chọn một cái có giao diện I2C làm ví dụ, vì điều đó đòi hỏi ít chân I / O nhất; tối thiểu hai.

NXP PCA9505 có 40 chân I / O có thể cấu hình, tương đương với năm 74HC595. Đó là một giải pháp đắt hơn một chút nhưng bạn có nhiều chức năng hơn cho điều đó:

  • Bất kỳ chân I / O nào cũng có thể được cấu hình làm đầu vào hoặc đầu ra
  • 100 kΩ pullups trên tất cả các chân I / O (PCA9506 không có pullups, có thể phù hợp với các ứng dụng năng lượng thấp)
  • Tất cả các đầu ra có thể chìm đồng thời 15 mA, với tổng số gói là 600 mA
  • Một đầu ra thay đổi gián đoạn làm cho việc quét liên tục các đầu vào trở nên thừa thãi
  • Chỉ có hai dây để kết nối với vi điều khiển.

Đọc thêm các bộ
mở rộng GPIO , tập tài liệu NXP tập dữ liệu
PCA9505


4

Đối với giải pháp không có thêm IC, bạn có thể sử dụng các kỹ thuật như Ghép kênhCharliplexing :

Ghép kênh (không có điện trở giới hạn hiện tại được hiển thị):

Đèn LED đa năng

Cách thức ghép kênh hoạt động khá đơn giản - trong ví dụ trên, nếu chúng ta muốn bật đèn LED1, chúng ta đặt chân C1 thành đầu ra cao và PIN R1 thành đầu ra thấp, tất cả các chân khác có thể cao hoặc Hi-Z (đặt thành đầu vào, cao trở kháng làm cho chúng trông "bị ngắt kết nối")
Nếu chúng ta muốn bật đèn LED5, chúng ta đặt chân C2 ở mức cao và R2 ở mức thấp.

Số lượng chân cần thiết để lái x đèn LED có thể được xử lý bằng 2n chân cho n² đèn LED, vì vậy, ví dụ với 16 đèn LED chúng ta cần (√16) * 2 = 8 chân.

Charlieplexing:

Charlieplexing

Bố cục sơ đồ thay thế (gọn gàng hơn) (được đề xuất bởi Supercat):

Charlieplexing 2

Điều này phức tạp hơn một chút, nhưng sử dụng ít chân hơn để điều khiển số lượng đèn LED cao hơn. Ví dụ, chúng ta chỉ có thể sử dụng 5 chân để lái 20 đèn LED như trong ví dụ trên (so với ít nhất 10 chân với ghép kênh ma trận "bình thường" (không bị nhầm lẫn với việc sử dụng IC trong trường hợp số lượng chân cần là log2 (ĐÊM).

Đối với một giải pháp bên ngoài, bạn có thể sử dụng những thứ như Thanh ghi Shift hoặc Bộ ghép kênh như 74HC595 và 74HC151.
Một thanh ghi thay đổi có một luồng dữ liệu đầu vào nối tiếp có đồng hồ và đầu ra song song (Nối tiếp song song SIPO) hoặc ngược lại (PISO)
Chúng thường có 8 đầu ra (hoặc đầu vào) nhưng bạn có thể xâu chuỗi bao nhiêu tùy thích để kéo dài nhiều thứ. Mặt trái là tốc độ bạn có thể cập nhật được chia cho số lượng đầu ra trên mỗi đầu vào (ví dụ: cho một thanh ghi 8 đầu ra, nếu bạn có đồng hồ đầu vào 8 MHz, bạn có thể cập nhật ở mức 1 MHz, cho 16 đầu ra 500kHz, v.v.)

Những kỹ thuật này có thể làm việc ngược lại cho đầu vào quá.


Câu trả lời này cho thấy cách sử dụng Charlieplexing cho các nút ấn đầu vào đa kênh: Electronics.stackexchange.com/a/37362/8627
jippie

Một cách dễ dàng hơn để vẽ màn hình Charlieplexed là chỉ cần vẽ nó dưới dạng lưới NxN với đường chéo không phổ biến.
supercat

@supercat - Tôi vừa lấy ví dụ đầu tiên từ hình ảnh google. Tôi vừa thêm một ví dụ khác - đây có phải là kiểu bố trí bạn muốn nói không?
Oli Glaser

@OliGlaser: Có, mặc dù tôi sẽ đề nghị di chuyển các điện trở đến các mối nối cột hàng. Nếu bạn làm điều đó, thì có thể lái chín đèn LED cùng một lúc, miễn là các trình điều khiển phía cao hoặc phía thấp có thể đáp ứng điều đó. Ngoài ra, người ta có thể để các điện trở ở vị trí của chúng nhưng thêm một bóng bán dẫn ở mỗi điểm nối cột hàng (đối với sơ đồ như được hiển thị, NPN với đế trên hàng, bộ phát trên cột và bộ thu được gắn vào đường ray dương ). Thêm bóng bán dẫn sẽ làm giảm đáng kể cường độ ổ đĩa phía cao cần thiết để vận hành chín đèn LED cùng một lúc.
supercat
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.