Índice:
- Etapa 1: vamos começar imediatamente
- Etapa 2: Melhorar o código - adicionar uma função
- Etapa 3: adicionar um atraso de loop ocupado
- Etapa 4: Padrão de Chamada de Procedimento de Arquitetura ARM (AAPCS)
- Etapa 5: Função com parâmetro - Funções aninhadas
- Etapa 6: entrada GPIO - adicionar switches
Vídeo: PARTE 2 - CONJUNTO DO BRAÇO GPIO - RGB - CHAMADAS DE FUNÇÃO - Chaves: 6 etapas
2024 Autor: John Day | [email protected]. Última modificação: 2024-01-30 11:38
Na Parte 1, aprendemos como alternar um único LED vermelho na placa de desenvolvimento MSP432 LaunchPad da Texas Instruments, usando assembly em vez de C / C ++.
Neste Instructable, faremos algo semelhante - controlar um LED RGB que também está nessa mesma placa.
Ao longo do caminho, esperamos aprofundar nosso conhecimento sobre a montagem ARM, e não apenas nos divertirmos acendendo alguns LEDs.
Etapa 1: vamos começar imediatamente
Realmente, o primeiro vídeo diz tudo. Não há muito mais a acrescentar.
O ponto principal disso é deixar claro que cada porta de E / S no MSP432 consiste em um bloco de endereços de "registro", que por sua vez consistem em vários bits cada.
Além disso, os bits são agrupados de maneira ortogonal. Ou seja, o bit 0 de cada endereço de registro refere-se ao mesmo pino de E / S externo.
Repetimos a ideia de que são necessários vários endereços de registro para essa porta, para fazer algo mesmo com apenas um bit ou pino.
Mas neste caso, como estamos lidando com um LED RGB, precisamos lidar com três bits para cada endereço de registro.
Reforçamos que precisamos de vários registradores: o registrador DIR, o registrador SEL0, o registrador SEL1 e o registrador OUTPUT. E três bits de cada vez.
Etapa 2: Melhorar o código - adicionar uma função
Como você viu na etapa anterior, o loop principal do programa tinha muitos códigos repetidos, ou seja, quando desligamos os LEDs.
Portanto, podemos adicionar uma função ao programa. Ainda temos que chamar essa função toda vez que quisermos desligar os LEDs, mas ela faz com que parte do código se reduza a uma única instrução.
Se nosso código LED-off estivesse mais envolvido com muitas outras instruções, isso teria sido uma verdadeira economia de memória.
Parte da programação incorporada e dos microcontroladores está sendo muito mais consciente do tamanho do programa.
O vídeo explica.
Essencialmente, adicionamos uma instrução de ramificação ao nosso código principal e temos outro bloco de código que é a função para a qual estamos ramificando. E então, quando terminarmos, ou no final da função, voltaremos para a próxima instrução dentro do programa principal.
Etapa 3: adicionar um atraso de loop ocupado
Na seção Declarações do código, adicione uma constante para facilitar a verificação do tempo desejado:
; qualquer palavra após um ponto e vírgula (';') inicia um comentário.
; o código nesta parte atribui um nome a um valor.; você também poderia ter usado '.equ', mas eles são ligeiramente diferentes.; '.equ' (eu acho) não pode ser alterado, enquanto '.set' significa que você pode; altere o valor de 'DLYCNT' posteriormente no código, se desejar.; 'DLYCNT' será usado como o valor de contagem regressiva na sub-rotina de atraso. DLYCNT.set 0x30000
Adicione uma nova função de atraso:
atraso:.asmfunc; o início da sub-rotina ou função 'atraso'.
MOV R5, #DLYCNT; carregue o registro R5 da CPU do núcleo com o valor atribuído a 'DLYCNT'. dlyloop; isso marca o início do loop de atraso. assembler determina o endereço. SUB R5, # 0x1; subtraia 1 do valor atual no registro de CPU principal R5. CMP R5, # 0x0; compare o valor atual em R5 com 0. BGT dlyloop; ramificar se o valor em R5 for maior que 0, para rotular (endereço) 'dlyloop'. BX LR; se chegarmos a aqui, significa que o valor de R5 foi 0. retorno da sub-rotina..endasmfunc; marca o fim da sub-rotina.
Em seguida, no corpo principal, dentro do loop principal, invoque ou chame essa função de atraso:
; este é um fragmento de código, do corpo principal ou da função principal (consulte o arquivo 'main.asm').
; este é um loop em 'principal' e mostra como chamamos ou usamos essa nova função de 'atraso'.; o '#REDON' e '#GRNON' também são declarações (constantes) (veja o topo de 'main.asm').; eles são apenas uma maneira fácil de definir a cor especificada do LED RGB. loop MOV R0, #REDON; Vermelho - defina o registro R0 da CPU principal com o valor atribuído a 'REDON'. STRB R0, [R4]; o registrador de núcleo R4 foi previamente configurado com um endereço de saída GPIO.; escreva o que está em R0, no endereço especificado por R4. Atraso BL; desvio para a nova função 'atraso'. BL ledsoff; desvia para a função 'ledsoff' pré-existente. Atraso BL; idem MOV R0, #GRNON; Verde - idem STRB R0, [R4]; e assim por diante. Atraso BL BL ledsoff Atraso BL
O vídeo entra em detalhes.
Etapa 4: Padrão de Chamada de Procedimento de Arquitetura ARM (AAPCS)
Provavelmente é uma boa hora para apresentar algo. É uma convenção de linguagem assembly. Também conhecido como o Padrão de Chamada de Procedimento para a Arquitetura ARM.
Há muito nisso, mas é apenas um padrão. Isso não nos impede de aprender programação em assembly, e podemos adotar partes desse padrão à medida que avançamos, uma vez que nos sentimos confortáveis com alguns conceitos que estamos aprendendo.
Caso contrário, podemos sentir que estamos bebendo de uma enorme mangueira de água. Muita informação.
Registros principais
Como nos familiarizamos com os principais registradores do MSP432, vamos tentar adotar agora alguns desses padrões. Estaremos em conformidade com isso quando escrevermos a próxima função (ligar / desligar um LED).
1) Devemos usar R0 como um parâmetro de função. Se quisermos passar um valor para a função (sub-rotina), devemos usar R0 para fazer isso.
2) Devemos usar o Link Register para o propósito a que se destina - ele contém o endereço que indica para onde retornar depois que a sub-rotina for concluída.
Você verá como os aplicamos.
Etapa 5: Função com parâmetro - Funções aninhadas
Podemos limpar nosso código e reduzir a quantidade de memória que ele ocupa, combinando seções repetidas em uma única função. A única diferença no corpo do loop principal é que precisamos de um parâmetro para que possamos passar as várias cores diferentes que queremos ver do LED RGB.
Dê uma olhada no vídeo para detalhes. (desculpe pelo comprimento)
Etapa 6: entrada GPIO - adicionar switches
Vamos torná-lo mais interessante. É hora de adicionar algum controle de switch ao nosso programa de montagem.
Este Instructable tem imagens que mostram como as duas chaves on-board estão conectadas ao MSP432.
Essencialmente: Switch 1 (SW1 ou S1) está conectado a P1.1, e Switch 2 (SW2 ou S2) está conectado a P1.4.
Isso torna as coisas um pouco interessantes não apenas porque estamos lidando com entradas em vez de saídas, mas também porque essas duas chaves ocupam ou ocupam dois bits do mesmo bloco de endereço de registro que o único LED vermelho que é uma saída.
Lidamos com a alternância do único LED vermelho neste Instructable, portanto, só precisamos adicionar o código para lidar com as opções.
Bloco de endereço de registro da porta 1
Lembre-se de que cobrimos isso no Instructable anterior, mas temos que incluir um novo:
- Endereço de registro de entrada da porta 1 = 0x40004C00
- Endereço de registro de saída da porta 1 = 0x40004C02
- Endereço de registro de direção da porta 1 = 0x40004C04
- Endereço de registro de ativação do resistor da porta 1 = 0x40004C06
- Porta 1 Selecione 0 Endereço de registro = 0x40004C0A
- Porta 1 Selecione 1 Endereço de registro = 0x40004C0C
Ao usar as portas como entradas, é recomendável usar os resistores pull-up ou pull-down internos do MSP432.
Uma vez que a placa de desenvolvimento do Launchpad conectou os dois interruptores ao aterramento (BAIXO quando pressionado), isso significa que devemos usar resistores pull UP para ter certeza de que temos um HIGH sólido quando eles não estão pressionados.
Resistores de puxar para cima / para baixo
São necessários dois endereços de registro de porta 1 diferentes para ligar essas entradas de switch a resistores pull-up.
1) Use o registro de ativação do resistor da porta 1 (0x40004C06) apenas para indicar que você deseja resistores (para esses dois bits), 2) e, em seguida, use o registro de saída da porta 1 (0x40004C02) para definir os resistores como pull-up ou pull-down. Pode parecer confuso estarmos usando um registro de saída nas entradas. O registro de saída tem quase um duplo propósito.
Assim, para reafirmar de outra forma, o registro de saída pode enviar um ALTO ou BAIXO para uma saída (como o único LED vermelho) e / ou é usado para definir resistores pull-up ou pull-down para entradas, MAS SOMENTE se esse recurso tiver sido habilitado por meio do registro de Habilitação do Resistor.
Importante no acima - ao enviar / definir um LOW ou HIGH para qualquer bit de saída, você precisará manter o estado pull-up / pull-down dos bits de entrada simultaneamente.
(o vídeo tenta explicar)
Lendo um bit de entrada de porta
- Defina o SEL0 / SEL1 para a funcionalidade GPIO
- Defina o registro DIR como entrada para os bits de switch, mas como saída para o LED (simultaneamente no mesmo byte)
- Habilitar resistores
- Defina-os como resistores pull-up
- Leia a porta
- Você pode desejar filtrar o valor lido para isolar apenas os bits de que você precisa (switch 1 e 2)
Recomendado:
Braço robótico com módulos Zio Parte 3: 4 etapas
Braço robótico com módulos Zio Parte 3: Esta postagem do blog é parte da série Zio Robotics. Introdução Em nosso blog anterior, postamos o tutorial das Partes 1 e 2 sobre como controlar um braço robótico usando módulos Zio. A Parte 1 concentrou-se principalmente no controle automático da garra do braço robótico para
Braço robótico com módulos Zio Parte 2: 11 etapas
Braço robótico com módulos Zio Parte 2: No tutorial de hoje, vamos utilizar todos os 4 servos e um controlador sem fio PS2 para controlar o braço robótico. Esta postagem do blog faz parte da Série Zio Robotics. Introdução Em nosso blog anterior, postamos a Parte 1 tutorial sobre como controlar um Robotic Ar
Controle um braço robótico com módulos Zio Parte 1: 8 etapas
Controle um braço robótico com módulos Zio Parte 1: Esta postagem do blog é parte da série Zio Robotics. Introdução Neste tutorial, construiremos um projeto onde usaremos módulos Zio para controlar o braço robótico. Este projeto irá ensiná-lo a fazer com que sua garra de braço robótico abra e feche. Este n
COMO MONTAR UM BRAÇO DE ROBÔ DE MADEIRA IMPRESSIONANTE (PARTE 3: BRAÇO DE ROBÔ) - COM BASE NO MICRO: BITN: 8 Passos
COMO MONTAR UM BRAÇO DE ROBÔ DE MADEIRA IMPRESSIONANTE (PARTE 3: BRAÇO DE ROBÔ) - COM BASE NO MICRO: BITN: O próximo processo de instalação é baseado na conclusão do modo de evitar obstáculos. O processo de instalação na seção anterior é igual ao processo de instalação no modo de rastreamento de linha. Então, vamos dar uma olhada na forma final de A
COMO MONTAR UM BRAÇO DE ROBÔ DE MADEIRA IMPRESSIONANTE (PARTE 2: ROBÔ PARA Evitar Obstáculos) - COM BASE NO MICRO: BIT: 3 etapas
COMO MONTAR UM ARM DE ROBÔ DE MADEIRA IMPRESSIONANTE (PARTE 2: ROBÔ PARA Evitar Obstáculos) - COM BASE NO MICRO: BIT: Anteriormente, introduzimos o Armbit no modo de rastreamento de linha. A seguir, apresentamos como instalar o Armbit evitando o modo de obstáculo