Índice:

PARTE 2 - CONJUNTO DO BRAÇO GPIO - RGB - CHAMADAS DE FUNÇÃO - Chaves: 6 etapas
PARTE 2 - CONJUNTO DO BRAÇO GPIO - RGB - CHAMADAS DE FUNÇÃO - Chaves: 6 etapas

Vídeo: PARTE 2 - CONJUNTO DO BRAÇO GPIO - RGB - CHAMADAS DE FUNÇÃO - Chaves: 6 etapas

Vídeo: PARTE 2 - CONJUNTO DO BRAÇO GPIO - RGB - CHAMADAS DE FUNÇÃO - Chaves: 6 etapas
Vídeo: Como emendar fita de LED #shorts #diy #lifehacks #curiosidades 2024, Novembro
Anonim
PARTE 2 - CONJUNTO DO BRAÇO GPIO - RGB - CHAMADAS DE FUNÇÃO - Chaves
PARTE 2 - CONJUNTO DO BRAÇO GPIO - RGB - CHAMADAS DE FUNÇÃO - Chaves

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

Image
Image

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: