Grüß Euch! Ich hoffe irgendwer kann mir helfen einen Timer des Atmega8 so einzustellen, dass er 1µs genau zählt, damit der µC beliebig lange Impulse ausgeben kann. Ich hab es min 1 Million Mal probiert mit Interrupt und ohne aber ich habs nicht zusammengebracht! Ich hab mit dem Timer0(Overflow Interrupt) max. 2,5µs zusammengebracht!! Ich würd mich sehr freun, wenn mir wer helfen könnte und vl einen bsp-code posten könnte! Danke, im Vorraus :)
Für solche Berechnungen gibt es AVRcalc: http://www.avrfreaks.net/index.php?func=viewItem&item_id=292&module=Freaks%20Tools CTC Mode, prescaler 1, Compare-Wert 0x10. Das ganze sollte allerdings in Assembler geschreiben werden, da zwischen zwei Interrupts auch nur 16 Takte liegen! Wenn ein Hochsprachen-Complier in der ISR erst aller Register sicher, gehen schon mehr als 16 Takte drauf! Könnte gut sein, dass da dein Problem liegt.
Das wird meiner Meinung nach nur sehr schwer möglich sein, dass mit dem Timer zu lösen, da man den Timer-Compare Wert jedesmal wieder neu setzen muss. außerdem benötigt ein Interrupt auch einige Takte. (Z.b. ein RETI benötigt 4-5 Takte, bei 16MHz sind maximal 16 Instruktionen pro µs möglich) Ich würde das ganze, sofern nur die Erzeugung der Impulse auf dem ATMega läuft, mit ner Schleife und einer angepassten Menge an NOPs versuchen.
Die Frage ist zwar im Text etwas unklar formuliert, aber für mich klingt es eher danach, als ob er die Impulse nicht messen sondern ausgeben will. Und das geht per Timer im PWM-Modus. Hat dann mit Interrupts und deren Latenzen nichts zu tun.
Das er Impulse ausgeben will ist schon klar. Aber so wie ich das verstanden habe, will er die 1µs als kürzesten Impuls und alles was länger ist, ist das dann ein Vielfaches davon.
Wo ist das Problem, einen 1µs Impuls auszugeben? Wenn man einen Timer im PWM-Modus dafür verwendet, geht es taktgenau. Auch per Software ist das kein Problem, nur muss man dann auf Interrupts verzichten.
Hy an alle!! Eure Vorschalkäge klingen gut, nur bin ich Anfänger und kenn mich nicht so gut aus. Ich programmierre in C und ich will Impulse von 1µs - ca 300ms erzeugen können(Impuls ausgeben: LOW - HIGH(1µs - 200ms] - LOW) Könnt ihr mir bitte einen genauen Lösungsforschlag nennnen und vl auch code?! mfg
Okay wenn du in C programmierst, dann wirst du ne PWM nutzen müssen, wie Andreas bereits sagte. Mit dem Timer1 kannst du ne Fast-PWM einsetzen, wobei je nach Modus entweder OCR1A oder ICR1 den oberen Wert angeben. Schau dir einfach mal im Datenblatt das Kapitel zum Timer1, speziell Fast-PWM an, dann wird dir auch zum Verfahren sicherlich einiges klarer.
Danke für den Tipp! :) Ich habs mir grad angschaut, doch viel schlauer bin ich auch nicht geworden. Kann mir vl irgendwer genaueres zu Timer1 mit PWM(Atmega8 - 16Mhz) sagen. Vl die leichteste Methode um einen 1µs langen Impuls zu erzeugen? mfg
Wenn ein taster gedrückt wird soll einfach ein Pin einen Impuls ausgeben. Die Kleinste Zeit ist 1µ! d.h LOW -> Taste gedrückt High für 1µs -> wieder LOW -> ENDE
OK, dann machst du folgendes: - Such dir OCR1A oder B aus, setz den Pin auf Ausgang und auf Low - aktiviere den entsprechen Output Compare Interrupt. In diesem wird der Timer gestoppt. - aktiviere den output compare mode (Non inverting mode) - setze das ICR1 Register auf 65535 Sobald der Taster gedrückt wird: - lade die gewünschte Zeit in das entsprechende OCR1x Register: Der Wert entspricht 1/F_CPU, in deinem Fall also 1/16µs pro 1. Für 1µs müsste also ein Wert von 15 verwendet werden (nicht 16, da bereits 0 einen Impuls erzeugt) - setze TCNT1 auf 65535 - initialisiere die PWM (Fast PWM, Mode 14), und starte den Timer mit Prescaler 1 Damit lässt sich jetzt ein Impuls zwischen 1/F_CPU bis etwa 65500/F_CPU erzeugen, in deinem Fall also von 1/16µs bis 4ms. Für größere Zeiten musst du den Prescaler aktivieren.
Danke Benedikt für die genaue Beschreibung!!!! Ich werde das gleich morgen ausprobieren und auch gleich berichten obs gepasst hat!! Vielen Dank :)
> Das ganze sollte allerdings in Assembler geschreiben werden, da > zwischen zwei Interrupts auch nur 16 Takte liegen! Ob Assembler oder nicht ist eigentlich egal. 16 Takte reichen dafür sowieso nicht aus. > Wenn ein Hochsprachen-Complier in der ISR erst aller Register sicher, > gehen schon mehr als 16 Takte drauf! In dem Fall liegt man eher jenseits von 50 Takten.
Hallo, Du hast über die minimale Länge der Pause nichts geschrieben (oder ich habe es übersehen). Timer im CTC-Mode für 1µS vorbereiten. Vorteiler auf Timer-Stop, Timer mit 0 Initialisieren., IRQ freigeben. Wenn der Impuls beginnen soll _ Vorteiler auf 1. In der IRQ nur den Timer wieder stoppen. Die genauen Abläufe muß Du Dir aus den Diagrammen der CTC-Beschreibung raussuchen. Sollte aber ohne größere Probleme machbar sein. Gruß aus Berlin Michael
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.