Neste projeto, vamos projetar um despertador simples usando temporizadores ATMEGA32. O microcontrolador ATmega32A tem um cronômetro de 16 bits, e usaremos esse cronômetro para contar os segundos e desenvolver um relógio digital.
Todos os relógios digitais têm um cristal dentro deles que é o coração do relógio. Este cristal não está apenas presente no relógio, mas em todos os sistemas computacionais de tempo real. Este cristal gera pulsos de relógio, que são necessários para cálculos de temporização. Embora existam algumas outras maneiras de obter pulsos de relógio, mas para maior precisão e frequência mais alta, a maioria prefere relógio baseado em cristal. Vamos conectar um cristal ao ATMEGA32 para obter um relógio preciso.
Componentes necessários
Hardware: microcontrolador ATmega32, cristal de 11,0592 MHz, capacitor 22pF (2 peças), fonte de alimentação (5v), AVR-ISP PROGRAMMER, JHD_162ALCD (LCD 16x2), capacitor 100uF (conectado à fonte de alimentação), botões (quatro peças), resistor 10KΩ (seis peças), capacitor 100nF (quatro peças), interruptores de três pinos (2 peças), transistor 2N2222, campainha, resistor 200Ω.
Software: Atmel studio 6.1, progisp ou flash magic.
Diagrama de circuito e explicação de trabalho
Para um tempo preciso, conectamos um cristal de 11,0592 MHz para o relógio. Agora, para desabilitar o relógio interno do ATMEGA, temos que alterar seus LOW FUSE BITS. Lembre-se de que não estamos tocando nos bits do fusível alto, então a comunicação JTAG ainda estaria habilitada.
Para dizer ao ATMEGA para desabilitar o relógio interno e funcionar no externo, precisamos definir:
BYTE DE BAIXO USO = 0xFF ou 0b11111111.
No circuito, o PORTB do ATMEGA32 está conectado à porta de dados LCD. Aqui, deve-se lembrar de desabilitar a comunicação JTAG em PORTC de ATMEGA alterando os bytes de fusível alto, caso se queira usar o PORTC como porta de comunicação normal. No LCD 16x2 existem 16 pinos ao todo, se houver uma luz negra, se não houver luz de fundo, haverá 14 pinos. Pode-se ligar ou deixar os pinos da luz de fundo. Agora, nos 14 pinos, há 8 pinos de dados (7-14 ou D0-D7), 2 pinos de fonte de alimentação (1 e 2 ou VSS e VDD ou gnd e + 5v), 3º pino para controle de contraste (VEE-controla a espessura dos caracteres mostrado), e 3 pinos de controle (RS & RW & E)
No circuito, você pode observar que tirei apenas dois pinos de controle. Isso dá a flexibilidade de melhor compreensão, o bit de contraste e READ / WRITE não são usados com frequência, então eles podem ser colocados em curto com o aterramento. Isso coloca o LCD em maior contraste e modo de leitura. Precisamos apenas controlar os pinos ENABLE e RS para enviar caracteres e dados de acordo.
As conexões que são feitas para LCD são fornecidas abaixo:
PIN1 ou VSS para aterrar
PIN2 ou VDD ou VCC para alimentação de + 5v
PIN3 ou VEE para aterrar (oferece contraste máximo, melhor para um iniciante)
PIN4 ou RS (seleção de registro) para PD6 de uC
PIN5 ou RW (leitura / gravação) para aterrar (coloca o LCD no modo de leitura facilita a comunicação para o usuário)
PIN6 ou E (habilitar) para PD5 de uC
PIN7 ou D0 a PB0 de uC
PIN8 ou D1 a PB1 de uC
PIN9 ou D2 a PB2 de uC
PIN10 ou D3 a PB3 de uC
PIN11 ou D4 a PB4 de uC
PIN12 ou D5 a PB5 de uC
PIN13 ou D6 a PB6 de uC
PIN14 ou D7 a PB7 de uC
No circuito você pode ver que usamos comunicação de 8 bits (D0-D7) porém não é obrigatória, podemos usar comunicação de 4 bits (D4-D7) mas com 4 bits o programa de comunicação torna-se um pouco complexo. Como mostrado na tabela acima, estamos conectando 10 pinos do LCD ao controlador, em que 8 pinos são pinos de dados e 2 pinos para controle.
A chave um é para habilitar o recurso de ajuste entre alarme e hora. Se o pino estiver baixo, podemos ajustar a hora do alarme pressionando os botões. Se seus botões altos são para ajustar apenas TIME. Existem QUATRO botões presentes aqui, o primeiro é para incrementar MINUTOS no alarme ou hora. O segundo é para diminuir MINUTOS no alarme ou na hora. O terceiro é para incrementar HORA no alarme ou hora. QUARTO é para diminuir HORAS no alarme ou hora.
Os capacitores presentes aqui são para anular o efeito de salto dos botões. Se forem removidos, o controlador poderá contar mais de um cada vez que o botão for pressionado. Os resistores conectados por pinos são para limitar a corrente, quando o botão é pressionado para puxar o pino para o solo.
Sempre que um botão é pressionado, o pino correspondente do controlador é puxado para baixo e, assim, o controlador reconhece que determinado botão foi pressionado e a ação correspondente foi executada.
Em primeiro lugar, o clock que escolhemos aqui é 11059200 Hz, dividindo-o por 1024 dá 10800. Portanto, para cada segundo temos 10800 pulsos. Portanto, vamos iniciar um contador com 1024 prescaler para obter o relógio do contador como 10800 Hz. Em segundo lugar, vamos usar o modo CTC (Clear Timer Counter) do ATMEGA. Haverá um registrador de 16 bits onde podemos armazenar um valor (valor de comparação), quando o contador conta até o valor de comparação que uma interrupção está configurada para gerar.
Vamos definir o valor de comparação para 10800, portanto, basicamente, teremos um ISR (rotina de serviço de interrupção em cada comparação) para cada segundo. Então, vamos usar essa rotina oportuna para obter o relógio de que precisávamos.
BROWN (WGM10-WGM13): Esses bits são para selecionar o modo de operação do temporizador.
Agora, como queremos o modo CTC com valor de comparação no byte OCR1A, só temos que definir WGM12 para um, os restantes são deixados como são zero por padrão.
VERMELHO (CS10, CS11, CS12): Esses três bits são para escolher o pré-escalar e assim obter o contador de relógio apropriado.
Visto que queremos um 1024 como pré-escala, temos que definir CS12 e CS10.
Agora existe um outro registro que devemos considerar:
VERDE (OCIE1A): Este bit deve ser definido para obter uma interrupção na correspondência de comparação entre o valor do contador e o valor OCR1A (10800) que definimos.
O valor OCR1A (valor de comparação do contador), é escrito no registro acima.
Explicação de programação
O funcionamento do despertador é explicado passo a passo no código abaixo:
#include // cabeçalho para habilitar o controle de fluxo de dados sobre os pinos #define F_CPU 1000000 // informando a frequência de cristal do controlador anexado #include