Forum: Mikrocontroller und Digitale Elektronik USART sendet nur 0x80


von GoZu (Gast)


Lesenswert?

Hallo,

wenn ich über USART Daten ausgeben möchte, empfange ich nur 0x80 oder 
0x80 + 0x00.

Ich benutze das STK600 (habe über AVR Studio F_CPU auf 1MHz eingestellt 
und das auch im Programm eingesellt). Baudrate benutze ich 19200 (auch 
beim Empfangsterminal).

Egal was ich senden möchte, ich bekomme immer nur 0x80 oder 0x80 und 
0x00 aufeinmal. Kann mir bitte jemand sagen, was ich falsch mache?

von STK500-Besitzer (Gast)


Lesenswert?

>Kann mir bitte jemand sagen, was ich falsch mache?

Keinen Code zu posten!

von GoZu (Gast)


Lesenswert?

1
void usart_init(void)
2
{
3
  // Baudrate einstellen
4
  UBRRH = (uint8_t) ((F_OSC / (BAUD_RATE * 16L) - 1)>>8);
5
    UBRRL = (uint8_t) (F_OSC / (BAUD_RATE * 16L) - 1);
6
7
  //Stelle Frameformat ein: 8 bit, 1 Stop, kein Parity
8
  UCSRC = (1 << URSEL) | (3 << UCSZ0) | (1 << UPM0) | (0 << USBS);
9
10
  //Doppelte Geschwindigkeit
11
  //UCSRA |= (1 << U2X);
12
13
  // Schalte Senden und Empfangen ein
14
  UCSRB = (1 << RXCIE) | (1 << TXEN) | (1 << RXEN);  // Aktiviere USART Interrupt
15
}

[/c]
void usart_send(uint8_t data)
{
  // Warte bis Übertragungs-Puffer leer ist (letzte Übertragung fertig 
ist)
  while (!(UCSRA & (1<<UDRE)));

  //Übergebene Daten in Data-Register geben (Daten übertragen)
  UDR = data;
}
[/c]

1
int main(void)
2
{
3
  usart_init();
4
  while(1)
5
  {
6
    usart_send(0xA0);
7
    _delay_ms(1000);
8
  }
9
}


Wenn ich jetzt das sende, erhalte ich 0b1100000 also vorne das erste Bit 
ist falsch... Wenn ich 0x01 sende, erhalte ich 0b10000001
Start,Stop und Parity sind aber im Terminal richtig eingestellt. 
Außerdem hab das Programm früher funktioniert.

von Simon K. (simon) Benutzerseite


Lesenswert?

Und der Schaltplan der verwendeten Schaltung?

Der Code ist aber auch nicht komplett. Hänge doch mal die ganze .c Datei 
an bitte.
Da fehlt mindestens ein #define und ein #include.

von STK500-Besitzer (Gast)


Lesenswert?

Richtig Baudrate? Richtige Taktfrequenz? Irgendwelche "DIV8"-Fuses 
übersehen?
Dein Programm-Fragment ist nicht compilierbar, also unbrauchbar.

von GoZu (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

sorry, hatte das Programm auf anderem Rechner, deshalb habe ich es nur 
abgetippt. Hier jetzt der ganze code angehängt.

Das Problem besteht weiter: Sende ich 0b00000001 erhalte ich 0b10000001. 
Sende ich aber 0b11111111 so erhalte ich auch 0b11111111. Also das MSB 
ist immer 1.

Über AVR Studio habe ich die interne Frequenz auf 1 MHz eingestellt, auf 
dem STK600 habe ich den Schalter für interne Frequenz auch 
eingeschalten. PD0 und PD1 mit RXD und TXD verbunden. RS232 Verbinde ich 
über einen RS232-USB Converter mit dem PC. Beim Terminal (hterm) habe 
ich die gleichen Einstellungen wie im Programm (Baudrate 19200 , 8 
Datenbits, 1 Stop kein Parity). Sonst noch jemand eine Idee?

von Simon K. (simon) Benutzerseite


Lesenswert?

Simon K. schrieb:
> Und der Schaltplan der verwendeten Schaltung?

Der interne RC Oszillator ist im übrigen pauschal gesagt zu ungenau für 
eine UART.

von spess53 (Gast)


Lesenswert?

Hi

>

Simon K. schrieb:
>> Und der Schaltplan der verwendeten Schaltung?

STK600

MfG Spess

von (prx) A. K. (prx)


Lesenswert?

GoZu schrieb:

> Das Problem besteht weiter: Sende ich 0b00000001 erhalte ich 0b10000001.
> Sende ich aber 0b11111111 so erhalte ich auch 0b11111111. Also das MSB
> ist immer 1.

Klassisches Symptom eines Bitratenfehlers. Die Bitrate vom Sender ist 
geringfügig höher als die des Empfängers.

Mal dir das mal auf, dann wird das deutlich.

von Simon K. (simon) Benutzerseite


Lesenswert?

spess53 schrieb:
> Hi
>
>>
>
> Simon K. schrieb:
>>> Und der Schaltplan der verwendeten Schaltung?
>
> STK600

Ahso, stimmt. Da ist ja auch ein Pegelwandler drauf.
Sorry.

von (prx) A. K. (prx)


Lesenswert?

Grund für den Bitratenfehler: Aus einem 1MHz Takt, egal wie genau der 
ist, lässt sich die Bitrate 19200 nicht hinreichend genau ableiten.

von GoZu (Gast)


Angehängte Dateien:

Lesenswert?

Ok danke schonmal,

allerdings funktioniert das ganze auch nicht mit anderen Frequenzen. 
Habe den Clock Generator auch auf 8 MHz, 16 MHz und 20 MHz eingestellt, 
allerdings mit dem gleichen Ergebnis. Benötige ich dafür wirklich einen 
Quarz?? Und wenn ja, wo stecke ich den dann genau beim STK600 rein? Beim 
STK500 war alles gut beschrieben und es gab auch ein Manual, aber beim 
STK600 gibts ja nur das interne von AVR Studio und dort ist das nicht 
beschrieben und beschriftet ist es auch nicht auf dem board. Habe jetzt 
ein Bild vom STK600 angehängt, dort wo der rote Kreis ist, muss ich dort 
den Quarz reinstecken?

von STK500-Besitzer (Gast)


Lesenswert?

Wenn du bei den STK600-Einstellungen verschiedene Frequenzen eingestellt 
hast, und sich nichts ändert, liegt es am Controller: Dessen Fuses 
müssen auch für Verwendung einer externen Taktgenerators programmiert 
sein.

von spess53 (Gast)


Lesenswert?

Hi

> muss ich dort den Quarz reinstecken?

Steht doch in der Beschreibung:

The on-board crystal oscillator will work with ceramic resonators or 
crystals between 4 and 24MHz (AT-cut, fundamental, and parallel resonant 
crystals). Place a crystal in the crystal socket (located next to the 
PROGRAM button).

Und den Umschalter nicht vergessen.

MfG Spess

von GoZu (Gast)


Lesenswert?

Ok danke, es funktioniert. Aber könnt ihr mir bitte noch kurz etwas 
erklären:

Ich kann ja zwischen Intern, Extern und XTAL wählen.
XTAL ist wenn ich einen eigenen Quarz benutze und den auf das STK stecke 
oder?

Und was ist jetzt genau intern und was extern? Im Manual steht, dass 
extern vom "Programmable clock generator". Ist dass das, wenn ich zum µC 
connecte und dann bei den Spannungseinstellungen unten die Frequenz 
angebe? Und vonwo kommt dann intern? Bei den Fuse bits kann ich intern 
und extern auswählen und dort auch noch einmal die Frequenz 
einstellen.... Ich bin gerade etwas verwirrt, könnt ihr mir das bitte 
kurz erklären.

Außerdem habe ich hier Quarz-Oszillatoren mit 4 Anschlüssen, was sind 
das für welche? Für das STK600 brauche ich doch welche mit 2 Anschlüsse 
oder?

von Falk B. (falk)


Lesenswert?

@  GoZu (Gast)

>Und was ist jetzt genau intern und was extern?

Intern: RC-Oszillator im AVR.

Extern: Separater Taktgenerator, welcher einen Takt in den AVR 
einspeist.

>Außerdem habe ich hier Quarz-Oszillatoren mit 4 Anschlüssen, was sind
>das für welche?

Das sind Quarzoszillatoren, also Quarz + Verstärker. Dort legt man Masse 
und 5V an und es kommt ein Takt raus.

> Für das STK600 brauche ich doch welche mit 2 Anschlüsse
>oder?

Keine Ahnung. Ein normaler Quarz braucht noch die Beschaltung, um zu 
schwingen. Die ist im AVR eingebaut.

MFG
Falk

von spess53 (Gast)


Lesenswert?

Hi

>Außerdem habe ich hier Quarz-Oszillatoren mit 4 Anschlüssen, was sind
>das für welche? Für das STK600 brauche ich doch welche mit 2 Anschlüsse
>oder?

Ja. Das STK600 hat einen Quarzgenerator, der mit dem eingesteckten Quarz 
schwingt. Mit dem Umschalter wird das Taktsignal an XTAL1 vom Controller 
gelegt.
In der Hilfe zum STK ist das alles sehr nett beschrieben.

MfG Spess

von (prx) A. K. (prx)


Lesenswert?

Dann wäre da noch der feine aber beim Fusen gern verwechselte 
Unterschied zwischen dem externen Quarzsozillator und dem externen 
Quarz.

Beim externen Quarz ist nämlich der Oszillator halb drin halb draussen. 
Der aktive Teil ist intern, der passive (der Quarz und die 
Kondensatoren) extern.

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.