This shows you the differences between two versions of the page.
| Both sides previous revisionPrevious revision | |||
| pt:examples:digi:led [2015/12/09 16:31] – artica | pt:examples:digi:led [2020/07/20 12:00] (current) – external edit 127.0.0.1 | ||
|---|---|---|---|
| Line 1: | Line 1: | ||
| + | < | ||
| + | ====== LED ====== | ||
| + | // | ||
| + | [HW][[en: | ||
| + | [ELC][[en: | ||
| + | [AVR][[en: | ||
| + | [LIB][[en: | ||
| + | |||
| + | ===== Teoria ===== | ||
| + | |||
| + | [{{ : | ||
| + | |||
| + | Um diodo de emissão de luz é um semicondutor que emite luz quando a tensão é aplicada. A sigla para diodo emissor de luz é LED (light-emitting diode). Existem diferentes combinações de cores de diodos, os díodos também podem emitir luz branca. Como um diodo normal, o LED tem dois contatos - ânodo e cátodo. Em desenhos do ânodo é marcado como " | ||
| + | |||
| + | [{{ : | ||
| + | |||
| + | Quando a tensão é aplicada, o ânodo de um LED está ligado à tensão positiva e o cátodo à tensão negativa. A tensão do LED depende da cor do diodo emissor de luz: comprimento de onda maior (vermelho) ~ 2 V, comprimento de onda menor (azul) ~ 3 V. Normalmente, | ||
| + | |||
| + | Se os LEDs são usados especialmente para iluminar, é aconselhável usar circuitos eletrônicos especiais que regulem a corrente e voltagem adequada para LEDs. No entanto LEDs são muitas vezes utilizados como indicadores e são alimentados directamente a partir dos pinos do microcontrolador. Uma vez que a tensão de alimentação dos microcontroladores é geralmente mais elevada do que a tensão dos LEDs, deve haver uma resistência ligada em série com o LED, o que limita a corrente e cria a necessária queda de tensão. Instruções para calcular a resistência apropriada podem ser encontradas no capítulo eletrônica. | ||
| + | |||
| + | Os LEDs são produzidos numa variedade de embalagens. LEDs com pés mais comuns têm 3 mm ou 5 mm de diâmetro e dois longos pinos conectores de metal. O pino mais longo é o ânodo, o mais curto é o cátodo. OS LEDs montados em superficie (SMD - Surface Mounted Device) têm um símbolo em forma de T na parte inferior para indicar a polaridade, em que a cobertura do T significa a localização do ânodo e o pólo marca o cátodo. | ||
| + | |||
| + | [{{ : | ||
| + | |||
| + | ===== Prática HomeLab ===== | ||
| + | |||
| + | O módulo de controle do controlador HomeLab tem um único indicador LED, cujo ânodo está ligado através de uma resistência a uma fonte de alimentação e o cátodo está ligado ao pino do controlador. A fim de ligar e desligar este LED, o pino do LED deve ser definido como saída e configurado como baixo ou alto em conformidade. O que significa que se o pino está configurado como alto, o LED está desligado e se o pino é configurado como baixo, o LED está ligado. Basicamente, | ||
| + | |||
| + | Todos os exemplos práticos para o kit HomeLab, piscar de LED incluído, usam a biblioteca de pinos do HomeLab. A biblioteca de pinos inclui o tipo de dados //pino//, que contém os endereços dos registos relacionados com pino e a máscara de bits do pino. Se for criada uma variável do tipo pino no programa e inicializa-la usando a macro função PIN, o pino pode ser usado livremente ao longo do programa inteiro com esta variável (PIN) sem usar os registradores. | ||
| + | Aqui estão 2 exemplos de programas, que estão fazendo exatamente a mesma coisa, mas um foi criado com base na biblioteca de HomeLab, o outro não. A depuração LED, led_debug na biblioteca HomeLab, tem sido descrito como PB7 (HomeLab I e II) e PQ2 (HomeLab III). O LED de depuração está fisicamente localizado no módulo do controlador. | ||
| + | |||
| + | <code c> | ||
| + | // HomeLab Controller module LED test program, which | ||
| + | // is based on HomeLab library | ||
| + | #include < | ||
| + | |||
| + | // LED pin configuration. | ||
| + | pin led_debug = PIN(Q,2); | ||
| + | |||
| + | // Main program | ||
| + | int main(void) | ||
| + | { | ||
| + | // Configuring LED pin as an output | ||
| + | pin_setup_output(led_debug); | ||
| + | |||
| + | // Lighting up LED | ||
| + | pin_clear(led_debug); | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | <code c> | ||
| + | // HomeLab II Controller module LED test program, which | ||
| + | // accesses | ||
| + | #include < | ||
| + | |||
| + | // Main program | ||
| + | int main(void) | ||
| + | { | ||
| + | // Configuring LED pin as an output | ||
| + | DDRB |= (1 << 7); | ||
| + | |||
| + | // Lighting up LED | ||
| + | PORTB &= ~(1 << 7); | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | O primeiro exemplo utiliza a biblioteca de pinos (ficheiro //pin.h//). Primeiro, uma variável do tipo pino chamada // | ||
| + | |||
| + | Qual a diferença entre a utilização da biblioteca e dos registros? A diferença está no conforto - a biblioteca é mais fácil, porque não é necessário saber os nomes dos registos e os seus efeitos. O benefício mais importante da biblioteca é a adaptabilidade. Usando registros, é necessário alterar nomes e máscaras de bits dos registros ao longo do programa inteiro, a fim de alterar pinos. Ao usar a biblioteca, só necessita ser feito no início do programa, onde o pino variável é inicializado. Usando registros tem uma vantagem enganadora - o uso de pino é direto e não é feito através da memória do programa ou funções que consomem tempo. No entanto, versões mais recentes do compilador AVR-CCG são tão inteligentes que transformam funções de biblioteca para exatamente os mesmos comandos diretos para a manipulação de registros como ela teria sido feito diretamente no programa. Deve ser dito que os compiladores podem otimizar o código apenas quando se trata de variáveis únicas constantes, não voláteis que mudam durante a execução ou com matrizes. | ||
| + | |||
| + | O próximo código do programa é parcialmente biblioteca operacional de pinos. O seu objectivo é explicar os procedimentos com variáveis de pinos. Pode não ser compreensível para os iniciados por usar apontadores de linguagem C que não são abordados neste livro, mas uma grande quantidade de materiais sobre ponteiros podem ser encontrados em livros ou na internet. | ||
| + | |||
| + | <code c> | ||
| + | // Defining the Pins inside the pin struct | ||
| + | // pin name = PIN(PORT LETTER, PIN NUMBER IN PORT); | ||
| + | pin led_green = PIN(H,5); | ||
| + | |||
| + | // Configuring pin as output | ||
| + | inline void pin_setup_output(pin pin){ | ||
| + | bitmask_set(*pin.ddr, | ||
| + | } | ||
| + | |||
| + | // Setting pin high | ||
| + | inline void pin_set(pin pin){ | ||
| + | bitmask_set(*pin.port, | ||
| + | } | ||
| + | |||
| + | // Setting pin low | ||
| + | inline void pin_clear(pin pin){ | ||
| + | bitmask_clear(*pin.port, | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | Além do módulo do controlador, | ||
| + | Além dos comandos //pin_set// e // | ||
| + | |||
| + | ^Nome da constante^Nome alternativo^Pino HomeLab I & II^Pino HomeLab III^Descrição^ | ||
| + | |led_debug|LED0|PB7|PQ2| LED azul no módulo do controlador| | ||
| + | |led_green|LED1|PC3|PH5| LED verde| | ||
| + | |led_yellow|LED2|PC4|PH4| LED amarelo| | ||
| + | |led_red|LED3|PC5|PH3| LED vermelho| | ||
| + | |||
| + | Um programa exemplo baseado na biblioteca HomeLab: | ||
| + | |||
| + | <code c> | ||
| + | |||
| + | // LED test program for HomeLab User interface module | ||
| + | #include < | ||
| + | |||
| + | // Main program | ||
| + | int main(void) | ||
| + | { | ||
| + | // Configuring LED pins as an output | ||
| + | pin_setup_output(led_red); | ||
| + | pin_setup_output(led_yellow); | ||
| + | pin_setup_output(led_green); | ||
| + | |||
| + | // Lighting up red and green LED | ||
| + | led_on(led_red); | ||
| + | led_on(led_green); | ||
| + | // Turn off yellow LED | ||
| + | led_off(led_yellow); | ||
| + | } | ||
| + | </ | ||