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
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
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).
>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?
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.
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
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.
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
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.
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.
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.
>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.
@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 :(
@Rahul habe zwar nicht deine Erfahrung aber diese verzeigerte Dokumentation würde das Ganze natürlich toppen (<< schreibt man das so ;O)
>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...
@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 ;)
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.