Probleme mit Uart

Gast #88281
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!
Gast #88283
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.
Gast #88288
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...
Gast #88290
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.
Gast #88292
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
Angehängte Dateien:
Gast #88293
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.
Angehängte Dateien:
Gast #88294
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
Gast #88295
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
Gast #88297
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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren