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