Buscar

relatorio 3

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 3, do total de 19 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 6, do total de 19 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 9, do total de 19 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Prévia do material em texto

UNIVERSIDADE FEDERAL DO MARANHÃO – UFMA 
CENTRO DE CIÊNCIAIS EXATAS E TECNOLÓGICAS – CCET
DEPARTAMENTO DE ENGENHARIA ELÉTRICA 
CURSO DE GRADUAÇÃO EM ENGENHARIA ELÉTRICA
	
CÂNDIDO JOSÉ FERNANDES AGUIAR
TAYSSARA ELIZAVIETA MARTINS VARÃO
LABORATÓRIO DE APLICAÇÃOES COM MICROCOMPUTADORES
GUIA DE LABORATÓRIO 3
SÃO LUÍS – MA
2011
 CÂNDIDO JOSÉ FERNANDES AGUIAR
TAYSSARA ELIZAVIETA MARTINS VARÃO
LABORATÓRIO DE APLICAÇÃOES COM MICROCOMPUTADORES
GUIA DE LABORATÓRIO 3
Relatório apresentado à disciplina de Laboratório de Microprocessadores da Universidade Federal do Maranhão a fim de obter nota referente ao primeiro semestre de 2011.
 Profª: Dsc. Denivaldo Lopes.
	
SÃO LUÍS – MA
2011
SUMÁRIO
OBJETIVO
Desenvolver programas em linguagem C a fim de resolver problemas utilizando o microcontrolador MC9S12C128CFUE por meio do compilador Codewarrior IDE 5.1 – Freescale.
CONHECIMENTOS A SEREM DESENVOLVIDOS
Programação de microcontrolador HCS12, incluindo utilização de portas de entrada/saída e temporizadores.
INTRODUÇÃO
Neste relatório da disciplina Laboratório de Aplicações com Microcontroladores são apresentados alguns problemas resolvidos em laboratório utilizando-se a programação em linguagem C por meio da ferramenta CodeWarrior 5.1. O software CodeWarrior Development Studio consiste em uma ferramenta da Freescale para o desenvolvimento de projetos, que utilizam os microcontroladores da família HCS12. 
O primeiro problema mostra a implementação de um contador binário para contagem de 0 a 16 utilizando um temporizador e quatro leds devidamente configurados. O problema é similar ao já implementado na disciplina de laboratório de circuitos digitais com a ferramenta Labview.
O segundo problema mostra a aplicação de temporizadores em um sistema automotivo no controle da velocidade de para-brisas e na sinalização de direção de um veículo. 
ATIVIDADES
Crie um contador que faça a contagem de 0 a 16 em binário (oito bits) mostrando o resultado nos LEDs (LED1, LED2, LED3, LED4), sendo que no inicio a contagem é crescente e a cada 500ms, mas se o botão SW1 for pressionado, então a contagem ocorre a cada 1s, se o botão SW2 for pressionado, então a contagem ocorre a cada 2s.
A configuração dos botões, leds e o temporizador da placa foi feita conforme tabela seguinte:
	COMPONENTE
	CONFIGURAÇÃO NO CODEWARRIOR
	LED 1
	PB 4
	LED 2
	PB 5
	LED 3
	PB 6
	LED 4
	PB 7
	SW 1
	PP 0
	SW 2
	PP 1
O temporizador foi configurado para um período de interrupção correspondente a 500 ms e a CPU com frequência de clock igual a 4 MHz.
Segue o código implementado no Codewarrior IDE 5.1 usando linguagem C para o problema. O programa presente no arquivo main.c apresenta apenas o código para habilitar o temporizador temp, conforme mostrado a seguir:
/** ###################################################################
** Filename : Project.c
** Project : Project
** Processor : MC9S12C128CFU16
** Version : Driver 01.14
** Compiler : CodeWarrior HC12 C Compiler
** Date/Time : 11/07/2011, 15:59
** Abstract :
** Main module.
** This module contains user's application code.
** Settings :
** Contents :
** No public methods
**
** ###################################################################*/
/* MODULE Project */
/* Including needed modules to compile this module/procedure */
#include "Cpu.h"
#include "Events.h"
#include "botao_1s.h"
#include "botao_2s.h"
#include "temp.h"
/* Include shared modules, which are used for whole project */
#include "PE_Types.h"
#include "PE_Error.h"
#include "PE_Const.h"
#include "IO_Map.h"
/* User includes (#include below this line is not maintained by Processor Expert) */
void main(void)
{
 /* Write your local variable definition here */
 /*** Processor Expert internal initialization. DON'T REMOVE THIS CODE!!! ***/
 PE_low_level_init();
 /*** End of Processor Expert internal initialization. ***/
 /* Write your code here */
 
 temp_Enable(); /* habilita o temporizador temp */
 
 for(;;){
 
 }
 /*** Processor Expert end of main routine. DON'T MODIFY THIS CODE!!! ***/
 for(;;){}
 /*** Processor Expert end of main routine. DON'T WRITE CODE BELOW!!! ***/
} /*** End of main routine. DO NOT MODIFY THIS TEXT!!! ***/
/* END Project */
/*
** ###################################################################
**
** This file was created by Processor Expert 3.02 [04.44]
** for the Freescale HCS12 series of microcontrollers.
**
** ###################################################################
*/
A seguir tem-se o arquivo events.c com as instruções a serem realizadas pelo temporizador a cada interrupção.
/** ###################################################################
** Filename : Events.c
** Project : Project
** Processor : MC9S12C128CFU16
** Component : Events
** Version : Driver 01.04
** Compiler : CodeWarrior HC12 C Compiler
** Date/Time : 11/07/2011, 15:58
** Abstract :
** This is user's event module.
** Put your event handler code here.
** Settings :
** Contents :
** temp_OnInterrupt - void temp_OnInterrupt(void);
**
** ###################################################################*/
/* MODULE Events */
#include "Cpu.h"
#include "Events.h"
/* User includes (#include below this line is not maintained by Processor Expert) */
#pragma CODE_SEG DEFAULT
/*
** ===================================================================
** Event : temp_OnInterrupt (module Events)
**
** Component : temp [TimerInt]
** Description :
** When a timer interrupt occurs this event is called (only
** when the component is enabled - <Enable> and the events are
** enabled - <EnableEvent>). This event is enabled only if a
** <interrupt service/event> is enabled.
** Parameters : None
** Returns : Nothing
** ===================================================================
*/
int volta=1;
int contador=1;
int aux=1;
 
void temp_OnInterrupt(void)
{
 /* Write your code here ... */
 
 if(!botao_1s_GetVal()){
 
 volta=2;
 
 }
 
 if(!botao_2s_GetVal()){
 
 volta=4;
 
 }
 
 if(contador==volta){
 
 if(aux==16){
 
 aux=0;
 
 }
 
 if(aux&(0x01)){
 
 led1_ClrVal();
 
 } else{
 
 led1_SetVal();
 
 }
 
 if(aux&(0x02)){
 
 led2_ClrVal();
 
 }else{
 
 led2_SetVal();
 
 }
 
 if(aux&(0x04)){
 
 led3_ClrVal();
 
 } else{
 
 led3_SetVal();
 
 }
 
 if(aux&(0x08)){
 
 led4_ClrVal();
 
 } else{
 
 led4_SetVal();
 
 }
 
 aux++;
 
 }
 
 contador++;
 
 if(contador>volta){
 
 contador=1;
 
 }
} 
 
/* END Events */
/*
** ###################################################################
**
** This file was created by Processor Expert 3.02 [04.44]
** for the Freescale HCS12 series of microcontrollers.
**
** ###################################################################
*/
O programa utiliza apenas um temporizador habilitado com período de interrupção igual a 500ms para controlar a velocidade da contagem. Dessa forma, é necessário inserir certo atraso no temporizador que a contagem seja realizada no intervalo correto. Tal atraso é determinado pelas variáveis de controle contador e volta. 
Primeiramente, o programa checa quais das chaves estão acionadas – a chave para contagem a cada 1 ou 2 segundo. (Citarei o exemplo para o casoem que a chave acionada é de 1s). Caso a chave de 1s esteja acionada a variável volta recebe o valor inteiro 2, caso contrário, recebe o valor inteiro 4. Em seguida, checa-se se o valor correspondente à variável volta é igual a variável contador. Caso a condição seja verdadeira, ou seja, ambas as variáveis sejam iguais, a contagem é realizada utilizando-se a máscara mostrada. Caso contrário, a variável contador é apenas incrementada ao final do laço de contagem e o contador tem um atraso correspondente a 1s que é o valor da contagem a ser realizada na próxima interrupção do temporizador. 
Por conseguinte, a interrupção verifica que a variável contador é igual ao valor da variável volta entrando assim no laço de contagem por meio da máscara mostrada em sala. Por fim, o valor da variável contador retorna ao seu valor inteiro inicial, um, anterior à contagem de 1s, para que uma nova contagem seja realizada. 
De maneira análoga ocorre a contagem quando o botão SW2 estiver pressionado (contagem de 2s). Nessa situação a variável contador será incrementada 3 vezes resultando em atraso total de 4s correspondente à contagem solicitada pelo usuário.
A figura 1 seguinte mostra a imagem da tela do programa Codewarrior IDE 5.1 Freescale com o código para o problema 4.1.
Figura 1: Tela do programa Codewarrior IDE 5.1 Freescale com o problema proposto 4.1.
Um automóvel possui um sistema embarcado responsável por controlar o painel do veiculo. Digamos que o limpados de para-brisas seja acionado pela chave SW3 (bit 1), direção direita é acionado pela chave SW1 (bit 2) e a direção esquerda é acionado pela chave SW1 (bit 3). O limpador de para-brisa possui 4 velocidade, 1s, 2s, 4s, 8s. Inicialmente, o limpador de para-brisa começa com a velocidade 8s. Estando SW1 (bit 1) ativado e SW1 for pressionado, então o limpador de para-brisa aumenta a velocidade, passando para 4s, pressionado mais uma vez, passa para 2s e, pressionado outra vez passa para 1s. a chave SW2 faz o processo inverso, ou seja, estando em 1s, se for pressionado passa para 2s, pressionado SW2 outra vez passa para 4s, e, pressionado, passa para 8s. SW1 serve para aumentar a frequência do limpador de para-brisa e SW2 serve para diminuir a frequência do limpador de para-brisa. No caso do sinalizador de direção, então a frequência é de 1s. Utilize LED1 para sinalizar a frequência do limpador de para-brisa. Utilize LED2 para indicar a seta de direção esquerda, e o LED3 para indicar a seta de direção direita.
A configuração dos botões, leds e o temporizador da placa foi feita conforme tabela seguinte:
	COMPONENTE
	CONFIGURAÇÃO NO CODEWARRIOR
	SW 1 
	PP 0
	SW 2
	PP 1
	SW3_1
	PB 0
	SW3_2
	PB 1
	SW3_3
	PB 2
	LED 1
	PB 4
	LED 2
	PB 5
	LED 3
	PB 6
	LED 4
	PB 7
O temporizador foi configurado para um período de interrupção correspondente a 1000ms e a CPU com frequência de clock igual a 4 MHz.
Segue o código implementado no Codewarrior IDE 5.1 usando linguagem C para o problema. O programa presente no arquivo main.c apresenta apenas o código para habilitar o temporizador temp, conforme mostrado a seguir:
/** ###################################################################
** Filename : Project_2.c
** Project : Project_2
** Processor : MC9S12C128CFU16
** Version : Driver 01.14
** Compiler : CodeWarrior HC12 C Compiler
** Date/Time : 11/07/2011, 17:15
** Abstract :
** Main module.
** This module contains user's application code.
** Settings :
** Contents :
** No public methods
**
** ###################################################################*/
/* MODULE Project_2 */
/* Including needed modules to compile this module/procedure */
#include "Cpu.h"
#include "Events.h"
#include "parabrisa_sw31.h"
#include "dir_direita_SW32.h"
#include "dir_esquerdasw33.h"
#include "aumenta_sw1.h"
#include "dimunui_sw2.h"
#include "brisa_LED1.h"
#include "esquerda_led2.h"
#include "direria_led3.h"
#include "temp.h"
#include "sinal_LED4.h"
/* Include shared modules, which are used for whole project */
#include "PE_Types.h"
#include "PE_Error.h"
#include "PE_Const.h"
#include "IO_Map.h"
/* User includes (#include below this line is not maintained by Processor Expert) */
void main(void)
{
 /* Write your local variable definition here */
 /*** Processor Expert internal initialization. DON'T REMOVE THIS CODE!!! ***/
 PE_low_level_init();
 /*** End of Processor Expert internal initialization. ***/
 /* Write your code here */
 
 for(;;){
 
 if(parabrisa_sw31_GetVal()){
 
 temp_Enable();
 
 } else{
 
 sinal_LED4_SetVal();
 
 brisa_LED1_SetVal();
 
 temp_Disable(); 
 
 }
 
 if((!dir_direita_SW32_GetVal())&&(!dir_esquerdasw33_GetVal())){
 
 direria_led3_SetVal();
 
 esquerda_led2_SetVal();
 
 
 }
 
 if((dir_esquerdasw33_GetVal()) && (dir_direita_SW32_GetVal() )){
 
 esquerda_led2_SetVal();
 
 direria_led3_SetVal();
 
 }
 
 if((!dir_esquerdasw33_GetVal())&&(dir_direita_SW32_GetVal())){
 
 brisa_LED1_SetVal();
 direria_led3_ClrVal();
 
 }
 
 if((!dir_direita_SW32_GetVal())&&(dir_esquerdasw33_GetVal())){
 
 esquerda_led2_ClrVal();
 
 direria_led3_SetVal();
 
 
 }
 
 
 }
/*** Processor Expert end of main routine. DON'T MODIFY THIS CODE!!! ***/
 for(;;){}
 /*** Processor Expert end of main routine. DON'T WRITE CODE BELOW!!! ***/
} /*** End of main routine. DO NOT MODIFY THIS TEXT!!! ***/
/* END Project_2 */
/*
** ###################################################################
**
** This file was created by Processor Expert 3.02 [04.44]
** for the Freescale HCS12 series of microcontrollers.
**
** ###################################################################
*/
A seguir tem-se o arquivo events.c com as instruções a serem realizadas pelo temporizador a cada interrupção.
/** ###################################################################
** Filename : Events.c
** Project : Project_2
** Processor : MC9S12C128CFU16
** Component : Events
** Version : Driver 01.04
** Compiler : CodeWarrior HC12 C Compiler
** Date/Time : 11/07/2011, 17:15
** Abstract :
** This is user's event module.
** Put your event handler code here.
** Settings :
** Contents :
** No public methods
**
** ###################################################################*/
/* MODULE Events */
#include "Cpu.h"
#include "Events.h"
/* User includes (#include below this line is not maintained by Processor Expert) */
#pragma CODE_SEG DEFAULT
/*
** ===================================================================
** Event : temp_OnInterrupt (module Events)
**
** Component : temp [TimerInt]
** Description :
** When a timer interrupt occurs this event is called (only
** when the component is enabled - <Enable> and the events are
** enabled - <EnableEvent>). This event is enabled only if a
** <interrupt service/event> is enabled.
** Parameters : None
** Returns : Nothing
** ===================================================================
*/
void temp_OnInterrupt(void)
int volta=8;
int contador=1;
{
 /* Write your code here ... */
 
 if(!aumenta_sw1_GetVal()){
 
 sinal_LED4_ClrVal();
 
 volta=volta/2;
 
 if(volta<1){
 
 volta=1;
 
 }
 
 }
 
 if(!dimunui_sw2_GetVal()){
 
 sinal_LED4_ClrVal();
 
 volta=volta*2;
 
 if(volta>8){volta=8;
 
 }
 
 }
 
 if(contador==volta){
 
 brisa_LED1_ClrVal();
 
 }
 
 contador=contador+1;
 
 if(contador>volta){
 
 contador=1;
 
 }
 
} 
}
/* END Events */
/*
** ###################################################################
**
** This file was created by Processor Expert 3.02 [04.44]
** for the Freescale HCS12 series of microcontrollers.
**
** ###################################################################
*/
De forma genérica o programa criado realiza os seguintes passos. Na função main.c checa quais chaves estão pressionadas a fim de habilitar ou não o temporizador. Este apenas é habilitado quando a chave referente ao para-brisas está acionada (SW3_1). Nesse caso, como o temporizador está habilitado para um período de ciclo de 1000ms é preciso inserir um retardo para que o LED1, representando o para-brisa, possa atuar na frequência estabelecida. Tal fato é realizado da mesma forma que no exemplo anterior por meio das variáveis inteiras volta e contador. A diminuição da velocidade do para-brisa é realizado duplicando a variável volta na condição de checagem do botão SW2 (diminui velocidade), enquanto o aumento na frequência é feito dividindo-se por dois a mesma variável volta na condição que checa o estado do botão SW1 (aumenta velocidade). 
Caso SW3_1 não esteja acionado significa que o sinalizador de direção estará habilitado não necessitando da atuação do temporizador para o seu acionamento pois a frequência de atividade é sempre de 1s ou 1000ms. Dessa forma são feitas apenas teste de condições para saber qual dos sinalizadores (direita ou esquerda) estará habilitado.
Figura 2: Tela do programa do arquivo Main.c do Codewarrior IDE 5.1 Freescale com o problema proposto 4.2.
Figura 3: Tela do programa do arquivo Events.c do Codewarrior IDE 5.1 Freescale com o problema proposto 4.2.
CONCLUSÃO 
Por fim, verifica-se que a implementação utilizando o microcontrolador MC9S12C128CFUE foi satisfatória na resolução dos problemas propostos apresentando algumas vantagens como versatilidade, velocidade e custo/beneficio relativamente baixo quando comparados a outras alternativas. 
REFERÊNCIAS
Ivan V. Idoeta e Francisco G. Capuano, Elementos de Eletrônica Digital, 40a ed., Editora Érica, 2009.
Data Sheet MC9S12C Microcontrollers Family. Freescale Semiconductor.
Manual do usuário do Codewarrior Development Studio IDE 5.4. Freescale Semiconductor.
Guias de Laboratório do professor Denivaldo Lopes.

Outros materiais