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
intmain(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
return0;
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 ?
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).
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.
> 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.
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.
Wenn das das Schaltbild von deinem Board ist:
http://www.olimex.com/dev/avr-p28.htmlhttp://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 MAX232AVR 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.
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.
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 ?
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.
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 !
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 ?
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 !
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!