Quando o IO é limitado em um UC, como você afasta a lógica do UC?


8

Por exemplo, se você tivesse um Arduino com 4 pinos de E / S digital, como você poderia acender independentemente> 4 LEDs ou ler o estado de> 4 botões?


Você pergunta sobre PICs no título e depois se refere a um Arduino!
Leon Heller

2
@LeonHeller: Peça esclarecimentos e / ou edite a pergunta você mesmo. Embora, neste caso, alguém possa apenas sub "uC" para PIC / Arudino.
precisa saber é o seguinte

2
Concordo que o hardware é mais barato de manter.
jippie

3
@jippie - E então a resposta nerd é: "O que é uma namorada?" :-)
stevenvh 19/08/2012

1
Sugiro reconsiderar sua resposta aceita. O de Ignacio está incorreto (há três sinais, não dois), o de Bruno é mais completo (Ignacio não menciona entrada, por exemplo) e possui uma solução original para salvar um pino extra.
precisa saber é o seguinte

Respostas:


4

Um registro de deslocamento como o 74595 permitirá que você tenha muitas saídas com apenas 2 conexões: um pino de dados e um pino de relógio. Você define o pino de dados para o próximo valor que deseja mover para o registrador e depois pressiona o pino do relógio.


Isso é ótimo. Então, eu li sobre isso e só para esclarecer, com um desses eu posso ter 8 saídas usando 2 pinos do arduino? Presumo que não posso usá-los como entradas também?
cheesysam

3
@cheesysam - "Com dois, você pode ter 16 saídas. Com três, 24 e assim por diante". Isso não está correto. Você precisa de 3 pinos: dados, relógio e trava, não importa quantos dispositivos você deseja conectar. A resposta de Bruno é mais precisa. Além disso, não fale sobre o 74595, que é a tecnologia TTL original, que está morta e enterrada há décadas. Você quer o 74HC595.
precisa saber é

1
@stevenvh: "... com um desses eu posso ter 8 saídas ...". Além disso, você tem certeza de que eles não querem o 74AC595? 74F595? 74LVX595?
Ignacio Vazquez-Abrams

1
@ Ignacio - "with two .." é confuso, como pode ser lido como "with two I / Os", como eu fiz. Desculpa. 74F595? Para clock por um controlador de 16 MHz? Acho que não. O 74F consome muita energia e a velocidade não oferece nenhum benefício. O 74LVX possui apenas 3,3 V, portanto, não faz interface com o Arduino. O que há de errado com 74HC? É a família lógica padrão.
stevenvh

2
"O que há de errado com 74HC?" Absolutamente nada. O que há de errado em omitir o "XX"?
Ignacio Vazquez-Abrams

7

Bruno deu uma boa resposta, mas eu gostaria de fazer algumas anotações.

Os infames 70 mA
O 74HC595 é freqüentemente usado como E / S estendido e também para controlar uma série de LEDs. O que geralmente é esquecido é que você pode operá-lo fora das especificações dessa maneira. A folha de dados diz que a corrente total de suprimento não deve ser superior a 70 mA, AMR (Absolute Maximum Ratings), portanto é melhor ficar longe disso por alguma margem. Portanto, 8 LEDs a 10 mA são demais e a 20 mA você excederá a AMR em nada menos que 130%! O limite provavelmente se deve à capacidade atual dos fios de ligação, e a corrente muito alta pode não apenas deteriorar o desempenho da peça, mas colocá-la permanentemente fora de ordem se esse fio quebrar.

Mas ontem à noite acordei porque tinha uma idéia . O limite de 70 mA vale tanto para Icc quanto para a corrente de terra; então, por que não dividir nosso total ou 80 mA e deixar a Icc ter metade dele e a corrente de terra na outra metade? Tudo o que você precisa fazer é referenciar 4 dos LEDs ao terra (ativo alto) e os outros 4 a Vcc (ativo baixo). Então a corrente do primeiro vem de Icc, a corrente dos outros cai no chão. Você poderá usar LEDs de 15 mA dessa maneira. (É tão simples que me sinto um idiota por não ter pensado nisso antes.)

Os relógios combinados que
eu pensei que Bruno salvaram um pino de E / S extra combinando o relógio do registrador de turnos com o da trava. Parece que eu interpretei mal sua resposta. Eu ainda quero expandir essa opção.

O que acontece depois? A tabela na página 5 da folha de dados diz:

o conteúdo do registro de turno mudou; o conteúdo anterior do registro de deslocamento é transferido para o registro de armazenamento e os estágios de saída paralela

(destacando por mim)
Portanto, não são os novos dados, mas os anteriores que estão sendo travados. Não é um problema real, certifique-se de mudar um bit extra para trancar os últimos dados, ou tudo estará errado.

Combinar os relógios também significa que as saídas alternarão o tempo todo enquanto você estiver transferindo novos dados. A função da trava era realmente evitar isso. Em muitos casos, isso não será um problema, se você puder fazê-lo rapidamente, mas, na pior das hipóteses, poderá obter efeitos indesejados. O pior caso seria usar o 74HC595 para multiplexar um monitor com uma frequência de varredura muito alta + ter uma cadeia muito longa de registros de turno + ter todos os 1s, exceto um 0, um LED apagado + uma sala escura. Como esse LED vê todos os 1s passando de vez em quando em uma sala escura, pode acender muito levemente.

Ou se você combinar essa multiplexação de alta frequência com uma saída de controle de relé. Todos os zeros e depois 1 para o relé podem significar que a saída do relé não é longa o suficiente para ser puxada.

É verdade que são casos extremos, mas eu manteria o relógio serial e de trava separados sempre que possível, se você quiser multiplexar ou se tiver altas taxas de atualização.


1
+1 Ótima idéia que você teve ontem à noite! Nunca vi isso mencionado em lugar nenhum até agora. Por outro lado, acho que você interpretou mal a resposta de Bruno. Ele quis dizer combinar o sinal de relógio do 74XX595 e 74XX165 juntos e combinar o sinal de trava do 74XX595 e 74XX165 juntos.
usar o seguinte comando

@ m.Alin - Sim, parece que eu fiz. Obrigado por apontar isso. Vou editar minha resposta, mas deixo como uma possibilidade.
precisa saber é o seguinte

Claro, é definitivamente uma possibilidade que outros recomendaram. Vale a pena abordar isso.
m.Alin

@ m.Alin - Eu acho que a razão pela qual ela não foi usada antes é que os usuários não sabiam do limite de 70 mA ou não se importavam :-(. Estou agora no escritório de patentes! ;-)
Stevenvh

3
Já de volta. O escritório estava fechado. Eles estavam todos na igreja.
precisa saber é o seguinte

6

Concordo com Ignacio em relação ao uso de um registrador de turno 74XX595, serial em paralelo para expansão de saída, mas na verdade você precisará de 3 conexões, uma para dados , uma para relógio e uma trava ativada que transfira os dados do registro de mudança interno nas travas de saída.

Diagrama de 74LS595

Para a expansão das entradas, você pode usar um 74XX165, paralelo no registro de deslocamento de saída serial, isso permitirá ter até 8 botões por 74XX165.

insira a descrição da imagem aqui

A coisa boa dessa abordagem é que você pode encadear vários registros de troca em série, permitindo um número maior de entradas ou saídas, e melhor, você pode misturar 74XX595 e 74XX165, permitindo que você tenha qualquer número de entradas ou saídas.

Além disso, você pode compartilhar os sinais de relógio e trava, reduzindo o número de conexões necessárias e simplificando bastante o software. Dessa forma, você precisará apenas de 4 conexões para qualquer número de qualquer um desses registros de deslocamento:

  • Relógio (compartilhado com todos os registros de turno)
  • Ativar trava (compartilhado com todos os registros de turno)
  • Entrada de dados (conectado à saída serial do último registro de turno da cadeia)
  • Saída de dados (conectado à entrada serial do primeiro registro de turno na cadeia)

Editar

Como eu estava procurando por um diagrama que encontrei neste site uma maneira muito inteligente de reduzir para 3 o número de conexões necessárias. Consiste em usar o mesmo pino para entrada e saída de dados.

O software fará algo assim para cada pulso do relógio:

  1. Configurar pino como uma saída
  2. Defina o valor dos dados
  3. Enviar um pulso de relógio
  4. Configurar pino como uma entrada
  5. Leia os dados

Diagrama


1
O excessivamente agudo pode controlar a saída do registro de turnos apenas com um pino de saída e, provavelmente, também com os de saída e entrada. Pergunte-me como eu sei :-). Isso é possível usando atrasos de R / C nos dados e trava, com o relógio conectado diretamente ao pino de saída. O seqüenciamento exato depende da polaridade relativa do gatilho da borda para o relógio e a trava, mas elas geralmente são projetadas para trabalharem juntas dessa maneira.
Russell McMahon

E, como eu disse na minha resposta, você pode combinar os dois relógios também, para que você precise apenas de dois pinos. É uma ideia inteligente, mas não vou votar novamente pela segunda vez. Uma vez que é suficiente :-)
stevenvh

Não vejo a necessidade de mudar a última saída do 74HC595 para o 74HC165. Alguém poderia explicar isso? Pelo que entendi, 16 pulsos de clock seriam suficientes para ambos, definir as saídas dos 2 x 74HC595 (16 saídas) e ler as entradas dos 2 74HC165 (16 entradas), sem essa conexão.

@Dario: Ter a última saída do 74HC595 para o 74HC165 é uma maneira "gratuita" de permitir que um controlador que saiba que a corrente não terá mais de um comprimento determinado para determinar se a corrente está conectada e por quanto tempo ela é conectada. . Se seria aceitável registrar todos os '595's baixos na inicialização e se os primeiros' 165 tiverem pelo menos uma entrada alta, o código pode até determinar quantos '595's e' 165's existem.
Supercat 31/12

5

Nick menciona expansores de E / S e eles definitivamente valem a pena investigar. O Digikey lista mais de mil deles. Vou escolher um com uma interface I2C como exemplo, porque isso requer o mínimo de pinos de E / S; mínimo dois.

O NXP PCA9505 possui 40 pinos de E / S configuráveis, o equivalente a cinco 74HC595s. É uma solução um pouco mais cara, mas você obtém muito mais funcionalidade para isso:

  • Qualquer pino de E / S pode ser configurado como entrada ou saída
  • Pullups de 100 kΩ em todos os pinos de E / S (o PCA9506 não possui os pullups, o que pode ser relevante para aplicações de baixo consumo de energia)
  • Todas as saídas podem afundar 15 mA simultaneamente, para um pacote total de 600 mA
  • Uma saída de interrupção na troca torna a varredura contínua das entradas supérflua
  • Apenas dois fios para conectar ao microcontrolador.

Leitura adicional dos
expansores GPIO , folheto NXP
PCA9505 datasheet


4

Para uma solução sem ICs extras, você pode usar técnicas como Multiplexing e Charliplexing :

Multiplexagem (nenhum resistor limitador de corrente mostrado):

LEDs multiplexados

A maneira como a multiplexação funciona é bastante simples - no exemplo acima, se queremos acender o LED1, configuramos o pino C1 para saída alta e o PIN R1 para saída baixa, todos os outros pinos podem ser altos ou Hi-Z (definido para entrada, alto impedância que os faz parecer "desconectados")
Se quisermos acender o LED5, configuramos o pino C2 para saída alta e R2 para saída baixa.

O número de pinos necessários para acionar x LEDs pode ser calculado por 2n pinos para n² LEDs, portanto, por exemplo, para 16 LEDs precisamos (√16) * 2 = 8 pinos.

Charlieplexing:

Charlieplexing

Layout esquemático alternativo (sugerido por Supercat):

Charlieplexing 2

Isso é um pouco mais complexo, mas usa menos pinos para gerar um número maior de LEDs. Por exemplo, podemos usar apenas 5 pinos para acionar 20 LEDs, como no exemplo acima (em comparação com pelo menos 10 pinos com multiplexação de matriz "normal" (não confunda com o uso de um IC; nesse caso, o número de pinos necessários é log2) (nLED).

Para uma solução externa, você pode usar itens como Shift Registers ou Multiplexers , como 74HC595 e 74HC151.
Um registrador de turno utiliza um fluxo de entrada serial com clock de dados e sai paralelo (Serial In Parallel Out SIPO) ou o inverso (PISO)
Eles geralmente têm 8 saídas (ou entradas), mas você pode encadear quantas quiser para estender coisas. O lado negativo é a velocidade que você pode atualizar é dividida pelo número de saídas por entrada (por exemplo, para um registro de 8 saídas, se você tiver um relógio de 8MHz, poderá atualizar a 1MHz, para 16 saídas a 500kHz, etc.)

Essas técnicas também podem funcionar inversamente para entradas.


Essa resposta mostra como usar Charlieplexing para multiplexados botões de entrada: electronics.stackexchange.com/a/37362/8627
jippie

Uma maneira mais fácil de desenhar uma tela Charlieplexed é simplesmente desenhá-la como uma grade NxN com a diagonal despovoada.
Supercat 31/12

@ supercat - Acabei de beliscar o primeiro exemplo do google images. Acabei de adicionar outro exemplo - esse é o tipo de layout que você quis dizer?
perfil completo de Oli Glaser

@OliGlaser: Sim, embora eu sugira mover os resistores para as junções linha-coluna. Se você fizer isso, será possível acionar nove LEDs de uma só vez, desde que os drivers do lado superior ou do lado inferior possam acomodar isso. Como alternativa, pode-se deixar os resistores onde estão, mas adicionar um transistor em cada junção linha-coluna (para o esquema conforme mostrado, um NPN com a base na linha, o emissor na coluna e o coletor conectado ao trilho positivo ) A adição do transistor reduziria bastante a força de acionamento do lado alto necessária para operar nove LEDs ao mesmo tempo.
supercat
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.