Cursos / Eletrônica / Projeto de Sistemas Microcontrolados / Aula
Na Aula 5, foi visto como escrever um programa em assembly, utilizando o ambiente MPLAB, que permitia controlar um semáforo de dois tempos. Na Aula 6, e complementado nesta, foram vistos os conceitos da Linguagem C, sob a ótica de dois compiladores: o CCS e o C18. Vamos, agora, como uma primeira orientação prática em Linguagem C, escrever, num template básico para o CCS, o mesmo programa que permitiu controlar o semáforo de dois tempos da aula citada. Num segundo momento, será pedido que escreva o mesmo template, só que voltado para o compilador C18. Lembre-se que, embora o C seja uma linguagem de mais alto nível que o assembly e que, de uma forma geral, apresente um código com bem menos linhas que o mesmo em assembly, após o processo de compilação, cada linha em linguagem C é transladada e equivale a várias linhas de código em assembly, mas, nem sempre, as mais otimizadas. Aproveitaremos o desenvolvimento desses templates para, também, conhecer um pouco dos dois ambientes de programação: o do CCS e o do C18.
Iniciando com o primeiro template, temos, na Figura 3, a tela do CCS PIC C Compiler com o exemplo do programa que permite controlar o semáforo de dois tempos.
As linhas 2, 3, 4 e 5 possuem comentários simples sobre o código escrito.
A linha 7 é a primeira linha de código propriamente dito. Consiste em informar ao compilador que modelo de microcontrolador será utilizado. Isso é feito por meio da diretiva #include <modelo_do_microcontrolador.h>. Observe que a extensão do arquivo é .h. Em linguagem C, os arquivos com essa extensão possuem definições. Nesse caso, o arquivo possui definições tais como nomes de cada um dos pinos, periféricos (conversor analógico-digital, interface serial, interface paralela etc), bem como funções de inicialização dos periféricos.
A linha 8 contém a diretiva #fuses. Essa diretiva configura os fuse bits do PIC (ou bits de configuração do microcontrolador em uso).
A linha 9 contém a diretiva #use delay(valor_do_clock). Essa diretiva é usada para indicar o valor do oscilador à cristal, utilizado no projeto. Nesse caso, está sendo utilizado um cristal de 20 MHz. O valor deve ser escrito por extenso (20 MHz = 20000000).
Uma vez configurado o PIC, o próximo passo é a declaração das variáveis que serão utilizadas. No Quadro 3, da Aula 5, reeditado aqui como Quadro 1, é possível ver todos os estados que o semáforo de dois tempos pode assumir.
S1 | S2 | |
Verde | RB6 | RB2 |
Amarelo | RB5 | RB1 |
Vermelho | RB4 | RB0 |
Para criar (ou atribuir) os quatro estados em linguagem C, foi criado um vetor com quatro posições usando a sintaxe:
tipo_do vetor nome_do_vetor[tamanho_do_vetor] = {valor1,valor2,valorn}
No exemplo foi criado um vetor do tipo inteiro (int8), cujo nome é state, que apresenta quatro posições, cujos valores são, respectivamente: 0x41 (o x indica representação hexadecimal), 0x21, 0x14, 0x12. Além do vetor, foi criada uma variável chamada idx, do tipo int8, com valor zero.
Após a declaração das variáveis, vem a função principal, que em linguagem C é chamada main. A declaração dessa função aparece na linha 14.
Na linha 16, é utilizada uma função que declara alguns pinos do microcontrolador como saída (para acionar os LEDs do semáforo). Para isso, é utilizada a função set_tris_b(0x00). Essa função declara todos os pinos do PORTB do PIC como saída.
Uma vez determinada a direção (entrada ou saída) dos pinos a serem utilizados, o próximo passo é dizer o valor inicial da saída (alto ou baixo). Para isso, usou-se a função output_b(valor_da_saida). Na linha 17, por exemplo, todos os pinos do PORTB do PIC estão, inicialmente, com valor baixo.
Por último, na linha 19, pode-se ver uma função chamada while(TRUE). Trata-se de uma função que está sempre em repetição (também conhecida como laço infinito). Nesse exemplo, a função possui quatro linhas de código.
A linha 20 utiliza, novamente, a função output_b. Desta vez o argumento da função é um índice do vetor state na posição idx. Ou seja, a primeira vez em que essa linha for executada, o argumento da função output_b será o índice zero do vetor state (0x41).
Na linha 21, o índice é incrementado.
Na linha 22, a função if é utilizada para testar se o índice é o último elemento do vetor. Se for o índice é zerado.
Na linha 23, é utilizada a função delay_ms(valor_do_delay). Essa função consiste em um atraso (em milissegundos) do valor contido no argumento da função. Nesse exemplo, é utilizado um atraso de 1000ms = 1s. O atraso torna-se necessário para que seja possível visualizar a mudança no estado do semáforo de dois tempos.
Após a execução da linha 23, o programa volta a executar do início do while(TRUE), na linha 19.
Versão 5.3 - Todos os Direitos reservados