mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Probleme mit Uart


Autor: Jakob (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

ich habe ein sehr seltsames Problem mit einem ATMEGA8515. Ich habe
folgenden Sourcecode:


.include "C:\m8515def.inc"

.def temp = r16
.equ CLOCK = 7372800
.equ BAUD = 115200
.equ UBRRVAL = CLOCK/(BAUD*16)-1

        ; Stackpointer initialisieren
        ldi temp, LOW(RAMEND)
        out SPL, temp
        ldi temp, HIGH(RAMEND)
        out SPH, temp

        ; Baudrate einstellen
        ldi temp, LOW(UBRRVAL)
        out UBRRL, temp
        ldi temp, HIGH(UBRRVAL)
        out UBRRH, temp

        ; Frame-Format: 8 Bit
        ldi temp, (1<<URSEL)|(3<<UCSZ0)
        out UCSRC, temp

        sbi UCSRB,TXEN                    ; TX aktivieren

loop:   ldi temp, 1
        rcall serout                      ; Unterprogramm aufrufen
        rjmp loop

serout:
        sbis UCSRA,UDRE                   ; Warten bis UDR für das
nächste
                                          ; Byte bereit ist
        rjmp serout
        out UDR, temp
        ret                               ; zurück zum Hauptprogramm


Der größte Teil kommt von dieser Seite. Wenn ich in diese Zeile:
loop:   ldi temp, 1
durch diese:
loop:   ldi temp, 0

ersetze, dann kommt in meinem Windows Prog. auch 0 als Zahlenwert an.
Wenn ich jetzt aber 1 oder eine belibige andere Zahl bis 255 einsetzte,
dann kommt immer nur ein Muster aus den Werten 192, 128, 63 und 0. Ich
bekomme keine vernünftige Ausgabe. Worann kann das liegen? Ich habe
sogar schon den IC gewechselt, aber das ändert nichts.

Danke für eure Hilfe!

Autor: Kurt, ohne Helm und ohne Gurt (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schau mal in eine ASCII Tabelle, dann weisst du, was in temp geladen
werden muss um ein gewünschtes Zeichen zu senden

Autor: Jakob (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

das bringt aber nichts. Wenn ich 0 hinschreibe, dann bekomme ich auch 0
als Zahl ausgegeben. Wenn ich 1 hinschreibe, dann bekomme ich nur noch
misst, der sich aus abwechselt 192,128,63,0 zusammensetzt. Das ist
total komisch.

Autor: Dieter Brüggemann (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

Dann setze doch erstmal die BAUDRATE runter auf 9600 und gebe nur

ldi temp, 65

aus.

Welches Programm läuft denn auf dem PC ? Ich nehme immer 'Terminal'

MFG
Dieter

Autor: Jakob (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn ich die Bautrate runtersetze, dann ändert sich rein garnichts. Nur
das die seltsamen Zahlen halt langsamer kommen. ICh bin total
verzweifelt

Autor: Dieter Brüggemann (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

Arbeitest du mit Hyperterminal ??

Probier mal das Terminal aus. Ist echt Klasse

http://bray.velenje.cx/avr/terminal/


MFG
Dieter

Autor: Jakob (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das hab ich eben auch schon ausprobiert. Aber keine Änderung.....

Autor: Uwe Nagel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kann es sein, dass die Polarität deines Signals falschrum ist ?
Wie hast Du den Atmel mit dem PC verbunden ?
Direkt oder über den üblichen Pegelwandler, der das Signal invertiert
?
Hyperterminal wird's wohl nicht sein, das zeigt keine Zahlen an...

Autor: Jakob (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich hab einen MAX232 als Pegelwandler dran. Ich hab einmal das Prgramm
Terminal benutzt und einmal ein selber geschriebenes.

Autor: Uwe Nagel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok, jetzt würde ich zum Oszilloskop greifen und mir mal anschauen, was
aus dem Controller wirklich rauskommt.
Am Programm fällt mir nichts auf  und die Schaltung ist wohl auch OK.
Nochwas: läuft der Prozessor wirklich mit dem Quarztakt oder arbeitet
der eventuell mit dem internen RC-Oszillator ?
Das wäre beim neuen Bauteil so eingestellt und muss im LFUSE-Register
geändert werden.

Autor: Jakob (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich bin auch schon mit dem Oszi ran. Es kommt(egal was ich sende, bis
auf 0 eben) ein Art Rechteck wobei "oben" und "unten" je etwa
gleich lang sind.

Autor: Dieter Brüggemann (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

Mit dem Takt das hast du aber schon geprüft.
Ansonsten teste den Takt doch mal mit deinem Oszi.

Kleine Schleife mit PORT auf Ausgang und dann am Ozsi mal messen.

do
  PORT HIGH
  PORT LOW
loop

Was hast du denn jetzt für High/ LOW Zeiten jetzt an dem TX Pin ??


Hier mal ein Testprogramm von einem MEGA16. Sollte aber auch laufen.

9600 BAUD.

MFG
Dieter

Autor: Jakob (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

hatte in den letzten Tagen keine Zeit mich um das Problem zu kümmern.
Jetzt habe ich mal ein Bild von meinem Problem gemacht, vielleicht
könnt ihr mir dann helfen. Auf dem Bild ist oben das Signal zu sehen,
was hinter dem MAX232 heraus kommt. Das Signal unten ist einefach um zu
sehen wann etwas gesendet wird. Wenn das einmal kurz high und dann
wieder low ist, dann wird 0 gesendet (als Zahl, nicht als Buchstabe).
Und dann wieder von vorne. Ich habe keine Ahnung wie dieses Signal zu
stande kommt, aber das Programm im uC sollte richtig sein.

Danke für eure Hilfe.

Autor: R.Janßen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für den Tipp mit dem internen RC-Oszillator. Der war nämlich der
Grund für die Fehlfunktionen meines ATMEGA 16. Ich bin vom 2313
umgestiegen und hatte natürlich diese wichtige Stelle im Datenblatt
überlesen. Ist es nun besser den internen Oszi zu benutzen oder ist ein
Quarz die bessere Alternative?

mfg
Rob

Autor: Thomas V. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
ich arbeite zwar nicht mit dem 8515, hätte aber
folgende Tips:
1. Stellt Dein Befehl für das Frame-Format auch
Parität und Anzahl der Stoppbits ein? Versuch mal
9600 Baud, 8bit, keine Parität und 1 Stopbit.
Schreibt man in Kurzform meist 9600,8,n,1
2. Stelle Hyperterminal ebenfalls auf dieses Frame-
Format ein!
3. Sende keine niedrigen Zahlen, da diese eher zu
Steuerzwecken gedacht sind. Schau Dir dazu mal eine
ASCII-Tabelle an, darstellbare Zeichen fangen erst
bei größeren Zahlen an.
4. Versuch mal eine kurze Pause nach jedem Zeichen,
z.B. 1ms.
5. Für das Wort "HELLO" müsstest Du also 72,69,76,
76,79 senden.
6. Hast Du tatsächlich einen Quarz mit 7,372800 MHz?

Viel Erfolg
Thomas

Autor: R.Janßen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
danke für die Hilfe

das problem hat sich bereits gelöst. ich hatte übersehen, dass beim
ATMEGA16 der interne rc-oszillator voreingestellt ist (mit 1 MHz).
das war ich vom 2313 nicht gewöhnt und hatte die zeile im datasheet
einfach überlesen. habe jetzt intern 8 MHz eingestellt und alles
funktioniert bestens. jetzt werde ich mal den adc ausprobieren, um
sensormesswerte seriell an mein visuall c++ programm zu übertragen.

mfg
Rob

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.