Como o MCU impulsiona a tela LCD e considerações de design
Classificação e aplicação de microcomputador de chip único
De acordo com seu tipo de memória, o MCU pode ser dividido em dois tipos sem ROM no chip e com ROM no chip. Para chips sem ROM on-chip, eles devem ser conectados a uma EPROM externa (normalmente 8031); chips com ROM no chip são divididos em EPROM no chip (normalmente 87C51), ROM de máscara no chip MASK (normalmente 87C51) O chip é 8051), tipo Flash no chip (o chip típico é 89C51) e outros tipos.
De acordo com a finalidade, pode ser dividido em uso geral e propósito especial; de acordo com a largura do barramento de dados e o comprimento dos bytes de dados que podem ser processados ao mesmo tempo, ele pode ser dividido em MCUs de 8, 16 e 32 bits.
Atualmente, o mercado doméstico de aplicações MCU é o mais utilizado na área de eletrônicos de consumo, seguido pelo campo industrial e pelo mercado de eletrônicos automotivos. Os produtos eletrônicos de consumo incluem eletrodomésticos, televisores, consoles de jogos e sistemas de áudio e vídeo, entre outros. Os campos industriais incluem casa inteligente, automação, aplicações médicas e nova geração e distribuição de energia. O campo automotivo inclui trem de força automotivo e sistemas de controle de segurança, etc.
é especializada em P&D, produção e vendas de telas LCD e telas sensíveis ao toque de 1,14 a 10,1 polegadas, que podem ser personalizadas e fornecem suporte a monitores MCU, incluindo interface SPI, interface MCU, interface RGB, Interface MIPI, etc. Existem muitos tamanhos e modelos. Tela de toque resistiva e tela de toque capacitiva correspondentes também podem ser fornecidas.
A função básica do microcomputador de chip único
Para a maioria dos MCUs, as funções a seguir são as mais comuns e básicas. Para diferentes MCUs, a descrição pode ser diferente, mas eles são basicamente os mesmos em essência:
1. TImer (timer): Embora existam muitos tipos de TImer, eles podem ser classificados em duas categorias: uma é o TImer com intervalo de tempo fixo, ou seja, o tempo é definido pelo sistema e o programa do usuário não pode ser controlado. Apenas vários intervalos de tempo fixos são fornecidos para os programas do usuário escolherem, como 32 Hz, 16 Hz, 8 Hz, etc. Este tipo de temporizador é mais comum em MCUs de 4 bits, portanto pode ser usado para implementar funções relacionadas, como relógio e tempo .
O outro tipo é o Programmable Timer (temporizador programável). Como o nome sugere, o tempo de cronometragem deste tipo de temporizador pode ser controlado pelo programa do usuário. Os métodos de controle incluem: seleção da fonte do clock, seleção da divisão de frequência (pré-escala) e configuração do número pré-fabricado, etc. Alguns MCUs possuem todos os três ao mesmo tempo, enquanto outros podem ter um ou dois deles. Esse tipo de aplicativo Timer é muito flexível e o uso real também muda constantemente. Uma das aplicações mais comuns é usá-lo para realizar saída PWM.
Como a fonte do relógio pode ser selecionada livremente, tais temporizadores são geralmente combinados com contadores de eventos.
2. Portas IO: Qualquer MCU possui um certo número de portas IO. Sem portas IO, o MCU perderá o canal de comunicação com o mundo exterior. De acordo com a configuração da porta IO, ela pode ser dividida nos seguintes tipos:
Porta de entrada pura ou porta de saída pura: Este tipo de porta IO é determinado pelo design de hardware do MCU. Só pode ser entrada ou saída e não pode ser configurado por software em tempo real.
Portas IO de leitura e gravação direta: Por exemplo, as portas IO do MCS-51 pertencem a este tipo de portas IO. Ao executar a instrução de leitura da porta IO, é uma porta de entrada; ao executar uma instrução de porta IO de gravação, ela é automaticamente uma porta de saída.
Programação do programa para definir a direção de entrada e saída: a entrada ou saída deste tipo de porta IO é definida pelo programa de acordo com as necessidades reais, a aplicação é relativamente flexível e algumas aplicações em nível de barramento podem ser realizadas, como I2C barramento, vários LCDs, barramento de controle de drivers de LED, etc.
Para a utilização da porta IO, deve-se ter em mente um ponto importante: para a porta de entrada, deve haver um sinal de nível claro para garantir que não possa ser flutuante (isso pode ser conseguido adicionando um pull-up ou pull- resistor de descida); para a porta de saída, sua saída O nível de estado deve considerar sua conexão externa, e deve-se garantir que não haja fonte ou coletor de corrente no estado Standby ou estático.
3. Interrupção externa: A interrupção externa também é uma função básica da maioria dos MCUs. Geralmente é usado para acionamento de sinais em tempo real, amostragem de dados e detecção de status. Existem vários tipos de interrupções: gatilho de borda ascendente, gatilho de borda descendente e gatilho de nível. As interrupções externas são geralmente implementadas através de portas de entrada. Se for uma porta IO, a função de interrupção só será habilitada quando estiver configurada como entrada; se for uma porta de saída, a função de interrupção externa será automaticamente desligada (há algumas exceções na série ATiny do ATMEL, a porta de saída também pode acionar a função de interrupção). A aplicação da interrupção externa é a seguinte:
Detecção de sinais de disparo externos: um é baseado em requisitos em tempo real, como controle de retificadores controlados por silício, detecção de sinais de burst, etc., e o outro é a necessidade de economia de energia.
Medição da frequência do sinal: Para garantir que o sinal não seja perdido, uma interrupção externa é a escolha ideal.
Decodificação de dados: No campo das aplicações de controle remoto, para reduzir o custo do projeto, muitas vezes é necessário usar software para decodificar vários dados codificados, como a decodificação da codificação Manchester e PWM.
Detecção de chave e ativação do sistema: Para um MCU que entra no estado de suspensão, geralmente ele precisa ser ativado por meio de uma interrupção externa. A forma mais básica é uma chave, e a mudança de nível é gerada pela ação da chave.
4. Interface de comunicação: A interface de comunicação fornecida pelo MCU geralmente inclui interface SPI, UART, interface I2C, etc., que são descritas a seguir:
Interface SPI: Este tipo de interface é o método de comunicação mais básico fornecido pela maioria dos MCUs. Sua transmissão de dados é controlada por um relógio síncrono. Os sinais incluem: SDI (entrada de dados serial), SDO (saída de dados serial), SCLK (relógio serial) e sinal Ready; em alguns casos, pode não haver sinal de Pronto; esse tipo de interface pode funcionar em modo Master ou modo Slave, o ditado popular é ver quem fornece o sinal do relógio, quem fornece o relógio é o Master, e o oposto então é o Slaver.
UART (Universal Asynchronous Receive Transmit): É a interface de transmissão assíncrona mais básica. Suas linhas de sinal são apenas Rx e Tx. O formato básico de dados é: Bit inicial + Bit de dados (7 bits/8 bits) + Bit de paridade (par, ímpar ou nenhum) + Bit de parada (1 ~ 2 bits). O tempo gasto por um bit de dados é chamado de Baud Rate (taxa de transmissão).
Para a maioria dos MCUs, o comprimento dos bits de dados, o método de verificação de dados (verificação ímpar, verificação par ou nenhuma verificação), o comprimento do bit de parada (bit de parada) e a taxa de transmissão podem ser definidos de forma flexível por meio de programação. Certamente. A forma mais utilizada deste tipo de interface é comunicar-se com a porta serial do PC.
Interface I2C: I2C é um protocolo de transmissão de dados desenvolvido pela Philips, que também é implementado por dois sinais: SDAT (entrada e saída de dados seriais) e SCLK (relógio serial). Sua maior vantagem é que vários dispositivos podem ser conectados a esse barramento, que podem ser identificados e acessados por meio de endereços; um dos maiores benefícios do barramento I2C é que é muito conveniente usar software para realizá-lo através da porta IO, e sua taxa de transmissão de dados é totalmente controlada pelo SCLK Para controlar, pode ser rápido ou lento, ao contrário da interface UART , que possui requisitos rígidos de velocidade.
5. Watchdog (cronômetro de watchdog): Watchdog também é uma configuração básica da maioria dos MCUs (alguns MCUs de 4 bits podem não ter essa função), e a maioria dos Watchdogs de MCU só pode permitir que programas os redefinam e não podem redefini-los. Ele é fechado (alguns são definidos quando o programa é gravado, como o MCU da série Microchip PIC), e alguns MCUs determinam se devem ser abertos de uma maneira específica, como a série KS57 da Samsung, desde que o programa acesse o registro Watchdog , é ativado automaticamente e não pode ser desativado novamente. De modo geral, o tempo de reinicialização do watchdog pode ser definido por programa. A aplicação mais básica do Watchdog é fornecer uma capacidade de autorrecuperação para o MCU travar devido a falhas inesperadas.
Programação de microcontrolador
Há uma grande diferença entre a programação de programas MCU e a programação de programas de PC. Embora as ferramentas de desenvolvimento de MCU baseadas em C estejam se tornando cada vez mais populares, para um código de programa eficiente e um designer que gosta de usar assembly, a linguagem assembly ainda é a linguagem de programação mais concisa e eficiente.
Para a programação MCU, pode-se dizer que sua estrutura básica é aproximadamente a mesma, geralmente dividida em três partes: parte de inicialização (esta é a maior diferença entre a programação MCU e a programação PC), corpo do loop do programa principal e programa de processamento de interrupção, que são respectivamente explicado da seguinte forma:
1. Inicialização: Para o design de todos os programas MCU, a inicialização é a etapa mais básica e importante, geralmente incluindo o seguinte:
Mascare todas as interrupções e inicialize o ponteiro da pilha: A parte de inicialização geralmente não deseja que ocorram interrupções.
Limpe a área RAM do sistema e exiba a memória: Embora às vezes possa não ser totalmente necessário, do ponto de vista da confiabilidade e consistência, principalmente para evitar erros acidentais, é recomendável desenvolver bons hábitos de programação.
Inicialização da porta IO: De acordo com os requisitos da aplicação do projeto, defina o modo de entrada e saída da porta IO relevante. Para a porta de entrada, você precisa definir sua resistência de pull-up ou pull-down; para a porta de saída, você deve definir seu nível inicial de saída, para evitar erros desnecessários.
Configurações de interrupção: Para todas as fontes de interrupção que precisam ser utilizadas no projeto, elas devem ser habilitadas e as condições de disparo das interrupções devem ser definidas, enquanto para interrupções redundantes que não são utilizadas, devem ser desativadas.
Inicialização de outros módulos funcionais: Para todos os módulos funcionais periféricos do MCU que precisam ser utilizados, as configurações correspondentes devem ser feitas de acordo com os requisitos da aplicação do projeto, como comunicação UART, taxa de transmissão, comprimento de dados, método de verificação e parada O bit precisa ser definido O comprimento, etc., e para o Temporizador do Programador, você deve definir sua fonte de relógio, divisão de frequência e Recarregar Dados, etc.
Inicialização dos parâmetros: Após concluir a inicialização do hardware e recursos do MCU, o próximo passo é inicializar algumas variáveis e dados utilizados no programa. A inicialização desta parte precisa ser desenhada de acordo com o projeto específico e a disposição geral do programa. Para algumas aplicações que utilizam EEPROM para salvar dados pré-fabricados do projeto, é recomendado copiar os dados relevantes para a RAM do MCU durante a inicialização para melhorar a velocidade de acesso do programa aos dados e reduzir o consumo de energia do sistema (em princípio , o acesso à EEPROM externa aumentará o consumo de energia da fonte de alimentação).
2. O corpo do loop do programa principal: A maioria dos MCUs funciona continuamente por um longo tempo, portanto, o corpo do programa principal é basicamente projetado de maneira cíclica. Para aplicativos com vários modos de trabalho, pode haver vários corpos de loop que são convertidos entre si por meio do sinalizador de estado. Para o corpo principal do programa, os seguintes módulos são geralmente organizados:
Programa de cálculo: O programa de cálculo geralmente consome muito tempo, por isso se opõe firmemente a qualquer processamento de interrupção, especialmente operações de multiplicação e divisão.
Processamento de programas com baixos requisitos de tempo real ou sem requisitos de tempo real;
Programa de transmissão do display: principalmente para aplicações com LED externo e driver LCD.
3. Programa de processamento de interrupções: O programa de interrupção é usado principalmente para processar tarefas e eventos com altos requisitos em tempo real, como detecção de sinais repentinos externos, detecção e processamento de chaves, contagem de tempo, digitalização de display LED, etc.
Em geral, o programa de interrupção deve manter o código o mais conciso e curto possível. Para funções que não precisam ser processadas em tempo real, você pode definir o sinalizador de gatilho na interrupção e então o programa principal executará a transação específica – isso é muito importante. Especialmente para MCUs de baixa potência e baixa velocidade, é necessário garantir uma resposta oportuna a todas as interrupções.
4. Para organizar diferentes órgãos de tarefa, diferentes MCUs têm diferentes métodos de processamento:
Por exemplo, para aplicações MCU de baixa velocidade e baixo consumo de energia (Fosc=32768Hz), considerando que tais projetos são todos dispositivos portáteis e usam displays LCD comuns, a resposta aos botões e displays requer alto desempenho em tempo real, então geralmente interrupções temporizadas são usados para processar ações de botões e exibição de dados; e para MCUs de alta velocidade, como aplicações Fosc> 1MHz, como o MCU tem tempo suficiente para executar o corpo do loop do programa principal neste momento, ele só pode ser interrompido no correspondente Definir vários sinalizadores de gatilho e colocar todas as tarefas no corpo principal do programa para executar.
5. No desenho da programação do MCU, mais um ponto que precisa de atenção especial é:
Para evitar o acesso ou configuração simultânea da mesma variável ou dado na interrupção e no corpo do programa principal. Um método preventivo eficaz é organizar o processamento de tais dados em um módulo e determinar se deve executar a operação relevante dos dados, julgando o sinalizador de gatilho; enquanto em outros corpos do programa (principalmente interrupções), os dados que precisam ser processados O local de processamento apenas define o sinalizador acionado. - Isso garante que a execução dos dados seja previsível e única.
Habilidades de desenvolvimento de microcontroladores
1. Como reduzir bugs no programa
Para saber como reduzir bugs do programa, você deve primeiro considerar os seguintes parâmetros de gerenciamento acima da faixa que devem ser considerados durante a operação do sistema.
Parâmetros físicos: Esses parâmetros são principalmente os parâmetros de entrada do sistema, incluindo parâmetros de excitação, parâmetros operacionais durante a aquisição e processamento e parâmetros de resultado no final do processamento.
Parâmetros de recursos: Esses parâmetros são principalmente os recursos de circuitos, dispositivos e unidades funcionais do sistema, como capacidade de memória, comprimento da unidade de armazenamento e profundidade de empilhamento.
Parâmetros de aplicação: Esses parâmetros de aplicação geralmente representam as condições de aplicação de alguns microcomputadores e unidades funcionais de chip único. Parâmetros do processo: Refere-se aos parâmetros que mudam de maneira ordenada durante a operação do sistema.
2. Como melhorar a eficiência do código de programação em linguagem C
É uma tendência inevitável no desenvolvimento e aplicação de microcomputadores de chip único usar a linguagem C para projetar o programa de microcomputador de chip único. Se você deseja obter a maior eficiência ao programar em C, é melhor estar familiarizado com o compilador C que está usando. Primeiro teste o número de linhas de instrução em linguagem assembly correspondente a cada linguagem C compilada, para que você possa saber claramente a eficiência. Ao programar no futuro, use a instrução com maior eficiência de compilação. Cada compilador C terá certas diferenças, portanto a eficiência da compilação também será diferente. O comprimento do código e o tempo de execução de um excelente compilador C de sistema embarcado são apenas 5-20% maiores do que o mesmo nível de função escrito em linguagem assembly.
Para projetos complexos com tempo de desenvolvimento curto, a linguagem C pode ser usada, mas a premissa é que você esteja muito familiarizado com a linguagem C e o compilador C do sistema MCU e preste atenção especial aos tipos de dados e algoritmos que o sistema compilador C pode apoiar. Embora a linguagem C seja a linguagem de alto nível mais comum, os sistemas de compilação da linguagem C de diferentes fabricantes de MCU são diferentes, especialmente na operação de alguns módulos de funções especiais. Portanto, se você não entender esses recursos, haverá muitos problemas na depuração, o que levará a uma eficiência de execução menor do que a linguagem assembly.
3. Como resolver o problema anti-interferência do microcomputador de chip único A maneira mais eficaz de evitar interferência é remover a fonte de interferência e cortar o caminho de interferência, mas muitas vezes é difícil fazer isso, então depende apenas de se a capacidade anti-interferência do microcomputador de chip único é forte o suficiente. Ao melhorar a capacidade anti-bloqueio do sistema de hardware, o software anti-bloqueio é caracterizado por seu design flexível,