Você está na página 1de 11

UNIVERSIDADE ESTÁCIO DE SÁ

FACULDADE ESTÁCIO DE SÁ CAMPUS VILA VELHA

RELATÓRIO DE SISTEMAS A MICROPROCESSADORES

LABORATÓRO 01

SAMUEL MOURA GONDIM -202002664991

Distrito Federal - DF
25/112023
5

1 OBETIVO
 O objetivo deste experimento é desenvolver uma aplicação para o
acionamento de LEDs (ou cargas) através de comandos enviados através da
interface serial entre o PC e o microcontrolador.
 Introdução Teórica: O módulo EUSART (Enhanced Universal Synchronous
Asynchronous Receiver Transmitter) no PIC18F4520 é responsável pela comunicação
serial. Ele é capaz de suportar tanto a comunicação síncrona quanto a assíncrona e
será de muita importância na realização das atividades propostas nesse roteiro. Ele
possui dois módulos: transmissão (TX) e recepção (RX), que podem ser habilitados
com comandos como TXSTAbits.TXEN=1 e RCSTAbits.Cren=1, que serão utilizados
no código rodado neste experimento.

2 MATERIAIS UTILIZADOS
 IDE: MPLAB X
 Simulador PICSimsLab

3 PROCEDIMENTOS

1. Primeiro realizou-se a configuração do simulador PICSimsLab da


maneira proposta.
2. Após isso, foi criado o projeto utilizando a IDE conhecida como
MPLAB X.
3. O código foi desenvolvido no projeto, e as modificações propostas
nele foram realizadas, adicionando uma mensagem para confirmar o
ligamento e desligamento dos LEDs.
4. Foi utilizada a função de “Export Hex” do PICSimsLab, que
automaticamente realizou a build do código e criou um arquivo hex
numa pasta especifica.
6

5. Voltando para o PICSimsLab, o hex foi importado, gerando resultados


que serão mostrados no quarto tópico.
6. Código, com a explicação de cada trecho dele nos comentários
#include<xc.h>
#include <stdlib.h>
#include <stdio.h>
#include "../include/proc/pic18f4520.h"
#include "math.h"

#define _XTAL_FREQ 8000000 //frequência do cristal definida para 8MHz


#pragma config OSC = HS // Seleção do oscilador a cristal maior que 4MHz
#pragma config FCMEN = OFF // Desabilitada a monitoração por falha no clock
#pragma config IESO = OFF // Desabilitada a comutação interno/externo*/
#pragma config PWRT = ON // Habilitado Power Up Timer
#pragma config BOREN = OFF //Desabilitado Brown-Out Reset
#pragma config BORV = 3 //Tensão p/Brown-Out Reset
#pragma config WDT = OFF //Desabilitado o Watchdog Timer
#pragma config WDTPS = 32768 //Postscale para Watchdog Timer
#pragma config CCP2MX = PORTC //Entrada/Saída do módulo CCP2 é multiplexado com RC1
#pragma config PBADEN = OFF // Pinos 0 a 4 da Porta da Porta B configurados como pinos I/O
no reset
#pragma config LPT1OSC = OFF //Timer não utilizará o oscilador de baixa potÊncia
#pragma config MCLRE = ON //Pino Master Clear habilitado, desabilitado pino de entrada RE3
#pragma config STVREN = ON //Recurso de retenção de pilha ha habilitado
#pragma config LVP = OFF //Habilitada rogramação por baixa tensão
#pragma config XINST = OFF //Conjunto de instruções extendidas está desabilitado

void escreve_Serial(char c); //prototipo da função


void inicia_Serial(void); //prototipo da função
void string_Serial(char *c); //prototipo da função
char leia_Serial(void); //prototipo da função
void confirmar_operacao(char operacao, char led);//prototipo da função

//Todas as expressões acima são declarações de protótipos das funções.

char dado[4]; //Vetor que armazena os dados recebidos pela serial


char i = 0; //Variável de controle para recepção de dados

void main(void) {
TRISB = 0b00000000; //Configura os pinos da Porta B como saída
PORTB = 0b00000000; //Todas as portas de PORTB são definidas como estando no nível
lógico 0]
ADCON1 = 0x0F; //Desabilita todos os canais Analógico/Digital
inicia_Serial();
7

//Envio do texto inicial pelo Módulo Eusart


string_Serial("Controlador de leds (1 a 8)\r\n");
string_Serial("LLx - Para acender o LEDx \r\n");
string_Serial("DLx - Para desligar o LEDx \r\n");

while (1) {
if (RCIF) { //Verifica o flag de interrupção para a recepção do Módulo Eusart, caso seja 1
dado[i] = leia_Serial(); //Recebe um caractere por vez e armazena o dado com a posição 1
if (dado[i] == 0x0D) { //Se o caractere 0x0D for recebido
//Se a string recebida pelo vetor dado for igual a LLx, o seguinte bloco de código vai ser
executado
if (dado[0] == 'L' && dado[1] == 'L') {
switch (dado[2]) {
case '1':
PORTBbits.RB0 = 1;
confirmar_operacao('L', '1');
break;
case '2':
PORTBbits.RB1 = 1;
confirmar_operacao('L', '2');
break;
case '3':
PORTBbits.RB2 = 1;
confirmar_operacao('L', '3');
break;
case '4':
PORTBbits.RB3 = 1;
confirmar_operacao('L', '4');
break;
case '5':
PORTBbits.RB4 = 1;
confirmar_operacao('L', '5');
break;
case '6':
PORTBbits.RB5 = 1;
confirmar_operacao('L', '6');
break;
case '7':
PORTBbits.RB6 = 1;
confirmar_operacao('L', '7');
break;
case '8':
PORTBbits.RB7 = 1;
confirmar_operacao('L', '8');
8

break;
}
}

//Se a string recebida pelo vetor dado for igual a DDx, o seguinte bloco de código vai ser
executado
if (dado[0] == 'D' && dado[1] == 'L') {
switch (dado[2]) {
case '1':
PORTBbits.RB0 = 0;
confirmar_operacao('D', '1');
break;
case '2':
PORTBbits.RB1 = 0;
confirmar_operacao('D', '2');
break;
case '3':
PORTBbits.RB2 = 0;
confirmar_operacao('D', '3');
break;
case '4':
PORTBbits.RB3 = 0;
confirmar_operacao('D', '4');
break;
case '5':
PORTBbits.RB4 = 0;
confirmar_operacao('D', '5');
break;
case '6':
PORTBbits.RB5 = 0;
confirmar_operacao('D', '6');
break;
case '7':
PORTBbits.RB6 = 0;
confirmar_operacao('D', '7');
break;
case '8':
PORTBbits.RB7 = 0;
confirmar_operacao('D', '8');
break;
}
}
i = 0; //retorna a variável i a 0
} else //Se o caractere recebido for diferente de 0x0D, a variável i será incrementada
i++;
9

}
}
}

void escreve_Serial(char c) {
while (!TXSTAbits.TRMT); //aguarda a finalização da transmissão do caractere
TXREG = c; //carrega em TXREG e transmite o caractere vira EUSART
}

//Função de inicialação do modo EUSART


void inicia_Serial(void) {
TXSTAbits.BRGH = 0;
BAUDCTLbits.BRG16 = 0;//Controle de Baud Rate
SPBRG = 12;
TXSTAbits.TXEN = 1;//Baud Rate de 9600 bps
RCSTAbits.CREN = 1; //Habilita transmissão pelo EUSART
TXSTAbits.SYNC = 0; //Habilita recepção pelo EUSART
RCSTAbits.SPEN = 1; //Configura pinos RC6 e RC7 como TX e RX
}

//Função para transmissão de strings pela serial.


void string_Serial(char *str) {
while (*str != '\0') {
escreve_Serial(*str);
str++;
}
}
//Responsável pela leitura do caractere recebido pela serial
char leia_Serial(void) {
while (!RCIF); //Enquanto RCIF = 0, aguarda o chegado do caractere
return RCREG; //Retorna o caractere recebido
}
//Função para criar uma mensagem de confirmação
void confirmar_operacao(char operacao, char led) {
char mensagem[25];//declara matriz de caracteres para armazenar a mensagem
if (operacao == 'L') {
sprintf(mensagem, "LED %c aceso. Pressione 'DL%c' para apagar\r\n", led, led);//formata a
mensagem caso a operação seja de ligar
} else if (operacao == 'D') {
sprintf(mensagem, "LED %c apagado. Pressione com 'LL%c' para acender\r\n", led, led);
//formata a mensagem caso a operação seja de desligar
}
string_Serial(mensagem); //envia a mensagem
}
10

 Versão em Foto do Código:


11
12
13

 Atividades Propostas:
- Os trechos do código estão explicados detalhadamente nos
comentários deles, juntamente com os registradores e os efeitos
que qualquer alterações teriam neles.
- A explicação do modulo EUSART foi feita na seção 1 na parte da
introdução teórica.
- O caractere 0x0D, também chamado de “Carriage Return” é
utilizado no código como um marcador para identificar o final de
uma string recebida pela comunicação serial. Nesse código em
especifico, o bloco de código condicional abaixo verifica se o
caractere recebido é o 0x0D e executa os blocos de código que
estão dentro da cadeia de ifs, que nesse caso determinam qual led
será ligado ou desligado.

- A programação foi devidamente alterada para incluir uma


mensagem confirmando o processo de acender e desligar o Led,
que foi implementado na função confirmar_operação.

4 RESULTADOS
14

5 CONCLUSÕES
Conclui-se que os objetivos do experimento foram obtidos com sucesso,
apesar de algumas complicações na hora de rodar o código que foram resolvidas
após multiplas revisões do programa em questão.

Você também pode gostar