Mudanças entre as edições de "Microcontroladores"

De MediaWiki do Campus São José
Ir para navegação Ir para pesquisar
Linha 82: Linha 82:
  
 
       jmp loop
 
       jmp loop
 +
 +
</syntaxhighlight>
 +
 +
Pilhas - Exercício 1
 +
Neste exercício observei as intruções push(insere item no início da pilha) e pop(remove intem do início da pilha)
 +
<code>
 +
loop:
 +
mov A,#65H
 +
mov B,#87H
 +
push ACC
 +
push B
 +
mov A,#00H
 +
mov B,#00H
 +
pop B
 +
pop ACC
 +
sjmp loop
 +
END
 +
</syntaxhighlight>
 +
 +
Pilhas - Exercício 2
 +
Neste Exercício observei o contador de programa(PC) e o apontador de pilha(Stack Pointer)
 +
<code>
 +
ORG 000h
 +
main: ljmp ponto1
 +
ORG 1E5H
 +
 +
ponto1:
 +
mov R0,#55H
 +
mov R1,#5
 +
acall setar_mem
 +
mov R0,#77H
 +
mov R1,#10
 +
acall setar_mem
 +
loop: sjmp loop
 +
 +
ORG 315h
 +
 +
setar_mem:
 +
mov @R0,#0FFh
 +
inc R0
 +
djnz R1,setar_mem
 +
ret
 +
END
 +
</syntaxhighlight>
 +
 +
Contador de um dígito com interrupção
 +
<code>
 +
PORT EQU P1
 +
org 0000h
 +
jmp main
 +
org 001Bh
 +
jmp INT_TIMER1
 +
 +
org 0100h ; entry address for main
 +
main:
 +
          mov R1,#09h
 +
          mov A,R1
 +
          mov DPTR,#num
 +
          mov TMOD, #00010000b ; timer 1 em modo 1
 +
          mov TH1, #0FEh
 +
          mov TL1, #0FDh
 +
          mov IE, #10001000b ; habilita interrupcao
 +
          setb TR1
 +
 +
loop: ljmp loop
 +
 +
INT_TIMER1:
 +
          clr TR1 ; para o timer
 +
          mov TH1, #0FEh ; recarrega valores no timer
 +
          mov TL1, #0FFh
 +
          LCALL envia_num ; aciona uma saida
 +
          setb TR1 ; religa o timer
 +
          reti
 +
 +
 +
envia_num:
 +
mov A,R1
 +
movc A,@A+DPTR
 +
mov PORT,A
 +
mov A,R1
 +
JZ reset
 +
dec R1
 +
ret
 +
 +
reset:
 +
        mov R1,#09h
 +
        ret
 +
 +
org 0200h
 +
num: DB 021h, 01h, 0F1h, 05h, 25h, 33h, 61h, 49h, 0F3h, 81h
 +
END
 +
</syntaxhighlight>
 +
 +
Contador de um dígito com delay por software
 +
 +
<code>
 +
 +
 +
loop:
 +
mov P1,#81h
 +
lcall delay_1ms
 +
mov P1,#0F3h
 +
lcall delay_1ms
 +
mov P1,#49h
 +
lcall delay_1ms
 +
mov P1,#61h
 +
lcall delay_1ms
 +
mov P1,#33h
 +
lcall delay_1ms
 +
mov P1,#25h
 +
lcall delay_1ms
 +
mov P1,#05h
 +
lcall delay_1ms
 +
mov P1,#0F1h
 +
lcall delay_1ms
 +
mov P1,#01h
 +
lcall delay_1ms
 +
mov P1,#21h
 +
lcall delay_1ms
 +
ljmp loop
 +
delay_1ms:
 +
push 7
 +
mov R7,#50
 +
loop1:
 +
nop ; 1 ciclo de maquina
 +
nop ; 1 ciclo de maquina
 +
djnz R7,loop1 ; 2 ciclo de maquina
 +
fim_delay_1ms:
 +
nop
 +
nop
 +
nop
 +
pop 7
 +
ret
  
 
</syntaxhighlight>
 
</syntaxhighlight>

Edição das 08h40min de 3 de junho de 2013

Bibliografia sobre Microcontroladores

http://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&ved=0CC0QFjAA&url=http%3A%2F%2Flegacy.afonsomiguel.com%2FGraduacao%2FMPI%2F8051%2Ftut8051_lima.doc&ei=yah5UeqBKIj00gGc0oGoAQ&usg=AFQjCNFjjus7muNRVJSAl1K-skadJnJxHQ&sig2=TlWqezc05h6dnihwwDwfOQ&bvm=bv.45645796,d.dmQ

http://www.ebah.com.br/content/ABAAAA8T8AK/microcontrolador-8051

Implementações em Assembly no MIC 8051

Zerando área de memória de 50h até 7Fh

mov A,50h
loop: 
    mov R0,A
    mov @R0,#00
    inc A
    cjne R0,7Fh,loop
    loop2:
          jmp loop2


Contador em display LED, apenas um dígito e sem utilizar o ponto

Faltam os temporizadores ainda não entendi como funcionam, estou trabalhando nisso
Portas e bits correspondentes a cada LED.
A=P0.1
B=P1.2
C=P2.2
D=P3.2
E=P3.1
F=P2.1
G=P1.1

loop:
     setb P1.1
     CLR P2.1
     CLR P3.1
     CLR P0.1
     CLR P1.2
     CLR P2.2
     CLR P3.2
     setb P0.1
     setb P2.1
     setb P3.1
     setb P3.2
     setb P2.2
     CLR P0.1
     CLR P1.1
     CLR P3.1
     CLR P3.2
     setb P3.1
     CLR P2.2
     setb P0.1
     setb P3.2
     CLR P2.1
     setb P1.2
     CLR P0.1
     CLR P3.2
     CLR P3.1 
     setb P1.1
     setb P2.1
     setb P3.1
     setb P3.2
     CLR P1.2
     CLR P1.1
     CLR P2.1
     CLR P3.1
     CLR P3.2
     setb P3.1
     jmp loop

</syntaxhighlight>

Pilhas - Exercício 1

Neste exercício observei as intruções push(insere item no início da pilha) e pop(remove intem do início da pilha)

loop: mov A,#65H mov B,#87H push ACC push B mov A,#00H mov B,#00H pop B pop ACC sjmp loop END </syntaxhighlight>

Pilhas - Exercício 2

Neste Exercício observei o contador de programa(PC) e o apontador de pilha(Stack Pointer)

ORG 000h main: ljmp ponto1 ORG 1E5H

ponto1: mov R0,#55H mov R1,#5 acall setar_mem mov R0,#77H mov R1,#10 acall setar_mem loop: sjmp loop

ORG 315h

setar_mem: mov @R0,#0FFh inc R0 djnz R1,setar_mem ret END </syntaxhighlight>

Contador de um dígito com interrupção PORT EQU P1 org 0000h jmp main org 001Bh jmp INT_TIMER1

org 0100h ; entry address for main main:

         mov R1,#09h
         mov A,R1
         mov DPTR,#num
         mov TMOD, #00010000b ; timer 1 em modo 1
         mov TH1, #0FEh 
         mov TL1, #0FDh 
         mov IE, #10001000b ; habilita interrupcao
         setb TR1

loop: ljmp loop

INT_TIMER1:

         clr TR1 ; para o timer
         mov TH1, #0FEh ; recarrega valores no timer
         mov TL1, #0FFh
         LCALL envia_num ; aciona uma saida
         setb TR1 ; religa o timer
         reti


envia_num: mov A,R1 movc A,@A+DPTR mov PORT,A mov A,R1 JZ reset dec R1 ret

reset:

       mov R1,#09h
       ret

org 0200h num: DB 021h, 01h, 0F1h, 05h, 25h, 33h, 61h, 49h, 0F3h, 81h END </syntaxhighlight>

Contador de um dígito com delay por software


loop: mov P1,#81h lcall delay_1ms mov P1,#0F3h lcall delay_1ms mov P1,#49h lcall delay_1ms mov P1,#61h lcall delay_1ms mov P1,#33h lcall delay_1ms mov P1,#25h lcall delay_1ms mov P1,#05h lcall delay_1ms mov P1,#0F1h lcall delay_1ms mov P1,#01h lcall delay_1ms mov P1,#21h lcall delay_1ms ljmp loop delay_1ms: push 7 mov R7,#50 loop1: nop ; 1 ciclo de maquina nop ; 1 ciclo de maquina djnz R7,loop1 ; 2 ciclo de maquina fim_delay_1ms: nop nop nop pop 7 ret

</syntaxhighlight>

Tarefas da semana 13/05/2013

  • Temporizador por software
  • Estudar pilha
  • Temporizador por hardware (sem interrupção)
  • Temporizador por hardware (com interrupção)