Lite information om vad det går ut på:
Fyra lysdioder blinkar i ett slumpvis mönster som man sedan skall upprepa genom att trycka på lika många knappar. Därefter markeras med grön/röd lysdiod om man gjort rätt eller fel. Efter sex rätta gissningar ökas antalet blinkningar på med ett och så vidare tills man väljer att stänga av spelet eller att vektorn fylls (10 för närvarande).
Eftersom jag tänkt göra detta som ett nybörjarprojekt har jag knåpat i hop ett litet flödesschema:

Ett litet fel i flödesschemat har smugit sig in: "Läsa in gissningar" bör också innehålla en rättningsfunktion också. Observera att detta är en skiss.
Blink är alltså vilken lysdiod som skall blinka.
Så ett kopplingsschema:

Då jag kopplat upp allt på ett experimentkort har jag inte gjort en kretslayout.
Som ni ser är det inga konstiga komponenter utan bara standard som alla har i byrålådan.
Ett litet råttbo:

Så den slutliga lilla lådan:

Jag hade inte satt fast locket ordentligt när bilden togs, därför ser det lite skevt ut.
Så lite programkod:
Kod: Markera allt
//Mind game - eller hur man gissar rätt på blinkande lysdioder.
//Chip: Atmel AVR ATtiny2313 @4MHz div 8 Internally
//
//Micael Karlsson
//20070225-20070302
//Push button 1: -> PD0
//Push button 2: -> PD1
//Push button 3: -> PD2
//Push button 4: -> PD3
//LED 1: -> PB0
//LED 2: -> PB1
//LED 3: -> PB2
//LED 4: -> PD6
//OK LED: -> PD4
//Not OK LED: -> PD5
//----------------------------------------------------------------------------------------------
#include "util/delay.h"
#include "avr/io.h"
#include "stdlib.h"
//----------------------------------------------------------------------------------------------
short int Blink[10],PButtons[10],Ant=4,ii,NumOfCorr,AddBlink=0;
//----------------------------------------------------------------------------------------------
void Delay(short int,short int);
void RandomNumbers(short int);
void Blinky(void);
short int PushButtons(short int);
static unsigned long seed = 1;
//----------------------------------------------------------------------------------------------
#define bit_get(p,m) ((p) & (m))
#define bit_set(p,m) ((p) |= (m))
#define bit_clear(p,m) ((p) &= ~(m))
#define bit_flip(p,m) ((p) ^= (m))
#define LED_1_ON bit_set(PORTB,2);
#define LED_2_ON bit_set(PORTB,4);
#define LED_3_ON bit_set(PORTB,8);
#define LED_4_ON bit_set(PORTD,64);
#define LED_OK_ON bit_set(PORTD,16);
#define LED_NOT_OK_ON bit_set(PORTD,32);
#define LED_1_OFF bit_clear(PORTB,2);
#define LED_2_OFF bit_clear(PORTB,4);
#define LED_3_OFF bit_clear(PORTB,8);
#define LED_4_OFF bit_clear(PORTD,64);
#define LED_OK_OFF bit_clear(PORTD,16);
#define LED_NOT_OK_OFF bit_clear(PORTD,32);
#define P_BUTTON_1 bit_get(PIND,1)
#define P_BUTTON_2 bit_get(PIND,2)
#define P_BUTTON_3 bit_get(PIND,4)
#define P_BUTTON_4 bit_get(PIND,8)
# define F_CPU 1000000UL
//----------------------------------------------------------------------------------------------
void main (void)
{
DDRB=0xFF;
DDRD=0x70;
for(ii=0;ii<4;ii++) //Blinkningar för att visa att spelet kan börja.
{
LED_OK_ON;
for(short int jj=0;jj<2;jj++)
_delay_ms(250);
LED_OK_OFF;
for(short int jj=0;jj<2;jj++)
_delay_ms(250);
}
while(1)
{
if(AddBlink==6) //Om man gissat rätt sex gånger ökas blinkningarna med ett.
{
Ant++;
AddBlink=0;
}
RandomNumbers(Ant); //Slumpgenerering.
Blinky(); //Visar rätt blinkkombination.
NumOfCorr=PushButtons(Ant); //Läser in och rättar gissningarna.
if(NumOfCorr==1) //Om rätt rad matats in blinkar grön lysdiod.
{
for(ii=0;ii<5;ii++)
{
LED_OK_ON;
for(short int jj=0;jj<4;jj++)
_delay_ms(250);
LED_OK_OFF;
for(short int jj=0;jj<4;jj++)
_delay_ms(250);
}
AddBlink++; //Lägger till ett för att hålla reda på rätt gissningar.
}
if(NumOfCorr==0) //Om fel rad matats in blinkar röd lysdiod.
{
for(ii=0;ii<4;ii++)
{
LED_NOT_OK_ON;
for(short int jj=0;jj<4;jj++)
_delay_ms(250);
LED_NOT_OK_OFF;
for(short int jj=0;jj<4;jj++)
_delay_ms(250);
}
}
}
}
//----------------------------------------------------------------------------------------------
void RandomNumbers(short int NumRan)
{
seed = seed * 1103515245 + 12345; //Generera en seed
srand(seed);
for(ii=0;ii<NumRan;ii++) //Generera slumpvis blinkningar
Blink[ii]=random()%(5-1)+1;
}
//----------------------------------------------------------------------------------------------
void Blinky(void)
{
//Blinkar rätt slumpgenererade kombination:
for(short int ii=0;ii<Ant;ii++)
{
if(Blink[ii]==1)
{
LED_1_ON;
for(short int jj=0;jj<6;jj++)
_delay_ms(250);
LED_1_OFF;
}
if(Blink[ii]==2)
{
LED_2_ON;
for(short int jj=0;jj<6;jj++)
_delay_ms(250);
LED_2_OFF;
}
if(Blink[ii]==3)
{
LED_3_ON;
for(short int jj=0;jj<6;jj++)
_delay_ms(250);
LED_3_OFF;
}
if(Blink[ii]==4)
{
LED_4_ON;
for(short int jj=0;jj<6;jj++)
_delay_ms(250);
LED_4_OFF;
}
LED_1_OFF;
LED_2_OFF;
LED_3_OFF;
LED_4_OFF;
for(short int jj=0;jj<5;jj++)
_delay_ms(250);
}
}
//----------------------------------------------------------------------------------------------
short int PushButtons(short int Ant)
{
//Tänder lysdioderna då det är dags att knappa in sína gissningar:
LED_OK_ON;
LED_NOT_OK_ON;
ii = 0;
while(ii<Ant)
{
if(P_BUTTON_1) //Om knapp 1 trycks ned.
{
LED_1_ON;
_delay_ms(15); //15 ms fördröjning som fungerar som en slags debounce.
LED_1_OFF;
if(P_BUTTON_1) //debounce. Om knappen fortfarande är nedtryckt.
{
PButtons[ii]=1;
ii++;
}
while(P_BUTTON_1) //Medan knapp 1 är nedtryckt blinkar motsvarande lysdiod.
{
LED_1_ON;
_delay_ms(25);
LED_1_OFF;
_delay_ms(25);
}
}
if(P_BUTTON_2) //Om knapp 2 trycks ned.
{
LED_2_ON;
_delay_ms(15);
LED_2_OFF;
if(P_BUTTON_2) //Debounce. Om knappen fortfarande är nedtryckt.
{
PButtons[ii]=2;
ii++;
}
while(P_BUTTON_2) //Medan knapp 2 är nedtryckt blinkar motsvarande lysdiod.
{
LED_2_ON;
_delay_ms(25);
LED_2_OFF;
_delay_ms(25);
}
}
if(P_BUTTON_3) //Om knapp 3 trycks ned.
{
LED_3_ON;
_delay_ms(15);
LED_3_OFF;
if(P_BUTTON_3) //Debounce. Om knappen fortfarande är nedtryckt.
{
PButtons[ii]=3;
ii++;
}
while(P_BUTTON_3) //Medan knapp 3 är nedtryckt blinkar motsvarande lysdiod.
{
LED_3_ON;
_delay_ms(25);
LED_3_OFF;
_delay_ms(25);
}
}
if(P_BUTTON_4) //Om knapp 4 trycks ned.
{
LED_4_ON;
_delay_ms(15);
LED_4_OFF;
if(P_BUTTON_4) //Debounce. Om knappen fortfarande är nedtryckt.
{
PButtons[ii]=4;
ii++;
}
while(P_BUTTON_4) //Medan knapp 2 är nedtryckt blinkar motsvarande lysdiod.
{
LED_4_ON;
_delay_ms(25);
LED_4_OFF;
_delay_ms(25);
}
}
}
LED_OK_OFF;
LED_NOT_OK_OFF; //Inmatningen är avslutad.
for(ii=0;ii<Ant;ii++)//Jämför inmatade gissningar med rätt blinkrad.
{
if(PButtons[ii]!=Blink[ii]) //Om någon av gissningarna är fel returneras "0".
return 0;
}
return 1; //Om alla rätt returneras en "1".
}
Vad tycks?
Någon som har tips på en bättre slumpgenerering tas tips gärna emot.
EDIT: Uppdaterat kod med kommentarer för läsbarhet och förståelse.