Hi,
Ich habe ein kleines Problem mit der Verbindung zwischen einem FT232 und
meinem ATtiny 2313.
Ich initialisiere den UART mit folgender Routine:
1 | #define BAUDRATE 300
|
2 |
|
3 | void uart_init()
|
4 | {
|
5 | uint16_t ubrr = (uint16_t)( ((uint32_t)F_CPU/ (16 * BAUDRATE)) - 1);
|
6 |
|
7 | UBRRH = (uint8_t) ( ubrr >> 8);
|
8 | UBRRL = (uint8_t) (ubrr);
|
9 |
|
10 | // UART Receiver und Transmitter anschalten
|
11 | // Data mode 8N1, asynchron
|
12 | UCSRB = (1 << RXEN) | (1 << TXEN);
|
13 | UCSRC = (0 << UMSEL) | (0 << USBS) | (3 << UCSZ0);
|
14 | }
|
Wie schon im Code steht soll der Controller auf asynchrone Operation, 8
Datenbits, 1 Stoppbit und keine Parity gestellt werden.
Mein main sieht so aus:
1 | int main()
|
2 | {
|
3 | uint8_t in;
|
4 | DDRB |= 1 << 2;
|
5 | PORTB |= 0 << 2;
|
6 |
|
7 | DDRB |= 1 << 3;
|
8 | PORTB |= 1 << 3;
|
9 |
|
10 | uart_init();
|
11 | // wait on key
|
12 | while(1)
|
13 | {
|
14 | in = uart_getc_wait();
|
15 | if( in == 0x31)
|
16 | PORTB |= 0 << 3;
|
17 | uart_putc(in);
|
18 | }
|
19 | }
|
Die LED's steuere ich im moment zu debugzwecken an...
Die Sende / Empfangsroutinen:
1 | static inline int uart_putc( const uint8_t c)
|
2 | {
|
3 | while( !( UCSRA & (1 << UDRE)));
|
4 | UDR = c;
|
5 | return 1;
|
6 | }
|
7 |
|
8 | static inline uint8_t uart_getc_wait()
|
9 | {
|
10 | while( !( UCSRA & (1 << RXC)));
|
11 | return UDR;
|
12 | }
|
Das Programmiere ich dann in den ATtiny 2313.
Wenn ich meine Schaltung mit dem PC verbinde, schaltet sich die rote LED
(auf Port B2) erwartungsgemäß ein, wenn ich jedoch per HTerm
(eingestellt auf 300 Baud 8N1 eine '1' an den Controller schicke (lt.
HTerm 0x31), sehe ich zwar die richtigen Waveforms auf dem RXD Eingang
des Controllers, es wir jedoch keine LED eingeschaltet. (Wie es ja sein
sollte wenn eine '1' empfangen wird.)
Ausserdem wird nicht das richtige Zeichen zurückgesendet, es kommt nicht
immer ein Zeichen zurück, und wenn empfange ich 0x80, also Binär
10000000...
Hat jemand von euch eine Idee wo hier der Fehler liegen könnte?
mfg
Andreas