Ich habe eine PWM zur Audioausgabe am laufen. Das ganze soll aber
nachher noch einige andere Aufgaben erfüllen, deshalb bin ich bedacht,
die Audio-Interrupt-Routine möglichst kurz zu halten und wollte mal
fragen, ob ihr vielleicht noch was seht, was schneller gemacht werden
kann.
(Leider bin ich in Assembler überhaupt nicht bewandelt. Vor allem wüsste
ich nicht, wie und ob das da in der ISR zu integrieren wäre.)
Hier jedenfalls meine Routine:
1 | ISR(TIMER1_OVF_vect) {
|
2 | if(!(soundPWMcount <<= 2)) {
|
3 | soundPWMcount = 1;
|
4 | if(sampleBuffer.playing) {
|
5 | OCR1A = sampleBuffer.playback_buffer[sampleBuffer.playbackPosition];
|
6 | sampleBuffer.playbackPosition += 1;
|
7 | if(sampleBuffer.playbackPosition >= SOUND_SAMPLE_BUFFER_SIZE) {
|
8 | if(sampleBuffer.playing & 0x02) {
|
9 | // Stop playing
|
10 | sampleBuffer.playing = 0;
|
11 | } else {
|
12 | // End of sample playback buffer reached.
|
13 | // Swap sample preload and playback buffers
|
14 | uint8_t * temp_pointer = sampleBuffer.playback_buffer;
|
15 | sampleBuffer.playback_buffer = sampleBuffer.load_buffer;
|
16 | sampleBuffer.load_buffer = temp_pointer;
|
17 |
|
18 | sampleBuffer.hasToBeReFilled = true;
|
19 | sampleBuffer.playbackPosition = 0;
|
20 | }
|
21 | }
|
22 | } else {
|
23 | OCR1A = 0;
|
24 | }
|
25 | }
|
26 | }
|
Das ganze wird nur alle 4 Timer-Durchläufe ausgeführt (PWM-Frequenz ist
62500Hz, Samplerate vom Audio 15625Hz). Das Nachfüllen des
Sample-Preload-Buffers wird in der Hauptschleife des Programms erledigt.
Vielen Dank,
Sven.