Forum: Mikrocontroller und Digitale Elektronik MIDI und ATMEGA32


von Stefan (Gast)


Angehängte Dateien:

Lesenswert?

Hallo an alle!

Ich bin am verzweifeln:
Habe versucht ein paar MIDI-Signale nach draußen zu schicken von einem 
ATMega32. Habe alles nach dieser Anleitung gemacht:

http://elektro.wienker.org/?p=405

Das heißt RxD liegt auf PORTD. Bei mir läuft noch ein Display auf PortC 
und sonst nichts. Auf dem Display lasse ich lediglich Alles Buchstaben 
durchlaufen nur um zu sehen, ob mein Controller noch läuft.

Hier mein Code:

#define F_CPU 8000000

#include <avr/io.h>
#include <util/delay.h>
#include "lcd.h"

void ADC_Init(void);
uint16_t ADC_Read( uint8_t channel );
uint16_t ADC_Read_Avg( uint8_t channel, uint8_t nsamples );


// Hauptprogramm
int main(void) {
    unsigned char i = 66;
  unsigned char buffer = 0;
  unsigned char wert[5];

  initialize();
  lcd_init(LCD_DISP_ON_CURSOR);
  init_USART();
  uint16_t adcval;
  //ADC_Init();
    // Endlosschleife
    while (1) {
    play_C_Chord();

    lcd_clrscr();
        lcd_data('W');
    lcd_data('e');
    lcd_data('r');
    lcd_data('t');
    lcd_data('!');
    lcd_data(wert[0]);
    lcd_data(wert[1]);
    lcd_data(wert[2]);
    lcd_data(wert[3]);
    lcd_data(wert[4]);
    lcd_data(i);
    i++;

    if(i==80) i = 62;


    }

    return 0;
}

void sendchar(unsigned char c)
{
  while(!(UCSRA & (1<<UDRE)))
  {
  }
  UDR = c;
}

void play_C_Chord(void){

    //////////////////////
    // Play C Major Chord
    //////////////////////

    sendchar(0x90); //Note ON
    sendchar(0x3C); //Note: C3
    sendchar(0x7F); //Velocity: 127(Max)

    sendchar(0x40); //Note: E3
    sendchar(0x7F); //Velocity: 127(Max)

    sendchar(0x43); //Note: G3
    sendchar(0x7F); //Velocity: 127(Max)


    ////////////////////
    // Wait 1 second
    ////////////////////

    _delay_ms(1000);


    //////////////////////
    // Stop playing Chord
    //////////////////////
    sendchar(0x80); //Note OFF
    sendchar(0x3C); //Note: C3
    sendchar(0x00); //Velocity: 0

    sendchar(0x40); //Note: E3
    sendchar(0x00); //Velocity: 0

    sendchar(0x43); //Note: G3
    sendchar(0x00); //Velocity: 0

    _delay_ms(1000);
}

void initialize(){
  DDRA = 0x00;
  // PortB als Ausgang deklarieren
  DDRB = 0xff;
  PORTB = 0x02;
  DDRC = 0xff;  // PortC als Display-Ausgang deklarieren
  //DDRD = 0xff;


}

void init_USART(void)
{
  UCSRB |= (1<<TXEN);          //UART TX (Transmit enable)
  UCSRC |= (1<<URSEL)|(3<<UCSZ0);    //Mode Async 8N1 (8 Databits, No 
Parity, 1 Stopbit)

                    //UBRR defines baudrate
                    //Baudrate for MIDI is 31250
                    //UBRR = (Clock-frequency / (Baudrate * 16)) - 1
                    //Clock-frequency = 16000000 Hz => UBRR = 31
  UBRRH = 0;              //Highbyte is 0
  UBRRL = 15;              //Lowbyte ist 31 (decimal)
}

----------------------------------


Alles läuft sobald ich mein MIDI-Kabel dranhänge. Dann hängt sich der 
Controller auf. Als ob plötzlich irgend eine verbotene Spannung an Pin5 
von der MIDI-Buchse drankommt...

Habt ihr eine Idee was ich ausprobieren könnte?


Danke,
viele Grüße, Stefan

von Stefan (Gast)


Lesenswert?

Hi,

habe das Problem immer noch. Habe mal an den wichtigen PINs gemessen:

Bevor ich das MIDI-Kabel anschließe habe ich an der MIDI Buchse MAB 5 
SH, wie in der Anleitung:

PIN5(VCC-Pin): 4,4 V
PIN4 (Signal-PIN): 4.98 V (Hab kein Oszilloskop, aber da müssten ja 
meine Notendaten rauskommen)


Nachdem ich das MIDI-Kabel dranschließe, habe ich folgende Situation:

Pin5: 2,88 V
Pin4: 1.85 V

Weiß nicht was ich da falsch mache... Habe alles korrekt verdrahtet. 
Sobald ich aber das MIDI-Kabel dranschließe verweigert der Controller 
seine Arbeit...


Gruß,

hoffe jemand hat eine Idee....

von Tom (Gast)


Lesenswert?

Hallo,

Du willst Signale nach außen senden = MIDI out.

Dann schreibst Du etwas von RxD = MIDI in.

Die verlinkte Seite hat das MIDI out an TxD angeschlossen.

An welchen Controller-Pin hast Du MIDI out angeschlossen?

Gruß Tom

von AVerr (Gast)


Lesenswert?

Stefan schrieb:
> UBRRL = 15;              //Lowbyte ist 31 (decimal)

Wenn das low byte 31 sein soll, dann gib ihm auch den Wert 31 und nicht 
15.

von Stefan (Gast)


Lesenswert?

Hallo, hab mich vertippt:

TxD(Controller Pin 15) ist angeschlossen an der Midi-Buchse.

Der Kommentar mit dem Low-Byte ist von der Version mit einem 16MhZ 
Quarz.
Ich habe meine Fusebits auf 8 MhZ int. Osz. gesetzt und mein LowByte 
dementsprechend angepasst. Sieht etwas unglücklich im Kommentar aus.

Habe auch schon daran gedacht, dass ich die Pins an der Midi-Buchse 
vertauscht haben könnte, aber auch das löst das Problem nicht...

von Stefan (Gast)


Lesenswert?

Hallo nochmal an alle!^^

Es hat sich geklärt! Habe die Versorgungsspannung nicht vom 
Spannungsregler bezogen sondern direkt von der Gleichspannungsquelle!

Vielen dank aber nochmals !


Gruß

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.