Buscar

FUNÇÕES - MICROCONTROLADORES

Prévia do material em texto

Microcontroladores e redes 8.1 
 
CAPÍTULO 8 – FUNÇÕES 
 
8.1-) INTRODUÇÃO 
 
 Quando escrevemos um programa podemos ter uma sequência de comandos que se repetem ao longo deste. 
Podemos escrever esta sequência de comandos uma única vez e atribuir-lhe um nome. Quando for necessária a 
execução desta função, basta chamá-la (colocar o nome da função no programa) que a mesma vai ser executada. 
Após a função ser executada, o programa retorna à posição em que estava quando a função foi chamada. 
 
Exemplo: 
 comando 1; 
 comando 2; 
 delay2s (); 
 comando 3; 
 comando 4; 
 comando 5; 
 ... 
 
 
 
 
 As funções em linguagem C são semelhantes as sub-rotinas utilizadas em outras linguagens como BASIC e Assembly. 
 Além das funções que podem ser criadas pelo programador, os compiladores C para microcontroladores 
possuem funções prontas que facilitam a operação com displays LCD, conversores analógico-digital, teclados, 
comunicação com microcontroladores, etc. Estas funções podem ser visualizadas clicando no Help do mikroC (duas 
vezes) e abrindo a pasta mikroC Libraries que se encontra na janela à esquerda. 
 
8.2-) FORMA GERAL 
 
 A forma geral de uma função no compilador mikroC é: 
 
 void nome_da_função () 
 { 
 comando a; 
 comando b; 
 ... 
 } 
 
 nome da função : Especifica o nome pelo qual a função será conhecida pelo resto do programa. 
 
O corpo da função deve ser escrito antes da função principal. Para chamar a função, basta escrever no 
programa o seu nome seguido de parênteses (). 
 
Exemplo 1: Dado o circuito da figura 1, faça um programa, utilizando uma função pisca_led, que funcione de acordo com 
a seguinte lógica: 
 
a-) Pisca 3 vezes o led a uma freqüência de 2 Hz. 
b-) Espera 3 segundos. 
c-) Pisca 6 vezes o led a uma freqüência de 2 Hz. 
d-) Espera 4 segundos. 
e-) Retorna para o início. 
 
OBS: O tempo que o led fica ligado deve ser igual ao tempo que o led fica desligado. O laço de for e os comandos para 
ligar e desligar o led e as temporizações dos itens a e c devem ser colocadas na função pisca_led. As temporizações 
dos itens b e d devem ser colocadas na função principal. 
 
 
 
 
 
 
 
 
 
 
void delay2s () 
{ 
comando a; 
comando b; 
comando c; 
... 
comando x; 
comando y; 
comando z; 
} 
Microcontroladores e redes 8.2 
 
- CIRCUITO ELETRÔNICO: 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
- FLUXOGRAMA: 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
Figura 2 
RD0 
 PIC 16F877A 
+ 5V 
VDD VSS 
6 
14 5 
330 Ω 
 
MCLR 4 
Figura 1 
pisca_led 
 rd0 = 1 
 250 ms 
 fim 
 rd0 = 0 
 250 ms 
i = 0; i < n; i ++ N 
S 
início 
pisca_led 
1 
S fim 
N 
 n = 3 
 3000 ms 
pisca_led 
 n = 6 
 4000 ms 
Microcontroladores e redes 8.3 
 
- PROGRAMA: 
 
int i; // declara a variável i como inteira, 
int n; // declara a variável n como inteira, 
void pisca_led () // início da função pisca_led, 
{ 
 for (i = 0; i < n; i++) // para i variando de 0 a n, faça: 
 { 
 portd =1; // liga o diodo conectado no pino 0 da porta D, 
 delay_ms (250); // espera 250 ms, 
 portd = 0; // desliga o diodo conectado no pino 0 da porta D, 
 delay_ms (250); // espera 250 ms. 
 } 
} 
 
void main() // início da função principal, 
{ 
 trisd =0; // configura os pinos da porta D como saída, 
 portd =0; // zera os pinos da porta D, 
 while(1) // início de um loop infinito, 
 { 
 n = 3; // atribui à variável n o valor 3, 
 pisca_led (); // chama a função pisca_led, 
 delay_ms (3000); // espera 3 segundos, 
 n = 6; // atribui à variável n o valor 4, 
 pisca_led(); // chama a função pisca_led, 
 delay_ms (4000); // espera 4 segundos. 
 } 
} 
 
 A utilização de funções além de simplificar o programa, como no exemplo anterior, também facilita a análise do 
funcionamento e a correção de erros do programa. 
 
 
Exemplo 2: Faça um programa, utilizando laço do for na função principal (main), para ligar em sequência os leds 
conectados nos pinos da porta D, um de cada vez, liga o led 0, espera 1 s, desliga o led 0, depois liga o led 1, espera 1 s, 
desliga o led 1 e assim por diante até o led 7. Os comandos para ligar e desligar o led e as temporizações devem ser 
colocadas em uma função chamada pisca_led. Utilize na função pisca_led o comando ldexp (1,i) que é equivalente a 2i. 
 
- CIRCUITO ELETRÔNICO: 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
PIC 
16F877A 
RD0 
 LED 0 
RD1 
 LED 1 
Figura 3 
 
RD2 
LED 2 
RD3 
 LED 3 
RD4 
 LED 4 
RD5 
LED 5 
RD6 
LED 6 
RD7 
 LED 7 
Microcontroladores e redes 8.4 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
- PROGRAMA: 
 
int i; // declara a variável i como inteira, 
void pisca_led () // início da função pisca_led, 
{ 
 portd = ldexp(1,i); // atribui a porta D o valor 2i, 
 delay_ms (1000); // espera 1s, 
} 
 
void main() // início da função principal, 
{ 
 trisd=0; // configura os pinos da porta D como saída, 
 portd =0; // zera os pinos da porta D, 
 for (i=0; i<8;i++) pisca_led (); // chama a função pisca led oito vezes com i variando de 0 a 7, 
 portd = 0; // zera os pinos da porta D. 
} 
 
8.3-) DECLARAÇÃO DE VARIÁVEIS 
 
 Foi visto no capítulo 6 que declarar uma variável significa informar ao compilador qual é o tipo da variável (int, 
char, float, etc.). 
As variáveis podem ser declaradas no corpo principal do programa ou dentro de uma função. 
 Quando as variáveis são declaradas no corpo principal do programa, ou seja, fora de qualquer função, inclusive 
da função main (), são denominadas variáveis globais pois podem ser acessadas de qualquer ponto do programa. 
 Quando as variáveis são declaradas dentro de uma função, incluindo a função main (), são denominadas variáveis 
locais, pois só podem ser acessadas de dentro da função em que foram declaradas. Uma variável local só existe enquanto 
a função está sendo executada, no momento em que ocorre o retorno da função, as variáveis locais são descartadas. 
 
Exemplo 3: Digite e compile o programa abaixo. Observe que não houve nenhuma mensagem de erro, pois as 
variáveis i e j foram declaradas dentro da função que as acessa. 
 
void teste () 
{ 
 int j; 
 for (j=0; j<10; j++); 
} 
void main () 
{ 
 int i; 
 for (i=0; i<10; i++); 
} 
 
 Declare as duas variáveis dentro de uma mesma função, ou antes da função principal main (), e observe que aparece 
uma mensagem de erro do tipo “Undeclared identifier () in expression”. Declarando-se as duas variáveis fora das funções e no 
início do programa não aparece nenhuma mensagem de erro. 
 
 
 
 
 Figura 4 
pisca_led 
 portd = ldexp(1,i) 
1000 ms 
 fim 
início 
pisca_led 
sim 
não portd = 0 
 fim 
i = 0; i < 8; i ++ 
Microcontroladores e redes 8.5 
 
Exemplo 4: Faça um contador progressivo de 0 a 15, utilizando o laço do for na função principal, que apresente o 
resultado da contagem em binário nos 4 ledsconectados nos pinos de 0 a 3 da porta D mostrados na figura 5. 
Cada contagem deve ser apresentada nos leds durante 1 segundo. Os comandos para ligar e desligar o(s) led(s) e as 
temporizações devem ser colocadas em uma função chamada liga_led. 
 
 
- CIRCUITO ELETRÔNICO: 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
- FLUXOGRAMA: 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 - PROGRAMA: 
 
int j; // declara a variável j como inteira 
void liga_led () // início da função liga_led 
{ 
 portd = j; // coloca na porta D o valor da variável de controle j 
 delay_ms (1000); // espera 1 segundo 
} 
 
void main() // início do programa principal 
{ 
 trisd = 0; // configura os pinos da porta D como saída 
 portd = 0; // zera os pinos da porta D 
 for (j = 0; j < 16; j++) // início do laço de for com j variando de 0 a 15 
 liga_led (); // chama a função liga_led 
 portd = 0; // desliga os leds 
} 
 
 
 
 
 
Figura 6 
não 
sim 
início 
 fim 
 j = 0; j < 16; j++ 
liga_led 
 portd = j 
 1 s 
liga_led 
 fim 
PIC 
16F877A 
RD0 
330 Ω 
LED 0 
RD1 
LED 1 330 Ω 
Figura 5 
 
LED 2 330 Ω 
RD3 
330 Ω 
LED 3 
RD2 
Microcontroladores e redes 8.6 
 
EXERCÍCIOS 
 
1-) Faça um programa, utilizando uma função pisca_led, para acionar os leds conectados nas saídas da porta D, do 
circuito da figura 7, de acordo com a seguinte lógica: 
 
a-) Pisca 20 vezes os leds 0 e 3 a uma freqüência de 1 Hz. 
b-) Espera 5 segundos. 
c-) Pisca 30 vezes os leds 1 e 2 a uma freqüência de 1 Hz. 
d-) Espera 5 segundos. 
e-) Retorna para o item “a”. 
 
OBS: O laço do for, os comandos para ligar e desligar 
os leds e as temporizações devem ser colocadas na 
função pisca_led, ou seja, na função principal devem 
aparecer apenas os comandos de atribuição de valores 
das variáveis e as chamadas da função pisca_led. 
 
2-) Faça um programa, utilizando uma função pisca_led, para acionar os leds conectados nas saídas da porta D do 
circuito da figura 7 de acordo com a seguinte lógica: 
 
a-) Pisca 20 vezes o led 0 a uma freqüência de 0,5 Hz. b-) Espera 3 segundos. 
c-) Pisca 10 vezes o led 1 a uma frequência de 0,5 Hz. d-) Espera 5 segundos. 
e-) Pisca 15 vezes os led 2 e 3 a uma freqüência de 0,5 Hz. f-) Espera 6 segundos. 
g-) Retorna para o item “a”. 
 Ver observação do exercício 1. 
 
3-) Faça um programa, utilizando laço do for na função principal (main), para ligar em sequência os leds conectados nos 
pinos da porta D do circuito da figura 3, um de cada vez, liga o led 7, espera 1 s, desliga o led 7, depois liga o led 6, espera 
1 s, desliga o led 6 e assim por diante até o led 0. Os comandos para ligar e desligar o led e as temporizações devem ser 
colocadas em uma função chamada pisca_led. Utilize na função pisca_led o comando ldexp (1,i) que é equivalente a 2i. 
 
4-) Junte os programas do exemplo 2 e do exercício 3 para fazer ligar o led 0, depois o led 1, .... até o led 7, após liga o led 6, 
depois o led 5, ... até o led 0. 
 
5-) Faça um contador que conte de 0 a 15 e depois de 14 até 0, utilizando o laço do for na função principal, que 
apresente o resultado da contagem em binário nos 4 leds conectados nos pinos de 0 a 3 da porta D mostrados na 
figura 7. Cada contagem deve ser apresentada nos leds durante 1 segundo. Os comandos para ligar e desligar o(s) 
led(s) e as temporizações devem ser colocadas em uma função chamada liga_led, ou seja, na função principal devem 
aparecer apenas os laços de for e as chamadas da função liga_led. 
 
6-) Faça um contador de 0 à F (circuito e programa) utilizando um microcontrolador PIC 16F877A e um display de 7 
segmentos. Cada algarismo deve ser apresentado no display durante 1 segundo. Utilize o laço do for dentro da função 
principal e o comando switch dentro de uma função chamada decodificador cuja função é ligar os segmentos do display para 
mostrar o algarismo correspondente à contagem. A contagem deve ser realizada enquanto o circuito estiver energizado. 
 
7-) Escreva um programa para fazer a contagem de 0 a 99 em decimal e apresentar o resultado da contagem nos 
displays de leds de 7 segmentos mostrados na figura abaixo. Utilize dois laços de for dentro da função principal, um para 
contar o algarismo das dezenas e outro para contar o algarismo das unidades e uma função decodificador para ligar os 
segmentos do display e apresentar o valor das unidades ou das dezenas. 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
Figura 7 
PIC 
16F877A 
RD0 
 330 Ω LED 0 
RD1 LED 1 
330 Ω 
RD2 
 LED 2 330 Ω 
RD3 
330 Ω LED 3 
Figura 8 
RD0 
PIC 
16F877A 
RD1 
RD2 
RD3 
RD4 
RD5 
RD6 
a 
b 
c 
d 
 e 
 f 
 g 
a 
b 
c 
d 
 e 
 f 
 g 
dezenas unidades 
RA4 
2,2 KΩ 
2,2 KΩ 
BC 548 BC 548 
RA5

Outros materiais