Abend, Hat wer den RC5 Encoder von http://bray.velenje.cx/avr/rc5/rc5.html mit 4 Mhz zum Laufen gebracht?? Der Typ sagte mir, sein uC lief mit 8Mhz ich hab aber einen mit 4 Mhz und da die ganzen Zahlen überhaupt nicht mit denen des RC5 Protokolls übereinstimmen weiss ich jetzt nicht was ich in die Timer Register reinschreiben soll. Ich schätze es liegt an den Timings, dass das Encoden nicht geht. Also falls wer Code für 4Mhz prozessoren in C hat, bitte melden Danke, Niki
Hi, 1.) Wenn schon mit doppelten oder? 2.) Nein, hab grad gemerkt dass das gar nicht geht, weil alles TIMER Angaben sind und in Mikrosekunden in die Register geschrieben werden. Das müsste doch unabhängig von der Taktfrequenz sein oder? 3.) HIIEEELFE ich kapier den Code nicht, der weicht so vom RC5 Standard ab!! Wieso sammelt der 24 Bit und nicht 14? Was ist ein "biphase error" und wieso kommt er dann wenn 2 Bits hintereinander gleich sind? Wieso kommt da ein Statement "if(data & 0x01)"? Ok, ich kapier den Code überhaupt nicht und er funktionier auch leider überhaupt nicht obwohl ich jetzt draufgekommen bin, dass alle Timer Zeiten stimmen sollten. KENNT JEMAND EINEN RC5 DECODER IN C DER FUNKTIONIERT???? Er sollte auf INT0 reagieren und auf einem AT90S2333 @ 4Mhz laufen. Thanks in advance Niki
also wie's in c is, weiß ich nicht genau. in assembler müsste man die hälfte beim prescaler nehmen. so dachte ich das... gibt es nicht mehrere rc5 encoder???
Hallo! Ein Timer, der einen Interrupt auslöst, funktioniert in etwa so: Im Takt vom Prozessor wird ein Zähler erhöht. Läuft dieser Zähler über, wird ein Interrupt ausgelöst. Wenn das Inkrementieren genau mit dem Prozessortakt übereinstimmt, ist der Prescaler auf Faktor 1 (CLK/1) eingestellt. Entsprechend kann man den Prescaler z.B. auf Faktor 8 setzen, so dass nur bei jedem 8. Takt der Zähler erhöht wird. Der größte Prescale-Faktor ist 1024. Was noch alles dazwischen liegt, weiß ich jetzt nicht, aber im Datenblatt des AVRs ist das zu finden. Also wenn du z.B. den Prescaler auf 1024 setzt, und TCNT0 (also den Zähler) auf 250, kann der Zähler 5x (oder sind es 6x?) erhöht werden, bis er überläuft. D.h. nach 5x1024 Takten wird der Interrupt ausgelöst. Da die Prozessorfrequenz bekannt ist, kann man auch relativ einfach die Zeit dafür berechnen. Vielleicht hilft dir das bei der Berechnung/Umrechnung... Thomas
Hallo!! Gut, dass du mir das erzählst, es ist meine allerletze Hoffnung!! Ich hab mir das RC5 Protokoll einverleibt und kann jetzt so gut wie jede Zeile und habe festgestellt nach 100fachem Nachkontrollieren und denken, es MUSS funktionieren. Tut es aber nicht. Es kommt immer ein "Biphase Error". Es MUSS am timer liegen. Doch auch der stimmt 100%ig. Der Scheiss GEHT einfach nicht GRRRRRRR. Also ich hab jetzt nachgeschaut. Es stimmt, jedoch ist der Prescaler des Programmierers auf CK/8 eingestellt. Da das in einem HEX Wert versteckt war hab ich mir nicht nähere Gedanken dazu gemacht. Ich hab ihn auf CK gestellt aber so funktionierts gar nicht. Entschuldigung dass ich das nicht ganz verstehe aber ist der Prescaler vom Prozessortakt abhängig???? D.h. muss ich ihn ändern falls ich ein Programm dass mit (genauem) Timer arbeitet auf einem anderen Prozessor mit anderem Takt verwende?? Der Autor hat seinen uC mit 8Mhz getrieben, meiner läuft mit 4Mhz. Es gibt aber keinen CK/4. Hast du eine Idee was ich da ändern könnte? Ich bin mir mittlerweile sicher dass es sich um einen Timerfehler handelt weil es scheint als ob sich das ganze "verschieben" würde und so einen Biphasefehler verursacht. Wie muss ich die Zeiten oder den Prescale ändern damit es von einem 8Mhz auf einem 4Mhz geht??? Falls es nicht geht, wo finde ich weitere RC5 Decoder für C??? Es sollte ja x geben oder?? Vielen Dank!!!! Niki
haste dir schomma die app note von atmel durchgelesen: http://www.avrfreaks.net/Tools/showtools.php?ToolID=89
Hi! Ja, der Timer ist vom Prozessortakt abhängig! OK, ich hab mir das Programm mal angesehen. Wie du schon sagtest ist der Prescaler auf CLK/8 eingestellt. D.h. der Zähler wird 8 000 000 / 8 = 1 000 000 Mal in der Sekunde erhöht - also jede 1us. In Zeile 39 wird der Zähler neu gesetzt. Und zwar auf FC87h (=64647d). D.h. ein Interrupt wird nach FFFFh + 1 - FF87h (in dezimal: 65535+1 - 64647) = 889 => Interrupt wird nach 889us ausgelöst (so wie es auch dahinter steht). In Zeile 77 und 94 auf 3111us. Das sind die Werte auf einen 8MHz. Auf einen 4MHz könnte das so aussehen: Prescale auf CLK/1 => 4 000 000 mal pro Sekunde Zählererhöhung - also alle 1/4 us und damit 4x öfter als bei den obigen Einstellungen. 889 * 4 = 3556 65536 - 3556 = 61980 in Hex: F21C Für den Zähler heißt das: TCNT1H = 0xF2 und TCNT1L = 0x1C 3111 * 4 = 12444 65536 - 12444 = 53092 in Hex: CF64 Für den Zähler heißt das: TCNT1H = 0xCF und TCNT1L = 0x64 cu, Thomas
Hallo. Danke, danke, hab ich...von dort hab ich ja auch mein "Wissen" über das RC5 Protokoll. Stolz mag ich jetzt verkünden: Es funktioniert!! Echt toll, danke für den Tipp mit dem Prescaler! Damit bin ich überhaupt auf die Idee gekommen! Ich hab einfach nur die 2 Timerwerte durch 2 dividiert und den Prescale gleichgelassen. Es scheint jetzt allenernstes zu funktionieren! Ein Druck auf eine Taste auf der Fernbedienung und mein Licht geht aus/an. Nettes Spielzeug ;)) Nur ein "Problem" gibts dabei noch: Die Empfangsqualität. Ich verwende zwar nur einen mit 36khz Trägerfrequenz, obwohl RC5 mit 38khz läuft, soweit ich weiss, jedoch läuft es auf dem PC auch. Und zwar muss ich fast gerade auf den Empfänger zielen um ein Signal erfolgreich empfangen zu können. Bei meinem selbstgebauten "lirc" Receiver für den PC, der den gleichen SFH5110-36 verwendet, kann ich allerdings nach allen Richtungen im Zimmer zielen und er empfängt trotzdem noch. Es geht sogar noch ausserhalb des Zimmers. Das heisst, die Empfangsqualität hier auf dem AVR ist verdammt schlecht. Ich hab den Receiver nur über einen Pullup von 10kOhm gegen VCC an den uC angeschlossen. Kann es daran liegen, dass ich keinen Glättungskondensator und sonstiges Zeugs verwende? THX Niki PS: Weil ich grad' dran denke. Kann ich für extrem kurze Strecken (so 1-10cm) GANZ normalen, eindrahtigen Schaltungsdraht verwenden und das für 220Volt AC ~ 200mA?? Auch wenn u.U. STÄNDIG Strom fliesst? Den TRIAC/Optokopplerabteil hab ich nämlich mit solchen normalen Drähten verbunden und das soll die Schaltung für die Zimmerlampe werden. Und ich hab nicht Lust, dass so ein Draht das Haus abfackelt...
Hi! Schön, dass es jetzt klappt! Hmm... stimmt! Den Prescaler kann man auch gleich lassen, wenn die anderen Werte entsprechend angepasst werden können. Nur interessehalber: wie sehen die Werte für TCNT1H/L nun aus? cu, Thomas
Also wenn INT0 getriggert wird, wird 0xF9 in TCNT1H und 0xED in TCNT1L eingertagen. Das sind genau 3111/2us, weil ich einen genau doppelt so langsamen Prozessor hab. Das Intervall ist deshalb so gross, da die ersten 2 Startbits übersprungen werden. Dann wird bei einem Timertrigger eingestellt: 0xFE für TCNT1H und 0x44 für TCNT1L Das ist umgerechnet genau 889/2us. Der Timerinterrupt wird alle 1/2 Bits aufgerufen, um Biphasenfehler zu erkennen und bei jedem zweiten Durchlauf wird das Bit dann auch tatsächlich aufgezeichnet. Niki
Bezüglich Pull-up: Könnte man da nicht einfach den internen Pull-up des AVR nehmen? Du hast ja jetzt dann 444*4 = 1776 us pro Bit. Was ist da eigentlich der RC5-Standard? 1,8ms? Der Unterschied ist sicher nicht sehr groß, aber summiert sich vielleicht der Fehler durch mehrmaliges Aufrufen so, dass schwächere Signale nicht richtig erkannt werden können? cu, Thomas
Guten Abend, 1.) Hmm, weiss nicht, kenn mich da leider nicht aus. Es hat jedenfalls nicht ganz ohne Widerstand funktioniert. Bei meinem "lirc" Schaltkreis für den PC sind allerdings 5kOhm und nicht 10kOhm Pullup. Soll ich jetzt einen Widerstand nehmen und wenn ja welchen? Hat dieser etwas mit der Empfangsqualität zu tun? 2.) Verdammt, ich hab mir jetzt den Schaltkreis für den PC angeschaut, da sind genau 2 Kondensatoren oben, aber natürlich nicht für das Datensignal sondern nur für eine saubere Eingangsspannung. Also An einem Kondensator kann es auch nicht liegen. 3.) Ich habe die Infos von http://bray.velenje.cx/avr/rc5/rc5.html. Ich hab auch das Datenblatt von AVR direkt gelesen, aber ich traue eher den ungerundeten Werten obwohl ich nicht weiss welche jetzt korrekt sind. (??) 4.) Ich hab an den Output Pin des SFH5110 das Oscilloskop drangeklammert. Jetzt kann ich beim Drücken einer Taste genau feststellen ob jetzt die Aktion geht wie ich will und ob über das Osci ein Strich saust. Ganz so gut wie am PC geht es nicht, also rückwärts ins Zimmer kann ich nicht die Fernbedienung halten. Beim PC geht das aber (gleicher Empfänger!). Scheint also doch ein wenig an der Hardware zu liegen (?). Vielleicht passt der Pullup Widerstand doch nicht so ganz? Um wirklich eine Aktion ausführen zu können muss ich allerdings die Fernbedienung ganz gerade vor dem Empfänger halten. Also SEHR unbefriedigend. Auf dem Osci sind die Striche jedoch schon sichtbar wenn die Richtung ein wenig abweicht. Aber wie gesagt, so gut wie beim PC ist es lange noch nicht. Was ist da los?? cu Niki
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.