Escolar Documentos
Profissional Documentos
Cultura Documentos
10.1. Histria
Ken Thompson e Dennis Ritchie (da esquerda pra direita), os criadores das linguagens B e
C, respectivamente.
O desenvolvimento inicial de C, ocorreu no AT&T Bell Labs, entre 1969 e 1973. Deu-se o
nome C linguagem, porque muitas de suas caractersticas derivaram da linguagem B.
Pgina 55
10.2. K&R C
Em 1978, Brian Kernighan e Dennis Ritchie publicaram a primeira edio do livro The C
Programming Language. Esse livro, conhecido pelos programadores de C, como K&R,
serviu durante muitos anos como uma especificao informal da linguagem. A verso da
linguagem C que ele descreve usualmente referida como K&R C. A segunda edio do
livro, cobriu o padro posterior, o ANSI C. K&R C introduziu as seguintes caractersticas na
linguagem:
K&R C freqentemente considerado a parte mais bsica da linguagem, cujo suporte deve
ser assegurado por um compilador C. Durante muitos anos, mesmo aps a introduo do
padro ANSI C, K&R C foi considerado o menor denominador comum, em que
programadores de C se apoiavam quando uma portabilidade mxima era desejada, j que
nem todos os compiladores eram atualizados o bastante para suportar o padro ANSI C.
Nos anos que se seguiram publicao do K&R C, algumas caractersticas no-oficiais
foram adicionadas linguagem, suportadas por compiladores da AT&T e de outros
vendedores. Estas incluam:
Pgina 56
10.3. ANSI C e ISO C
10.4. C99
funes em linha
remoo de restries sobre a localizao da declarao de variveis (como em C++)
adio de vrios tipos de dados novos, incluindo o long long int (para minimizar
problemas na transio de 32-bits para 64-bits), um tipo de dados boolean explicito
(chamado _Bool) e um tipo complex que representa nmeros complexos
Pgina 57
vetores de dados de comprimento varivel (o vetor pode ter um tamanho diferente a
cada execuo de uma funo, mas no cresce depois de criado)
suporte oficial para comentrios de uma linha iniciados por //, emprestados da
linguagem C++
vrias funes de biblioteca novas, tais como snprintf()
vrios ficheiros-cabealho novos, tais como stdint.h
Essa propriedade no foi acidental; a linguagem C foi criada com o objetivo principal em
mente: facilitar a criao de programas extensos com menos erros, recorrendo ao
paradigma da programao algortmica ou procedimental, mas sobrecarregando menos o
autor do compilador, cujo trabalho complica-se ao ter de realizar as caractersticas
complexas da linguagem. Para este fim, a linguagem C possui as seguintes caractersticas:
Pgina 58
Parmetros que so sempre passados por valor para as funes e nunca por
referncia ( possvel simular a passagem por referncia com o uso de ponteiros);
Definio do alcance lexical de variveis;
Estruturas de variveis, (structs), que permitem que dados relacionados sejam
combinados e manipulados como um todo.
Segurana de tipo;
Coletor de lixo (mais comum em linguagens interpretadas);
Vetores que crescem automaticamete;
Classes ou objectos com comportamento (ver orientao a objetos);
Closures (a closure is a function that is evaluated in an environment containing one or
more bound variables. When called, the function can access these variables);
Funes aninhadas;
Programao genrica;
Sobrecarga de operadores;
Meta-programao;
Apoio nativo de multithreading e comunicao por rede.
Apesar da lista de caractersticas teis que C no possui, ser longa, isso no tem sido um
impedimento sua aceitao, pois isso permite que novos compiladores de C sejam escritos
rapidamente para novas plataformas, e tambm permite que o programador permanea
sempre em controle do que o programa est a fazer. Isto o que por vrias vezes permite o
cdigo de C correr de uma forma mais eficiente que muitas outras linguagens. Tipicamente,
s cdigo de assembly afinado mo que corre mais rapidamente, pois possui um
controle completo da mquina, mas avanos na rea de compiladores juntamente com uma
nova complexidade nos processadores modernos permitiram que a diferena tenha sido
rapidamente eliminada. Uma consequncia da aceitao geral da linguagem C que
freqentemente os compiladores, bibliotecas e at intrpretes de outras linguagens de nvel
maior sejam eles prprios implementados em C.
C tem como ponto forte, a sua eficincia, e a linguagem de programao preferida para o
desenvolvimento de sistemas e softwares de base, apesar de tambm ser usada para
desenvolver programas de computador. tambm muito usada no ensino de cincia da
computao, mesmo no tendo sido projetada para estudantes e apresentando algumas
dificuldades no seu uso. Outra caracterstica importante de C, sua proximidade do cdigo
de mquina, que permite que um projetista seja capaz de fazer algumas previses de como
o software ir se comportar, ao ser executado.
Pgina 59
C tem como ponto fraco, a falta de proteo que d ao programador. Praticamente tudo que
se expressa em um programa em C, pode ser executado, como por exemplo, pedir o
vigsimo membro de um vetor com apenas dez membros. Os resultados so muitas vezes
totalmente inesperados, e os erros, difceis de encontrar.
O compilador IAR tem tambm algumas palavras reservadas, o que veremos ao longo deste
treinamento.
Pgina 60
signed utilizar o ltimo bit para sinalizar se um dado positivo ou negativo. Com
isto, o dado sempre estar com um tamanho menor em um bit.
unsigned no informa se o dado tem valor positivo ou negativo. Por conseqncia
todos os bits do dado podem ser utilizados como informao;
short faz com que o dado passe a ter um tamanho menor do que especificado
em sua definio. Por exemplo: utilizar o shot int pode faz-lo assumir o valor de
apenas um bit, dependendo do compilador utilizado;
long faz com que o dado passe a ter um tamanho maior do que especificado em
sua definio. Por exemplo: utilizar o long int pode faz-lo assumir o valor de 65536
bits, dependendo do compilador utilizado
A base numrica no padro IEEE754 a binria. Neste padro so adotados dois formatos
para representao de nmeros: preciso simples e preciso dupla. (Na base binria, um
dgito binrio denominado bit e um byte um conjunto de 8 bits).
Pgina 61
Ficou estabelecido que no padro IEEE754, em preciso simples, um nmero real seria
representado por 32 bits, (4 bytes), sendo que:
Pelo mesmo padro IEEE754, em preciso dupla, um nmero real seria representado por 64
bits, (8 bytes), sendo que:
v = S M 2E
Onde:
S = 1 2 sinal
M = 1 + mantissa 2-23
E = expoente 127
Pgina 62
11.2. Declarando variveis
necessrio, durante o fluxo do programa, declarar as variveis que sero utilizadas de
acordo com os tipos de dados mostrados anteriormente. Isto pode ser feito das seguintes
maneiras:
As variveis podem ser inicializadas com um determinado valor durante a sua declarao:
void soma (int valor) //AO ACESSAR ESTA FUNO, O PARMETRO VALOR RECEBE DADOS DE QUEM O CHAMOU
{
int conta; // VARIVEL LOCAL! SER ACESSADA APENAS PELA FUNO SOMA
somatorio = somatorio + valor;
printf("0");
for (conta = 1;(conta<(valor+1));conta++)
{
printf("+%u",conta);
}
printf(" = %u\r\n",somatorio);
}
void main()
{
WDTCTL = WDTPW+WDTHOLD; // Stop WDT
int conta; // VARIVEL LOCAL! SER ACESSADA APENAS PELA FUNO MAIN
somatorio = 0; // A VARIVEL GLOBAL INICIALIZADA
for (conta=1;conta<20;conta++)
{
soma(conta); // CHAMADA A FUNO SOMA, ONDE PASSADO O VALOR DE CONTA
}
}
Pgina 63
Alguns comentrios importantes sobre o programa E-0-1:
O comando printf chama uma biblioteca que emula o envio de dados pela porta
serial do MSP430. No IAR ser possvel visualizar estes dados atravs do Terminal
I/O, acessvel em: View Terminal I/O, onde ser aberta a janela mostrada abaixo.
Para que ele funcione necessrio incluir a biblioteca padro stdio.h
Pgina 64
Para que todos os caracteres a serem impressos na janela Terminal I/O no fiquem na
mesma linha, so utilizados os caracteres especiais de barra invertida, que so:
\b = retrocesso (backspace);
\f = alimentao de formulrio;
\n = nova linha;
\r = retorno do carro;
\t = tabulao horizontal;
\ = aspas duplas;
\ = aspas simples;
\0 = nulo;
\\ = barra invertida;
\v = tabulao vertical;
\a = alerta (beep);
\N = constante octal, onde N o nmero em octal;
\xN = constante hexadecimal, onde N o nmero em hexadecimal;
//******************************************************************************
// Exemplo de uso da funo scanf
//
// Alessandro Ferreira da Cunha
// Tech Training - Engenharia e Treinamentos
// Janeiro 2009
// Built with IAR Embedded Workbench Version: 4.11.2.9
//******************************************************************************
#include <msp430xG46x.h>
#include <stdio.h>
void main()
{
WDTCTL = WDTPW+WDTHOLD; // Stop WDT
char TECLA; // VARIVEL LOCAL! SER ACESSADA APENAS PELA FUNO MAIN
for ( ; ; )
{
printf("DIGITE UMA TECLA... \n \n ");
scanf("%c",&TECLA);
printf("SUA TECLA %c!\n \n",TECLA);
}
}
Isto tambm ser possvel visualizar atravs do Terminal I/O, acessvel em: View
Terminal I/O. Assim como no comando anterior, para que ele funcione tambm necessrio
incluir a biblioteca padro stdio.h
Pgina 65
O formato do comando scanf :
scanf (string, varivel);
scanf (%d, contador);
Tendo as mesmas caractersticas e controladores vistos no printf.
auto: serve para declarar que uma varivel local. Porm, todas as variveis
declaradas internamente j so locais. Com isto, este modificador de armazenamento
quase nunca utilizado.
extern: utilizado para fazer referncia a outras variveis globais que foram declaradas
em outros mdulos do programa. Isto muito til quando se tem programas extensos
onde mdulos cuidam de funcionamentos especficos e precisam passar parmetros
para outras partes do programa.
static: indica que a varivel ocupar uma posio permanente de memria. Isto
tambm ocorre quando uma varivel declarada de modo global. Mas numa
declarao de static, a varivel reconhecida apenas localmente, dentro da funo
em que foi criada. Se o modificador de armazenamento static for aplicado a uma
varivel que j global, isto far com que ela seja reconhecida apenas pelo programa
em que est inserida. Caso haja interao deste programa com outros externos, esta
varivel no estar acessvel.
register: faz com que o compilador tente gravar esta varivel diretamente em um dos
registradores que tem acesso direto a CPU do microcontrolador, ao invs de
armazen-la em uma posio de memria RAM. Com isto, ganha-se em velocidade
de processamento.
Pgina 66
11.3. Operadores
utilizado para atribuir um determinado valor a uma varivel. Seu smbolo o = e alguns
exemplos de atribuio so mostrados a seguir:
unsigned int x, y;
x = 10;
y = x;
A atribuio sempre avaliada da direita para a esquerda. Isto significa que ao final deste
programa o valor da varivel y ser igual a 10.
Indica ao compilador que ele deve fazer determinada operao aritmtica entre duas
variveis. So os seguintes:
Pgina 67
11.3.4. Operadores lgicos
Os ponteiros sero tratados em detalhes no estudo dos dados avanados. possvel dizer
que este um dos pilares fundamentais da linguagem C e portanto gastaremos algumas
horas do nosso treinamento para explic-los em detalhes. Por hora, vamos apenas conhecer
quais so os smbolos utilizados como operadores de memria, ou de ponteiros, e suas
funcionalidades. As aplicaes sero desenvolvidas mais a frente. So dois os smbolos:
& endereo do operando. um operador unrio utilizado para retornar o
endereo de memria do seu operando. Isto significa que se escrevermos:
endereo_a = &a;
a = *endereo_a;
teremos que o valor armazenado no local apontado pela varivel endereo_a seja
atribudo varivel a.
Pgina 68
11.3.7. Outros operadores
Outros operadores, que no se encaixam em nenhum dos tipos citados anteriormente, mas
que podem ser utilizados em linguagem C so:
? (ponto de interrogao) Operador ternrio condicional: pode fazer
um teste condicional, substituindo o comando IF. Sua forma geral :
Ele funciona da seguinte maneira: avalie a expresso1. Se ela for verdadeira, atribua
a varivel o valor da expresso2. Caso a expresso1 seja falsa, ento a varivel
recebe o valor da expresso3.
, (vrgula) Separador de expresses: utilizado para enfileirar duas ou
mais expresses. Sua forma geral :
y = ( x = 0 , x + 5 );
(tipo) expresso;
unsigned int x, y;
x = 10;
y = (float) x / 2;
Pgina 69
sizeof Retorna o tamanho de uma varivel: para ter um melhor
controle da quantidade de memria utilizada, pode-se aplicar o operador
sizeof a qualquer varivel. Isto far retornar qual o tamanho que esta
varivel ocupa em bytes.
Escreva um programa em que o usurio entre com dois nmeros e seja realizada uma
operao matemtica bsica (multiplicao), mostrando o resultado na tela. Este programa
deve rodar dentro de um loop infinito no formato for ( ; ; );.
O programa deve conter uma mensagem no Terminal I/O solicitando que o usurio digite o
primeiro nmero. Depois uma mensagem solicita a digitao de um segundo nmero.
Finalmente, o resultado da multiplicao mostrado em uma nova linha do Terminal I/O.
Escreva um programa em que o usurio entre com a cotao do dlar do dia, digite qual a
quantidade de dlares que quer converter e seja apresentado na tela do Terminal I/O
apresente o valor convertido em reais.
O programa deve, ento, calcular a idade do usurio, informando a idade em ANOS, cujo
valor deve ser um inteiro.
Modifique o programa anterior de modo que seja mostrado na tela tambm o valor da idade
em DIAS e MESES.
Pgina 70
13. Declaraes de controle e repetio
13.2. If
if (condio)
{
comandoA;
comandoB;
comandoC;
}
else
{
comandoD;
comandoE;
comandoF
}
Pgina 71
Veja um exemplo de utilizao da funo if rodando o programa EXEMPLO-3:
//******************************************************************************
// Exemplo de uso da funo if
// Built with IAR Embedded Workbench Version: 4.11.2.9
//******************************************************************************
#include <msp430xG46x.h>
#include <stdio.h>
#include <stdlib.h>
void main()
{
WDTCTL = WDTPW+WDTHOLD; // Stop WDT
for ( ; ; ) // cria um loop infinito
{
}
}
Note que para conseguir gerar um nmero randmico, foi necessrio incluir mais uma
biblioteca de funes, a stdlib.h.
if (condio1) comandoA;
else if (condio2) comandoB;
else if (condio3) comandoC;
//******************************************************************************
// Exemplo de uso da funo if aninhada
// Built with IAR Embedded Workbench Version: 4.11.2.9
//******************************************************************************
#include <msp430xG46x.h>
#include <stdio.h>
#include <stdlib.h>
void main()
{
WDTCTL = WDTPW+WDTHOLD; // Stop WDT
int numero; // nmero mgico
int palpite; // chute do usurio
numero = rand(); // gera um nmero aleatrio
for ( ; ; ) // cria um loop infinito
{
printf("ADIVINHE QUAL O NMERO... \n \n ");
scanf("%d",&palpite);
if (palpite == numero) printf ("****CERTO!!!****\n\n");
else
{
printf ("### ERRADO ###\n\n");
if (palpite < numero) printf (" --- valor alto --- \n\n");
else printf (" +++ valor baixo +++ \n\n");
}
}
}
Pgina 72
13.2.2. Uma alternativa: o comando ?
Ele funciona da seguinte maneira: avalie a expresso1. Se ela for verdadeira, atribua a
varivel o valor da expresso2. Caso a expresso1 seja falsa, ento a varivel recebe o
valor da expresso3.
13.3. Switch
switch (varivel)
{
case constante1:
comandoA;
comandoB;
....
break;
case constante2:
comandoC;
comandoD;
....
break;
....
default:
comandoE;
comandoF;
....
}
Pgina 73
//******************************************************************************
// Exemplo de uso da funo switch case
// Built with IAR Embedded Workbench Version: 4.11.2.9
//******************************************************************************
#include <msp430xG46x.h>
#include <stdio.h>
void main()
{
WDTCTL = WDTPW+WDTHOLD; // Stop WDT
int digitado; // digitado
for ( ; ; ) // cria um loop infinito
{
printf("DIGITE UM NMERO ENTRE 0 E 5: \n \n ");
scanf("%d",&digitado);
switch (digitado)
{
case 0:
printf("O NMERO DIGITADO FOI %d ! \n \n ",digitado);
break;
case 1:
printf("O NMERO DIGITADO FOI %d ! \n \n ",digitado;
break;
case 2:
printf("O NMERO DIGITADO FOI %d ! \n \n ",digitado;
break;
case 3:
printf("O NMERO DIGITADO FOI %d ! \n \n ",digitado;
break;
case 4:
printf("O NMERO DIGITADO FOI %d ! \n \n ",digitado;
break;
case 5:
printf("O NMERO DIGITADO FOI %d ! \n \n ",digitado;
break;
default:
printf("O NMERO DIGITADO NO EST ENTRE 0 E 5! \n \n ");
}
}
}
//******************************************************************************
// Exemplo de uso da lao for
// Built with IAR Embedded Workbench Version: 4.11.2.9
//******************************************************************************
#include <msp430xG46x.h>
#include <stdio.h>
void main()
{
WDTCTL = WDTPW+WDTHOLD; // Stop WDT
int conta;
for (conta = 0 ; conta <= 10 ; conta++) printf("%u\r\n",conta);
}
Pgina 74
13.4.1. Lao infinito
for ( ; ; );
Como sair de um lao infinito? Execute o programa EXEMPLO-7 e verifique seu efeito em
um lao infinito:
//******************************************************************************
// Exemplo de uso do comando BREAK em um lao for
//
// Alessandro Ferreira da Cunha
// Tech Training - Engenharia e Treinamentos
// Janeiro 2009
// Built with IAR Embedded Workbench Version: 4.11.2.9
//******************************************************************************
#include <msp430xG46x.h>
#include <stdio.h>
void main()
{
WDTCTL = WDTPW+WDTHOLD; // Stop WDT
char caractere;
for ( ; ; )
{
printf ("digite algo \n");
scanf("%c",&caractere); //pega um caractere
if (caractere == 'A') break; //sai do lao
}
printf ("voc digitou um A");
}
Qual o efeito de trocar uma clusula break por uma clusula continue? Execute o programa
EXEMPLO-8 e verifique seu efeito:
//******************************************************************************
// Exemplo de uso da clusula CONTINUE em um lao for
//
// Alessandro Ferreira da Cunha
// Tech Training - Engenharia e Treinamentos
// Janeiro 2009
// Built with IAR Embedded Workbench Version: 4.11.2.9
//******************************************************************************
#include <msp430xG46x.h>
#include <stdio.h>
void main()
{
WDTCTL = WDTPW+WDTHOLD; // Stop WDT
int inicio, fim, x;
printf ("digite o incio \n");
scanf("%d",&inicio);
printf ("digite o fim \n");
scanf("%d",&fim);
for ( x = inicio ; x <= fim ; x++ )
{
if ( x == fim) continue;
printf("%u\r\n",x);
}
printf (" --- ACABOU --- ");
}
Pgina 75
13.5. Lao while (enquanto)
while (condio) comando;
while (condio)
{
comandoA;
comandoB;
....
}
void main()
{
WDTCTL = WDTPW+WDTHOLD; // Stop WDT
int i;
i = 1;
while(i < 6)
{
printf ("ainda est em %d \n",i);
i++;
}
printf ("acabou");
}
//******************************************************************************
// Exemplo de uso das clusulas break e continue no lao while
// Built with IAR Embedded Workbench Version: 4.11.2.9
//******************************************************************************
#include <msp430xG46x.h>
#include <stdio.h>
void main()
{
WDTCTL = WDTPW+WDTHOLD; // Stop WDT
int x, y, w, z;
w = 0 ;
printf("ENTRE COM UM NMERO \n");
scanf("%d",&x);
printf("ENTRE COM OUTRO NMERO \n");
scanf("%d",&y);
printf("ENTRE COM A QUANT. DE IMPRESSES \n");
scanf("%d",&z);
while (w < z)
{
if (x == 0 || y == 0) break;
w++;
x = x * y;
printf("A MULTIPLICAO %d \n",x);
if (x < 1000) continue;
printf(" ACABOU ");
}
}
Pgina 76
13.5.2. Lao infinito
while (1)
{
......
}
do
{
comandoA;
comandoB;
....
} while (condio);
//******************************************************************************
// Exemplo de uso lao do-while
// Built with IAR Embedded Workbench Version: 4.11.2.9
//******************************************************************************
#include <msp430xG46x.h>
#include <stdio.h>
void main()
{
WDTCTL = WDTPW+WDTHOLD; // Stop WDT
int start;
printf("ENTRE COM O TEMPO PARA LANAMENTO \n");
scanf("%d",&start);
/* O LAO DE CONTAGEM REGRESSIVA */
do
{
printf("FALTAM %d SEGUNDOS \n",start);
start--;
}
while(start>0);
printf("Zero!\n FOGO!!\n");
}
Os dois laos, while e for, tem vrias similaridades. Na grande maioria das situaes o
mesmo problema poder ser resolvido tanto com um tipo de lao quanto com o outro. Para
uma melhor compreenso do que estamos dizendo, vamos fazer uma equivalncia entre os
parmetros que so ajustados para fazer rodar um lao for e os mesmos parmetros para
fazer exatamente o mesmo efeito, mas com um lao while.
Pgina 77
for ( A ; B ; C) printf (%d\t,i);
A;
while (B)
{
printf (%d\t,i);
C;
}
A escolha por um ou outro modelo depender apenas do estilo do programador. A forma for
mais compacta. J a forma while permite uma visualizao mais fcil de todas as partes
envolvidas. Enfim: ambos geram os mesmos efeitos na linguagem C pura e podem ser
considerados iguais pelo programador.
Dependendo do compilador e da forma como o lao gerado, pode ser obtido programas
em assembly maiores ou menores para executar a mesma tarefa. A velocidade com que o
programa executa o lao tambm influenciada pelo estilo de converso que o compilador
far para cada um deles.
Pgina 78
13.8. Tudo junto?
//******************************************************************************
// Exemplo COM TUDO JUNTO
//
// Alessandro Ferreira da Cunha
// Tech Training - Engenharia e Treinamentos
// Janeiro 2009
// Built with IAR Embedded Workbench Version: 4.11.2.9
//******************************************************************************
#include <msp430xG46x.h>
#include <stdio.h>
void main()
{
WDTCTL = WDTPW+WDTHOLD; // Stop WDT
char c;
int done;
float total = 0;
printf("Por favor, escolha suas opes:\n");
printf("1 -> Refrigerante.\n");
printf("2 -> Balas.\n");
printf("3 -> Cachorro Quente.\n");
printf("4 -> Pipocas.\n");
printf("= -> Fechar o pedido.\n");
printf("Suas escolhas so:\n");
done = 0;
while(!done)
{
scanf("%c",&c);
switch(c)
{
case '1':
printf("Refrigerante\tR$8.00\n");
total+=8;
break;
case '2':
printf("Balas\t\t$R5.50\n");
total+=5.5;
break;
case '3':
printf("Cachorro Quente\t\tR$10.00\n");
total+=10;
break;
case '4':
printf("Pipocas\t\t$7.50\n");
total+=7.5;
break;
case '=':
printf("= Total R$%.2f\n",total);
printf("Por favor passe o carto.\n");
done=1;
break;
default:
printf("Seleo inadequada.\n");
} /* end switch */
} /* end while */
}/* end main */
goto label;
Pgina 79
14. EXERCCIOS: Declaraes de controle e repetio
Pgina 80
REGISTRADOR DE SINALIZAO DE INTERRUPO (Flag Register PxIFG)
Sinalizam que uma interrupo aconteceu. A mudana de nvel zero para nvel um acontece
por hardware. O contrrio (de 1 0) deve ser executada por software:
Bit = 0: no h interrupo pendente neste pino (0 V).
Bit = 1: h uma interrupo pendente neste pino (+Vcc).
/************************************************************
* STANDARD BITS FOR DIGITAL I/O
************************************************************/
Configurando um boto:
Pgina 81
Identifique no diagrama eltrico da Experimenter Board, mostrado no item 9, as seguintes
conexes, envolvendo pinos do MSP430FG4618 e hardwares externos:
Ao pressionar o boto S2 deve acender o LED1, que deve permanecer aceso por alguns
milissegundos (tempo suficiente para perceber a reteno da informao). Se o boto no
estiver pressionado, o LED1 deve se manter apagado.
Ao pressionar o boto S2 deve apagar o LED1, o que deve acontecer por alguns
milissegundos (tempo suficiente para perceber a reteno da informao). Se o boto no
estiver pressionado, o LED1 deve se manter aceso. Ao mesmo tempo, se o boto S1
estiver pressionado o LED2 deve ficar apagado, o que tambm deve acontecer por alguns
milissegundos (tempo suficiente para perceber a reteno da informao). Se o boto no
estiver pressionado, o LED2 deve se manter aceso
Pgina 82
15. Diretivas e funes do Compilador IAR
Alm de todos os comandos, controles e funes da linguagem C, tem-se ainda uma srie
de diretivas que so intrnsecas ao Compilador IAR. Para estud-las, o melhor caminho so
os arquivos de HELP que acompanham o compilador, alm dos arquivos USER GUIDE, em
formato .pdf, que podem ser acessados diretamente atravs do menu Help do compilador.
Dentre estes arquivos destacamos alguns que faro parte do CD que compe o material
didtico deste treinamento.
Dentre as diversas diretivas e funes do compilador IAR, vamos listar dois tipos, que sero
utilizados ao longo do treinamento: as PRAGMAS e as FUNES INTRINSECAS. As
demais funes devero ser consultadas pelos estudantes diretamente nos arquivos.
15.1. Pragmas
A lista a seguir mostra todas as diretivas #pragma que esto disponveis no IAR, para a
famlia MSP430.
necessrio o uso do pr processador #pragma para que estas diretivas sejam entendidas
pelo compilador e passem a ser tratadas como tal.
Pgina 83
Pragma directive Description
Pgina 84
15.2. Funes intrnsecas
Pgina 85
__get_SR_register_on_exit Returns the value that the processor status register will
have when the current interrupt or monitor function returns
//******************************************************************************
// MSP430xG46x Demo - Software Port Interrupt on P1.4 from LPM4
//
// Description: A hi/low transition on P1.4 will trigger P1_ISR which,
// toggles P5.1. Normal mode is LPM4 ~ 0.1uA. LPM4 current can be measured
// with the LED removed, all unused P1.x/P2.x configured as output or inputs
// pulled high or low, and ensure the P2.0 interrupt input does not float.
// ACLK = 32.768kHz, MCLK = SMCLK = default DCO
//
// K. Quiring/ M. Mitchell
// Texas Instruments Inc.
// October 2006
// Built with IAR Embedded Workbench Version: 3.41A
//******************************************************************************
#include <msp430xG46x.h>
void main(void)
{
WDTCTL = WDTPW+WDTHOLD; // Stop WDT
P5DIR |= 0x002; // P5.1 output
P1IE |= 0x010; // P1.4 Interrupt enabled
P1IES |= 0x010; // P1.4 hi/low edge
P1IFG &= ~0x010; // P1.4 IFG Cleared
_BIS_SR(LPM4_bits + GIE); // LPM4, enable interrupts
Pgina 86
17. Interrupes
Quanto mais prximo for um mdulo da CPU/NMIRS, maior a sua prioridade em interromper
o sistema. Esta prioridade define quem ser tratado primeiramente caso ocorram duas
interrupes simultaneamente.
O circuito de reset do sistema mostrado na figura a seguir. Ele fornece como sada duas
fontes de reset: o power-on reset (POR) e o power-up clear (PUC). Diferentes fontes de
eventos e sinais podem disparar o circuito de reset do sistema.
Pgina 87
O POR um reset do dispositivo. Um POR s pode ser gerado caso ocorra um destes trs
eventos:
O dispositivo alimentado (Powering up);
Um nvel baixo (0 V) inserido no terminal RST/NMI, quando este pino est
configurado para o modo de reset;
Um baixo nvel de tenso detectado pelo mdulo SVS, quando PORON = 1.
Um PUC sempre gerado quando um POR gerado, porm um POR no gerado quando
acontece um PUC. Um PUC pode ser disparado pelos seguintes eventos:
Um sinal POR;
Expirou o tempo estipulado pelo Watchdog timer quando estava em modo watchdog;
Houve uma violao de segurana do Watchdog timer;
Houve uma violao de segurana no acesso a memria Flash.
Pgina 88
17.2. NMI Interrupes no mascarveis
Estas trs interrupes no podem ser desabilitadas pelo bit de controle geral de
interrupes (GIE). Elas tm bits especficos para isto (ACCVIE, NMIIE, OFIE). Quando uma
destas interrupes aceita, todas as demais tem o seu bit de habilitao resetado.
Pgina 89
17.4.1. Entrada em uma interrupo
2) O valor do PC, que aponta para a prxima instruo que deveria ser executada,
salvo na pilha (pushed onto the stack);
5) Uma requisio de interrupo reseta o flag de interrupo dos perifricos que tem
fonte nica de interrupo (o conversor AD de 12 bits, por exemplo). Se o
perifrico tiver mltiplas flags de interrupo (portas P1 e P2, por exemplo), ento
o reset destas flags dever acontecer por software;
6) O registrador SR tem todos os seus bits zerados, com excesso do SCG0, que
no alterado. Isto retira o microcontrolador de qualquer LPM em que ele se
encontra. Como o GIE tambm zerado, as prximas interrupes ficam
desabilitadas.
Toda interrupo terminada quando uma instruo RETI (return from an interrupt service
routine) encontrada. Este retorno gasta 5 ciclos de mquina para executar as seguintes
aes:
1) O registrador SR restaurado da pilha (pops from the stack) com todos os valores
ajustados previamente (GIE, CPUOFF, etc.);
Pgina 91
17.5.1. Vetores de interrupo na famlia 2 (MSP430F2013)
NOTES:
1. Um reset gerado toda vez que a CPU tenta carregar um endereo no PC que esteja for
a do range de memria disponvel no dispositivo.
2. Fonte de mltiplos flags.
3. A flag de interrupo alocada no mdulo.
4. No mascarvel: o bit de interrupo individual pode ser desabilitado por um evento de
interrupo, mas geralmente isto no possvel.
5. Os endereos de vetores de interrupo entre 0FFDEh e 0FFC0h no so utilizados neste
dispositivo, podendo ser utilizado como rea de cdigo regular, onde ser armazenado o
programa.
Pgina 92
17.5.2. Declarao dos Vetores de interrupo no MSP430F2013
/************************************************************
* Interrupt Vectors (offset from 0xFFE0)
************************************************************/
#define PORT1_VECTOR (2 * 2u) /* 0xFFE4 Port 1 */
#define PORT2_VECTOR (3 * 2u) /* 0xFFE6 Port 2 */
#define USI_VECTOR (4 * 2u) /* 0xFFE8 USI */
#define SD16_VECTOR (5 * 2u) /* 0xFFEA Sigma Delta ADC */
#define TIMERA1_VECTOR (8 * 2u) /* 0xFFF0 Timer A CC1, TA */
#define TIMERA0_VECTOR (9 * 2u) /* 0xFFF2 Timer A CC0 */
#define WDT_VECTOR (10 * 2u) /* 0xFFF4 Watchdog Timer */
#define NMI_VECTOR (14 * 2u) /* 0xFFFC Non-maskable */
#define RESET_VECTOR (15 * 2u) /* 0xFFFE Reset [Highest Priority] */
Pgina 93
NOTES:
1. Fonte de mltiplos flags.
2. A flag de interrupo alocada no mdulo.
3. Um reset gerado toda vez que a CPU tenta carregar um endereo no PC que esteja for
a do range de memria disponvel no dispositivo. (No mascarvel: o bit de interrupo
individual pode ser desabilitado por um evento de interrupo, mas geralmente isto no
possvel.
4. Os endereos de vetores de interrupo entre 0FFDAh e 0FFC0h no so utilizados neste
dispositivo, podendo ser utilizado como rea de cdigo regular, onde ser armazenado o
programa.
5. Violao na chave de acesso (KEYV e ACCVIFG), somente so aplicveis aos
dispositivos do tipo F.
/************************************************************
* Interrupt Vectors (offset from 0xFFC0)
************************************************************/
#define DAC12_VECTOR (14 * 2u) /* 0xFFDC DAC 12 */
#define DMA_VECTOR (15 * 2u) /* 0xFFDE DMA */
#define BASICTIMER_VECTOR (16 * 2u) /* 0xFFE0 Basic Timer / RTC */
#define PORT2_VECTOR (17 * 2u) /* 0xFFE2 Port 2 */
#define USART1TX_VECTOR (18 * 2u) /* 0xFFE4 USART 1 Transmit */
#define USART1RX_VECTOR (19 * 2u) /* 0xFFE6 USART 1 Receive */
#define PORT1_VECTOR (20 * 2u) /* 0xFFE8 Port 1 */
#define TIMERA1_VECTOR (21 * 2u) /* 0xFFEA Timer A CC1-2, TA */
#define TIMERA0_VECTOR (22 * 2u) /* 0xFFEC Timer A CC0 */
#define ADC12_VECTOR (23 * 2u) /* 0xFFEE ADC */
#define USCIAB0TX_VECTOR (24 * 2u) /* 0xFFF0 USCI A0/B0 Transmit */
#define USCIAB0RX_VECTOR (25 * 2u) /* 0xFFF2 USCI A0/B0 Receive */
#define WDT_VECTOR (26 * 2u) /* 0xFFF4 Watchdog Timer */
#define COMPARATORA_VECTOR (27 * 2u) /* 0xFFF6 Comparator A */
#define TIMERB1_VECTOR (28 * 2u) /* 0xFFF8 Timer B CC1-2, TB */
#define TIMERB0_VECTOR (29 * 2u) /* 0xFFFA Timer B CC0 */
#define NMI_VECTOR (30 * 2u) /* 0xFFFC Non-maskable */
#define RESET_VECTOR (31 * 2u) /* 0xFFFE Reset [Highest Priority] */
Pgina 94
18. EXERCCIOS: BOTES E LEDS EM LOW POWER MODE.
Ao pressionar o boto S2 deve acender o LED1, que deve permanecer aceso por 500 ms.
Se o boto no estiver pressionado, o LED1 deve se manter apagado.
Ao pressionar o boto S2 deve apagar o LED1, o que deve acontecer por 500 ms. Se o
boto no estiver pressionado, o LED1 deve se manter aceso. Ao mesmo tempo, se o
boto S1 estiver pressionado o LED2 deve ficar apagado, o que tambm deve acontecer
por 500 ms. Se o boto no estiver pressionado, o LED2 deve se manter aceso
Pgina 95