Hi, ich bin dabei, meinen MIDI-Empfänger mit einem ATtiny2313 in Betrieb zu nehmen. Getestet habe ich ich die Funktion mit einer PC-kompatiblen Baudraten (9600 und 38400), funktionierte alles bestens. (kompletter Befehlssatz, 3 Befehle mit Funktion, Kanal-Wahl per DIP-Schalter) Nun habe ich die Baudrate auf 31250 gesetzt und die Eingangsbeschaltung (s.Anhang) ergänzt. Daten sind am RxD Pin des Controllers messbar, jedoch werden diese wohl nicht korrekt verarbeitet. Habe nun unten stehendes Testprogramm drauf und schicke 1 Byte Daten an die Schnittstelle, Ausgänge bleiben auf Initialwert 0. Invertieren muss ich ja nichts (Strom = "0", kein Strom = "1" passt ja mit dem Optokoppler und PullUp wieder), warum die Berechnung der Baudrate bei 38400 klappt, bei 31250 nicht (ergibt bei 4MHz ja sogar einen glatten Wert), wäre mir auch ein Rätsel... Wo könnte der Fehler liegen? Quellcode-Auszug des "Debug"-Programms (gibt 1:1 Daten auf ein Ausgaberegister):
1 | #define F_CPU 4000000UL
|
2 | |
3 | [...] (Deklarationen, keine Timer, etc.) |
4 | |
5 | int main (void) { |
6 | USART_Init(31250); |
7 | while(1) { |
8 | OUTPUT = USART_Receive(); |
9 | }
|
10 | }
|
11 | |
12 | void USART_Init( unsigned long baud ) { |
13 | unsigned int ubrr_val = (unsigned int)((F_CPU/(baud*16L))-1); |
14 | UBRRH = (unsigned char)(ubrr_val>>8); |
15 | UBRRL = (unsigned char)ubrr_val; |
16 | UCSRB = (1<<RXEN); // Empfänger aktivieren |
17 | UCSRC = (3<<UCSZ0); // 8 Daten-, 1 Stopp-Bit |
18 | }
|
19 | unsigned char USART_Receive( void ) { |
20 | while ( !(UCSRA & (1<<RXC)) ) |
21 | return UDR; |
22 | }
|