Utilizando o modo MSSP do PIC18 para comunicação com um 4094

Muitas vezes necessitamos utilizar mais pinos de E/S do que a quantidade disponível num determinado microcontrolador. A opção de utilizar um modelo com mais pinos pode não ser viável, especialmente quando já se utiliza um modelo menor em larga escala. Seja qual for a razão, uma das possibilidades de expansão das portas de E/S é a utilização de um chip conversor serial/paralelo como o 4094. Este chip recebe serialmente  8 bits de dados através de duas linhas (clock e dados) e disponibiliza o dado através de 8 pinos de saída.

A comunicação do PIC com o 4094 pode ser feita inteiramente por software ou utilizando o módulo MSSP. A utilização do módulo MSSP, caso o mesmo esteja disponível, facilita enormemente a tarefa, pois permite que toda a operação de comunicação (deslocamento serial dos dados) seja feita pelo hardware, liberando a aplicação para outras tarefas.

Além disso, a comunicação utilizando o módulo MSSP é muito simples: uma vez configurado o módulo, tudo o que é necessário fazer é ativar a linha de seleção do 4094, escrever o dado no registrador SSPBUF e, após a transmissão, desativar a linha de seleção do 4094. Também é possível utilizar a interrupção de fim de transmissão e inserir na ISR o código para desativar a linha de seleção do 4094.

pic_4094

O exemplo a seguir demonstra a utilização do módulo MSSP do PIC18F4520 para comunicação com o registrador de deslocamento 4094. Este exemplo foi retirado do livro Microcontrolador PIC18 Detalhado.

#include <p18f4520.h>
#include "pic_simb.h"

#pragma config OSC = XT, WDT = OFF, MCLRE = ON
#pragma config DEBUG = ON, LVP = OFF, PWRT = ON, BOREN = OFF

#define _4094_ENABLE	PORTCbits.RC0
void MCU_init(void)
{
	TRISC = 0;	// todos os pinos da porta C como saídas
	SSPSTAT = 0;
	SSPCON1 = bSSPEN | bSPI_MST_4; // SPI modo mestre, clock = FOSC/4 = 1MHz
}
void main(void)
{
	unsigned char contador, temp;
	MCU_init();
	contador = 0;
	_4094_ENABLE = 1;
	while(1)
	{
		SSPBUF = contador++;
		for (temp=200; temp; temp--);
	}
}

Leave a Reply

Your email address will not be published.

twelve + 15 =