Forum: Mikrocontroller und Digitale Elektronik Arbeitstakt, wie geht das?


von andregrimm (Gast)


Lesenswert?

Hallo liebe Gemeinde,

ich bin recht neu im AVR-Programmieren und habe da ein 
Verständnisproblem.
Benutzt wird ein ATmega8515L. Laut Datenblatt hat er einen internen 
Oszi, der mit 1, 2, 4 oder 8MHz betrieben werden kann.
Im AVR-Studio (v4.18 Build 700) kann ich Takte zwischen 14,6 und 3680000 
Hz einstellen. Wie genau kommen die Takte zustande? Ich kann z.B. keine 
100000 Hz einstellen sonder 99632. Mir ist klar, dass sich das aus 
irgend welchen Teilern ergeben wird. Ich würde aber gern wissen, welche 
das sind und wie ich diese einstelle. Geht das auch über die Fuses? Wo 
find ich das im Datenblatt? Wie komme ich auf einen Takt > 4MHz?

Eine weitere Frage:
Ich habe versucht über den 8-Bit Timer eine Frequenz von 440Hz zu 
erzeugen.
Bei einem Arbeitstakt von 99632 Hz ergibt das für meinen Zähler ein 
zählwert von etwa 113 Takten (OCR0 = 113). Ich hab den Zähler dann im 
CTC-Modus mit Toggle OC0 konfiguriert und messe am Ende eine Frequenz 
von etwa 430Hz. Durch versuchen habe ich mich dann per OCR0 = 111 auf 
eine Frequenz von 441Hz genähert.
Nun die Frage: Wie kommt das? Errechnet hatte ich 99632/880 = 113,218, 
was bedeutet, dass ich bei 113 Timertakten eine Frequnz > 440Hz bekommen 
sollte.
Wie kann ich eine genaue Frequenz bekommen?

Vielen Dank und viele Grüße
André Grimm

: Verschoben durch Moderator
von Karl H. (kbuchegg)


Lesenswert?

andregrimm schrieb:
> Hallo liebe Gemeinde,
>
> ich bin recht neu im AVR-Programmieren und habe da ein
> Verständnisproblem.
> Benutzt wird ein ATmega8515L. Laut Datenblatt hat er einen internen
> Oszi, der mit 1, 2, 4 oder 8MHz betrieben werden kann.
> Im AVR-Studio (v4.18 Build 700) kann ich Takte zwischen 14,6 und 3680000
> Hz einstellen.

WO genau kannst du das einstellen?

Bist du sicher, dass du das nicht damit verwechselst, mit welcher 
Frequenz der Brenner das Programm in den µC reinbrennt?

> das sind und wie ich diese einstelle. Geht das auch über die Fuses? Wo
> find ich das im Datenblatt? Wie komme ich auf einen Takt > 4MHz?

denn:
Im AVR Studio an sich stellst du gar nicht ein, mit welcher Frequenz der 
µC laufen soll, sondern du teilst ihm nur mit, mit welcher Frequenz der 
µC tatsächlich läuft. Wie schnell das tatsächlich ist, wird durch die 
Fuses bzw. einem eventuell angeschlossenem Quarz festgelegt.

Die Einstellung im AVR-Studio (unter Project - Configuration Options 
wenn du in C programmierst) ist ein reines Textfeld. Da kannst du 
reinschreiben was immer du willst. Das ist eine reine Information für 
den Compiler. Obwohl es natürlich gut wäre, wenn die Zahl da drinn mit 
der tatsächlichen Frequenz, wie sie zb über die Fuses eingestellt wurde, 
übereinstimmt. Ansonsten werden Berechnungen, die auf diesem Wert 
basieren, falsche Ergebnisse liefern.

PS: Ein Mega, an dem du per Fuses nichts verändert hast, läuft mit ca. 
1Mhz. Bei den neueren µC stimmt der Wert ziemlich gut, bei den älteren 
kann es da auch ein paar Abweichungen kommen. Aber auf jeden Fall ist 
der Wert keinesfalls auf 1Hz genau (das wäre er auch dann nicht, wenn du 
einen Quarz benutzt).

von Oliver (Gast)


Lesenswert?

andregrimm schrieb:
> Im AVR-Studio (v4.18 Build 700) kann ich Takte zwischen 14,6 und 3680000
> Hz einstellen. Wie genau kommen die Takte zustande? Ich kann z.B. keine
> 100000 Hz einstellen sonder 99632.

Da wirfst du wohl etwas durcheinander.
IM AVR-Studio kannst du den CPU-Takt überhaupt nicht einstellen.

Der Prozessor läuft immer mit der Taktfrequenz, die ihm vorgegeben wird. 
Intern eingebaut ist ein Oszillaotor, der auf 1, 2, 4 oder 8MHz 
eingestellt werden kann. Bei 1Mhz sind das auch wirklich 1 MHz, da gibt 
es ekein weiteren Teiler o.ä.

Hängst du einen externen Quarz dran, und stelltst die Fuses entsprechend 
ein, bestimmt der externe Quarz die Taktfrequnez. Wenn du z.B. einen 
Quarz mit 12.34567 MHz einsetzt, läuft der Prozessor mit 12.34567 MHz.

Das Studio weiß von dem allen nichts, das ist lediglich eine 
Programmierumgebung.

Oliver

von spess53 (Gast)


Lesenswert?

Hi

>Da wirfst du wohl etwas durcheinander.
>IM AVR-Studio kannst du den CPU-Takt überhaupt nicht einstellen.

Wenn er das STK500 benutzt geht das sehr wohl. Da kann man sogar die 
Betriebsspannung einstellen.

MfG Spess

von Bastler (Gast)


Lesenswert?

spess53 schrieb:
> Wenn er das STK500 benutzt geht das sehr wohl.

Auch das STK500 wird wohl kaum dem kleinen Roboter eine entsprechende 
Anweisung zum Wechseln des Quarzes zukommen lassen.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Bastler schrieb:
> spess53 schrieb:
>> Wenn er das STK500 benutzt geht das sehr wohl.
>
> Auch das STK500 wird wohl kaum dem kleinen Roboter eine entsprechende
> Anweisung zum Wechseln des Quarzes zukommen lassen.

Nein, das bezieht sich auf den vom STK500 selbst bereitgestellten
Takt, den man natürlich dann an XTAL1 des Controllers einspeisen
muss.  Dafür muss man den OSCSEL-Jumper in Stellung 1-2 stecken
haben und den XTAL1-Jumper gesteckt.  Einen Quarz direkt an XTAL1/
XTAL2 kann man mit dem STK500 gar nicht anschließen (hätte schon
aufgrund der boardinternen Leitungslängen auch gar keinen Sinn).

Die vom TE genannte Liste der möglichen CPU-Frqeuenzen legt zumindest
nahe, dass er die eines STK500 meint.  Die möglichen Taktfrequenzen
ergeben sich durch die möglichen Teilerfaktoren innerhalb des
ATmega8515, der sich auf dem STK500 selbst befindet und dessen
Timer für das Bereitstellen des Takts genutzt wird.

Selbstverständlich setzt all das natürlich voraus, dass die Fuses
des Ziel-Controllers umgestellt worden sind, sodass er nicht mehr
mit dem internen RC-Oszillator, sondern mit einer der externen
Optionen läuft.  Im Prinzip müsste man ihn auf "externer Takt"
umstellen, aber eine beliebige der Möglichkeiten für einen externen
Quarz wird in der Praxis genauso funktionieren.

von andregrimm (Gast)


Lesenswert?

Hallo!

Danke für die vielen Antworten. Also wenn ich das recht verstehe, nutze 
ich den externen Oszi auf dem SDK500. Was mir noch nicht klar ist: Wie 
kommen die Takte, die ich einstellen kann, zustande? Wo sind die Teiler?

Ich ändere tatsächlich den Takt mit dem der Controller arbeitet, sonst 
würde meine LED ja nicht schneller oder langsamer blinken und mein 
Piepser unterschiedliche Töne produzieren.
Wo ich das einstelle: Im Brenndialog gibt es einen Reiter HW Settings 
und dort einen Regler für den Clock Generator. Im Titel steht "STK500 in 
ISP mode with ATmega8515".

Wenn ich jetzt also den internen Oszi nutzen will, muß ich die Fuses 
entsprechend ändern, den Jumper auf dem SDK anders setzten und dann 
stehen mir genau die 4 Takte (1,2,4,8MHz) zur Verfügung? Oder kann man 
die auch noch mal teilen?

Viele Grüße
André Grimm

von spess53 (Gast)


Lesenswert?

Hi

>Danke für die vielen Antworten. Also wenn ich das recht verstehe, nutze
>ich den externen Oszi auf dem SDK500. Was mir noch nicht klar ist: Wie
>kommen die Takte, die ich einstellen kann, zustande? Wo sind die Teiler?

Hat doch Jörg schon beschrieben: Auf dem STK ist ein ATMega8535 der mit 
7,37MHz getaktet wird. Und der erzeugt mit einem Timer den Takt.

>Wenn ich jetzt also den internen Oszi nutzen will, muß ich die Fuses
>entsprechend ändern, den Jumper auf dem SDK anders setzten und dann
>stehen mir genau die 4 Takte (1,2,4,8MHz) zur Verfügung?

Ja.

>Oder kann man die auch noch mal teilen?

Beim ATMega8515 nein. Neuere AVRs haben einen Clock Prescaler mit dem 
das möglich ist.

MfG Spess

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

andregrimm schrieb:
> Also wenn ich das recht verstehe, nutze
> ich den externen Oszi auf dem SDK500.

Oder auch nicht: das wird durch die Fuses deines ATmega8515
entschieden.  Im Auslieferungszustand stehen sie so, dass der
interne 1-MHz-RC-Oszillator benutzt wird.  Das externe Signal
an XTAL1 wird in diesem Falle komplett ignoriert.

von andregrimm (Gast)


Lesenswert?

Aha, jetzt hab ich es auch geschnallt. Der zusätzliche ATmega auf dem 
SDK generiert also den Takt. Entschuldigt bitte die lange Leitung!
Eine Frage hab ich aber noch:
Wie kommt der min. Takt von 14,06Hz für diesen externen Takt zu stande?

Und dann noch die Fragen von oben:
Welche Takte sind möglich? 14,06Hz, 15Hz, 16Hz, 16,98Hz ...
Wie kann ich diese errechnen, wenn ich mich einem bestimmten Takt 
annähern will? Bsp.: 100 000Hz

Wie kommt es zu der relativ große Abweichung zwischen meinem errechneten 
Zählerwert und dem gemessenen Ergebniss? (Siehe oben 440Hz mit Timer0)

Viele Grüße
André Grimm

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

andregrimm schrieb:
> Wie kommt der min. Takt von 14,06Hz für diesen externen Takt zu stande?

Versuch doch einfach mal selbst, einen AVR-Timer so zu programmieren,
dass an seinem Ausgang eine Rechteckimpulsfolge entsteht.  Die
Stichworte dafür lauten "clear timer on compare match" und
"toggle [OCxy] on compare match".  Die maximal erreichbare Frequenz
auf diese Weise entsteht, wenn man das zugehörige OCRxy mit dem
Wert 0 lädt, dann erreicht man F_CPU/2.  Das sind deine 3,68 MHz.
Die minimale Frequenz entsteht, wenn man OCRxy mit dem Wert 65535
lädt.  Das wären dann 1/65535 der 3,68 MHz, oder 56,25 Hz.  Die
von dir genannten 14,06 Hz sind 1/4 davon, das heißt, dass da
irgendwann bei Bedarf von der Firmware des STK500 offensichtlich
noch ein Prescaler von 1:4 in den Timerkanal zugeschaltet wird.

Deine Frequenzabweichung von der gewünschten "glatten" Frequenz
entsteht dadurch, dass man nur bestimmte (diskrete) Teilerverhältnisse
realisieren kann, und dass deren Abstufung nur in den durch die
16 bits des OCRxy definierten Schritten erfolgen kann.

von spess53 (Gast)


Lesenswert?

Hi

>Wie kommt der min. Takt von 14,06Hz für diesen externen Takt zu stande?

7,37MHz/8/65536

>Und dann noch die Fragen von oben:
>Welche Takte sind möglich? 14,06Hz, 15Hz, 16Hz, 16,98Hz ...

Mein STK500 geht erst bei ca. 10kHz los

Wie kann ich diese errechnen, wenn ich mich einem bestimmten Takt
annähern will? Bsp.: 100 000Hz

Zumindest muss 7,37MHz/f einen ganzzahligen Wert ergeben.

>Wie kommt es zu der relativ große Abweichung zwischen meinem errechneten
>Zählerwert und dem gemessenen Ergebniss? (Siehe oben 440Hz mit Timer0)

Zum einen war dein OCR-Wert falsch. Nicht 113 sondern 113-1 wäre der 
richtige Wert gewesen. Zum anderen ist der Takt vom STK nicht sehr 
genau. Bei mir sind es 7,276MHz statt der 7,37MHz die auf dem Quarz 
stehen.

An deiner Stelle würde ich mich nicht weiter damit abgeben. Nimm einen 
Quarz. Die Fassung dafür ist auf dem STK vorhanden.

MfG Spess

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

spess53 schrieb:
> Nimm einen
> Quarz. Die Fassung dafür ist auf dem STK vorhanden.

Nicht vergessen, den OSCSEL-Jumper dann auf 2-3 zu stöpseln!

von andregrimm (Gast)


Lesenswert?

OK, nochmals Dank! Jetzt bin ich um einiges schlauer ;o)

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.