Gigantes de MDF early beta
Projeto para testar os conhecimentos na matéria de programação de Hardware
Loading...
Searching...
No Matches
main.c File Reference
#include <avr/io.h>
#include <avr/interrupt.h>

Go to the source code of this file.

Macros

#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.
 

Functions

void atualizar_vidas (int numero_de_vidas)
 Atualizar a quantidade de vida.
 
void alternar_laser ()
 Alternar o estado do laser.
 
void atualizar_estado_laser (bool estado)
 Definir o estado do laser.
 
void timer1_init_delay ()
 Iniciar o TIMER1.
 
 ISR (TIMER1_OVF_vect)
 Interrupção TIMER1 OVF.
 
void atraso_segundos (uint16_t segundos)
 Atrasar execução do código.
 
void timer0_init_pwm ()
 Iniciar o TIMER0.
 
void atualizar_direcao (char direcao)
 Atualizar direção do carrinho.
 
void timer2_init_laser ()
 Iniciar o TIMER2.
 
 ISR (TIMER2_OVF_vect)
 Interrupção TIMER2 OVF.
 
void comecar_adc_conversao ()
 Começar a conversão ADC.
 
void desligar_adc ()
 Desligar a interrupção ADC.
 
void religar_adc ()
 Ligar a interrupção ADC.
 
void adc_init ()
 Iniciar o sistema "ADC".
 
 ISR (ADC_vect)
 Interrupção ADC.
 
 ISR (USART_RX_vect)
 Interrupção USART.
 
void usart_init (uint32_t baud)
 Iniciar o sistema USART.
 
void desligar_usart_interrupcao ()
 Desligar a interrupção USART.
 
void ligar_usart_interrupcao ()
 Ligar a interrupção USART.
 
void setup_inicial ()
 Configuração Inicial.
 
void resetar_sistema ()
 Resetar o sistema.
 
int main ()
 Função Principal.
 

Variables

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)
 

Macro Definition Documentation

◆ BAUD

#define BAUD   9600

Macro referente a velocidade de comunicação que se deseja utilizar no USART.

Definition at line 31 of file main.c.

◆ botao_reset

#define botao_reset   PB5

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

#define direito_traz   PB3

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

#define F_CPU   16000000

Macro referente a frequência do Microcontrolador utilizado.

Definition at line 29 of file main.c.

◆ laser_pin

#define laser_pin   PD3

Pino do laser.

Definition at line 11 of file main.c.

◆ led1_pin

#define led1_pin   PD2

Pino do primeiro Led.

Definition at line 5 of file main.c.

◆ led2_pin

#define led2_pin   PD4

Pino do segundo Led.

Definition at line 7 of file main.c.

◆ led3_pin

#define led3_pin   PB2

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

#define sensor_pin   PC0

Pino do sensor LDR.

Definition at line 13 of file main.c.

Function Documentation

◆ adc_init()

void 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()

void 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()

void 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]

ISR ( ADC_vect )

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]

ISR ( TIMER1_OVF_vect )

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]

ISR ( TIMER2_OVF_vect )

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]

ISR ( USART_RX_vect )

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()

int 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()

void 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()

void 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()

void 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()

void 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.

Variable Documentation

◆ 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.