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
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