Microcontroladores: Protocolos SPI

Este artigo foi criado com o intuito de apresentar o protocolo SPI aplicado à comunicação entre microcontroladores e periféricos. Com o interface será usada um a aplicação feita em Visual Basic.

Visto os recursos disponíveis num microcontrolador serem limitados, por vezes há necessidade de os expandir. Assim
existem circuitos integrados com as mais variadas funções : memórias EEPROM, shift registers, conversores A/D …

Para se poder comunicar com estes periféricos é necessário um protocolo de com unicação para que “ambas as partes se entendam”. Dos muitos protocolos disponíveis, um que foi massivamente adoptado para com unicação entre microcontroladores e periféricos externos foi o SPI (Serial Peripheral Interface).

Fonte mais detalhes aqui.

Firmware – Compilação C18 em DOS

Para uma compilação mais facil e rápida, podemos utilizar um pequeno arquivo escrito em DOS, com o seguinte conteudo:

"@echo off

"C:\MCC18\bin\mcc18.exe" -p=18F4550 "main.c" -fo="main.o" -D__DEBUG -Ou- -Ot- -Ob- -Op- -Or- -Od- -Opa-
"C:\MCC18\bin\mplink.exe" /p18F4550 "main.o" /u_CRUNTIME /u_DEBUG /z__MPLAB_BUILD=1 /z__MPLAB_DEBUG=1 /o"main.cof" /M"main.map" /W
pause"

Ele deverá ser salvo com a extensão bat, por exemplo, “compilar.bat”.

Depois é so executa-lo, respeitando a regra que o arquivo do seu codigo seja “main.c” e selecionando o modelo do microcontrolador correto.

Br-GoGo Beta Lcd Shield – Fritzing – II

Anteriormente vimos uma sugestão de ligação de um LCD 16×2 à uma Br-Gogo, aqui.

Para a correta exibição das informações no LCD, devemos usar as seguintes bibliotecas:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

Além disso, ao exibir uma informação, deveremos utilizar o recurso de buffer, para somente depois de toda informação recebida, esta seja exibida pelo LCD.

Em suma, no caso do C18, usamos o recurso "lcd_escreve_bf(buf_lcd);".

BR-Gogo + C18: ADC

Este é um exemplo de firmware em que usamos o conversor analógio digital (ADC) do PIC. Seu objetivo é verificar a tensão no pino AN0, aonde esta conectado um sensor de luz (LDR) e dependendo do valor encontrado, acender ou apagar o led da própria placa.


#include <p18F4550.h>
#include <adc.h>
#include <delays.h>
#include <stdio.h>

unsigned long res_ad;
unsigned long tensao;
unsigned long res_temp;

#pragma code

void main()
{

OpenADC(ADC_FOSC_8 & ADC_RIGHT_JUST & ADC_4_TAD, ADC_CH0 & ADC_INT_OFF & ADC_VREFPLUS_VDD & ADC_VREFMINUS_VSS, ADC_2ANA);

ADCON1 = 0x0D;

TRISAbits.TRISA0 = 1; // entrada // an0

TRISDbits.TRISD0 = 0; // saida // led

while(1)
{
SetChanADC(ADC_CH0);

ConvertADC();
while(BusyADC());
res_ad = ReadADC();

tensao = (res_ad*5000) / 1023;

if (tensao < 1000) PORTDbits.RD0 = 1;
if (tensao > 1000) PORTDbits.RD0 = 0;

Delay10KTCYx(40); //200ms

}
}

Gogo Board: I2C na Prática – VII

Estando tudo certo em nosso master, usaremos basicamente o mesmo código para programar nosso slave, porém, dentro da rotina principal, ou seja, main, deveremos inserir o código abaixo:

OpenI2C( SLAVE_7, SLEW_OFF);
SSPADD = 0xB0; //SSPADD contains I2C device address in SLAVE mode

while ( !DataRdyI2C() )
{
addr = ReadI2C();
AckI2C();
IdleI2C();
data = ReadI2C();
NAckI2C();
IdleI2C();
}

Ele é responsável por iniciar a placa em modo slave, utilizando o endereço 0xB0.

A seguir devemos configurar uma mensagem que será enviada pela placa master e recebida pela placa slave. Uma vez recebida esta mensagem, poderemos disparar determinadas funções de acordo com nossa necessidade.

Fonte: http://bradthx.blogspot.com.br/2011/11/pic18f-c18-implemented-i2c-slave.html

Gogo Board: I2C na Prática – VI

Dentro da rotina principal do nosso programas, ou seja dentro do main, devemos inserir este código:

OpenI2C( MASTER, SLEW_OFF);
SSPADD = 0x27; //SSPADD Baud Register used to calculate I2C clock speed in MASTER mode (in this case 100Khz)

StartI2C();
IdleI2C();
putcI2C( 0xB0 ); //send address
IdleI2C();
putcI2C( databyte ); //send data
IdleI2C();
StopI2C();

Ele será o responsável por iniciar uma das placas como master e enviará dados (databyte) à uma placa slave com endereço 0xB0.

Fonte: http://bradthx.blogspot.com.br/2011/11/pic18f-c18-implemented-i2c-slave.html

Gogo Board: I2C na Prática – III

Podemos ver aqui, como é a implementação da comunicação entre duas placas, através do I2C.

Para que haja comunicação precisamos de pelo menos uma placa principal, chamada master e pelo menos uma ou mais placas secundárias, chamadas slaves.

Cada uma possui um endereço de identificação próprio e comandos que podem ser enviados a elas para que realizem uma operação desejada.

Foto: http://www.instructables.com/id/I2C-between-Arduinos/

PIC18f4550: I2C + ADC

Como vimos anteriormente, somente podemos habilitar as entradas analógicas necessárias em nosso projeto.

Tomando como exemplo a Gogo Board, que utiliza oito entradas para os sensores, sendo elas de AN0 à AN7, temos que configura-las corretamente.

Para o compilador CCS usamos:

#define AN0_TO_AN7 0x07
setup_adc_ports(AN0_TO_AN7_ANALOG);

Ou ainda:

setup_adc_ports(0x07_ANALOG);

Para o compilador C18, devemos utilizar:

OpenADC(...,...,ADC_8ANA)

Verifique sempre o datasheet do microcontrolador e do respectivo compilador.

BR-Gogo + C18: Beep

Este é um exemplo de códico escrito em C para o compilador C18 da Microchip. Ele dever ser compilado e gravado como firmware na placa.

#include <p18F4550.h>
#include <delays.h>
#include <hardware.h>

#pragma code

void main()
{
TRISCbits.TRISC2 = 0; //Direciona somente o pino 0 da porta D como saída

while(0)
{
PORTCbits.RC2 = 1; //Coloca em '1' o bit '0' da porta D (acende o LED)
Delay10KTCYx(100); //Gera um delay de 500ms
PORTCbits.RC2 = 0; //Coloca em '0' o bit '0' da porta D (apaga o LED).
Delay10KTCYx(100); //Gera um delay de 500ms
}
}

Br-Gogo: Construindo Firmware – V

Depois de copiar as bibliotecas para seu diretório de projeto, será preciso alterar o conteúdo dos arquivos “c18….o”, para que o programa compilado seja compatível com o bootloader existente na placa.

Através de um editor de texto, será preciso alterar a linha:

#pragma code _entry_scn=0x000000

Para:

#pragma code _entry_scn=0x001560

Isso deve ser feito em todos os arquivos c18 copiados. A seguir, será preciso recompilá-los, utilizando a seguinte linha de comando:

"C:\MCC18\bin\mcc18.exe" -p=18F4550 "c018.c" -fo="c018.o" -D__DEBUG -Ou- -Ot- -Ob- -Op- -Or- -Od- -Opa-

"C:\MCC18\bin\mcc18.exe" -p=18F4550 "c018i.c" -fo="c018i.o" -D__DEBUG -Ou- -Ot- -Ob- -Op- -Or- -Od- -Opa-

"C:\MCC18\bin\mcc18.exe" -p=18F4550 "c018_e.c" -fo="c018_e.o" -D__DEBUG -Ou- -Ot- -Ob- -Op- -Or- -Od- -Opa-

"C:\MCC18\bin\mcc18.exe" -p=18F4550 "c018i_e.c" -fo="c018i_e.o" -D__DEBUG -Ou- -Ot- -Ob- -Op- -Or- -Od- -Opa-

Br-Gogo: Construindo Firmware – IV

Antes de começar será preciso se cadastrar e baixar a versão estudante do compilador C18, da Microchip. Existem outros, mas iniciaremos com este, além dele baixe a IDE de desenvolvimento MPLAB.

Tendo feito o download e instalação, será preciso copiar para seu diretório de projeto, aonde esta seu código em c, os seguintes arquivos:


– c018.c
– c018_e.c
– c018i.c
– c018i_e.c
– 18f4550_g.lkr
– p18f4550.h
– clib.lib
– clib_e.lib
– p18f4550.lib

MPLAB C Compiler for Academic Use

O MPLAB C Compiler para uso acadêmico são as versões LITE dos produtos totalmente compatíveis com bibliotecas ANSI padrão para PIC18 da Microchip, PIC24, dsPIC DSC, e PIC32 famílias. Eles se aproveitam do MCU PIC e dsPIC arquiteturas DSC para proporcionar a geração de código se software altamente eficiente. Os compiladores C MPLAB fornecem extensões para in-depth de apoio, como interrupções e periféricos e registradores de funções especiais. Eles são totalmente integrados com o MPLAB IDE, com editor de um programador full-featured, um gerente de projeto gráfico e de alto nível de depuração. Estes compiladores vêm completos com linker assembler, e biblioteca C de modo misto e programas de montagem.

Mais informações: http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&nodeId=1406&dDocName=en536656