Forum: Mikrocontroller und Digitale Elektronik atMega8l Timer0 spricht nur auf prescaler 8 an


von Rico Scherer (Gast)


Angehängte Dateien:

Lesenswert?

Hallo

Ich habe mir nun auch endlich mal einen Mikrocontroller zugelegt.
Es funktioniert auch alles so wie man in vielen Foren und Tutorials
lesen kann.

Was ich vorhabe:
-  einen Blinker bauen (1Sec) den ich später im Programm als Zähler
einsetzen kann

Hardware und Einstellungen:
-  habe einen atmega8L mit externem 4Mhz Quarz
-  Die ganze port D reihe ist mit LED's belegt (Ausgang)
-  Fuse bits sind auf den externen Quarz eingestellt

Ich hab das Problem das sich der Prescaler nicht einstellen läst!
Es sind nur zwei Timer takte möglich 1/1 direkt von der CPU Clock oder

ein Prescaler von 8. Wenn ich die anderen 3 einstelle ändert sich
nichts, bin schon am verzweifeln und nix im Netz gefunden.
Möchte nicht unnötig Register verschwenden um das ganze per software
runterzuteilen.

Danke schonmal für die Antworten!

von Rico Scherer (Gast)


Lesenswert?

PS.: das Programm ist als Anhang angefügt!!!

von Karl heinz B. (kbucheg)


Lesenswert?

> Ich hab das Problem das sich der Prescaler nicht einstellen läst!

Ich bin mir ziemlich sicher, das er das tut.

Das Problem duerfte eher darin liegen, dass du
den Timer direkt abfragst.
Der Timer tickert schoen gemütlich vor sich hin.
Nach allen paar Taktzyklen wird er erhöht. D.h. wenn
du zufälllig den Timer nicht im richtigen Moment abfraegst,
wirst du wahrscheinlich den Timer niemals im Zustand
vorfinden, dass er den Wert 255 enthaelt.

Sowas macht man mit einem Interrupt. Der Timer kann
loest einen Interrup aus, wenn er von 255 auf 0 schaltet.
Du haengst dich an diesen Interrupt dran und schon kannst
du keinen 255->0 Uebergang mehr verpassen, weil dein µC halt
zufällig grade was anderes tut anstatt das Timerregister
auszulesen.


s

von Rico Scherer (Gast)


Lesenswert?

Hallo Karl

Ja das versteh ich schon.

Nur wenn der Timer langsam hochzählt und die CPU Clock viel schneller
ist als der Timer takt, dann muß er den nulldurchgang doch mitbekommen
oder nicht?
Es wird doch quasi mehrmals der selbe wert vom Timer ausgelesen bevor
dieser einmal weitertaktet.

Ich hab mal irgendwo gelesen das wenn man den Timer mit einen Externen
Taktgeber (Quarz) betreibt dann soll dieser nicht schneller als 50 %
des CPU taktes sein damit der controller noch alle veränderungen
mitbekommt.

Ich werde dies trozdem gleich mal per Interrupt ausprobieren.

von P.F.W. (Gast)


Lesenswert?

oder

Timer/Counter Interrupt Flag Register – TIFR

auf gesetztes

Bit 0 – TOV0: Timer/Counter0 Overflow Flag (TOV0 is cleared by writing
a logic one to the flag)

prüfen, kann allerdings sein, daß Du abhängig von der Verweildauer
Deines restlichen Programmes nicht jeden Überlauf mitbekommst.

Gruß
Frank

von Karl H. (kbuchegg)


Lesenswert?

> Nur wenn der Timer langsam hochzählt und die CPU Clock viel
> schneller ist als der Timer takt, dann muß er den nulldurchgang
> doch mitbekommen oder nicht?

Ja das hab ich mir auch überlegt.
Verblüffend ist, dass es angeblich bei 1:1 funktioniert. Das
kann ich mir eigentlich nur so erklären, dass der Timer
sehr viel öfter durch 255 durchläuft als du denkst, bevor
ihn dein Code einmal als 255 erwischt. Mit anderen Worten,
dein Timing stimmt hinten und vorne nicht. Wo du annimmst,
dass dein Timer einmal die 255-Runde gedreht hat, hat er das
in Wirklichkeit viele male getan. Das könnte man jetzt mit
den Takten auszählen: Wieviele Takte dauert eine Schleife?
Wieviele Takte müssen vergehen, bis der Timer-auslesebefehl
genau zur richtigen Zeit im Timer nachsieht, bis er den Timer
bei 255 erwischt.
Das ist ein bischen so, wenn du und deine Freundin in
unterschiedlichen Zeitintervallen in einen Rum hineingeht.
Gehst du alle 3 Stunden hinein und sie alle 5 Stunden, dann seht
ihr euch nach 15 Stunden das erste mal. Schaut sie aber alle 6
Stunden hinein, dann habt ihr bereits nach 6 Stunden ein Wiedersehen.
Obwohl ihre Intervalle länger sind, ist die Zeit die verstreichen
muss insgesammt aber kürzer.

Mit den exakten Timerwerten muesste man das konkret durchrechnen,
aber da bin ich jetzt zu faul dazu. Vor allem deshalb, weil da
mehrere Schleifen ineinander stecken, was das Timing verkompliziert.

Also entweder einen Interrupt aufsetzten, oder das Interrupt-
flag (wird auch gesetzt wenn es keine Interrupt Funktion gibt)
auswerten.

von Rico Scherer (Gast)


Lesenswert?

So mit interrupt funkt nu alles besten.

Danke für die Infos

von Beziehungsexperte (Gast)


Lesenswert?

@Karl Heinz Buchegger

Wenn ich alle drei Stunden in einen Rum gehe, meine Freundin alle 5
Stunden und meine Ex-Freundin alle 6 Stunden, kommt es nach 30 Stunden
zu nem Overflow. :)

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.