Forum: Mikrocontroller und Digitale Elektronik Zeit zwischen Flanken messen


von Zoltan (Gast)


Lesenswert?

Hallo,

Ich beschäftige mich seit kurzem mit Microcontrollern, und ich hätte da 
gleich zwei Fragen zu AVR-GCC:

1.)Kann mir jemand erklären (bzw einen kleinen Beispiel geben), wie man 
mit einem AVR einen Puls, von zum Beispiel 1ms messen kann. Der Timer 
soll mit einer  steigenden Flanke am Pin xx gestartet werden und mit dem 
fallenden die Messung beenden, UND anschließend den Wert im Register 
ablegen.

2.)Wie kann ich nun mit dem Wert aus dem Register wieder den Selben Puls 
am Ausgang yy erzeugen?

Danke schon im Voraus
Zoltan

von thkaiser (Gast)


Lesenswert?

Einen fertigen Code kann ich Dir leider nicht bieten, aber evtl. etwas 
weiterhelfen:
Die AVRs haben die Möglichkeit, externe Interrupts mit einer steigenden 
oder fallenden Flanke zu programmieren. Also den Interrupt auf steigende 
Flanke programmiert, im Interrupt den Timer gestartet und den Interrupt 
auf fallende Flanke programmieren, um anschließend den Timer zu stoppen 
und auszulesen. In der Interrupt-Routine müßte dann eine 
Fallunterscheidung (steigende oder fallende Flanke) vorhanden sein.
Die Ausgabe könnte man über einen zweiten Timer mit Capture-Interrupt 
lösen.
Es ist allerdings abhängig davon, was der Controller sonst noch machen 
soll - ist es die eizige Aufgabe, die er zu lösen hat, könnte man es 
auch ohne Interrupts machen - ist für den Anfang etwas einfacher.
(1 ms-Impulse - hört sich irgendwie nach Servo an?)

von Zoltan (Gast)


Lesenswert?

Hi thkaiser,

Es hört sich nicht nur danach an.... Gut geraten! :)

Ich dachte mir folgendes:
Wenn es gelingt den Senderpuls zu Messen, diesen Wert  abzuspeichern und 
wieder den Selben Puls auszugeben habe ich schon mal eine gute 
Grundlage...denn diesen eingelesen Wert kann ich eigentlich in Ruhe 
"durch den Reißwolf drehen". Der nächste Puls vom Empfänger an den Servo 
folgt ja erst in 20ms. --> 1...2ms für die Eingabe, dann z.B. 1ms zum 
Verarbeiten und dann kommt die Ausgabe, 1..2 ms. 15msZZZzzzzzz

Dann kann ich auch den selben Timer benutzen. Oder? Später will ich mit 
Hilfe des AD-Wandlers den gespeicherten Wert von vorhin im Betrieb 
verändern, PD-Regelkreise... das wird lustig, ist ja gut das bald 
Weihnachten ist.


Ich habe erst vor zwei Wochen mit MC angefangen, lerne auch grad erst 
das Programmieren. Würdest Du sagen, dass das realistisch ist, was ich 
da ausgebrütet habe?

Ach ja und Danke für Dein Kommentar! Das ist schon mal ein echt guter 
Anfang.

Gruß Zoltan

von thkaiser (Gast)


Lesenswert?

Möglich ist im Prinzip eigentlich alles - fast alles. Aber Du hast Dir 
für den Anfang eine nicht gerade triviale Sache ausgesucht...
Es geistert im Netz eine Software herum, mit der sich 8 Servos 
ansprechen lassen, der Link wurde im Forum auch schon mal genannt, habe 
ihn nur nicht zur Hand. Da kannst Du vielleicht etwas in die Materie 
hineinschnuppern...
Willst Du mehrere Kanäle überwachen oder würdest Du jedem Kanal einen 
eigenen Controller spendieren? Letzteres wäre Softwaretechnisch nicht 
ganz so schwierig, und dann könntest Du auch den gleichen Timer zum 
Generieren der Impulse verwenden.
Bei solchen Sachen gibts nur eins: Idee ausbrüten, ein wenig 
herumrechnen, welche Timer-Frequenz die richtige ist und dann das 
Verfahren "try and error" anwenden ;-)
Ein Oszilloskop würde ich Dir wärmstens empfehlen, um die Impulse 
gescheit auswerten zu können.

Gruß

von Zoltan (Gast)


Lesenswert?

Ah ja, das mit den 8 Servos hab ich mal gesehen, aber ich glaube es war 
in Assembler oder für BASCOM. Da habe ich ja den Link: 
http://www.frii.com/~dlc/robotics/2313board/bb2313.html. BASCOM wars.

<würdest Du jedem Kanal einen eigenen Controller spendieren?>
Ich glaube, wenn der Timer mit der ersten Ausgabe fertig ist kann er ja 
den nächsten Servo starten, schön im Gänsemarsch. Also mit einem Kanal 
mehrere Servos steuern(nicht unabhängig von einander). Werd´s mal 
ausprobieren...

Nochmal danke für die Tipps! Sie haben mir echt weitergeholfen.

Gruß
Zoltan

von Mike (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

das messen ist kein Problem, ich habe gerade 3 Kanäle an 3 Pins 
gemessen, das hänge ich an.

Schwieriger ist es mehrere Kanäle an einem Pin weil dann noch die 
Synchronpause ausgewertet werden muss.

Bei mir ist es allerdiengs so, dass ich möglichst ein ganzes Byte also 0 
bis FF für für den Impuls brauche da ich damit den PWM ansteuere also 
must mal schauen ob das was nützt. Der Offset ist dazu da die kürzeste 
Impulszeit also ca 0,5ms auszublenden, das brauchts du dann nicht. Die 
Timerzeiten mußt Du dann entsprechend deines Quarzes auf eine passende 
Zeit einstellen.

Mike

von Zoltan (Gast)


Lesenswert?

Hi Mike,

danke für die Beispielcode, und für die super Erläterung! Werd´s gleich 
mal ausprobieren.

Zoltan

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.