mikrocontroller.net

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


Autor: Pipo (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 :)

Autor: Der Techniker (_techniker_)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Welchen Quarz hast du dran?

Autor: Pipo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für dein Interesse:)

Atmega8 mit 16Mhz Quarz.

Autor: Uwe ... (uwegw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Für solche Berechnungen gibt es AVRcalc:
http://www.avrfreaks.net/index.php?func=viewItem&i...
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.

Autor: hereinspaziert (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Andreas K. (a-k)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: hereinspaziert (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Andreas K. (a-k)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: nobody (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
welche programmier sprache benutzt du denn ??

Autor: Pipo (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: nobody (Gast)
Datum:

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

Autor: hereinspaziert (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Pipo (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Andreas K. (a-k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
AVR PWM
AVR-GCC-Tutorial => PWM/Pulsweitenmodulation

Autor: Benedikt K. (benedikt) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Welcher Abstand soll zwischen den Impulsen liegen ?

Autor: Pipo (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Benedikt K. (benedikt) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Pipo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke Benedikt für die genaue Beschreibung!!!!

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

Vielen Dank :)

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Michael U. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.