Você está na página 1de 22

Curso: Nota

Disciplina:
Professor: Carlos Eduardo Carvalho
Turma: Data:
Aluno:
Tutorial Básico CodeWarrior

O CodeWarrior (Guerreiro do Código) é um software de compilação para os


microcontroladores da Freescale. A Freescale (www.freescale.com) é o fabricante dos componentes
da Motorola.
Este tutorial tem o objetivo de auxiliar o início da programação do microcontrolador
MC9S08QG8.
Vamos conhecer a interface de programação, o debugger e o simulador. Todos os programas
serão escritos em linguagem C, mas neste tutorial eu não tratarei especificamente da linguagem C.
O programa que será usado como exemplo irá fazer um led piscar enquanto um botão estiver
pressionado e fará o led ficar apagado enquanto o botão estiver solto.
O software utilizado é o CodeWarrior IDE version 5.9.0. Special Edition que pode ser baixado
gratuitamente do site da Freescale.

A interface do CodeWarrior:
Abrindo o CodeWarrior IDE, você verá a tela da figura 1.

Figura 1 – Tela inicial do CodeWarrior


Se aparecer uma tela pedindo que se faça o registro, clique na opção de registrar mais tarde.
Quando ele disser que o software expirou, ele irá indicar que é necessário rodar um arquivo que está na
mesma pasta onde o software foi instalado. Verifique o nome do arquivo na mensagem e execute – o.
Isso acontece porque a Freescale modificou a forma como os softwares gratuitos eram
distribuídos. Antes, era necessário registrar o software no site e agora não é mais necessário. Caso não
apareça nenhuma tela diferente da figura 1, vá em frente com o tutorial.

Criando um novo projeto:


Na tela inicial, clique no botão Create New Project. A tela da figura 2 deverá aparecer.

Figura 2 – Tela de seleção do microcontrolador.


Na tela da figura 2, podemos selecionar qual microcontrolador será utilizado. O CodeWarrior
abrange muitos componentes da Freescale. No nosso caso, utilizaremos o CI HCS08, a família
HCS08Q e o componente HCS08QG8.
Selecione este componente e na tela da direita (Conections) selecione a opção Full Chip
Simulation, conforme a figura 3.
Figura 3 – Seleção do componente e da forma de conexão.
Escolhemos esta conexão pois iremos simular um programa, sem realmente gravá – lo em um
microcontrolador real. Esta opção é muito boa quando estamos desenvolvendo programas, pois não
precisamos gravar e regravar o micro.
Feito isso, pressione Next.
Na próxima tela escolhemos a linguagem que será usada na programação, o nome do projeto e o
local onde ele será salvo.
Em programação de microcontroladores, sempre trabalhamos com projetos, mas o próprio
compilador organiza a maioria das coisas pra nós, então fica tudo fácil !!!
Selecione a opção de linguagem C, nomeie o arquivo como Tutorial_1 e escolha um local para
salvá – lo. No meu caso, esta tela ficará conforme a figura 4.
Figura 4 – Escolha da linguagem, do nome do projeto e do local.
Nesta tela podemos clicar em Finish, pois nenhuma outra opção será modificada no projeto.
A tela que aparece deverá ser igual a da figura 5.
Nesta figura, o arquivo da função principal (main), está marcado de vermelho. É nele que
iremos escrever o programa.
Clicando duas vezes sobre o arquivo main, você verá uma tela igual a figura 6.
Figura 5 – Projeto Tutorial_1

Figura 6 – Arquivo main aberto.


Conhecendo a função principal:
Vamos dar uma olhada de perto no que vem escrito no arquivo main.
As duas primeiras linhas são:

#include <hidef.h> /* for EnableInterrupts macro */


#include "derivative.h" /* include peripheral declarations */

Podemos ver que a diretiva #include continua presente, mas dessa vez em azul. Da mesma
forma que os comentários. Na verdade, todas as regras de sintaxe da linguagem C continuam a mesma
e deverão ser respeitadas na programação dos microcontroladores.
Estas duas linhas estão incluindo dois arquivos. O arquivo hidef.h e o arquivo derivative.h.
Este último pode ser encontrado na pasta Includes.

Figura 7 – Mostrando como o arquivo derivative.h chama a biblioteca do microcontrolador.


Quando abrimos o arquivo derivative.h, vemos uma tela igual a da figura 7. Ali podemos ver a
seguinte linha:

#include <MC9S08QG8.h>

Este arquivo é muito importante e ele auxilia muito na programação. Ele é a biblioteca de
definições de todos os registradores e bits do microcontrolador.
Todos os registradores do HCS08 (e de todos os microcontroladores do mundo!) estão
armazenados em endereços na memória. Quando programamos e precisamos utilizar um desses
registradores, teríamos que indicar o endereço correspondente ao registrador. Mas como temos essa
biblioteca, podemos chamar o registrador por um nome, o que facilita muito na hora de lembrar tudo
que precisa ser feito no programa.
Vamos olhar melhor esta biblioteca. Ainda na pasta includes, abra o arquivo MC9S08QG8.h.
Você deve ver uma tela igual a da figura 8.

Figura 8 – Biblioteca do MC9S08QG8.


Inicialmente, só vemos o cabeçalho com todas as informações sobre esta biblioteca, o nome do
criador dela, as revisões e muitas outras coisas. Mais uma vez, a importância dos cabeçalhos.
Se formos descendo, veremos os números dos vetores de interrupção e depois a tabela dos
vetores de interrupção. Também veremos o mapeamento dos registradores de entrada/saída (I/O) e
muito mais...
A biblioteca tem muita informação e iremos utilizar toda esta informação aos poucos.
Vamos olhar novamente para o arquivo main. Ali dentro temos a função principal (main) e em
seguida uma macro:

EnableInterrupts;

Esta macro serve para habilitar as interrupções gerais ou globais. Você entenderá melhor
quando estudar as interrupções.
Depois disso, temos o loop infinito (for(;;)). Que legal, ele já foi escrito pra nós !! Alguém
sabia que nós iríamos usar... Perceba que tanto o loop infinito quanto o main, começam e terminam
com chaves ({ })
Dentro do loop infinito, temos uma função chamada :

__RESET_WATCHDOG();

Percebam o comentário engraçadinho:


/* feeds the dog */ Alimenta o cachorro...

O WATCHDOG (cão de guarda) é um dispositivo de proteção interno do microcontrolador. No


início da nossa programação, iremos desligá – lo, pois ele pode atrapalhar um pouco. Mais tarde
entenderemos melhor a sua utilização.
Agora é hora de começar !
Primeiro, vamos botar o cachorro pra dormir. Vá na biblioteca do HCS08 e procure pelo
registrador SOPT1. Veja a figura 9.

Figura 9 – Registrador SOPT1 na biblioteca do micro.


Nesta figura, em vermelho está marcado o nome completo do registrador. Perceba o endereço
da memória em que ele está:
0x00001802
Não sei vocês, mas eu acho muito mais fácil lembrar de SOPT1 do que lembrar desse número
aí!!
Em verde, está marcado o nome do registrador que será utilizado na programação.
Basicamente, nós vamos copiar este nome da biblioteca e colar dentro do main. Deve ficar como na
figura 10.
Figura 10 – Registrador SOPT1 com o valor de configuração.
Este valor 0x02 (0b00000010), que está sendo atribuído ao registrador serve para desligar o
WATCHDOG e fazer mais algumas configurações. Vamos usar este valor por enquanto e mais tarde
você vai entender tudo que aconteceu...
A partir de agora, você pode apagar a função para “alimentar o cachorro”, pois nós colocamos o
cachorro pra dormir.

Configurando entradas e saídas:


Vamos agora configurar quais pinos serão utilizados, qual será o led e qual será o botão.
Para isso, vamos voltar na biblioteca do HCS08.
Nos microcontroladores, nós temos a liberdade de escolher se um pino será uma entrada ou uma
saída. Para isso, é necessário configurar um registrador de direção de dados (entrada ou saída).
No HCS08, existem dois conjuntos de pinos de entrada e saída, chamados de PORT’s. O
PORT A e o PORT B. Então, quando vamos configurar entradas e saídas, deveremos escolher se elas
estarão no PORT A ou no PORT B.
Neste caso, o nosso led estará no bit 6 do PORT B e o botão estará no bit 2 do PORT A. Ou
seja o pino PORT B 6 deverá ser uma saída e o pino PORT A 2 deverá ser uma entrada.
Para fazer esta configuração, entre na biblioteca do micro e procure o registrador PTBDD. Veja
a figura 11.
Figura 11 – Registrador de configuração de direção do dado do PORT B.
Você deverá copiar o bit PTBDD_PTBDD6 que está circulado na figura 11 e colar no main.
Faça a mesma coisa para o bit PTADD_PTADD2. O main deve ficar conforme a figura 12.

Figura 12 – Registradores de configuração do PORT A e do PORT B.


Se o bit 6 do PORT B será uma saída, então nós deveremos colocar 1 neste bit. Para que o bit 2
do PORT A seja uma entrada, deveremos colocar 0 nele. É só escrever no main o que está escrito
abaixo:
PTBDD_PTBDD6 = 1; //Pino configurado como saída (led)

PTADD_PTADD2 = 0; //Pino configurado como entrada (botão)


Depois de feitas as configurações, vamos escrever a lógica de verdade !

Criando um pisca – pisca:


Ela deverá ser escrita dentro do loop infinito. É muito simples:
• Testar se o bit 2 do PORT A é igual a 1.
• Se for, devemos fazer o bit 6 do PORT B ficar igual a 1.
• Aguardar um tempo.
• Fazer o bit 6 do PORT B ficar igual a 0.
• Aguardar um tempo.
• Voltar na primeira linha e repetir.
• Se o bit 2 do PORT A não for igual a 1.
• Então o bit 6 do PORT B deve ficar igual a 0.
Pronto, este é o algoritmo do nosso programa. Em linguagem C, faremos o seguinte:
if (PTAD_PTAD2 = = 1){

PTBD_PTBD6 = 1; //Acende o led

for (i = 0; i < 30000; i ++){


//Espera um tempo
}

PTBD_PTBD6 = 0; //Apaga o led

for (i = 0; i < 30000; i ++){


//Espera um tempo
}

else{
PTBD_PTBD6 = 0; //Apaga o led
}

Todas estas linhas devem estar dentro do loop infinito.


O programa deverá ficar conforme a figura 13.
Figura 13 – Programa para piscar o led quando o botão for pressionado.

Compilando e encontrando erros:


Certo !
Agora vamos compilar e ver se tudo está escrito dentro da sintaxe da linguagem C. Veja o
botão Compile que está marcado na figura 13. Pressionando este botão, o compilador vai tentar
compilar o seu código. E se você copiou exatamente o que eu escrevi, então a tela da figura 14 deverá
aparecer.
Figura 14 – Erro de sintaxe.
O compilador está acusando um erro. Ele diz que a variável i, usada na estrutura for não foi
declarada.
Vamos colocar essa variável logo abaixo da linha do main, da seguinte forma:

int i;

Lembrou da variável do tipo inteiro ? Beleza !!


Tente compilar novamente, que agora deve funcionar.
Se funcionou, a janela de erros desapareceu e vários nomes de registradores ficaram azuis.
Agora vamos ver ser a lógica está correta.

Depuração:
Clique no botão Debug que está marcado na figura 15. Ele tem até o desenho de um bichinho...
Figura 15 – Botão Debug.
Este botão irá abrir outro software chamado de True – Time Simulator & Real – Time Debugger . Se
tudo estiver certo, você deverá ver uma tela igual a da figura 16.

Figura 16 - True – Time Simulator & Real – Time Debugger.


Este software serve para que possamos testar o programa e verificar se ele está funcionando
corretamente. A janela superior da esquerda (Source) mostra o código que você escreveu. A linha
marcada em azul é a próxima linha de programa que será executada.
No lado direito superior, a tela Assembly mostra como ficou o seu código na linguagem
Assembly. Eu gosto muito mais da linguagem C...
Novamente na esquerda, existem duas telas chamadas Data 1 e Data 2. A primeira mostra os
registradores do micro e as variáveis globais que foram utilizadas no programa. A segunda mostra as
variáveis locais que foram utilizadas. Neste caso, apenas a variável i.
Se clicarmos com o botão direito em uma área vazia nestas telas, veremos um menu de
informações igual ao da figura 17.

Figura 17 – Menu na tela Data 2.


Veja, pelas marcações em vermelho, que nestas telas, todas as variáveis estão na condição de
atualização automática. Ou seja, cada vez que o programa for executado, estas variáveis vão atualizar
o seu valor. Mas durante o programa, elas não atualizarão os valores.
Para que os valores das variáveis sejam atualizados periodicamente, selecione a opção
Periodical. Faça isso para a tela Data 1 e para a Data 2. Na tela Update Rate, coloque o valor 10 *
100ms. Ou seja, a cada 1 segundo o valor da variável será atualizada.
Agora vamos executar o nosso programa uma linha por vez. Pressione F11 e veja como a linha
azul desse pelo código. Perceba que nas telas Assembly, Register e Memory os valores também são
modificados.
Acompanhe a execução do código e veja como ele chega até na condição

if (PTAD_PTAD2 == 1){
e depois pula diretamente para o
} else{

PTBD_PTBD6 = 0; //Apaga o led


}
Isso acontece porque ainda não temos como fazer a entrada (pino 2 do PORT A) fica igual a 1.
Mas vamos criar uma forma de fazer isso.
Vá no menu Componente e selecione a opção Open. Deverá aparecer uma tela igual a da figura
18.

Figura 18 – Menu Component


Clique duas vezes no ícone Visualization Tool que está marcado em vermelho.
Agora apareceu uma tela cinza. Clique com o botão direito em um ponto qualquer nessa área e
selecione a opção Add New Instrument. No menu que aparece, selecione a opção Led. Isso vai fazer
com que o um pequeno led apareça. Coloque este led na tela e depois você pode aumentar o seu
tamanho se quiser.
Clique com o botão direito sobre o led e selecione a opção Properties. Deverá aparecer uma
tela igual a da figura 19.
Figura 19 – Propriedades do led.
Agora precisamos indicar que este led estará ligado ao pino 6 do PORT B. Para isso deveremos
saber qual é o endereço do registrador PTBD. Volte ao seu código fonte e abra a biblioteca de
registradores do HCS08. Veja na figura 20 o endereço marcado em vermelho.
Figura 20 – Endereço do registrador PTBD na memória.
Então, na tela Properties of LED da figura da figura 19, no campo Port to Display você deve
colocar o número 0x02. Que é o endereço do registrador PTBD na memória do microcontrolador.
Como queremos que o bit 6 desse registrador esteja associado ao led, no campo Bitnumber to
Display escolheremos o número 6. Feito isso, podemos fecha a janela e colocar um botão.
Clique com o botão direito em uma área vazia e selecione novamente Add New Instrument.
Agora você vai escolher a opção Switch. Apareceu um chave de duas posições. Novamente, clique
com o botão esquerdo sobre a chave e selecione Properties. Deverá aparecer uma tela igual a da figura
21.
Figura 21 – Propriedades da chave.
Da mesma forma que no led, deveremos associar esta chave ao bit 2 do registrador PTAD.
Volte à biblioteca do microcontrolador e verifique o endereço deste registrador. Você verá que as
informações que precisam ser modificadas são:
Port to Display: 0x00
Bitnumber to Display: 2
Feche a janela e faça uma última configuração. Clique com o botão direito sobre uma área
cinza e selecione Properties. No menu que aparece selecione Periodical para o campo Refresh Mode e
no espaço que aparece abaixo, coloque o número 1. Ou seja, os valores serão atualizados
periodicamente, a cada 1 x 100 ms. Feche a janela e vá tomar água.
Não esqueça de salvar a sua configuração no menu File.
Agora vamos brincar. A figura 22 mostra uma seta verde marcada. Clicando nesta seta, nós
colocaremos o programa para rodar.
Figura 22 – Tela pronta para simulação.
Inicialmente nada acontece. Claro, pois o botão está com sinal 0. Perceba a marcação em
vermelho do bit PTAD2 na figura 22. Para colocar o botão em 1 é um pouco chato, mas...
Vá no menu HCS08FCS. Selecione a opção Port Pins Module e clique em Set Input Pin Levels
(INPUTS), conforme a figura 23.
Figura 23 – Atuando uma entrada pelo simulador.
Na tela que aparece, coloque o valor 04 no campo InputA. Este valor representa o número:
PTAD7 PTAD6 PTAD5 PTAD4 PTAD3 PTAD2 PTAD1 PTAD0
0 0 0 0 0 1 0 0
em hexadecimal. Ou seja, o pino PTAD2 estará em 1.
Agora sim você deve estar vendo o led piscar.
Perceba como a variável i se modifica. Veja na figura 24.
Figura 24 – Led piscando e variável i incrementando.
Perceba também que o bit PTBD6 na tela Data 1 fica mudando entre 0 e 1.
Para que o led pare de piscar basta voltar no menu da figura 23 e colocar 00 no campo InputA.
O CodeWarrior é um software com bastante recursos para programação e depuração. Muita
coisa pode ser aprendida dele visitando o site do fabricante, lendo os manuais e participando de fóruns
e seminários.