Escolar Documentos
Profissional Documentos
Cultura Documentos
Exemplos de Códigos
Fonte em MikroC
www.wrkits.com.br
1 – Introdução
2 – Exemplos
Explicação: Agora foi utilizada uma outra técnica para setar em high os pinos
desejados - os números binários. Quando trabalhamos com números binários,
todos os bits do respectivo port são acionados simultaneamente. Para
determinar que utilizaremos binários, escrevemos 0 (zero) seguido de “bê”
minúsculo (b). Em seguida, escrevem-se 8 caracteres, que devem ser somente
zero (0) ou um (1). Zero indica que aquele pino estará, naquele momento, em
low; e um, por sua vez, indica que o pino estará em high. Por exemplo, se
escrevermos “porta = 0b00000001;”, estamos dizendo que somente o pino RA0
estará em high (a contagem é feita de trás pra frente). Isso significa que o
último caractere é o pino RA0, o penúltimo é o RA1, o antepenúltimo é o RA2 e
assim por diante, até chegar no primeiro que é o RA7. No caso deste
programa, escrevemos “porta = 0b00001000;”, ou seja, estamos setando o
RA3 em nível high, acendendo assim o LED1. Depois de um delay de meio
segundo, o código apresenta “porta = 0b00000100;”, informando que apenas o
RA2 será nível high, seguido de um novo delay de meio segundo. Somando
isso ao laço infinito “while(1)”, teremos o efeito de leds piscando
alternadamente. Para criar outros efeitos, basta alterar o tempo de delay, a
ordem de acionamento dos pinos dos led’s programáveis e diversas outras
alterações. É importante que o usuário experiente diversas alterações nos
códigos fonte aqui descritos, para ir incrementando e aprendendo os mesmos
de maneira intuitiva.
Exemplo 3: Multi efeito com os led’s programáveis
Explicação: Dentro do laço infinito while(1) temos dois laços de condição if,
cada um contendo um laço com loop infinito for(;;) em seu interior. O primeiro
laço de condição, diz que se RA1 passar para nível low, então o
microcontrolador executará o laço for1, repetindo-o constantemente até que o
RESET seja pressionado. O segundo laço de condição define que se RA0
passar para nível low, o laço for2 entrará em operação constante até o resetar
do PIC. Tanto faz qual será o programa ou ordem selecionados pelo usuário,
basta resetar o circuito e escolher qualquer um dos dois “programas”
pressionando S1 ou S2. Adiante, traremos outras explicações sobre o comando
for, muito útil para programação em C.
Exemplo 8: Sequencial de led’s
Explicação: A função main inicia com a declaração de uma variável “w” e com
a informação de que a mesma inicia em nível high. Em seguida, com o
comando “trisb = 0;”, configuramos todo port B do PIC como saída e definimos
que estes pinos iniciarão em nível low (“portb = 0;”). O loop infinito é aplicado
com o auxílio do laço “for(;;)”. A variável “w”, assumirá então todo o port B com
o comando “portb = w;” e um delay de 300 milisegundos determina o tempo de
nossa sequencial. Finalmente, entramos com um shift left (“w=w<<1”), que faz
os bits do port B se deslocarem para esquerda, um após o outro. O laço de
condição “if(w==0)w=1;” determina que ao chegar ao último bit, ele retornará
para o primeiro. Se não utilizássemos este último laço, a sequencial iria “correr”
apenas uma vez. Observe no programa: se tivermos apenas um comando
dentro do laço if, as chaves “{ }”poderão ser suprimidas.
O efeito produzido pelo segundo código fonte do Exemplo 8 é
exatamente o mesmo do que o apresentado pelo primeiro algoritmo. A
diferença está na apresentação do programa, e dos comandos utilizados. Ao
invés de utilizarmos o shift left para deslocarmos os bits um a um, agora nós
faremos os bits se deslocarem manualmente. Esta forma de apresentação de
código, é bem útil para o leitor visualizar perfeitamente como se dá o
deslocamento de bits pelo port B. Com simples alterações de bits, fica bem
simples de se criar diversas sequenciais a partir deste segundo exemplo.
Explicação: Este segundo código, apesar de mais extenso, poderá ser mais
facilmente assimilado pelos iniciantes, já que podemos ver claramente o
deslocamente de bits que produz a sequencial de led’s. Após configurarmos o
port B como saída e para iniciar em low, utilizamos um laço infinito while, que
garante que a sequencial prosseguirá sem interrupções. Então, com a lógica
binária, setamos os pinos com nível 1, na sequência que desejarmos,
intercalados por delays de 300 milisegundos. Observe o número 1 que se
desloca em cada comando “portb = 0b00000001;”. Cada número 1,
corresponde ao respectivo led que estará aceso naquele momento. Então, para
produzir novas sequencias, basta alternar o número 1 à vontade. Você poderá
por exemplo, fazer com que mais led’s estejam acesos ao mesmo tempo,
bastando trocar os zeros (led’s apagados), por uns (led’s acesos), conforme
aprendemos na introdução à lógica digital e também os tempos de delay.
Explicação: Como pode ser observado, o código fonte acima não é muito
extenso, porém nele são empregados novos conceitos. Três variáveis do tipo
char são declaradas inicialmente, enviando zero para cnt. Criamos agora uma
variável do tipo vetor, com o nome “segmento”, e a ela são enviados os
valores, desta vez em hexadecimal, dos números pertinentes aos bits que irão
formar os caracteres de 0 a 9 no display de 7 segmentos. Repare que para
declararmos um vetor em C, utilizamos os comandos de declaração de variável
(char, int, etc), damos um nome ao vetor seguindo as mesmas normas de
nomeação de variáveis e no final abrimos e fechamos colchetes “[ ]”. A forma
genérica de declaração de um vetor em C é esta:
Dando sequência nos projetos com display, iremos agora ilustrar uma
contagem regressiva de 10 segundos com display de 7 segmentos de catodo
comum. Trabalharemos desta vez com lógica binária, pois a principal diferença
deste exemplo para o anterior é no hardware. Como o usuário deve ter
percebido, o uso de um display de 7 segmentos ligado diretamente nas saídas
do microcontrolador, acaba ocupando 7 pinos do portB, impossibilitando
portanto a implementação de outros componentes ou periféricos para o mesmo
PIC. Graças ao uso de outro circuito integrado de tecnologia CMOS, podemos
poupar 3 das 7 saídas normalmente utilizadas para o uso de displays. O
circuito integrado em questão é o decodificador 4511, que converte os 4 bits de
entrada binária, para o número decimal já relativo aos segmentos do display
(veja mais detalhes no tutorial “Exemplos de Circuitos Para Teste dos Códigos
Fonte”). Certamente o usuário já está imaginando o quão mais versátil se
tornará o uso de displays com o auxílio desde chip decodificador. Podemos
também, controlar até dois displays de 7 segmentos independentemente,
utilizando os 8 pinos do portB, bastando para isso utilizar dois CI’s 4511. Com
isso, é possível de se fazer uma contagem de 00 a 99, por exemplo. É claro
que para esta função, também existe a técnica conhecida como multiplexação
de displays, mas isto é outra história. A principal utilidade do Exemplo 14 é o
uso de um único display, ocupando apenas 4 saídas da Paradoxus 9, deixando
as outras 5 livres para implementação de outros componentes ou sistemas
sensores, etc.
Exemplo 14 e respectivo código fonte
Da mesma forma, no segundo laço if, caso S2 for pressionado uma vez
na Paradoxus 9, ocorrerão os eventos abaixo:
Reflexão de infravermelho.
Vício de Obstáculo.
Tabela 5