1 | #include <avr/io.h>
|
2 | #include <util/delay.h>
|
3 | #include <avr/interrupt.h>
|
4 |
|
5 | volatile uint8_t a=0; // Variablen für den Spielchipstand
|
6 | volatile uint8_t b=0;
|
7 | volatile uint8_t c=0;
|
8 | volatile uint8_t d=0;
|
9 | volatile uint8_t Eingang; // Variable welche Lichtschranke ausgelöst hat
|
10 |
|
11 | enum {Spieler_1,Spieler_2,Spieler_3,Spieler_4};
|
12 |
|
13 | void set_output(void) // Funktion für die PWM
|
14 | {
|
15 |
|
16 | DDRB = 0x08; // PB3 auf Ausgang
|
17 | TCCR0 |= (1<<WGM00)|(1<<WGM01) |(1<<COM01)|(1<<CS00); // Timer Einstellungen
|
18 |
|
19 | }
|
20 |
|
21 | ISR(INT1_vect) // Interrupt Routine
|
22 |
|
23 | if (~PINB & (1<<PB4)) // Abfrage Lichtschranke 1
|
24 | {
|
25 | Eingang=Spieler_1;
|
26 | a++; // Chipstand aktualisieren
|
27 | }
|
28 | if (~PINB & (1<<PB5)) // Abfrage Lichtschranke 2
|
29 | {
|
30 | Eingang=Spieler_2;
|
31 | b++; // Chipstand aktualisieren
|
32 |
|
33 | if (~PINB & (1<<PB6)) // Abfrage Lichtschrane 3
|
34 | {
|
35 | Eingang=Spieler_3;
|
36 | c++; // Chipstand aktualisieren
|
37 | }
|
38 | if (~PINB & (1<<PB7)) // Abfrage Lichtschranke 4
|
39 | {
|
40 | Eingang=Spieler_4;
|
41 | d++; // Aktueller Chipstand
|
42 | }
|
43 | switch (Eingang)
|
44 | {
|
45 | case Spieler_1:
|
46 | switch (a)
|
47 | {
|
48 | case 1: // 1 Spielchip verloren
|
49 | PORTA = (PORTA | (1 << PA4)) & ~(1 << PA0); // LED gruen aus und LED gelb an
|
50 | break;
|
51 | case 2: // 2 Spielchip verloren
|
52 | PORTA &= ~(1<<PA4); // LED gelb aus
|
53 | PORTC |= (1<<PC7); // LED rot ein
|
54 | break;
|
55 | case 3: // 3 Spielchip
|
56 | PORTC &= (1<<PC7); // LED rot aus
|
57 | break;
|
58 | default:
|
59 | break;
|
60 | }
|
61 | break;
|
62 | case Spieler_2:
|
63 | switch (b)
|
64 | {
|
65 | case 1: // 1 Spielchip verloren
|
66 | PORTA = (PORTA | (1 << PA5)) & ~(1 << PA1); // LED gruen aus und LED gelb an
|
67 | break;
|
68 | case 2: // 2 Spielchip verloren
|
69 | PORTA &= ~(1<<PA5); // LED gelb aus
|
70 | PORTC |= (1<<PC6); // LED rot ein
|
71 | break;
|
72 | case 3: // 3 Spielchip verloren
|
73 | PORTC &= (1<<PC6); // LED rot aus
|
74 | break;
|
75 | default:
|
76 | break;
|
77 | }
|
78 | break;
|
79 | case Spieler_3:
|
80 | switch (c)
|
81 | {
|
82 | case 1: // 1 Spielchip verloren
|
83 | PORTA = (PORTA | (1 << PA6)) & ~(1 << PA2); // LED gruen aus und LED gelb ein
|
84 | break;
|
85 | case 2: // 2 Spielchip verloren
|
86 | PORTA &= ~(1<<PA6); // LED gelb aus
|
87 | PORTC |= (1<<PC5); // LED rot ein
|
88 | break;
|
89 | case 3: // 3 Spielchip verloren
|
90 | PORTC &= (1<<PC5); // LED rot aus
|
91 | break;
|
92 | default:
|
93 | break;
|
94 | }
|
95 | break;
|
96 | case Spieler_4:
|
97 | switch (d)
|
98 | {
|
99 | case 1: // 1 Spielchip verloren
|
100 | PORTA = (PORTA | (1 << PA7)) & ~(1 << PA3); // LED gruen aus und LED gelb ein
|
101 | break;
|
102 | case 2: // 2 Spielchip verloren
|
103 | PORTA &= ~(1<<PA7); // LED gelb aus
|
104 | PORTC |= (1<<PC4); // LED rot ein
|
105 | break;
|
106 | case 3: // 3 Spielchip verloren
|
107 | PORTC &= (1<<PC4); // LED rot aus
|
108 | break;
|
109 | default:
|
110 | break;
|
111 | }
|
112 | break;
|
113 | }
|
114 | }
|
115 |
|
116 | int main(void) // Hauptprogramm
|
117 | {
|
118 | MCUCR |= (1<<ISC10)|(1<<ISC11); // Steigende Flanke an INT1 erzeugt Interrupt
|
119 | GICR |= (1<<INT1); // INT 1 erlaube Interrupt Request
|
120 | DDRB = 0x00; // PortB auf Eingang
|
121 | DDRA = 0xFF; // PortA auf Ausgang
|
122 | DDRC = 0xF0; // PC4-PC7 auf Ausgang
|
123 | PORTA = 0x0F; // PA0-PA3 auf "high"
|
124 | PORTC = 0x00; // PortC auf "low"
|
125 | int max_value=5; // Max. Variable für rand Funktion
|
126 | int value = 0; // Min. Variable für rand Funktion
|
127 | int max_value_2=5; // Max. Variable für rand Funktion
|
128 | int value_2 = 0; // Min. Variable für rand Funktion
|
129 | sei (); // Globale Interruptfreigabe
|
130 |
|
131 | while(1) // Hauptschleife
|
132 | {
|
133 | value = (rand()%max_value); // Zufallsauswahl für Geschwindigkeit
|
134 |
|
135 | switch (value)
|
136 | {
|
137 |
|
138 | case 1: set_output(); // Geschwindigkeitsstufe 1 (Langsamste)
|
139 | OCR0 = 64;
|
140 | break;
|
141 |
|
142 | case 2: set_output(); // Geschwindigkeitsstufe 2
|
143 | OCR0 = 128;
|
144 | break;
|
145 |
|
146 | case 3: set_output(); // Geschwindigkeitsstufe 3
|
147 | OCR0 = 192;
|
148 | break;
|
149 |
|
150 | case 4: set_output(); // Geschwindigkeitsstufe 4 (Schnellste)
|
151 | OCR0 = 255;
|
152 | break;
|
153 |
|
154 | default:
|
155 | break;
|
156 |
|
157 | }
|
158 |
|
159 | value_2 = (rand()%max_value_2); // Zufallsauswahl für Wartezeit
|
160 |
|
161 | switch (value_2)
|
162 | {
|
163 | case 1: // Wartezeit zum nächsten Wechsel 1 Sekunde
|
164 | _delay_ms(1000);
|
165 | break;
|
166 |
|
167 | case 2: // Wartezeit zum nächsten Wechsel 2 Sekunde
|
168 | _delay_ms(2000);
|
169 | break;
|
170 |
|
171 | case 3:
|
172 | _delay_ms(3000); // Wartezeit zum nächsten Wechsel 3 Sekunde
|
173 | break;
|
174 |
|
175 | case 4:
|
176 | _delay_ms(4000); // Wartezeit zum nächsten Wechsel 4 Sekunde
|
177 | break;
|
178 |
|
179 | default:
|
180 | _delay_ms(2500); // Wartezeit zum nächsten Wechsel 2,5 Sekunde
|
181 | break;
|
182 | }
|
183 | }
|
184 | }
|