Você está na página 1de 4

Roteiro 6 EA870 2S2010 - DCA-Wiki http://calhau.dca.fee.unicamp.br/wiki/index.

php/Roteiro_6_EA870_2S2010

Roteiro 6 EA870 2S2010


De DCA-Wiki

Contents
1 Roteiro 6 - Programação em C e o Real-Time Clock
2 Introdução ao Experimento de Hoje
3 Roteiro de Estudos
4 Roteiro da Aula
4.1 Exemplo 1 - Leds em C
4.1.1 - Programa LEDSC/main.c
4.2 Exemplo 2 - Cronômetro utilizando Real Time Clock - RTC
4.2.1 - Programa CRONOMETRO/main.c
5 Relatório
6 - Referências

Roteiro 6 - Programação em C e o Real-Time Clock


Introdução a programação em C em microcontroladores
Introdução ao Real-Time Clock - RTC

Introdução ao Experimento de Hoje


A partir do experimento de hoje, faremos programação em linguagem C. Em C facilita muito o trabalho do
programador, permitindo a construção de aplicações mais poderosas. Num dos exemplos do experimento de
hoje, teremos a tradução do programa dos leds (feito anteriormente em Assembly) para C. No outro exemplo,
mostramos que com poucas linhas e fazendo uso do RTC (Real-Time Clock - Sistema de Tempo Real do
ColdFire) podemos fazer um simples cronômetro.

Lembre-se: utilize as referências de programação em C em caso de dúvidas /4,5/.

Roteiro de Estudos
1. Por que a programação em C facilita o desenvolvimento de aplicações embarcadas?
2. Se a programação em C facilita tanto, por que ainda utiliza-se programação em Assembly?
3. Como, no meio de um código C, podemos incluir instruções em Assembly?
4. O que é o pré-processador? Quando ele é executado? Dê exemplo de algumas diretivas de pré-processador.
5. O que é o ligador (linker)? Quando ele é executado?
6. O que é um arquivo de extensão .h? Para que ele é utilizado?
7. A plataforma Coldfire/CodeWarrior utiliza carregamento absoluto ou relativo? Explique.
8. Descreva, brevemente, como funciona o sistema de tempo real (RTC) do ColdFire. (Ver referência /1/).

Roteiro da Aula
Vamos executar 2 programas exemplo no relatório de hoje.

Exemplo 1 - Leds em C

Faremos em C uma tradução praticamente direta do programa dos leds apresentado no início do curso. ATENÇÃO:

1 de 4 16/08/2010 17:14
Roteiro 6 EA870 2S2010 - DCA-Wiki http://calhau.dca.fee.unicamp.br/wiki/index.php/Roteiro_6_EA870_2S2010

quando se compila programa fonte em C pode parecer a mensagens de erro: WARNING. Isto acontece quando não se
usa a declaração de modelamento de variáveis: CAST. Veja Seção 4.3 em /9/. Sobretudo, à despeito do aviso, a
maioria das vezes compilação é realizada e o programa poderá ser executado (RUN).

- Programa LEDSC/main.c

unsigned char *DDRTC = (unsigned char*)0x40100027; // endereço do registrador que define a direção
//dos bits de PORTTC.
unsigned char *PORTTC = (unsigned char*)0x4010000F;// endereço de PORTTC

int main(void)
{
unsigned char conteudo, i, mascara;
unsigned int tempo; // variáveis auxliares

*DDRTC = 0xff; // seta a direção de PORTTC como output


mascara = 0x01; // máscara a ser utilizada na operação bit a bit

while(1) // roda para sempre (até um reset)


{
conteudo = 0;

for(i=9; i>0; i--)


{
*PORTTC = conteudo;

for (tempo = 0; tempo<0x000fffff; tempo++){


// não faz nada - tempo para que nossos olhos possam
//enxergar o led acesso
}

conteudo = conteudo << 1; // shift de um bit para esquerda

if(i > 5) // atribui 1 no próximo bit


conteudo = conteudo | mascara ; // operação OU bit-a-bit

}
}
}

Crie um novo projeto no CodeWarrior e utilize o código acima como código principal (main).
Primeiramente, procure entender exatamente o que o código faz.
Dê um make, e faça o debug do projeto. Execute-o linha a linha. Veja o conteúdo das variáveis mudar ao longo
do programa.
Clique em Data>View Mixed. Veja para quais registradores foram mapeados cada variável.

Exemplo 2 - Cronômetro utilizando Real Time Clock - RTC

O ColdFire MCF52221 contém um módulo extremamente útil: o RTC. Ele é constituído, basicamente, de contadores
em cascata, alimentados por um clock de 1Hz (1 segundo), que contam segundos, minutos, horas e até dias. Pode-se
ter uma idéia de como seu circuito funciona vendo o datapath do cap.8, /1/. Um interessante recurso do Debugger do
CodeWarrior é o I/O console: através dele, pode-se utilizar as famosas funções de input/ouput de C (scanf, printf,
getchar...). Utilizando esse recurso, faremos um simples cronômetro. Considere o programa abaixo:

- Programa CRONOMETRO/main.c

2 de 4 16/08/2010 17:14
Roteiro 6 EA870 2S2010 - DCA-Wiki http://calhau.dca.fee.unicamp.br/wiki/index.php/Roteiro_6_EA870_2S2010

#include "support_common.h" /* include peripheral declarations and more */


#include <stdio.h> /* biblioteca padrão de E/S */
#include "MCF52221.h"

uint8 * RTCCTL = (uint8 *)0x400003D3; // controlador do RTC


uint8 * SECONDS = (uint8 *)0x400003C7; // registrador dos segundos
uint8 * HOUR = (uint8 *)0x400003C2; // registrador de horas
uint8 * MINUTES = (uint8 *)0x400003C3; // registrador de minutos

void inicializaRTC ()
{

*SECONDS = 0;
*MINUTES = 0;
*HOUR = 0;

int main(void)
{
int tempo, horas, minutos, segundos;

printf("Por quantos segundos você quer que o cronômetro rode?\n");


scanf("%d", &tempo);

/* algoritmo de conversão segundos-> horas, minutos, segundos.*/


horas = tempo/3600;
if(horas)
tempo = tempo - (3600*horas);

minutos = tempo/60;

if(minutos)
tempo = tempo - (60*minutos);

segundos = tempo;

inicializaRTC(); //zera-se os contadores

for (;;)
{
printf ("%d %d' %d'' \n", *HOUR, *MINUTES, *SECONDS);
if(*SECONDS >= segundos)
{
if(*MINUTES >= minutos)
{
if(*HOUR >= horas)
break;
}
}
}
printf(" FIM DA CONTAGEM \n ");
return 0;

Crie um novo projeto no CodeWarrior e utilize o código acima como código principal (main).
Veja como os tipos uint8, uint16... são definidos no arquivo header 'MCF52221.h'.
Baseado nisso, verifique qual o tamanho e qual a faixa de representação de cada um desses tipos (considere a
opção de 4-bytes integer do compilador).
Procure entender exatamente o que o programa faz.
Dê um make, e faça o debug. Verifique a janela I/O console.

Relatório
1. Faça o fluxograma para os programas dos exemplos 1 e 2.
2. Utilizando como base o exemplo 1, construa um programa que acenda os leds usando o seguinte padrão:
Led 1 pisca uma vez. (todos outros leds apagados)
Led 2 pisca 2 vezes. (todos outros leds acesos)
Led 3 pisca 3 vezes. (todos outros leds apagados)
Led 4 pisca 4 vezes. (todos outros leds acesos)
Reinicia o ciclo.
3. Faça o fluxograma do seu programa, feito no item 2.
4. Utilizando como base os dois exemplos, construa um programa (utilizando o RTC) que:

3 de 4 16/08/2010 17:14
Roteiro 6 EA870 2S2010 - DCA-Wiki http://calhau.dca.fee.unicamp.br/wiki/index.php/Roteiro_6_EA870_2S2010

Inicialmente, pergunta ao usuário quantos segundos o led1 deve ficar aceso.


Faz o mesmo para os leds 2, 3 e 4.
Então, os leds deverão ser acesos utilizando os valores fornecidos, da seguinte forma:
Se o usuário digitou 2 segundos para o led1, ele deverá ficar aceso nos segundos 1 e 2, apagado
nos segundos 3 e 4, aceso nos segundos 5 e 6....etc.
O mesmo deverá ser feito para todos os leds.
5. Faça um fluxograma do seu programa, feito no item 4.

- Referências
Refer. /1/ - MCF52223 ColdFire® Integrated Microcontroller Reference Manual - MCF52223RM.
http://www.freescale.com/files/32bit/doc/ref_manual/MCF52223RM.pdf
Refer. /4/ - Referência rápida para o MCF52223 http://www.fee.unicamp.br/EA870/referencias
/RefRapidaSet09.pdf
Refer. /5/ - Referência rápida Linguagem C - http://www.fee.unicamp.br/EA870/referencias/Apostila-
C-Coldfire.pdf
Refer. /9/ - Tutorial de programação C - Murillo Fernandes Bernardes - http://www.fee.unicamp.br/EA870
/referencias/tutorial.pdf

Retirado de "http://calhau.dca.fee.unicamp.br/wiki/index.php/Roteiro_6_EA870_2S2010"

Está página foi modificada pela última vez em 20:48, 3 August 2010.
Esta página foi acessada 6 vezes.
Política de privacidade
Sobre a DCA-Wiki
Disclaimers

4 de 4 16/08/2010 17:14

Você também pode gostar