Docsity
Docsity

Prepare-se para as provas
Prepare-se para as provas

Estude fácil! Tem muito documento disponível na Docsity


Ganhe pontos para baixar
Ganhe pontos para baixar

Ganhe pontos ajudando outros esrudantes ou compre um plano Premium


Guias e Dicas
Guias e Dicas


Microcontrolador ATMEGA328P, Notas de aula de Microcontroladores

Pata entender o funcionamento do microcontrolador

Tipologia: Notas de aula

2020

Compartilhado em 20/09/2020

claudia-oliveira-74
claudia-oliveira-74 🇧🇷

1 documento

1 / 5

Toggle sidebar

Esta página não é visível na pré-visualização

Não perca as partes importantes!

bg1
Microcontroladores
AULA 04
Prof. Rodrigo Rech
Aula 04: Criando sub-rotinas de atraso
Sub-rotinas são comuns em linguagens de programação para evitar trechos de códigos repetitivos,
economizando, dessa forma, memória de programa.
Uma sub-rotina fica armazenada na memória de programa e, sempre que é chamada, é necessário
que o programa armazene o endereço da linha atual, dessa forma, quando a sub-rotina é finalizada o
programa retorna para o ponto de onde parou. Esta tarefa de armazenar o endereço de retorno é feito por meio
da Pilha ou, Stack. A figura 1 ilustra o funcionamento da chamada de uma sub-rotina, apresentando os
momentos em que os endereços são armazenados e recuperados da pilha.
Início
Instrução 1 ;
Instrução 2 ;
...
Instrução n.. .
Sub-
rotina 1
FIM do Pro grama
Sub-rotina 1
Instrução 1 ;
Instrução 2 ;
...
Instrução n.. .
Sub-
rotina 2
FIM Sub 1
Sub-rotina 2
Instrução 1 ;
Instrução 2 ;
...
Fim Sub 2
Armazena ende reço
na Pilha (1)
Armazena ende reço
na Pilha (2)
Recupera en dereço
na pilha (1)
Recupera en dereço
na pilha (2)
Figura 1: Funcionamento da chamada de sub-rotina
No AVR, a pilha é armazenada nos últimos endereços da memória RAM e trabalha de forma
decrescente, que também pode ser chamada de FILO (First In, Last Out). Isto indica que, a cada sub-rotina
que é chamada, o endereço da pilha é decrementado (Quadro 1).
Endereço da RAM
Dado da pilha
0x8FF
Dado 1 (Sub 1)
Último endereço da memória RAM
0x8FD
Dado 2 (Sub 2)
0x8FB
Dado 3 (Sub 3)
Último dado da pilha
0x8F9
...
Topo da pilha (Endereço armazenado no Stack-
Pointer)
Quadro 1: Funcionamento do Stack-Pointer
pf3
pf4
pf5

Pré-visualização parcial do texto

Baixe Microcontrolador ATMEGA328P e outras Notas de aula em PDF para Microcontroladores, somente na Docsity!

Microcontroladores

AULA 04

Prof. Rodrigo Rech

Aula 0 4 : Criando sub-rotinas de atraso Sub-rotinas são comuns em linguagens de programação para evitar trechos de códigos repetitivos, economizando, dessa forma, memória de programa. Uma sub-rotina fica armazenada na memória de programa e, sempre que é chamada, é necessário que o programa armazene o endereço da linha atual, dessa forma, quando a sub-rotina é finalizada o programa retorna para o ponto de onde parou. Esta tarefa de armazenar o endereço de retorno é feito por meio da Pilha ou, Stack. A figura 1 ilustra o funcionamento da chamada de uma sub-rotina, apresentando os momentos em que os endereços são armazenados e recuperados da pilha. Início Instrução 1; Instrução 2; ... Instrução n... Sub- rotina 1 FIM do Programa Sub-rotina 1 Instrução 1; Instrução 2; ... Instrução n... Sub- rotina 2 FIM Sub 1 Sub-rotina 2 Instrução 1; Instrução 2; ... Fim Sub 2 Armazena endereço na Pilha (1) Armazena endereço na Pilha (2) Recupera endereço na pilha (1) Recupera endereço na pilha (2) Figura 1: Funcionamento da chamada de sub-rotina No AVR, a pilha é armazenada nos últimos endereços da memória RAM e trabalha de forma decrescente, que também pode ser chamada de FILO (First In, Last Out). Isto indica que, a cada sub-rotina que é chamada, o endereço da pilha é decrementado (Quadro 1). Endereço da RAM Dado da pilha 0x8FF Dado 1 (Sub 1) Último endereço da memória RAM 0x8FD Dado 2 (Sub 2) 0x8FB Dado 3 (Sub 3) Último dado da pilha 0x8F 9 ... Topo da pilha (Endereço armazenado no Stack- Pointer) Quadro 1: Funcionamento do Stack-Pointer

Para indicar os endereços da pilha existe o registrador “SP”, que mantém sempre o último valor de endereço que foi alocado na pilha. Como os endereços da memória RAM podem ter até 16 bits (dependendo da versão do microcontrolador), o registrador SP é separado em dois registradores de 8 bits (SPL e SPH). Figura 2 : Registrador SP Programa com sub-rotina de atraso Rotina Principal Início Define o PORTD como saída Liga o LED PD Atraso Desliga o LED PD Atraso

.ORG 0X

INICIO:

;DEFINE TODOS OS PINOS DO PORTB COMO SAÍDAS

LDI R16 , 0XFF

OUT DDRD , R

LOOP:

CBI PORTD , PD 5 ;coloca o pino PB5 em 0V

;chama a sub-rotina de atraso

RCALL ATRASO

SBI PORTD , PD 5 ;coloca o pino PB5 em 5V

;chama a sub-rotina de atraso

RCALL ATRASO

RJMP LOOP ;vai para LOOP

a instrução “DEC” simplesmente decrementa o registrador de uso geral indicado como operando, caso ele comece com o valor 0, ao ser decrementado assume o maior valor possível para um registrador de 8 bits, ou seja, 255. A instrução “BRNE” realiza um salto para o label especificado caso o resultado da operação da linha anterior seja diferente de ZERO, ou seja, enquanto o registrador não tenha sido totalmente decrementado, a rotina volta a ser executada do label “VOLTA”. A partir do momento que o registrador é totalmente decrementado, a instrução seguinte é executada. A instrução “RET” deve ser utilizada para finalizar a sub-rotina. É ela que recupera o endereço do Program Counter que havia sido armazenado na pilha. Para fins didáticos, podemos calcular o tempo total gasto com a seguinte equação: 𝑡𝑒𝑚𝑝𝑜 = 𝐶𝑀 ∗ [( 255 ∗ 255 ∗ 𝑅 19 ) ∗ 3 ] Utilizando a rotina de atraso para fazer um Debounce: O ruído elétrico gerado ao se acionar uma chave mecânica é chamado de bounce. Por ser de origem mecânica este ruído possui uma duração de alguns milissegundos, causando problemas para leitura de um botão por um processador que executa suas instruções na ordem de microssegundos ou até nanossegundos. A figura 3 ilustra o efeito prático do bounce. Figura 3 : Efeito prático do bounce Fonte: AVR e Arduino – Técnicas de Projetos pág. 116 Existem diversas técnicas para se reduzir este ruído, tanto por hardware (com o uso de resistores e capacitores) quanto por software. A técnica de debounce por software, além de mais econômica, também apresenta um melhor resultado, visto que o tempo pode ser ajustado de acordo com as características do botão utilizado. A técnica consiste de realizar o teste do botão em duas etapas, caso pressionado e solto, inserindo uma pequena temporização entre os dois efeitos. O fluxograma apresentado na figura 4 mostra a sequência que deve ser seguida para inverter o estado de um LED sempre que o botão é pressionado e solto.

Início Configura PORTD como Saída Configura PORTC como entrada Ativa os pull-ups do PORTC LOOP Botão PC2 foi pressionado? Não Atraso (10ms) Botão PC2 foi solto? Sim Não Sim Inverte o estado de PD Figura 4 : Fluxograma de debounce .ORG 0X INICIO: ;DEFINE TODOS OS PINOS DO PORTB COMO SAÍDAS LDI R16 , 0XFF OUT DDRD , R ;DEFINE TODOS OS PINOS DO PORTC COMO ENTRADAS LDI R16 , 0X OUT DDRC , R ;ATIVA OS PULL-UPS DO PORTC LDI R16 , 0XFF OUT PORTC , R LOOP: ;TESTA O BOTÃO PC1 E PULA SE 0 SBIC PINC , PC 2 RJMP LOOP RJMP BT_PRESS BT_PRESS: ;CHAMA A SUB-ROTINA DE ATRASO RCALL ATRASO ;TESTA O BOTÃO PC1 E PULA SE 1 SBIS PINC , PC 2 RJMP BT_PRESS RJMP BT_SOLTO BT_SOLTO: ;INVERTE O ESTADO DO PINO PB SBI PIND , PD 5 RJMP LOOP ATRASO: DEC R17 ;decrementa R ;enquanto R17 > 0 fica decrementando R BRNE ATRASO DEC R18 ;decrementa R ;enquanto R18 >0 volta a decrementar R BRNE ATRASO RET ;retorna da sub-rotina Exercícios:

  1. Modifique a rotina de atraso do primeiro exemplo para que ela passe a durar aproximadamente 2 segundos.
  2. Utilizando como base o programa do debounce, insira outro botão para fazer o acionamento de outro LED;
  3. Desenvolva um contador binário de 0 a F que será incrementado por um botão e apresentado nos LEDs da placa.
  4. Implemente no programa anterior um botão para decrementar o valor.