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