www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik UART receive data


Autor: Wolfgang Grimm (wgrimm55)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo ihr,

kann mir mal einer helfen bei der UART programmierung. (AT90S2313)
ich möchte mit dem UART von einem anderen avr daten empfangen.
Diese sollen per interrupt, ausgewertet werden.
Nur leider springt der processor die int routine nicht an.
im Anhang habe ich mein testbeispiel.
Das transmitt über den UART funktioniert, warum das receive nicht.
Die eingehenden Daten am processor sehe ich an einem logik analyzer.
Was ist in der register programmierung des UART falsch.



Gruss W.G

Autor: Matthias Kölling (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der Transmit Interrupt wird genau einmal ausgelöst, da Du nur vor der 
while-Schleife das Datenregister beschreibst.
Da Du die Funktion des Empfangens mit Port B feststellen willst, 
solltest Du einmal versuchen Value als volatile zu deklarieren. Sonst 
könnte der Compiler die Variable wegoptimieren.

Gruß Matthias

Autor: Wolfgang Grimm (wgrimm55)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für den tip

aber das senden in dem Beispiel ist nur zum test. die receive daten
bekomme ich wo anders her, von einem anderen processor (board).
Stream liegt an pd0 an (sehe ich am Logic analyzer). das sende byte sehe 
ich an des LED des STK200.
es muesste doch wenn das empfangen funtioniert irgend was anderes
als die 15 vom senden an port B zu sehen sein.


W.G.

Autor: Matthias Kölling (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dann gib doch mal nicht Value sondern z.B. 0xAA aus.

Gruß Matthias

Autor: Wolfgang Grimm (wgrimm55)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
habe ich gemacht ohne erfolg.
frage: die UART Programierung ist im prinzip o.K. ?
ich sehe an pin 2 des 2313 die impulse.
sie werden von einem Mega8515 mit baud 9600 erzeugt.
wenn der UART ein irgenwie geartetes Startbit bekommt und danach nur 
noch 1 muss er doch irgendwann in die int routime springen oder ??? !!!

w.g.

Autor: Matthias Kölling (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielleicht ist die Baudrate falsch eingestellt. Ich kenn mich jetzt dem 
Controller nicht aus, aber schau doch mal nach, ob der Controller genau 
mit der Frequenz läuft für die Du die Baudrate eingestellt hast.

Gruß Matthias

Autor: Wolfgang Grimm (wgrimm55)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich habe die standard werte aus den Unterlagen
genommen der 8515 mit 3.6MhZ -> 23
den 2313 mit 4 MHz -> 25
Wenn im Programm nichts falsch ist, werde ich mal mit dem
Oszi die Daten des 8515 mit dem daten das 2313 vergleichen müssen.

gruss W.G.

Autor: Wolfgang Grimm (wgrimm55)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
also ich habe beim Senden (8515) eine low breite von 108 us
und beim senden des 2313 eine lowbreite von 107 us
muesste doch eigentlich gehen oder ??

Autor: Wolfgang Grimm (wgrimm55)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
habe nochmal die beiden boards auf massse verbindung geprüft, ist auch 
verbunden.
was nun jetzt bin ich am ende.
wer hat die goldene idee, such nähmlich schon seit tagen nach dem fehler 
??


w.G.

Autor: Spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Wie sicher sind deine Quarzfrequenzen. 3,6Mhz liefert schon einen 
kritischen Baudratenfehler von 1,9%. Zusammen mit den 0,2% bei 4MHz 
könnte eine Kommunikation gestört sein.

MfG Spess

Autor: Wolfgang Grimm (wgrimm55)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
also der 8515 ist auf einem STK500 board und der 2313 auf einem STK200
board. mit den orginal internen quarzen der boards.
habe wirklich die werte für ubrr aus den Atmel unterlagen
genommen.
Meiner Messung mit dem LA habe ich einen unterschied von 1 us.
mueste doch noch gehen.
werde mal die Werte der UBRR register variieren. vielleicht bringt das 
was.

W.G.

Autor: Spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Eine Datenübertragung mit dem Oszillator vom STK500 kannst du knicken. 
die Genauigkeit reicht um eine Led Blinken zu lassen, mehr aber auch 
nicht.
Der UART-Interrupt wird erst ausgelöst wenn ein Datenbyte incl. Start- 
und Stopbit vollständig empfangen wurde.
Zum Testen würde es reichen beide µC mit einem Quarz gleichen Wertes zu 
betreiben. Die absolute Baudrate ist nicht so wichtig, nur die muss bei 
beiden Teilen gleich sein.

MfG Spess

Autor: Wolfgang Grimm (wgrimm55)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für den tipp,

ich dachte beide boards werden mit einem quarz gesteuert.
werde wohl mal auf exteren quarz für die boards umschalten muessen
muss aber dazu mir quarze besorgen


W.G.

Autor: Spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Auf dem STK200 schon. Aber auf dem STK500 wird der (einstellbare) Takt 
von dem Controller auf dem Board (der Käfer bei den Sub-D-Buchsen) 
erzeugt.

MfG Spess

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.