terça-feira, 15 de fevereiro de 2011

SPI com o microcontrolador PIC 16F877A.

            Olá, obrigado pela visita a este blog (se quiser compatilhar algum exemplo de código em C aqui, é só entra em contato),veja também as páginas anteriores com muitos outros exemplos!
                Neste exemplo vou demonstrar como usar o protocolo SPI com o microcontrolador pic 16F877A, note que alguns parametros vão depender do dispositivo SPI, tais como transição de sinais, tipo de clock e tipo de amostragem.Para este exemplo vou usar o sensor de temperatura TC71 da microchip:

A simulação :


O Código:
// ****************************************************************************************************************************************************
// usando TC71 da microchip
//
// Data: 10/02/2011
// Autor: Aguivone
// Descrição: protocolo SPI sendo usado no sensor TC71
// ****************************************************************************************************************************************************

#include <16F877A.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20M)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)

#define SENSOR_SELECT PIN_A5 //habilita chip escravo(slave select)
#define SENSOR_DO PIN_C5 //recebe dados SPI
#define SENSOR_DI PIN_C4 //transmite dados SPI
#define SENSOR_CLK PIN_C3 //clock de sincronismo

/////////////////////////////////////comandos interno do sensor TC72/////////////////////////////////////////
#define SENSOR_ENDE_ESC 0X80 //endereço de escrita
#define SENSOR_ENDE_LER 0X02 //endereço de leitura
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
byte MSB,LSB,control_byte;
void escreve()
{
         output_high(SENSOR_SELECT);//habilita sensor
         delay_us(50);
         spi_write(SENSOR_ENDE_LER);//endereço de escrita
         MSB = spi_read(0X01);//primeiro byte - MSB temperatura (veja que este valor enviado é só p /        pegar o dado do sensor(pode ser qualquer valor))
          LSB = spi_read(0X02);//segundo byte - LSB temperatura
          control_byte = spi_read(0X03);//terceiro byte - valor do byte de controle
        output_low(SENSOR_SELECT);//desabilita sensor
}
void main()
{

SET_TRIS_C(0X90);
SET_TRIS_A(0);
setup_spi(SPI_MASTER | SPI_H_TO_L| SPI_CLK_DIV_4| SPI_SS_DISABLED|SPI_SAMPLE_AT_END);//desabilita o chip escravo
// configura para mestre,inicia os dados na transição alto para o baixo,coloca amostragem de dados no final do byte.
output_low(SENSOR_DO);
output_low(SENSOR_CLK);
output_low(SENSOR_SELECT);//desabilita sensor
LSB=input(SENSOR_DI); //configura pino como entrada
output_high(SENSOR_SELECT);//habilita sensor
spi_write(SENSOR_ENDE_ESC);//endereço de escrita
spi_write(0X10);//configura control register(conversao continua)
output_low(SENSOR_SELECT);//desabilita sensor
delay_ms(11);
printf("\n\r configurado ");
for(;;)
{
escreve();
printf("\n\r temperatura = %d,%d C , byte de controle = %X",MSB,LSB,control_byte);
delay_ms(1000);
}


}


3 comentários :

  1. Caramba!!.. muito bom o blog... já adicionei no RSS...
    uma pergunta, qual simulador vc usa
    abçs

    ResponderExcluir
  2. olá rafael o programa de simulação é o proteus

    ResponderExcluir
  3. blz.. valeu a dica... e já achei para baixar... obrigado

    ResponderExcluir

olá,digite aqui seu comentário!