#include <avr/io.h>
#include <avr/interrupt.h>
Go to the source code of this file.
|
| #define | led1_pin PD2 |
| | Pino do primeiro Led.
|
| |
| #define | led2_pin PD4 |
| | Pino do segundo Led.
|
| |
| #define | led3_pin PB2 |
| | Pino do terceiro Led.
|
| |
| #define | laser_pin PD3 |
| | Pino do laser.
|
| |
| #define | sensor_pin PC0 |
| | Pino do sensor LDR.
|
| |
| #define | motor_esquerdo PD5 |
| | Pino do sinal PWM do motor esquerdo.
|
| |
| #define | motor_direito PD6 |
| | Pino do sinal PWM do motor direito.
|
| |
| #define | esquerdo_frente PB0 |
| | Pino da direção do motor esquerdo para frente.
|
| |
| #define | esquerdo_traz PD7 |
| | Pino da direção do motor esquerdo para traz.
|
| |
| #define | direito_frente PB4 |
| | Pino da direção do motor direito para frente.
|
| |
| #define | direito_traz PB3 |
| | Pino da direção do motor direito para traz.
|
| |
| #define | botao_reset PB5 |
| | Pino do botão de reset.
|
| |
| #define | F_CPU 16000000 |
| | Macro referente a frequência do Microcontrolador utilizado.
|
| |
| #define | BAUD 9600 |
| | Macro referente a velocidade de comunicação que se deseja utilizar no USART.
|
| |
|
| volatile uint16_t | total_ovf0 |
| | Variável para contar a quantidade de estouros do TIMER0. Valores possíveis: (0-65535)
|
| |
| volatile uint16_t | total_ovf1 |
| | Variável para contar a quantidade de estouros do TIMER1. Valores possíveis: (0-65535)
|
| |
| volatile uint16_t | total_ovf2 |
| | Variável para contar a quantidade de estouros do TIMER2. Valores possíveis: (0-65535)
|
| |
| volatile bool | estado_laser = true |
| | Variável para controlar o estado do laser. Valores possíveis: (true | false)
|
| |
| volatile int | quantidade_vidas = 3 |
| | Variável para contabilizar a quantidade de vidas atuais do carro. Valores possíveis: (0-3)
|
| |
| volatile bool | jogo_acabou = false |
| | Variável para controlar se o jogo ainda está em andamento ou foi finalizado. Valores possíveis: (true | false)
|
| |
| volatile bool | atingido = false |
| | Variável para controlar se o sensor LDR foi atingido por um laser. Valores possíveis: (true | false)
|
| |
| volatile bool | motor_ativado = true |
| | Variável para controlar o estado do motor. Valores possíveis: (true | false)
|
| |
| volatile char | letra_recebida |
| | Variável que armazena a letra recebida pelo USART. Valores possíveis: ('l', 'r', 'u', 'd', 's')
|
| |
| volatile bool | dado_recebido = false |
| | Variável que controla se o dado foi recebido ou não. Valores possíveis: (true | false)
|
| |
◆ BAUD
Macro referente a velocidade de comunicação que se deseja utilizar no USART.
Definition at line 31 of file main.c.
◆ botao_reset
Pino do botão de reset.
Definition at line 27 of file main.c.
◆ direito_frente
| #define direito_frente PB4 |
Pino da direção do motor direito para frente.
Definition at line 23 of file main.c.
◆ direito_traz
Pino da direção do motor direito para traz.
Definition at line 25 of file main.c.
◆ esquerdo_frente
| #define esquerdo_frente PB0 |
Pino da direção do motor esquerdo para frente.
Definition at line 19 of file main.c.
◆ esquerdo_traz
| #define esquerdo_traz PD7 |
Pino da direção do motor esquerdo para traz.
Definition at line 21 of file main.c.
◆ F_CPU
Macro referente a frequência do Microcontrolador utilizado.
Definition at line 29 of file main.c.
◆ laser_pin
Pino do laser.
Definition at line 11 of file main.c.
◆ led1_pin
Pino do primeiro Led.
Definition at line 5 of file main.c.
◆ led2_pin
Pino do segundo Led.
Definition at line 7 of file main.c.
◆ led3_pin
Pino do terceiro Led.
Definition at line 9 of file main.c.
◆ motor_direito
| #define motor_direito PD6 |
Pino do sinal PWM do motor direito.
Definition at line 17 of file main.c.
◆ motor_esquerdo
| #define motor_esquerdo PD5 |
Pino do sinal PWM do motor esquerdo.
Definition at line 15 of file main.c.
◆ sensor_pin
Pino do sensor LDR.
Definition at line 13 of file main.c.
◆ adc_init()
Iniciar o sistema "ADC".
A função <void> adc_init é utilizada para iniciar os registros necessários para o bom funcionamento do conversor de valores analógicos. Não aceita nenhum parâmetro. O registro PRR é utilizado, definindo o bit PRADC ativamos a energia para esse sistema, o registro ADMUX é utilizado pra definirmos qual será a tensão de referência utilizada pelo sistema ADC nesse caso foi escolhido o referencial Vcc, o registro ADCSRA é utilizado para ativar o sistema ADC, definindo o bit ADEN ativamos a conversão ADC e o bit ADIE ativa a interrupção que é executada quando a conversão se finaliza, o registro ADCSRA também é utilizado para definir os bits ADPS0:2 definindo o prescaler para 128, a entrada digital é desativada com o registro DIDR0 para evitar flutuações no valor.
Definition at line 279 of file main.c.
◆ alternar_laser()
Alternar o estado do laser.
A função <void> alternar_laser é usada para alternar o estado do laser. Quando executada o estado do laser é alternado. Se antes estava ligado passa a estar desligado e vice-versa. A função utiliza uma operação XOR para alternar o valor referente ao laser.
Definition at line 93 of file main.c.
◆ atraso_segundos()
| void atraso_segundos |
( |
uint16_t | segundos | ) |
|
Atrasar execução do código.
A função <void> atraso_segundos recebe o parâmetro <uint16_t> segundos e para a execução do código pelo tempo específicado em segundos. A variável <uint16_t> ovf_totais é calculada levando em consideração uma frequencia de 16MHz da CPU, e levando em consideração que foi diminuido para 250KHz pelo prescaler, cada ciclo tem um período de 4us. Levando em consideração que o TIMER1 é de 16 bits o atraso máximo possível é de 0.262 segundos. Fazendo uma aproximação concluímos que quatro ciclos de estouro são suficientes para chegar ao tempo de um segundo.
Definition at line 137 of file main.c.
◆ atualizar_direcao()
| void atualizar_direcao |
( |
char | direcao | ) |
|
Atualizar direção do carrinho.
A função <void> atualizar_direcao é usada para se comunicar com os motores utilizando o TIMER0. O parâmetro <char> direcao é utilizado para definir qual direcao dos motores. Os registros OCR0B e OCR0A são utilizados para definir o ciclo de trabalho do PWM. A direções são mapeadas da seguinte forma: u → Mover para frente; d → Mover para traz; l → Mover para a esquerda; r → Mover para a direita; t → Girar o carrinho; s → Parar o carrinho. A estrutura "switch-case" é utilizada nesse caso.
Definition at line 163 of file main.c.
◆ atualizar_estado_laser()
| void atualizar_estado_laser |
( |
bool | estado | ) |
|
Definir o estado do laser.
A função <void> atualizar_estado_laser é usada para definir o estado do laser. O parâmetro <bool> estado só pode ser falso ou verdadeiro, valores nulos não são aceitos e são ignorados. A função verifica o argumento que foi passado à ela e faz o tratamento devido com uma sintaxe "if-else".
Definition at line 101 of file main.c.
◆ atualizar_vidas()
| void atualizar_vidas |
( |
int | numero_de_vidas | ) |
|
Atualizar a quantidade de vida.
O parametro <int> numero_de_vidas especifica quantos leds devem acender para indicar a quantidade de vida atual e pode variar de 0-3 vidas. Qualquer outro valor é ignorado. A função faz o uso de uma estrutura "switch-case" para habilitar e desabilitar os registros corretos.
Definition at line 64 of file main.c.
◆ comecar_adc_conversao()
| void comecar_adc_conversao |
( |
| ) |
|
Começar a conversão ADC.
A função <void> comecar_adc_conversao é utilizada para iniciar a conversão do conversor analógico para digital. Não aceita nenhum parâmetro. O registro ADCSRA é utilizado, definindo o bit ADSC a conversão do valor recebido no pino é iniciada.
Definition at line 254 of file main.c.
◆ desligar_adc()
Desligar a interrupção ADC.
A função <void> desligar_adc é utilizada para desabilitar a interrupção disparada pelo sistema "ADC". Não aceita nenhum parâmetro. O registro ADCSRA é utilizado, limpando o bit ADIE a interrupção não acontece mais.
Definition at line 262 of file main.c.
◆ desligar_usart_interrupcao()
| void desligar_usart_interrupcao |
( |
| ) |
|
Desligar a interrupção USART.
A função <void> desligar_usart_interrupcao é utilizada para desabilitar as interrupções de um dado recebido pelo protocolo USART. Nenhum parâmetro é aceito. O registro UCSR0B é utilizado, limpando o bit RXCIE0 desabilitamos a interrupção.
Definition at line 352 of file main.c.
◆ ISR() [1/4]
Interrupção ADC.
A interrupção definida no sistema ADC está configurada para receber o valor do registro ADC que é composto de 16 bits. Se o valor ultrapassar 70 as rotinas desligar_adc e desligar_usart_interrução são desativadas para evitar conflitos com as rotinas posteriores no "loop" principal do programa. Além disso a variável de controle atingido é definida para verdadeira para o programa executar a rotina ao receber um "tiro". Caso o valor for inferior a 70 a variável atingido é definida para falso, para evitar a rotina errada, e recomeçamos a verificação de tiros reiniciando a conversão ADC.
Definition at line 298 of file main.c.
◆ ISR() [2/4]
Interrupção TIMER1 OVF.
A interrupção definida no TIMER1 está configurada para incrementar a variavel <volatile uint16_t> total_ovf1 no estouro do contador.
Definition at line 129 of file main.c.
◆ ISR() [3/4]
Interrupção TIMER2 OVF.
A interrupção definida no TIMER2 está configurada para incrementar a variável de controle <uint16_t> total_ovf2 e também alternar o estado do laser caso o tempo de um segundo tenha se passado. Nesse caso foi levado em consideração que foi utilizado um prescaler de 1024 deixando o clock final em 15.625KHz, sendo que cada ciclo leva em torno de 64us para ser completado. Como o TIMER2 tem 8 bits o atraso máximo possível é de 16.384ms, fazendo uma aproximação concluimos que 61 estouros são suficientes para gerar 1 s de atraso.
Definition at line 235 of file main.c.
◆ ISR() [4/4]
Interrupção USART.
A interrupção definida no sistema de comunicação USART é usada para indentificar que um comando foi recebido e armazenar o valor do comando em questão. Assim que recebido o valor é atualizado para a direção do carrinho.
Definition at line 319 of file main.c.
◆ ligar_usart_interrupcao()
| void ligar_usart_interrupcao |
( |
| ) |
|
Ligar a interrupção USART.
A função <void> ligar_usart_interrupcao é utilizada para habilitar as interrupções de um dado recebido pelo protocolo USART. Nenhum parâmetro é aceito. O registro UCSR0B é utilizado, definindo o bit RXCIE0 habilitamos a interrupção.
Definition at line 360 of file main.c.
◆ main()
Função Principal.
A função <int> main é utilizada para definir o comportamento principal do programa, ela chama a função setup_inicial e verifica constantemente se alguma variável de controle foi definida, ambas rotinas separadas por if's diferentes funcionam apenas se o valor de "jogo_acabou" estiver como falso. Caso contrário a primeira rotina é responsável por girar o carrinho, desabilitar os lasers e as interrupção que podem causar erro se forem executadas durante a mesma, já a segunda rotina é responsável por controlar o carrinho
Definition at line 407 of file main.c.
◆ religar_adc()
Ligar a interrupção ADC.
A função <void> religar_adc é utilizada para habilitar a interrupção disparada pelo sistema "ADC" novamente. Não aceita nenhum parâmetro. O registro ADCSRA é utilizado, definindo o bit ADIE a interrupção volta a ocorrer.
Definition at line 270 of file main.c.
◆ resetar_sistema()
Resetar o sistema.
A função <void> resetar_sistema é usada para resetar o sistema como um todo. o registro WDTCSR é utilizado pra ativar o watchdog e configurar um registro de 15ms para ele ser ativado.
Definition at line 394 of file main.c.
◆ setup_inicial()
Configuração Inicial.
A função <void> setup_inicial é utilizada para habilitar as interrupções globalmente. Definir a direção de cada pino utilizado no circuito. Iniciar os timers utilizados no programa. Iniciar a comunicação USART. Atualizar as vidas para o valor padrão. E iniciar o sistema ADC. Nenhum parâmetro é aceito.
Definition at line 368 of file main.c.
◆ timer0_init_pwm()
Iniciar o TIMER0.
A função <void> timer0_init_pwm é usada para iniciar o timer. O TIMER0 é utilizado para criar um sinal com PWM. O registro TCCR0A é utilizado para selecionar o modo "Fast PWM" e selecionar o modo de operação não-inversor, além de definir o comportamento do pino de saída do sinal. O registro TCCR0B é usado para definir o prescaler para 0.
Definition at line 153 of file main.c.
◆ timer1_init_delay()
| void timer1_init_delay |
( |
| ) |
|
Iniciar o TIMER1.
A função <void> timer1_init_delay é usada para iniciar o timer. O TIMER1 é utilizado para criar um delay eficiente. O registro TCCR1B define o uso do prescaler para o valor 64, diminuindo o clock de 16MHz para 250KHz. O registro TCNT1 é iniciado com o valor 0 para dar ínicio a contagem do contador. A variável de controle <volatile uint16_t> total_ovf1 é iniciada como zero (ela é responsável por armazenar quantas vezes o TIMER1 estorou).
Definition at line 117 of file main.c.
◆ timer2_init_laser()
| void timer2_init_laser |
( |
| ) |
|
Iniciar o TIMER2.
A função <void> timer2_init_laser é utilizada para iniciar o timer. O TIMER2 é utilizado para controlar o estado do laser que deve ser alternado de um em um segundo. O registro TCCR2B é utilizado para definir o prescaler de 1024. O registro TCNT2 é utilizado para iniciar o contador. O registro TIMSK2 é utilizado para ativar as interrupções quando o contador transbordar. E a variável <uint16_t> total_ovf2 é iniciada com um zero para controlar a quantidade de interações necessárias.
Definition at line 220 of file main.c.
◆ usart_init()
| void usart_init |
( |
uint32_t | baud | ) |
|
Iniciar o sistema USART.
A função <void> usart_init é utilizada para iniciar os registros necessários para o funcionamento do protocolo de comunicação USART. A função aceita o seguinte parâmetro <uint32_t> baud que define a velocidade que o canal USART vai usar para se comunicar com o programa. O baud necessário para o registro UBRR0 é calculado utilizando a fórmula dada pela fabricante do microcontrolador atmega328p, o registro UCSR0B é utilizado, o bit RXEN0 ativa a recepção de valores pelo canal de comunicação, o bit RXCIE0 é utilizado para ativar a interrupção que acontece quando um dado é recebido, já o registro UCSR0C é utilizado, o bit UCSZ00:1 são utilizados para definir o tamanho do dado que será recebido.
Definition at line 334 of file main.c.
◆ atingido
| volatile bool atingido = false |
Variável para controlar se o sensor LDR foi atingido por um laser. Valores possíveis: (true | false)
Definition at line 49 of file main.c.
◆ dado_recebido
| volatile bool dado_recebido = false |
Variável que controla se o dado foi recebido ou não. Valores possíveis: (true | false)
Definition at line 57 of file main.c.
◆ estado_laser
| volatile bool estado_laser = true |
Variável para controlar o estado do laser. Valores possíveis: (true | false)
Definition at line 42 of file main.c.
◆ jogo_acabou
| volatile bool jogo_acabou = false |
Variável para controlar se o jogo ainda está em andamento ou foi finalizado. Valores possíveis: (true | false)
Definition at line 47 of file main.c.
◆ letra_recebida
| volatile char letra_recebida |
Variável que armazena a letra recebida pelo USART. Valores possíveis: ('l', 'r', 'u', 'd', 's')
Definition at line 55 of file main.c.
◆ motor_ativado
| volatile bool motor_ativado = true |
Variável para controlar o estado do motor. Valores possíveis: (true | false)
Definition at line 52 of file main.c.
◆ quantidade_vidas
| volatile int quantidade_vidas = 3 |
Variável para contabilizar a quantidade de vidas atuais do carro. Valores possíveis: (0-3)
Definition at line 45 of file main.c.
◆ total_ovf0
| volatile uint16_t total_ovf0 |
Variável para contar a quantidade de estouros do TIMER0. Valores possíveis: (0-65535)
Definition at line 36 of file main.c.
◆ total_ovf1
| volatile uint16_t total_ovf1 |
Variável para contar a quantidade de estouros do TIMER1. Valores possíveis: (0-65535)
Definition at line 38 of file main.c.
◆ total_ovf2
| volatile uint16_t total_ovf2 |
Variável para contar a quantidade de estouros do TIMER2. Valores possíveis: (0-65535)
Definition at line 40 of file main.c.