CONTROLE MAX7219 COM DISPLAYS 7 SEGMENTOS COM PIC
USANDO COMUNICAÇÃO SPI POR SOFTWARE


Quem gosta e curte microcontroladores, sabe que nem sempre um determinado periférico de controle pode estar disponível internamente no tipo/versão selecionado. Esse é o caso do microcontrolador PIC16F628A, muito difundido e ainda utilizado mesmo nos dias atuais para projetos mais simples. Esse microcontrolador não tem, por exemplo, pinos/registradores específicos para usar com dispositivos externos tipo SPI e/ou I2C. Ou seja, não dá para usar esse tipo de microcontrolador para controlar dispositivos do tipo que citei, certo?!?! Errado!!! Você pode com alguma criatividade e conhecendo o protocolo em questão fazer da forma "manual" ou como dizia-se antigamente: "na unha"!!


CONHECENDO O PROTOCOLO SPI - PINOUT E CONEXÃO

O protocolo SPI foi desenvolvido pela Motorola em 1979 (velho?!?!) para permitir a comunicação serial síncrona entre periféricos a curta distância. E quando falo curta distância, estou me referindo a dispositivos instalados em uma mesma placa ou ainda num mesmo "sistema" (caixa).

Ele utiliza a arquitetura mestre/escravo em modo full-duplex, podendo chegar a velocidades superiores a 4Mbit/s. Para isso seu barramento conta com 4 pontos de conexão, a saber:

  • - MOSI (Master out, slave in - saída de dados do mestre e entrada para o escravo);
  • - MISO (Master in, slave out - entrada de dados para o mestre e saída para o escravo);
  • - SCLK (Clock de sincronismo sempre controlado pelo mestre);
  • - SS (Slave Select - seleção do escravo).

Por ter um ponto para seleção do escravo, um endereço para o mesmo no barramento é dispensável.

A figura abaixo mostra um barramento típico entre um mestre e seus dispositivos "escravos".



Notem que cada escravo tem o seu próprio pino de seleção, e que os demais pinos (MOSI, MISO e SCLK) estão conectados entre si. Essa poderia ser uma das desvantagens desse protocolo, já que para usarmos 10 dispositivos escravos precisaríamos de 13 pinos de I/O do nosso microcontrolador.


SOBRE POLARIDADE E FASE SPI

O protocolo SPI tem 4 modos de trabalho, que são definidos pela "polaridade" e "fase" do clock em relação aos dados. Veja a figura abaixo.



E a tabela abaixo detalha melhor os modos em relação a polaridade e fase.

SPI Mode
CPOL
CPHA
0
0
0
1
0
1
2
1
0
3
1
1

Note que a polaridade do clock diz respeito a se o mesmo vai operar de low para high (polaridade 0) ou ainda de high para low (polaridade 1). Já a fase trata quando o dado deve estar disponível no bus (barramento). Para a fase 0 o dado deve estar disponível na transição ou borda de subida para polaridade 0 ou na transição ou borda de decida para polaridade 1. Já a fase 1 temos o contrário, o dado deve estar disponível na transição ou borda de descida para polaridade 0 e na transição ou fase de subida para polaridade 1. É muito importante saber qual o modo de operação do dispositivo que se deseja utilizar para que seja possível configurar o mestre de acordo. E graças ao pino SS você pode "passear" entre os modos caso tenha mais de um dispositivo operando com modos diferentes de operação no barramento SPI.


IMPLEMENTAÇÃO SPI POR SOFTWARE

A intenção desse artigo é demonstrar como o protocolo pode ser implementado por software. Acredito que até aqui você deve ter percebido que o protocolo SPI não tem um número finito de bits e nem um número "fixo" para os mesmos. Cada dispositivo tem o seu limite máximo e/ou mínimo e pode ou não possuir registradores para leitura/escrita de dados e/ou configuração.

Obs.: A única observação é que você sempre vai trabalhar com a ideia da leitura/escrita de um ou mais bytes  ou seja, com múltiplos de 8 bits, caso o dispositivo não informe o contrário.

Nesse caso, percebe-se então que o SPI é muito, mas muito parecido com um shift-register e sua operação é exatamente a mesma. Tudo o que é preciso fazer é, para um controle por software, selecionar o CI através do seu pino SS e pulsar o clock disponibilizando o bit de dado de acordo com a polaridade e fase escolhidos. Veja o segmento de programa em C abaixo:



Esse pequeno segmento de código acima está configurado para modo 0. O clock é levado a low manualmente, mas apenas porque esse é seu estado natural (veja na saída da função) e em seguida o bit de dado é disponibilizado (0 ou 1) para somente então o bit de clock ser levado a high, momento em que o dispositivo faz a leitura do bit. Agora veja abaixo um segmento de código para leitura de dados:


Este novo segmento de código trabalha da mesma forma. O clock é levado a low e nesse momento o escravo deve disponibilizar o bit (o mestre adiciona um tempo para aguardar até que o bit de dado possa ser considerado válido - estável). Em seguida o mestre lê o bit de dado e levanta o clock (high) aguardando novamente um tempo e toda a sequencia é repetida até que todos os bits desejados sejam lidos.

Essas funções podem ser aplicadas a qualquer microcontrolador da família PIC usando quaisquer pinos de I/O.


EXEMPLO PRÁTICO - CONTROLE MÓDULO DISPLAY MAX7219

Abaixo o esquema para um exemplo prático utilizando um módulo MAX7219 com 8 displays de 7 segmentos. Há um vídeo no inicio do artigo que demonstra esse exemplo. O código fonte está disponível mais abaixo em downloads e foi ricamente comentado para facilitar o seu entendimento.

Note que o microcontrolador utilizado foi o PIC16F628A, que não possui um periférico interno SPI. Você poderá montar esse exemplo em um proto-board sem maiores problemas. O código precisa ser compilado via ferramenta MPLABX Microchip com o compilador XC8 2.40 ou superior.

Obs.: Todas as informações sobre a placa PE-PIC16F628A utilizada nesta experiência podem ser obtidas aqui.


CONCLUSÃO

Conhecer um protocolo garante a você que pretende entrar no mundo dos microcontroladores um maior "controle" sobre as várias situações que podem surgir durante a sua carreira. Hoje em dia, o uso de bibliotecas e/ou ferramentas "mágicas" permitem uma grande velocidade no desenvolvimento, porém as mesmas estão tirando dos estudantes/aprendizes algo que é irreparável: o conhecimento necessário sobre alguns conceitos importantes! Saber como usar uma biblioteca/ferramenta não difere você dos demais. O que vai fazer a diferença é o conhecimento sobre um determinado assunto/conceito. Bons testes, bons estudos e até a próxima!



DOWNLOADS

- Pacote com arquivos (*.c, *.h e arquivo HEX)

 



Copyright deste conteúdo reservado para Márcio José Soares e protegido pela Lei de Direitos Autorais LEI N° 9.610, de 19 de Fevereiro de 1998. É estritamente proibida a reprodução total ou parcial do conteúdo desta página em outros pontos da internet, livros ou outros tipos de publicações comerciais ou não, sem a prévia autorização por escrito do autor.