1µs langen Impuls erzeugen?

Gast #600087
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 :)
#600099
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.
Gast #600115
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.
Gast #600136
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
Gast #600152
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.
Gast #600160
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
#600182
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.
Gast #600516
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.
Gast #600568
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren