Preview only show first 10 pages with watermark. For full document please download

Tutorial Do Codewarrior

Tutorial básico para iniciar a utilização do software CodeWarrior para programação de microcontroladores da Freescale.

   EMBED


Share

Transcript

Curso: Disciplina: Professor: Carlos Eduardo Carvalho Turma: Data: Aluno: Tutorial Básico CodeWarrior Nota 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 /* 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 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.