Gigantes de MDF early beta
Projeto para testar os conhecimentos na matéria de programação de Hardware
Loading...
Searching...
No Matches
main.c
Go to the documentation of this file.
1#include <avr/io.h>
2#include <avr/interrupt.h>
3
5#define led1_pin PD2
7#define led2_pin PD4
9#define led3_pin PB2
11#define laser_pin PD3
13#define sensor_pin PC0
15#define motor_esquerdo PD5
17#define motor_direito PD6
19#define esquerdo_frente PB0
21#define esquerdo_traz PD7
23#define direito_frente PB4
25#define direito_traz PB3
27#define botao_reset PB5
29#define F_CPU 16000000
31#define BAUD 9600
32
33
34
36volatile uint16_t total_ovf0;
38volatile uint16_t total_ovf1;
40volatile uint16_t total_ovf2;
42volatile bool estado_laser = true;
43
45volatile int quantidade_vidas = 3;
47volatile bool jogo_acabou = false;
49volatile bool atingido = false;
50
52volatile bool motor_ativado = true;
53
55volatile char letra_recebida;
57volatile bool dado_recebido = false;
58
59
60
62
64void atualizar_vidas(int numero_de_vidas)
65{
66 switch(numero_de_vidas)
67 {
68 case 0:
69 PORTD = 0;
70 PORTB = 0;
71 break;
72 case 1:
73 PORTD |= (1 << led1_pin);
74 PORTD &= ~(1 << led2_pin);
75 PORTB &= ~(1 << led3_pin);
76 break;
77 case 2:
78 PORTD |= (1 << led1_pin);
79 PORTD |= (1 << led2_pin);
80 PORTB &= ~(1 << led3_pin);
81 break;
82 case 3:
83 PORTD |= (1 << led1_pin);
84 PORTD |= (1 << led2_pin);
85 PORTB |= (1 << led3_pin);
86 break;
87 }
88}
89
91
94{
95 PORTD ^= (1 << laser_pin);
96}
97
99
101void atualizar_estado_laser(bool estado)
102{
103 if(estado)
104 {
105 PORTD |= (1 << laser_pin);
106 }
107 else
108 {
109 PORTD &= ~(1 << laser_pin);
110 }
111}
112
113
115
118{
119 TCCR1B |= ((1 << CS10) | (1 << CS11));
120
121 TCNT1 = 0;
122
123 total_ovf1 = 0;
124}
125
127
129ISR(TIMER1_OVF_vect)
130{
131 total_ovf1++;
132}
133
135
137void atraso_segundos(uint16_t segundos)
138{
139 TIMSK1 |= (1 << TOIE1);
140
141 total_ovf1 = 0;
142 uint16_t ovf_totais = segundos * 4;
143
144 while(total_ovf1 < ovf_totais)
145 {}
146
147 TIMSK1 &= ~(1 << TOIE1);
148}
149
151
154{
155 TCCR0A |= ((1 << COM0A1) | (1 << WGM00) | (1 << WGM01) | (1 << COM0B1));
156
157 TCCR0B |= (1 << CS00);
158}
159
161
163void atualizar_direcao(char direcao)
164{
165 if(direcao != 's')
166 {
167 OCR0B = 254;
168 OCR0A = 254;
169 }
170 else
171 {
172 OCR0B = 0;
173 OCR0A = 0;
174 }
175
176 switch (direcao)
177 {
178 case 'u':
179 PORTB |= (1 << esquerdo_frente);
180 PORTD &= ~(1 << esquerdo_traz);
181 PORTB |= (1 << direito_frente);
182 PORTB &= ~(1 << direito_traz);
183 break;
184 case 'd':
185 PORTB &= ~(1 << esquerdo_frente);
186 PORTD |= (1 << esquerdo_traz);
187 PORTB &= ~(1 << direito_frente);
188 PORTB |= (1 << direito_traz);
189 break;
190 case 'l':
191 PORTB &= ~(1 << esquerdo_frente);
192 PORTD &= ~(1 << esquerdo_traz);
193 PORTB |= (1 << direito_frente);
194 PORTB &= ~(1 << direito_traz);
195 break;
196 case 'r':
197 PORTB |= (1 << esquerdo_frente);
198 PORTD &= ~(1 << esquerdo_traz);
199 PORTB &= ~(1 << direito_frente);
200 PORTB &= ~(1 << direito_traz);
201 break;
202 case 't':
203 PORTB |= (1 << esquerdo_frente);
204 PORTD &= ~(1 << esquerdo_traz);
205 PORTB &= ~(1 << direito_frente);
206 PORTB |= (1 << direito_traz);
207 break;
208 case 's':
209 PORTB &= ~(1 << esquerdo_frente);
210 PORTD &= ~(1 << esquerdo_traz);
211 PORTB &= ~(1 << direito_frente);
212 PORTB &= ~(1 << direito_traz);
213 break;
214 }
215}
216
218
221{
222
223 TCCR2B |= (1<<CS21) | (1<< CS22) | (1<<CS20);
224
225 TCNT2 = 0;
226
227 TIMSK2 |= (1 <<TOIE2);
228
229 total_ovf2 = 0;
230}
231
233
235ISR(TIMER2_OVF_vect)
236{
237 total_ovf2++;
238
239 if (total_ovf2 >= 61)
240 {
242 {
244 } else {
246 }
247 total_ovf2 = 0;
248 }
249}
250
252
255{
256 ADCSRA |= (1 << ADSC);
257}
258
260
263{
264 ADCSRA &= ~(1 << ADIE);
265}
266
268
271{
272 ADCSRA |= (1 << ADIE);
274}
275
277
280{
281
282 PRR &= ~(1 << PRADC);
283
284 ADMUX |= (1 << REFS0);
285
286 ADCSRA |= ((1 << ADEN) | (1 << ADIE));
287
288 ADCSRA |= ((1 << ADPS0) | (1 << ADPS1) | (1 << ADPS2));
289
290 DIDR0 |= (1 << ADC0D);
291
293}
294
296
298ISR(ADC_vect)
299{
300 uint16_t valor = ADCL;
301 valor += (ADCH << 8);
302
303 if(valor > 70)
304 {
305 atingido = true;
306 desligar_adc();
308 }
309 else {
310 atingido = false;
312 }
313
314}
315
317
319ISR(USART_RX_vect)
320{
321 letra_recebida = UDR0;
322 dado_recebido = true;
323
325 {
327 dado_recebido = false;
328 }
329}
330
332
334void usart_init(uint32_t baud)
335{
336 uint8_t speed = 16;
337
338 baud = (F_CPU/(speed*baud)) - 1;
339
340 UBRR0H = (baud & 0x0F00) >> 8;
341 UBRR0L = (baud & 0x00FF);
342
343 UCSR0B |= ((1 << RXEN0) | (1 << RXCIE0));
344
345 UCSR0C = (1 << UCSZ01) | (1 << UCSZ00);
346
347}
348
350
353{
354 UCSR0B &= ~(1 << RXCIE0);
355}
356
358
361{
362 UCSR0B |= (1 << RXCIE0);
363}
364
366
369{
370 WDTCSR = (1 << WDCE) | (0 << WDE);
371
372 sei();
373
374 DDRB |= ((1 << led3_pin) | (1 << direito_frente) | (1 << direito_traz) | (1 << esquerdo_frente));
375 DDRD |= ((1 << led2_pin) | (1 << led1_pin) | (1 << laser_pin) | (1 << esquerdo_traz) | (1 << motor_esquerdo) | (1 << motor_direito));
376
377 DDRB &= ~(1 << botao_reset);
378
379 PORTB |= (1 << botao_reset);
380
385
387
388 adc_init();
389}
390
392
395{
396 WDTCSR = (1 << WDCE) | (1 << WDE);
397
398 WDTCSR = (1 << WDE) | (1 << WDP0);
399
400 while (1)
401 {}
402}
403
405
407int main()
408{
410
411 while(1)
412 {
413 if(atingido & !jogo_acabou)
414 {
416 atingido = false;
417 estado_laser = false;
418
420
423
424 if(quantidade_vidas == 0)
425 {
426 jogo_acabou = true;
427 }
428
431
434
435 if(!jogo_acabou)
436 {
437 religar_adc();
438 estado_laser = true;
439 }
441 }
442
443 if(!(PINB & (1 << botao_reset)))
444 {
446 }
447
448 }
449
450 return 0;
451}
#define esquerdo_frente
Pino da direção do motor esquerdo para frente.
Definition main.c:19
volatile bool jogo_acabou
Variável para controlar se o jogo ainda está em andamento ou foi finalizado. Valores possíveis: (true...
Definition main.c:47
void atualizar_vidas(int numero_de_vidas)
Atualizar a quantidade de vida.
Definition main.c:64
void desligar_usart_interrupcao()
Desligar a interrupção USART.
Definition main.c:352
void adc_init()
Iniciar o sistema "ADC".
Definition main.c:279
#define motor_direito
Pino do sinal PWM do motor direito.
Definition main.c:17
#define botao_reset
Pino do botão de reset.
Definition main.c:27
volatile bool atingido
Variável para controlar se o sensor LDR foi atingido por um laser. Valores possíveis: (true | false)
Definition main.c:49
#define led2_pin
Pino do segundo Led.
Definition main.c:7
#define F_CPU
Macro referente a frequência do Microcontrolador utilizado.
Definition main.c:29
#define led3_pin
Pino do terceiro Led.
Definition main.c:9
#define led1_pin
Pino do primeiro Led.
Definition main.c:5
#define BAUD
Macro referente a velocidade de comunicação que se deseja utilizar no USART.
Definition main.c:31
volatile char letra_recebida
Variável que armazena a letra recebida pelo USART. Valores possíveis: ('l', 'r', 'u',...
Definition main.c:55
#define direito_traz
Pino da direção do motor direito para traz.
Definition main.c:25
void comecar_adc_conversao()
Começar a conversão ADC.
Definition main.c:254
void ligar_usart_interrupcao()
Ligar a interrupção USART.
Definition main.c:360
void alternar_laser()
Alternar o estado do laser.
Definition main.c:93
volatile uint16_t total_ovf0
Variável para contar a quantidade de estouros do TIMER0. Valores possíveis: (0-65535)
Definition main.c:36
void resetar_sistema()
Resetar o sistema.
Definition main.c:394
#define esquerdo_traz
Pino da direção do motor esquerdo para traz.
Definition main.c:21
void timer2_init_laser()
Iniciar o TIMER2.
Definition main.c:220
#define direito_frente
Pino da direção do motor direito para frente.
Definition main.c:23
volatile uint16_t total_ovf2
Variável para contar a quantidade de estouros do TIMER2. Valores possíveis: (0-65535)
Definition main.c:40
void atraso_segundos(uint16_t segundos)
Atrasar execução do código.
Definition main.c:137
void timer1_init_delay()
Iniciar o TIMER1.
Definition main.c:117
void usart_init(uint32_t baud)
Iniciar o sistema USART.
Definition main.c:334
volatile bool estado_laser
Variável para controlar o estado do laser. Valores possíveis: (true | false)
Definition main.c:42
volatile bool motor_ativado
Variável para controlar o estado do motor. Valores possíveis: (true | false)
Definition main.c:52
volatile uint16_t total_ovf1
Variável para contar a quantidade de estouros do TIMER1. Valores possíveis: (0-65535)
Definition main.c:38
void timer0_init_pwm()
Iniciar o TIMER0.
Definition main.c:153
ISR(TIMER1_OVF_vect)
Interrupção TIMER1 OVF.
Definition main.c:129
volatile bool dado_recebido
Variável que controla se o dado foi recebido ou não. Valores possíveis: (true | false)
Definition main.c:57
void desligar_adc()
Desligar a interrupção ADC.
Definition main.c:262
void religar_adc()
Ligar a interrupção ADC.
Definition main.c:270
volatile int quantidade_vidas
Variável para contabilizar a quantidade de vidas atuais do carro. Valores possíveis: (0-3)
Definition main.c:45
void atualizar_estado_laser(bool estado)
Definir o estado do laser.
Definition main.c:101
#define motor_esquerdo
Pino do sinal PWM do motor esquerdo.
Definition main.c:15
void atualizar_direcao(char direcao)
Atualizar direção do carrinho.
Definition main.c:163
int main()
Função Principal.
Definition main.c:407
#define laser_pin
Pino do laser.
Definition main.c:11
void setup_inicial()
Configuração Inicial.
Definition main.c:368