Forum: Mikrocontroller und Digitale Elektronik 1µs langen Impuls erzeugen?


von Pipo (Gast)


Lesenswert?

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 :)

von Der T. (Gast)


Lesenswert?

Welchen Quarz hast du dran?

von Pipo (Gast)


Lesenswert?

Danke für dein Interesse:)

Atmega8 mit 16Mhz Quarz.

von Uwe .. (uwegw)


Lesenswert?

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.

von hereinspaziert (Gast)


Lesenswert?

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.

von Andreas K. (a-k)


Lesenswert?

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.

von hereinspaziert (Gast)


Lesenswert?

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.

von Andreas K. (a-k)


Lesenswert?

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.

von nobody (Gast)


Lesenswert?

welche programmier sprache benutzt du denn ??

von Pipo (Gast)


Lesenswert?

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

von nobody (Gast)


Lesenswert?

sorry in C kann ich dir nicht helfen-progge nur bascom.

von hereinspaziert (Gast)


Lesenswert?

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.

von Pipo (Gast)


Lesenswert?

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

von Andreas K. (a-k)


Lesenswert?

AVR PWM
AVR-GCC-Tutorial => PWM/Pulsweitenmodulation

von Benedikt K. (benedikt)


Lesenswert?

Welcher Abstand soll zwischen den Impulsen liegen ?

von Pipo (Gast)


Lesenswert?

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

von Benedikt K. (benedikt)


Lesenswert?

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.

von Pipo (Gast)


Lesenswert?

Danke Benedikt für die genaue Beschreibung!!!!

Ich werde das gleich morgen ausprobieren und auch gleich berichten obs 
gepasst hat!!

Vielen Dank :)

von Rolf Magnus (Gast)


Lesenswert?

> 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.

von Michael U. (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.