ENCICLOPÉDIA DE RÁDIO ELETRÔNICA E ENGENHARIA ELÉTRICA Programação modular de sistemas de controle no MCS48. Enciclopédia de rádio eletrônica e engenharia elétrica Enciclopédia de eletrônica de rádio e engenharia elétrica / Microcontroladores Sabe-se que o mesmo microcontrolador pode controlar equipamentos tecnológicos complexos e um moedor de café doméstico ou relógio eletrônico. A adaptação a um objeto específico é realizada alterando o programa do microcontrolador, o hardware quase não é afetado. O artigo proposto é dedicado a técnicas de programação para microcontroladores da série MCS48, que são amplamente utilizados em sistemas de controle para diversas finalidades. Suas principais disposições também são válidas para dispositivos mais modernos. O desenvolvimento e a modernização de programas de controle são muito facilitados se forem construídos de acordo com um princípio modular. Nesse caso, depois de ganhar alguma experiência e, principalmente, nossa própria biblioteca de módulos depurados, programar um novo sistema de controle (CS) se resume a substituir alguns módulos de um programa já existente e depurado e, possivelmente, complementá-lo com fragmentos que levem em consideração as especificidades de um determinado sistema. Este princípio está embutido na estrutura de muitas linguagens de alto nível (PASCAL, C++), e o programador é literalmente forçado a segui-lo. Infelizmente, os ASSEMBLERS (inclusive para MSS48), embora dêem ao programador maior liberdade de escolha de meios e métodos para resolver problemas, via de regra, não monitoram a observância da disciplina de programação. Isso geralmente leva à criação de programas tão confusos que nem mesmo seus autores conseguem descobrir o que foi feito depois de algum tempo, sem falar no uso de fragmentos depurados em outros programas. A adesão consciente aos conceitos modulares comuns facilita e acelera muito a programação de microcontroladores. Um exemplo de um programa modular típico para CS é dado na tabela. Sua sintaxe corresponde ao ASSEMBLY tabular TASM para o microprocessador 8048. Como você pode ver, no início do texto do programa, as diretivas EQU dão nomes às constantes e atribuem valores. Usar constantes nomeadas é sempre preferível a especificar valores numéricos diretamente nas instruções executáveis do processador. Por exemplo, o atraso de tempo implementado por uma das sub-rotinas discutidas abaixo é definido por três números. Eles são dados pelas constantes N1, N2 e N3. Se você precisar alterar a velocidade do obturador, basta especificar novos valores nos operadores EQU. Caso contrário, seria necessário procurar em todo o programa instruções com operandos iguais a esses números, decidir se cada um deles se refere a um atraso de tempo e indicar novos valores nos casos necessários. Obviamente, esse trabalho requer muito tempo e muitas vezes não ocorre sem erros. É especialmente complicado pelo fato de que alguns comandos podem não usar o número inteiro, mas, por exemplo, seu byte alto ou baixo. O ASSEMBER já na fase de tradução do programa é capaz de calcular algumas constantes com base nos valores de outras. Esta possibilidade é ilustrada pelo cálculo dos bytes alto (N3N) e baixo (N3L) do número NXNUMX. Em seguida, o programa aloca memória para variáveis. Eles fazem isso com as mesmas diretivas EQU, mas ao contrário das descrições das constantes, eles especificam não os valores numéricos das variáveis, mas os endereços das células de memória que ocupam. Se o MONTADOR permitir, a possibilidade de utilização de macros não deve ser negligenciada. Cada uma delas é, por assim dizer, uma nova instrução que executa uma operação não fornecida diretamente pelo sistema de instrução do processador. Descrevendo uma instrução de macro, o programador dá a ela um nome (que, obviamente, não coincide com o nome de nenhuma das instruções "reais") e especifica as ações necessárias na forma de uma Sequência de instruções de máquina. Cada vez que encontra uma instrução de macro em um programa, o ASSEMBLER irá substituí-la pela sequência especificada. Neste exemplo, duas macros são usadas. Um deles transfere o conteúdo do acumulador para a célula de memória de dados especificada pelo parâmetro macro e o outro - de volta. Depois que a energia é ligada (ou um sinal de reset é dado), o microcontrolador começa a executar o programa a partir do endereço zero. Este endereço é geralmente usado para escrever um comando de salto incondicional para o ponto inicial do programa real (neste caso, o rótulo START). Isso é necessário porque as interrupções de hardware sempre transferem o controle para endereços fixos 3 e 7 (para outros tipos de microcontroladores, os endereços podem ser diferentes, mas ainda estão localizados no início da memória de programa). Os comandos de transição incondicional para as rotinas de serviço das interrupções correspondentes localizadas nestes endereços devem ser "desviados" pelo programa principal. O próximo passo é definir os modos de operação do controlador (por exemplo, selecionar bancos de memória e registradores), inicializar variáveis e dispositivos externos. Um erro típico de programadores novatos é assumir que, imediatamente após iniciar o programa, as variáveis já possuem alguns valores definidos. Esse equívoco é reforçado pelo fato de que algumas linguagens de alto nível (como BASIC) definem automaticamente todas as variáveis para um valor inicial de zero. Em programas em linguagem assembly (e em muitas outras linguagens), o próprio programador deve cuidar para que, antes da primeira leitura do valor de uma variável, algo já tenha sido escrito na célula de memória a ela alocada. Um bom estilo de programação exige que os valores iniciais sejam atribuídos às variáveis logo no início do programa. Neste caso, isto é feito pela sub-rotina 1INIT. A seção de inicialização do dispositivo externo geralmente se parece com uma chamada alternativa para sub-rotinas, cada uma das quais redefine uma delas (conversor analógico-digital, indicador LED, teclado, etc.) e pode ser facilmente substituída ao finalizar e melhorar o sistema. Frequentemente, essas mesmas rotinas verificam a integridade dos dispositivos. Em seguida, a maioria dos programas de controle entra em um loop principal de repetição infinita, cuja execução é suspensa apenas para lidar com interrupções. O ciclo consiste em subprogramas para pesquisar o teclado e outros sensores, verificar os sinalizadores definidos pelas sub-rotinas de processamento de interrupção (por exemplo, o sinalizador para a expiração de um intervalo de tempo especificado ou o final do conversor analógico-digital), processar as informações recebidas de acordo com o algoritmo de controle especificado, emitir ações de controle para atuadores, enviar informações sobre o estado do processo tecnológico para uma tela de cristal líquido ou outros indicadores. A saída do loop principal geralmente é fornecida apenas em situações de emergência, por exemplo, se para eliminar as conseqüências de uma falha for necessário repetir a inicialização de todas as variáveis e dispositivos externos, bem como no processamento de interrupções. Assim, um programa construído de forma modular é um conjunto de sub-rotinas. Se, por exemplo, for utilizado um teclado diferente no novo sistema de controle, será suficiente substituir a sub-rotina BUTT. Para que tal substituição seja simples e indolor, certas regras devem ser desenvolvidas e sempre observadas. As sub-rotinas, se possível, devem salvar o conteúdo de todos os registradores do controlador, receber dados iniciais e emitir resultados nos mesmos registradores e células de memória, utilizar a mesma codificação de caracteres, etc. É necessário lutar contra o desejo natural (especialmente para programadores que superaram as primeiras dificuldades e começam a se sentir profissionais) de simplificar o programa, afastando-se de regras rígidas e usando técnicas não padronizadas. Aparentemente, à primeira vista, a complicação injustificada será totalmente recompensada, facilitando a depuração e o retrabalho do programa como um todo. Vamos considerar algumas características das sub-rotinas. I NCREM e DESREM realizam o necessário em muitos casos, a operação de aumentar ou diminuir um determinado valor de um número binário de 16 bits (seus bytes altos e baixos estão, respectivamente, nos registradores R6 e R5). As constantes que especificam a quantidade de incremento são descritas no início do programa. Como qualquer microcontrolador funciona muito mais rápido que o equipamento tecnológico, é muito importante poder organizar o atraso no programa. Nesse caso, o contador/temporizador interno do processador é usado. Tem capacidade limitada e estoura em milissegundos. Cada estouro gera uma solicitação de interrupção. A rotina de serviço de interrupção do timer (TIME) os conta e, quando o número especificado é alcançado, define o sinalizador de tempo limite FLT para um. Todas as sub-rotinas cujo trabalho depende do tempo, resta analisar o estado deste sinalizador. Portanto, é possível realizar velocidades do obturador de vários segundos e até minutos. Para iniciar a contagem de um novo intervalo, é necessário inserir os valores iniciais nas células de trabalho da sub-rotina TIME e ligar o timer. A sub-rotina SET2M, por exemplo, define o atraso de tempo para 2 minutos. O cálculo dos valores iniciais tem várias sutilezas. Sabe-se que nos microcontroladores da série MSS48, os pulsos chegam à entrada do contador/temporizador interno com uma frequência 480 vezes menor que a frequência do oscilador de quartzo. Por exemplo, com uma frequência de ressonador de quartzo de 7 MHz, o número gravado no contador muda a cada 480/7000000 = 0,00006857 s = 68,57 µs. Portanto, o contador transbordará (e gerará uma solicitação de interrupção) em 68,57 -(256-N1) µs, onde N1 é o número originalmente gravado no contador. Se cada vez que você iniciar uma nova contagem a partir desse número, então N0,1 = 2 0,1/[7000000 (1480-N256)] estouros ocorrerão em 1 s (atraso de tempo mínimo). Obviamente, o mesmo atraso de tempo pode ser obtido com N1 e N2 diferentes, mas como esses números não podem ser fracionários, será implementado com algum erro. A tarefa é selecionar um par de valores para o qual o erro é mínimo. No caso em questão, a melhor opção é N1 = 13, N2 = 6. Obtém-se uma temporização de 2 min repetindo o procedimento descrito N3 = 1200 vezes. Freqüentemente, é necessário usar diferentes procedimentos para processar as mesmas interrupções de hardware em diferentes modos de operação do programa. Uma maneira de fazer isso é ilustrada pela sub-rotina INTER. Analisa o código do tipo de interrupção inserido pelo programa principal na célula INTT e, dependendo do seu valor, chama uma das rotinas de serviço de interrupção ISR1 ou ISR2. Observe que ambos terminam com RET, não RETR. É fácil aumentar o número de opções de processamento e até fazer com que, para um determinado valor do código, várias sub-rotinas diferentes sejam chamadas uma após a outra. Não é necessário escrever todas as sub-rotinas necessárias no arquivo de texto do programa principal. Os módulos depurados e usados repetidamente em diferentes programas podem ser localizados em arquivos separados e conectados ao programa principal usando as diretivas INCLUDE. Cada arquivo de inclusão pode conter uma ou mais rotinas. A desvantagem deste método é que os nomes das variáveis, constantes e rótulos em todos os módulos usados não devem ser repetidos. Privado desse defeito, o método de tradução separada de módulos com sua subsequente fusão no nível do código do objeto, infelizmente, não é suportado pelo TASM ASSEMBLY. Autor: D. Ryzhov, Vladimir Veja outros artigos seção Microcontroladores. Leia e escreva útil comentários sobre este artigo. Últimas notícias de ciência e tecnologia, nova eletrônica: Máquina para desbastar flores em jardins
02.05.2024 Microscópio infravermelho avançado
02.05.2024 Armadilha de ar para insetos
01.05.2024
Outras notícias interessantes: ▪ Lâmpada Inteligente Conectada Lâmpada LED Cree ▪ Velocímetro esportivo de radar da TI ▪ Laser líquido que não evapora no ar Feed de notícias de ciência e tecnologia, nova eletrônica
Materiais interessantes da Biblioteca Técnica Gratuita: ▪ seção do site Firmware. Seleção de artigos ▪ artigo Cozimento lateral. expressão popular ▪ artigo Que planta Linnaeus nomeou após o órgão genital feminino? Resposta detalhada ▪ Avaliador de artigos (perito em avaliação de imóveis). Descrição do trabalho ▪ artigo Controle de tom ativo de cinco bandas. Enciclopédia de rádio eletrônica e engenharia elétrica
Deixe seu comentário neste artigo: Todos os idiomas desta página Página principal | Biblioteca | Artigos | Mapa do Site | Revisões do site www.diagrama.com.ua |