Upload
pedro-lucarelli
View
25
Download
1
Embed Size (px)
DESCRIPTION
Desprogramando em C#
Citation preview
21/10/2013
1
PPROGRAMAOROGRAMAO C C AANSINSIPARAPARA
MMICROCONTROLADORESICROCONTROLADORES
Dr. Ivo Reis [email protected]
i1
CCOMPILADORESOMPILADORES
CompiladoresCompiladores so programas utilizados para produzir o cdigo executvel para uma determinada CPU a partir do programa fonte escrito em linguagem de programao.
Tipos de CompiladoresTipos de Compiladores: Direto;
Dois passos.
Compilador Direto: Compilador Direto: Produz o cdigo executvel a partir da compilao (.obj) e montagem do cdigo executvel (.hex).
Dois Passos:Dois Passos: Primeiramente o compilador produz o cdigo assembly (.asm) para depois produzir o cdigo executvel (.obj e .hex).
Slide 1
i1 ANSI
American National Standard Instituteivo; 02/09/2013
21/10/2013
2
CCOMPILADORESOMPILADORES CC
Histrico da Linguagem C:Histrico da Linguagem C: Programas que executam tarefas ligadas s funes do sistema
operacional ou instrues do microprocessador/microcontroladornormalmente necessitam ser codificados em linguagem de montagem(assemblyassembly). A linguagem C foi desenvolvida para resolver esteproblema de forma menos penosa e mais porttil.
A linguagem C considerada de mdiomdio nvelnvel por possuir controle defluxo e estrutura de dados de forma semelhante s linguagem de altonvel, e ao mesmo tempo, proporcionar facilidades que s estodisponvel em linguagem de baixo nvel (assemblyassembly).
O CC AnsiAnsi foi projetado em 1972 nos laboratrios da Bell por Brian W.
Kernighan e Dennis M. Ritchie, para o sistema operacional UNIX..
Principais caractersticas da Linguagem 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 utilitrioscomo para sistemas operacionais, processadores de texto, banco dedados e sistemas aplicativos em geral;
Gera cdigo executvel compacto e rpido em relao maioria dasoutras linguagens compiladas, caracterstica desejvel paracomputadores que tm memria reduzida;
Total interao com o sistema operacional, insero de cdigoassembly no programa-fonte, sendo assim, ilimitada por software;
Sintaxe de poucos comandos e grande nmero de operadoresaritmticos e lgicos;
Estruturada e modular
Permite estruturas de dados compostos na forma de registros ecampos.
CCOMPILADORESOMPILADORES CC
21/10/2013
3
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 CompiladoresTipos de Compiladores: Direto;
Dois passos.
Compilador Direto: Compilador Direto: Produz o cdigo executvel a partir da compilao (.obj) e montagem do cdigo executvel (.hex).
Dois Passos:Dois Passos: Primeiramente o compilador produz o cdigo assembly (.asm) para depois produzir o cdigo executvel (.obj e .hex
CCOMPILADORESOMPILADORES CC
PPROCESSOROCESSO DEDE CCOMPILAOOMPILAO
21/10/2013
4
[][< 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( )...*/
}]
EESTRUTURASTRUTURA DODO CCDIGODIGO--FFONTEONTE
Funes de Entrada e SadaFunes de Entrada e Sada As funes de entrada e sada de dados de um programa C so:
getchar() l um caracter (byte) da entrada padro
putchar() escreve um caracter (byte na sada padro
gets() l uma cadeia de caracteres (bytes) da entrada padro
puts() escreve uma cadeia de caracteres (bytes na sada padro
scanf() l entrada formatada de dados (usa a funo getchar())
printf() escreve sada formatada de dados (usa a funo putchar())
Exemplos da Entrada e SadaExemplos da Entrada e Sada var1 = getchar(); /* observe que esta funo no necessita de parmetros */
putchar(var1);
nome = gets(); /* nome um vetor do tipo char p.e. char nome[20] */
puts(nome); /* nome um apontador (pointer) do tipo char */
scanf(Entre com o seu nome: %s, nome);
printf(Hello World!.../nHoje completa %d dias que sei programar C/n, dias);
EENTRADANTRADA EE SSADAADA
21/10/2013
5
Os valores que so processados por um programa C soguardados em variveis de diversos tipos.
A formao dos nomes das variveis, funes e constantessimblicas 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 doubleelse entry extern float for goto if intlong register return short sizeof static struct switchtypedef union usigned while
VVARIVEISARIVEIS EE CCONSTANTESONSTANTES
Cada varivel possui um tipo e em C toda varivel utilizada em um programa Cada varivel possui um tipo e em C toda varivel utilizada em um programa deve ser previamente, conforme a sintaxe abaixo.deve ser previamente, conforme a sintaxe abaixo.
; ;
Tipos de variveis em C so:Tipos de variveis em C so: charchar /* contm um caractere ASCII, ocupa 1 byte da memria de dados
*/
intint /* contm valores numricos inteiros positivos ou negativos, ocupa 2 bytes da memria de dados */
shortshort /* mesmo que os inteiros porm podem ocupar menor nmero de bytes da memria de dados */
longlong /* contm valores inteiros e maior valor, ocupam 4 bytes da memria de dados */
unsignedunsigned /* valores inteiros sem representao de sinal */
floatfloat /* nmeros reais de ponto flutuante, ocupam 4 bytes de memria de dados*/
doubledouble /* nmeros reais como o float maiores, ocupam 8 bytes da memria de dados */
TTIPOSIPOS DEDE DDADOSADOS
21/10/2013
6
-- CaracteresCaracteres
Constantes caracteres ficam entre plics () e so representados pelo valor ASCII: a, A, *, 2, ?
Existem caracteres que no so imprimveis (i.e. no possuem um smbolo visvel e que tm funes especficas:
\0 - nulo corresponde ao cdigo ASCII = 0
\n- comando newline de nova linha
\t- comando tab de tabulao
\b - comando back-space volta uma posio
\r - comando de retorno de carro CR
\f- comando form-feed comando de nova pgina
\\ - barra invertida
\ - plic
nnn - representao de um byte na base octal, p.e. O33 = caracter scape
\xnn- representao de um byte na forma hexadecimal
TTIPOSIPOS DEDE DDADOSADOS CONTINUAOCONTINUAO
TTABELAABELA ASCIIASCII
21/10/2013
7
TTABELAABELA ASCII ASCII EXTENDIDAEXTENDIDA
-- Cadeia de Caracteres Cadeia de Caracteres (String)(String)
Alem dos caracteres isolados podemos representar cadeias de caracteres,que so dispostas entre aspas:
Nome[ ] = Ivo Reis Fontes\n;
-- InteirosInteiros
Valores numricos do conjunto dos inteiros (Z) com ou sem sinal podemassumir os valores:
-32768 # x # 32767 ImportanteImportante:: Os valores negativos so armazenados na
forma de complemento de 2.
TTIPOSIPOS DEDE DDADOSADOS CONTINUAOCONTINUAO
21/10/2013
8
-- LongosLongos
Para diferenci-los das constantes do tipo int, os tipos long tm sufixo LL
3241L, 0L, 130000000L
-- HexadecimalHexadecimal
Os valores hexadecimais so representados com o prefixo 00xx:
0x41, 0Xffff, 0xa0, 0xC1da, 0xC1FE
-- Ponto FlutuantePonto Flutuante
Os nmeros reais possuem ponto decimal e podem ou no seracompanhados de sinal:
3.14, 2.71, -5423.7265, 1.
TTIPOSIPOS DEDE DDADOSADOS CONTINUAOCONTINUAO
-- CharacterCharacter ((charchar))
Cada valor do tipo char armazenado na forma de um byte:
Exemplos:
char c;
c = A = 0x41 = 65 = \x41 = \101
RREPRESENTAOEPRESENTAO DOSDOS DDADOSADOS NANA MMEMRIAEMRIA
21/10/2013
9
-- Inteiro (Inteiro (intint))
Cada valor do tipo int armazenado na forma de 2 bytes:
Exemplo:
int var1 = 1986;
e var1 = -1986 ter a forma (complemento de 2complemento de 2):
RREPRESENTAOEPRESENTAO DOSDOS DDADOSADOS NANA MMEMRIAEMRIA CONTINUAOCONTINUAO
InteiroInteiro CONT.CONT.
A ordem de posicionamento na memria dos dois bytes depende do sistema, que pose ser do tipo:
LittleLittle IndiamIndiam (byte lsb no endereo de memria menos significativa) Big Big IndiamIndiam (byte lsb no endereo de memria mais significativa)
Exemplo de programao Exemplo de programao (prog01.c):
main(){int parc_1 = 56,int parc_2 = -47,
soma;
soma = parc_1 + parc_2;printf(%d, soma);
}
RREPRESENTAOEPRESENTAO DOSDOS DDADOSADOS NANA MMEMRIAEMRIA CONTINUAOCONTINUAO
21/10/2013
10
-- ponto flutuante (ponto flutuante (floatfloat))
Cada valor do tipo float armazenado na forma de 1 byte para o expoente
e os restantes armazenam a base.O nmero total de bytes depende da arquitetura da CPU do computador.
RREPRESENTAOEPRESENTAO DOSDOS DDADOSADOS NANA MMEMRIAEMRIA CONTINUAOCONTINUAO
Operador de Atribuio SimplesOperador de Atribuio Simples
A operao mais simples atribuio de um valor a uma varivel:
Exemplo:Exemplo:var = 10;string_1[ ] = Primeira string definida no programa!...;
Operadores AritmticosOperadores Aritmticos
Os operadores aritmticos bsicos e que so comuns a todas as linguagens de programao, so:
Soma +Subtrao -Multiplicao *Diviso /
OOPERADORESPERADORES
21/10/2013
11
Operadores Aritmticos (especficos da linguagem)Operadores Aritmticos (especficos da linguagem)
Os operadores aritmticos especficos da linguagem C so:Diviso modulo 10 %Auto incremento ++
pr-incremento ++var;ps-incremento var++;
Auto decremento - -pr-decremento - -var;ps-decremento var--;
Negao
Exemplo:Exemplo:resto = dividendo % divisor;x = x + 1 = x++ = x +=1
OOPERADORESPERADORES CONTINUAOCONTINUAO
Operadores RelacionaisOperadores Relacionais
Os operadores aritmticos especficos da linguagem C so:Se iguais ==Se Menor ou Igual =Se no igual !=
Exemplo:Exemplo:If((x1==x2) && (x1 != x3)){...
}do{...
}while(x3
21/10/2013
12
Operadores LgicosOperadores Lgicos
Os operadores lgicos da linguagem C so:Se e (AND) &&Se ou (OR) ||Se no (NOT) !
Exemplo:Exemplo:If((x1 && x2)||(x1 && x3)){...
}do{...
}while(x3 != 10);
Operadores Tamanho de VarivelOperadores Tamanho de Varivel
Os operadores tamanho em bytes de uma varivel em Cint var1,var2; var2 = sizeof (var1); (var2 = 2)
OOPERADORESPERADORES CONTINUAOCONTINUAO
OOPERADORESPERADORES CONTINUAOCONTINUAO
OperadorOperador ??
O operador ? ? (atribuio) tem a seguinte sintaxe: ? :
Operao: Se a expresso lgica for verdadeira, ento expresso-1 aplicada, do contrrio, a expresso-2 ser aplicada.
Exemplo:Exemplo:
#include 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);
}
21/10/2013
13
Operador de Converso AutomticaOperador de Converso Automtica
Da mesma forma que as outras linguagens de programao, possvel converter tipos de dados utilizando-se o operador:
()
Exemplos:Exemplos:float valor = 3.1415926535;...
valor = (float) ((long) (valor * 100. + 0.5))/100.
Operao: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:Operao: Aps a execuo da expresso valor ser igual a 2.
OOPERADORESPERADORES CONTINUAOCONTINUAO
OOPERADORESPERADORES CONTINUAOCONTINUAO
Precedncia de OperadoresPrecedncia de Operadores
21/10/2013
14
CCONTROLEONTROLE DEDE FFLUXOLUXO
IntroduoIntroduoC uma linguagem com caractersticas estruturadas, isto , seus comandospara 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 umcomando 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++;
CCONTROLEONTROLE DEDE FFLUXOLUXO CONTINUAOCONTINUAO
Comandos:Comandos:-- ififIfIf o comando mais simples que existe em termos de controle de fluxo. Ele selecionaa execuo de um comando se uma expressoexpresso lgicalgica forfor verdadeiraverdadeira (quandoavaliada for diferente de zero) ou, opcionalmente, a execuo de um outro comandono caso da expressoexpresso lgicalgica serser falsafalsa (quando avaliada for zero).Sintaxe:Sintaxe:a) If ()
b) If ()
else
OperaoOperao::a) A avaliada. Se for verdadeira o ser executado. Seno,o prximo comando ser executado.b) A avaliada. Se for verdadeira o ser executado.Seno, o ser executado.
21/10/2013
15
CCONTROLEONTROLE DEDE FFLUXOLUXO CONTINUAOCONTINUAO
ExemplosExemplos
a) If (a < 0)printf(valor negativo);
b) if (a > 0)z = a;
elsez = b;
c) If (a == b)z = a + 1;
elsez = a +2;
d) If (x )printf(x diferente de zero!);
CCONTROLEONTROLE DEDE FFLUXOLUXO CONTINUAOCONTINUAO
-- switchswitch
A linguagem C oferece ao programador este comando que possibilita atomada de mltiplas decises baseada em uma expresso.Sintaxe:Sintaxe:
Switch ( ){
case :
case :
...
case :
default:
}
21/10/2013
16
CCONTROLEONTROLE DEDE FFLUXOLUXO CONTINUAOCONTINUAO
OperaoOperaoA avaliada e se houver um casecase igual a expresso avaliada,a execuo do programa continuar a partir do comando correspondente.ExemploExemploc = getchar( );switch (c){
case 1:insere( );break;
case 2:retira( );break;
case 3:altera( );break;
case 4 :list_rel( );break;
default:impr_erro( );
}
CCONTROLEONTROLE DEDE FFLUXOLUXO CONTINUAOCONTINUAO
-- whilewhile
O whilewhile utilizado para a execuo de um bloco de comandos enquantouma condio lgica for verdadeira.Sintaxe:Sintaxe:
while ()
ExemploExemplowhile ((c=getchar( ) != 0){
c +=0x40;printf(A letra maiscula digitada : %c,c);
};whilewhile com a vazia considerado como verdadeiro e representa um loop infinito.ExemploExemplowhile ( );
equivalente a ( SJMPSJMP * * ) em assembly.
21/10/2013
17
CCONTROLEONTROLE DEDE FFLUXOLUXO CONTINUAOCONTINUAO
-- forfor
O forfor um comando de repetio extremamente poderoso e um velhoconhecido das linguagens de programao. Em C ele existe em uma formaparecida com a convencional, embora tenha uma filosofia elegante que lhepermite construes bem mais versteis.Sintaxe:Sintaxe:for (;
21/10/2013
18
ExemploExemplodo{
c = getchar( );}while (c < 1 || c > 5);-- breakbreak - continuecontinue
Algumas vezes torna-se necessrio o controle da execuo de uma iteraoindependentemente do teste lgico efetuado. Com esta finalidade tem-se oscomandos breakbreak e continuecontinue.
-- gotogoto - rtulosrtulosEmbora seja uma linguagem estruturada, o C possui o to controvertidocomando de desvio incondicional gotogoto.
SintaxeSintaxe
goto
CCONTROLEONTROLE DEDE FFLUXOLUXO CONTINUAOCONTINUAO
ExemplosExemplos
while (
21/10/2013
19
ExemplosExemplos
while (
21/10/2013
20
UUSOSO DEDE IINTERRUPESNTERRUPES DODO 80518051
Interrupo o processo atravs do qual a execuo de um programa podeser interrompida de forma assncrona por um evento interno/externo.Associada ao evento existe uma rotina de servio (ISR)
NNoo DE INTERRUES:DE INTERRUES: 2 EXTERNAS2 EXTERNAS
2 TMRs2 TMRs
1 SERIAL1 SERIAL
REGISTROS ASSOCIADOS:REGISTROS ASSOCIADOS: IEIE IPIP TCONTCON
UUSOSO DEDE IINTERRUPESNTERRUPES DODO 8051 8051 CONTINUAOCONTINUAO
ESQUEMA DE INTERRUPO ESQUEMA DE INTERRUPO
21/10/2013
21
UUSOSO DEDE PPERIFRICOSERIFRICOS DODO 80518051CONTINUAOCONTINUAO
REGISTROS REGISTROS
IE IE Interrupt EnableInterrupt Enable
EXT1
EXT1
TMR
1TM
R1
SER
IAL
SER
IAL
UUSOSO DEDE IINTERRUPESNTERRUPES DODO 8051 8051 CONTINUAOCONTINUAO
REGISTROS REGISTROS CONT. CONT.
TCON TCON Timer ControlTimer Control
21/10/2013
22
VETOR DE INTERRUPO VETOR DE INTERRUPO Cada interrupo atendida por uma ISR (Interrupt Service Routine)apontada para as seguintes posies de memria:
RESETRESET 00H00HINT0INT0 IE0IE0 03H03HTMR0TMR0 TF0TF0 0BH0BHINT1INT1 IE1IE1 13H13HTMR1TMR1 TF1TF1 1BH1BHUARTUART RI+TIRI+TI 23H23H O + indica OU!O + indica OU!
UUSOSO DEDE IINTERRUPESNTERRUPES DODO 8051 8051 CONTINUAOCONTINUAO
A seguir apresentada a sequncia de eventos em ciclos de mquina no atendimento de uma interruo
UUSOSO DEDE IINTERRUPESNTERRUPES DODO 8051 8051 EMEM AASSEMBLYSSEMBLY CONTINUAOCONTINUAO
21/10/2013
23
EXEMPLO DO USO DE INTEXEMPLO DO USO DE INTERRUPOERRUPO (em (em AssemblyAssembly))
;LED_INT1.ASMDEFSEG PROG, CLASS=CODE, START=0SEG PROG
;ORG RESETAJMP INICIO
;ORG EXTI1AJMP EXT1
;
A seguir apresentado um exemplo que faz uso da interruo externa INT1para acender 4 LEDs ligados aos 4 bits menos significativos da porta P1,sequencialmente.Observao: Considere que uma chave SW est conectada entrada INT1, ouseja, pino P3.3 !
UUSOSO DEDE IINTERRUPESNTERRUPES DODO 8051 8051 EMEM AASSEMBLYSSEMBLY CONTINUAOCONTINUAO
UUSOSO DEDE IINTERRUPESNTERRUPES DODO 8051 8051 EMEM AASSEMBLYSSEMBLY CONTINUAOCONTINUAO
EXEMPLO DO USO DE INTEXEMPLO DO USO DE INTERRUPOERRUPO CONT.CONT.ORG 50H
INICIO: MOV A,#11101110BCLR CMOV P1,ASETB EX1 ;HABILITAR INT. EXT. 1SETB EA ;HABILITAR FLAG GERALSJMP $ ;LOOP INFINITO
;;ROTINA PARA ATENDER A INTERRUPCAO EXTERNA 1EXT1: RLC A ;ACENDER LEDS EM SEQUENCIA
MOV P1,ALCALL DELAYRETI
DELAYMOV R0,#0FFH
L1: MOV R1,#0FFHL2: DJNZ R1,L2
DJNZ R0,L1RET
21/10/2013
24
NO 8051:Temporizadores/Contadores de 16-bits:
TIMER 0 (TMR0) TIMER 1 (TMR1)
Operao: TEMPORIZADOR
Os registradores (SFR) TL0/TL1 e TH0/TH1 formam os registros de 16-bits, que so incrementados a cada ciclo de mquina (base de tempo a partir do CLOCK, ou seja, FTMR = Fclock/12)
CONTADOR O registradores de 16-bits so incrementados a cada transio
de 1 para 0 () nos pinos P3.4(T0) e P3.5(T1) respectivamente
UUSOSO DEDE TTEMPORIZADORESEMPORIZADORES/C/CONTADORESONTADORES DODO 8051 8051 CONTINUAOCONTINUAO
RegistrosRegistros & & TemporizadoresTemporizadores//ContadoresContadoresSFR associados aos TMRs:
TMOD TCON
TMOD Os bits do registrador TMOD (SFR) definem:
Modo de Operaao (M0/M1) Contador/Temporizador (Contador/~Temporizador) Contagem depende do estado de INT0/INT1 e de TR0/TR1 (GATE)
TCON Os bits do registrador TCON (SFR) correspondem a:
FLAG de OVERFLOW (TF0/TF1) FLAG de Interrupes na transio de INT0/INT1 (IE0/IE1) RUN/STOP TMR0/TMR1 (TR0/TR1) BORDA/NVEL para aceitar pedido de interruo (IT0/IT1)
UUSOSO DEDE TTEMPORIZADORESEMPORIZADORES/C/CONTADORESONTADORES DODO 8051 8051 CONTINUAOCONTINUAO
21/10/2013
25
RegistrosRegistros de de ControleControleTMOD:TMOD:
UUSOSO DEDE TTEMPORIZADORESEMPORIZADORES/C/CONTADORESONTADORES DODO 8051 8051 CONTINUAOCONTINUAO
RegistrosRegistros de de ControleControleTCON:TCON:
UUSOSO DEDE TTEMPORIZADORESEMPORIZADORES/C/CONTADORESONTADORES DODO 8051 8051 CONTINUAOCONTINUAO
21/10/2013
26
MODOSMODOSMODOSMODOS
Os modos de operao de TMR0/TMR1 so ajustado atravs dos bits M0 e M1 em TMOD
MODO 0MODO 0
TIMER 0/1MODE 0
UUSOSO DEDE TTEMPORIZADORESEMPORIZADORES/C/CONTADORESONTADORES DODO 8051 8051 CONTINUAOCONTINUAO
MODOSMODOS CONTINUAOCONTINUAOMODO 1MODO 1
TIMER 0/1MODE 1
UUSOSO DEDE TTEMPORIZADORESEMPORIZADORES/C/CONTADORESONTADORES DODO 8051 8051 CONTINUAOCONTINUAO
21/10/2013
27
MODO 2MODO 2
TIMER 0/1MODE 2
MODOSMODOS CONTINUAOCONTINUAO
UUSOSO DEDE TTEMPORIZADORESEMPORIZADORES/C/CONTADORESONTADORES DODO 8051 8051 CONTINUAOCONTINUAO
MODO 3MODO 3
Neste modo o TMR1 suspende contagem e o TMR0 opera como dois Timers de 8 bits
TIMER 0MODE 3
MODOSMODOS
UUSOSO DEDE TTEMPORIZADORESEMPORIZADORES/C/CONTADORESONTADORES DODO 8051 8051 CONTINUAOCONTINUAO
21/10/2013
28
EXEMPLO 1 (Assembly)EXEMPLO 1 (Assembly)No exemplo a seguir acende-se os leds vermelho, amarelo e verde, ligados aospinos P1.0, P1.1 e P1.2, respectivamente, em seqncia e a uma velocidade de10 Hz, utilizando a interrupo de TMR0 (MODO=1)com RELOAD apropriado.ATENO: Ser necessrio calcular o valor de recarga para o TMR0
UUSOSO DEDE TTEMPORIZADORESEMPORIZADORES/C/CONTADORESONTADORES DODO 8051 8051 CONTINUAOCONTINUAO
EXEMPLO 1 EXEMPLO 1 CONT.CONT.
;LED_10HZ.ASM;
DEFSEG PROG, CLASS=CODE, START=0SEG PROG
;DEZ_HZ EQU 8800H ;N = 30720 (CLOCK=3,6864 MHz)
;RELOAD = 34816 (8800H) F = 10 HzORG RESETAJMP INIC
;ORG TIMER0AJMP TIM0
;ORG 50H
Calculo do valor de carga no registros do TIMER
UUSOSO DEDE TTEMPORIZADORESEMPORIZADORES/C/CONTADORESONTADORES DODO 8051 8051 CONTINUAOCONTINUAO
21/10/2013
29
EXEMPLO 1 EXEMPLO 1 CONT.CONT.
INIC: MOV TL0,#LOW DEZ_HZMOV TH0,#HIGH DEZ_HZMOV TMOD,#61H ;TIMER 0 EM MODO 1MOV IE,#82H ;#10000010BMOV P1,#0 ;APAGAR TODOS OS LEDSMOV A,#11011011BCLR CSETB TR0SJMP $
;ORG 100H
TIM0: MOV TL0,#LOW (DEZ_HZ+2) ;REINICALIZARMOV TH0,#HIGH DEZ_HZ ;O CONTADORRLC AMOV P1,ARETIEND
00 11 11 00 11 11 00 11 11AAPSW.CYPSW.CY
RLCRLC
UUSOSO DEDE TTEMPORIZADORESEMPORIZADORES/C/CONTADORESONTADORES DODO 8051 8051 CONTINUAOCONTINUAO
Compilao & Compilao & LinkedioLinkedio AVOCETAVOCET(DIRETRIO ...(DIRETRIO ...\\AVOCETAVOCET\\ASM51ASM51\\>)>)
Comandos:avmac51 exemplo1.asmavlink51 exemplo1=exemplo1
No exemplo a seguir acende-se os leds vermelho, amarelo e verde doEXEMPLO 1, em seqncia, a uma velocidade de 1 Hz, utilizando a interrupode TMR0 com RELOAD apropriado.ATENO: necessrio calcular o valor de recarga para o TMR0!PROBLEMA: No mais possvel utilizar a soluo adotada em EXEMPLO 1!
A sada adotar um contador!
EXEMPLO 2 (Assembly)EXEMPLO 2 (Assembly)
UUSOSO DEDE TTEMPORIZADORESEMPORIZADORES/C/CONTADORESONTADORES DODO 8051 8051 CONTINUAOCONTINUAO
21/10/2013
30
EXEMPLO 2 EXEMPLO 2 CONT.CONT.
;LED_1HZ.ASM;
DEFSEG PROG, CLASS=CODE, START=0SEG PROG
;N = 307200 (CLOCK=3,6864 MHz);Impossvel!;Adota-se: RELOAD=8800H (10 Hz);e CONTADOR = 10
DEZ_HZ EQU 8800HDIVISOR EQU 10;
ORG RESETAJMP INIC
;ORG TIMER0AJMP TIM0
UUSOSO DEDE TTEMPORIZADORESEMPORIZADORES/C/CONTADORESONTADORES DODO 8051 8051 CONTINUAOCONTINUAO
EXEMPLO 2 EXEMPLO 2 CONT.CONT.
;ORG 50H
INIC: MOV TL0,#LOW DEZ_HZMOV TH0,#HIGH DEZ_HZMOV R7,#DIVISOR ;PREPARAR DIVISAO POR 10MOV TMOD,#61H ;TIMER 0 EM MODO 1MOV IE,#82H ;HABILITA INTERRUPOMOV P1,#0 ;APAGAR TODOS OS LEDSMOV A,#01001001BCLR CSETB TR0SJMP $
;ORG 100H
TIM0: MOV TL0,#LOW (DEZ_HZ+2) ;REINICALIZARMOV TH0,#HIGH DEZ_HZ ;O CONTADOR
UUSOSO DEDE TTEMPORIZADORESEMPORIZADORES/C/CONTADORESONTADORES DODO 8051 8051 CONTINUAOCONTINUAO
21/10/2013
31
EXEMPLO 2 EXEMPLO 2 CONT.CONT.
DJNZ R7,FIM ;DECREMENTA DIVISORMOV R7,#DIVISOR ;(EQUIV. 10 Hz/10)RLC AMOV P1,A
FIM : RETIEND
UUSOSO DEDE TTEMPORIZADORESEMPORIZADORES/C/CONTADORESONTADORES DODO 8051 8051 CONTINUAOCONTINUAO
EXEMPLO 3EXEMPLO 3 (Assembly)(Assembly)
No exemplo a seguir gera um trem de pulsos, conforme mostrado na figura abaixo, utilizando a interrupo do TMR0.
UUSOSO DEDE TTEMPORIZADORESEMPORIZADORES/C/CONTADORESONTADORES DODO 8051 8051 CONTINUAOCONTINUAO
21/10/2013
32
EXEMPLO 3 EXEMPLO 3 CONT.CONT.
SOLUO:Ser necessrio calcular DOIS valores de RELOAD:
1) RELOAD para 1 mseg:
1 mseg = (12 N)/FCLOCK = (12 N)/3,6864 MHzN1mseg = (10-3 seg 3,6842106)/12 = 307,2 307RELOAD1mseg = 65229 = FEC0H
1) RELOAD para 40 seg:
40 seg = (12 N)/FCLOCK = (12 N)/3,6864 MHzN 40seg = (4010-6 seg 3,6842106)/12 = 12,288 12RELOAD40seg = 65524 = FFF4H
UUSOSO DEDE TTEMPORIZADORESEMPORIZADORES/C/CONTADORESONTADORES DODO 8051 8051 CONTINUAOCONTINUAO
EXEMPLO 3 EXEMPLO 3 CONT.CONT.
;ONDA1.ASMDEFSEG PROG, CLASS=CODE, START=0SEG PROG
;SAIDA EQU P1.7R_1MS EQU 0FEC0H ;RETARDO DE 1 MILISEGR_40MICRO EQU 0FFF4H ;RETARDO DE 40 MICROSEG;
ORG RESETAJMP INICIO
;ORG TIMER0AJMP TIM0
;ORG 50H
INICIO: MOV TL0,#LOW R_1MS
UUSOSO DEDE TTEMPORIZADORESEMPORIZADORES/C/CONTADORESONTADORES DODO 8051 8051 CONTINUAOCONTINUAO
21/10/2013
33
EXEMPLO 3 EXEMPLO 3 CONT.CONT.
MOV TH0,#HIGH R_1MSMOV TMOD,#61 ;TIMER 0 EM MODO 1MOV IE,#82H ;EA=1 E ET0=1CLR SAIDASETB TR0 ;PARTIDA DO TIMER 0SJMP $ ;LOOP INFINITO
;TIM0: JB SAIDA,LB1 ;2 CICLOS
MOV TL0,#LOW (R_40MICRO+4) ;2 CICLOSMOV TH0,#HIGH R_40MICRO ;2 CICLOSSETB SAIDA ;1 CICLORETI ;2 CICLOS
LB1 : MOV TL0,#LOW (R_1MS+4)MOV TH0,#HIGH R_1MSCLR SAIDARETIEND
UUSOSO DEDE TTEMPORIZADORESEMPORIZADORES/C/CONTADORESONTADORES DODO 8051 8051 CONTINUAOCONTINUAO
typedef struct {unsigned B7:1; /* this is the most significant bit */unsigned B6:1;unsigned B5:1;unsigned B4:1;unsigned B3:1;unsigned B2:1;unsigned B1:1;unsigned B0:1;
} SFR_BITS;
static unsigned char P0 @ 0x80;static unsigned char TCON @ 0x88;static unsigned char P1 @ 0x90;static unsigned char SCON @ 0x98;static unsigned char P2 @ 0xA0;static unsigned char IE @ 0xA8;static unsigned char IEN0 @ 0xA8;static unsigned char P3 @ 0xB0;static unsigned char IP @ 0xB8;static unsigned char IRCON @ 0xC0;static unsigned char T2CON @ 0xC8;static unsigned char ADCON @ 0xD8;static unsigned char P5 @ 0xF8;
DDEFINIESEFINIES PARAPARA OO 8051 8051 (8051.H)(8051.H)
21/10/2013
34
static SFR_BITS P0_BITS @ 0x80;static SFR_BITS TCON_BITS @ 0x88;static SFR_BITS P1_BITS @ 0x90;static SFR_BITS SCON_BITS @ 0x98;static SFR_BITS P2_BITS @ 0xA0;static SFR_BITS IE_BITS @ 0xA8;static SFR_BITS IEN0_BITS @ 0xA8;static SFR_BITS P3_BITS @ 0xB0;static SFR_BITS IP_BITS @ 0xB8;static SFR_BITS IRCON_BITS @ 0xC0;static SFR_BITS T2CON_BITS @ 0xC8;static SFR_BITS ADCON_BITS @ 0xD8;static SFR_BITS P5_BITS @ 0xF8;
static unsigned char SBUF @ 0x99;static unsigned char SP @ 0x81;static unsigned char PCON @ 0x87;static unsigned char TMOD @ 0x89;static unsigned char TH0 @ 0x8C;static unsigned char TH1 @ 0x8D;static unsigned char TL0 @ 0x8A;static unsigned char TL1 @ 0x8B;static unsigned char IP1 @ 0xB9;
DDEFINIESEFINIES PARAPARA OO 8051 8051 (8051.H)(8051.H)
static unsigned char CCEN @ 0xC1;static unsigned char CCL1 @ 0xC2;static unsigned char CCH1 @ 0xC3;static unsigned char CCL2 @ 0xC4;static unsigned char CCH2 @ 0xC5;static unsigned char CCL3 @ 0xC6;static unsigned char CCH3 @ 0xC7;static unsigned char CRCL @ 0xCA;static unsigned char RCAP2L @ 0xCA;static unsigned char RCAP2H @ 0xCB;static unsigned char CRCH @ 0xCB;static unsigned char TL2 @ 0xCC;static unsigned char TH2 @ 0xCD;static unsigned char ADDAT @ 0xD9;static unsigned char DAPR @ 0xDA;
static bit unsigned char TF1 @ 0x8F;static bit unsigned char TR1 @ 0x8E;static bit unsigned char TF0 @ 0x8D;static bit unsigned char TR0 @ 0x8C;static bit unsigned char IE1 @ 0x8B;static bit unsigned char IT1 @ 0x8A;static bit unsigned char IE0 @ 0x89;
DDEFINIESEFINIES PARAPARA OO 8051 8051 (8051.H)(8051.H)
21/10/2013
35
static bit unsigned char IT0 @ 0x88;static bit unsigned char SM0 @ 0x9F;static bit unsigned char SM1 @ 0x9E;static bit unsigned char SM2 @ 0x9D;static bit unsigned char REN @ 0x9C;static bit unsigned char TB8 @ 0x9B;static bit unsigned char RB8 @ 0x9A;static bit unsigned char TI @ 0x99;static bit unsigned char RI @ 0x98;static bit unsigned char EA @ 0xAF;static bit unsigned char ES @ 0xAC;static bit unsigned char ET1 @ 0xAB;static bit unsigned char EX1 @ 0xAA;static bit unsigned char ET0 @ 0xA9;static bit unsigned char EX0 @ 0xA8;static bit unsigned char RD @ 0xB7;static bit unsigned char WR @ 0xB6;static bit unsigned char T1 @ 0xB5;static bit unsigned char T0 @ 0xB4;static bit unsigned char INT1 @ 0xB3;static bit unsigned char INT0 @ 0xB2;static bit unsigned char TXD @ 0xB1;static bit unsigned char RXD @ 0xB0;
DDEFINIESEFINIES PARAPARA OO 8051 8051 (8051.H)(8051.H)
static bit unsigned char PS @ 0xBC;static bit unsigned char PT1 @ 0xBB;static bit unsigned char PX1 @ 0xBA;static bit unsigned char PT0 @ 0xB9;static bit unsigned char PX0 @ 0xB8;
/* Interrupt vectors */
#define RESET 0#define EXTI0 3#define TIMER0 11#define EXTI1 19#define TIMER1 27#define SINT 35#define TIMER2 43
DDEFINIESEFINIES PARAPARA OO 8051 8051 (8051.H)(8051.H)
21/10/2013
36
UUSOSO DEDE IINTERRUONTERRUO EMEM CC
InterrupoInterrupoUma rotina para tratamento de interrupo (ISR) definida atravs dos seguintes procedimentos:
1 Ajuste dos bits dos SFRs associados interrupo que se deseja usar (int_setupint_setup.h.h).
2 Definindo a handlerhandler ISR:ISR:[] interruptinterrupt handlerhandler ( [] ){
[disable();] /* bloqueia pedidos de novas interrupes */.
.
.
[enable();] /* habilita pedidos de novas interrupes */
[return();]}
3 Ajuste da ISRISR ao vetor de interrupo correspondente:
set_vecset_vec(vec,handlerhandler);
PPROGRAMAROGRAMA FFONTEONTE
/* Programa: EPD01.CFuncao: Controle de 4 LEDs acionados atravs da porta P1.0 a P1.3 do 8051Copyright: [email protected]
*/
static unsigned char P1 @0x90;
main(){
unsigned char x,y;
P1 = 0xff;
while(1){do{ /* Faz enquanto no houver tecla apertada */
x = P1; /* L porta P1 */y = x; /* Salva P1 em z */x >>= 4; /* Desloca y 4 casas para a direita */
}while(x==0x0f);
Exemplo de Programa Fonte: Exemplo de Programa Fonte: EPD01.CEPD01.C
21/10/2013
37
x |= 0xf0; /* Restaura os 4 bits mais significativos como entrada */P1 = x; /* Escreve o resultado na porta P1 */
do{ /* Faz enquanto a tecla nao for solta */x = P1;x >>=4;
}while(x != 0x0f); };
}
PPROGRAMAROGRAMA FFONTEONTE CONTINUAOCONTINUAO
Compilao e Montagem de Compilao e Montagem de EPC01.CEPC01.CComando DOS: .../AVOCET/AVC51/>AVC51 epc01.c AVC51 epc01.c >
PPROGRAMAROGRAMA FFONTEONTE CONTINUAOCONTINUAO
Exemplo de Programa Exemplo de Programa : : EPD02.CEPD02.C/* EPD02: Programa exemplo que calcula a soma de duas variveis e imprime na console!Data: 27/09/2013Copyright: [email protected]*/
#include #include #include
bit unsigned ustatus;char var1,var2;int var3;
void init_uart(){
TMOD = 0x20; /* timer 1 auto-reload mode */TL1 = -3;TH1 = -3; /* about 9600 baud at 10.695MHz */TR1 = 1; /* enable timer 1 */SCON = 0x52; /* mode 1, receiver enable */
21/10/2013
38
ustatus = 1;}
void putch(char c){
if(!ustatus)init_uart();
if(c == '\n') {while(!TI)
continue;TI = 0;SBUF = '\r';
}while(!TI)
continue;TI = 0;SBUF = c;
}
/*-----------------------------------------------------------------int kbhit(){
PPROGRAMAROGRAMA FFONTEONTE CONTINUAOCONTINUAO
if(!ustatus)init_uart();
return RI;}
char getch(){
if(!ustatus)init_uart();
while(!RI)continue;
RI = 0;if(SBUF == '\r' || SBUF == ('\r'|0x80))
return '\n';return SBUF & 0x7f;
}
char getche(){
char c;c = getch();putch(c);return(c);
PPROGRAMAROGRAMA FFONTEONTE CONTINUAOCONTINUAO
21/10/2013
39
}-----------------------------------------------------------------*/
main(){
var1 = 11;printf("Valor de var1 = %d\n",var1);var2 = -1;printf("Valor de var2 = %d\n",var2);
var3 = (int)(var1 + var2);var3 = var3 * 1000;printf("Valor de var3 = %d\n",var3);
while(1);}
PPROGRAMAROGRAMA FFONTEONTE CONTINUAOCONTINUAO
PPONTEIROSONTEIROS EMEM CC
PonteiroPonteiro
Quando declarada com ponteiro a varivel conter o endereo de uma outravarivel do mesmo tipo. (para obter o endereo de uma varivel usamos o operador &&)
Sintaxe:Sintaxe: *;
ExemplosExemplos::
unsigned char var1, var2;unsigned char myname[ ] = {Ivo RF!...}; /* o nome do vetor, myname, um ponteiro!... /unsigned char *ponteiro;
ponteiro = &&var1; /* ponteiro conter o endereo da varivel var1 */var2 = *ponteiro; /* varivel var2 conter o valor da varivel var1 */ponteiro = myname; /* ponteiro est apontando para myname */ponteiro +=9; /* ponteiro est apontando para a letra ! de myname */var1 = *ponteiro; /* var1 conter o cdigo ASCII do smbolo ! */
21/10/2013
40
EESTRUTURASTRUTURA EE UUNIONIO EMEM CC
EstruturaEstrutura
bastante comum a necessidade de se manipularem dados em conjunto, isto, grupos de variveis diferentes que mantm alguma relao em comum. Alinguagem C proporciona facilidades para o uso de variveis compostas, queso constituidas de diversas variveis de mesmo tipo ou de tipos diferentes. Aseguir segue um exemplo clssico:
Cadastro de Funcionrios:Cadastro de Funcionrios:Nome;Nome;Endereo;Endereo;Nome do Nome do ConjugeConjuge;;Nmero de Dependentes;Nmero de Dependentes;Cargo;Cargo;Salrio;Salrio;Data da Admisso.Data da Admisso.
EESTRUTURASTRUTURA EE UUNIONIO EMEM C C CONTINUAOCONTINUAO
Sintaxe:Sintaxe:struct funcionario{
char nome[30];char endereco[40];char telefone[8];int idade;char data_adm[10];
}analista;
Inicializao de uma estrutura:Inicializao de uma estrutura:struct funcionario analista;analista ={
Jadylson Bomfim,Rua das Flores, 514,2517693,50,07/02/60
}
Acesso idade:Acesso idade:var1 = analista.idade;
21/10/2013
41
EESTRUTURASTRUTURA EE UUNIONIO EMEM C C CONTINUAOCONTINUAO
UnionUnionH situaes em que uma alocao dinmica de memria se faz necessria,devido ao enorme espao de memria utilizado pelas variveis existentes. Fica,pois, flagrante a necessidade de se usarem ferramentas que permitam umaproveitamento mais econmico da memria disponvel, ou mesmo aplicaesnas quais se necessita de diferentes interpretaes para uma mesma rea dememria.
O tipo union bastante semelhante s estruturas, nas quais podemos tervariveis contendo valores de mais de um tipo.
Sintaxe:Sintaxe:
union lh_byte{
unsigned int int_16;struct two_byte{
unsigned char lbyte;unsigend char hbyte;
};};