Guten Tag Ich möchte den Timer0 meines ATMEGA168 so aufsetzen, dass ich eine Funktion aufrufen kann ( wait), die dann z.B 100us wartet. Ich bin mir nicht sicher ob ich die Taktfuses richtig eingestellt habe. Ich benutze Atmel Studio 6 und habe EXTXOSC_8Mhz_XX_16K_14CK_65MS eingestellt. Es ist ein handelsüblicher Quarz 8.00Mhz bestückt. Ich lasse einen Ausgang toggeln. (Siehe Code) Die Toggelfrequenz beträgt aber immer zwischen 125 und 130 kHz, je nach dem wie ich den Prescaler eingestellt habe. (Wahrscheinlich nur die Zeit um das Register zu beschreiben?!) Vielen Dank im Vorraus! Habe nur Infos für den Interrupt Betrieb gefunden... Freundlich grüsst freysn
1 | while(TIFR0 == 0x00); |
Geht so nicht. Schließlich gibt es in dem Register neben dem dich interessierenden Overflow-Flag auch noch andere Flags.
Vielleicht doch noch mal hier nachlesen: http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/Die_Timer_und_Z%C3%A4hler_des_AVR Wenn du den Timer ohne Interrupt nutzen willst, dann laß einfach alles weg, was mit Interrupts zu tun hat, und starte den Timer nur. Und lass die Finger von allen anderen Registern, die mit dem einfachen Starten nichst zu tun haben. Zu den Fuses bitte ganz schnell hier nachlesen: http://www.mikrocontroller.net/articles/AVR_Fuses#AVR_Studio Zum Glück scheint deine Fuse-Einstellung nicht funktioniert zu haben. Denn hättest du die Fuses tatsächlich auf EXTOSC geändert, würde der Prozessor an einem Quarz keinen Mucks mehr machen. Und last, but not least, würde eine Umbenennung deines Testprogramms den ein oder anderen weniger abschrecken. Das klingt doch leicht unhöflich... Oliver
Ich kanns jetzt nicht beschwören, aber ein
1 | TCCR0B=0x05;// Prescaler 1 |
ist kein Prescaler von 1. Welche Bits du da jetzt genau gesetzt hast, weiß ich nicht, die müsste ich mir aus dem Datenblatt zusammensuchen. In 0x05 gibt es auf jeden Fall aber 2 Stück 1-Bits und damit ist das entweder nicht einfach nur ein Prescaler von 1 und sonst nichts, oder aber es ist noch nicht einmal ein Prescaler von 1.
1 | TIMSK0=0x01; //Overflow Interrupt Enable |
schön. Das kann ich glauben oder auch nicht. Aus welchem Grund benutzt du da Hex-Zahlen? Die Bits in den Konfigurationsregistern haben NAMEN! Benutze die auch. Dann spart man sich die Hälfte der Suchvorgänge im Datenblatt, weil zumindest die Bitnamen schon im Code stehen und nicht erst mühsam eruiert werden müssen. Abgesehen davon: Wozu gibst du einen Overflow-Interrupt frei? Du hast keine ISR dafür! Gratuliere. So eine Situation wird mit einem Prozessor-Reset bestraft, wenn ein Overflow auftritt. Und der tritt bei dir auf.
1 | char i; |
2 | for (i = 0;i < wait_time;i++) |
was denkst du, wie oft diese Schleife wohl durchlaufen wird, wenn wait_time den Wert 0 hat? Genau. Gar nicht.
Oliver schrieb: > Vielleicht doch noch mal hier nachlesen: > > http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/Die_Timer_und_Z%C3%A4hler_des_AVR > > Wenn du den Timer ohne Interrupt nutzen willst, dann laß einfach alles > weg, was mit Interrupts zu tun hat, und starte den Timer nur. Und lass > die Finger von allen anderen Registern, die mit dem einfachen Starten > nichst zu tun haben. > > Zu den Fuses bitte ganz schnell hier nachlesen: > http://www.mikrocontroller.net/articles/AVR_Fuses#AVR_Studio > > Zum Glück scheint deine Fuse-Einstellung nicht funktioniert zu haben. > Denn hättest du die Fuses tatsächlich auf EXTOSC geändert, würde der > Prozessor an einem Quarz keinen Mucks mehr machen. > > Und last, but not least, würde eine Umbenennung deines Testprogramms den > ein oder anderen weniger abschrecken. Das klingt doch leicht > unhöflich... > > Oliver Gut, ich werds nochmals versuchen. Aber ich habe die Fuse-Einstellung auf EXTOSC geändert. Wieso denkst du, dass es nicht funktioniert hat? http://www.mikrocontroller.net/articles/AVR_Checkliste#Quarz_oder_Quarzoszillator_angeschlossen.3F Da hab ich gelesen, dass ein Quarz ein external crystal ist. Deshalb hab ich das so eingestellt. Ja das mit dem Namen tut mir leid. Nach langer Fehlersuche hab ich am neuen Projekt wohl den Dampf abgelassen.. Das mit dem wait(0) war auch noch ein sehr dummer Fehler... TCCR0B=0x05; ist kein Prescaler von 1, hab den Prescaler verändert um zu sehen, ob es einen EInfluss hat. (Hatte es nicht) Wohl den Kommentar nicht angepasst. Ich geh nochmals über die Bücher. Vielen Dank für die konstruktiven Ideen!
Fabian Frei schrieb: > Aber ich habe die Fuse-Einstellung auf EXTOSC geändert. Wieso denkst du, > dass es nicht funktioniert hat? Ganz einfach: weil dein µC offenbar noch läuft. Wenn du das tatsächlich so umgestellt hättest, dann würde der nicht mehr laufen. EIn QUarz ist kein externer Oszillator. Oder aber dein Quarz ist kein Quarz sondern ein Quarzoszillator.
:
Bearbeitet durch User
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.