mikrocontroller.net

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


Autor: Askan Simon (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Zusammen,

meine erstes Uart klappt (arbeite ich seit heute Mittag dran...),
es werden im Hyperterminal Zeichen angezeigt, nur leider nicht
die richtigen.
#include <avr/io.h>
#include <avr/interrupt.h>
#include <stdio.h>
#include <stdint.h>
#include <util/delay.h>

#define F_CPU  16000000L
#define BAUDRATE 57600

int put_char (char c) {
  loop_until_bit_is_set(UCSR0A, UDRE);
  UDR0 = c;
  return (0);
}

int main(void) {

  // Uart Initalisieren
  UCSR0B  = (1 << TXEN) | (1 << RXEN);
  UCSR0A |= (1<<U2X); // doppeltes Tempo
  // Interrupt freigeben
  UCSR0B |= (1<<RXCIE);
  UCSR0B |= (1<<TXCIE);
  // Teiler setzen
  UBRR0L = (F_CPU / (BAUDRATE * 8L) - 1);

  sei();

  while (1) {
    put_char(2);
              _delay_ms(150);
    };
}


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

Autor: Andreas K. (ergoproxy)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: yalu (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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
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.

Autor: crazy horse (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 :-(

Autor: Ooohhh (Gast)
Datum:

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

Autor: Askan Simon (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Peter Diener (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Peter Diener (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Askan Simon (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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
E0 00 E0 E0 00 E0 E0 00 E0 E0 00 E0 E0 00 E0 E0 
E0 00 E0 E0 00 E0 E0 00 E0 E0 00 E0 E0 00 E0 E0 
E0 00 E0 E0 00 E0 E0 00 E0 E0 00 E0 E0 00 E0 E0 
E0 00 E0 E0 00 E0 E0 00 E0 E0 00 E0 E0 00 E0 E0 
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

Autor: Askan Simon (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
die Einstellungen in Port sehen so aus ...

Autor: Andreas K. (ergoproxy)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Askan Simon (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

leider nein, funktioniert noch nicht richtig
ich sehe gerade im Tutorial
Ü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

Autor: Andreas K. (ergoproxy)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Askan Simon (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo ErgoProxy.

mein Quelltext sieht so aus
#include <avr/io.h>
#include <avr/interrupt.h>
#include <stdio.h>
#include <stdint.h>
#include <util/delay.h>

#include "test.h"

#define F_CPU 16000000UL
#define BAUD 9600UL          // Baudrate

// Berechnungen
#define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1)   // clever runden
#define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1)))     // Reale Baudrate
#define BAUD_ERROR ((BAUD_REAL*1000)/BAUD) // Fehler in Promille, 1000 = kein Fehler.

#if ((BAUD_ERROR<990) || (BAUD_ERROR>1010))
  #error Systematischer Fehler der Baudrate grösser 1% und damit zu hoch!
#endif


int put_char (char c) {
  if (c == '\n') {
    put_char('\r');
  }
  loop_until_bit_is_set(UCSR0A, UDRE);
  UDR0 = c;
  return (0);
}

void put_chars (char *s) {
  while(*s) {
    put_char(*s);
    s++;
  }
}

int main(void) {

  // Uart Initalisieren
  UCSR0B  = (1 << TXEN) | (1 << RXEN);
  UCSR0A |= (1<<U2X); // doppeltes Tempo
  // Interrupt freigeben
  UCSR0B |= (1<<RXCIE);
  UCSR0B |= (1<<TXCIE);
  // Teiler setzen
  UBRR0L = UBRR_VAL;

  sei();

  while (1) {
    put_char('2');
    put_char('3');
      _delay_ms(500);
    };
}


Die Einstellungen von Realterm anbei.

Leider kommt ich nicht weiter...

Danke & Viele Grüße
Askan

Autor: Askan Simon (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Jean Player (fubu1000)
Datum:

Bewertung
0 lesenswert
nicht 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ß

Autor: Askan Simon (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank für die Super Hilfe.

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

super Forum!!! :)

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.