Forum: Mikrocontroller und Digitale Elektronik AVR-Mega8 USART defekt?


von Gary (Gast)


Angehängte Dateien:

Lesenswert?

Hallo -
ich bin so am basteln mit einem AVR-MEGA 8 und habe das Problem das
meine UART-Schnittstelle immer nur 333 Baud ausgibt - egal was ich in
UBRR als Teilungsfaktor eingebe... er schert sich nicht darum...
Nun habe ich ein C-Programm verwendet was vorher auf einem Mega169
sauber lief... nach einigem Hin und Her (Taktfrequenz verifiziert,
Programm-Ablauf verifiziert ..) habe ich sogar ein ASM-Programm
geschrieben das eigentlich minimalst sein sollte aber auch das Problem
zeigt... zu minimal? Wer kann helfen?

mfg
Gary

von Bernhard S. (bernhard)


Lesenswert?

Hallo Gary,

Schau mal bitte hier rein, dort ist er richtig konfiguriert:

http://www.mikrocontroller.net/forum/read-4-354990.html


Übrigens, Dein Port D ist nicht konfiguriert (TXD)

Bernhard

von Gary (Gast)


Lesenswert?

Hallo Bernhard,

kaum zu glauben es gibt noch mehr Nachteulen ;o))
Hab mir deinen Code angesehen und der Unterschied ist eigentlich ...
das du Interrupts nutzt, aber der Rest ist gleich.

Das RXD habe ich bewusst raus gelassen... die PORT-Pins musste ich in C
bisher nie freigeben, aber ich habe nun mal
; PORT D  initialisieren
  ldi   r16,   1<<PD0|1<<PD1
  out   DDRD,   r16
eingefügt und es ändert sich nix.

Was ich nicht verstehe ist das sich meine Baudrate nicht ändert, wenn
ich das UBRR ändere... Das Hex-Muster 0xAA verschicke ich ja um meine
Bitzeiten zu messen und da ändert sich leider nie etwas.. ??
Ich messe stolze 3ms anstatt 100µs (9600Baud).

von Bernhard S. (bernhard)


Lesenswert?

>kaum zu glauben es gibt noch mehr Nachteulen ;o))

Nachts werden die faulen fleißig ;)

>Hab mir deinen Code angesehen und der Unterschied ist eigentlich ...
>das du Interrupts nutzt

aber nur für RXD


>Was ich nicht verstehe ist das sich meine Baudrate nicht ändert, wenn
>ich das UBRR ändere

da muss sich abe etwas ändern

Kleiner Tipp:

  LDI  r16,  0x33  ;9600 >> UBRR=51
  LDI  r17,  0x00
  out UBRRH, r17
  out UBRRL, r16


besser wäre:

  LDI  r16,  (FORMEL)
  LDI  r17,  0x00

Sonst muss man zuviel rechnen und anschließend im Datenblatt
nachschauen.


Fuße-Bits auch richtig eingestellt, auf den gewünschten Takt?

von crazy horse (Gast)


Lesenswert?

Am PortD muss man nichts einstellen, das passiert automatisch mit
TxEN/RxEN.
Was mir so einfällt: war da nicht was mit UCSRC und UBRH? Gleiche
I/O-Adresse, muss man mit irgendeinem Bit einstellen, auf welches
Register sich der entsprechende Zugriff bezieht? Nur so eine Idee.

von Karl H. (kbuchegg)


Lesenswert?

Ich glaub ich habs

<Zitat>
When the function writes to the UCSRC
Register, the URSEL bit (MSB) must be set
due to the sharing of I/O location
by UBRRH and UCSRC
</Zitat>

Dein Code
; Set frame format: 8data, 1stop bit
  ldi r16,  (1<<UCSZ1)|(1<<UCSZ0)|(0<<UCPOL)
  out UCSRC,r16

URSEL ist nicht gesetzt, damit überschreibst du ständig
UBRRH

von Karl H. (kbuchegg)


Lesenswert?

Yep. Nachdem ich das Bit gesetzt habe

  ldi r16,  (1<<UCSZ1)|(1<<UCSZ0)|(1<<URSEL)
  out UCSRC,r16

funzt auf meinem Mega16 die Übertragung einwandfrei.

von crazy horse (Gast)


Lesenswert?

sag ich doch :-)

von Karl H. (kbuchegg)


Lesenswert?

Warst schneller. Sagen wir unentschieden.

von Gary (Gast)


Lesenswert?

Super - das wars,
; Set frame format: 8data, 1stop bit
  ldi r16,  (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0)|(0<<UCPOL)
  out UCSRC,r16

und es geht....  cool....
das Bit gibts beim Mega169 nicht, deswegen hat es dort funktioniert.
Das Erklärt auch meine konstante Baudrate, da sich damit immer nur der
niederwertige Teil auswirkt und die Änderung damit "klein" bleibt.

Also was ich jetzt lernen musste ist das die die AVR-Familie nicht so
ganz durchgängig ist:O)

Danke Jungs

von Rahul (Gast)


Lesenswert?

Wieso gibt sich atmel eigentlich immer so viel Mühe mit den Beispielen
in den Datenblättern, wenn sie niemand anguckt (und abtippt(*))?

(*) das waren noch Zeiten, als man Programme aus Computer-Zeitungen
abtippen musste... das schulte neben dem Programmverständnis auch noch
die Tippgeschwindigkeit.

von Gary (Gast)


Lesenswert?

Hallo Rahul :O)

du hast ja recht, aber zu meiner Schande muss ich sagen ich habe ja
reingeschaut, aber habs einfach net gesehen weil da gleich das
UMSEL-Bit steht bin ich einfach drüber gerauscht.

Und mal ehrlich sind wir nicht alle Gewohnheitstiere - heist beim
ersten mal schaut man genau... dann wenns mal funktioniert hat wird es
immer ungenauer... aber dafür sind ja so Foren auch da - immer wenn der
Wald vor lauter Bäumen nicht mehr erkennbar ist...

und im Besonderen ... du hast recht... dir Datenbläter sind wirklich
gut.

von tom (Gast)


Lesenswert?

Naja, ob die Datenblätter gut sind wage ich zu bezweifeln. So chaotische
Datenblätter hab ich noch nirgends gesehen (zum Vergleich schaut euch
mal die 8051 Datenblätter an). Insbesondere die Quellcodebeispiele
finde ich das letzte, immer nur so kurze Fragmente die aus dem ganzen
Umfeld gerissen sind hätten sie sich sparen können, dann lieber ein
komplettes und lauffähiges Beispiel und an dem erklärt, wäre sinnvoller
gewesen. Und dann dieses Chaos bei den Timern, grausam. Sagt mir nur
nicht dass das ne geistreiche Leistung ist.

von Rahul (Gast)


Lesenswert?

>zum Vergleich schaut euch mal die 8051 Datenblätter an

Etwa die von Philips, wo man sich eins aus mehreren irgendwo auf deren
Seite zusammensuchen muß (Meine Erfahrung damit; bin den 8051ern nicht
abgeneigt), weil sie sich in dem einen Datenblatt auf ein anderes
beziehen?

Die Beispiele in den AVR-Datenblättern funktionieren zumindest (auch
wieder meine Erfahrung).
Dass da manches chaotisch wirkt, habe ich auch festgestellt. Allerdings
sind die Information zu diesen Thema auch teilweise redundant im
Datenblatt vorhanden.

von Gary (Gast)


Lesenswert?

@Tomm
okay - die Timer sind wirklich chaotisch aber selbst da findet man
sich nach gewisser Zeit zurecht.... was aber halt nervt sind die
kleinen aber feinen Unterschiede zwischen den Prozessoren.
Die habe ich als Neuling noch nicht so erlebt und ich dachte AVR ist
AVR - der Eine hat ne Funktion der Andere nicht, aber wenn Funktion
dann gleich... nun habe ich schon zum zweiten Mal gelernt das dem nicht
so ist...
Am Anfang hab ich mir halt versucht ne kleine Lib mit Code-Beispielen
zu schreiben - das kann ich glatt vergessen, da die Register
immer/häuft anders heisen oder nicht vorhanden sind ... oder Funktion
anders ist....
das finde ich persönlich viel nerviger, weil wer hat die Zeit sich
jedesmal durch x-Seiten zu wühlen.... einzige Alternative...
ich kaufe nun noch den dicksten µC - der Alles kann - und scheere mich
nicht um die Vielfalt :(

von Gary (Gast)


Lesenswert?

@Rahul

habe zwar nicht deine Erfahrung aber diese verzeigerte Dokumentation
würde das Ganze natürlich toppen (<< schreibt man das so ;O)

von Rahul (Gast)


Lesenswert?

>Die habe ich als Neuling noch nicht so erlebt und ich dachte AVR ist
>AVR

Dann guck dir mal die PICmicros an...

>das kann ich glatt vergessen, da die Register immer/häuft anders
>heisen oder nicht vorhanden sind ... oder Funktion anders ist

Das ist doch genauso wie Autos einer Marke: sie haben alle gewisse
Gemeinsamkeiten aber auch ihre Unterschiede...

von Gary (Gast)


Lesenswert?

@Rhaoul... klasse
>Das ist doch genauso wie Autos einer Marke: sie haben alle gewisse
>Gemeinsamkeiten aber auch ihre Unterschiede...

Gerade habe ich einem Bekannten gesagt - das wäre wie wenn der
Lichtschalter beim Auto einer Marke immer links ist und plötzlich ein
Schalter zusätzlich unter dem Armaturenbrett existiert, der entscheidet
ob das Licht halb hell oder ganz hell leuchtet ;)

von crazy horse (Gast)


Lesenswert?

nun ja, du machst da einen entscheidenden Denkfehler. Beim Licht
müsstest du dich selbst drum kümmern, wo der Schalter ist. Beim MC
brauchst du das nicht, das erledigt der Assembler/Compiler für dich,
wenn man die Programme RICHTIG benutzt. Wird hier immer wieder zurecht
angemeckert, dennoch kommt fast jeder Anfänger (und nicht nur die :-)
mit Sachen wie
ldi temp, 0b00010000
out TIMSK, temp

Kein Mensch weiss, was gemeint ist, und beim Umstieg auf einen anderen
AVR klappt es oft auch nicht. Machst du es richtig, kann es dir doch
völlig egal sein, wo das entsprechende Bit liegt.

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.