Você está na página 1de 33

Departamento de Engenharia Electrotcnica Microprocessadores 2009/2010

DEPARTAMENTO DE ENGENHARIA ELECTROTCNICA

MICROPROCESSADORES
Tutorial - Mdulo MSSP

Introduo

O mdulo MSSP (Master Synchronous Serial Port) outro mdulo de comunicao srie presente no microcontrolador PIC18F4520 e que permite a implementao de protocolos de comunicao srie sncronas entre dispositivos. Neste tutorial sero abordadas as comunicaes sncronas entre um microcontrolador PIC18F4520 e um dispositivo externo, utilizando para tal o mdulo MSSP. Existem vrios protocolos de comunicao sncrona de baixo nvel, dos quais os mais conhecidos e utilizados em sistemas com microcontroladores so: I2C (Philips Semiconductors); SPI (Motorola); Microwire (National Semiconductor); 1-Wire Bus (Dallas Semiconductor)

O mdulo MSSP do microcontrolador PIC permite o funcionamento tanto no modo de comunicao I2C como no modo SPI, sendo que estes dois modos de comunicao srie sncronas so os mais comummente utilizados.

Protocolo de comunicao I2C (Inter-Integrated Circuit)

Tutorial - Mdulo MSSP

Pgina 1 de 33

Departamento de Engenharia Electrotcnica Microprocessadores 2009/2010

O protocolo de comunicao I2C (Inter-Integrated Circuit), desenvolvido originalmente como meio de comunicao entre dispositivos de reduzido dbito e velocidade de comunicao, utilizado quando a distncia entre microcontroladores e os diversos dispositivos ligados no barramento curta, ou seja, quando o transmissor e receptor esto normalmente na mesma placa de circuito impresso. A ligao estabelecida atravs de dois condutores: Um condutor para transferncia de dados, denominado por SDA; Um condutor para sincronizao da comunicao (sinal de relgio), denominado de SCL; Como pode ser observado na Figura 1, que representa uma ligao tpica de dispositivos num barramento I2C, existe sempre um dispositivo mestre (master) que responsvel por iniciar as operaes de transferncia de dados no barramento.

Figura 1 Exemplo de um barramento I2C1

Cada dispositivo escravo (slave) no barramento identificado atravs de um endereo nico, que deve ser referenciado pelo mestre para identificar o dispositivo de destino da comunicao. Assim sendo, o dispositivo mestre dever iniciar a transferncia de dados enviando o endereo de um dos dispositivos escravos com o qual quer comunicar, e s depois a comunicao pode comear. O protocolo de comunicao I2C especifica 7 bits para endereamento de dispositivos escravos, sendo que 16 desses endereos so reservados. Desta forma, podero existir no mesmo barramento I2C at 112 dispositivos diferentes, sendo um dispositivo mestre (microcontrolador, processador, etc.) e 111 dispositivos escravos.

Imagem retirada de http://www.mikroe.com/en/books/picmcubook/

Tutorial - Mdulo MSSP

Pgina 2 de 33

Departamento de Engenharia Electrotcnica Microprocessadores 2009/2010

Desde a criao do protocolo I2C pela Philips Semiconductors em 1982, foram adicionadas algumas revises s especificaes originais, incluindo alteraes nas velocidades de comunicao permitidas. Assim, o I2C pode funcionar em compatibilidade com um dos seguintes modos: Modo low-speed, que permite ligaes at 10 kbps; Modo Standard, que permite ligaes at 100 kbps; Modo Fast, introduzido pela reviso 1.0 (primeira reviso como um protocolo de facto) em 1992, que permite ligaes at 400 kbps. Esta reviso introduziu igualmente a possibilidade de utilizao de 10 bits para endereamento de dispositivos, permitindo assim um total de 1008 dispositivos interligados atravs do bus I2C; Modo High-Speed, introduzido em 1998 com a reviso 2.0 da especificao do protocolo, que permite velocidades de comunicao at 3.4Mbps. Dada a existncia de apenas uma linha para a transferncia de dados (a outra linha contm o sinal de relgio da comunicao), a comunicao num barramento I2C half-duplex, ou seja, os dados no podem ser enviados e recebidos simultaneamente. A distncia entre os dispositivos que comunicam atravs de I2C est limitada a poucos metros pois a capacidade total do bus est limitada a 400pF.

Protocolo de comunicao SPI (Serial Peripheral Interface)

O protocolo de comunicao SPI (Serial Peripheral Interface) um protocolo de comunicao srie sncrona desenvolvido pela Motorola destinado a interligar diversos dispositivos com elevado dbito de dados, ou seja, que requeiram elevadas velocidades de comunicao. A Figura 2 apresenta um exemplo da implementao de um barramento SPI para comunicao entre diversos dispositivos.

Tutorial - Mdulo MSSP

Pgina 3 de 33

Departamento de Engenharia Electrotcnica Microprocessadores 2009/2010

Figura 2 Exemplo de um barramento SPI2

De uma forma semelhante ao protocolo I2C, o protocolo SPI tambm se caracteriza por ter uma implementao do tipo master-slave, ou seja, no barramento dever existir sempre um dispositivo que coordene e inicie as transferncias de dados com os dispositivos escravos. A comunicao entre dispositivos num bus SPI utiliza at quatro condutores diferentes, nomeadamente: Um condutor para a linha de recepo de dados (SDI ou MISO); Um condutor para a transmisso de dados (SDO ou MOSI); Um condutor para sincronizao (sinal de relgio) (SCK); Uma linha dedicada para seleccionar o dispositivo escravo com o qual se quer comunicar (CS ou SS). Assim sendo, a seleco do dispositivo escravo envolvido na comunicao no feita por endereo, tal como no protocolo I2C, mas sim atravs de uma linha dedicada de chip select para cada dispositivo. O protocolo de comunicao SPI tem a caracterstica de permitir comunicaes em full-duplex, dado que existem linhas dedicadas para a transmisso e para a recepo, permitindo assim a transmisso e recepo de dados em simultneo. As velocidades de comunicao num barramento SPI so, por definio, velocidades elevadas, podendo ser utilizadas frequncias de relgio at 70 MHz (taxa de transferncia de 70 Mbps). Contrariamente ao protocolo I2C, o protocolo SPI no define modos standard de comunicao e/ou velocidades; assim sendo, o factor limitativo para a velocidade de comunicao a velocidade mxima suportada pelo dispositivo escravo utilizado.
2

Imagem retirada de http://www.mikroe.com/en/books/picmcubook/

Tutorial - Mdulo MSSP

Pgina 4 de 33

Departamento de Engenharia Electrotcnica Microprocessadores 2009/2010

Uma das caractersticas mais interessantes do protocolo SPI reside na possibilidade de configurao da polaridade e fase do sinal de relgio, que define a forma como os dados so interpretados e amostrados no barramento, flexibilizando assim a especificao da comunicao entre o mestre e os dispositivos escravos. Estas configuraes, denominadas por CPOL (Clock Polarity) e CPHA (Clock Phase), definem respectivamente o valor lgico de base para a linha de relgio e a ordem de amostragem e transmisso dos dados em funo das transies na linha de relgio. Se CPOL = 0, a base da polaridade da linha de relgio o valor lgico 0, e: o Se CPHA = 0, a amostragem dos dados para leitura feita no flanco ascendente do relgio, e a transmisso no flanco descendente; o Se CPHA = 1, ento a amostragem dos dados para leitura feita no flanco descendente e a transmisso no flanco ascendente; Se CPOL = 1, a base da polaridade da linha de relgio o valor lgico 1, e: o Se CPHA = 0, a leitura feita no flanco descendente e a transmisso no flanco ascendente; o Se CPHA = 1, ento a leitura feita no flanco ascendente e a transmisso no flanco descendente; Estas variantes de configurao definem o que normalmente denominado por modo SPI e que correspondem s seguintes configuraes: Modo SPI Modo 0 Modo 1 Modo 2 Modo 3 CPOL 0 0 1 1 CPHA 0 1 0 1

Mdulo MSSP (Master Synchronous Serial Port)

O mdulo MSSP (Master Synchronous Serial Port) um dos mdulos de funcionamento mais complexos presentes no microcontrolador PIC18F4520. Este mdulo permite a implementao Tutorial - Mdulo MSSP Pgina 5 de 33

Departamento de Engenharia Electrotcnica Microprocessadores 2009/2010

de protocolos de comunicao sncrona entre microcontroladores ou com dispositivos perifricos a velocidades elevadas, utilizando poucas linhas de I/O (no mximo duas ou trs, dependendo do protocolo utilizado). Logo, este mdulo vulgarmente utilizado para ligar o microcontrolador a displays LCD, conversores A/D ou D/A, memrias EEPROM srie, entre outros. A principal caracterstica deste tipo de comunicao reside no facto de esta ser sncrona, e como tal, adequada para utilizao em sistemas com um nico mestre e um ou mais escravos. O dispositivo mestre contm a electrnica necessria para gerar o relgio da comunicao a uma taxa (baud rate) definida, que assim ser utilizada na transferncia de dados com os dispositivos escravos, que por consequncia no necessitam de gerar o sinal de relgio para sincronizao na comunicao. O mdulo MSSP tem dois modos de operao, que correspondem simultaneamente implementao de dois protocolos de comunicao distintos: Modo SPI (Serial Peripheral Interface); Modo I2C (Inter-Integrated Circuit);

No caso do microcontrolador PIC18F4520 existe um mdulo MSSP, que para a sua operao faz uso das seguintes linhas de I/O: Pino RC3 RC4 RC5 Funo (SPI) SCK (linha de relgio) SDI (linha de entrada) SDO (linha de sada) Funo (I2C) SCL (linha de relgio) SDA (linha de dados) No utilizado

Na Figura 3 est representado o mdulo MSSP do microcontrolador PIC18F4520 e a sua utilizao nos dois modos de comunicao. Mesmo que os dispositivos Processor 1 e Processor 2 sejam iguais, a sua configurao diferente, sendo que um mestre e o outro escravo na comunicao.

Tutorial - Mdulo MSSP

Pgina 6 de 33

Departamento de Engenharia Electrotcnica Microprocessadores 2009/2010

Figura 3 Funcionamento do mdulo MSSP nos modos de comunicao SPI e I2C, respectivamente3

Se o microcontrolador controlar outro microcontrolador, dispositivo ou circuito perifrico, ento dever ser configurado como mestre. O microcontrolador mestre ir gerar o sinal de relgio quando necessrio, ou seja, quando estiver a receber ou a transmitir dados. O mestre tambm controla o estabelecimento da ligao entre os dispositivos. Caso o microcontrolador assuma um papel de perifrico de algum outro dispositivo, como por exemplo um PC ou um processador mestre, ento este dever ser configurado como escravo. Na configurao de escravo o microcontrolador tem de esperar pela solicitao de transferncia de dados para efectuar qualquer comunicao, solicitao esta que deve sempre partir do mestre.

Configurao do mdulo MSSP

As operaes de configurao e controlo do mdulo MSSP so realizadas atravs de 3 registos de configurao distintos, que so: SSPCON1 (MSSP Control Register 1):

O registo SSPI1CON o principal registo de controlo do mdulo MSSP, permitindo, entre outros:

Imagem retirada de http://www.mikroe.com/en/books/picmcubook/

Tutorial - Mdulo MSSP

Pgina 7 de 33

Departamento de Engenharia Electrotcnica Microprocessadores 2009/2010

Definir o modo de funcionamento para o mdulo MSSP, atravs dos bits SSPM3:SSPM0;

Habilitar o mdulo MSSP, atravs do bit de configurao SSPEN;


Registo SSPCON1 WCOL SSPOV SSPEN CKP SSPM3 SSPM2 SSPM1 SSPM0

SSPCON2 (MSSP Control Register 2):

O registo SSPCON2 exclusivo para o modo de funcionamento em I2C, e permite: Iniciar as ordens de Start, Repeated Start, Stop, e Acknowledge; Habilitar a recepo de dados;
Registo SSPCON2 CGEN ACKSTAT ACKDT ACKEN RCEN PEN RSEN SEN

SSPSTAT (MSSP Status Register):

O registo SSPSTAT possui algumas flags de estado para monitorizao do estado da comunicao no mdulo MSSP, tais como: Estado do buffer de transmisso/recepo interno; Estado da comunicao (transmisso em progresso); Bits de controlo do slew rate e ajuste do funcionamento para SMBus;
Registo SSPSTAT SMP CKE D/*A P S R/*W UA BF

Para uma melhor informao sobre a funo dos registos e das flags associadas, consulte o datasheet do microcontrolador PIC18F4520, nomeadamente a seco 17 Master Synchronous Serial Port (MSSP) Module. Adicionalmente, e para a correcta operao do mdulo MSSP, so utilizados dois registos auxiliares operao, que so:

Tutorial - Mdulo MSSP

Pgina 8 de 33

Departamento de Engenharia Electrotcnica Microprocessadores 2009/2010

Registo SSPBUF, que corresponde ao registo do buffer de transmisso e ou recepo da comunicao;

Registo SSPADD, que utilizado apenas no modo de funcionamento I2C e que toma as seguintes funes: o Se o microcontrolador est configurado como dispositivo mestre, o registo SSPADD implementa o gerador de relgio que define a velocidade de comunicao; o Se o microcontrolador est configurado como dispositivo escravo, o registo SSPADD definir o endereo escravo do microcontrolador no bus I2C;

Modo de funcionamento SPI

O modo de funcionamento SPI, tal como o nome indica, implementa o protocolo de comunicao srie SPI, permitindo assim a transmisso e recepo simultnea de 8 bits de dados utilizando 3 linhas de I/O do microcontrolador: SDO - Serial Data Out linha de transmisso; SDI - Serial Data In- linha de recepo; SCK - Serial Clock linha de sincronismo (linha de relgio);

Se o microcontrolador comunicar com diversos dispositivos perifricos (escravos), ento dever ser utilizada uma linha adicional (linha SS - Slave Select) por cada dispositivo escravo: SS - Slave Select linha adicional utilizada para seleco do dispositivo escravo com o qual se vai estabelecer a comunicao. Esta linha (uma por dispositivo escravo) apenas est activa (tipicamente, asserida a 0) quando o microcontrolador mestre deseja comunicar com o respectivo dispositivo escravo.

Tutorial - Mdulo MSSP

Pgina 9 de 33

Departamento de Engenharia Electrotcnica Microprocessadores 2009/2010

Figura 4 Seleco de dispositivo perifrico atravs da linha de Chip Select4

Quando a operar em modo SPI, o funcionamento do mdulo MSSP regido por 4 registos: SSPSTAT - Status Register - registo de estado; SSPCON1 - Control Register - registo de controlo; SSPBUF Buffer Register registo de armazenamento; SSPSR - Shift Register (no est directamente acessvel).

Os trs primeiros registos enunciados so registos onde permitida a escrita e a leitura, sendo que estes registos podem ser alterados a qualquer momento. O quarto registo, o registo SSPSR, implementa o deslocador paralelo-srie (ou srie-paralelo na recepo), e usado para converter dados paralelos no formato srie, e vice-versa. Tal como pode ser observado na Figura 5, a transferncia de dados no mdulo SPI implementada essencialmente por dois registos, que esto directamente relacionados com os pinos para envio, recepo e sincronizao da comunicao.

Imagem retirada de http://www.mikroe.com/en/books/picmcubook/

Tutorial - Mdulo MSSP

Pgina 10 de 33

Departamento de Engenharia Electrotcnica Microprocessadores 2009/2010

Figura 5 Registos associados aos procedimentos de transferncia de dados5

O deslocador de registo (shift register) SSPSR est directamente ligado aos pinos de entrada e sada do microcontrolador e utilizado na transmisso, para serializar os dados para o pino de transmisso (SDO), e na recepo para converter num resultado paralelo os dados srie provenientes do pino de recepo (SDI). O registo SSPSR tem uma entrada e uma sada, sendo que o hardware desloca um bit para a sada e adquire um bit na entrada em simultneo, por outras palavras, de cada vez que aparece um bit na entrada do deslocador, um bit deslocado para a sada. O registo SSPBUF implementa um buffer de memria temporrio utilizado nas operaes de transmisso e recepo de dados. Na transmisso, o registo SSPBUF funciona como buffer de transmisso, que recebe os dados a transmitir, colocando-os no deslocador SSPSR para subsequente transmisso. Na recepo, o registo SSPBUF funciona como buffer auxiliar que armazena, no formato paralelo, os dados recebidos no deslocador SSPSR, aps a recepo integral dos 8 bits de dados. Assim, aps a recepo de 8 bits de dados, este byte movido para o registo SSPBUF para leitura pela aplicao. Este formato de buffer de dados duplo na recepo, implementado por SSPBUF e SSPSR, permite iniciar a leitura do prximo byte antes do processamento dos dados que j foram recebidos. Qualquer escrita para o registo SSPBUF durante a transmisso/recepo de dados ser ignorada. Excluindo as configuraes necessrias para o correcto funcionamento da comunicao, a transferncia de dados via SPI pode-se resumir escrita e leitura de dados no registo SSPBUF, dado que todos os mecanismos de deslocamento de bits e sincronizao de relgio so feitos automaticamente pelo hardware. Antes de iniciar a comunicao SPI, no entanto necessrio efectuar algumas configuraes de inicializao ao mdulo MSSP, nomeadamente:
5

Imagem retirada de http://www.mikroe.com/en/books/picmcubook/

Tutorial - Mdulo MSSP

Pgina 11 de 33

Departamento de Engenharia Electrotcnica Microprocessadores 2009/2010

No funcionamento em modo mestre, a linha SCK, que a linha onde o relgio gerado, deve ser configurada como sada;

No funcionamento em modo escravo, a linha SCK, que a linha onde o relgio recebido, deve ser configurada como entrada;

Seleco do instante em que feita a amostragem na recepo, ou a meio ou no fim do tempo de bit estvel (bit SMP);

Seleco da polaridade para o sinal de relgio (CPOL), atravs da flag CKP; Seleco do bordo do sinal relgio (CPHA), atravs da flag CKE; No funcionamento em modo mestre, deve-se efectuar a definio e configurao da taxa de transmisso, que pode ser no mximo 10 Mbps, assumindo uma frequncia de relgio a 40 MHz, sendo que esta velocidade definida por uma das seguintes configuraes: o o o o = = =
4 16 64

Sinal de relgio derivado da sada do temporizador Timer 2;

Para o funcionamento em modo escravo, este deve ser adequadamente configurado atravs do registo SSPCON1;

Seguidamente, aps a configurao do mdulo, a operao com o mdulo MSSP no modo de funcionamento SPI pode-se resumir seguinte sequncia de passos:

Tutorial - Mdulo MSSP

Pgina 12 de 33

Departamento de Engenharia Electrotcnica Microprocessadores Passo 1: Os dados a transmitir devem ser escritos no registo de buffer SSPBUF. Se o mdulo estiver a operar em modo mestre, ento o microcontrolador ir 2009/2010

automaticamente executar os passos 2, 3 e 4. Se o mdulo SPI estiver em modo Escravo, ento o microcontrolador aguarda a deteco do sinal do relgio no pino SCK, e s ento executar os referidos passos.

Passo 2: Os dados escritos no registo SSPBUF so

transferidos para o deslocador de registo interno SSPSR, registo no acessvel ao programador. Neste processo o contedo do registo SSPBUF no apagado.

Passo 3: Sincronizado com o sinal do relgio, os dados do registo SSPSR so deslocados para o pino de sada (o primeiro bit o MSb). Simultaneamente, o registo SSPSR est a ser preenchido com os bits recebidos atravs do pino de entrada. No funcionamento em modo mestre, o microcontrolador gera o relgio de sincronizao, enquanto que no modo escravo utiliza o relgio externo presente na linha SCK.

Passo 4:

Tutorial - Mdulo MSSP

Pgina 13 de 33

Departamento de Engenharia Electrotcnica Microprocessadores O buffer SSPSR fica cheio assim que forem recebidos 8 bits de dados, evento que assinalado pelos bits BF e SSPIF, que ficam asseridos. Os dados recebidos so automaticamente transferidos do registo SSPSR para o registo SSPBUF. Uma vez que a transferncia de dados atravs de comunicao srie realizada automaticamente por hardware, o programa em execuo no microcontrolador corre normalmente enquanto a transferncia de dados est a ser executada em paralelo, sem interveno da aplicao. A funo da flag SSPIF gerar uma interrupo quando a recepo de um byte estiver concluda. 2009/2010

Passo 5: Finalmente, os dados armazenados no registo SSPBUF esto prontos para serem copiados para um outro registo de utilizador, onde podero ser utilizados pela aplicao.

Configurao e utilizao do mdulo MSSP no modo SPI (mtodo alternativo):

Existe um mtodo alternativo para configurao e utilizao do mdulo MSSP para implementao da comunicao SPI, que passa pela utilizao da API fornecida pelas bibliotecas do compilador C18.

Tutorial - Mdulo MSSP

Pgina 14 de 33

Departamento de Engenharia Electrotcnica Microprocessadores 2009/2010

Assim, para configurar o mdulo MSSP no modo SPI, e para efectuar as operaes de transferncia de dados (transmisso e recepo) SPI, modo mestre ou escravo, podem ser utilizadas as seguintes funes: Funo CloseSPI DataRdySPI getcSPI getsSPI OpenSPI putcSPI putsSPI ReadSPI WriteSPI Descrio Desabilita o mdulo MSSP utilizado na comunicao SPI . Determina se existem dados disponveis para leitura no buffer SPI. L um byte do bus SPI. L um array de dados do bus SPI. Inicializa o mdulo MSSP utilizado na comunicao SPI. Escreve um byte para o bus SPI. Escreve um array de dados para o bus SPI. L um byte de dados do bus SPI. Escreve um byte de dados do bus SPI.

Para utilizar esta biblioteca, o header file spi.h deve ser includo no cdigo fonte. Consulte a documentao das bibliotecas do compilador C18 para mais informaes sobre como utilizar estas funes.

Modo de funcionamento I2C

A comunicao srie no modo I2C semelhante comunicao de dados em modo SPI, na medida em que igualmente sncrona e bidireccional. No modo I2C apenas so utilizadas duas linhas para a transferncia de dados: a linha SDA (Serial Data) e SCL (Serial Clock). O programador deve configurar estes pinos como entradas atravs dos respectivos bits no registo TRISC. O relgio da comunicao, necessrio para sincronizar a transferncia de dados entre cada dispositivo no barramento, gerado pelo dispositivo mestre, que poder ser o microcontrolador PIC caso este esteja a operar em modo mestre. A frequncia de relgio determina a velocidade de transmisso. Tal como anteriormente referido, existem especificaes no protocolo I2C que permitem frequncias de relgio no mximo de 3.4MHz (modo High-Speed I2C); contudo as frequncias Tutorial - Mdulo MSSP Pgina 15 de 33

Departamento de Engenharia Electrotcnica Microprocessadores 2009/2010

de relgio mais frequentemente utilizadas so 100 kHz (modo Standard I2C) ou 400 kHz (modo Fast-Speed I2C), sendo que no h limite para a frequncia mnima. Quando o mestre e escravo esto sincronizados pelo sinal de relgio, a transferncia de dados sempre iniciada pelo mestre. Para efectuar uma comunicao bem sucedida, a seguinte sequncia de procedimentos tem de ser efectuada: 1. O dispositivo mestre envia para o barramento uma condio de START, por meio do pino SDA; 2. Depois, envia o endereo de 7 bits do dispositivo escravo com o qual quer comunicar, enviando seguidamente um bit (R/*W) que define se se trata de uma operao de escrita (0) ou leitura (1) de dados. Desta forma, aps o envio condio de incio, os oito bits de endereo so deslocados para o registo SSPSR, que por sua vez far a sua transmisso srie atravs da linha SDA. 3. Todos os dispositivos escravo partilham a mesma linha de dados, logo todos iro receber o primeiro byte de endereo, contudo apenas um deles, o dispositivo que tem o endereo que foi requisitado pelo dispositivo mestre, ir participar na transferncia.

Figura 6 Exemplo de endereamento de dispositivos num barramento I2C6

4. Depois da transmisso do primeiro byte ser concluda, o dispositivo mestre entra em modo de espera de forma a receber o aviso (acknowledge), notificando a associao correcta de um endereo por parte do dispositivo que recebeu o seu prprio endereo. Se o dispositivo escravo enviar o bit de acknowledge (0), a transferncia de dados teis ser iniciada at

Imagem retirada de http://www.mikroe.com/en/books/picmcubook/

Tutorial - Mdulo MSSP

Pgina 16 de 33

Departamento de Engenharia Electrotcnica Microprocessadores 2009/2010

que o dispositivo mestre (microcontrolador) envie uma condio de STOP para o barramento.

Figura 7 Exemplo de comunicao com um dispositivo I2C7

No microcontrolador PIC18F4520, pode-se definir o funcionamento em I2C em trs modos distintos: Modo Master, no qual o microcontrolador PIC18F4520 actua como o mestre da comunicao, sendo sempre o microcontrolador quem inicia as transferncias de informao; Modo Slave, no qual o microcontrolador PIC18F4520 um dispositivo escravo no barramento de dados, respondendo apenas aos pedidos do mestre do barramento; Modo Multi-Master, no qual o barramento I2C pode possuir mais que um mestre, pelo que o microcontrolador pode assumir tanto as funes de mestre, como de escravo. O diagrama de blocos do mdulo MSSP para o funcionamento no modo I2C apresentado na Figura 8.

Imagem retirada de http://www.mikroe.com/en/books/picmcubook/

Tutorial - Mdulo MSSP

Pgina 17 de 33

Departamento de Engenharia Electrotcnica Microprocessadores 2009/2010

Figura 8 Diagrama de blocos do mdulo MSSP para o modo de funcionamento I2C

Para alm dos registos de controlo e estado SSPCON1, SSPCON2 e SSPSTAT anteriormente referidos, o modo I2C utiliza para o seu normal funcionamento alguns registos auxiliares, nomeadamente: Registo SSPBUF (Serial Transmit/Receive Buffer), que o registo onde os dados so lidos ou escritos; Registo SSPADD (MSSP Address Register), que o registo que contm ou o endereo do microcontrolador, quando este est a operar em modo Slave, ou o valor determinado para a gerao do baud rate da comunicao; Registo SSPSR, que um registo auxiliar que implementa o deslocador srie-paralelo e paralelo-srie, para as operaes de recepo e transmisso, respectivamente. Este registo no manipulvel directamente pelo programador; No caso de um modo de funcionamento do microcontrolador como dispositivo mestre, ento deve ser definida a frequncia do relgio da comunicao a utilizar, que configurada de acordo com a seguinte expresso: 2 = 4 ( < 6: 0 > + 1)

Tutorial - Mdulo MSSP

Pgina 18 de 33

Departamento de Engenharia Electrotcnica Microprocessadores 2009/2010

Configurao do modo I2C

A configurao do mdulo MSSP pode ser feita atravs do seguinte procedimento: 1. Configurar os pinos SCL e SDA como entradas digitais, por meio dos tri-state buffers associados; 2. Seleccionar o modo de funcionamento I2C pretendido para o microcontrolador, atravs dos bits SSPMx do registo SSPCON1; 3. Definir o slew-rate pretendido para o sinal de relgio, em funo da frequncia de comunicao utilizada (necessrio activar para operar no modo Fast-Speed I2C, a 400 kHz), atravs do bit SMP do registo SSPSTAT; 4. Configurar o relgio da comunicao, atravs dos 7 bits menos significativos do registo SSPADD; 5. Habilitar o mdulo MSSP, atravs do bit SSPEN do registo SSPCON1;

Escrita de dados para um perifrico I2C

A escrita de um byte de dados num dispositivo perifrico ligado ao barramento I2C efectuada atravs do seguinte procedimento: 1. enviado para o barramento uma condio de Start, atravs da assero do bit SEN do registo SSPCON2; 2. Deve-se aguardar at ao fim da emisso da condio de Start, que pode ser feito atravs da consulta ao bit SEN, que automaticamente limpo por hardware; 3. carregado o endereo I2C (de escrita, no caso) do dispositivo perifrico para o registo SSPBUF; 4. Deve-se aguardar at ao fim da transmisso, que assinalado atravs do bit R/*W do registo SSPSTAT; Tutorial - Mdulo MSSP Pgina 19 de 33

Departamento de Engenharia Electrotcnica Microprocessadores 2009/2010

5. Verificar a recepo de uma condio de Acknowledge do dispositivo perifrico, atravs da leitura do bit ACKSTAT do registo SSPCON2; 6. Se o acknowledge foi recebido com sucesso, ento deve ser enviado para o barramento o endereo interno no dispositivo que se pretende escrever, carregando-o no registo SSPBUF; 7. Deve-se aguardar at ao fim da transmisso, que assinalado atravs do bit R/*W do registo SSPSTAT; 8. Deve-se verificar a recepo de uma nova condio de acknowledge do perifrico, atravs da leitura do bit ACKSTAT do registo SSPCON2; 9. Se o acknowledge for recebido com sucesso, ento devem ser transmitidos os dados para o barramento, carregando o registo SSPBUF; 10. Deve-se aguardar at ao fim da transmisso; 11. Quando todos os dados tiverem sido enviados, ento deve-se emitir para o barramento uma condio de Stop, atravs da assero do bit PEN do registo SSPCON2; 12. Deve-se aguardar o fim da emisso da condio de Stop, atravs da leitura do bit PEN, que limpo automaticamente por hardware;

Leitura de dados de um perifrico I2C

De forma semelhante ao procedimento de escrita anteriormente descrito, e tendo em conta as caractersticas do barramento I2C, a leitura de um byte de dados de um dispositivo perifrico no barramento I2C pode ser feita da seguinte forma: 1. enviado para o barramento uma condio de Start, atravs da assero do bit SEN do registo SSPCON2; 2. Deve-se aguardar at ao fim da emisso da condio de Start, que pode ser feito atravs da consulta ao bit SEN, que automaticamente limpo por hardware; 3. carregado o endereo I2C (de escrita, no caso) do dispositivo perifrico para o registo SSPBUF; Tutorial - Mdulo MSSP Pgina 20 de 33

Departamento de Engenharia Electrotcnica Microprocessadores 2009/2010

4. Deve-se aguardar at ao fim da transmisso, que assinalado atravs do bit R/*W do registo SSPSTAT; 5. Verifica a recepo de uma condio de Acknowledge do dispositivo perifrico, atravs da leitura do bit ACKSTAT do registo SSPCON2; 6. Se o acknowledge foi recebido com sucesso, ento deve ser enviado para o barramento o endereo interno no dispositivo que se pretende ler, carregando-o no registo SSPBUF; 7. Deve-se aguardar at ao fim da transmisso, que assinalado atravs do bit R/*W do registo SSPSTAT; 8. Deve-se verificar a recepo de uma nova condio de acknowledge do perifrico, atravs da leitura do bit ACKSTAT do registo SSPCON2; 9. Se o acknowledge for recebido com sucesso, ento deve ser emitida uma condio de Restart, atravs da assero do bit RSEN do registo SSPCON2. A condio de restart necessria uma vez que se vai iniciar uma transferncia para um novo endereo. 10. Deve-se aguardar at que a condio de Restart seja completa, atravs da leitura da flag RSEN, que limpa automaticamente por hardware; 11. Deve-se escrever no barramento o novo endereo do dispositivo perifrico, que no caso deve ser o endereo de leitura, para assinalar a leitura de dados, carregando o registo SSPBUF; 12. Deve-se aguardar at ao fim da transmisso; 13. Deve-se esperar pela recepo de uma condio de acknowledge do dispositivo perifrico, atravs da leitura do bit ACKSTAT do registo SSPCON2; 14. Se o acknowledge foi recebido com sucesso, ento deve-se habilitar o modo de recepo de dados no microcontrolador, atravs da assero do bit RCEN do registo SSPCON2; 15. Deve-se aguardar o fim da recepo dos dados, lendo a flag RCEN, que limpa por hardware no fim da recepo; 16. O byte de dados lido deve ser recolhido do registo SSPBUF; 17. Quando todos os dados tiverem sido lidos, ento deve-se emitir para o barramento uma condio de Stop, atravs da assero do bit PEN do registo SSPCON2; Tutorial - Mdulo MSSP Pgina 21 de 33

Departamento de Engenharia Electrotcnica Microprocessadores 2009/2010

18. Deve-se aguardar o fim da emisso da condio de Stop, atravs da leitura do bit PEN, que limpo automaticamente por hardware;

Configurao e utilizao do mdulo MSSP em I2C (mtodo alternativo)

Tal como acontece no modo de funcionamento SPI, existe um mtodo alternativo para configurao e utilizao do mdulo MSSP no modo de funcionamento I2C, que passa pela utilizao da API fornecida pelas bibliotecas do compilador C18, que fornece o seguinte conjunto de procedimentos: Funo AckI2C CloseI2C DataRdyI2C getcI2C getsI2C IdleI2C NotAckI2C OpenI2C putcI2C putsI2C ReadI2C RestartI2C StartI2C StopI2C WriteI2C Descrio Emite uma condio de Acknowledge no barramento. Desabilita o mdulo MSSP em uso pelo I2C. Verifica se existem dados disponveis no buffer de recepo I2C. L um byte de dados do barramento I2C. L um array de dados do barramento I2C. Aguarda at terminarem as transferncias no barramento I2C. Emite uma condio de Not Acknowledge no barramento I2C. Configura e habilita o mdulo MSSP para a comunicao I2C. Escreve um byte de dados no barramento I2C. Escreve um array de dados no barramento I2C. L um byte de dados do barramento I2C. Emite uma condio de Restart no barramento I2C. Emite uma condio de Start no barramento I2C. Emite uma condio de Stop no barramento I2C. Escreve um byte de dados no barramento I2C.

Para utilizar esta biblioteca, o header file i2c.h deve ser includo no cdigo fonte. Consulte a documentao das bibliotecas do compilador C18 para mais informaes sobre como utilizar estas funes.

Tutorial - Mdulo MSSP

Pgina 22 de 33

Departamento de Engenharia Electrotcnica Microprocessadores 2009/2010

Exemplo 1 Comunicao I2C

O seguinte exemplo de cdigo tm o circuito da Figura 9 como base de testes.


RB0 RB1 RB2

VCC

RB3

LCD1
LM032L

VCC

R15
470

R21
470

R22
470

R23
470

R24
470
VSS VDD VEE RS RW E D0 D1 D2 D3 D4 D5 D6 D7

LS1
SOUNDER

R4
470

D1
LED-GREEN

D2
LED-RED

D3
LED-RED

D4
LED-RED

D5
LED-RED

GND

VEE

RD4 RD5 RD6

J6

R8
2k2

Q2
PN2222A

RD0 RD1 RD2 RD3

7 8 9 10 11 12 13 14

VDD

1 2 3

4 5 6

R5
2k2

Q1
2N2222

RD7 JUMPER

J9
JUMPER

R9
VCC VCC 470 RA1 RA2 RA3

U1
2 3 4 5 6 7 14 13 33 34 35 36 37 38 39 40 RA0/AN0/C1INRC0/T1OSO/T13CKI RA1/AN1/C2INRC1/T1OSI/CCP2B RA2/AN2/C2IN+/VREF-/CVREF RC2/CCP1/P1A RA3/AN3/C1IN+/VREF+ RC3/SCK/SCL RA4/T0CKI/C1OUT RC4/SDI/SDA RA5/AN4/SS/HLVDIN/C2OUT RC5/SDO RA6/OSC2/CLKO RC6/TX/CK RA7/OSC1/CLKI RC7/RX/DT RB0/AN12/FLT0/INT0 RB1/AN10/INT1 RB2/AN8/INT2 RB3/AN9/CCP2A RB4/KBI0/AN11 RB5/KBI1/PGM RB6/KBI2/PGC RB7/KBI3/PGD RD0/PSP0 RD1/PSP1 RD2/PSP2 RD3/PSP3 RD4/PSP4 RD5/PSP5/P1B RD6/PSP6/P1C RD7/PSP7/P1D RE0/RD/AN5 RE1/WR/AN6 RE2/CS/AN7 RE3/MCLR/VPP PIC18F4520 15 16 17 18 23 24 25 26 19 20 21 22 27 28 29 30 8 9 10 1 OSI

FREQUENCY METER
CLK CE RST

RV1
50%

R1
10k

R2
4k7

R3
4k7 RB0 RB1 RB2 RB3

R6
4k7 RD0 RD1 RD2 RD3 RD4 RD5 RD6 RD7

R7
4k7

I2C
U4
6 5 7 SCK SDA WP 24LC256 A0 A1 A2 1 2 3

RESET

5k

+88.8
Volts

RA4

SENS
RXD TXD RTS CTS TC74 4 5 SCLK SDA 1.0

RB0

I2C PROTOCOL ANALYSER


SDA SCL TRIG

I2C

Figura 9 Circuito esquemtico para simulao do exemplo 1

O primeiro exemplo de cdigo apresentado neste documento permite fazer a leitura da temperatura medida atravs de um sensor de temperatura TC74, que um sensor de temperatura que possui uma interface de comunicao I2C. Para fazer a interface com este sensor de temperatura, recorre-se ao modo de funcionamento I2C oferecido pelo mdulo MSSP do microcontrolador PIC18F4520. A temperatura medida e lida do sensor apresentada no display LCD. O diagrama temporal dos comandos necessrios para a configurao e leitura do sensor TC74 so apresentados na Figura 10.

Tutorial - Mdulo MSSP

Pgina 23 de 33

Departamento de Engenharia Electrotcnica Microprocessadores 2009/2010

Figura 10 Diagrama temporal dos comandos para escrita/leitura de dados no sensor de temperatura TC74

Para melhor entender o cdigo exemplo apresentado, consulte com maior detalhe o datasheet do sensor de temperatura TC74 da Microchip. Este cdigo foi desenvolvido recorrendo biblioteca I2C do compilador Microchip C18 C Compiler (i2c.h).

/** * Departamento de Engenharia Electrotcnica - ESTG * Microprocessadores * * Tutorial Mdulo MSSP - Exemplo 1 * - Exemplo de comunicao I2C com um sensor * de temperatura TC74 */

/* definies do microcontrolador PIC18F4520 */ #include <p18f4520.h> /* header da biblioteca I2C */ #include <i2c.h> /* header da biblioteca 'delays' */

Tutorial - Mdulo MSSP

Pgina 24 de 33

Departamento de Engenharia Electrotcnica Microprocessadores


#include <delays.h> #include <stdio.h> /* header da biblioteca xlcd */ #include "xlcd.h" /* configurao do #pragma config OSC /* desactivao do #pragma config LVP /* desactivao do #pragma config WDT oscilador externo */ = EC modo de programao em baixa tenso */ = OFF temporizador Watch Dog Timer */ = OFF

2009/2010

/** * Definio do endereo base do sensor TC74: * - package A5: 1001101* * - escrita: 10011010 * - leitura: 10011011 */ #define BASE_ADDR 0b10011010 /** Comando para trocar para a linha 1 */ #define LINE1 0x80 /** Comando para trocar para a linha 2 */ #define LINE2 0xC0 /** Comando para limpar o LCD */ #define CLEAR 0x01

/** * Procedimento de inicializao do sensor TC74. * Escrita do registo CONFIG (01 hex) para habilitar * sensor. Consultar datasheet do sensor * * @param base_addr Endereo base (escrita) do sensor TC74. */ static void init_tc74(unsigned char base_addr) { /* garante inactividade no barramento */ IdleI2C(); /* emite uma condio de START no barramento I2C */ StartI2C(); /* aguarda terminao da condio de START */ while (SSPCON2bits.SEN); /* enderea o dispositivo no barramento I2C, para escrita */ WriteI2C(base_addr); /* aguarda recepo de acknowledge do sensor */ while (SSPCON2bits.ACKSTAT); /* selecciona o registo CONFIG do sensor */ WriteI2C(0x01); /* aguarda recepo de acknowledge do sensor */ while (SSPCON2bits.ACKSTAT); /* habilita o sensor de temperatura TC74 */ WriteI2C(0b00000000); /* aguarda recepo de acknowledge do sensor */ while (SSPCON2bits.ACKSTAT);

Tutorial - Mdulo MSSP

Pgina 25 de 33

Departamento de Engenharia Electrotcnica Microprocessadores


/* Emite uma condio de STOP no barramento I2C */ StopI2C(); /* aguarda terminao da condio de STOP */ while ( SSPCON2bits.PEN ); /* garante inactividade no barramento */ IdleI2C(); }

2009/2010

/** * Procedimento de leitura da temperatura do sensor TC74. * Leitura do registo RTR (00 hex) para ler temperatura medida. * * @param base_addr Endereo base (escrita) do sensor TC74. * @param temp Ponteiro de retorno para a temperatura lida. */ static void read_tc74(unsigned char base_addr, int *temp) { unsigned char read; /* garante inactividade no barramento */ IdleI2C(); /* emite uma condio de START no barramento I2C */ StartI2C(); /* aguarda terminao da condio de START */ while (SSPCON2bits.SEN); /* enderea o dispositivo no barramento I2C, para escrita */ WriteI2C(base_addr); /* aguarda recepo de acknowledge do sensor */ while (SSPCON2bits.ACKSTAT); /* selecciona o registo CONFIG do sensor */ WriteI2C(0x00); /* aguarda recepo de acknowledge do sensor */ while (SSPCON2bits.ACKSTAT); /* emite uma condio de REPEATED START no barramento I2C */ RestartI2C(); /* aguarda terminao da condio de REPEATED START */ while (SSPCON2bits.RSEN); /* enderea o dispositivo no barramento I2C, para leitura */ WriteI2C(base_addr + 1); /* aguarda recepo de acknowledge do sensor */ while (SSPCON2bits.ACKSTAT); /* comuta para modo de recepo */ SSPCON2bits.RCEN = 1; /* aguarda recepo dos dados */ while (!DataRdyI2C()); /* leitura dos dados recebidos do sensor */ read = ReadI2C(); /* verifica terminao da sequncia de recepo */ while (SSPCON2bits.RCEN); /* envia condio de NOT ACKNOWLEDGE para o barramento I2C */ NotAckI2C(); /* aguarda terminao da condio de NOT ACKNOWLEDGE */ while ( SSPCON2bits.ACKEN ); /* emite uma condio de STOP no barramento I2C */ StopI2C();

Tutorial - Mdulo MSSP

Pgina 26 de 33

Departamento de Engenharia Electrotcnica Microprocessadores


/* aguarda terminao da condio de STOP */ while ( SSPCON2bits.PEN ); /* garante inactividade no barramento */ IdleI2C(); *temp = (char) read; }

2009/2010

/** * Ponto de entrada da aplicao. */ void main(void) { int temp; char temp_str[5]; /* * desactivar uso de entradas analgicas no registo ADCON1 */ ADCON1 = 0x0F; /* * Definio da direco das linhas */ /* LCD ligado no porto D, linhas configuradas como sadas */ TRISD = 0; /* * restantes portos no usados, * linhas configuradas como entradas */ TRISA = 0xFF; TRISB = 0xFF; TRISC = 0xFF; TRISE = 0x07; /* * inicializao da comunicao I2C: * - seleco do modo Mestre * - desabilita controlo de Slew rate */ OpenI2C(MASTER, SLEW_OFF); /* * configurao da velocidade de comunicao * SSPADD a 9 -> F(i2c) = 100kHz (velocidade * mxima do sensor TC74) */ SSPADD = 9; /* * inicializao do sensor de temperatura TC74 */ init_tc74(BASE_ADDR);

Tutorial - Mdulo MSSP

Pgina 27 de 33

Departamento de Engenharia Electrotcnica Microprocessadores 2009/2010

/* * inicializao do LCD */ OpenXLCD(FOUR_BIT & LINES_5X7); while(BusyXLCD()); WriteCmdXLCD(DON & CURSOR_OFF & BLINK_OFF); while(BusyXLCD()); WriteCmdXLCD(SHIFT_CUR_RIGHT); while(BusyXLCD()); /* limpa LCD */ WriteCmdXLCD(CLEAR); while (BusyXLCD()); /* escreve linha 1, coluna 5 */ WriteCmdXLCD(LINE1 + 5); while (BusyXLCD()); putrsXLCD("SENSOR TC74"); while (BusyXLCD()); /* escreve linha 2, coluna 1 */ WriteCmdXLCD(LINE2); while (BusyXLCD()); putrsXLCD("TEMPERATURA:"); while (BusyXLCD()); /* * ciclo infinito */ while (1) { /* aguarda 500 ms */ Delay10KTCYx(50); /* l temperatura */ read_tc74(BASE_ADDR, &temp); /* actualiza display LCD */ sprintf(temp_str, "%4d", temp); /* escreve linha 2, coluna 14 */ WriteCmdXLCD(LINE2 + 13); while (BusyXLCD()); putsXLCD(temp_str); while(BusyXLCD()); } }

Exemplo 2 Comunicao SPI

Tutorial - Mdulo MSSP

Pgina 28 de 33

Departamento de Engenharia Electrotcnica Microprocessadores 2009/2010

Este exemplo de cdigo permite fazer a leitura da temperatura medida atravs de um sensor de temperatura TC72, que possui uma interface de comunicao SPI, apresentando seguidamente a temperatura no display LCD. Assim sendo, a configurao e aquisio da temperatura do sensor conseguida implementando o modo de funcionamento SPI oferecido pelo mdulo MSSP do microcontrolador PIC18F4520. Para a simulao do funcionamento deste exemplo de cdigo, foi utilizado o circuito esquemtico do Proteus apresentado na Figura 11.
RB0 RB1 RB2

VCC

RB3

LCD1
LM032L

VCC

R15
470

R21
470

R22
470

R23
470

R24
470
VSS VDD VEE RS RW E D0 D1 D2 D3 D4 D5 D6 D7

LS1
SOUNDER

R4
470

D1
LED-GREEN

D2
LED-RED

D3
LED-RED

D4
LED-RED

D5
LED-RED

GND

VEE

RD4 RD5 RD6

J6

R8
2k2

Q2
PN2222A

RD0 RD1 RD2 RD3

7 8 9 10 11 12 13 14

VDD

1 2 3

4 5 6

R5
2k2

Q1
2N2222

RD7 JUMPER

J9
JUMPER

R9
VCC VCC 470 RA1 RA2 RA3

U1
2 3 4 5 6 7 14 13 33 34 35 36 37 38 39 40 RA0/AN0/C1INRC0/T1OSO/T13CKI RA1/AN1/C2INRC1/T1OSI/CCP2B RA2/AN2/C2IN+/VREF-/CVREF RC2/CCP1/P1A RA3/AN3/C1IN+/VREF+ RC3/SCK/SCL RA4/T0CKI/C1OUT RC4/SDI/SDA RA5/AN4/SS/HLVDIN/C2OUT RC5/SDO RA6/OSC2/CLKO RC6/TX/CK RA7/OSC1/CLKI RC7/RX/DT RB0/AN12/FLT0/INT0 RB1/AN10/INT1 RB2/AN8/INT2 RB3/AN9/CCP2A RB4/KBI0/AN11 RB5/KBI1/PGM RB6/KBI2/PGC RB7/KBI3/PGD RD0/PSP0 RD1/PSP1 RD2/PSP2 RD3/PSP3 RD4/PSP4 RD5/PSP5/P1B RD6/PSP6/P1C RD7/PSP7/P1D RE0/RD/AN5 RE1/WR/AN6 RE2/CS/AN7 RE3/MCLR/VPP PIC18F4520 15 16 17 18 23 24 25 26 19 20 21 22 27 28 29 30 8 9 10 1 RD0 RD1 RD2 RD3 RD4 RD5 RD6 RD7 3 2 6 5

FREQUENCY METER
CLK CE RST

RV1
50%

R1
10k

R2
4k7

R3
4k7 RB0 RB1 RB2 RB3

RESET

SPI
SENS
SCK CE SDI SDO TC72 DIN DOUT SCK SS TRIG 4.0

5k

+88.8
Volts

RA4

RB0

RXD TXD RTS CTS

SPI

Figura 11 Circuito esquemtico para simulao do exemplo 2

O diagrama temporal para os comandos necessrios para efectuar a configurao e/ou a leitura do sensor TC72 encontra-se representado na Figura 12.

Tutorial - Mdulo MSSP

Pgina 29 de 33

Departamento de Engenharia Electrotcnica Microprocessadores 2009/2010

Figura 12 Diagrama temporal dos comandos para escrita/leitura de dados no sensor de temperatura TC72

Para melhor entender o exemplo de programao apresentado, consulte com maior detalhe o datasheet do sensor de temperatura TC72 da Microchip. Este cdigo foi desenvolvido atravs do uso de funes da biblioteca SPI do compilador Microchip C18 C Compiler (spi.h).
/** * Departamento de Engenharia Electrotcnica - ESTG * Microprocessadores * * Tutorial Mdulo MSSP - Exemplo 2 * - Exemplo de comunicao SPI com um sensor * de temperatura TC72 */

/* definies do microcontrolador PIC18F4520 */ #include <p18f4520.h> /* header da biblioteca SPI */ #include <spi.h> /* header da biblioteca 'delays' */ #include <delays.h> #include <stdio.h> /* header da biblioteca xlcd */ #include "xlcd.h" /* configurao do #pragma config OSC /* desactivao do #pragma config LVP /* desactivao do #pragma config WDT oscilador externo */ = EC modo de programao em baixa tenso */ = OFF temporizador Watch Dog Timer */ = OFF

/** Comando para trocar para a linha 1 */ #define LINE1 0x80

Tutorial - Mdulo MSSP

Pgina 30 de 33

Departamento de Engenharia Electrotcnica Microprocessadores


/** Comando para trocar para a linha 2 */ #define LINE2 0xC0 /** Comando para limpar o LCD */ #define CLEAR 0x01

2009/2010

/** * Procedimento de inicializao do sensor de temperatura * TC72. Configurao do registo de controlo para habilitar * modo de converso contnua. * Consultar datasheet. */ static void init_tc72(void) { /* activao do Chip Select */ PORTCbits.RC0 =1; /* selecciona registo CONTROL, modo de escrita (80 hex) */ WriteSPI(0x80); /* habilita modo de converso contnua */ WriteSPI(0x04); /* desactivao do Chip Select */ PORTCbits.RC0 = 0; Delay1TCY(); } /** * Procedimento de leitura da temperatura do sensor TC74. * Leitura do registo MSB (02 hex) para ler temperatura medida. * * @param temp Ponteiro de retorno para a temperatura lida */ static void read_tc72(int * temp) { unsigned char msb; unsigned char lsb; unsigned char control; /* activao do Chip Select */ PORTCbits.RC0 = 1; /* seleccinoa registo MSB, modo de leitura (02 hex) */ WriteSPI(0x02); /* aguarda recepo dos dados */ while (!DataRdySPI()); /* leitura do MSB da temperatura */ msb = ReadSPI(); /* leitura do LSB da temperatura */ lsb = ReadSPI(); /* leitura do registo CONTROL */ control = ReadSPI(); /* desactivao do Chip Select */ PORTCbits.RC0 = 0; *temp = (char) msb; } /**

Tutorial - Mdulo MSSP

Pgina 31 de 33

Departamento de Engenharia Electrotcnica Microprocessadores


* Ponto de entrada da aplicao. */ void main(void) { int temp; char temp_str[5]; /* * desactivar uso de entradas analgicas no registo ADCON1 */ ADCON1 = 0x0F; /* * Definio da direco das linhas */ /* * linha de Chip Select do sensor TC72 na linha RC0 * restantes linhas no usadas, configuradas como entradas */ TRISC = 0xFE; /* LCD ligado no porto D, linhas configuradas como sadas */ TRISD = 0; /* * restantes portos no usados, * linhas configuradas como entradas */ TRISA = 0xFF; TRISB = 0xFF; TRISE = 0x07; /* * inicializao das sadas digitais */ /* desactivao da linha de Chip Select */ PORTCbits.RC0 = 0; /* * inicializao da comunicao SPI: * - seleco do modo Mestre, velocidade FOSC/4 (1 MHz) * - seleco do modo SPI 0,1 * - amostragem da entrada no fim dos dados de sada */ OpenSPI(SPI_FOSC_4, MODE_01, SMPEND); /* * inicializao do sensor de temperatura TC72 */ init_tc72(); /* * inicializao do LCD */

2009/2010

Tutorial - Mdulo MSSP

Pgina 32 de 33

Departamento de Engenharia Electrotcnica Microprocessadores


OpenXLCD(FOUR_BIT & LINES_5X7); while (BusyXLCD()); WriteCmdXLCD(DON & CURSOR_OFF & BLINK_OFF); while (BusyXLCD()); WriteCmdXLCD(SHIFT_CUR_RIGHT); while (BusyXLCD()); /* limpa LCD */ WriteCmdXLCD(CLEAR); while (BusyXLCD()); /* escreve linha 1, coluna 5 */ WriteCmdXLCD(LINE1 + 5); while (BusyXLCD()); putrsXLCD("SENSOR TC72"); while (BusyXLCD()); /* escreve linha 2, coluna 1 */ WriteCmdXLCD(LINE2); while (BusyXLCD()); putrsXLCD("TEMPERATURA:"); while (BusyXLCD()); /* * ciclo infinito */ while (1) { /* aguarda 500 ms */ Delay10KTCYx(50); /* l temperatura */ read_tc72(&temp); /* actualiza display LCD */ sprintf(temp_str, "%4d", temp); /* escreve linha 2, coluna 14 */ WriteCmdXLCD(LINE2 + 13); while (BusyXLCD()); putsXLCD(temp_str); while (BusyXLCD()); } }

2009/2010

Tutorial - Mdulo MSSP

Pgina 33 de 33