



Estude fácil! Tem muito documento disponível na Docsity
Ganhe pontos ajudando outros esrudantes ou compre um plano Premium
Prepare-se para as provas
Estude fácil! Tem muito documento disponível na Docsity
Prepare-se para as provas com trabalhos de outros alunos como você, aqui na Docsity
Encontra documentos específicos para os exames da tua universidade
Prepare-se com as videoaulas e exercícios resolvidos criados a partir da grade da sua Universidade
Responda perguntas de provas passadas e avalie sua preparação.
Ganhe pontos para baixar
Ganhe pontos ajudando outros esrudantes ou compre um plano Premium
Pata entender o funcionamento do microcontrolador
Tipologia: Notas de aula
1 / 5
Esta página não é visível na pré-visualização
Não perca as partes importantes!




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
;chama a sub-rotina de atraso
;chama a sub-rotina de atraso
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: