Forum: Mikrocontroller und Digitale Elektronik NewBee - UART - Zeigt nur komische Zeichen an lauter kleine Häuschen


von Askan Simon (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Zusammen,

meine erstes Uart klappt (arbeite ich seit heute Mittag dran...),
es werden im Hyperterminal Zeichen angezeigt, nur leider nicht
die richtigen.
1
#include <avr/io.h>
2
#include <avr/interrupt.h>
3
#include <stdio.h>
4
#include <stdint.h>
5
#include <util/delay.h>
6
7
#define F_CPU  16000000L
8
#define BAUDRATE 57600
9
10
int put_char (char c) {
11
  loop_until_bit_is_set(UCSR0A, UDRE);
12
  UDR0 = c;
13
  return (0);
14
}
15
16
int main(void) {
17
18
  // Uart Initalisieren
19
  UCSR0B  = (1 << TXEN) | (1 << RXEN);
20
  UCSR0A |= (1<<U2X); // doppeltes Tempo
21
  // Interrupt freigeben
22
  UCSR0B |= (1<<RXCIE);
23
  UCSR0B |= (1<<TXCIE);
24
  // Teiler setzen
25
  UBRR0L = (F_CPU / (BAUDRATE * 8L) - 1);
26
27
  sei();
28
29
  while (1) {
30
    put_char(2);
31
              _delay_ms(150);
32
    };
33
}

ob ich  nun bei put_char 2 oder auch "x" eingebe,
ständig sieht das Ergebnis so aus. (Siehe Anhang.)

Ich habe eine Atmega 64 16AU mit einem 16mHz Oszillator.

Sobald ich die Verzögerung (_delay_ms(150);) verändere
ändert sich auch das Tempo der der merkwürdigen Zeichen.
Verbuch ich schon unter Erfolge :-)

Den Quellcode habe ich weitgehend aus einem Beispiel
für einen Atmega 64 / 20Mhz übernommen.

Über Hilfe würde ich mich sehr freuen.
Ein Ähnliches Problem hab ich im Forum leider nicht
finden könnten.

Danke & Viele Grüße aus Neuss
Askan

von Andreas K. (ergoproxy)


Lesenswert?

Hm als erstes würde ich an deiner Stelle ein anderes Terminalprogram 
nehmen. Das Windowseigene ist gelinde gesagt schrott (finde ich) und 
dann versuch es erstmal mit einer niedrigeren Baudrate. Meine ersten 
Versuche waren bei 9600 und die 57600 kommen mir etwas hoch vor.

Hast du schonmal geschaut wie der Error bei deiner Baudrate und dem Takt 
ist? Du weißt sicherlich, dass nicht jeder Takt mit jeder Baudrate 
funktioniert.

Gruß ErgoProxy

von yalu (Gast)


Lesenswert?

> ob ich  nun bei put_char 2 oder auch "x" eingebe,

Das Zeichen mit dem Code 2 ist ein Steuerzeichen, da können je nach
Terminalprogramm sehr seltsame Dinge passieren.

"x" ist eine Stringkonstante, da sollte der Compiler mindestens eine
Warnung aussprechen.

Hast du es schon mit
1
put-char('2');

versucht? Wenn dann immer noch Müll angezeigt wird, stimmt etwas mit den
Schnittstellenparametern (Baudrate, Anzahl Datenbits usw.) nicht. Also
noch einmal nachrechnen und mit den Einstellungen in Hyperterminal
vergleichen.

von crazy horse (Gast)


Lesenswert?

naja, so schlecht ist Hyperterminal nun auch wieder nicht (auch wenn 
einige wirklich wichtige Sachen fehlen).
Versucht mal, mit Bray-Terminal (war bis jetzt immer mein Favorit) ein 
paar grössere Blöcke mit 115k zu übertragen :-(

von Ooohhh (Gast)


Lesenswert?

Wenn man sich fuer die Zeichen interessiert, sollte man sich die daten 
als Hex ausgeben lassen, so kann man allenfalls eine Gesetzmaessigkeit 
erkennen.

von Askan Simon (Gast)


Lesenswert?

Hallo,

super vielen Dank für die Hilfe.

Mit kleiner Baudrate (9600) und '2' klappt es, es werden nur zweien
angezeigt.

Klasse. Ich versuch dann man sowas wie printf einzubauen.
Juhuuu :)
Askan

von Peter Diener (Gast)


Lesenswert?

Hallo,

dein Hyperterminal ist auf automatische Erkennung der Verbindung 
eingestellt. Das kann nicht funktionieren.

Verstell folgendes:

Datei->Eigenschaften. Ein Dialogfenster geht auf, wähle beim 
Dropdownmenu "Verbinden über" deinen ComPort aus (vermutlich COM1). Dann 
auf "Konfigurieren" drücken. Ein weiteres Fenster geht auf. Stell hier 
"Bits pro Sekunde" auf 57600, "Datenbits" auf 8, "Parität" keine, 
"Stoppbits" 1 und "Flusssteuerung" auf kein.

Dann sollte es funktionieren.

Und ich kann nur wiederholen, was bereits gesagt wurde, nimm ein anderes 
Terminal, wenns besser gehn soll. Es eignet sich Putty für flüssige 
Terminalsitzungen sehr gut. Zum Debuggen empfehle ich RealTerm, da kann 
man alles mögliche zusätzlich einstellen und die Daten in allen 
möglichen Darstellungen anzeigen lassen und auch senden.

Viel Erfolg,

Peter

von Peter Diener (Gast)


Lesenswert?

Wenn jetzt Zweien angezeigt werden, ist das auch falsch.

put_char(2); sendet das ASCII Zeichen mit der Nummer 2, das ist keine 
ASCII 2.

Eine Zwei sendet man so:

put_char('2');  //Hochkommas, damit es ein ASCII-Zeichen ist.

Peter

von Askan Simon (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

vielen Dank für die Hilfe. Ich habe es jetzt mal mit RealTerm probiert.
und so sieht das aus.

Übersetze ich die Ausgegebenen Zeichen kommt hier nonstop in in HEX
1
E0 00 E0 E0 00 E0 E0 00 E0 E0 00 E0 E0 00 E0 E0 
2
E0 00 E0 E0 00 E0 E0 00 E0 E0 00 E0 E0 00 E0 E0 
3
E0 00 E0 E0 00 E0 E0 00 E0 E0 00 E0 E0 00 E0 E0 
4
E0 00 E0 E0 00 E0 E0 00 E0 E0 00 E0 E0 00 E0 E0 
5
E0 00 E0 E0 00 E0 E0 00 E0 E0 00 E0 E0 00 E0 E0

Was mich irritiert, rechts sieht man bei RealTerm den Status,
hier leuchtet nicht der TXD(3) Pin, aber der Ring(9) Pin leuchtet ab
und zu auf.

Nicht das ich da einen Hardware Fehler habe...

Danke & Viele Grüße aus Neuss
Askan

von Askan Simon (Gast)


Angehängte Dateien:

Lesenswert?

die Einstellungen in Port sehen so aus ...

von Andreas K. (ergoproxy)


Lesenswert?

Irre ich mich oder steht TXD für senden - du empfängst doch nur nonstop. 
Warum sollte da TXD leuchten? Das mit dem Ring hm keine Ahnung wie 
Sauber ist dein Anschluss an den PC den gelötet ^^

Empfängst du denn jetzt genau das, was du sendest oder immernoch nur 
Zeichenmüll?

Gruß ErgoProxy

von Askan Simon (Gast)


Lesenswert?

Hallo,

leider nein, funktioniert noch nicht richtig
ich sehe gerade im Tutorial
1
Über TXD ("Transmit Data") werden Daten gesendet, RXD ("Receive Data") dient zum Empfang von Daten.

kennt das vielleicht jemand bei dem RealTerm läuft...?

Danke & Viele Grüße
Askan

von Andreas K. (ergoproxy)


Lesenswert?

Wenn ich die Einstellung auf den Bildern richtig erkenne, dann hast du 
dort eine Baudrate von 57600 eingestellt. Ich dachte mit 9600 ging es - 
Warum hast du es dann wieder auf die 57600 abgeändert?

Könntest du nochmal deinen aktuellen Quellcode posten + die aktuellen 
Einstellungen bei deinem Terminalprogram?

Gruß ErgoProxy

von Askan Simon (Gast)


Angehängte Dateien:

Lesenswert?

Hallo ErgoProxy.

mein Quelltext sieht so aus
1
#include <avr/io.h>
2
#include <avr/interrupt.h>
3
#include <stdio.h>
4
#include <stdint.h>
5
#include <util/delay.h>
6
7
#include "test.h"
8
9
#define F_CPU 16000000UL
10
#define BAUD 9600UL          // Baudrate
11
12
// Berechnungen
13
#define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1)   // clever runden
14
#define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1)))     // Reale Baudrate
15
#define BAUD_ERROR ((BAUD_REAL*1000)/BAUD) // Fehler in Promille, 1000 = kein Fehler.
16
17
#if ((BAUD_ERROR<990) || (BAUD_ERROR>1010))
18
  #error Systematischer Fehler der Baudrate grösser 1% und damit zu hoch!
19
#endif
20
21
22
int put_char (char c) {
23
  if (c == '\n') {
24
    put_char('\r');
25
  }
26
  loop_until_bit_is_set(UCSR0A, UDRE);
27
  UDR0 = c;
28
  return (0);
29
}
30
31
void put_chars (char *s) {
32
  while(*s) {
33
    put_char(*s);
34
    s++;
35
  }
36
}
37
38
int main(void) {
39
40
  // Uart Initalisieren
41
  UCSR0B  = (1 << TXEN) | (1 << RXEN);
42
  UCSR0A |= (1<<U2X); // doppeltes Tempo
43
  // Interrupt freigeben
44
  UCSR0B |= (1<<RXCIE);
45
  UCSR0B |= (1<<TXCIE);
46
  // Teiler setzen
47
  UBRR0L = UBRR_VAL;
48
49
  sei();
50
51
  while (1) {
52
    put_char('2');
53
    put_char('3');
54
      _delay_ms(500);
55
    };
56
}

Die Einstellungen von Realterm anbei.

Leider kommt ich nicht weiter...

Danke & Viele Grüße
Askan

von Askan Simon (Gast)


Angehängte Dateien:

Lesenswert?

und der zweite Reite in Realterm, auch eine Baud von 9600 verändert zwar
das Bild, ergibt aber keine klaren Zeichen (2 und 3...) nur in Hex A5
nonstop

von Jean P. (fubu1000)


Lesenswert?

Hi,
UCSR0A |= (1<<U2X); // doppeltes Tempo
durch setzen dieses Bits sendest du nicht mit 9600, sondern mit 19200 
Baud.
Ergo Zeile löschen, oder 19200 Baud im Terminal einstellen.

Gruß

von Askan Simon (Gast)


Lesenswert?

Vielen Dank für die Super Hilfe.

Jetzt erscheint (auskommentiert bei 9600 Baud im Terminal)
tatsächlich 232323232...

super Forum!!! :)

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.