Forum: Mikrocontroller und Digitale Elektronik Senden/Empfangen Problem mit ATtiny 2313 und FTDI FT232R


von Andreas (Gast)


Angehängte Dateien:

Lesenswert?

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

von Olaf (Gast)


Lesenswert?

Hi Andreas,

Das nicht das selbe Zeichen 'zurück' kommt deutet auf unterschiedliche 
Baud-raten hin. Und da du auch keinen stabielen Takt benutzt (Quarz, oÄ) 
ist das wohl auch dein Problem.

Für U(s)ART operationen sollte man sich nicht auf den interne 
RC-Oszilator verlassen, der ist abhängig von der Umgebungstemperatur und 
der Versorgungsspannung.
Wenn nicht anders möglich unbedingt OSCCAL anpassen (RC-Calibration 
AppNote).

Als Tip der FT232R kann ein Taktsignal über einen der CBUSx pins liefern
z.B.: 12MHz auf CBUS0. (MProg tool von FTDI).

Gruß
Olaf

von Andreas (Gast)


Lesenswert?

Hi,

Danke für die Infos, dachte ich kann den Internen Oszillator auch bei 
UART benutzen, vor allem da ich die Tests mit 300 Baud durchgeführt 
habe...

Werde deine Vorschläge mal ausprobieren.

mfg
Andreas

von Michael H* (Gast)


Lesenswert?

hot und cold vom usb (also + und -) sind vertauscht am ft232 
angeschlossen. ka, ob er das "kompensieren" kann.

von Andreas (Gast)


Lesenswert?

Hi,

Ich habe gerade noch im Datenblatt gefunden, das die CKDIV8 Fuse von 
Werk aus Programmiert ist, was einen Prescaler von 8:1 zwischenschaltet. 
Damit läuft der Controller auf 1MHz statt auf 8MHz, was auch die Daten 
erklärt die er empfängt. 1 Bit high, da die Samplingpunkte gerade auf 
eine passende Anzahl von high Bit fallen, den Rest low, da sich der 
USART ja im Ruhezustand befindet.

Hab der Gerät leider gerade nicht zur Hand, deswegen werd ich das morgen 
mal ausprobieren wie das ausschaut wenn ich es umstelle.

mfg
Andreas

von Andreas (Gast)


Lesenswert?

@Holli

Danke für die Info, ist uns schon aufgefallen, allerdings sieht das nur 
im Schaltplan so aus, es ist nur die Beschriftung verdreht, am 
Mapping/PCB stimmen die Pins...

Der FTDI Chip wird auch richtig erkannt, und am Ausgang (RS-TTL) des 
FTDI kann man sich mit dem Oszi schön die Daten anschaun die man an der 
FTDI schickt.

mfg
Andreas

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.