PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Hilfe bei Midi



Bumbum
08.02.2014, 11:57
Hallo,

ich habe mal wieder ein Problem. Ich möchte meinen Behringer DSP-1100 via Midi steuern. Genauer gesagt möchte ich die von mir gespeicherten Presets wechseln. Laut Anleitung des DSP-1100 ist dies möglich mit dem Befehl ProgrammChange (Midi-Kommando 0xC0).

Auf Wikipedia ist die Midi-Schnittstelle gut erklärt: http://de.wikipedia.org/wiki/Musical_Instrument_Digital_Interface

Ich habe also folgende Hardware dazu gebaut:

27454

Und folgenden Code geschrieben:



#define AVRGCC
#include <avr/io.h>
#include <compiler.h>
#define Midi_1 PORTD = ~(~PORTD | (1<<PD5))
#define Midi_0 PORTD = (PORTD | (1<<PD5))
#define Midi_ControlerChange 0xB0
#define Midi_ProgrammChange 0xC0
#define Midi_BitTime 32
#define Midi_BytePauseTime 1000

void Midi_sendByte (U8 dataByte)
{
Midi_0; // Start-Bit
_delay_us (Midi_BitTime);

U8 i1;
for (i1 = 0; i1 < 8; i1++) // 8 Daten-Bits:
{
if ((dataByte & 1) == 0)
Midi_0;
else
Midi_1;
_delay_us (Midi_BitTime);
dataByte = dataByte>>1;
}
Midi_1; // Stop-Bit
_delay_us (Midi_BytePauseTime);
}

int main(void)
{
DDRB = 0b00000111;
PORTB = 0b11111000;
DDRD = 0b00110110;
PORTD = 0b11001001;
Midi_1;
_delay_ms (500);

Midi_sendByte (0xC1);
Midi_sendByte (3);
Midi_sendByte (4);

while (1);
}


Aber es funktioniert nicht. Aber warum?

Für die Übersichtlichkeit hier, und um andere Fehler durch beeinflußung auszuschließen habe ich das restliche Programm entfernt.

Dummerweise habe ich erst nach der Fertigstellung der Hardware bemerkt, dass alle anderen Projekte im Netz den internen USART dafür verwenden. Dieser Pin ist bei mir schon für etwas anderes verwendet. Aber bei 31250 Baud Taktrate dachte ich mir solle ein Software-USART kein Problem sein.
Der verwendete ATtiny4313 läuft an einem 4,000000 MHz Quarz. Die 32µS Delay für die Baudrate sollten damit also genau eingehalten werden können. (sind 128 Clocks für das Delay)

Der DSP-1100 ist korrekt auf Midi-Empfang konfiguriert. Ich habe den Omni-Mode aktiviert, damit der verwendete Kanal erst mal egal ist. Aber auch verschiedene Kanäle habe ich schon ausprobiert.

An der Midi-Out-Buchse des DSP-1100 habe ich eine LED angeschlossen. Diese flackert kurz, wenn ich ein Programm am DSP von Hand wähle. Der DSP sendet es dann über seine Midi-Out Buchse. Leider habe ich kein Speicher Oszi, um mir den Datenstrom anzuschauen.
Wenn ich die LED an die Midi-Through Buchse anschließe flackert die LED genauso, wenn meine Schaltung die Daten überträgt. (Die Schaltung ist an Midi-In angeschlossen; Midi-Through wird dann wieder 1:1 so ausgegeben, was empfangen wurde) Also sollte meine Hardware funktionieren. Und die Polarität der Bits mit Midi_0 und Midi_1 auch.

Wer findet den Fehler?

Viele Grüße
Andreas

Bumbum
08.02.2014, 17:49
Hallo,

ich habe mir jetzt doch die Mühe gemacht und die zwei Pins getauscht, so dass der Midi-Datenstrom am TxD-Pin des Atmels hängt. Dadurch wurde noch eine weitere Invertierung des Signal nötig, aber jetzt läuft alles. Ich sende die Daten jetzt über den internen UART.

Aber damit ein Lerneffekt bleibt: Warum funktioniert mein Software-UART nicht?

Viele Grüße
Andreas

Bumbum
16.02.2014, 11:46
Hallo,

schade, dass sich hier niemand beteiligt. Mein Problem besteht nämlich immer noch. Ich hoffe auf ein bisschen Denkanstöße.

Ich habe die Schaltung seit gestern im endgültigen Betrieb. Das heißt, ich habe sie in das Gehäuse des DSP-1100 eingebaut:

27529

Rechts kommt aus dem DSP-1100 (das obere Gerät) die IR-Empfangsdiode, sowie eine rot/grüne LED als Status-Anzeige. Und die Buchse zum Verstärker, über die ich dessen Ausgänge schalte.

Zweck des ganzen war den Verstärker per Fernbedienung entweder auf Kanal A oder auf Kanal B zu schalten und im DSP die entsprechende Equalizer-Kurve aufzurufen. Beide Geräte waren vorher nicht fernbedienbar.

Das funktioniert alles bestens. Aber nach einiger Zeit empfängt der DSP keine Midi-Signale mehr. Er hat eine Status-LED, die blinkt sobald Midi-Befehle für ihn empfangen werden. Diese bleibt dann aus. Die Befehle werden auch nicht mehr umgesetzt. Meine Schaltung um den Tiny4313 läuft aber noch. Ich kann die Kanäle schalten, sowie die Geräte (DSP und Verstärker) ein- und ausschalten. Alles über Fernbedienung. Lediglich der Midi-Teil funktioniert nicht mehr.

Folgendes habe ich bisher erfolglos probiert:

den DSP aus- und wieder einschalten
die Tiny4313-Schaltung reseten
die Tiny4313-Schaltung vom Strom nehmen und wieder einschalten
die Firmware nochmal auf den Tiny4313 flashen (Strom blieb die ganze Zeit über dran)

Erst wenn ich den Strom für beide Geräte (DSP und Tiny) für ein paar Minuten weg nehme funktioniert wieder alles. Scheinbar genügt aber nur den DSP abzuschalten. Das ist aber nur eine Vermutung. Gestern Abend, bevor ich ins Bett gegangen bin habe ich alles noch mal probiert und es ging wieder alles, bis auf die Midi-Befehle. Jetzt heute früh nach dem Einschalten geht wieder alles. Eingeschaltet habe ich über die Fernbedienung, das heißt über Nacht ist der Tiny4313 durchgelaufen und hat heute früh einwandfrei funktioniert.

Nun bin ich etwas ratlos. Ich habe im moment keine Ahnung, wo ich nach der Ursache suchen soll. Hat jemand eine Idee?

Mein erster Gedanke war vielleicht ein Wärmeproblem, da der Verstärker unten drunter schon ganz schön heizt. (Keine Angst, der DSP ist ein "kurzes" Gerät. Das kommt auf dem Foto nicht rüber. Dort wo der Verstärker seinen Leistungskühlkörper hat sind oben die Lüftungsschlitze komplett frei.
Das Erklärt aber nicht, warum ein paar Minuten abschalten schon das Problem löst. Der Verstärker ist dabei durchgelaufen und hat eher weiter geheizt. Die Kombi steht hier schon seit Jahren. Der DSP hat in seiner Funktion kein Problem mit der Wärme vom Verstärker.

Mein Tiny4313 läuft an einem 4,000000 Mhz Quarz (4,0000-HC49U-S von Reichelt). Wie Temperaturstabil sind die denn? Da habe ich bis jetzt noch keine Erfahrungen mit. In den Datenblättern habe ich lediglich folgendes gefunden:

Temperature Tolerance (std.) / Temperaturtoleranz ?f/f ±30ppm, ± 50ppm

Kann mir das jemand erklären?

Viele Grüße
Andreas