Você está na página 1de 4

1

Projeto 1 de Topicos em Processamento de Sinais


Simulador de Barramento I2C

I. C ONTEXTUALIZAC AO
Uma das tarefas mais comuns em dispositivos eletronicos e a comunicaca o com outros dispositivos. Para que esta comunicaca o
seja estabelecida, e necessario que ambos os dispositivos concordem sobre qual protocolo (idioma) irao utilizar. Por exemplo,
e comum estabelecer a comunicaca o entre um microcontrolador e um PC via comunicaca o serial UART 9 bits, e um computador
se comunicar com um roteador atraves do protocolo Wi-Fi.
No caso especfico de microcontroladores, alguns protocolos sao bastante comuns: RS-232; SPI (Serial Peripheral Interface)
e I2 C(Inter-Integrated Circuit). Esses protocolos podem ser usados na comunicaca o do microcontrolador com perifericos, como
chips de A/D e D/A, LCD, EPROMs, sensores de temperatura, entre outros.
II. BARRAMENTO I 2 C

O barramento I2 Cutiliza apenas dois fios para realizar uma comunicaca o bidirecional entre diversos dispositivos. Na terminologia utilizada, o dispositivo que esta gerando uma mensagem e o transmissor, enquanto o dispositivo que esta recebendo
uma mensagem e o receptor. O dispositivo que controla a mensagem e o mestre, e os dispositivos que sao controlados por
este sao os escravos. Os dispositivos mestre e escravo assumem o papel de transmissor e receptor em diferentes etapas da
comunicaca o. O barramento e composto por apenas dois fios: um fio de dados, SDA, e um fio de clock, SCL. Apenas o mestre
controla o clock, mesmo quando este estiver recebendo uma mensagem (como veremos abaixo). Quando o barramento esta
ocioso, ambos os sinais SDA e SCL estao em nvel alto.
A. Sinais de Controle: START e STOP

Quando o barramento esta ocioso (idle), ambos os sinas SCL e SDA estao em nvel logico HIGH. Para iniciar uma
transmissao, o mestre forca a descida (mudanca de HIGH para LOW) de SDA enquanto o clock esta em nvel alto. Este
sinal e a condica o de partida (START), e prepara os dispositivos para a comunicaca o.
Para finalizar a transmissao, o mestre forca a subida de SDA quando o clock esta em nvel alto (mudanca de LOW para
HIGH). Este sinal e a condica o de parada (STOP). Para que a comunicaca o se re-estabeleca, um novo sinal de partida deve
ser gerado.

B. Transferencia de Bit

Na transferencia de um bit, o dado em SDA deve permanecer estavel entre a subida e a descida do clock (SCL). Mudancas
em SDA quando SCL esta em nvel alto sao entendidas como um sinal de controle (como visto nas condico es de START e
STOP). O valor de SDA durante o tempo em que SCL estava em nvel alto e o bit transferido.
C. Transferencia de um Byte

A comunicaca o no barramento e feita em bytes (8 bits), e a cada byte transmitido ou enviado um sinal de acknowledge deve
ser gerado. Portanto, para cada byte transmitido, 9 sinais (subida e descida) de clock precisam ser gerados. O numero de bytes
enviados entre um sinal de START e STOP e ilimitado. Na figura acima, e necessario entender que o canal data output e o
canal SDA, que e comum ao transmissor e ao receptor. Na figura, eles sao apresentados em separado para mostrar quem gera
os sinais a cada momento. No envio de um byte, o transmissor manda os 8 bits em SDA (em 8 sinais de clock separados), e
o receptor gera o sinal de acknowledge, tambem em SDA, no nono sinal de clock. O receptor gera o sinal 0 para sinalizar o
acknowledge (entendido) e 1 para sinalizar que nao entendeu a mensagem. Note que o clock e gerado pelo mestre, enquanto
os papeis de transmissor/receptor podem ser feitos tanto pelo mestre quanto pelo escravo.
III. P ROJETO
O projeto consiste em escrever um programa em Linguagem C para PCs que simule a comunicaca o de mensagens em ASCII
via protocolo I2 C. Cada um dos fios do barramento deve ser simulado usando arquivos diferentes, e os valores dos barramentos
em instantes de tempo amostrados devem ser registrados nesses arquivos como 1 ou 0.
O programa deve ter dois estados distintos: (i) envio de mensagem; e (ii) recepca o de mensagem. Quando o programa
funciona para envio de mensagem, ele funciona como o mestre do barramento (note que o acknowledge deve ser gerado como
HIGH, mas nao tem nenhum receptor para simular o acknowledge). Quando o programa funciona como receptor, ele funciona
como escravo (mas nao precisa gerar o acknowledge, uma vez que a mensagem ja foi enviada).
Um executavel de exemplo esta disponvel no moodle da displina (projeto1.exe , para Windows). Para testar o arquivo, basta
seguir os passos:

1) Escrever um arquivo texto contendo uma mensagem a ser enviada (nota: caracteres especiais e com acentos nao fazem
parte do conjunto ASCII).
2) Escrever projeto1 write <nome do arquivo> na linha de comando.
Este arquivo ira gerar dois arquivos: <nome do arquivo> sda.txt e <nome do arquivo> scl.txt. Para receber a mensagem, basta fazer:
1) Escrever projeto1 read <nome do arquivo> na linha de comando.
Note que, dependendo da amostragem, o barramento pode ficar mais tempo em um mesmo estado. O programa disponvel
no moodle simula esse tempo mantendo o barramento no mesmo nvel por um tempo aleatorio - o programa deve procurar
por mudancas nos sinais, e nao por valores dos sinais em instantes de tempo especficos (uma vez que o barramento I2 Cnao
especifica temporizaca o precisa).
E um requisito do projeto que o programa desenvolvido consiga se comunicar com o programa do professor, isto
e , gerando mensagens que o programa do professor seja capaz de ler e lendo mensagens geradas pelo programa do
professor!.
O programa disponvel no Moodle tambem contem um modo de debug. Passando como terceiro parametro a opca o -v, o
programa ira mostrar cada um dos sinais e bits enviados no barramento (tanto no modo de escrita como no modo de leitura).
Esta opca o pode ser usada para debugar o programa desenvolvido.
IV. D ICAS
Algumas dicas para programaca o em C:
A. Para ler argumentos na Linha de Comando
Na especificaca o do funca o main, coloque dois argumentos a mais: int argc e char *argv[]. O primeiro, argc, corresponde
ao numero de palavras diferentes (incluindo o nome do programa) usados quando o programa foi chamado. O segundo, argv,
corresponde a um array de strings (C strings, isto e , arrays de caracteres terminados com o carectere nulo), onde cada posica o
do array e uma palavra diferente.
Algoritmo 1 Exemplo de Leitura de Argumentos
1: #include <stdio.h >// printf
2: #include <stdlib.h >// atoi
3:
4:
5:
6:
7:
8:
9:
10:
11:

int main(int argc, char *argv[])


{
int i;
for (i = 0; i <argc; i++)
{
printf(Argumento %d : %s \n,i,argv[i]);
}
}

Como exemplo, se chamamos esse programa como:


test leitura string arg1 arg2
A sada sera:
Argumento 0 : test leitura string
Argumento 1 : arg1
Argumento 2 : arg2
B. Leitura e Escrita de Arquivos Texto
Para ler e escrever arquivos de texto, podemos usar a biblioteca stdlib.h. Essa biblioteca define o tipo FILE, que e um
ponteiro para um arquivo. Para abrir o stream do arquivo, e preciso usar a funca o fopen e, para fechar, e preciso usar a funca o
fclose (sempre que um arquivo for aberto, e necessario fecha-lo!). Para escrever no arquivo, podemos usar a funca o fprintf
(equivalente a` funca o printf). Porem, como queremos ler cada caractere separadamente, recomendo que utilizem a funca o
fgetc, que retorna o proximo caractere encontrado no arquivo.

Algoritmo 2 Exemplo de Leitura e Escrita de Arquivos


1: #include <stdio.h>//printf
2: #include <stdlib.h >//atoi
3: #include <string.h >
4:
5:
6:
7:
8:
9:

int main()
{
char filename[80];
FILE *fid;
int bit;

10:
11:
12:

sprintf(filename,test.txt);

13:

//Abre o arquivo e escreve os bits 1101.


fid = fopen(filename,w);

14:
15:

fprintf(fid,
fprintf(fid,
fprintf(fid,
fprintf(fid,

16:
17:
18:
19:
20:

1);
1);
0);
1);

fclose(fid);

21:
22:
23:

//Abre o arquivo e le os bits 1101.


fid = fopen(filename,r);

24:
25:

do
{

26:
27:
28:

bit = fgetc(fid);
if (bit != EOF)
{
//fgetc le o codigo ASCII do caractere!
printf(Bit lido: %d \n,bit - 48);
}
} while (bit != EOF);

29:
30:
31:
32:
33:
34:
35:
36:
37:

%d,
%d,
%d,
%d,

fclose(fid);
}

A sada desse programa e :


test file
Bit lido:
Bit lido:
Bit lido:
Bit lido:

Leitura de Parametros
fopen
fclose
fprintf
fgetc

1
1
0
1

TEIS
V. L INKS U
http://www.cplusplus.com/articles/DEN36Up4/
http://www.cplusplus.com/reference/cstdio/fopen/
http://www.cplusplus.com/reference/cstdio/fclose/
http://www.cplusplus.com/reference/cstdio/fprintf/
http://www.cplusplus.com/reference/cstdio/fgetc/

Você também pode gostar