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