Forum: Mikrocontroller und Digitale Elektronik Midisignal auslesen mit Usart


von Kap`tein Blaubär (Gast)


Lesenswert?

Hallo ihr lieben Elektrotechniker, Bastler und Linearkombinationen 
daraus,

ich bin im Moment dabei einen Synthesizer zu basteln und möchte dafür 
Midi-daten über den Usart einlesen, die ich über ein USB->Midi interface 
bekomme.
Hab mit nem Oszi mal geschaut und von der Pinbelegung sollte das 
stimmen, daher glaube ich, dass mein Code vielleicht noch nicht ganz 
erste Sahne ist.
Benutze einen Atmega 32L und würde mich sehr freuen, wenn ihr mir 
weiterhelfen könntet :)

Liebe Grüße vom Blaubär
1
void Usart_init(void)
2
{
3
  UCSRB = (1<<RXEN)|(1<<UCSZ2);     // enables Usart receive mode
4
  UCSRC = (1<<URSEL);               // allows writing to the UCSRC register
5
  UCSRC |= (1<<UMSEL);              // synchronos Operation
6
  UCSRC |= (1<<UCSZ1);              // UCSZ1 and UCSZ2 set = 8 bit Word
7
  UBRRH |= (1<<URSEL);              // allows now writing to the UBRRH register
8
  UBRRL = 0x15;                     // set Baudrate to 31250
9
}
10
11
unsigned char USART_Receive( void )
12
{
13
/* Wait for data to be received */
14
while ( !(UCSRA & (1<<RXC)) )
15
;
16
/* Get and return received data from buffer */
17
received_byte = UDR;
18
return received_byte;
19
}

von Karl H. (kbuchegg)


Lesenswert?

Äh, nein
Das hier
1
  UCSRC = (1<<URSEL);               // allows writing to the UCSRC register
2
  UCSRC |= (1<<UMSEL);              // synchronos Operation
3
  UCSRC |= (1<<UCSZ1);              // UCSZ1 and UCSZ2 set = 8 bit Word

geht nicht.

Es müssen alle Bits in einem Rutsch geschrieben werden und URSEL sagt 
aus, ob dieser Schreibvorgang jetzt das UCSRC betrifft oder das UBRRH

URSEL ist also kein Umschalter, den mal einmalig setzt und dann wieder 
rücksetzt
1
  UCSRC = (1<<URSEL) | (1<<UMSEL) | (1<<UCSZ1);

wieso eigentlich UMSEL?
AUch Midi ist doch keine synchrone Übertragung sondern stink normale 
asynchrone RS232.


AVR-GCC-Tutorial/Der UART


Die UART erst mal in der Gegenrichtung in Betrieb nehmen!
Vom AVR aus etwas ausgeben und nachsehen, ob man das in einem 
Terminalprogramm auch empfangen kann!

von holger (Gast)


Lesenswert?

>Benutze einen Atmega 32L und würde mich sehr freuen, wenn ihr mir
>weiterhelfen könntet :)

Bei welchem Problem?

>  UCSRC |= (1<<UMSEL);              // synchronos Operation

Synchron?

>  UBRRH |= (1<<URSEL);              // allows now writing to the UBRRH

Falsch.

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.