www.mikrocontroller.net

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


Autor: Gary (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Bernhard S. (bernhard)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Gary (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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).

Autor: Bernhard S. (bernhard)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: crazy horse (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: crazy horse (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
sag ich doch :-)

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Warst schneller. Sagen wir unentschieden.

Autor: Gary (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Gary (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: tom (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Gary (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 :(

Autor: Gary (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Rahul

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

Autor: Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Gary (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ;)

Autor: crazy horse (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.