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


von Jens Fiedler (Gast)


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
1
#include <avr/io.h>
2
#include <avr/interrupt.h>
3
#include <inttypes.h>
4
#include <stdlib.h>
5
 
6
#ifndef F_CPU
7
8
#warning "F_CPU war noch nicht definiert, wird nun nachgeholt mit 4000000"
9
#define F_CPU 8000000L    // Systemtakt in Hz, das L am Ende ist wichtig, NICHT UL verwenden! 
10
#endif
11
 
12
#define BAUD 19200L          // Baudrate, das L am Ende ist wichtig, NICHT UL verwenden!
13
#define UBRR_VAL 25   //19200 BAUD
14
15
int main(void)
16
{
17
    UCSRB |= (1<<TXEN);                // UART TX einschalten
18
    UCSRC |= (1<<URSEL)|(3<<UCSZ0);    // Asynchron 8N1 
19
 
20
    UBRRH = UBRR_VAL >> 8;
21
    UBRRL = UBRR_VAL & 0xFF;
22
23
  while(1)
24
  {
25
    while (!(UCSRA & (1<<UDRE)))  /* warten bis Senden moeglich                   */
26
      {
27
      }
28
 
29
      UDR = 'x';                    /* schreibt das Zeichen x auf die Schnittstelle */
30
  }
31
  return 0;
32
}

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 ?

von Stefan B. (stefan) Benutzerseite


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 
?-)

von Jens F. (insanitaeter)


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).

von Stefan B. (stefan) Benutzerseite


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.

von Stefan B. (stefan) Benutzerseite


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.

von Stefan B. (stefan) Benutzerseite


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.

von Stefan B. (stefan) Benutzerseite


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.

von Jens F. (insanitaeter)


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.

von Jens F. (insanitaeter)


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 ?

von Stefan B. (stefan) Benutzerseite


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.

von Jens F. (insanitaeter)


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 !

von Jens F. (insanitaeter)


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 ?

von Jens F. (insanitaeter)


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 !

von Andreas (Gast)


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!

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.