Mudanças entre as edições de "Microcontroladores"
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.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)