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