Code:
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
volatile uint8_t a=0; // Variablen für den Spielchipstand
volatile uint8_t b=0;
volatile uint8_t c=0;
volatile uint8_t d=0;
volatile uint8_t Eingang; // Variable welche Lichtschranke ausgelöst hat
enum {Spieler_1,Spieler_2,Spieler_3,Spieler_4};
void set_output(void) // Funktion für die PWM
{
DDRB = 0x08; // PB3 auf Ausgang
TCCR0 |= (1<<WGM00)|(1<<WGM01) |(1<<COM01)|(1<<CS00); // Timer Einstellungen
}
ISR(INT1_vect) // Interrupt Routine
if (~PINB & (1<<PB4)) // Abfrage Lichtschranke 1
{
Eingang=Spieler_1;
a++; // Chipstand aktualisieren
}
if (~PINB & (1<<PB5)) // Abfrage Lichtschranke 2
{
Eingang=Spieler_2;
b++; // Chipstand aktualisieren
if (~PINB & (1<<PB6)) // Abfrage Lichtschrane 3
{
Eingang=Spieler_3;
c++; // Chipstand aktualisieren
}
if (~PINB & (1<<PB7)) // Abfrage Lichtschranke 4
{
Eingang=Spieler_4;
d++; // Aktueller Chipstand
}
switch (Eingang)
{
case Spieler_1:
switch (a)
{
case 1: // 1 Spielchip verloren
PORTA = (PORTA | (1 << PA4)) & ~(1 << PA0); // LED gruen aus und LED gelb an
break;
case 2: // 2 Spielchip verloren
PORTA &= ~(1<<PA4); // LED gelb aus
PORTC |= (1<<PC7); // LED rot ein
break;
case 3: // 3 Spielchip
PORTC &= (1<<PC7); // LED rot aus
break;
default:
break;
}
break;
case Spieler_2:
switch (b)
{
case 1: // 1 Spielchip verloren
PORTA = (PORTA | (1 << PA5)) & ~(1 << PA1); // LED gruen aus und LED gelb an
break;
case 2: // 2 Spielchip verloren
PORTA &= ~(1<<PA5); // LED gelb aus
PORTC |= (1<<PC6); // LED rot ein
break;
case 3: // 3 Spielchip verloren
PORTC &= (1<<PC6); // LED rot aus
break;
default:
break;
}
break;
case Spieler_3:
switch (c)
{
case 1: // 1 Spielchip verloren
PORTA = (PORTA | (1 << PA6)) & ~(1 << PA2); // LED gruen aus und LED gelb ein
break;
case 2: // 2 Spielchip verloren
PORTA &= ~(1<<PA6); // LED gelb aus
PORTC |= (1<<PC5); // LED rot ein
break;
case 3: // 3 Spielchip verloren
PORTC &= (1<<PC5); // LED rot aus
break;
default:
break;
}
break;
case Spieler_4:
switch (d)
{
case 1: // 1 Spielchip verloren
PORTA = (PORTA | (1 << PA7)) & ~(1 << PA3); // LED gruen aus und LED gelb ein
break;
case 2: // 2 Spielchip verloren
PORTA &= ~(1<<PA7); // LED gelb aus
PORTC |= (1<<PC4); // LED rot ein
break;
case 3: // 3 Spielchip verloren
PORTC &= (1<<PC4); // LED rot aus
break;
default:
break;
}
break;
}
}
int main(void) // Hauptprogramm
{
MCUCR |= (1<<ISC10)|(1<<ISC11); // Steigende Flanke an INT1 erzeugt Interrupt
GICR |= (1<<INT1); // INT 1 erlaube Interrupt Request
DDRB = 0x00; // PortB auf Eingang
DDRA = 0xFF; // PortA auf Ausgang
DDRC = 0xF0; // PC4-PC7 auf Ausgang
PORTA = 0x0F; // PA0-PA3 auf "high"
PORTC = 0x00; // PortC auf "low"
int max_value=5; // Max. Variable für rand Funktion
int value = 0; // Min. Variable für rand Funktion
int max_value_2=5; // Max. Variable für rand Funktion
int value_2 = 0; // Min. Variable für rand Funktion
sei (); // Globale Interruptfreigabe
while(1) // Hauptschleife
{
value = (rand()%max_value); // Zufallsauswahl für Geschwindigkeit
switch (value)
{
case 1: set_output(); // Geschwindigkeitsstufe 1 (Langsamste)
OCR0 = 64;
break;
case 2: set_output(); // Geschwindigkeitsstufe 2
OCR0 = 128;
break;
case 3: set_output(); // Geschwindigkeitsstufe 3
OCR0 = 192;
break;
case 4: set_output(); // Geschwindigkeitsstufe 4 (Schnellste)
OCR0 = 255;
break;
default:
break;
}
value_2 = (rand()%max_value_2); // Zufallsauswahl für Wartezeit
switch (value_2)
{
case 1: // Wartezeit zum nächsten Wechsel 1 Sekunde
_delay_ms(1000);
break;
case 2: // Wartezeit zum nächsten Wechsel 2 Sekunde
_delay_ms(2000);
break;
case 3:
_delay_ms(3000); // Wartezeit zum nächsten Wechsel 3 Sekunde
break;
case 4:
_delay_ms(4000); // Wartezeit zum nächsten Wechsel 4 Sekunde
break;
default:
_delay_ms(2500); // Wartezeit zum nächsten Wechsel 2,5 Sekunde
break;
}
}
}
Lesezeichen