Hallo, ich bin relativ neu in der Welt der Mikroprozessoren und habe ein etwas kurioses Problem, für das ich momentan keine Lösung gefunden habe und das ich mir auch nicht so recht erklären kann. Folgendes: Ich bin momentan dabei, einige kleine Beispielprogramme für meinen ATmega16 zu programmieren. Hierbei greife ich auf die Funktion _delay_ms(); zurück, definiert in util/delay.h. Funktioniert soweit auch wunderbar. Allerdings "schläft" der Prozessor nicht so lange wie er eigentlich sollte, sondern viel länger. Gut, dachte ich mir, wird wohl mit der Taktung zusammen hängen. Als nächstes habe ich die F_CPU-Werte im Makefile und im gesamten Code überprüft, sowohl im Makefile als auch im Code habe ich den Wert erneut auf 8MHz gesetzt (im Makefile ohne den Suffix "UL", im Code habe ich beides getestet). Immer noch das selbe Problem. Testweise habe ich nun die Frequenz um den Faktor 10 verkleinert, also auf 0,8MHz - und siehe da, nun scheint der Prozessor auch richtig zu zählen (zumindest kam es mir subjektiv so vor, ich habe die Zeit nicht exakt gestoppt). Das ganze finde ich trotz alledem sehr suspekt, denn der ATmega16 taktet mit Sicherheit nicht mit 800KHz. Für Lösungsvorschläge und Tipps wäre ich euch sehr dankbar - und habe hoffentlich im Forum kein Topic übersehen, dass meine Problematik bereits behandelt hat. Bei Bedarf kann ich auch noch gerne mein Makefile und die C-Dateien nachreichen, diese befinden sich aber momentan auf einem anderen Computer. Grüße matzee
Hi! Scheinbar arbeitet dein MC mit dem internen Quarz (1 MHz) anstatt mit deinem externen. Du musst das entsprechende Fusebit für den externen Quarz setzen. Bist nicht der erste dem das passiert :-) Gruß
Hallo, Du hast nichts zum Takt Deines Mega16 geschrieben und wir können nicht hellsehen... Ausgeliefert wird der Mega16 mit 1MHz intern RC-Oszillator. PS: @bloß ein gast...: Es gibt keinen internen Quarz! Nicht beim AVR! Bei KEINEM! SCNR Gruß aus Berlin Michael
Hallo, vielen Dank schon einmal für die zahlreichen Antworten. Das habe ich vergessen, aber du hast recht, 8MHz hätte ich erwartet, an den Fusebits ist bisher nichts geändert worden. Die Geschichte mit den Fusebits wird wohl des Rätsels Lösung sein, allerdings scheint mir das nicht ganz ungefährlich zu sein. Ich werde nochmal mein Datenblatt konsultieren und unter Umständen erstmal mit 1MHz arbeiten - reicht momentan eh völlig. Aber auf alle Fälle danke noch einmal :)
Hm, verwendest du vielleicht Variablen als Argumente für delay_ms()? Das funktioniert nicht wirklich gut, da dann die ganze floating-point-lib dazugelinkt und natürlich auch verwendet wird. Und ein paar floats berechnet ein AVR nicht mal so nebenbei...
Hallo, naja, gefährlich sind die Fusebits nicht direkt, der AVR explodiert zumindest nicht. ;) Womit programmierst Du? Ansonsten hat man bei den Preisen eines AVR eigentlich immer einen Reserbe in der Schachtel, damit man erstmal weitermachen kann und in Ruhe über den falsch gefusten nachdenken kann... Goldene Regel: wenn die Programmiersoftware es nicht automatish macht oder man dem Frieden nicht traut; als erstes immer die Fuses LESEN. Wenn man noch neu dabei ist: die gelesenen Fuses genau anschauen daraus die Einstellungen zusammensuchen und dann mit dem Datenblatt vergleichen, ob man die Bedeutung wirklich so verstanden hat, wie sie gemeint ist. Dann nur die ändern, an denen man ändern will. Dann beten und Write Fuses. ;-))) PS: ich habe noch keinen verfused, wenn es doch mal passiert: kann man alles wieder retten, wenn nicht sofort, dann später, wenn man mehr davon versteht, das Ding wird ka nicht schlecht vom Liegen. Gruß aus Berlin Michael
Hallo Michael, ich werde die Tage mein Glück versuchen, ich nutze ein selbstgebautes PonyProg-kompatibles Programmiergerät, das setzten ist, soweit ich weiß, mit diesem Programm relativ simpel. Danke nochmal für die wertvollen Tipps :)
Der mega16 wird mit 1 MHz ausgeliefert. Das passt ja auch nicht so schlecht zu deinen 0,8 MHz. D. h. wenn du 1 MHz einstellst, passts genau. Du kannst aber auch die entsprechenden Fusebits setzen: * http://palmavr.sourceforge.net/cgi-bin/fc.cgi Der interne RC-Oszillator arbeitet mit 8 MHz. Mittels Fusebits kann man das dann auf 8, 4, 2 oder 1 MHz teilen. Schneller gehts mit nem externen Oszillator oder Quarz. PS: pass mir bloss auf mit den Fusebits ;-)
Bei PonyProg daran denken, dass die Fuse-Bits "umgedreht" werden müssen! (welche Bedeutung hat ein gesetzter Hacken? An/Aus? :-) Ansonsten hat sich bei Vielen (Mir eingeschlossen) ein kleiner separater Quartz-Oszillator sehr bewährt (--> http://www.mikrocontroller.net/articles/AVR_Fuses und besonders http://www.klaus-leidinger.de/mp/Mikrocontroller/meinetools.html#Preserver
Hallo, naja, bei PonyProg eher daran denken, daß er es völlig korrekt macht. ;-) Fuse programmiert -> Fuse ist 0 !!! Fuse unprogrammiert -> Fuse ist 1 !!! Dazu siehe auch AVR-Datenblätter Anmerkungen. Haken in Pony gesetzt -> Fuse programmiert -> 0 Liegt einfach daran, daß es EEPROM/Flash-Zellen sind und lassen sich nur auf 0 programmieren und sind gelöscht 1. Wie schon die alten EPROMs oder der AVR-Flash. ext. Quarz mit >=8MHz am AVR -> CKSEL0...3 1111 -> dort alle Haken in Pony raus. Unbedingt Fuses zuerst lesen (die aktuelle Version soll es wohl endlich automatisch machen). Ist einfach nur ungewöhnlich, weil man gewohnheitsmäßig eher 1 - programmiert denkt... Gruß aus Berlin Michael
hallo, also ich glaube pony ist zum fuse setzen für jemand unerfahrenes nicht so der tipp :-/ die foren sind voll mit hilferufen von leuten die sich ihre AVRs mit pony-fuses lahm gelegt haben... ich nehm jetzt immer das hier: http://www.myavr.de/download.php?suchwort=ProgTool gruß M.
Markus wrote: > hallo, > > also ich glaube pony ist zum fuse setzen für jemand unerfahrenes nicht > so der tipp Dokumentation oder Datenblätter nicht zu lesen ist nicht ratsam, und darauf sind praktisch alle Probleme zurückzuführen nach dem Motto "einfach maln büssjen rumclicken was plausibel ist und gucken was passiert"
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.