Forum: Mikrocontroller und Digitale Elektronik usart anfänger probleme


von thomas (Gast)


Lesenswert?

hi, ich versuche mit einem atmega8 über usart text auszugeben, das
funktionert aber nicht. ich habe schon überprüft ob der usart chip
richtig angeschlossen ist, und ob die taktrate stimmen (hab die avr
entwicklungsplatine von hier ausm shop). es wird allerdings nicht das
übertragen was ich will. meistens garnichts, manchmal wird während dem
schreiben auf den chip mit yaap ein x übertragen, oder mehrere
sonderzeichen. ich benutze den asm code aus dem usart tutorial von
dieser seite. wäre nett wenn mir jemand helfen könnte.


MfG
Thomas

von Hannes L. (hannes)


Lesenswert?


von Slowflyer (Gast)


Lesenswert?

Oft ist die Fuse "Divide clock by 8 internally" noch gesetzt (default
bei Atmel).

von Marian (Gast)


Lesenswert?

@thomas: Eine genauere Problemdarstellung würde uns bestimmt
weiterhelfen. So wie es Hannes schon gesagt hat ;)

von thomas (Gast)


Lesenswert?

- Stimmen die "Taktraten" (Baudraten), oder vermutest du, dass sie
  stimmen?

ich habe an den fuses noch nichts geändert. standardmässig wird doch
der interne quarz verwendet oder? ich hab diesen code verwendet:
(habs auch mit .equ CLOCK = 8000000 versucht)

.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

- Benutzt du einen Baudratenquarz?
hm, ich glaube nicht.

- Wer soll den Text empfangen?
der pc (hyperterminal unter win)

- Ist der Empfänger ansonsten in Ordnung?
an anderen pcs hab ich das programm noch nicht getestet, aber der port
am pc müsste gehn.


Oft ist die Fuse "Divide clock by 8 internally" noch gesetzt
(default
bei Atmel).

in yaap finde ich dieses fuse nicht, sondern nur diese:
(x -> gesetzt)

CKSEL0
CKSEL1 x
CKSEL2 x
CKSEL3 x
SUT0   x
SUT1
BODEN
BODLEVEL(0)
BOOTRST
BOOTSZ0 x
BOOTSZ1 x
ESAVE
CKOPT
SPIEN x
WDTON
RSTDISBL


thomas

von thomas (Gast)


Lesenswert?

und ich habe RX am board mit pin2, und tx mit pin 3 des atmegas
verbunden, ist das so richtig?

von Hannes L. (hannes)


Lesenswert?

> ich habe an den fuses noch nichts geändert. standardmässig wird doch
> der interne quarz verwendet oder? ich hab diesen code verwendet:
> (habs auch mit .equ CLOCK = 8000000 versucht)

Hmmm...
Der Mega8 hat keinen internen Quarz. Er hat einen internen
RC-Oszillator, der ist aber nicht so genau wie ein quarz und auch nicht
so stabil. Ihn für UART zu benutzen ist Lotto. Es kann per Zufall gehen,
geht meist aber nicht.

Besorg dir mal das (vollständige) Datenblatt des Mega8 und schau da mal
rein. Da steht z.B. drin, dass der Mega8 mit 1MHz ausgeliefert wird. Die
Veränderung der Konstante CLOCK im Quelltext ändert daran nix. Das lässt
sich nur per Fusebits ändern.
Übrigens gibt es beim Mega8 keine DIV8-Fuse.

Wenn du zuverlässig mit UART arbeiten willst, dann müsstest du einen
Quarz anschließen und per Fusebits auswählen. Der Quarz sollte aber
nicht 1MHz, 4MHz oder 8MHz haben, sondern eine baudratentaugliche
Frequenz, also z.B. 3,6864MHz (siehe auch oben gepostete Links).
Ansonsten wird das nicht UART sondern Lotto.

...

von thomas (Gast)


Lesenswert?

ich habe nur den internen RC-Oszillator und einen externen 8mhz quarz.
kann ich also damit vergessen UART zu benutzen?

von Hannes L. (hannes)


Lesenswert?

> ich habe nur den internen RC-Oszillator und einen externen 8mhz
> quarz.
> kann ich also damit vergessen UART zu benutzen?

Es wird sich mit Sicherheit wieder jemand finden, der behauptet, dass
es bei ihm ohne Baudratenquarz geht.

Daher werde ich nicht behaupten, dass es nicht geht, aber darauf
hinweisen, dass es mit einem Baudratenquarz besser und zuverlässiger
funktioniert.

> und ich habe RX am board mit pin2, und tx mit pin 3 des atmegas
> verbunden, ist das so richtig?

Hinterfrage die Bedeutung von RX (Receive, Empfang) und TX (Transmitt,
Senden) und verfolge den Signalweg, dann wirst du sehen, was wo
angeschlossen werden muss.

...

von thomas (Gast)


Lesenswert?

aso hm ok.
kann mir noch jemand sagen mit welchen fuses ich den atmega8 so
einstelle dass er ein externes quarz benutzt?

von Hannes L. (hannes)


Lesenswert?


von thomas (Gast)


Lesenswert?

Neben dem Abschalten des Resetpins kann man sich allerdings noch durch
ungeschicktes Setzen der Taktquelle aus dem Controller aussperren.

das hab ich gemacht, indem ich die fuses für die taktquelle so gesetzt
habe:

CKSEL0 1
CKSEL1 1
CKSEL2 1
CKSEL3 0
CKOPT  0

und jetzt komm ich nicht mehr auf den controller;(
(seite 27 im datenblatt, ich wollte einen externen 8mhz quarz
benutzen)

(wie) komm ich jetzt wieder drauf?

thomas

von Hannes L. (hannes)


Lesenswert?

Im Datenblatt sind die Beschaltungen für jede Taktquelle erklärt (mit
Schaltbild). Einfach die der fälschlicherweise eingestellten Fusebits
entsprechende Taktquelle anschließen, dann müsste es gehen.

Woher willst du eigentlich hinterher wissen, wie du die Fuses gesetzt
hast? Wenn du dich erstmal ausgesperrt hast, dann kannst du sie ja
nicht mehr auslesen. Könntest du sie auslesen, dann könntest du sie
auch ändern. Und ich glaube nicht, dass du die Fuses vor dem Aussperren
vom Bildschirm abgeschrieben hast (oder screenshot), denn dann wäre dir
sicherlich der Fehler aufgefallen.

...

von thomas (Gast)


Lesenswert?

doch ich habe mir aufgeschrieben was ich an den fuses geändert habe.
naja auf meinem board habe ich ein 8 mhz quarz, und ich weiß nicht was
ich falsch gemacht habe;(

von mthomas (Gast)


Lesenswert?

Falls die Reset-Funktion des ATmega8 noch aktiv ist: Retten kann man bei
jeder falschen Taktquellen-Fuseeinstellung, in dem man an XTAL1 einen
Takt anlegt, Quelle muss nicht unbedingt passend zur aktuellen
Einstellung sein. Falls noch ein AVR zur Hand, einfach einen Pin als
Ausgang und in Endlosschleife auf high/low/high etc. Jede andere Art
Frequenzgenerator funktioniert auch (simpelst ein Quarzoszillator - die
Teile mit 4 "Beinchen"). Frequenz eher unkritisch (<16MHz), evtl.
ISP-Frequenz anpassen auf <=1/4 XTAL1-Frequenz. Ausgang des
"Generators" an XTAL1 des "verfusten" AVR (Quarz sicherheitshalber
abklemmen) und per ISP auf richtige Taktquelle einstellen. GND bei
allen genutzten Teilen verbinden, VCC fuer alles am Besten aus einer
Quelle. Alle SEL und SUT auf "1" duerfte bei Quarz erstmal
weiterhelfen.
Es muss fuer UART auch nicht unbedingt ein "Bauratenquarz" sein, nur
damit es kein "Lotto" wird, aber eine stabile Taktquelle mit
bekannter Frequenz sollte schon sein. Fuer moegliche Baudraten in abh.
vom Takt vgl. Tabelle im Datenblatt. Fehler sollte so klein wie
moeglich sein, <2% als Anhaltswert, wenn recht erinnert, steht dazu
auch etwas im Datenblatt.
Hoffe, es hilft
Martin Thomas

von thomas (Gast)


Lesenswert?

ok danke ich werde es mal probieren

von Hannes L. (hannes)


Lesenswert?

Das hilft zwar im konkreten Fall nicht mehr, aber vielleicht beim
nächsten mal im Vorfeld:
http://www.mikrocontroller.net/forum/read-1-305204.html

...

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.