Gast
#3819767
Hallo liebe Comiunnity ich habe es nach langem hin und her geschafft das RC5-Protokoll zu implementieren. Daher bin ich sehr stolz auf mich, da meiner programmier erfahrungen rudimentär sind. Ich bin zurzeit mit der Entwicklung von Schwarmrobotern beschäftigt. 20 sind es bisher, vielecht kommen noch mehr dazu, ist aber eine Kostenfrage. Diese sollten über eine simple Schnittstelle untereinander kommunizieren können und natürlich auch über eine Fernbedienung angesprochen und gesteuert werden. In meinem Fall ist es über IR mittels RC5-Protokoll. (Ich weiss man könnte für diese paar wenigen befehle auch eine ganz simples Protokoll realisieren. Aber ich möchte programmier Erfahrungen sammeln und dazu habe ich eben das RC5-Protokoll auserwählt da es simpel und im Netz gut dokumentiert ist.) Demnach habe ich mir gedacht, dass, ich es mir zur Aufgabe mache, das RC5-Protokoll zu implementieren. Da es für mich eine große Herausforderung ist habe ich mich sehr intensiv mit der Materie auseinandergesetzt daher auch oft herausgefunden, wie es nicht geht. :-) Somit komme ich zu meinem Schaltungsaufbau. Ich habe eine Roboter Leiterplatte entworfen und herstellen lassen. Darauf sind verschiedenste Bauteile angebracht sind aber für diesen Fall, nicht alle relevant,sofern beschränke ich mich hier auf das wesentliche. Atmel Studio 6 (Version: 6.2.1153) Als Prozessor verwende ich den ATmega328p von Atmel der mit 3V / 8 MHz gespeist wird. Die Leiterplatten sind jeweils mit einer Ir LED und einem Ir Empfänger (TSOP 34836) ausgestattet. Zu Testzwecken sende ich nacheinander verschiedene RC5 Frames um die RGB LED auf der Leiterplatte anzusteuern. Also habe ich mit der Implementierung des Senders angefangen und nach langen Recherchen ist es mir gelungen das Signal zu generieren und auszugeben. Habe danach auch mit einem Oszilloskop das Ausgangssignal betrachtet und sehe da, es läuft(zugegeben mit ein paar Macken zu Anfang). Mein Programm generiert zuerst den binären RC5-Code danach werden die bits mit 36 kHz Aufmodulation und mittels Manchestercode per IR LED übertragen. Die Codierung des Signals erwies sich wesentlich einfacher als die Decodierung. Wusste Eifach nicht wie anfangen. Wusste ungefähr in welcher Richtung konnte aber keinen Ansatz finden. Aber wer gewillt ist gibt nicht auf. Per zufall und das ist auch meine Rettung, habe ich eine gutes Skript zur RC5 Implementierung gefunden. Diese ist für ein Arm-Prozessor gedacht aber man kann es genauso gut auch auf ein avr-Prozessor portieren. (RC5 Dokument) Das habe ich nun gemacht (bzw. versucht) nach dem ersten Versuch habe ich relativ schnell gemerkt das ich an der falschen Stelle im Skript gelesen habe und daher ein völlig falsche Implementierung zustande kam. Danach habe ich die für mich relevante Stelle im Skript lokalisiert und Draufan mit dem programmieren losgelegt. Meiner Meinung nach sich ein paar Details nicht so wie es sein sollte.. bin aber auch kein Experte in der Sache. Da ich das Mainboard des Roboter selbst entwickelt habe und auf diesem keine Schnittstelle zur Datenübertragung auf den Computer realisier ist, ist es sehr schwierig die Variablenwerte auszugeben und zu überprüfen. Ich möchten euch jetzt eigentlich fragen was ihr zu meiner Arbeit denkt? Natürlich auch ob ihr mir bei den einen oder anderen dingen auf die Sprünge helfen könntet den ich stehe zurzeit ziemlich auf dem Schlauch. In der angehängten Datei sind alle meine Daten zu finden. In meinen Codes ist in den Kommentaren gut beschrieben, was da gerade gemacht wird und wieso. Mein erstes Problemchen: Beim Code des Senders ist eigentlich meiner Meinung nach alles gut(zumindest läuft es). Nur die compare match Frequenz stimmt irgendwie nicht ganz die, sollte ca. 36kHz sein. OCR0A = (Fclk / (2 1 Focr)) - 1 = ~110 den somit vergehen x(TIMER0_COMPA_vect) um ein halbes bit zu übertragen. x = (889 us / (1/36000kHz)) * 2 = ~64 oder liege ich da falsch? Aber irgendwie ist die Dauer eines halben bits länger als 899 us so um die 1 ms laut Oszilloskop. Siehe bild (fieldbit 0 zoom) Ich weis nicht, woher das kommt. Sieht vielleicht jemand von euch etwas? Zu meinem zweiten Problemchen: da die halb bit zeit in der Toleranz zeit des Empfängers ist geht auch das entfangen so halbe. Aber nur beim ersten empfangen und danach stimmt alles irgendwie nicht mehr und hier komme ich auch nicht wirklich weiter den ich denke das ich die nötige Variablen zurückgesetzt habe um das nächste Signal auszulesen das geht aber nicht. Schlussendlich will ich eine Simplex Datenübertragung realisieren.mit der dann die einzelnen Roboter untereinander Komunizieren können. Ich habe mir bereits einige Gedanken gemacht, wie die Kommunikation ablaufen sollte. Dies ist aber im Moment noch nicht allzu wichtig.