mikrocontroller.net

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


Autor: Rico Scherer (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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!

Autor: Rico Scherer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
PS.: das Programm ist als Anhang angefügt!!!

Autor: Karl heinz Buchegger (kbucheg)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Rico Scherer (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: P.F.W. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Rico Scherer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So mit interrupt funkt nu alles besten.

Danke für die Infos

Autor: Beziehungsexperte (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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. :)

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.