Postrehová hra: Rozdiel medzi revíziami
Zo stránky SensorWiki
Bez shrnutí editace |
Bez shrnutí editace |
||
Riadok 1: | Riadok 1: | ||
Záverečný projekt predmetu MIPS / LS2023 - '''Ivan Hílek''' | |||
Záverečný projekt predmetu MIPS / LS2023 - ''' | |||
== Zadanie == | == Zadanie == | ||
Hra - na displeji sa zobrazí časový interval (napr. 10s), hráč musí trafiť tento interval čo najpresnejšie stlačením tlačidla bez toho aby išli cez. Odštartuje ich rozsvecovanie 3 lediek ako semafor pri formulách. | |||
[[Obrázok:ard.jpg|400px|thumb|center|Vývojová doska ACROB.]] | [[Obrázok:ard.jpg|400px|thumb|center|Vývojová doska ACROB.]] | ||
Riadok 20: | Riadok 17: | ||
== Analýza a opis riešenia == | == Analýza a opis riešenia == | ||
Najprv som si zapojil základnú schému na LCD display a následne som si tam pridával ostatné prvky ako LED, switch. Samozrejme po každom kroku som si overil, či dané súčiastky fungujú základným kódom, ktorý sme mali pri každom cvičení. Následne som jednotlivé prvky začal kombinovať do jedného celku aj HW a aj kód, tak aby som dostal záverečné riešenie projektu. | |||
'''Súčiastky:''' | |||
LCD display, ACROB základná doska, 2x switch, 3x LED, káblové vedenia a samozrejme pomocné pinové dosky | |||
[[Súbor:MIPS lcdDemoSchema01.png|400px|thumb|center|Schéma zapojenia LCD displeja.]] | |||
[[Súbor: | [[Súbor:MIPS schema02-2.png|400px|thumb|center|Zapojenie LED + switch]] | ||
'''Samozrejme zapájame na piny, ktoré máme ešte voľné, resp. podľa zdrojového kódu''' | |||
=== Algoritmus a program === | === Algoritmus a program === | ||
<tabs> | |||
<tab name="AVR C-code"><source lang="c++" style="background: LightYellow;"> | |||
#include <avr/io.h> | #include <avr/io.h> | ||
#include "lcd_ch.h" | |||
#include <avr/interrupt.h> | |||
#include <util/delay.h> | |||
#define SW1 PD0 //zabudovaný switch | |||
#define SW2 PD2 | |||
#define LED1 PD6 //zadudovane diody cervena | |||
#define LED2 PD7 //zlta | |||
#define LED3 PD5 //zelena | |||
#define LCD_CTRL_PORT DDRD //LCD define | |||
#define LCD_DATA_PORT DDRB | |||
#define LCD_RS_pin 2 | |||
#define LCD_RW_pin 3 | |||
#define LCD_EN_pin 4 | |||
#define LCD_D4_pin 1 | |||
#define LCD_D5_pin 2 | |||
#define LCD_D6_pin 3 | |||
#define LCD_D7_pin 4 | |||
#define LCD_CLR 0 /* DB0: clear display */ | |||
#define LCD_HOME 1 /* DB1: return to home position */ | |||
int main(void) | int main(void) | ||
{ | { | ||
DDRD = 0b00100000; // PORTB: LED1 na PB5 je output, SW1 (PB4) input | |||
PORTD = 0b00010000; // LED Active low, LED off, pull-up ON | |||
DDRD |= (1 << LED1); | |||
DDRD |= (1 << LED2); | |||
DDRD |= (1 << LED3); | |||
DDRD |= (1<<LCD_EN_pin); // Pin D4 (Enable) PORTD output | |||
DDRD |= (1<<LCD_RW_pin); // Pin D3 (RW) PORTD output | |||
DDRD |= (1<<LCD_RS_pin); // Pin D2 (RS) PORTD output | |||
LCD_DATA_PORT |= (1<<LCD_D4_pin)|(1<<LCD_D5_pin)|(1<<LCD_D6_pin)|(1<<LCD_D7_pin); // Piny 1,2,3,4, PORTB ako output (Data pre display) | |||
lcd_init(); // definiciu pozri v -> lcd_ch.h resp. lcd_ch.c //MENU HRY | |||
lcd_puts("Stlac tlacitka,"); | |||
lcd_command(0xC0); | |||
lcd_puts("aby sa hra zacala"); | |||
while(1) | |||
{ | |||
if ( !(PIND & (1<<SW1)) & !(PIND & (1<<SW2)) ) // ZAPNUTIE HRY | |||
{ | |||
lcd_init(); | |||
lcd_puts("Spustam semafor"); | |||
PORTD |= (1<<LED1); //SEMAFOR | |||
_delay_ms(1000); //delay 1 sekunda medzi farbami | |||
PORTD &= ~(1<<LED1); | |||
PORTD |= (1<<LED2); | |||
_delay_ms(1000); | |||
PORTD &= ~(1<<LED2); | |||
PORTD |= (1<<LED3); | |||
_delay_ms(1000); | |||
PORTD &= ~(1<<LED3); | |||
lcd_init(); //ODPOCITAVANIE 10 SEC. | |||
lcd_puts("Odpocitavaj 10 sek."); | |||
lcd_command(0xC0 + 1); | |||
lcd_puts("stlac tlacitko "); | |||
_delay_ms(1000); | |||
int cas=0; // PREMENNA CAS, PODLA KTOREJ BEZI VYHODNOTENIE | |||
while ((PIND & (1<<SW1))) { | |||
_delay_ms(100); | |||
cas++; //PRIDAVAME DO PREMENNEJ CAS | |||
} | |||
if (cas >= 90 && cas <= 110) //PO STLACENI SWITCH SA NAM ZASTAVI TIMER A AK JE HODNOTA MEDZI 9 A 11 SEKUNDAMI TAK VYHRAME | |||
{ | |||
lcd_command(1<<LCD_CLR); /* Clear screen */ | |||
lcd_command(1<<LCD_HOME); /* Set cursor to home position */ | |||
char riadok[]= {" "}; | |||
sprintf(riadok,"Vyhral si"); //TEXT VYHRA | |||
lcd_puts(riadok); | |||
} | |||
else | |||
{ | |||
lcd_init(); | |||
lcd_puts("nevyhral si"); //TEXT PREHRA | |||
}}}} | |||
</source></tab> | </source></tab> | ||
</tabs> | </tabs> | ||
Zdrojový kód: [[Médiá:AVRGCC2.c]] | |||
Zdrojový kód: [[Médiá: | |||
Riadok 68: | Riadok 142: | ||
Na používanie našej aplikácie stačia dve tlačítka a postup používania je opísaný v sekcii popis riešenia. | Na používanie našej aplikácie stačia dve tlačítka a postup používania je opísaný v sekcii popis riešenia. | ||
Na konci uvádzame fotku záverečnej obrazovky pred resetom. | Na konci uvádzame fotku záverečnej obrazovky pred resetom. Aj výhra a aj prehra. | ||
[[Súbor: | [[Súbor:Zapojenie postrehova hra.jpg|400px|thumb|center|Aplikácia.]] | ||
'''Video:''' | '''Video:''' | ||
<center><youtube> | <center><youtube>vjFAFwa9Yj0</youtube></center> | ||
[[Category:AVR]] [[Category:MIPS]] | [[Category:AVR]] [[Category:MIPS]] |
Verzia z 20:53, 14. júl 2023
Záverečný projekt predmetu MIPS / LS2023 - Ivan Hílek
Zadanie
Hra - na displeji sa zobrazí časový interval (napr. 10s), hráč musí trafiť tento interval čo najpresnejšie stlačením tlačidla bez toho aby išli cez. Odštartuje ich rozsvecovanie 3 lediek ako semafor pri formulách.
![](/sensorwiki/images/thumb/d/d9/Ard.jpg/400px-Ard.jpg)
Literatúra:
Analýza a opis riešenia
Najprv som si zapojil základnú schému na LCD display a následne som si tam pridával ostatné prvky ako LED, switch. Samozrejme po každom kroku som si overil, či dané súčiastky fungujú základným kódom, ktorý sme mali pri každom cvičení. Následne som jednotlivé prvky začal kombinovať do jedného celku aj HW a aj kód, tak aby som dostal záverečné riešenie projektu.
Súčiastky:
LCD display, ACROB základná doska, 2x switch, 3x LED, káblové vedenia a samozrejme pomocné pinové dosky
![](/sensorwiki/images/thumb/5/5e/MIPS_lcdDemoSchema01.png/400px-MIPS_lcdDemoSchema01.png)
![](/sensorwiki/images/thumb/a/a6/MIPS_schema02-2.png/400px-MIPS_schema02-2.png)
Samozrejme zapájame na piny, ktoré máme ešte voľné, resp. podľa zdrojového kódu
Algoritmus a program
#include <avr/io.h>
#include "lcd_ch.h"
#include <avr/interrupt.h>
#include <util/delay.h>
#define SW1 PD0 //zabudovaný switch
#define SW2 PD2
#define LED1 PD6 //zadudovane diody cervena
#define LED2 PD7 //zlta
#define LED3 PD5 //zelena
#define LCD_CTRL_PORT DDRD //LCD define
#define LCD_DATA_PORT DDRB
#define LCD_RS_pin 2
#define LCD_RW_pin 3
#define LCD_EN_pin 4
#define LCD_D4_pin 1
#define LCD_D5_pin 2
#define LCD_D6_pin 3
#define LCD_D7_pin 4
#define LCD_CLR 0 /* DB0: clear display */
#define LCD_HOME 1 /* DB1: return to home position */
int main(void)
{
DDRD = 0b00100000; // PORTB: LED1 na PB5 je output, SW1 (PB4) input
PORTD = 0b00010000; // LED Active low, LED off, pull-up ON
DDRD |= (1 << LED1);
DDRD |= (1 << LED2);
DDRD |= (1 << LED3);
DDRD |= (1<<LCD_EN_pin); // Pin D4 (Enable) PORTD output
DDRD |= (1<<LCD_RW_pin); // Pin D3 (RW) PORTD output
DDRD |= (1<<LCD_RS_pin); // Pin D2 (RS) PORTD output
LCD_DATA_PORT |= (1<<LCD_D4_pin)|(1<<LCD_D5_pin)|(1<<LCD_D6_pin)|(1<<LCD_D7_pin); // Piny 1,2,3,4, PORTB ako output (Data pre display)
lcd_init(); // definiciu pozri v -> lcd_ch.h resp. lcd_ch.c //MENU HRY
lcd_puts("Stlac tlacitka,");
lcd_command(0xC0);
lcd_puts("aby sa hra zacala");
while(1)
{
if ( !(PIND & (1<<SW1)) & !(PIND & (1<<SW2)) ) // ZAPNUTIE HRY
{
lcd_init();
lcd_puts("Spustam semafor");
PORTD |= (1<<LED1); //SEMAFOR
_delay_ms(1000); //delay 1 sekunda medzi farbami
PORTD &= ~(1<<LED1);
PORTD |= (1<<LED2);
_delay_ms(1000);
PORTD &= ~(1<<LED2);
PORTD |= (1<<LED3);
_delay_ms(1000);
PORTD &= ~(1<<LED3);
lcd_init(); //ODPOCITAVANIE 10 SEC.
lcd_puts("Odpocitavaj 10 sek.");
lcd_command(0xC0 + 1);
lcd_puts("stlac tlacitko ");
_delay_ms(1000);
int cas=0; // PREMENNA CAS, PODLA KTOREJ BEZI VYHODNOTENIE
while ((PIND & (1<<SW1))) {
_delay_ms(100);
cas++; //PRIDAVAME DO PREMENNEJ CAS
}
if (cas >= 90 && cas <= 110) //PO STLACENI SWITCH SA NAM ZASTAVI TIMER A AK JE HODNOTA MEDZI 9 A 11 SEKUNDAMI TAK VYHRAME
{
lcd_command(1<<LCD_CLR); /* Clear screen */
lcd_command(1<<LCD_HOME); /* Set cursor to home position */
char riadok[]= {" "};
sprintf(riadok,"Vyhral si"); //TEXT VYHRA
lcd_puts(riadok);
}
else
{
lcd_init();
lcd_puts("nevyhral si"); //TEXT PREHRA
}}}}
Zdrojový kód: Médiá:AVRGCC2.c
Overenie
Na používanie našej aplikácie stačia dve tlačítka a postup používania je opísaný v sekcii popis riešenia. Na konci uvádzame fotku záverečnej obrazovky pred resetom. Aj výhra a aj prehra.
![](/sensorwiki/images/thumb/2/2f/Zapojenie_postrehova_hra.jpg/400px-Zapojenie_postrehova_hra.jpg)
Video: