mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik [AVR][AtMega8] UART sendet und empfängt nicht


Autor: Jens Fiedler (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

das meiste hab ich bisher schon hinbekommen mit meinem AtMega 8 aber der 
UART will einfach nicht. Ich habe es erst mit eigenem Code versucht, als 
das nicht klappen wollte habe ich diverse Beispielcodes durchgetestet. 
Weder der aus der Doc zum mega8 noch der hier von der Webseite haben 
irgendetwas bewirkt.

Es gibt ja wirklich viel allein in diesem Forum zum UART und ich habe 
mir auch vieles durchgelesen, aber etwas das mir hilft habe ich nicht 
gefunden (oder übersehen).

Als Board benutze ich ein Olimex Development Board, gab es mal hier im 
Shop. Also nichts selbsgebautes. 2 Kabel sind gesteckt RX und TX, und 
das wars, sonst hab ich alles vom board runtergenommen.
Folgenden Minimalcode habe ich als letzten Versuch benutzt
#include <avr/io.h>
#include <avr/interrupt.h>
#include <inttypes.h>
#include <stdlib.h>
 
#ifndef F_CPU

#warning "F_CPU war noch nicht definiert, wird nun nachgeholt mit 4000000"
#define F_CPU 8000000L    // Systemtakt in Hz, das L am Ende ist wichtig, NICHT UL verwenden! 
#endif
 
#define BAUD 19200L          // Baudrate, das L am Ende ist wichtig, NICHT UL verwenden!
#define UBRR_VAL 25   //19200 BAUD

int main(void)
{
    UCSRB |= (1<<TXEN);                // UART TX einschalten
    UCSRC |= (1<<URSEL)|(3<<UCSZ0);    // Asynchron 8N1 
 
    UBRRH = UBRR_VAL >> 8;
    UBRRL = UBRR_VAL & 0xFF;

  while(1)
  {
    while (!(UCSRA & (1<<UDRE)))  /* warten bis Senden moeglich                   */
      {
      }
 
      UDR = 'x';                    /* schreibt das Zeichen x auf die Schnittstelle */
  }
  return 0;
}

Also Initialisieren, und bis zum Sanktnimmerleinstag x über den USART 
schicken. Viel mehr abspecken kann man ja nun wirklich nichtmehr aber 
kein Terminalprogramm empfängt irgendetwas. Getestet wurde an 3 PC's.
Den Wert für UBRR habe ich aus dem Datenblatt aus der Tabelle bei 19200 
Baud, andere Werte haben auch nicht funktioniert.

Da ich im moment absolut nicht weiterkommen... hat jemand einen 
funktionierenden (möglichst kurzen) Beispielcode für einen mega8 ? Ich 
würde gerne den Code als Fehlerquelle ausschliessen.
Da ich leider auf den 8 Mhz Quarz angewiesen bin komme ich nicht auf 
wirklich gute Baudraten, notfalls kommt einfach ein anderer quarz drauf, 
aber funktionieren müsste es ja eigentlich auch so.

Hat jemand einen Ratschlag ?

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jens Fiedler wrote:

> [AVR][AtMega8] UART sendet und empfängt nicht
> ...
>     UCSRB |= (1<<TXEN);                // UART TX einschalten
                   ^^^^^                         ^^
Was könnte ein entsprechendes, zusätzliches RXEN (und der 
entsprechende Quellcode fürs Empfangen in der while-Schleife) bewirken 
?-)

Autor: Jens Fiedler (insanitaeter)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Da ich erstmal alles möglichst minimal habenwollten habe ich das 
weggelassen. Wenn das Senden nichtmal klappt kann ich das empfangen ja 
nicht überprüfen (Echo & Co).

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ups. Ich habe deine Frage so gelesen: Atmega8 sendet (OK) und empfängt 
nicht (Problem). Die Ursache wäre klr - es fehlt das Einschalten des 
Empfängers und die Empfangsroutine.

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> 2 Kabel sind gesteckt RX und TX, und das wars,

Was ist mit der Signalmasse (Pin5 am 9-poligen Anschluss)?

Kannst du mit einem Voltmeter ein Zappeln am TX-Pin des AVR feststellen 
(wird von 5V gegen 0V gezogen, wenn ein Bit 0 verschickt wird). 
Bezugspunkt GND vom AVR.

Kannst du mit einem Voltmeter ein Zappeln am TX-Pin der DB9-Buchse 
feststellen (wird von ca. -12V Richtung 0V gezogen, wenn ein Bit 0 
verschickt wird). An beiden Seiten des Kabels? Bezugspunkt Pin5 vom 
Kabelstecker.

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schon das Kabel zwischen PC und AVR-Board überprüft, ob RX(PC) auf 
TX(AVR) trifft und vice versa? Es gibt 1:1 Kabel (Modemkabel) und 
Nullmodemkabel mit gekreuzten Leitungen.

Die TX(PC) Leitung findest du auch über das Ausmessen der Pins am 
einseitig am PC eingesteckten Kabel mit dem Voltmeter - die TX(PC) 
Leitung hat ca. -12V während die RX(PC)-Leitung spannungslos ist.

Bist du sicher, dass der AVR mit externen 8 MHz läuft? Ab Werk macht der 
das nicht und ich weiss nicht, ob Olimex den vor der Auslieferung 
bereits auf externen Quarz umgestellt hat. Eventuell die Fuses auslesen 
und das Ergebnis hier posten.

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn das das Schaltbild von deinem Board ist:

http://www.olimex.com/dev/avr-p28.html
http://www.olimex.com/dev/images/avr-p28-sch.gif

Brauchst du ein 1:1 Modemkabel für die Verbindung zum PC. Die Kreuzung 
RX-TX wird auf dem Board gemacht. Und zwar müssen folgende Verbindungen 
auf dem Board eingerichtet werden:

AVR TXD/PD1 (Pin3) ====> )-- RX (Eingang aus PC Sicht) am MAX232
AVR RXD/PD0 (Pin2) <==== )-- TX (Ausgang aus PC Sicht) am MAX232

J1 würde ich zunächst offen lassen, d.h. kein Hardware-Handshake.

Die Funktion von Kabel und Max232 kannst du prüfen, wenn du den AVR noch 
nicht mit dem MAX232 verbindest sondern nur RX und TX am MAX232 
verbindest und dann den Echotest vom PC aus machst.

Autor: Jens Fiedler (insanitaeter)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich hab mal versucht das nachzumessen. Leider ist mein Voltmeter digital 
und langsam, wenns schnell zappelt seh ich das nicht aber das kann ich 
morgen auf arbeit überprüfen. Wenn ich den AVR Resette wird der tx pin 
von ~2,5V auf 0V gezogen.
An der Buchse konnte ich zwischen pin3(tx) und pin5(masse) allerdings 
nichts messen.
ich habe vorsichthalber mal den max232 getauscht, ohne das es etwas 
gebracht hat.

Autor: Jens Fiedler (insanitaeter)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja das ist das Board das ich nutze. Der Echo test funktioniert nicht 
wenn ich rx und tx auf dem board am max232 verbinde..

muss man dafür was spezielles einstellen oder ist das egal weils ja im 
prinzip ein loopback ist ?

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das TX vom AVR liegt auf Pin2 der DB9-Buchse. Dort sollte eine Spannung 
messbar sein.

Das TX vom PC liegt auf Pin3 des DB9-Kabelsteckers. Dort sollte auch 
eine Spannung messbar sein.

Bezugspunkt (GND) jeweils Pin5.

> Wenn ich den AVR Resette wird der tx pin von ~2,5V auf 0V gezogen.

2,5V ist mager, wenn der AVR nicht am senden ist. Betreibst du das Board 
vielleicht mit 3,3V (Jumper über R5 geschlossen) statt mit 5V (Jumper 
über R5 offen)?

Wenn der AVR am senden ist, kann 2,5V hinkommen. Das hängt von der 
Trägheit deines Voltmeters und der Verteilung von Bit0/Bit1 in deinem 
Sendestrom ab. Im Prinzip misst du dann ein PWM ähnliches Signal.

Autor: Jens Fiedler (insanitaeter)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also ein Echo entlocke ich dem board nicht, tx und rx verbunden, alle 
einstellungen in hyperterminal für die flusssteuerung (hardware, 
xon/xoff, keine) durchprobiert und das an 2 pcs.

Das board wird mit 5V betrieben

Zwischen Pin 3 und 9 am PC liegen ca 12 V an

Ich vermute irgendwas an dem board stimmt nicht was den rs232 angeht 
weil ich dort am ausgang nichts messen kann. Ist aber zu spät um 
weiterzubröseln, das mach ich morgen.

Vielen Dank schonmal !

Autor: Jens Fiedler (insanitaeter)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Moin,

hatte da im bezug auf Terminalprogramme was falsch verstanden..
Wenn ich TX und RX auf der 5V seite des RS232 verbinde bekomme ich ein 
Echo am PC. Soweit funktioniert also die Hardwareseite.
Also liegt es an der Software ? Sieht jemand nen Fehler ?

Autor: Jens Fiedler (insanitaeter)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Problem gelöst !

Wenn man
TXD (AVR) --> RX(5V Seite RS232)
RXD (AVR) --> DX(5V Seite des RS232)

steckt, funktionierts.

Muss man natürlich erstmal drauf kommen..

Ich dachte das ich das auch schon getestet hatte, aber da muss ich dann 
wohl das Terminalprogramm falsch eingestellt haben sonst wär mir der 
Zeichensalat der entgegenkommt sicher aufgefallen !

Vielen Dank an alle die mir geholfen haben den Fehler zu finden !

Autor: Andreas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich habe ein ähnliches Problem und komme nicht mehr weiter... sitze 
schon 2 Tage dran.... bin schon recht verwirrt.

selbst stufe ich mich als Anfänger ein, aber jeder fängt mal an.

Die Tutorials habe ich gemacht, jedoch hab ich ein Problem mit dem UART 
bei C-Code.

Hardwareseitig habe ich ein STK 500 und einen ATMEGA 8 und einen RS232 
auf USB Adapter (Welcher funktioniert!)

Jetzt zu meinem Problem.

Wenn ich den Uart über den Assembler-Code programmier2 klappt alles 
wunderbar, jetzt habe ich begonnen es in C zu schreiben und es kommt 
nichts im Terminal an. An der Hardware habe ich nichts geändert. Ich 
habe den Code von oben probiert, mit 4MHZ und einer Baud von 9600. Das 
2-adrige Kabel von RXD und TXD sitzt, sonst würde es ja unter Assembler 
auch nicht gehen.

Ich bitte um Rat... :-)

Was habe ich vergessen, bzw missverstanden?

Ich habe auch schon die Codes aus dem Datenblatt genommen, jedoch auch 
ohne Erfolg!

Danke schon einmal im vorraus!

Frohe Weihnachten!

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.