Forum: Mikrocontroller und Digitale Elektronik UART funktioniert nicht


von Florian (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,
ich habe mir mal den code ausm avr-gcc tutorial geschnappt und versucht 
damit mein USART zu programmieren, jedoch funktioniert dieses leider 
nicht.

Ich benutze einen Mega8.
Und das Atmel Evulationsboard Ver. 2.01 von Pollin.
Die datei hab ich vorsichtshalber nochmal angehengt.

Wär nett, wenn ihr mir ein paar Tips  geben könntet.

Vielen Dank schon einmal
Florian

von Gast (Gast)


Lesenswert?

Zeile 42

von Otto (Gast)


Lesenswert?

Fuses ?

Otto

von Karl H. (kbuchegg)


Lesenswert?

Zieh mal die Ausgabe in die Schleife hinein, damit der AVR ein bischen 
mehr sendet als nur 1-mal 'x'
1
....
2
3
    while( 1 ) {
4
      while (!(UCSRA & (1<<UDRE)))  /* warten bis Senden moeglich                   */
5
      {
6
      }
7
 
8
      UDR = 'x'; 
9
    }
10
}

von Florian (Gast)


Lesenswert?

Also ich habs auch schon in der schleife gehabt, jedoch funktioniert es 
dann auch nicht.

Zu den Fuses kann ich morgen erst neues sagen, da ich morgen erst wieder 
auf der Arbeit bin, jedoch weiß ich, dass ein interner RC-Oszillator von 
1MHz eingestellt ist.

Danke für eure Antworten
Florian

von Karl H. (kbuchegg)


Lesenswert?

Florian schrieb:
> Also ich habs auch schon in der schleife gehabt, jedoch funktioniert es
> dann auch nicht.
>
> Zu den Fuses kann ich morgen erst neues sagen, da ich morgen erst wieder
> auf der Arbeit bin, jedoch weiß ich, dass ein interner RC-Oszillator von
> 1MHz eingestellt ist.

Was grundsätzlich schon einmal problematisch ist.

Was heisst in diesem Zusammenhang eigentlich 'funktioniert nicht'.
Kommt irgendetwas an, kommt gar nichts an?

Hast du die Hardware (MAX232 / Kabel) schon durchgeprüft?

von Florian (Gast)


Lesenswert?

Also es kommt nichts an.
Ich benutze Putty und hab das Kabel also den USB-Seriell Wandler 
insofern geprüft, dass ich eine Schaltung von einem Kollegen 
angeschlossen habe und die hat einwandfrei funktioniert.

Durchgeprüft hab ich dem MAX232, welchen ich benutze, jedoch noch nicht.
Aber das wird morgen wohl das erste sein, was ich machen werde, vielen 
Dank :D

Florian

von Karl H. (kbuchegg)


Lesenswert?

Florian schrieb:
> Also es kommt nichts an.
> Ich benutze Putty und hab das Kabel also den USB-Seriell Wandler
> insofern geprüft, dass ich eine Schaltung von einem Kollegen
> angeschlossen habe und die hat einwandfrei funktioniert.

Das sagt noch gar nichts.

>
> Durchgeprüft hab ich dem MAX232, welchen ich benutze, jedoch noch nicht.
> Aber das wird morgen wohl das erste sein, was ich machen werde, vielen
> Dank :D

Du machst das so:
Am Prozessor verbindest du Rx mit Tx. Dazu nimmst du den Prozessor aus 
seinem Sockel und verbindest du Pins mit einer Drahtbrücke.

Am PC, im Terminalprogramm tippst du Zeichen. Diese Zeichen müssen 
wieder am Terminal erscheinen. Erst dann weisst du, dass die komplette 
Kette PC->Kabel->MAX232->Prozessorsockel->MAX232->Kabel->PC 
funktioniert.

von Florian (Gast)


Lesenswert?

Hallo,
danke für den Tipp, hätt das viel umständlicher versucht, aber das is ne 
klasse Art und Weise zu messehn :D
Werd die Ergebnisse dann mitteilen :P

Danke noch einmal
Florian

von Florian (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

ich hatte vergessen, dass ich gestern meinen Schultag hatte, von daher 
konnte ich heute erst prüfen.

Wenn ich die Jumper für RX und TX verbinde, dann kommt das Selbe 
Ergebnis, als wenn ich diese nicht verbinde.

Ich habe den MAX232 auch schon ausgetauscht und schon wieder das 
gleiche.

Aber am USB - Seriell Wandler sollte es auch nicht liegen, da dieser bei 
anderen Geräten funktioniert.

Anbei lege ich, was mir Putty nach betätigen der Return Taste 
zurückliefert.

Florian

von Florian (Gast)


Lesenswert?

Hallo,
könnte es an der Beschaltung vom Seriellen Ports liegen?

Hier ist die Beschreibung
http://www.pollin.de/shop/downloads/D810038B.

Danke,
Florian

von Florian (Gast)


Lesenswert?

sry, habe das pdf vergessen.
Hier der richtige Link:
http://www.pollin.de/shop/downloads/D810038B.PDF

von Daemonicus (Gast)


Lesenswert?

Hallo,

ich hatte schonmal ein ähnliches Problem...

Lösung:

--> Schreibe byteweise die Register nicht bitweise <--
_________________________________________________________
Bsp.:

// USART initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART Receiver: On
// USART ReceiveCompleteISR: On
// USART Transmitter: On
// USART Mode: Asynchronous
// USART Baud rate: 9600
UCSRA=0x80;
UCSRB=0x98;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x67;
_________________________________________________________


Es kommt natürlich auch auf Deinen compiler+entw.-umgebung an. Ich habe 
die erfahrung mit einigen entwicklungsumgebungen gemacht, dass einzelne 
registerbits ums verrecken nicht einzeln gesetzt werden (warum auch 
immer). Schreibe ich allerdings ein ganzes byte ins Register, klappt es 
tadellos!

Kannst du vielleicht mal nen Ausschnitt Deines Schaltplans online 
stellen, vielleicht sieht man darauf ja etwas, was evtl. das Problem 
sein könnte...?! Die Beschaltung eines MAX232 ist zwar kein Geheimnis 
aber immer wieder kann man was vergessen!

Gruß

von Florian (Gast)


Lesenswert?

Hallo,
danke für die Antwort werd es gleich ausprobieren.
Der Schaltplan ist in der PDF datei mit drinne, zu der ich vorhin den 
Link geschickt hatte.
Ich benutze das myAVR Workpad, falls du das auch noch wissen willst.

Ich melde mich dann, wenn ichs nochmal ausprobiert habe.

Florian

von Florian (Gast)


Lesenswert?

Hallo,
habe jetzt folgenden Code benutzt, und es  funktioniert immernoch nicht.
1
int main(void)
2
{
3
  UCSRB |= 0x08;                // UART TX einschalten
4
  UCSRC |= 0x86;    // Asynchron 8N1 
5
6
  UBRRH = 0x00;
7
  UBRRL = 0x13;
8
9
  
10
11
  while(1)  
12
  {
13
    while (!(UCSRA & 0x20))  /* warten bis Senden moeglich */
14
    {
15
    }
16
  
17
    UDR = 'x'; 
18
  }     
19
}

für UBRRH habe ich, falls ich mich nicht verrechnet habe bei 1MHz und 
bei 2400Baud den Wert 25 errechnet.

Florian

von Daniel (Gast)


Lesenswert?

0x13 ist 19dez
25dez ist 0x19

von Daniel (Gast)


Lesenswert?

mach mal
1
UBRRL = 0x19;
oder
1
UBRRL = 25;
dann sollte es auch funktionieren
Gruß Daniel

von Florian (Gast)


Angehängte Dateien:

Lesenswert?

Hier sind übrigens noch die Fuses.

Florian

von Daniel (Gast)


Lesenswert?

Und ändere noch
1
UCSRC = 0x06;
ab.
Gruß

von Blackbird (Gast)


Lesenswert?

Mit dem internen RC-Oszillator hast Du nie die Sicherheit, dass es trotz 
funktionierenden Programm zu vernüftigen Ergebnissen kommt. Kann gehen 
oder auch nicht. Wenn Du aber noch andere Fehler vermutest, z.B. 
Hardware, dann ist es ganz schlecht, gleich mit zwei Unsicherheiten den 
ersten Test zu fahren.
Also: Quarz rein, Baudratenquarz wenn möglich, Fuses passend setzen und 
die Beschaltung so machen wie im vorgegebenen Beispiel.

Dann sollte es gehen (oder die Fehlersuche ist einfacher).


Blackbird

von Florian (Gast)


Lesenswert?

Stimmt, verrechnet :)

Aber es funktioniert leider trotzdem nicht.

Florian

von Florian (Gast)


Lesenswert?

Ich habe ein Quarz drinne, nur traue ich mich nicht, es bei den Fuses 
einzustellen, da ich es schon beim letzten Mega8 falsch eingestellt 
hatte und den dadurch nicht mehr nutzen kann :)

Kannst du mir sagen, welches ich setzen muss, mit nem 8MHz Quarz?

Danke,
Florian

von Karl H. (kbuchegg)


Lesenswert?

Florian schrieb:

> Wenn ich die Jumper für RX und TX verbinde, dann kommt das Selbe
> Ergebnis, als wenn ich diese nicht verbinde.

Was jetzt?
Kommt was, oder kommt nix? Mach bitte eindeutige Aussagen. Denk immer 
daran: Wir sehen nicht auf deinen Bildschirm!

Solange dieser einfache Test nicht 100% funktioniert, hat es keinen Sinn 
in der Software nach Fehlern zu suchen. Dieser Test gibt dir eine 
Aussage darüber, ob die Hardware komplett stimmt. Über die Rx-Tx Brücke 
sendet sich der PC selbst Zeichen, wobei die Zeichen die komplette 
Hardwarekette entlang laufen müssen:
PC -> Kabel -> MAX232 -> Brücke im µC-Sockel -> MAX232 -> Kabel -> PC

Da wir davon ausgehen können, dass die serielle Schnittstelle im PC in 
Ordnung ist, MUSS das funktionieren. Wenn es nicht funktioniert, ist der 
häufigste Grund darin zu suchen, dass das Kabel falsch rum ist. Also 
Kabel einfach mal probehalber auskreuzen, bzw die Auskreuzung entfernen 
(an einem Ende Pin 2 mit Pin 3 vertauschen).

Auch wichtig: Im PC-Terminalprogramm muss die Flusskontrolle 
abgeschaltet sein.

Nochmal: Dieser Test, muss 100% klappen! Solange das nicht funktioniert, 
hat es keinen Sinn weiter zu machen.

von Karl H. (kbuchegg)


Lesenswert?

Und auch den Gegentest machen.
Wenn du die Brücke im µC-Sockel entfernst und auf dem PC tippst, darf 
keine Antwort mehr kommen. Siehst du das Getippte auf deinem Terminal, 
dann ist 'lokales Echo' eingeschaltet -> ausschalten und nochmal testen

von Florian (Gast)


Lesenswert?

Ich hab die Schaltung jetzt mal an einen anderen PC angeschlossen und 
dort ausprobiert.
Dort funktioniert sie, jedoch erscheint in der Konsole statt einem 'x' 
imer ein 'á'.
Hängt das mit der Baudrate oder mit dem Takt zusammen?

Danke
Florian

von Karl H. (kbuchegg)


Lesenswert?

Florian schrieb:
> Ich hab die Schaltung jetzt mal an einen anderen PC angeschlossen und
> dort ausprobiert.

Dann dürfte dein USB/RS232 Wandler der Übeltäter sein.

> Dort funktioniert sie, jedoch erscheint in der Konsole statt einem 'x'
> imer ein 'á'.
> Hängt das mit der Baudrate oder mit dem Takt zusammen?

Beides. Die Baudrate ist mit dem Takt gekoppelt. Stimmt der Takt nicht, 
stimmt auch die Baudrate nicht.
Sagten wir schon einmal, dass der interne RC-Oszillator nicht besonders 
gut geeignet ist um eine serielle Schnittstelle zu betreiben?

von Florian (Gast)


Lesenswert?

Okay, danke :)

Worauf muss ich denn jetzt die Fuses setzen, ich hatte ja erwähnt, dass 
ich ein 8MHz Quarz angeschlossen hab, jedoch hab ich gemerkt, dass das 
ein Irrtum war und ich ein 16MHz Quarz angeschlossen habe.

Es gibt aber ja so viele möglichkeiten, für einen externen Quarz, und da 
weiß ich nicht genau, was ich jetzt  einstellen soll.

Florian

von neuling (Gast)


Lesenswert?

fuses? nimm mal D9 FF

dann hast nur SPIEN an das ist SPI enable

von Karl H. (kbuchegg)


Lesenswert?

Florian schrieb:

> Es gibt aber ja so viele möglichkeiten, für einen externen Quarz, und da
> weiß ich nicht genau, was ich jetzt  einstellen soll.

http://www.mikrocontroller.net/articles/AVR_Fuses

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.