Forum: Mikrocontroller und Digitale Elektronik ATmega8 und UART Probleme


von Sven Scholz (Gast)


Angehängte Dateien:

Lesenswert?

Also irgendwie bekomme ich meine serielle Verbindung über UART nicht am
Laufen. Ich benutze hier einen ATmega8, der extern von einem Oszillator
auf 4 MHz gebracht wird (werden soll).

Ich bin mir zunächst nicht sicher, ob die Fuses dafür richtig gesetzt
sind, deshalb der Dateianhang...
Stimmt das so? Der Oszillator ist über XTAL1 mit dem Mikrocontroller
verbunden.
Funktioniert UART eigentlich nur mit externer Taktung oder geht das
auch über die Internal Clock?

Zum Test der UART-Funktion habe ich folgendes Programm kompiliert und
hochgeladen:

.include "m8def.inc"

.def temp = r16
.equ CLOCK = 4000000
.equ BAUD = 9600
.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, 'T'
        rcall serout                      ; Unterprogramm aufrufen
        ldi temp, 'e'
        rcall serout                      ; Unterprogramm aufrufen
        ldi temp, 's'
        rcall serout                      ; ...
        ldi temp, 't'
        rcall serout
        ldi temp, '!'
        rcall serout
        ldi temp, 10
        rcall serout
        ldi temp, 13
        rcall serout
        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


Da ist hoffentlich kein Fehler enthalten???

Danke schon mal für die Beantwortung meiner Fragen.
Um die Funktion zu testen arbeite ich übrigens mit HyperTerminal, was
problemlos klappen sollte oder?

von Hannes L. (hannes)


Lesenswert?

Dein Bild zeigt Clockselect auf 0, das heißt, es ist für externen Takt
eingestellt. Du musst daher einen externen Taktgeber (z.B.
Quarzoszillator, der "Blechsarg" mit den 4 Beinen) anschließen.

Die Frequenz von 4MHz ist für UART nicht gut geeignet. Mit einem
"Baudratenquarz" von z.B. 3,6864MHz geht das bedeutend besser.

Solltest du keinen ISP-Zugriff mehr haben, dann solltest du einen
externen Takt anschließen und die Fuses wieder richtig setzen. Wie das
geht, findest du im Datenblatt unter Clock sources und fuses.

...

von Sven Scholz (Gast)


Lesenswert?

Ja, diesen Blechsarg mit 4 Beinen habe ich dran.
Zur Datenübertragung benutze ich die Pins PD.0 und PD.1. Das stimmt
doch oder?
Auch wenn die Frequenz vielleicht nicht haargenau passt, müsste ich
doch irgendetwas empfangen oder?

von Pete da Heat (Gast)


Lesenswert?

Hallo!

Ja, PD0 (RXD) und PD1 (TXD) stimmt. Mit 4MHz geht's auch, nehm ich
auch her.

Viel Spaß noch
Pete

von Sven Scholz (Gast)


Lesenswert?

Weiterhin benutze ich den MAX232N mit 1uF Kondensatoren. Das sollte doch
auch unkritisch sein?

von Sven Scholz (Gast)


Lesenswert?

Also ich habe den MAX232N folgendermaßen beschaltet.

PD.0 --> R1IN
PD.1 --> T1IN
T1OUT --> 3. Pin der D-Sub Buchse
R1OUT --> 2. Pin der D-Sub Buchse

Stimmt das denn so? Habe die Schaltung auf irgendeiner Internetseite
gefunden. Sie weicht von der hier im Tutorial vorgestellten Schaltung
ab, habe ich gerade festgestellt. Welche ist denn jetzt richtig???

Bevor ich die Sache jetzt umlöte, brauche ich eine Bestätigung für
meine Annahme. DANKE!

von Hannes L. (hannes)


Lesenswert?

RX ist falsch herum.

TX ist senden, also IN an AVR, OUT an Leitung
RX ist empfangen, also IN an Leitung, OUT an AVR

Oder?

...

von Sven Scholz (Gast)


Lesenswert?

Also ich werde mich jetzt mal ans umlöten machen...

Ein gutes Beispiel dafür, dass man nicht jeder Internetseite Glauben
schenken sollte.

Naja, vielleicht ist das auch eine Version die ein Nullmodemkabel
verwendet. Keine Ahnung.

Bis gleich...

von Sven Scholz (Gast)


Lesenswert?

So, bin jetzt fertig und ihr werdet es nicht glauben, es
funktioniert...

Echt bescheuert.

von Rahul D. (rahul)


Lesenswert?

Du hast ne knappe Stunde für 4 Lötstellen gebraucht? ;)

von robert schwarzelt (Gast)


Lesenswert?

ich würde das progie vom grundaufbau her auch nuzen wollen.

aber wenn ich es in avr studio simuliere bleibt er mir bei der
übertragung des drtitten buchstabens in der schleife in serout hängen.

..denn nachdem der 2. buchstabe gesendet wurde wird UDRE nicht wieder
auf high gesetzt. warum auch immer?

ich hätte es ja schon praktisch probiert, aber ich habe momentan keinen
atmega8 da.

mfg robert

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.