Hi Leute! Ich bin noch so eine AVR-Anfänger und brauche dringend Hilfe, weil alleine ich nicht mehr klarkomme:) Also, ich möchte eine Pinabfrage jede (n-te) Mikrosekunde machen, und dafür den Timer verwenden.. Und das ist das Problem was ich habe, denn mir fehlen die nötigen Kentnisse. Ich wäre sehr dankbar für einen Vorschlag/einen Tipp und noch mehr für einen Link auf eine vernünftige Erklärung wie man die Timer benutzt:) Ahja, ich habe einen Mega16 und Quarz=14,7456 Mhz und wenig Ahnung von Mikrocontrollern:)
Nunja, du könntest z.B. mal schaun, wie es andere machen. Dann versuchen zu verstehen und dann Bescheid wissen. Fast alle Programme hier nutzen mindestens einen Timer: http://www.hanneslux.de/avr/index.html ...
Oh, vergessen: Ich habe fast keine Ahnung von Assembler, also wären Beispiele in C sehr vorteilhaft:)
Die Beschreibung der Timer-Register und deren Bits in den Datenblätter der AVRs gilt nicht nur für Assembler, sondern auch für C. Beispiele kann ich dir leider keine geben, denn von C habe ich fast keine Ahnung. ...
Könnten Sie mir vll kurz erklären wie man auf die gewünschte Frequenz kommt? Also das mit prescaler und Vorladewert? Das Schwierige für mich ist die krumme Frequenz des Quarzes, die eine genaue Berechnung erschwert..
Alles reine Mathematik... Wir haben: 14745600 Hz Quarz, gewünschte Timer-Frequenz (z.B. bei 10µs) wäre 1/0.00001 = 100000 Hz. Also müssen 14745600/100000 = 147,456 Takte verstreichen, bis ein Timer-Interrupt ausgelöst wird. Das passt in einen 8-Bit Timer, aber da der Endwert 255 nicht erreicht wird, müsste man mit einem Output-Capture arbeiten. Prescaler = 1. Oder man lässt den Timer bis zum Overflow durchlaufen, dann bekommt man alle 256 Takte einen Interrupt, also müssen wir andersrum rechnen: 1 Takt = 1/14745600 s = 0,06781 µs oder 256 Takte = 17,36 µs. Wichtig ist, dass man sich auf eine Einheit einigt, also nicht MHz/KHz oder s / µs durcheinanderwerfen.
@thkais: Du meinst 'Output Compare'... @leo: Eigentlich ne ganz einfache Kiste: Du hast einen Takt, den Dein Quarz Dir liefert. Das ist der Grundtakt für alles, was der Controller macht. Diesen Takt kannst Du herunterteilen, indem Du ihn als Eingangssignal für einen Timer benutzt. Ein Timer ist nichts anderes als ein digitaler Zähler, der auf eine Flanke des Eingagssignals seinen Zählwert um eins erhöht. Wenn er eben durch einen Takt mit konstanter Frequenz gespeist wird, dann zählt er Zeittakte und arbeitet als Timer. Der Prescaler (dt. Vorteiler) ist auch nichts anderes als ein Timer, bei dem Du nur auf bestimmte Bits zugreifen kannst. Wenn Du jetzt im Prescaler ein Teilerverhältnis einstellst und z.B. in das Compare-Register des Timers einen bestimmten Wert hineinschreibst, dann bekommst Du ein Compare-Ereignis (auf das Du z.B. einen Interrupt auslösen lassen kannst, in dessen Handler Du Deine Eingänge abfragst), wenn das Timer-Zählregister TCNTx den Compare-Wert erreicht. Die Zeit vom Starten des Timers bis zum Compare-Ereignis errechnet sich aus dem Kehrwert der Grundfrequenz vom Quarz (also deren Periodendauer) multipliziert mit dem Produkt aus allen nachgeschalteten Teilerfaktoren. Besipiel: Wenn Du mit 14,7456 MHz taktest und einen Prescaler von 8 einstellst und in das Compare-Register 100 hineinschreibst, dann bekommst Du alle 8*100 Grundtakte ein Compare-Ereignis, das wäre dann im Beispiel ein Takt von 14,7456 MHz/800 = 18432 Hz, also alle 54,253 µs einen Interrupt, wenn Du ihn denn aktiviert hast. Wenn Du den Timer im CTC-Modus betreibst, wird er automatisch bei Auftreten des Compare-Ereignisses zurückgesetzt und Du brauchst Dich nicht um das Nachladen zu kümmern. Dann hättest Du ohne weiteren Eingriff alle 54,253 µs einen Interrupt. Das nur als Beispiel, damit es Dir klar wird, wie man so was berechnet.
@johnny.m: Ich will hier jetzt nicht klugscheißen aber mich verwundern deine 54,253µs. Meinst du nicht eigentlich 54,253ms? Nur mal so ein Beispiel von mir: Bei einer Frequenz von 7372800Hz und einem Prescaler von 64 und im Compare Register eine 115 drinsteht kommt man auf einen Takt von 1001,739Hz also ein Interrupt alle 0,99826 ms. Ist doch richtig oder? Nun noch ein anderes Beispiel was ich hier im Forum gefunden habe und nicht ganz verstehe: OCR0 = 19; // 20MHz 1024 195,315) = 1000 Hz TCCR0 = ( (1<<WGM01) | (0<<WGM00) | (0<<COM01) | (0<<COM00) | (1<<CS02) | (0<<CS01) | (1<<CS00) ); Hier wird ein Prescaler von 1024 eingestellt und die Frequenz beträgt 20 MHz. Wenn ich nun 19 ins OCR0 schreibe erzeuge ich eine Takt alle 0,0009728 s. Ist doch auch richtig oder? Nun meine Frage: Wieso steht in der Rechnung 195,315? Wo wird das benötigt?
>Meinst du nicht eigentlich 54,253ms? Nö! 1/18432Hz = 54,253µs? (54,253 * 10^-6s) >0,99826 ms richtig! >Wieso steht in der Rechnung 195,315? da hat sich jemand vertippt, oder den Kommentar nicht verändert als er von 100Hz zu 1kHz übergegangen ist.
so wie ich das verstanden habe, muss man den takt direkt von oszilator nehmen. beim 8051 war ein maschinentakt fosz/12, das entfällt hier oder sehe ich das falsch? so long kalle
Die AVRs arbeiten direkt mit dem Oszillatortakt. 1 Oszillatortakt entspricht einem Arbeitstakt. Viele Instruktionen brauchen nur einen Takt zur Ausführung. Der Timer kann direkt den Oszillatortakt zählen. All diese Informationen kannst Du aber auch im Datenblatt des entsprechenden AVRs nachlesen. Bit- & Bytebruch... ...HanneS...
ich weiss, ich weiss. wollte nur sichergehen ob ich mich da nicht verlesen habe. danke.... so long kalle
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.