Simon Says

Descriere generala

Joc de memorie:

  1. o secventa de aprindere este afisata pe cele 8 led-uri apoi acestea se sting
  2. se asteapta introducerea acesteia de catre utilizator prin cele 8 butoane
  3. introducerea corecta duce la terecea la nivelul urmator
  4. introducerea incorecta face ca jocul sa ramana la nivelul curent

- nivelele sunt crescatoare ca dificultate

Hardware Design

Componente necesare:

  1. placuta de baza cu ATmega16
  2. 8 led-uri pentru afisarea secventei
  3. 8 butoane pentru introducerea acesteia
  4. 2 led-uri (verde/rosu) care arata daca secventa introdusa este corecta sau nu
  5. 2 butoane pentru selectia nivelului
  6. 10 rezistente (1k) pentru montarea led-urilor

Mod de interconectare:

Piesele pentru partea de proiect au fost asamblate pe o placa de test, interconectarea acestora a fost facuta cu ajutorul firelor (dintr-un cablu UTP)

Software Design

- pasii jocului:

  1. se afiseaza pe cele 8 led-uri nivelul (3s)
  2. se afiseaza secventa de memorat care un led la fiecare 0.5s
  3. se citeste input-ul utilizatorului 8s (atat butoanele pentru led-uri cat si cele pentru selectia nivelului)
  4. se verifica secventa introdusa de utilizator daca aceasta este corecta se trece la nivelul urmator, daca nu se repeta nivelul curent

Exemple de cod:

- citirea butoanelor

void citeste_butoane(){
PORTA=0xFF;
int i=0,aux=0;
if((PINA&(1<<led1))==0){
	PORTD|=(1<<led1);
	rez[led1]=led1;
	aux=0;
	for(i=0;i<N;i++){
		if(rez[i]!=0){
			aux++;
		}
	}
	if(ver[led1]==0)
		ver[led1]+=aux;
	_delay_ms(10);
	PORTD&=!(1<<led1);
} 
if((PINA&(1<<led2))==0){
	PORTD|=(1<<led2);
	rez[led2]=led2;
	aux=0;
	for(i=0;i<N;i++){
		if(rez[i]!=0){
			aux++;
		}
	}
	if(ver[led2]==0)
		ver[led2]+=aux;
	_delay_ms(10);
	PORTD&=!(1<<led2);
} 
if((PINA&(1<<led3))==0){
	PORTD|=(1<<led3);
	rez[led3]=led3;
	aux=0;
	for(i=0;i<N;i++){
		if(rez[i]!=0){
			aux++;
		}
	}
	if(ver[led3]==0)
		ver[led3]+=aux;
	_delay_ms(10);
	PORTD&=!(1<<led3);
} 
if((PINA&(1<<led4))==0){
	PORTD|=(1<<led4);
	rez[led4]=led4;
	aux=0;
	for(i=0;i<N;i++){
		if(rez[i]!=0){
			aux++;
		}
	}
	if(ver[led4]==0)
		ver[led4]+=aux;
	_delay_ms(10);
	PORTD&=!(1<<led4);
} 
if((PINA&(1<<led5))==0){
	PORTD|=(1<<led5);
	rez[led5]=led5;
	aux=0;
	for(i=0;i<N;i++){
		if(rez[i]!=0){
			aux++;
		}
	}
	if(ver[led5]==0)
		ver[led5]+=aux;
	_delay_ms(10);
	PORTD&=!(1<<led5);
} 
if((PINA&(1<<led6))==0){
	PORTD|=(1<<led6);
	rez[led6]=led6;
	aux=0;
	for(i=0;i<N;i++){
		if(rez[i]!=0){
			aux++;
		}
	}
	if(ver[led6]==0)
		ver[led6]+=aux;
	_delay_ms(10);
	PORTD&=!(1<<led6);
} 
if((PINA&(1<<led7))==0){
	PORTD|=(1<<led7);
	rez[led7]=led7;
	aux=0;
	for(i=0;i<N;i++){
		if(rez[i]!=0){
			aux++;
		}
	}
	if(ver[led7]==0)
		ver[led7]+=aux;
	_delay_ms(10);
	PORTD&=!(1<<led7);
} 
if((PINA&(1<<led8))==0){
	PORTD|=(1<<led8);
	rez[led8]=led8;
	aux=0;
	for(i=0;i<N;i++){
		if(rez[i]!=0){
			aux++;
		}
	}
	if(ver[led8]==0)
		ver[led8]+=aux;
	_delay_ms(10);
	PORTD&=!(1<<led8);
}
}

- initializare Timer:

  void Timer1_init(void){
  // Initializare timer 1 compare match A pentru a avea un timer la nivel de 1 secunda, 16MHz
  OCR1A = 15624;
  TCCR1A = 0;
  // prescaler 1024
  TCCR1B = (1<<WGM12)|(1<<CS12)|(1<<CS10);
  TIMSK |= _BV(OCIE1A);
  }

- pentru intreruperile folosite la oprirea input-ului folosesc Timer1 al ATmega16 setat la nivel de 1s

- intarzierile pentru afisarea secventelor de memorat sau a nivelului sunt realizate cu ajutorul functiei _delay_ms() din biblioteca <delay.h>

Rezultate obtinute

 1. placuta in faza de bootloader

 2. inceputul jocului

Jocul este functional si dispune de 8 nivele de joc

Este un joc interactiv ce iti va pune memoria la incercare :D

Proiectul a fost unul interesant, in urma acestuia am invatat atat bazele programarii pentru ATmega16 cat si interfatarea hardware a diferitelor module cu acesta.

Bibliografie/Resurse

Laboratoarele 1 si 2:

http://elf.cs.pub.ro/pm/wiki/lab/lab1 - led-uri, butoane

http://elf.cs.pub.ro/pm/wiki/lab/lab2 - intreruperi, timer

Jocul original: http://en.wikipedia.org/wiki/Simon_%28game%29

Datashet-ul pentru ATmega16

pm/prj2010/mcarjaliu/simon_says.txt · Last modified: 2021/04/14 17:07 (external edit)
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0