Cursos / Eletrônica / Projeto de Sistemas RF / Aula

arrow_back Aula 07 - Transmissão de Dados Através do Protocolo RS232 - Parte I

Parte I (Software)

Software do receptor

Como no transmissor, iremos colocar o código aqui e comentar. Basicamente, o que o receptor faz é (em um laço) esperar chegar algum valor na porta serial e, caso chegue, testa se é o valor que estamos esperando. Se for, acende o LED.

x
1
#include <xc.h>
2
#pragma config WDTEN = OFF, LVP = OFF
3
#include "p18f45k20.h"
4
#define _XTAL_FREQ 1000000
5
6
// esta função serve apenas para organizar o código
7
// ela configura os registradores da comunicação
8
// serial. Para este caso, 1200 bps, 8 bits, sem
9
// bit de paridade e 1 stop bit
10
void configura_serial()
11
{
12
      // configura o transmissor
13
      TXSTA = 0b00100000;
14
      // configura o receptor
15
      RCSTA = 0b10010000;
16
17
      // velocidade = Fosc/(64*(SPBRG+1))
18
      SPBRG = 12; // 1200 bps
19
}
20
21
 
22
23
void main (void)
24
{
25
      // variável que armazenará o valor recebido da serial
26
      unsigned char valor_recebido;
27
28
      // chama a função para configurar a serial
29
      configura_serial();
30
31
      // configura a porta B como saída
32
      TRISB = 0;
33
34
      // repete para sempre
35
      while(1){
36
37
            // prepara para receber
38
           RCSTA = 0b10010000;
39
            // espera chegar algum dado na serial
40
           while ((PIR1&32)==0);
41
42
                  // ler o valor recebido
43
                  valor_recebido = RCREG;
44
45
                  // reseta a serial para uma nova recepção
46
                  RCSTA = 0b10000000;
47
48
                  // compara para ver se é o valor correto
49
                  // e então acende o LED
50
                  if (valor_recebido == 85)
51
                        PORTB = 0xff;
52
53
                  // espera alguns instantes
54
                  __delay_ms(500);
55
56
                  // apaga o LED
57
                  PORTB=0;
58
      }
59
}

As linhas do include e da função configura_serial são as mesmas do transmissor, por isso não iremos comentar.

10
1
void main (void)
2
{
3
    // variável que armazenará o valor recebido da serial
4
      unsigned char valor_recebido;
5
6
    // chama a função para configurar a serial
7
    configura_serial();
8
9
    // configura a porta B como saída
10
    TRISB = 0;

Aí se inicia a execução do programa. Definimos uma variável para guardar o valor recebido pela serial e configuramos a porta serial. É necessário também configurar a porta B como saída (pois o LED irá conectar-se a ela).

7
1
// repete para sempre
2
      while(1){
3
            
4
            // prepara para receber
5
            RCSTA = 0b10010000;
6
            // espera chegar algum dado na serial
7
            while ((PIR1&32)==0);

Aqui o laço começa. Precisamos iniciar a recepção colocando o valor de configuração no registrador RCSTA (o mesmo que configuramos na função de configurar a porta). Depois disso prendemos o programa em um laço que só sai quando o 6ª bit do registrador PIR1 é ligado (indicando que chegou um byte na serial).

5
1
// ler o valor recebido
2
            valor_recebido = RCREG;
3
4
            // reseta a serial para uma nova recepção
5
            RCSTA = 0b10000000;

Para ler o byte que chegou, simplesmente, lemos o valor do registrador RCREG. Em seguida, inicializamos o receptor novamente (para que fique pronto novamente para ler outro byte).

12
1
// compara para ver se é o valor correto
2
            // e então acende o LED
3
            if (valor_recebido == 85)
4
                  PORTB = 0xff;
5
6
            // espera alguns instantes
7
            __delay_ms(500);
8
9
            // apaga o LED
10
            PORTB=0;
11
       }
12
}

Finalmente, testamos se o valor recebido foi o esperado (85) e, se for, ligamos os bits da porta B (acendendo o LED). Após isso, esperamos um tempinho (para o usuário ver que o LED acendeu) e depois o apagamos. O laço volta e todo o processo se repete.

Se Liga!

A forma de escrever um byte, usada ainda há pouco (0x55), refere-se a um valor HEXADECIMAL (neste caso o valor 85). Mas porque usamos esse valor?

Bem, poderia ser qualquer valor, mas esse aí em binário é 01010101, o que fica fácil de gerar com um gerador de sinais e testar o receptor sem o transmissor!

Versão 5.3 - Todos os Direitos reservados