www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik UART beim Atmega 88 will nicht


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

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

Bin Anfänger und hatte meine Frage schon mal im GCC Forum gestellt, aber 
nur wenig zielführende Antwort erhalten.

Ich habe die empfohlenen Links
http://www.atmel.com/dyn/resources/prod_documents/...

http://rn-wissen.de/index.php/Atmel_Controller_Meg...

durchgelesen und dennoch keine Lösung gefunden. Ich möchte nur ein 
einfaches Tastenecho auf dem Atmega 88 realisisern, etwas , was auf dem 
Atmega 8 problemlos läuft.

Ich weiß, dass der 88 er kein URSEL besitzt, daß UBRR0H und UCSR0C 
getrennt angesprochen werden müssen.

Aber die UART Initialization im Datenblatt verstehe ich überhaupt nicht.

Ich arbeite mit STk500, AVR Studio, habe einen 3,6864 MHz Quartz, habe 
das Fuse für
ext.crystal/Resonator High Freq; Startup time16K Ck+ 64ms

gesetzt, was beim Atmega 8 auch problemlos läuft. Aber dennoch gehts 
beim 88 nicht, es kommen nur sinnlose Zeichen raus.
Kann bitte jemand mal den Code überfliegen und mir einen Tipp geben 
woran es liegen könnte?

Gruß

Thomas

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

CKDIV8 gelöscht?

MfG Spess

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo spess53,
danke für den Tipp! Das CKDIV8 scheint beim Atmega88P Standartmäßig 
gelöscht zu sein. Habe einen neuen ins STK 500 eingesetzt und die Fuses 
ausgelesen. CKDIV8 hat immer ein Häkchen. As wegzumachen bringt nix, ist 
nach dem Auslesen immer wieder da.

Muss das weg, wenn wie bekomm ich das weg?

Gruß

Thomas

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>danke für den Tipp! Das CKDIV8 scheint beim Atmega88P Standartmäßig
>gelöscht zu sein.

Nein. Die CKDIV8-Fuse ist bei einem neuen ATMega88 gestzt. D.h. der AVR 
läuft mit 8MHz/8 = 1MHz.

>CKDIV8 hat immer ein Häkchen. As wegzumachen bringt nix, ist
>nach dem Auslesen immer wieder da.

Nur das Häkchen wegmachen reicht nicht. Du muss die Fuses auch 
progammieren.

MfG Spess

Autor: Joachim B. (jojo84)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das Bit heißt einfach, daß die jeweilige Taktfrequenz pauschal durch 8 
geteilt wird -> wenn du alles für 8MHz berechnet hast, das Ding aber nur 
mit 1MHz läuft, passen also all deine Berechnungen nicht (als Beispiel).
Ob das gesetzt oder gelöscht sein muß hängt von deiner Anwendung ab. 
Meist bringt es aber mehr es "unprogrammed" zu machen. Und mal ehrlich: 
ob jetzt "gesetzt" programmed oder UNprogrammed bedeutet... der 
Zusammenhang ist doch eigentlich gar nicht so schwer zu verstehen :) .
Wenn du das Häkchen in AVR Studio wegnimmst wird das Bit gesetzt. Das 
heißt es ist UNpregrammed. Danach mußt du (je nach Entwicklungsumgebung) 
die veränderten Einstellungen noch hochladen (write)...

Eigentlich ganz einfach :)

Gruß

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für die Antworten!

habe jezt einen nagelneuen Atmega88 eingesetzt, mit avr die Fuses 
ausgelesen
und festgestellt, dass das Häkchen bei CLDIV( gesetzt war. Habe dann das 
Häkchen entfernt und die Veränderung in den µC geladen.
So jetzt geht auch das UART. Aber wieso??????

Meine ganzen Berechnungen im Programm gehen doch von Fosc 3686400 aus. 
Wenn ich jetzt den Vorteiler CKDIV8 programmed habe, dürfte doch nix 
mehr gehen?!?

Dannn arbeitet dwer C doch mit 921600 Hz oder nicht??
So stehts jedenfalls im Datenblatt. Habe jetzt aus Flashplatzgründen auf 
den Atmega162 gewechselt. Hier ist das genauso.

Es geht zwar, aber verstehen würde ich es doch gerne....
Gruß

Thomas

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>Meine ganzen Berechnungen im Programm gehen doch von Fosc 3686400 aus.
>Wenn ich jetzt den Vorteiler CKDIV8 programmed habe, dürfte doch nix
>mehr gehen?!?

Nein, du hast jetzt den Vorteiler abgeschaltet. Ein Häkchen zeigt eine 
programmierte Fuse an.

MfG Spess

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

Bewertung
0 lesenswert
nicht lesenswert
Thomas schrieb:

> habe jezt einen nagelneuen Atmega88 eingesetzt, mit avr die Fuses
> ausgelesen
> und festgestellt, dass das Häkchen bei CLDIV( gesetzt war. Habe dann das
> Häkchen entfernt und die Veränderung in den µC geladen.
> So jetzt geht auch das UART. Aber wieso??????
>
> Meine ganzen Berechnungen im Programm gehen doch von Fosc 3686400 aus.
> Wenn ich jetzt den Vorteiler CKDIV8 programmed habe, dürfte doch nix
> mehr gehen?!?

Wenn CKDIV8 eingeschaltet ist (und das ist es bei einem nagelneuen 
Mega88) dann arbeitet dein µC nicht mit 3686400 Hz, sondern mit 3686400 
/ 8 = 460800 Hz, also rund 480kHz anstelle von 3.6MHz.

Erst dadurch, dass du CKDIV8 ausschaltest, arbeitet dein µC mit der 
vollen Frequenz.

Autor: sonstwer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
wie kommst du auf die krummen zahlen?

der interne oszillator ist doch ab werk auf 8MHz eingestellt...

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke, jetzt habe ich es verstanden.

Habe jetzt das Datenblatt Atmega 162 vor der Nase und möchte den UART 
mit ISR Programmieren.
Jetzt sehe ich im Datenblatt unter USART Register deskription
nicht etwa UCSRnA sondern einfach UCSRA. Was soll denn das? Der 162 er 
hat doch zwei USART!?!
Beim Compilieren nörgelt das AVstudio erwartungsgemäß rum und möchte 
andere Registernamen.

Im Datenblatt vom 88 er, der ja auch zwei USART HAT stand es richtig. 
Ist das jetzt mal einfach ein Fehler? oder muss man jetzt jede 
Bezeichnung im Datenblatt erstmal "übersetzten" ? Das ist für einen 
Anfänger wie mich echt nicht witzig.....

Gruß

Thomas

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Bist du sicher,das du die richtigen Datenblätter hast. Der ATMega162 hat 
definitiv 2 UARTs und der ATMega88 nur eine.

MfG Spess

Autor: Joachim B. (jojo84)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Spess hat bei den Datenblättern schon Recht. Was mir noch aufgefallen 
ist: in deinem Sourcecode hast du F_CPU mit 3680000 angegeben. Dein 
Quarz hat aber 3,6864 MHz Quarz. Das entsricht einem Fehler von fast 
0,2%. Lt. Datenblatt sind zwar 0,5% erlaubt, aber man muß es ja nicht 
drauf anlegen... Zeig mal deine Fuses (Screenshot)...

Gruß

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
In meinem Datenblatt stimmen die Registernamen zu USART auch
durchweg nicht, sowohl im laufenden Text als auch in den
C-Beispielen beim atmega162.
Je nach Schnittstelle muß man sich zu den Namen noch 0 oder 1
dazudenken, etwas Flexibilität ist hier gefragt.
Die richtigen Namen stehen in der Tabelle der Register kurz vorm Ende.

Die Doku ist wohl aus der Rubrik fuzzy logic...

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Thomas schrieb:
> Im Datenblatt vom 88 er, der ja auch zwei USART HAT stand es richtig.

Aber der wiederum hat doch nur eine USART? Glaube ich zumindest.
Die wiederum hat eine 0 im Registernamen, auch wenn es keine 2 dazu 
gibt.

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Datenblätter stimmen, allerdings hast Du recht: Das Datenblatt für 
den 88 er gilt für Atmega48/88/168. Ich nehme an, dass deswegen die 
Registernamen ein "n" haben.
Allerdings ist das Datenblatt atmega162doc2513pdf doch wohl das 
richtige. Und hier sind definitiv alle Registernamen falsch.

Bei UCSRB kann ich es ja noch ergänzen, aber wo mach ich die UART Zahl 
dann bei den Register bits hin? Bei TXEN hänge ich die 0 dran. Bei UCSZ1 
muss die Zahl aber vor die eins, also UCSZ01. Ich schau jetzt halt nach 
den Register und Bitnamen im 48/88/168 datenblatt nach. Ist jaeigentlich 
im Prinzip fast immer dasselbe. Aber eben nur fast. Der 162 hat ein 
URSELn, der 88 er nicht.....

echt merkwürdig. Vielleicht lade ich mir das Datenblat einfach nochmal 
runter
doch was soll das ändern? Es sind in den Codebeispielen sowieso einige 
Zeichenfehler drin wie beispielsweise:
unsigned c?ar. Das machts auch nicht einfacher....

Thomas

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie gesagt: Die Namen stehen richtig in der Registerübersicht
am Ende. Da sind auch die Namen der Bits zu finden.

Du kannst natürlich auch in iom88.h schauen.
... und wirst feststellen, daß es da nicht steht.
Stattdessen wird ein avr/iomx8.h includet, und da stehen dann die Namen.

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bei 88 und 162 ist einiges etwas anders!

Entscheide dich, welchen du nehmen willst und nimm das richtge 
Datenblatt!
Auch wenn es etwas schwammig ist, die Namen stehen in der Tabelle 
richtig.

Von den Namen abgesehen ist die Funktion aber richtig beschrieben,
soweit ich das sehe.

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Außerdem: Solange du mit dem Takt nicht sicher bist,
solltest gar nicht USART anfassen. Sonst hast du zuviele
Fehlermöglichkeiten auf einmal, und siehst nur daß es nicht
geht.

Stelle erstmal den Takt sicher, dann geht es weiter.

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@jojo84
das mit den Fuses hat sich zumindest von der Wirkung her erledigt, weil 
die UART Init funktioniert. Aber ich vertehe jetzt schon, warum mancher 
von den Fuses genervt ist. Bei AVRStudio ist ein Häkchen, wenns 
unprogrammed ist, und keines wenns programmed ist. Eigentlich. Aber dann 
gibts ja disabled und enabled Fuses, das ist dann wie eine doppelte 
Verneinung...
Die Fosc ändere ich noch in 3686400....

@mfgkw

Fein. Dann weiß ich, dass ich die Datenblätter nicht nur lesen muss, 
sondern auch noch mitdenken ;-) muss... der Tipp mit der 
Registerübersicht am Ende ist OK, da stehts richtig drin...

@spess53
im Tutorial steht, dass im AVRStudio ein Häkchen 0 bedeutet und keines 
1, im Gegensatz dazu hat ponyprog das Häkchen am programmed Fuse, so wie 
man es erwarten würde.

So. jetzt versuche ich mal die Interrupt gesteuerte UART Version  aus 
dem Artikel Interrupt auf den 162 zu packen.

Thomas

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nimmst du jetzt eigentlich den 88 oder den 162?

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>Bei AVRStudio ist ein Häkchen, wenns unprogrammed ist, und keines wenns 
>programmed ist.

Nein, da liegst du falsch. Ein Häkchen bedeutet eine programmiertes 
Fusebit.

MfG Spess

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Nachtrag:

>@spess53
>im Tutorial steht, dass im AVRStudio ein Häkchen 0 bedeutet und keines
>1, im Gegensatz dazu hat ponyprog das Häkchen am programmed Fuse, so wie
>man es erwarten würde.

Ein programmiertes Fusebit hat den Wert 0!

MfG Spess

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich finde im Datenblatt irgendwie nicht den Namen vom Interrupt für ein 
empfangenes Byte.

Bevor du es auch suchst: er heißt USART_RXC_vect

(auch wenn sonst bei den AVR mit USART, bei denen die Register
eine Ziffer im Namen haben, der Vektor dann auch USART0_RXC_vect
oder USART0_RX_vect heißt, aber bei den AVR mit Registernamen ohne
Ziffer dann der Vektor U(S)ART_RX(C)_vect heißt, ist es beim
mega88 wieder anders: Register mit Ziffer, Interruptroutine ohne...)

Soll noch einer sagen, es gäbe keine guten Textadventures mehr!

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
..ich nehme jetzt den 162er, weil ich glaube, dass ich noch etwas Platz 
im Flash brauche, für ICP, dynam. Sinus PWM über LUT variabel über ISR 
getaktet, etc.

Thomas

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@mfgkw

danke, es begann gerade ein Problem zu werden mit dem ISR Vektor;-) hast 
es mit Deinem Tipp erschlagen.....

@spess53
ach so, dann ist es klar..


Thomas

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ok, aber dann leg das Pamphlet zum 88 ganz weit weg.
Es geht nicht gut, in beide rein zu schauen!

Der 88 hat nämlich die beiden Register UCSR...C und UBRR...H
getrennt, während der 162 nur ein Register für beide hat,
und welches man meint, muß man beim Schreiben mit dem obersten
Bit auswählen (UCSR0C.URSEL1 gleich 1 meint: der Rest des Wertes
ist für UCSR0C, dagegen UCSR0C.URSEL1 gleich 0 meint: der Rest
des Wertes ist für UBRR0H gedacht).

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ach ja: für weitere Diskussionen zum 162 wäre es vielleicht
sinnvoll, einen neuen Thread aufzumachen.

Sonst werden die nächsten Generatinen noch mehr verwirrt
als ohnehin schon.

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nicht Geranien, sondern Generationen :-(

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank an alle, die mir geantwortet haben!
werde jetzt mal weitermachen und ggf bei neuen Fragen einen neuen Thread 
aufmachen.....

@mfgkw
;-) habe das Datenblatt vom 88 er ganz weit weggelegt. Nachdem ich beim 
88 das URSEL gesucht und nicht gefunden habe, hatte ich auch 
mitbekommen, dass
hier die beiden Register getrennt sind.


Viele Grüße

Thomas

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.