1 | #ifndef F_CPU
|
2 | /* Definiere F_CPU, wenn F_CPU nicht bereits vorher definiert
|
3 | (z. B. durch Übergabe als Parameter zum Compiler innerhalb
|
4 | des Makefiles). Zusätzlich Ausgabe einer Warnung, die auf die
|
5 | "nachträgliche" Definition hinweist */
|
6 | #warning "F_CPU war noch nicht definiert, wird nun mit 16000000 definiert"
|
7 | #define F_CPU 16000000UL /* Quarz mit 16.0000 Mhz */
|
8 | #endif
|
9 |
|
10 | //Include Befehle
|
11 | #include <avr/io.h>
|
12 | #include <util/delay.h>
|
13 | #include <stdint.h>
|
14 | #include <stdlib.h>
|
15 | #include <avr/interrupt.h>
|
16 |
|
17 |
|
18 | /*##################################
|
19 | Deklaration von WERTEN, siehe https://spreadsheets.google.com/ccc?key=0ApVkwGSItH4tdHowd0ZPLWFTQVMyOTFmejhoSDhiUnc&hl=en&authkey=CKvg5NIE
|
20 | ##################################*/
|
21 |
|
22 | #define CLK 16000000
|
23 | #define PRESCALER_TIMER_0 1
|
24 | #define PRESCALER_TIMER_2 1
|
25 | #define PWM_MAX 256 //Bis hierhin zählt die PWM
|
26 | #define TIMER_MAX 256 //Bis hierhin zählt der Timer
|
27 |
|
28 | #define TIMER_FREQ 31250
|
29 | #define PWM_FREQ 31128.4046692607 // clk/(prescaler(1 + OCR))
|
30 | #define FAIL 500
|
31 |
|
32 | //Spielmodi
|
33 | #define FRENCH 0
|
34 | #define BAROCK 1
|
35 |
|
36 | //Tonfrequenzen bei French
|
37 | #define FRENCH_F0 348.444444444444
|
38 | #define FRENCH_G0 392
|
39 | #define FRENCH_GIS0 418.133333333333
|
40 | #define FRENCH_A0 441
|
41 | #define FRENCH_B0 470.4
|
42 | #define FRENCH_H0 490
|
43 | #define FRENCH_C0 522.666666666667
|
44 | #define FRENCH_CIS0 551.25
|
45 | #define FRENCH_D0 588
|
46 | #define FRENCH_DIS0 627.2
|
47 | #define FRENCH_E0 653.333333333333
|
48 | #define FRENCH_F1 696.888888888889
|
49 | #define FRENCH_FIS1 735
|
50 | #define FRENCH_G1 784
|
51 | //Tonfrequenzen bei Barock
|
52 | #define BAROCK_C0 264
|
53 | #define BAROCK_D0 297
|
54 | #define BAROCK_DIS0 316.8
|
55 | #define BAROCK_E0 334.125
|
56 | #define BAROCK_F0 356.4
|
57 | #define BAROCK_FIS0 371.25
|
58 | #define BAROCK_G0 396
|
59 | #define BAROCK_GIS0 417.65625
|
60 | #define BAROCK_A0 445.5
|
61 | #define BAROCK_B0 475.2
|
62 | #define BAROCK_H0 495
|
63 | #define BAROCK_C1 528
|
64 | #define BAROCK_CIS1 556.875
|
65 | #define BAROCK_D1 594
|
66 |
|
67 | //Additionen bei French
|
68 | #define ADD_FF0 11.4178275555555
|
69 | #define ADD_FG0 12.845056
|
70 | #define ADD_FGIS0 13.7013930666667
|
71 | #define ADD_FA0 14.450688
|
72 | #define ADD_FB0 15.4140672
|
73 | #define ADD_FH0 16.05632
|
74 | #define ADD_FC0 17.1267413333333
|
75 | #define ADD_FCIS0 18.06336
|
76 | #define ADD_FD0 19.267584
|
77 | #define ADD_FDIS0 20.5520896
|
78 | #define ADD_FE0 21.4084266666667
|
79 | #define ADD_FF1 22.8356551111111
|
80 | #define ADD_FFIS1 24.08448
|
81 | #define ADD_FG1 25.690112
|
82 | //Additionen bei Barock
|
83 | #define ADD_BC0 8.650752
|
84 | #define ADD_BD0 9.732096
|
85 | #define ADD_BDIS0 10.3809024
|
86 | #define ADD_BE0 10.948608
|
87 | #define ADD_BF0 11.6785152
|
88 | #define ADD_BFIS0 12.16512
|
89 | #define ADD_BG0 12.976128
|
90 | #define ADD_BGIS0 13.68576
|
91 | #define ADD_BA0 14.598144
|
92 | #define ADD_BB0 15.5713536
|
93 | #define ADD_BH0 16.22016
|
94 | #define ADD_BC1 17.301504
|
95 | #define ADD_BCIS1 18.24768
|
96 | #define ADD_BD1 19.464192
|
97 |
|
98 | //Dauertöne
|
99 | #define DAUERC 4.325376
|
100 | #define DAUERD 4.866048
|
101 | #define DAUERG 3.211264
|
102 | /*##################################
|
103 | Deklarationen
|
104 | ##################################*/
|
105 | //Funktionen
|
106 | void blinky();
|
107 | void dauerton();
|
108 | int init();
|
109 |
|
110 | //Globale Variablen
|
111 | volatile unsigned long addition = 0;
|
112 | volatile unsigned long daueradd = 0;
|
113 | volatile char flag = 0;
|
114 |
|
115 |
|
116 | int main( void )
|
117 | { //IO
|
118 | DDRB = 0xff; //Port B als Ausgang
|
119 | DDRD = 0x00; //Port D als Eingang
|
120 | DDRA = 0b11110100; //nur Pin 1,2,4 als eingang
|
121 |
|
122 | //TIMER 0 => PWM
|
123 | TCCR0 = 0; //definiert 0
|
124 | TCCR0 |= (1<<WGM01)|(1<<WGM00); //FAST PWM 8bit
|
125 | TCCR0 |= (1<<COM01); //Nicht invertierend
|
126 | TCCR0 |= (1<<CS00); //Prescalen: clk / 1
|
127 |
|
128 | OCR0 = 0x00; //Vergleichswert, 8bit
|
129 |
|
130 |
|
131 | //Timer 1 => Metronom (16 Bit, manipulation von "flag"), zählt von Bottom to Top (CTC) (stored in OCR1A)
|
132 | TCCR1A = 0;
|
133 | TCCR1A |= (1<<WGM12); //CTC TOP = OCR1A, TOV SET On Max
|
134 | TCCR1A |= (1<<COM1A0); //Toggle
|
135 |
|
136 | TCCR1B = 0;
|
137 | TCCR1B |= (1<<CS12)|(1<<CS10); // Prescaler = 1024
|
138 |
|
139 |
|
140 |
|
141 | //Timer2 für OCR0 Befüllung / Sägezahnerzeugung
|
142 | TCCR2 = 0;
|
143 | TCCR2 |= (1<<CS20); //Vorteiler = 1;
|
144 | TIMSK |= (1<<TOIE2); //Nach jedem Oferflow wird ein Interrupt gestartet
|
145 |
|
146 | sei(); //Globale Interrupts erlauben, Interrupts via ISR();
|
147 |
|
148 |
|
149 | //Variablen
|
150 | char mode = BAROCK;
|
151 | int metronom = 0;
|
152 | //init
|
153 | metronom = init(); //format: ms*10
|
154 | OCR1A = (metronom*156.25);
|
155 |
|
156 | if (PINA & 0b00001000) {
|
157 | mode = FRENCH;
|
158 | }
|
159 |
|
160 | while( 1 ) { // Endlosschleife
|
161 |
|
162 | if (mode == FRENCH){ //if =>french
|
163 | switch(PIND){ //Griffabfrage + Add abfrage (1mhz / 256) => ISR löst 3906,25 mal / sek aus. ### [hz*256(pwm schritte)] / 3906,25 ergibt addition pro isr
|
164 | case 0b11111111 : addition = ADD_FF0 ; break; //F0
|
165 | case 0b11111110 : addition = ADD_FG0 ; break; //G0
|
166 | case 0b11111100 : addition = ADD_FA0 ; break; //A0
|
167 | case 0b11111000 : addition = ADD_FB0 ; break; //B0
|
168 | case 0b11110100 : addition = ADD_FH0 ; break; //H0
|
169 | case 0b11100100 : addition = ADD_FC0 ; break; //C0
|
170 | case 0b11010100 : addition = ADD_FCIS0 ; break; //Cis0
|
171 | case 0b11011110 : addition = ADD_FD0 ; break; //D0
|
172 | case 0b10100100 : addition = ADD_FDIS0 ; break; //Dis0
|
173 | case 0b10011110 : addition = ADD_FE0 ; break; //E0
|
174 |
|
175 | case 0b01011110 : addition = ADD_FF1 ; break; //F1
|
176 | case 0b00011110 : addition = ADD_FFIS1 ; break; //Fis1
|
177 | case 0b01111110 : addition = ADD_FF1 ; break; //g1 =>Zeigefinger statt Daumen weg
|
178 | default : addition = FAIL;
|
179 |
|
180 | } //end Griffabfrage
|
181 | } //end if
|
182 | else if (mode == BAROCK){ //if =>Barock
|
183 | switch(PIND){ //Griffabfrage + Add abfrage (1mhz / 256) => ISR löst 3906,25 mal / sek aus. ### [hz*256(pwm schritte)] / 3906,25 ergibt addition pro isr
|
184 | case 0b11111111 : addition = ADD_BC0 ; break; //C0
|
185 | case 0b11111110 : addition = ADD_BD0 ; break; //D0
|
186 | case 0b11111100 : addition = ADD_BE0 ; break;//E0
|
187 | case 0b11111000 : addition = ADD_BF0 ; break;//F0
|
188 | case 0b11110111 : addition = ADD_BFIS0 ; break; //Fis0
|
189 | case 0b11110000 : addition = ADD_BG0 ; break; //G0
|
190 | case 0b11101100 : addition = ADD_BGIS0 ; break; //Gis0
|
191 | case 0b11100000 : addition = ADD_BA0 ; break; //A0
|
192 | case 0b11010000 : addition = ADD_BB0 ; break; //B0
|
193 | case 0b11000000 : addition = ADD_BH0 ; break; //H0
|
194 | case 0b10100000 : addition = ADD_BC1 ; break; //C1
|
195 | case 0b10000000 : addition = ADD_BCIS1 ; break; //Cis1
|
196 | case 0b00100000 : addition = ADD_BD1 ; break; //D1 =>Zeigefinger statt Daumen weg
|
197 | default : addition = FAIL ; break;
|
198 | } //end Griffabfrage
|
199 | }//end else
|
200 | if (flag == 1) {
|
201 | PORTB ^= (1<<PB2);
|
202 | flag = 0;
|
203 | }//end if flag
|
204 | } // end while (1)
|
205 |
|
206 | return 0;
|
207 | } //end main
|
208 |
|
209 |
|
210 | ISR( TIMER2_OVF_vect ){
|
211 | static double tmp;
|
212 |
|
213 | if (daueradd != 0){
|
214 | tmp += (addition + daueradd);
|
215 | if (tmp >= 256) tmp-=256;
|
216 | OCR0 = (int) ((tmp+0.5)/2);
|
217 | return;
|
218 | }
|
219 |
|
220 | if (addition == FAIL){ //Stummschaltung bei falschen/ keinen Griffen
|
221 | OCR0 = 0;
|
222 | return;
|
223 | }
|
224 |
|
225 | tmp += addition;
|
226 | if (tmp >= 256) tmp-=256;
|
227 | OCR0 = (int) (tmp+0.5);
|
228 | }
|
229 |
|
230 | ISR( TIMER1_OVF_vect ){
|
231 | flag = 1;
|
232 | }
|
233 | /*#################################
|
234 | init
|
235 | #################################*/
|
236 |
|
237 | int init(){
|
238 | int tmp; //metronom return
|
239 | int tmp1 = 0; //status taster
|
240 |
|
241 | _delay_ms(5000);
|
242 |
|
243 | if (PINA & 0x01) {
|
244 | daueradd = DAUERC;
|
245 | }
|
246 |
|
247 | if (PINA & 0x02) {
|
248 | daueradd = DAUERD;
|
249 | }
|
250 |
|
251 | if (PINA & 0x03) {
|
252 | daueradd = DAUERG;
|
253 | }
|
254 |
|
255 | _delay_ms(100);
|
256 | addition = DAUERC;
|
257 | _delay_ms(1000);
|
258 | addition = FAIL;
|
259 |
|
260 | while (1){
|
261 | if ((PINA & 0x01) | (PINA & 0x02) | (PINA & 0x03)){
|
262 | tmp1 = PINA;
|
263 | for (tmp = 0; tmp<419; tmp++){
|
264 | if (tmp1 != PINA){return tmp;}
|
265 | _delay_ms(10);
|
266 | }//end for
|
267 | return 0;
|
268 | }//end if
|
269 |
|
270 | _delay_ms(100);
|
271 | if (tmp1 == 50){
|
272 | return 0;
|
273 | }
|
274 | tmp1++;
|
275 | }// end while 1
|
276 | } //end init
|