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
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?)
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
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ß
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
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