Forum: Mikrocontroller und Digitale Elektronik Probleme mit Uart


von Jakob (Gast)


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!

von Kurt, ohne Helm und ohne Gurt (Gast)


Lesenswert?

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

von Jakob (Gast)


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.

von Dieter Brüggemann (Gast)


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

von Jakob (Gast)


Lesenswert?

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

von Dieter Brüggemann (Gast)


Lesenswert?

Hallo

Arbeitest du mit Hyperterminal ??

Probier mal das Terminal aus. Ist echt Klasse

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


MFG
Dieter

von Jakob (Gast)


Lesenswert?

Das hab ich eben auch schon ausprobiert. Aber keine Änderung.....

von Uwe Nagel (Gast)


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...

von Jakob (Gast)


Lesenswert?

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

von Uwe Nagel (Gast)


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.

von Jakob (Gast)


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.

von Dieter Brüggemann (Gast)


Angehängte Dateien:

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

von Jakob (Gast)


Angehängte Dateien:

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.

von R.Janßen (Gast)


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

von Thomas V. (Gast)


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

von R.Janßen (Gast)


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

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.