Roteiro 6 EA870 2S2009

De DCA-Wiki

Contents

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

Agradecimento

O desenvolvimento deste roteiro teve a grata contribuição de Carlos Manuel S Cabral - RA59595

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 /1/,/4/.

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 /3/ Cap 8).

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: 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 /5/. 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, /3/. 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

#include "support_common.h" /* include peripheral declarations and more */
#include <stdio.h>          /* biblioteca padrão de E/S */
#include "MCF52221.h"

#define IPSBAR 0x40000000       // base da memória de registradores

/*Variáveis Globais*/
uint8 * RTCCTL = (uint8 *)IPSBAR + 0x03D3;      // controlador do RTC
uint8 * SECONDS = (uint8 *)IPSBAR + 0x03C7;     // registrador dos segundos
uint8 * HOUR = (uint8 *)IPSBAR + 0x03C2;        // registrador de horas
uint8 * MINUTES = (uint8 *)IPSBAR + 0x03C3;     // 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'. (Hints: verify Integer Types in stdint.h /6/.
  • 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

(Veja na página da disciplina, na opção calendário a data referente à entrega de cada 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:
    • 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

(pdf com ~200KB) http://www.fee.unicamp.br/EA870/referencias/tutorial.pdf

Ferramentas pessoais