Operácie

Postrehová hra: Rozdiel medzi revíziami

Z SensorWiki

Riadok 1: Riadok 1:
Hra - na displeji sa zobrazí časový interval (napr. 10s), dvaja hráči musia 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.
+
Záverečný projekt predmetu MIPS / LS2023 - '''Ivan Hílek'''
 
 
 
 
Záverečný projekt predmetu MIPS / LS2023 - '''Meno Priezvisko'''
 
  
  
 
== Zadanie ==
 
== Zadanie ==
  
Sem príde text zadania, ak bolo len voľne formulované, rozpíšte ho podrobnejšie
+
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 ==
  
Opíšte sem čo a ako ste spravili, ak treba, doplňte obrázkami...
+
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:'''
  
[[Súbor:ledRGB.jpg|400px|thumb|center|RGB LED.]]
+
LCD display, ACROB základná doska, 2x switch, 3x LED, káblové vedenia a samozrejme pomocné pinové dosky
  
Nezabudnite doplniť schému zapojenia!
+
[[Súbor:MIPS lcdDemoSchema01.png|400px|thumb|center|Schéma zapojenia LCD displeja.]]
  
[[Súbor:schd.png|400px|thumb|center|Schéma zapojenia LCD displeja.]]
+
[[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 ===
  
Algoritmus programu je....
+
<tabs>
 +
<tab name="AVR C-code"><source lang="c++" style="background: LightYellow;">
  
  
<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)
{
+
{
   unsigned int measuredValue;
+
    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 
  
  while (1)
+
PORTD &= ~(1<<LED1);
   {
+
   PORTD |= (1<<LED2);
    /*  relax  */  
+
_delay_ms(1000);
  }
 
  
   return(0);
+
PORTD &= ~(1<<LED2);
}
+
  PORTD |=  (1<<LED3);
 +
   _delay_ms(1000);
 +
  PORTD &= ~(1<<LED3);
  
</source></tab>
+
lcd_init();                          //ODPOCITAVANIE 10 SEC.
<tab name="filename.h"><source lang="c++" style="background: LightYellow;">
+
lcd_puts("Odpocitavaj 10 sek.");
#include <avr/io.h>
+
lcd_command(0xC0 + 1);
 +
lcd_puts("stlac tlacitko ");          
 +
 +
_delay_ms(1000);
 +
 +
  int cas=0;                  // PREMENNA CAS, PODLA KTOREJ BEZI VYHODNOTENIE
  
void adc_init(void);                                   // A/D converter initialization
+
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);
 +
}
  
unsigned int adc_read(char a_pin);
+
else
 +
{
 +
lcd_init();
 +
lcd_puts("nevyhral si");                  //TEXT PREHRA
 +
}}}}
 +
 
</source></tab>
 
</source></tab>
 
</tabs>
 
</tabs>
  
Pridajte sem aj zbalený kompletný projekt, napríklad takto (použite jednoznačné pomenovanie, nemôžeme mať na serveri 10x ''zdrojaky.zip'':
+
Zdrojový kód: [[Médiá:AVRGCC2.c]]
 
 
Zdrojový kód: [[Médiá:projektMenoPriezvisko.zip|zdrojaky.zip]]
 
  
  
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. Vypísaný je tu priemerný čas a najlepší čas.  
+
Na konci uvádzame fotku záverečnej obrazovky pred resetom. Aj výhra a aj prehra.
  
[[Súbor:fotka.jpg|400px|thumb|center|Aplikácia.]]
+
[[Súbor:Zapojenie postrehova hra.jpg|400px|thumb|center|Aplikácia.]]
  
 
'''Video:'''
 
'''Video:'''
<center><youtube>_l02MBu41n0</youtube></center>
+
<center><youtube>vjFAFwa9Yj0</youtube></center>
 
 
Kľúčové slová 'Category', ktoré sú na konci stránky nemeňte.
 
  
 
[[Category:AVR]] [[Category:MIPS]]
 
[[Category:AVR]] [[Category:MIPS]]

Verzia zo dňa a času 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.
Vývojová doska ACROB.

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

Schéma zapojenia LCD displeja.
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

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

Aplikácia.

Video: