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
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