Forum: Compiler & IDEs Timer0 mit ATMEGA168 im Polling Betrieb


von Fabian F. (freysn)


Angehängte Dateien:

Lesenswert?

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

von Stefan E. (sternst)


Lesenswert?

1
    while(TIFR0 == 0x00);
Geht so nicht. Schließlich gibt es in dem Register neben dem dich 
interessierenden Overflow-Flag auch noch andere Flags.

von Oliver (Gast)


Lesenswert?

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

von Uwe (de0508)


Lesenswert?

alleine der Name "F U C K Y O U.c" ist abschreckend!

von Karl H. (kbuchegg)


Lesenswert?

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.

von Fabian F. (freysn)


Lesenswert?

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!

von Karl H. (kbuchegg)


Lesenswert?

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
Noch kein Account? Hier anmelden.