Loading [MathJax]/jax/output/HTML-CSS/jax.js

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)

Protocolo

É importante lembrar que, embora simples, este programa que iremos usar possui as características de uma transmissão serial. Neste caso, quando definimos que o byte que iremos transmitir para sinalizar o acendimento do LED é o byte 0x55, estamos definindo nosso próprio protocolo (que irá estar posicionado dentro de outro protocolo, que é o RS232). Ao final da aula, existe uma atividade que irá incrementar este protocolo, fazendo com que existam mais LEDs e mais botões.

Software do Transmissor

Como explicamos anteriormente, este programa inicial é super simples. Ele apenas irá verificar o estado de uma chave e caso esta chave seja pressionada um byte será enviado para a porta serial.

A seguir está a listagem. Iremos comentar passo a passo as partes do código para entendermos o que se passa.

x
1
// inclui a biblioteca do compilador do MPLAB
2
#include <xc.h>
3
4
// desliga as configurações watchdog time e programação em baixa tensão
5
#pragma config WDTEN = OFF, LVP = OFF
6
7
#include "p18f45k20.h"  
8
// "PBADEN = OFF" define que os bits 1, 2, 3 e 4 da porta B
9
// devem ser configurados como pinos I/O digitais.
10
#pragma config PBADEN = OFF
11
12
// define a frequência utilizada pelo microcontrolador
13
#define _XTAL_FREQ 1000000
14
15
// esta função serve apenas para organizar o código
16
// ela configura os registradores da comunicação
17
// serial. Para este caso, 1200 bps, 8 bits, sem
18
// bit de paridade e 1 stop bit
19
void configura_serial()
20
{
21
     // configura o transmissor
22
     TXSTA = 0b00100000;
23
     // configura o receptor
24
     RCSTA = 0b10010000;
25
26
      // velocidade = Fosc/(64*(SPBRG+1))
27
     SPBRG = 12; // 1200 bps
28
}
29
30
void main()
31
{
32
     // variável que verificará o estado da chave
33
     unsigned char chave;
34
35
      // configura a porta B como entrada
36
     TRISB = 0xff;
37
38
      // chama a função para configurar a serial
39
     configura_serial();
40
41
     // Configura o PORTD, como saída para sinalizar envio
42
     TRISD = 0x00;
43
44
      // repete para sempre
45
     while(1){
46
47
            // ler o estado da chave
48
            chave = PORTB;
49
50
            // se a chave estiver pressionada
51
            if (chave>0) {
52
                // transmite o valor 85 (bits alternados)
53
                TXREG = 0b01010101;
54
55
                //acende o led indicador de transmissão
56
                PORTD = 0x01;
57
58
                // espera transmitir o byte
59
                while (!(PIR1&0b00010000));
60
61
                // aguarda meio segundo
62
                __delay_ms(500);
63
64
                // apaga o led indicador de transmissão
65
                PORTD = 0x00;
66
            }
67
    }
68
}

1
1
#include "p18f45k20.h"

Essa linha inclui no programa o arquivo com as funções que o PIC possui e define as variáveis que serão nomes dos registradores. Observe que ela tem o nome exato do PIC que iremos usar, pois os registradores e funções variam de PIC para PIC.

10
1
void configura_serial()
2
{
3
    // configura o transmissor
4
    TXSTA = 0b00100000;
5
    // configura o receptor
6
    RCSTA = 0b10010000;
7
8
    // velocidade = Fosc/(64*(SPBRG+1))
9
    SPBRG = 12; // 1200 bps
10
}

Nesse block, estamos definindo uma função que configura os parâmetros da porta serial. A primeira coisa a fazer é configurar a transmissão (ver datasheet do PIC) no registrador TXSTA. É aí que definimos que não vai haver bit de paridade e que teremos apenas um stop bit. Em uma transmissão serial, temos que configurar também o registrador de recepção (embora não seja utilizado aqui) e isso é feito no registrador RCSTA. Após isso, temos que ajustar o divisor de clock que fará com que a taxa de transmissão seja a que desejamos. Isso é feito no registrador SPBRG.

Se Liga!

Para calcular o valor a ser colocado no registrador SPBRG, temos que ter a frequência de clock do PIC e a taxa de transferência desejada. Dessa forma, fazemos o seguinte:

SPBRG=Fclock64BPS1

No caso do nosso exemplo, como queremos 1200bps e iremos usar um cristal de 1MHz (na verdade é a frequência do oscilador interno do microcontrolador), temos:

SPBRG=10000006412001=12

13
1
void main()
2
{
3
      // variável que verificará o estado da chave
4
      unsigned char chave;
5
6
      // configura a porta B como entrada
7
      TRISB = 0xff;
8
9
      // chama a função para configurar a serial
10
      configura_serial();
11
12
      // Configura o PORTD, como saída para sinalizar envio
13
     TRISD = 0x00;

Aqui começa a execução. Definimos uma variável para receber o estado da chave (que iremos pressionar para enviar o byte), definimos a porta que a chave está ligada (no caso a porta B do PIC) como entrada, chamamos a função que configura a porta serial (que comentamos há pouco) e por fim, configuramos a porta D (onde o led de indicação de transmissão está conectado) como saída para podermos acendê-lo quando realizar uma transmissão.

5
1
// repete para sempre
2
      while(1){
3
4
            // ler o estado da chave
5
            chave = PORTB;

Aqui é o laço principal do programa. Ele repetirá para sempre e a primeira coisa que faz é ler o estado da porta B (e, consequentemente, da chave).

20
1
// se a chave estiver pressionada
2
          if (chave>0) {
3
4
                // transmite o valor 85 (bits alternados)
5
                TXREG = 0b01010101;
6
7
                //acende o led indicador de transmissão
8
                PORTD = 0x01;
9
10
                // espera transmitir o byte
11
                while (!(PIR1&0b00010000));
12
13
                // aguarda meio segundo
14
                __delay_ms(500);
15
16
                // apaga o led indicador de transmissão
17
                PORTD = 0x00;
18
          }
19
      }
20
}

Caso a chave seja pressionada, um valor que não é zero (e que depende de qual bit a chave esteja conectada) irá aparecer na variável chave. Então, nós acendemos o led para indicar a transmissão, transmitimos o byte (bastando escrever no registrador TXREG) e depois esperamos a transmissão terminar (testando o 5º bit do registrador PIR1), além de esperar meio segundo para então apagar o led.

Versão 5.3 - Todos os Direitos reservados