www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik USART sendet nur 0x80


Autor: GoZu (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: STK500-Besitzer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Kann mir bitte jemand sagen, was ich falsch mache?

Keinen Code zu posten!

Autor: GoZu (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
void usart_init(void)
{
  // Baudrate einstellen
  UBRRH = (uint8_t) ((F_OSC / (BAUD_RATE * 16L) - 1)>>8);
    UBRRL = (uint8_t) (F_OSC / (BAUD_RATE * 16L) - 1);

  //Stelle Frameformat ein: 8 bit, 1 Stop, kein Parity
  UCSRC = (1 << URSEL) | (3 << UCSZ0) | (1 << UPM0) | (0 << USBS);

  //Doppelte Geschwindigkeit
  //UCSRA |= (1 << U2X);

  // Schalte Senden und Empfangen ein
  UCSRB = (1 << RXCIE) | (1 << TXEN) | (1 << RXEN);  // Aktiviere USART Interrupt
}

[/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]

int main(void)
{
  usart_init();
  while(1)
  {
    usart_send(0xA0);
    _delay_ms(1000);
  }
}


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.

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: STK500-Besitzer (Gast)
Datum:

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

Autor: GoZu (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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?

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>

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

STK600

MfG Spess

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
spess53 schrieb:
> Hi
>
>>
>
> Simon K. schrieb:
>>> Und der Schaltplan der verwendeten Schaltung?
>
> STK600

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

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: GoZu (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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?

Autor: STK500-Besitzer (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: GoZu (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.