Eu usei PIC16F877
( datasheet ) para vários projetos. Para uma única mudança de pino externo interrompe, você pode usar a PORTB0
interrupção. Mas agora eu preciso suportar 8 interrupções externas independentes de troca de pinos, em um único circuito.
Na folha de dados, ele diz que há 15 interrupções PIC16F877
, mas acho que essas são contadas, incluindo interrupções do temporizador, etc., que são inúteis nesse caso.
É o que dizem os dados sobre o INTCON
registro.
Posso ter 4 interrupções independentes usando o bit0 RBIF
? Representa mudança em PB7:PB4
. Como posso identificar qual pino foi alterado lendo o valor da porta na rotina de interrupção?
Até eu recebo respostas positivas acima, preciso de 8 interrupções? é claro que ainda posso usar INTE
, para PORTB0
mudar. Então 4 + 1 = 5
, mas e os outros 3? (No entanto, todos os 8 eventos de interrupção são do mesmo tipo, a 4 + 1 + 3 = 8
coisa parece feia, não é?)
Não há outras tarefas pesadas esperadas do microcontrolador além do monitoramento de 8 pinos. (Falando sobre as outras tarefas, ele precisará manter um conjunto de variáveis de contador separadas e transmitir frequentemente cerca de 4 bytes para o PC em série)
Todas as sugestões são bem-vindas. Mesmo que seja sobre mudar o microcontrolador para um mais adequado (mas ... não me diga para não usar PIC
s).
fonte
Respostas:
Este é o pseudocódigo C para explicar uma ideia. Ele usa um OR exclusivo para descobrir quais pinos foram alterados e chamarão seus diferentes manipuladores dentro de uma interrupção do RBIE. Dependendo de quão crítica é a aplicação, convém verificar como o PIC lida com situações como uma mudança de porta enquanto a interrupção está em execução para garantir que você não perca nenhum evento.
fonte
RB7:RB4
apenas 4 pinos. Mas estou pedindo uma maneira de monitorar 8 pinos. alguma sugestão?and four interrupts for the RB0:RB3
? O PIC16F877 não suporta interrupçõesRB1:RB3
, não é?Essa parte possui apenas 4 interrupções de troca de pinos e algumas outras que você pode configurar nas arestas selecionadas. Uma estratégia seria detectar uma alteração no valor de 8 bits externamente e interromper a incompatibilidade. Isso fica confuso no hardware, mas será exatamente o que você deseja.
Os parâmetros importantes que você não declarou são a rapidez com que você precisa responder a uma alteração de pinos e qual o tempo mínimo que uma alteração de pinos persistirá para que seja válida. Dependendo das respostas, você pode pesquisar com base em uma interrupção regular no firmware. O 16F877 pode ser executado na taxa de instruções de 5 MHz e a verificação de uma alteração levaria apenas algumas instruções. Digamos que você configure a interrupção a cada 50 instruções. Isso deixaria boa parte do tempo do processador para o código em primeiro plano. A taxa de interrupção seria de 100 kHz e o período de 10 µs. É claro que o código de primeiro plano ainda precisa ver o sinalizador de alteração e fazer algo a respeito, portanto o tempo de resposta será superior a 10 µs, mas você não disse nada sobre o que precisa fazer quando uma alteração é detectada. Se isso só precisa responder no tempo humano,
fonte
once per second
será suficiente. Quando uma mudança de pino (apenas uma aresta, digamos, subindo) é detectada, um contador (variável) deve ser incrementado. No loop principal, ele deve monitorar os valores dos contadores e, quando se ultrapassa um determinado valor, quatro bytes devem ser transmitidosUSART
para o PC. Redefina o valor do contador relevante para zero. Simples assim. Eu acho que a opção de pesquisa vai dar certo, certo?Você pode usar o NAND do gate de 8 entradas, como mencionado por Brian Drummond, para provocar uma interrupção no pino INT e também conectar suas fontes de interrupção ao Registro de Deslocamento de Entrada / Saída Paralela / Saída Serial de 8 bits, como "74HC165N", para que você precise apenas ler os dados desse Shift Register após o aumento da interrupção e fornecer informações sobre sua fonte de interrupção real ... talvez não seja o caminho mais rápido, mas fácil de expandir e use não mais do que 5 pinos, e se você adicionar um sistema de controle de endereço (MUX, LATCH, ...), precisará de apenas um pinho para notificação de interrupção e outros pinos poderão ser reutilizados em momentos diferentes para recursos diferentes;)
fonte