Você está na página 1de 4

Instituto Federal do Ceará

Departamento de Telemática

Aula de laboratório de PSE

Elabore uma arquitetura redundante constituída por 3 microcontroladores PIC ou 3 arduinos UNO, e
os programem para que façam o seguinte: o primeiro microcontrolador PIC ou arduino deve ler seu
conversor AD e imprimir em um display de 7 segmentos o valor lido. Posteriormente, ele deve
aguardar 5 segundos e enviar esse valor, por uma interface serial, para o segundo PIC ou arduino.
Esse, por sua vez, deve imprimir o valor recebido em um display de 7 segmentos, aguardar 5 segundos
e, depois, enviá-lo para o terceiro microcontrolador PIC ou arduino. Esse deve receber o valor,
imprimir no seu display de 7 segmentos e alterar o valor para zero. O último PIC ou arduino deve
imprimir o valor zero no seu display, aguardar 5 segundos e retornar o valor zero para o segundo PIC
ou arduino, que deve escrever no seu display, aguardar 5 segundos e enviá-lo para o 1o PIC ou arduino.
O 1o PIC ou arduino deve receber o valor do segundo PIC ou arduino, imprimi-lo no seu display. Esse
ciclo deve ser executado por tempo indeterminado.
Disciplina: Projeto Sistemas Embarcados
Professor: Paulo Regis Carneiro de Araújo
Aluno: Ulisses Oliveira Soares
Curso: Tecnologia em Telemática

1. Esquemático (ISIS Proteus)

 Arquivo de imagem em maior resolução:

 Arquivo esquemático original:

2. Códigos-fonte em linguagem C

2.1. PIC 1

#include <16f874.h> // Biblioteca do PIC utilizado.


#device adc=8 // Resolução do conversor A/D: 8 bits (0-255)
#use fixed_io (b_outputs = pin_b0, pin_b1, pin_b2, pin_b3, pin_b4, pin_b5, pin_b6)
#use fixed_io (c_outputs = pin_c6, pin_c4)
#use delay (clock=1000000) // 1 MHz
#use rs232 (baud =4800, xmit = pin_c6, rcv = pin_c7) // Interface serial de hardware
#use rs232 (baud =4800, xmit = pin_c4, rcv = pin_c3, stream = porta_s) // Interface serial de software
#fuses XT, NOWDT, PUT // Cristal f < 4MHz, No Watch-dog timer, Power-up Time

byte const tabela[]={0b10111111, 0b10000110, 0b11011011, 0b11001111, 0b11100110, 0b11101101,


0b11111101, 0b10000111, 0b11111111, 0b11100111, 0b11111001}; // 0-9, "E" (erro)

void main(){

long int valor_ad, valor;

setup_adc_ports(ALL_ANALOG); // Conversores A/D (porta A) recebem sinais analógicos


setup_adc(ADC_CLOCK_INTERNAL); // Conversores A/D com frequência de amostragem pelo clock interno
set_adc_channel(0); // Conversores A/D receberá o sinal do pino A0 (canal 0)
delay_us(100); // Atraso de 100 us

while (TRUE) {
valor_ad = read_adc();

valor = (long int) (10 * (valor_ad - 1)) / 255; // Conversão 0-255 para 0-9
output_b(tabela[valor]);
delay_ms(5000);
putc(valor); // 5s após ter exibido o valor no display, envia pela porta serial de hardware

valor = fgetc(porta_s); // Aguarda de forma sincronizada uma leitura na interface serial de software
output_b(tabela[valor]);
delay_ms(2000); // Aguarda 2s para voltar a ler o conversor A/D
}
}

2.2. PIC 2

#include <16f874.h> // Biblioteca do PIC utilizado.

#use fixed_io (b_outputs = pin_b0, pin_b1, pin_b2, pin_b3, pin_b4, pin_b5, pin_b6)
#use fixed_io (c_outputs = pin_c6, pin_c4)
#use delay (clock=1000000) // 1 MHz
#use rs232 (baud =4800, xmit = pin_c6, rcv = pin_c7) // Interface serial de hardware
#use rs232 (baud =4800, xmit = pin_c4, rcv = pin_c3, stream = porta_s) // Interface serial de software
#fuses XT, NOWDT, PUT // Cristal f < 4MHz, No Watch-dog timer, Power-up Time

byte const tabela[]={0b10111111, 0b10000110, 0b11011011, 0b11001111, 0b11100110, 0b11101101,


0b11111101, 0b10000111, 0b11111111, 0b11100111, 0b11111001}; // 0-9, "E" (erro)

void main(){

int x, tempo;
long int valor;

while (TRUE) {
tempo = 0;
while (!kbhit() && (++tempo < 30)) delay_ms(1000); // Aguarda 30s por um valor
x = (kbhit() ? getc() : 10); // Se não recebeu valor, atribui o valor 10 (código de erro)

output_b(tabela[x]); // Exibe no display o valor recebido por 5s


delay_ms(5000);
putc((long int) x); // 5s após ter exibido o valor no display, envia pela porta serial de hardware

valor = fgetc(porta_s); // Aguarda de forma sincronizada uma leitura na interface serial de software
output_b(tabela[valor]);
delay_ms(2000); // Aguarda 2s para transmitir de volta ao PIC 1
fputc(valor, porta_s); // Envia o valor de erro pela interface serial de software
}
}

2.3. PIC 3

#include <16f874.h> // Biblioteca do PIC utilizado.

#use fixed_io (b_outputs = pin_b0, pin_b1, pin_b2, pin_b3, pin_b4, pin_b5, pin_b6)
#use fixed_io (c_outputs = pin_c6, pin_c4)
#use delay (clock=1000000) // 1 MHz
#use rs232 (baud =4800, xmit = pin_c6, rcv = pin_c7) // Interface serial de hardware
#use rs232 (baud =4800, xmit = pin_c4, rcv = pin_c3, stream = porta_s) // Interface serial de software
#fuses XT, NOWDT, PUT // Cristal f < 4MHz, No Watch-dog timer, Power-up Time

byte const tabela[]={0b10111111, 0b10000110, 0b11011011, 0b11001111, 0b11100110, 0b11101101,


0b11111101, 0b10000111, 0b11111111, 0b11100111, 0b11111001}; // 0-9, "E" (erro)

void main(){

int x, tempo;
// long int valor;

while (TRUE) {
tempo = 0;
while (!kbhit() && (++tempo < 30)) delay_ms(1000); // Aguarda 30s por um valor
x = (kbhit() ? getc() : 10); // Se não recebeu valor, atribui o valor 10 (código de erro)
output_b(tabela[x]); // Exibe no display o valor recebido por 5s
delay_ms(5000);

x = 0; // Valor 0 solicitado no projeto (Valor 10 = código de erro (caractere "E" no display))


output_b(tabela[x]); // Exibe o erro no display
delay_ms(2000); // Aguarda 2s para transmitir de volta para o PIC2
fputc(x, porta_s); // Envia o valor de erro pela interface serial de software
}
}

Você também pode gostar