Programação C Para Microcontroladores (Total)

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;

    };};