init
This commit is contained in:
commit
3cb1d71747
91
Aufgabe_3_1_2/sketch_nov3a/sketch_nov3a.ino
Normal file
91
Aufgabe_3_1_2/sketch_nov3a/sketch_nov3a.ino
Normal file
|
@ -0,0 +1,91 @@
|
|||
#include <avr/io.h> /* Hardware-Definitionen */
|
||||
#include <util/delay.h>
|
||||
#include <stdint.h> /* Für uint8_t */
|
||||
#include "keys.h" /* Notennummern und -dauern */
|
||||
|
||||
/* Anzahl der Einzelschritte in der Melodie */
|
||||
#define NOTE_COUNT 71
|
||||
|
||||
/* Tempo in Schlägen pro Minute */
|
||||
#define TEMPO 103
|
||||
|
||||
|
||||
uint8_t note_pitches[NOTE_COUNT] = {
|
||||
KEY_G3, KEY_G3, KEY_G3, KEY_Eb3, KEY_Bb3,
|
||||
KEY_G3, KEY_Eb3, KEY_B3, KEY_G3,
|
||||
KEY_D4, KEY_D4, KEY_D4, KEY_Eb4, KEY_Bb3,
|
||||
KEY_Gb3, KEY_Eb3, KEY_Bb3, KEY_G3,
|
||||
|
||||
KEY_G4, KEY_G3, KEY_G3, KEY_G4, KEY_Fis4, KEY_F4,
|
||||
KEY_E4, KEY_Dis4, KEY_E4, PAUSE, KEY_Gis3, KEY_Cis4, KEY_C4, KEY_B3,
|
||||
KEY_Bb3, KEY_A3, KEY_Bb3, PAUSE, KEY_Eb3, KEY_Gb3, KEY_Eb3, KEY_Gb3,
|
||||
KEY_G3, KEY_G3, KEY_Bb3, KEY_D4,
|
||||
|
||||
KEY_G4, KEY_G3, KEY_G3, KEY_G4, KEY_Fis4, KEY_F4,
|
||||
KEY_E4, KEY_Dis4, KEY_E4, PAUSE, KEY_Gis3, KEY_Cis4, KEY_C4, KEY_B3,
|
||||
KEY_Bb3, KEY_A3, KEY_Bb3, PAUSE, KEY_Eb3, KEY_Gb3, KEY_Eb3, KEY_Bb3,
|
||||
|
||||
KEY_G3, KEY_Eb3, KEY_Bb3, KEY_G3,
|
||||
|
||||
PAUSE
|
||||
};
|
||||
|
||||
/* Tonlängen (in 1/48-Noten) */
|
||||
uint8_t note_durations[NOTE_COUNT] = {
|
||||
DUR_4th, DUR_4th, DUR_4th, DUR_8th_dot, DUR_16th,
|
||||
DUR_4th, DUR_8th_dot, DUR_16th, DUR_half,
|
||||
DUR_4th, DUR_4th, DUR_4th, DUR_8th_dot, DUR_16th,
|
||||
|
||||
DUR_4th, DUR_8th_dot, DUR_16th, DUR_half,
|
||||
DUR_4th, DUR_8th_dot, DUR_16th, DUR_4th, DUR_8th_dot, DUR_16th,
|
||||
DUR_16th, DUR_16th, DUR_8th, DUR_8th, DUR_8th, DUR_4th, DUR_8th_dot, DUR_16th,
|
||||
|
||||
DUR_16th, DUR_16th, DUR_8th, DUR_8th, DUR_8th, DUR_4th, DUR_8th_dot, DUR_16th,
|
||||
DUR_4th, DUR_8th_dot, DUR_16th, DUR_half,
|
||||
DUR_4th, DUR_8th_dot, DUR_16th, DUR_4th, DUR_8th_dot, DUR_16th,
|
||||
|
||||
DUR_16th, DUR_16th, DUR_8th, DUR_8th, DUR_8th, DUR_4th, DUR_8th_dot, DUR_16th,
|
||||
DUR_16th, DUR_16th, DUR_8th, DUR_8th, DUR_8th, DUR_4th, DUR_8th_dot, DUR_16th,
|
||||
DUR_4th, DUR_8th_dot, DUR_16th, DUR_half,
|
||||
|
||||
DUR_whole
|
||||
};
|
||||
|
||||
int main(int argc, char** argv) {
|
||||
|
||||
|
||||
// Tasterpin als Eingang konfigurieren
|
||||
DDRD &= ~(1 << 6);
|
||||
// Pull-up Widerstand für den Taster aktivieren
|
||||
PORTD |= (1 << 6);
|
||||
|
||||
int i = 2;
|
||||
|
||||
bool pressed = false;
|
||||
|
||||
while (1) {
|
||||
|
||||
if (!(PIND & (1 << 6))) {
|
||||
pressed = true;
|
||||
}
|
||||
|
||||
if(pressed) {
|
||||
|
||||
DDRD = (1<<i);
|
||||
|
||||
PORTD |= (1<<i); /* LED an */
|
||||
_delay_ms(250); /* 500ms warten */
|
||||
PORTD &= ~(1<<i); /* LED aus */
|
||||
_delay_ms(250); /* 500ms warten */
|
||||
|
||||
i++;
|
||||
|
||||
if(i == 6) {
|
||||
i = 2;
|
||||
pressed = false;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
return 0;
|
||||
}
|
5
Aufgabe_4/.gitignore
vendored
Normal file
5
Aufgabe_4/.gitignore
vendored
Normal file
|
@ -0,0 +1,5 @@
|
|||
.pio
|
||||
.vscode/.browse.c_cpp.db*
|
||||
.vscode/c_cpp_properties.json
|
||||
.vscode/launch.json
|
||||
.vscode/ipch
|
8
Aufgabe_4/.idea/.gitignore
vendored
Normal file
8
Aufgabe_4/.idea/.gitignore
vendored
Normal file
|
@ -0,0 +1,8 @@
|
|||
# Default ignored files
|
||||
/shelf/
|
||||
/workspace.xml
|
||||
# Editor-based HTTP Client requests
|
||||
/httpRequests/
|
||||
# Datasource local storage ignored files
|
||||
/dataSources/
|
||||
/dataSources.local.xml
|
2
Aufgabe_4/.idea/Aufgabe_4.iml
Normal file
2
Aufgabe_4/.idea/Aufgabe_4.iml
Normal file
|
@ -0,0 +1,2 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<module classpath="CMake" type="CPP_MODULE" version="4" />
|
6
Aufgabe_4/.idea/editor.xml
Normal file
6
Aufgabe_4/.idea/editor.xml
Normal file
|
@ -0,0 +1,6 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="BackendCodeEditorSettings">
|
||||
<option name="/Default/Housekeeping/GlobalSettingsUpgraded/IsUpgraded/@EntryValue" value="true" type="bool" />
|
||||
</component>
|
||||
</project>
|
4
Aufgabe_4/.idea/misc.xml
Normal file
4
Aufgabe_4/.idea/misc.xml
Normal file
|
@ -0,0 +1,4 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="CMakeWorkspace" PROJECT_DIR="$PROJECT_DIR$" />
|
||||
</project>
|
8
Aufgabe_4/.idea/modules.xml
Normal file
8
Aufgabe_4/.idea/modules.xml
Normal file
|
@ -0,0 +1,8 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="ProjectModuleManager">
|
||||
<modules>
|
||||
<module fileurl="file://$PROJECT_DIR$/.idea/Aufgabe_4.iml" filepath="$PROJECT_DIR$/.idea/Aufgabe_4.iml" />
|
||||
</modules>
|
||||
</component>
|
||||
</project>
|
10
Aufgabe_4/.vscode/extensions.json
vendored
Normal file
10
Aufgabe_4/.vscode/extensions.json
vendored
Normal file
|
@ -0,0 +1,10 @@
|
|||
{
|
||||
// See http://go.microsoft.com/fwlink/?LinkId=827846
|
||||
// for the documentation about the extensions.json format
|
||||
"recommendations": [
|
||||
"platformio.platformio-ide"
|
||||
],
|
||||
"unwantedRecommendations": [
|
||||
"ms-vscode.cpptools-extension-pack"
|
||||
]
|
||||
}
|
|
@ -0,0 +1 @@
|
|||
CMakeLists.txt not found in /Users/alexanderlehr/Nextcloud/Studium/Semester 3/Rechnerarchitektur/Aufgabe_4 Select CMakeLists.txt
|
39
Aufgabe_4/include/README
Normal file
39
Aufgabe_4/include/README
Normal file
|
@ -0,0 +1,39 @@
|
|||
|
||||
This directory is intended for project header files.
|
||||
|
||||
A header file is a file containing C declarations and macro definitions
|
||||
to be shared between several project source files. You request the use of a
|
||||
header file in your project source file (C, C++, etc) located in `src` folder
|
||||
by including it, with the C preprocessing directive `#include'.
|
||||
|
||||
```src/main.c
|
||||
|
||||
#include "header.h"
|
||||
|
||||
int main (void)
|
||||
{
|
||||
...
|
||||
}
|
||||
```
|
||||
|
||||
Including a header file produces the same results as copying the header file
|
||||
into each source file that needs it. Such copying would be time-consuming
|
||||
and error-prone. With a header file, the related declarations appear
|
||||
in only one place. If they need to be changed, they can be changed in one
|
||||
place, and programs that include the header file will automatically use the
|
||||
new version when next recompiled. The header file eliminates the labor of
|
||||
finding and changing all the copies as well as the risk that a failure to
|
||||
find one copy will result in inconsistencies within a program.
|
||||
|
||||
In C, the usual convention is to give header files names that end with `.h'.
|
||||
It is most portable to use only letters, digits, dashes, and underscores in
|
||||
header file names, and at most one dot.
|
||||
|
||||
Read more about using header files in official GCC documentation:
|
||||
|
||||
* Include Syntax
|
||||
* Include Operation
|
||||
* Once-Only Headers
|
||||
* Computed Includes
|
||||
|
||||
https://gcc.gnu.org/onlinedocs/cpp/Header-Files.html
|
46
Aufgabe_4/lib/README
Normal file
46
Aufgabe_4/lib/README
Normal file
|
@ -0,0 +1,46 @@
|
|||
|
||||
This directory is intended for project specific (private) libraries.
|
||||
PlatformIO will compile them to static libraries and link into executable file.
|
||||
|
||||
The source code of each library should be placed in a an own separate directory
|
||||
("lib/your_library_name/[here are source files]").
|
||||
|
||||
For example, see a structure of the following two libraries `Foo` and `Bar`:
|
||||
|
||||
|--lib
|
||||
| |
|
||||
| |--Bar
|
||||
| | |--docs
|
||||
| | |--examples
|
||||
| | |--src
|
||||
| | |- Bar.c
|
||||
| | |- Bar.h
|
||||
| | |- library.json (optional, custom build options, etc) https://docs.platformio.org/page/librarymanager/config.html
|
||||
| |
|
||||
| |--Foo
|
||||
| | |- Foo.c
|
||||
| | |- Foo.h
|
||||
| |
|
||||
| |- README --> THIS FILE
|
||||
|
|
||||
|- platformio.ini
|
||||
|--src
|
||||
|- main.c
|
||||
|
||||
and a contents of `src/main.c`:
|
||||
```
|
||||
#include <Foo.h>
|
||||
#include <Bar.h>
|
||||
|
||||
int main (void)
|
||||
{
|
||||
...
|
||||
}
|
||||
|
||||
```
|
||||
|
||||
PlatformIO Library Dependency Finder will find automatically dependent
|
||||
libraries scanning project source files.
|
||||
|
||||
More information about PlatformIO Library Dependency Finder
|
||||
- https://docs.platformio.org/page/librarymanager/ldf.html
|
14
Aufgabe_4/platformio.ini
Normal file
14
Aufgabe_4/platformio.ini
Normal file
|
@ -0,0 +1,14 @@
|
|||
; PlatformIO Project Configuration File
|
||||
;
|
||||
; Build options: build flags, source filter
|
||||
; Upload options: custom upload port, speed and extra flags
|
||||
; Library options: dependencies, extra library storages
|
||||
; Advanced options: extra scripting
|
||||
;
|
||||
; Please visit documentation for the other options and examples
|
||||
; https://docs.platformio.org/page/projectconf.html
|
||||
|
||||
[env:uno]
|
||||
platform = atmelavr
|
||||
board = uno
|
||||
framework = arduino
|
BIN
Aufgabe_4/src/Notenhöhen.xlsx
Normal file
BIN
Aufgabe_4/src/Notenhöhen.xlsx
Normal file
Binary file not shown.
44
Aufgabe_4/src/fuer_elise.h
Normal file
44
Aufgabe_4/src/fuer_elise.h
Normal file
|
@ -0,0 +1,44 @@
|
|||
/* Melodie für "Fuer Elise" von Ludwig van Beethoven (1770-1827) */
|
||||
#ifndef FUER_ELISE_H
|
||||
#define FUER_ELISE_H
|
||||
|
||||
#include <stdint.h> /* Für uint8_t */
|
||||
#include "keys.h" /* Notennummern und -dauern */
|
||||
|
||||
/* Anzahl der Einzelschritte in der Melodie */
|
||||
#define NOTE_COUNT 40
|
||||
|
||||
/* Tempo in Schlägen pro Minute */
|
||||
#define TEMPO 68
|
||||
|
||||
/* Tonhöhen */
|
||||
uint8_t note_pitches[NOTE_COUNT] = {
|
||||
KEY_E5, KEY_Dis5,
|
||||
KEY_E5, KEY_Dis5, KEY_E5, KEY_B4, KEY_D5, KEY_C5,
|
||||
KEY_A4, PAUSE, KEY_C4, KEY_E4, KEY_A4,
|
||||
KEY_B4, PAUSE, KEY_E4, KEY_Gis4, KEY_B4,
|
||||
KEY_C5, PAUSE, KEY_E4, KEY_E5, KEY_Dis5,
|
||||
|
||||
KEY_E5, KEY_Dis5, KEY_E5, KEY_B4, KEY_D5, KEY_C5,
|
||||
KEY_A4, PAUSE, KEY_C4, KEY_E4, KEY_A4,
|
||||
KEY_B4, PAUSE, KEY_D4, KEY_C5, KEY_B4,
|
||||
KEY_A4,
|
||||
};
|
||||
|
||||
/* Tonlängen (in 1/48-Noten) */
|
||||
uint8_t note_durations[NOTE_COUNT] = {
|
||||
/* Zeile 1 */
|
||||
DUR_16th, DUR_16th,
|
||||
DUR_16th, DUR_16th, DUR_16th, DUR_16th, DUR_16th, DUR_16th,
|
||||
DUR_8th, DUR_16th, DUR_16th, DUR_16th, DUR_16th,
|
||||
DUR_8th, DUR_16th, DUR_16th, DUR_16th, DUR_16th,
|
||||
DUR_8th, DUR_16th, DUR_16th, DUR_16th, DUR_16th,
|
||||
|
||||
/* Zeile 2 */
|
||||
DUR_16th, DUR_16th, DUR_16th, DUR_16th, DUR_16th, DUR_16th,
|
||||
DUR_8th, DUR_16th, DUR_16th, DUR_16th, DUR_16th,
|
||||
DUR_8th, DUR_16th, DUR_16th, DUR_16th, DUR_16th,
|
||||
DUR_4th,
|
||||
};
|
||||
|
||||
#endif /* FUER_ELISE_H */
|
57
Aufgabe_4/src/imperial_march.h
Normal file
57
Aufgabe_4/src/imperial_march.h
Normal file
|
@ -0,0 +1,57 @@
|
|||
/* Melodie für den "Imperial March" aus Star Wars (1977) */
|
||||
#ifndef IMPERIAL_MARCH_H
|
||||
#define IMPERIAL_MARCH_H
|
||||
|
||||
#include <stdint.h> /* Für uint8_t */
|
||||
#include "keys.h" /* Notennummern und -dauern */
|
||||
|
||||
/* Anzahl der Einzelschritte in der Melodie */
|
||||
#define NOTE_COUNT 71
|
||||
|
||||
/* Tempo in Schlägen pro Minute */
|
||||
#define TEMPO 103
|
||||
|
||||
/* Tonhöhen */
|
||||
// es, b
|
||||
uint8_t note_pitches[NOTE_COUNT] = {
|
||||
KEY_G3, KEY_G3, KEY_G3, KEY_Eb3, KEY_Bb3,
|
||||
KEY_G3, KEY_Eb3, KEY_B3, KEY_G3,
|
||||
KEY_D4, KEY_D4, KEY_D4, KEY_Eb4, KEY_Bb3,
|
||||
KEY_Gb3, KEY_Eb3, KEY_Bb3, KEY_G3,
|
||||
|
||||
KEY_G4, KEY_G3, KEY_G3, KEY_G4, KEY_Fis4, KEY_F4,
|
||||
KEY_E4, KEY_Dis4, KEY_E4, PAUSE, KEY_Gis3, KEY_Cis4, KEY_C4, KEY_B3,
|
||||
KEY_Bb3, KEY_A3, KEY_Bb3, PAUSE, KEY_Eb3, KEY_Gb3, KEY_Eb3, KEY_Gb3,
|
||||
KEY_G3, KEY_G3, KEY_Bb3, KEY_D4,
|
||||
|
||||
KEY_G4, KEY_G3, KEY_G3, KEY_G4, KEY_Fis4, KEY_F4,
|
||||
KEY_E4, KEY_Dis4, KEY_E4, PAUSE, KEY_Gis3, KEY_Cis4, KEY_C4, KEY_B3,
|
||||
KEY_Bb3, KEY_A3, KEY_Bb3, PAUSE, KEY_Eb3, KEY_Gb3, KEY_Eb3, KEY_Bb3,
|
||||
|
||||
KEY_G3, KEY_Eb3, KEY_Bb3, KEY_G3,
|
||||
|
||||
PAUSE
|
||||
};
|
||||
|
||||
/* Tonlängen (in 1/48-Noten) */
|
||||
uint8_t note_durations[NOTE_COUNT] = {
|
||||
DUR_4th, DUR_4th, DUR_4th, DUR_8th_dot, DUR_16th,
|
||||
DUR_4th, DUR_8th_dot, DUR_16th, DUR_half,
|
||||
DUR_4th, DUR_4th, DUR_4th, DUR_8th_dot, DUR_16th,
|
||||
|
||||
DUR_4th, DUR_8th_dot, DUR_16th, DUR_half,
|
||||
DUR_4th, DUR_8th_dot, DUR_16th, DUR_4th, DUR_8th_dot, DUR_16th,
|
||||
DUR_16th, DUR_16th, DUR_8th, DUR_8th, DUR_8th, DUR_4th, DUR_8th_dot, DUR_16th,
|
||||
|
||||
DUR_16th, DUR_16th, DUR_8th, DUR_8th, DUR_8th, DUR_4th, DUR_8th_dot, DUR_16th,
|
||||
DUR_4th, DUR_8th_dot, DUR_16th, DUR_half,
|
||||
DUR_4th, DUR_8th_dot, DUR_16th, DUR_4th, DUR_8th_dot, DUR_16th,
|
||||
|
||||
DUR_16th, DUR_16th, DUR_8th, DUR_8th, DUR_8th, DUR_4th, DUR_8th_dot, DUR_16th,
|
||||
DUR_16th, DUR_16th, DUR_8th, DUR_8th, DUR_8th, DUR_4th, DUR_8th_dot, DUR_16th,
|
||||
DUR_4th, DUR_8th_dot, DUR_16th, DUR_half,
|
||||
|
||||
DUR_whole
|
||||
};
|
||||
|
||||
#endif /* IMPERIAL_MARCH_H */
|
186
Aufgabe_4/src/keys.h
Normal file
186
Aufgabe_4/src/keys.h
Normal file
|
@ -0,0 +1,186 @@
|
|||
#ifndef KEYS_H
|
||||
#define KEYS_H
|
||||
|
||||
/* Notendauern in 1/96 */
|
||||
#define DUR_16th_tri 4 /* 16tel-Triole */
|
||||
#define DUR_16th 6 /* 16tel-Note */
|
||||
#define DUR_8th_tri 8 /* 8-tel-Note mit Punkt */
|
||||
#define DUR_16th_dot 9 /* 16tel-Note mit Punkt */
|
||||
#define DUR_8th 12 /* 8-tel-Note */
|
||||
#define DUR_4th_tri 16 /* 4-tel-Triole */
|
||||
#define DUR_8th_dot 18 /* 8-tel-Note mit Punkt*/
|
||||
#define DUR_4th 24 /* 4-tel-Note */
|
||||
#define DUR_half_tri 32 /* Halbetriole */
|
||||
#define DUR_4th_dot 36 /* 4-tel-Note mit Punkt */
|
||||
#define DUR_half 48 /* halbe Note */
|
||||
#define DUR_half_dot 72 /* halbe Note mit Punkt */
|
||||
#define DUR_whole 96 /* ganze Note */
|
||||
#define DUR_whole_dot 144 /* ganze Note mit Punkt */
|
||||
|
||||
/* Notennummern */
|
||||
|
||||
/* Pausen-Marker */
|
||||
#define PAUSE 0
|
||||
|
||||
/* Basis-Nummern */
|
||||
#define KEY_C 0
|
||||
#define KEY_Cis 1
|
||||
#define KEY_D 2
|
||||
#define KEY_Dis 3
|
||||
#define KEY_E 4
|
||||
#define KEY_F 5
|
||||
#define KEY_Fis 6
|
||||
#define KEY_G 7
|
||||
#define KEY_Gis 8
|
||||
#define KEY_A 9
|
||||
#define KEY_Ais 10
|
||||
#define KEY_B 11
|
||||
|
||||
|
||||
/* Hilfsmakro für Oktaven-Umrechnung */
|
||||
#define KEY(base, octave) ((base)+12*(octave)-8)
|
||||
|
||||
/* Oktave 0 */
|
||||
#define KEY_A0 KEY(KEY_A, 0)
|
||||
#define KEY_Ais0 KEY(KEY_Ais, 0)
|
||||
#define KEY_Bb0 KEY_Ais0
|
||||
#define KEY_B0 KEY(KEY_B, 0)
|
||||
|
||||
/* Oktave 1 */
|
||||
#define KEY_C1 KEY(KEY_C, 1)
|
||||
#define KEY_Cis1 KEY(KEY_Cis, 1)
|
||||
#define KEY_Db1 KEY_Cis1
|
||||
#define KEY_D1 KEY(KEY_D, 1)
|
||||
#define KEY_Dis1 KEY(KEY_Dis, 1)
|
||||
#define KEY_Eb1 KEY_Dis1
|
||||
#define KEY_E1 KEY(KEY_E, 1)
|
||||
#define KEY_F1 KEY(KEY_F, 1)
|
||||
#define KEY_Fis1 KEY(KEY_Fis, 1)
|
||||
#define KEY_Gb1 KEY_Fis1
|
||||
#define KEY_G1 KEY(KEY_G, 1)
|
||||
#define KEY_Gis1 KEY(KEY_Gis, 1)
|
||||
#define KEY_Ab1 KEY_Gis1
|
||||
#define KEY_A1 KEY(KEY_A, 1)
|
||||
#define KEY_Ais1 KEY(KEY_Ais, 1)
|
||||
#define KEY_Bb1 KEY_Ais1
|
||||
#define KEY_B1 KEY(KEY_B, 1)
|
||||
|
||||
/* Oktave 2 */
|
||||
#define KEY_C2 KEY(KEY_C, 2)
|
||||
#define KEY_Cis2 KEY(KEY_Cis, 2)
|
||||
#define KEY_Db2 KEY_Cis2
|
||||
#define KEY_D2 KEY(KEY_D, 2)
|
||||
#define KEY_Dis2 KEY(KEY_Dis, 2)
|
||||
#define KEY_Eb2 KEY_Dis2
|
||||
#define KEY_E2 KEY(KEY_E, 2)
|
||||
#define KEY_F2 KEY(KEY_F, 2)
|
||||
#define KEY_Fis2 KEY(KEY_Fis, 2)
|
||||
#define KEY_Gb2 KEY_Fis2
|
||||
#define KEY_G2 KEY(KEY_G, 2)
|
||||
#define KEY_Gis2 KEY(KEY_Gis, 2)
|
||||
#define KEY_Ab2 KEY_Gis2
|
||||
#define KEY_A2 KEY(KEY_A, 2)
|
||||
#define KEY_Ais2 KEY(KEY_Ais, 2)
|
||||
#define KEY_Bb2 KEY_Ais2
|
||||
#define KEY_B2 KEY(KEY_B, 2)
|
||||
|
||||
/* Oktave 3 */
|
||||
#define KEY_C3 KEY(KEY_C, 3)
|
||||
#define KEY_Cis3 KEY(KEY_Cis, 3)
|
||||
#define KEY_Db3 KEY_Cis3
|
||||
#define KEY_D3 KEY(KEY_D, 3)
|
||||
#define KEY_Dis3 KEY(KEY_Dis, 3)
|
||||
#define KEY_Eb3 KEY_Dis3
|
||||
#define KEY_E3 KEY(KEY_E, 3)
|
||||
#define KEY_F3 KEY(KEY_F, 3)
|
||||
#define KEY_Fis3 KEY(KEY_Fis, 3)
|
||||
#define KEY_Gb3 KEY_Fis3
|
||||
#define KEY_G3 KEY(KEY_G, 3)
|
||||
#define KEY_Gis3 KEY(KEY_Gis, 3)
|
||||
#define KEY_Ab3 KEY_Gis3
|
||||
#define KEY_A3 KEY(KEY_A, 3)
|
||||
#define KEY_Ais3 KEY(KEY_Ais, 3)
|
||||
#define KEY_Bb3 KEY_Ais3
|
||||
#define KEY_B3 KEY(KEY_B, 3)
|
||||
|
||||
/* Oktave 4 */
|
||||
#define KEY_C4 KEY(KEY_C, 4)
|
||||
#define KEY_Cis4 KEY(KEY_Cis, 4)
|
||||
#define KEY_Db4 KEY_Cis4
|
||||
#define KEY_D4 KEY(KEY_D, 4)
|
||||
#define KEY_Dis4 KEY(KEY_Dis, 4)
|
||||
#define KEY_Eb4 KEY_Dis4
|
||||
#define KEY_E4 KEY(KEY_E, 4)
|
||||
#define KEY_F4 KEY(KEY_F, 4)
|
||||
#define KEY_Fis4 KEY(KEY_Fis, 4)
|
||||
#define KEY_Gb4 KEY_Fis4
|
||||
#define KEY_G4 KEY(KEY_G, 4)
|
||||
#define KEY_Gis4 KEY(KEY_Gis, 4)
|
||||
#define KEY_Ab4 KEY_Gis4
|
||||
#define KEY_A4 KEY(KEY_A, 4)
|
||||
#define KEY_Ais4 KEY(KEY_Ais, 4)
|
||||
#define KEY_Bb4 KEY_Ais4
|
||||
#define KEY_B4 KEY(KEY_B, 4)
|
||||
|
||||
/* Oktave 5 */
|
||||
#define KEY_C5 KEY(KEY_C, 5)
|
||||
#define KEY_Cis5 KEY(KEY_Cis, 5)
|
||||
#define KEY_Db5 KEY_Cis5
|
||||
#define KEY_D5 KEY(KEY_D, 5)
|
||||
#define KEY_Dis5 KEY(KEY_Dis, 5)
|
||||
#define KEY_Eb5 KEY_Dis5
|
||||
#define KEY_E5 KEY(KEY_E, 5)
|
||||
#define KEY_F5 KEY(KEY_F, 5)
|
||||
#define KEY_Fis5 KEY(KEY_Fis, 5)
|
||||
#define KEY_Gb5 KEY_Fis5
|
||||
#define KEY_G5 KEY(KEY_G, 5)
|
||||
#define KEY_Gis5 KEY(KEY_Gis, 5)
|
||||
#define KEY_Ab5 KEY_Gis5
|
||||
#define KEY_A5 KEY(KEY_A, 5)
|
||||
#define KEY_Ais5 KEY(KEY_Ais, 5)
|
||||
#define KEY_Bb5 KEY_Ais5
|
||||
#define KEY_B5 KEY(KEY_B, 5)
|
||||
|
||||
/* Oktave 6 */
|
||||
#define KEY_C6 KEY(KEY_C, 6)
|
||||
#define KEY_Cis6 KEY(KEY_Cis, 6)
|
||||
#define KEY_Db6 KEY_Cis6
|
||||
#define KEY_D6 KEY(KEY_D, 6)
|
||||
#define KEY_Dis6 KEY(KEY_Dis, 6)
|
||||
#define KEY_Eb6 KEY_Dis6
|
||||
#define KEY_E6 KEY(KEY_E, 6)
|
||||
#define KEY_F6 KEY(KEY_F, 6)
|
||||
#define KEY_Fis6 KEY(KEY_Fis, 6)
|
||||
#define KEY_Gb6 KEY_Fis6
|
||||
#define KEY_G6 KEY(KEY_G, 6)
|
||||
#define KEY_Gis6 KEY(KEY_Gis, 6)
|
||||
#define KEY_Ab6 KEY_Gis6
|
||||
#define KEY_A6 KEY(KEY_A, 6)
|
||||
#define KEY_Ais6 KEY(KEY_Ais, 6)
|
||||
#define KEY_Bb6 KEY_Ais6
|
||||
#define KEY_B6 KEY(KEY_B, 6)
|
||||
|
||||
/* Oktave 7 */
|
||||
#define KEY_C7 KEY(KEY_C, 7)
|
||||
#define KEY_Cis7 KEY(KEY_Cis, 7)
|
||||
#define KEY_Db7 KEY_Cis7
|
||||
#define KEY_D7 KEY(KEY_D, 7)
|
||||
#define KEY_Dis7 KEY(KEY_Dis, 7)
|
||||
#define KEY_Eb7 KEY_Dis7
|
||||
#define KEY_E7 KEY(KEY_E, 7)
|
||||
#define KEY_F7 KEY(KEY_F, 7)
|
||||
#define KEY_Fis7 KEY(KEY_Fis, 7)
|
||||
#define KEY_Gb7 KEY_Fis7
|
||||
#define KEY_G7 KEY(KEY_G, 7)
|
||||
#define KEY_Gis7 KEY(KEY_Gis, 7)
|
||||
#define KEY_Ab7 KEY_Gis7
|
||||
#define KEY_A7 KEY(KEY_A, 7)
|
||||
#define KEY_Ais7 KEY(KEY_Ais, 7)
|
||||
#define KEY_Bb7 KEY_Ais7
|
||||
#define KEY_B7 KEY(KEY_B, 7)
|
||||
|
||||
/* Oktave 8 */
|
||||
#define KEY_C8 KEY(KEY_C, 8)
|
||||
|
||||
|
||||
#endif /* KEYS_H */
|
83
Aufgabe_4/src/main.cpp
Normal file
83
Aufgabe_4/src/main.cpp
Normal file
|
@ -0,0 +1,83 @@
|
|||
/*
|
||||
* Tonerzeugung:
|
||||
* - Rechteckwelle wird über Timer1 im CTC-Mode erzeugt.
|
||||
* - Output Compare für OC1A ist Toggle on Compare Match.
|
||||
* - Timer 1 Prescaler wird auf 1/8 gesetzt
|
||||
* - Die halbe Periodendauer schreiben wir in OCR1A.
|
||||
*
|
||||
* Tempo:
|
||||
* - TEMPO gibt die Zahl der 1/4-Notendauern an
|
||||
* - Wir brauchen 1/96-Notendauern.
|
||||
* - Es gibt 24*TEMPO 1/96-Notendauern pro Sekunde.
|
||||
* - Mit dem höchsten Prescaler 1/1024 können wir diese Länge nicht direkt erreichen.
|
||||
* - Wir wählen den Prescaler 1/256 und zählen dann Takte anhand des TOV1-Flags.
|
||||
* - Das entspricht einem Overflow-Takt von ca. 244Hz.
|
||||
*/
|
||||
|
||||
// COM1A1:COM1A0 = 01b (in TCCR1A)
|
||||
// WGM13:WGM10 = 0100b (WGM11:WGM10 in TCCR1A, WGM13:WGM12 in TCCR1B)
|
||||
// CS12:CS10 = 010b (in TCCR1B)
|
||||
// OCR1A = Dauer der Halbwelle
|
||||
|
||||
#include <avr/io.h>
|
||||
#include <util/delay.h>
|
||||
#include "keys.h"
|
||||
#include "fuer_elise.h"
|
||||
#include <avr/interrupt.h>
|
||||
#include "math.h"
|
||||
|
||||
#define SPEAKER_PIN 0b10
|
||||
#define BUTTON_PIN 0b1
|
||||
|
||||
long int timerarray[] =
|
||||
{
|
||||
36364, 34323, 32396, 30578, 28862, 27242, 25713, 24270,
|
||||
22908, 21622, 20408, 19263, 18182, 17161, 16198, 15289,
|
||||
14431, 13621, 12856, 12135, 11454, 10811, 10204, 9631,
|
||||
9091, 8581, 8099, 7645, 7215, 6810, 6428, 6067, 5727,
|
||||
5405, 5102, 4816, 4545, 4290, 4050, 3822, 3608, 3405,
|
||||
3214, 3034, 2863, 2703, 2551, 2408, 2273, 2145, 2025,
|
||||
1911, 1804, 1703, 1607, 1517, 1432, 1351, 1276, 1204,
|
||||
1136, 1073, 1012, 956, 902, 851, 804, 758, 716, 676, 638, 602,
|
||||
568, 536, 506, 478, 451, 426, 402, 379, 358, 338, 319, 301, 284,
|
||||
268, 253, 239
|
||||
};
|
||||
|
||||
bool sound = false;
|
||||
|
||||
ISR(TIMER1_COMPA_vect)
|
||||
{
|
||||
PORTB ^= (1 << PB1);
|
||||
}
|
||||
|
||||
int main()
|
||||
{
|
||||
DDRB = SPEAKER_PIN;
|
||||
PORTB = BUTTON_PIN;
|
||||
|
||||
TCCR1A = (0 << COM1A1) | (1 << COM1A0) | (0 << WGM11) | (0 << WGM10);
|
||||
TCCR1B = (0 << WGM13) | (1 << WGM12) | (0 << CS12) | (1 << CS11) | (0 << CS10);
|
||||
|
||||
TIMSK1 |= (1<<OCIE1A);
|
||||
|
||||
sei();
|
||||
|
||||
// TCCR1B = 0;
|
||||
|
||||
while (1)
|
||||
{
|
||||
if (!(PINB & BUTTON_PIN))
|
||||
{
|
||||
sound = true;
|
||||
}
|
||||
|
||||
if (sound == true)
|
||||
{
|
||||
for (int i = 0; i < NOTE_COUNT; i++)
|
||||
{
|
||||
OCR1A = timerarray[note_pitches[i]];
|
||||
OCR1B = note_durations[i] * 10;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
11
Aufgabe_4/test/README
Normal file
11
Aufgabe_4/test/README
Normal file
|
@ -0,0 +1,11 @@
|
|||
|
||||
This directory is intended for PlatformIO Test Runner and project tests.
|
||||
|
||||
Unit Testing is a software testing method by which individual units of
|
||||
source code, sets of one or more MCU program modules together with associated
|
||||
control data, usage procedures, and operating procedures, are tested to
|
||||
determine whether they are fit for use. Unit testing finds problems early
|
||||
in the development cycle.
|
||||
|
||||
More information about PlatformIO Unit Testing:
|
||||
- https://docs.platformio.org/en/latest/advanced/unit-testing/index.html
|
Loading…
Reference in New Issue
Block a user