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);
}


}


quarta-feira, 2 de fevereiro de 2011

BOOTLOADER COM O PIC 16F877A

Para atualizar o pic sem a necessidade de um gravador vc pode usar um circuito chamado bootloader que nada mais é do que usar a serial ou a usb do computador para descarregar uma atualização de firmware, usando um compilador da CCS(vem junto um programa chamado de siow.exe, use ele para isso ) vá em "file/download software"(veja imagem), procure o arquivo hexadecimal e clique abrir , pronto o programa será carregado para o microcontrolador, lembre-se que antes vc deve configurar o "baudrate". 
video demonstrando o carregamento:


vou postar aqui o codigo fonte usado:



// //****************************************************************************************************************************************************
//                                usando bootloader
//
//  Data:        02/02/2011
//  Autor:       Aguivone
//  Descrição:   demonstra como usar bootloader com o compilador ccs
// //*************************************************************************************************************************************************************************************************************************
#include <16F877A.h>
#fuses HS, NOWDT, NOPROTECT, BROWNOUT, PUT, NOLVP
#use delay(clock=20M)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)

#define _bootloader                  //necessario para funcionar o bootloader no ccs
#include <bootloader.h>              //necessario para funcionar o bootloader no ccs
#include <loader.c>                  //necessario para funcionar o bootloader no ccs

 #org LOADER_END+1,LOADER_END+10//se for PCM ( serie16F )
 #org 0x20,0x3F
 //#org LOADER_END+2,LOADER_END+20//se for PCH ( serie18F )
//#org 0x40,0x7F

void principal()
{
 for(;;)//programa principal
       {
         output_toggle(PIN_B0);//alterna led
         //output_toggle(PIN_B1);//alterna led
         delay_ms(300); 
       }
}

void main(void)
{
    if(!input(PIN_B5))// se ao iniciar o chip o pinoB5 estiver pressionado carrega novo codigo pelo bootloader (serial)
    {
       load_program();
    }
    principal();
}

#ORG default //necessario para funcionar o bootloader no ccs
#int_global     //necessario para funcionar o bootloader no ccs
void isr(void)
 {
   jump_to_isr(LOADER_END+5*(getenv("BITS_PER_INSTRUCTION")/8));
 }

 obrigado pela atenção e até o proximo post!