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


von Thomas (Gast)


Angehängte Dateien:

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/doc2553.pdf

http://rn-wissen.de/index.php/Atmel_Controller_Mega48_Mega88_Mega168#Unterschiede_zwischen_Mega8_und_Mega88

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

von spess53 (Gast)


Lesenswert?

Hi

CKDIV8 gelöscht?

MfG Spess

von Thomas (Gast)


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

von spess53 (Gast)


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

von Joachim B. (jojo84)


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ß

von Thomas (Gast)


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

von spess53 (Gast)


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

von Karl H. (kbuchegg)


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.

von sonstwer (Gast)


Lesenswert?

wie kommst du auf die krummen zahlen?

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

von Thomas (Gast)


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

von spess53 (Gast)


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

von Joachim B. (jojo84)


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ß

von Klaus W. (mfgkw)


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...

von Klaus W. (mfgkw)


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.

von Thomas (Gast)


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

von Klaus W. (mfgkw)


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.

von Klaus W. (mfgkw)


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.

von Klaus W. (mfgkw)


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.

von Thomas (Gast)


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

von Klaus W. (mfgkw)


Lesenswert?

Nimmst du jetzt eigentlich den 88 oder den 162?

von spess53 (Gast)


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

von spess53 (Gast)


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

von Klaus W. (mfgkw)


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!

von Thomas (Gast)


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

von Thomas (Gast)


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

von Klaus W. (mfgkw)


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).

von Klaus W. (mfgkw)


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.

von Klaus W. (mfgkw)


Lesenswert?

Nicht Geranien, sondern Generationen :-(

von Thomas (Gast)


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

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.