PROGRAMAO C ANSI
PARA
MICROCONTROLADORES
i1
COMPILADORES
Compiladores so programas utilizados para produzir o
cdigo executvel para uma determinada CPU a partir do
programa fonte escrito em linguagem de programao.
Tipos de Compiladores:
Compiladores
Direto;
Dois passos.
Slide 1
i1
ANSI
American National Standard Institute
ivo; 02/09/2013
21/10/2013
COMPILADORES C
Histrico da Linguagem C:
Programas que executam tarefas ligadas s funes do sistema
operacional ou instrues do microprocessador/microcontrolador
normalmente necessitam ser codificados em linguagem de montagem
(assembly
assembly). A linguagem C foi desenvolvida para resolver este
problema de forma menos penosa e mais porttil.
A linguagem C considerada de mdio nvel por possuir controle de
fluxo e estrutura de dados de forma semelhante s linguagem de alto
nvel, e ao mesmo tempo, proporcionar facilidades que s esto
assembly).
disponvel em linguagem de baixo nvel (assembly
O C Ansi foi projetado em 1972 nos laboratrios da Bell por Brian W.
Kernighan e Dennis M. Ritchie, para o sistema operacional UNIX..
COMPILADORES C
Principais caractersticas da Linguagem C:
Alto nvel de portabilidade, pois programas-fonte podem ser
transportados para outras CPUs sem maiores dificuldades;
de uso geral, sendo eficiente tanto para programao de utilitrios
como para sistemas operacionais, processadores de texto, banco de
dados e sistemas aplicativos em geral;
Gera cdigo executvel compacto e rpido em relao maioria das
outras linguagens compiladas, caracterstica desejvel para
computadores que tm memria reduzida;
Total interao com o sistema operacional, insero de cdigo
assembly no programa-fonte, sendo assim, ilimitada por software;
Sintaxe de poucos comandos e grande nmero de operadores
aritmticos e lgicos;
Estruturada e modular
Permite estruturas de dados compostos na forma de registros e
campos.
21/10/2013
COMPILADORES C
Compiladores C so programas utilizados para produzir o
cdigo executvel para uma determinada CPU a partir do
programa fonte escrito em linguagem de programao C.
Tipos de Compiladores:
Compiladores
Direto;
Dois passos.
PROCESSO DE COMPILAO
21/10/2013
ESTRUTURA DO CDIGO-FONTE
[</* comentrios */>]
[< incluses de arquivos de definies >]
[< declarao de prottipos de funes >]
[< declarao de variveis globais >]
[< tipo >] main([< tipo > varivel ]){
/*
corpo da funo principal main( )...
*/
[ return(var); ]
}
[
[< tipo >]func([< lista de parmetros >])
[< declarao de parmetros >]
{
/*
corpo da funo fun( )...
*/
}
]
ENTRADA E SADA
Funes de Entrada e Sada
As funes de entrada e sada de dados de um programa C so:
21/10/2013
VARIVEIS E CONSTANTES
Os valores que so processados por um programa C so
guardados em variveis de diversos tipos.
A formao dos nomes das variveis, funes e constantes
simblicas se d a partir de quatro regras bsicas:
Todo nome deve comear com uma letra ou com uma sublinha (_);
Os prximos caracteres podem ser letras, sublinhas ou nmeros;
O nome pode ser de qualquer tamanho (com significncia limitada a 8 ou
mais caracteres, dependendo do compilador).
Existem certos identificadores que so palavras-chave (keywords) da
linguagem e que por isso no pdem ser usados para nomear variveis e
funes:
auto
break
case
char
continue default do
double
else
entry
extern
float
for
goto
if
int
long
register return
short
sizeof
static
struct
switch
typedef union
usigned while
TIPOS DE DADOS
Cada varivel possui um tipo e em C toda varivel utilizada em um programa
deve ser previamente, conforme a sintaxe abaixo.
<tipo> <lista de variveis>;
21/10/2013
TABELA ASCII
21/10/2013
- Inteiros
Valores numricos do conjunto dos inteiros (Z) com ou sem sinal podem
assumir os valores:
-32768 # x # 32767
21/10/2013
- Hexadecimal
Os valores hexadecimais so representados com o prefixo 0x:
0x41, 0Xffff, 0xa0, 0xC1da, 0xC1FE
- Ponto Flutuante
Os nmeros reais possuem ponto decimal e podem ou no ser
acompanhados de sinal:
3.14, 2.71, -5423.7265, 1.
Exemplos:
char c;
c = A
21/10/2013
CONTINUAO
- Inteiro ((int
int))
Cada valor do tipo int armazenado na forma de 2 bytes:
Exemplo:
int var1 = 1986;
CONTINUAO
Inteiro CONT.
A ordem de posicionamento na memria dos dois bytes depende do
sistema, que pose ser do tipo:
Little Indiam (byte lsb no endereo de memria menos significativa)
Big Indiam (byte lsb no endereo de memria mais significativa)
parc_1 = 56,
parc_2 = -47,
soma;
21/10/2013
CONTINUAO
OPERADORES
Operador de Atribuio Simples
A operao mais simples atribuio de um valor a uma varivel:
Exemplo:
var = 10;
string_1[ ] = Primeira string definida no programa!...;
Operadores Aritmticos
Os operadores aritmticos bsicos e que so comuns a todas as
linguagens de programao, so:
Soma
Subtrao
Multiplicao
Diviso
+
*
/
10
21/10/2013
OPERADORES
CONTINUAO
%
++
++var;
var++;
-- -var;
var--;
Exemplo:
resto = dividendo % divisor;
x = x + 1 = x++ = x +=1
OPERADORES
CONTINUAO
Operadores Relacionais
Os operadores aritmticos especficos da linguagem C so:
Se iguais
Se Menor ou Igual
Se Maior ou Igual
Se no igual
==
<=
>=
!=
Exemplo:
If((x1==x2) && (x1 != x3)){
...
}
do{
...
}while(x3 <= 10);
11
21/10/2013
OPERADORES
CONTINUAO
Operadores Lgicos
Os operadores lgicos da linguagem C so:
Se e (AND)
Se ou (OR)
Se no (NOT)
&&
||
!
Exemplo:
If((x1 && x2)||(x1 && x3)){
...
}
do{
...
}while(x3 != 10);
OPERADORES
(var2 = 2)
CONTINUAO
Operador ?
O operador ? (atribuio) tem a seguinte sintaxe:
<expresso lgica> ? <expresso-1> : <expresso-2>
Operao: Se a expresso lgica for verdadeira, ento expresso-1 aplicada, do
contrrio, a expresso-2 ser aplicada.
Exemplo:
#include <stdio.h>
Main(){
char
a,b,z;
a = getchar();
b = getchar();
z = (a > b) ? a : b;
/* se o teste lgico for verdadeiro z=a, seno z=b */
printf(O maior valor = %c,z);
}
12
21/10/2013
OPERADORES
CONTINUAO
Exemplos:
float
valor = 3.1415926535;
...
valor = (float) ((long) (valor * 100. + 0.5))/100.
Operao: Arredonda valor com duas casas decimais e aps a execuo da
expresso valor ser igual a 3.14.
int
valor = 0x0102;
...
valor = (int) ((char) valor);
Operao: Aps a execuo da expresso valor ser igual a 2.
OPERADORES
CONTINUAO
Precedncia de Operadores
13
21/10/2013
CONTROLE DE FLUXO
Introduo
C uma linguagem com caractersticas estruturadas, isto , seus comandos
para controle de fluxo so baseados em repetio de blocos de comando,
possuindo cada bloco apenas uma entrada e uma sada bem definidas.
Define-se um comando como uma expresso seguida de um ponto-e-vrgula
( ; ); ou como um bloco de comandos delimitados por { e }; ou como um
comando de controle de fluxo.
Tomando como base esta afirmativa, so exemplos de comandos:
a) printf(Teste\n);
b) a = 2;
c) {
/* comando composto! */
a = b;
b = c;
c = a;
}
d) while ((a[i] > 0) && (i < 10))
i++;
CONTROLE DE FLUXO
CONTINUAO
Comandos:
- if
If o comando mais simples que existe em termos de controle de fluxo. Ele seleciona
a execuo de um comando se uma expresso lgica for verdadeira (quando
avaliada for diferente de zero) ou, opcionalmente, a execuo de um outro comando
no caso da expresso lgica ser falsa (quando avaliada for zero).
Sintaxe:
a) If (<expresso>)
<comando>
b) If (<expresso>)
<comando-1>
else
<comando-2>
Operao:
Operao:
a) A <expresso> avaliada. Se for verdadeira o <comando> ser executado. Seno,
o prximo comando ser executado.
<comando--1> ser executado.
b) A <expresso> avaliada. Se for verdadeira o <comando
Seno, o <comando
<comando--2> ser executado.
14
21/10/2013
CONTROLE DE FLUXO
CONTINUAO
Exemplos
a) If (a < 0)
printf(valor negativo);
b) if (a > 0)
z = a;
else
z = b;
c) If (a == b)
z = a + 1;
else
z = a +2;
d) If (x )
printf(x diferente de zero!);
CONTROLE DE FLUXO
CONTINUAO
- switch
A linguagem C oferece ao programador este comando que possibilita a
tomada de mltiplas decises baseada em uma expresso.
Sintaxe:
Switch ( <expresso> )
{
case <constante-1>:
<comando-1>
case <constante-1>:
<comando-2>
...
case <constante-n>:
<comando-n>
default:
<comando-z>
}
15
21/10/2013
CONTROLE DE FLUXO
CONTINUAO
Operao
A <expresso> avaliada e se houver um case igual a expresso avaliada,
a execuo do programa continuar a partir do comando correspondente.
Exemplo
c = getchar( );
switch (c)
{
case 1:
insere( );
break;
case 2:
retira( );
break;
case 3:
case 4
altera( );
break;
:
list_rel( );
break;
default:
impr_erro( );
}
CONTROLE DE FLUXO
CONTINUAO
- while
O while utilizado para a execuo de um bloco de comandos enquanto
uma condio lgica for verdadeira.
Sintaxe:
while (<expresso>)
<comando>
Exemplo
while ((c=getchar( ) != 0)
{
c +=0x40;
printf(A letra maiscula digitada : %c,c);
};
while com a <expresso> vazia considerado como verdadeiro e representa um loop
infinito.
Exemplo
while ( );
equivalente a (
SJMP
* ) em assembly.
16
21/10/2013
CONTROLE DE FLUXO
CONTINUAO
- for
O for um comando de repetio extremamente poderoso e um velho
conhecido das linguagens de programao. Em C ele existe em uma forma
parecida com a convencional, embora tenha uma filosofia elegante que lhe
permite construes bem mais versteis.
Sintaxe:
for (<expresso-1>; <expresso-2; expresso-3)
<comando>
equivalente a:
<expresso-1>
while (<expresso-2)
{
<comando>
expresso-3
}
Qualquer uma das partes do for pode ser omitida!
CONTROLE DE FLUXO
CONTINUAO
Exemplo
Maior = -32768;
for (i = 0; i < 100; i++)
if (val[i] > maior)
maior = val[i];
- do
do--while
O do
do--while mais conhecido em outras linguagens por uma variante com o
nome de repeat-until outra forma estruturada para controle de fluxo na
execuo repetida de um bloco de comandos enquanto uma expresso tiver
valor verdadeiro
verdadeiro. A diferena deste comando para o while que a
avaliao da expresso feita aps a execuo do comando.
Sintaxe:
do
{
<comando>
...
}while( <expresso>);
17
21/10/2013
CONTROLE DE FLUXO
CONTINUAO
Exemplo
do
{
c = getchar( );
}while (c < 1 || c > 5);
- break - continue
Algumas vezes torna-se necessrio o controle da execuo de uma iterao
independentemente do teste lgico efetuado. Com esta finalidade tem-se os
comandos break e continue
continue.
- goto - rtulos
Embora seja uma linguagem estruturada, o C possui o to controvertido
goto.
comando de desvio incondicional goto
Sintaxe
goto <rtulo>
CONTROLE DE FLUXO
CONTINUAO
Exemplos
- break
while (<expresso-1)
{
.
.
.
if (expresso-2)
break;
.
.
.
}
<comando>
18
21/10/2013
CONTROLE DE FLUXO
CONTINUAO
Exemplos
- continue
while (<expresso-1)
{
.
.
.
if (expresso-2)
continue;
.
.
.
}
<comando>
CONTROLE DE FLUXO
CONTINUAO
Exemplos
- goto & label
while (<expresso-1)
{
.
.
.
if (expresso-2)
goto ERRO;
.
.
.
}
ERRO:
<comando>
19
21/10/2013
No DE INTERRUES:
2 EXTERNAS
2 TMRs
1 SERIAL
REGISTROS ASSOCIADOS:
IE
IP
TCON
20
21/10/2013
EXT1
TMR1
SERIAL
IE Interrupt Enable
21
21/10/2013
RESET
INT0
TMR0
INT1
TMR1
UART
IE0
TF0
IE1
TF1
RI+TI
00H
03H
0BH
13H
1BH
23H
O + indica OU!
22
21/10/2013
ORG 50H
MOV
A,#11101110B
CLR
C
MOV
P1,A
SETB
EX1
;HABILITAR INT. EXT. 1
SETB
EA
;HABILITAR FLAG GERAL
SJMP
$
;LOOP INFINITO
;
;ROTINA PARA ATENDER A INTERRUPCAO EXTERNA 1
EXT1:
RLC
A
;ACENDER LEDS EM SEQUENCIA
MOV
P1,A
LCALL DELAY
RETI
DELAY
L1:
L2:
MOV
MOV
DJNZ
DJNZ
RET
R0,#0FFH
R1,#0FFH
R1,L2
R0,L1
23
21/10/2013
NO 8051:
Temporizadores/Contadores de 16-bits:
TIMER 0 (TMR0)
TIMER 1 (TMR1)
Operao:
TEMPORIZADOR
CONTADOR
24
21/10/2013
25
21/10/2013
TIMER 0/1
MODE 0
TIMER 0/1
MODE 1
26
21/10/2013
TIMER 0/1
MODE 2
TIMER 0
MODE 3
Neste modo o TMR1 suspende contagem e o TMR0 opera como dois Timers de 8 bits
27
21/10/2013
EXEMPLO 1 CONT.
Calculo do valor de carga no
registros do TIMER
;LED_10HZ.ASM
;
DEFSEG PROG, CLASS=CODE, START=0
SEG PROG
;
DEZ_HZ EQU
8800H
;N = 30720 (CLOCK=3,6864 MHz)
;RELOAD = 34816 (8800H) F = 10 Hz
ORG RESET
AJMP INIC
;
ORG TIMER0
AJMP TIM0
;
ORG 50H
28
21/10/2013
;
TIM0:
RLC
ORG 100H
MOV TL0,#LOW (DEZ_HZ+2)
;REINICALIZAR
MOV TH0,#HIGH DEZ_HZ
;O CONTADOR
RLC A
MOV P1,A
RETI
Compilao & Linkedio AVOCET
END
(DIRETRIO ...\
...\AVOCET
AVOCET\\ASM51\
ASM51\>)
Comandos:
avmac51 exemplo1.asm
avlink51 exemplo1=exemplo1
29
21/10/2013
ORG 50H
MOV TL0,#LOW DEZ_HZ
MOV TH0,#HIGH DEZ_HZ
MOV R7,#DIVISOR
MOV TMOD,#61H
MOV IE,#82H
MOV P1,#0
MOV A,#01001001B
CLR C
SETB TR0
SJMP $
;
TIM0:
ORG 100H
MOV TL0,#LOW (DEZ_HZ+2)
MOV TH0,#HIGH DEZ_HZ
;REINICALIZAR
;O CONTADOR
30
21/10/2013
FIM :
DJNZ R7,FIM
MOV R7,#DIVISOR
RLC A
MOV P1,A
RETI
END
;DECREMENTA DIVISOR
;(EQUIV. 10 Hz/10)
31
21/10/2013
32
21/10/2013
;
TIM0:
LB1 :
;PARTIDA DO TIMER 0
;LOOP INFINITO
JB SAIDA,LB1
MOV TL0,#LOW (R_40MICRO+4)
MOV TH0,#HIGH R_40MICRO
SETB SAIDA
RETI
;2 CICLOS
;2 CICLOS
;2 CICLOS
;1 CICLO
;2 CICLOS
;TIMER 0 EM MODO 1
;EA=1 E ET0=1
P0
TCON
P1
SCON
P2
IE
IEN0
P3
IP
IRCON
T2CON
ADCON
P5
@ 0x80;
@ 0x88;
@ 0x90;
@ 0x98;
@ 0xA0;
@ 0xA8;
@ 0xA8;
@ 0xB0;
@ 0xB8;
@ 0xC0;
@ 0xC8;
@ 0xD8;
@ 0xF8;
33
21/10/2013
P0_BITS
TCON_BITS
P1_BITS
SCON_BITS
P2_BITS
IE_BITS
IEN0_BITS
P3_BITS
IP_BITS
IRCON_BITS
T2CON_BITS
ADCON_BITS
P5_BITS
SBUF
SP
PCON
TMOD
TH0
TH1
TL0
TL1
IP1
@ 0x80;
@ 0x88;
@ 0x90;
@ 0x98;
@ 0xA0;
@ 0xA8;
@ 0xA8;
@ 0xB0;
@ 0xB8;
@ 0xC0;
@ 0xC8;
@ 0xD8;
@ 0xF8;
@ 0x99;
@ 0x81;
@ 0x87;
@ 0x89;
@ 0x8C;
@ 0x8D;
@ 0x8A;
@ 0x8B;
@ 0xB9;
CCEN
CCL1
CCH1
CCL2
CCH2
CCL3
CCH3
CRCL
RCAP2L
RCAP2H
CRCH
TL2
TH2
ADDAT
DAPR
@ 0xC1;
@ 0xC2;
@ 0xC3;
@ 0xC4;
@ 0xC5;
@ 0xC6;
@ 0xC7;
@ 0xCA;
@ 0xCA;
@ 0xCB;
@ 0xCB;
@ 0xCC;
@ 0xCD;
@ 0xD9;
@ 0xDA;
TF1
TR1
TF0
TR0
IE1
IT1
IE0
@ 0x8F;
@ 0x8E;
@ 0x8D;
@ 0x8C;
@ 0x8B;
@ 0x8A;
@ 0x89;
34
21/10/2013
IT0
SM0
SM1
SM2
REN
TB8
RB8
TI
RI
EA
ES
ET1
EX1
ET0
EX0
RD
WR
T1
T0
INT1
INT0
TXD
RXD
@ 0x88;
@ 0x9F;
@ 0x9E;
@ 0x9D;
@ 0x9C;
@ 0x9B;
@ 0x9A;
@ 0x99;
@ 0x98;
@ 0xAF;
@ 0xAC;
@ 0xAB;
@ 0xAA;
@ 0xA9;
@ 0xA8;
@ 0xB7;
@ 0xB6;
@ 0xB5;
@ 0xB4;
@ 0xB3;
@ 0xB2;
@ 0xB1;
@ 0xB0;
Interrupt vectors */
#define
#define
#define
#define
#define
#define
#define
RESET
EXTI0
TIMER0
EXTI1
TIMER1
SINT
TIMER2
PS
PT1
PX1
PT0
PX0
@ 0xBC;
@ 0xBB;
@ 0xBA;
@ 0xB9;
@ 0xB8;
0
3
11
19
27
35
43
35
21/10/2013
USO DE INTERRUO EM C
Interrupo
Uma rotina para tratamento de interrupo (ISR) definida atravs dos seguintes
procedimentos:
1 Ajuste dos bits dos SFRs associados interrupo que se deseja usar (int_setup
int_setup.h
.h).
2 Definindo a handler ISR:
[<type>] interrupt handler ( [<parametros>] )
{
[disable();]
/* bloqueia pedidos de novas interrupes */
.
.
.
[enable();]
/* habilita pedidos de novas interrupes */
[return();]
}
3 Ajuste da ISR ao vetor de interrupo correspondente:
set_vec(vec,handler
set_vec
handler);
PROGRAMA FONTE
Exemplo de Programa Fonte: EPD01.C
/*
Programa: EPD01.C
Funcao: Controle de 4 LEDs acionados atravs da porta P1.0 a P1.3 do 8051
Copyright: ivo@feb.unesp.br
*/
static unsigned char P1 @0x90;
main(){
unsigned char x,y;
P1 = 0xff;
while(1){
do{
x = P1;
y = x;
x >>= 4;
}while(x==0x0f);
36
21/10/2013
do{
/* Faz enquanto a tecla nao for solta */
x = P1;
x >>=4;
}while(x != 0x0f);
};
}
37
21/10/2013
38
21/10/2013
PONTEIROS EM C
Ponteiro
Quando declarada com ponteiro a varivel conter o endereo de uma outra
varivel do mesmo tipo. (para obter o endereo de uma varivel usamos o operador &)
Sintaxe:
<tipo> *<nome_da_varivel
*<nome_da_varivel>;
>;
Exemplos::
Exemplos
unsigned char var1, var2;
unsigned char myname[ ] = {Ivo RF!...}; /* o nome do vetor, myname, um ponteiro!... /
unsigned char *ponteiro;
ponteiro = &var1;
var2 = *ponteiro;
ponteiro = myname;
ponteiro +=9;
var1 = *ponteiro;
39
21/10/2013
ESTRUTURA E UNIO EM C
Estrutura
bastante comum a necessidade de se manipularem dados em conjunto, isto
, grupos de variveis diferentes que mantm alguma relao em comum. A
linguagem C proporciona facilidades para o uso de variveis compostas, que
so constituidas de diversas variveis de mesmo tipo ou de tipos diferentes. A
seguir segue um exemplo clssico:
Cadastro de Funcionrios:
Nome;
Endereo;
Nome do Conjuge;
Conjuge;
Nmero de Dependentes;
Cargo;
Salrio;
Data da Admisso.
nome[30];
endereco[40];
telefone[8];
idade;
data_adm[10];
40
21/10/2013
41