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!
> 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
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.
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
> 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.
So mit interrupt funkt nu alles besten. Danke für die Infos
@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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.