Hallo Leute! Ich möchte gerne einen kleinen Infrarot Abstandsmelder bauen. Der soll nicht die genaue Entfernung zu einem Hindernis messen, sondern nur bescheid geben, wenn etwas in der nähe ist. Die Hardware dazu ist ein "TSOP 1756" Empfänger und eine passende IR-LED. Wie das ganze verschaltet wird habe ich in einer Schaltskizze gesehen. Die LED und der Empfänger werden also in die selbe Richtung ausgerichtet, und die LED beginnt zu senden. Sobald der Empfänger ein Signal, weiß ich, dass was in der Nähe ist... So stell ich mir das jedenfalls vor ;-) Mein Problem ist jetzt das Senden/Empfangen des Signals: Ich hab keine Ahnung von Frequenzen und sowas ;-) Kann ich einfach die LED an aund ausschalten (wie eine normale "Blink-LED")? Und funktioniert der TSOP wie ein Schalter, liefert also einfach AN bzw. AUS wenn er ein stark genuges Signal bekommt? Oder muss ich das Signal irgendwie komplizierter gestalten (am TSOP steht z.B. was von 56 Khz)...??? Ich hoffe ihr könnt etwas Licht in meine geistige Dunkelheit bringen :-) Hier mal der Schaltplan: http://www.vankurt.de/images/ShaltplanXCV.jpg
Der TSOP1756 reagiert auf ein IR-Signal, das mit 56kHz moduliert ist. Die Frequenz kann man mit einem Timer erzeugen, der dann die LED taktet. Schaltet man den Timer nun wiederum auch in regelmässigen Abständen ein und aus, bekommt man dieses Signal am Ausgang des TSOP zur Verfügung gestellt. Das kann man dann mit dem Controller auswerten...
Hey, danke für die schnelle Antwort :-) Dann muss der AVR also den Pin, an dem LED hängt, 56.000 mal pro Sekunde an- und abschalten??? Sowas geht??? ;-)
Klar geht das. Warum auch nicht? Kann man sogar komplett in "Hardware machen". Aktuelle Controller haben die Möglichkeit, Timer so zu konfigurieren, dass sie bei einem bestimmten Wert einen Pin schalten (togglen) und wieder auf Null zurückspringen. Schon hat man eine wunderschöne Rechtechspannung. Wenn man dann noch in der Intrrupt-Service-Routine einen Zähler mitlaufen lässt, kann man den Timer auch noch für andere Sachen benutzen...
Könnte das z.B. so aussehen? Ich glaube nämlich, das wäre zu langsam... (bin ja noch Newbie) ;-) int main(void) { // Timer initialisieren TCCR0 |= (1<<CS00)|(1<<CS02); // MainLoop while(1) { // Timer und MS aktualisieren if( TCNT0 > SOME_COOL_VALUE ) // Jetzt bitte LED umschalten { SwitchLED(); TCNT0 = 0; }//end if }//end while }//end main
Hallo Ich habe sowas ähnliches kürzlich gebastelt: http://www.thinkcool.ch/index.php?content=cgen;id=14;team=technik Allerdings verwende ich nur handelsübliche IR-Dioden + Fototransistoren. Die Modulation schaut ebenfalls etwas anders aus. (Grob gesagt alle paar hunderstel Sekunden einige Millisekunden gepulstes IR-Licht.) Gruss Michael
Welchen Controller willst du benutzen? Den antiquierten AT90S8515? Ich würde den Mega16 vorschlagen. Der ist aktueller und hat auch das "lustige Zubehör" ("Features"), mit dem der Timer sich um alles allein kümmert...
Von Sharp gibt es so etwas als fertigen Baustein: IS 471 F-SH Der hat direkt einen Modulator und Demodulator sowie Sende- und Empfangsdiode eingebaut. Sprich: man muß nur noch das Digitale Ausgangssignal auswerten. (Gibt es z.B. beim großen C) Markus_8051
"Welchen Controller willst du benutzen? Den antiquierten AT90S8515?" Ja leider :-( Ist der etwa ungeeignet???
Nö, ungeeignet nicht, nur manche sind wohl der Meinung, es muss immer das Neueste sein. Nur wenn daraus eine Serienfertigung wird, sollte man einen aktuellen Controller nehmen, da der 90S8515 nicht mehr gefertigt wird. Aber für ein Einzelstück oder Experiment spielt das keine Rolle. Gruss Jadeclaw.
Okay :-) Ist denn mein Sourcecode so weit OK? Oder macht man das besser anders?
@Jadeclaw: Es geht (mir) nicht nur darum, dass man in der Serienfertigung aktuelle Bausteine verwendet, sondern in diesem Fall auch darum, dass bspw. der Mega16 nette Timer-Features hat, die der 90S8515 noch nicht vorweisen kann. Warum sich das Leben mit "mature"-Produkten unnötig schwer machen, wenn man es auch einfacher haben kann? Natürlich spricht nichts dagegen, den "antiquierten" Chip zu verwenden, bloß im Falle, dass man einen neuen Controller (aus welchen Gründen auch immer [Tod eingeschlossen]) beschaffen muß, sollte man sich nicht zu sehr daran festklammern. @Berthold: Mit welcher Taktfrequenz willst du den Controller betreiben? Rein syntaktisch müsste dein Code funktionieren.
Naja aber nen Mega 16 ist da wohl oversized! dann doch lieber nen Tiny, die haben osgar internen Takt und man sprat sich den Ozilator :)
Das Problem ist allerdings: Wenn ich SOME_COOL_VALUE = 11 wähle, bekomme ich einen Millisekunden-Takt. Damit komme ich doch dann niemals auf 56 kHz, oder?
Der Controller wird mir einem höheren Takt (Systemtakt) betrieben. Dass du 56kHz "versenden" willst, war mir schon klar. Aus dem Systemtakt berechnen sich dann die Vergleichswerte etc.
Also, dann erläutere ich mal kurz, wie ich mir das vorstelle, und ihr sagt mir, ob das so korrekt ist ;-) 1) Am AVR hängt ein Quarz mit 11 Mhz. D.h. der Prozesser macht etwa 11 Mega-Takte pro Sekunde. 2) Ich habe eine Main-Funktion mit einer endolos-While-Schleife darin. In dieser wird die LED abwechselnd an- und aus geschaltet. 3) Zusätzlich dazu ist eine "Sleep"-Funktion in der While-Schleife, die verhindert, dass das blinken mit den vollen 11 Megahertz durchgeführt wird (mal abgesehen davon, dass ganze wohl länger als nur ein Takt dauert) So weit alles richtig? Wenn ja ergibt sich ja das folgende Problem: Sobald ich zusätzlichen Code in die While Schleife packe (es soll ja nicht nur die LED blinken, sondern ggf. auch noch vieles anderes passieren), dauert die Ausführung der Schleife sofort ein paar Prozessortakte länger. Muss ich dann jedesmal die magische "Sleep-Konbstante" neu anpassen, dass wieder alles genau mit 56 kHz läuft? Das wäre ja grausam! :-(
Ne, natürlich nicht, dafür gibt's ja Timer. Wenn du einen Timer nimmst, dann stellst du dessen Vorteiler (Prescaler im Datenblatt) auf 1 (Keine Teilung) und das Compare-Register auf 196. Entweder hängst du deine LED dann direkt an einen Portpin, den du mit dem Timer in Hardware togglen lässt, oder du packst deinen Code zum Blinken in die Timer-Interrupt-Routine. PS: Sind das 56'000 Ein-Aus-Perioden pro Sekunde? Dann müsstest du den Compare-Wert halbieren (98).
Oh verdammt, du hast ja so Recht :-D Ich habe mir gerade darauf hin noch mal das Tutorial zum 16 Bit timer durchgelsen, und diesmal (so glaube ich) auch verstanden. Vielen Dank also für eure gedulgide Hilfe! Allerdings haben sich noch ein paar neue Fragen ergeben, die im Tutorial nicht beantwortet wurden: 1) Zum Timer-Daten-Register heißt es: "Wenn der Zähler den Wert 65535 erreicht hat, beginnt er beim nächsten Zyklus wieder bei 0." Wenn ich nun einen Wert ins Compare-Register geschrieben habe, zählt er dann immer nur bis da hin? 2) Es gibt anscheinend 3 PWM Betriebsmodi: 8-Bit, 9-Bit und 10-Bit Welcher davon ist denn der richtige? Bzw. worin unterscheiden die sich? 3) Im PWM Modus gilt laut Tutorial: "Wird beim Hochzählen der Wert im Vergleichsregister erreicht, so wird der Pin OC1 auf 0 gesetzt. Wird beim Herunterzählen der Wert im Vergleichsregister erreicht, so wird der Pin auf 1 gesetzt. " Bedeutet das also, dass ich die LED direkt an den Pin OC1 hängen kann, und dann glücklich bin? 4) Zu deiner Frage Phillipp: "PS: Sind das 56'000 Ein-Aus-Perioden pro Sekunde?" Das ist eine gute Frage ;-) Ich glaube du hast Recht, 98 wäre der richtige Wert...
Ich kann dir da leider auch nicht weiterhelfen, aber interessieren würde mich das ganze auch! Ich arbeite gerade an etwas ähnlichem, und versuche auch den 16-Bit Timer meines AVR zu verstehen :-)
zu 1: Im "normalen" Überlaufmodus (Mode 1), zählt der Timer von 0 bis 65535 und erzeugt beim Überlauf (65535->0) ein (TimerOverflow-)Interrupt. Wenn dann ein Wert im Compare-Register steht, dann wird bei Gleichheit des Zählerstandes und des Vergleichsregisters ("compare") ein Interrupt ausgelöst. Beim 90S8515 ist es sogar möglich, nicht nur einen Interrupt auszulösen, sondern auch einen Ausgangspin zu (umzu-)schalten. zu 2: Neben den drei PWM-Modi, die du angeführt hast, gibt es auch noch den CTC (Clear Timer on Compare Match). Hierbei wird der Timer bei Gleichheit auf 0 zurückgesetzt. Dadurch kann man sich eine ziemlich genaue Zeitbasis erstellen, die man auch zur Frequenzerzeugung benutzen kann... zu 3: Das gilt für den Phase-Correct-Mode. Hierbei zählt der Timer nicht nur aufwärts, sondern bei Erreichen des Maximalwertes wieder abwärts bis zur 0. Damit kann man durch Verändern des Vergleichswertes eine PWM nach dem Dual-Slope-Verfahren erzeugen. Die Auflösung wird dabei allerdings halbiert. Zu 4: wird wohl stimmen... man muß natürlich die halbe Periodendauer angeben, wenn man "manuell" den Pin togglen willl/muß. Dann habe ich gerade festgestellt, dass der 90s8515 auch ICP und CTC unterstützt. So "schlecht" ist der Controller gar nicht...Er ist bloß abgekündigt und sollte nicht mehr für Neuentwicklungen benutzt werden.
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.