Forum: Mikrocontroller und Digitale Elektronik RC5 Encoder @ 4Mhz


von Niki Hammler (Gast)


Lesenswert?

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

von Jonas Diemer (Gast)


Lesenswert?

na wie wär's denn überall mit den halben werten?

von Niki Hammler (Gast)


Lesenswert?

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

von Jonas Diemer (Gast)


Lesenswert?

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

von Thomas Fischl (Gast)


Lesenswert?

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

von Niki Hammler (Gast)


Lesenswert?

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

von Jonas Diemer (Gast)


Lesenswert?

haste dir schomma die app note von atmel durchgelesen:

http://www.avrfreaks.net/Tools/showtools.php?ToolID=89

von Thomas Fischl (Gast)


Lesenswert?

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

von Niki Hammler (Gast)


Lesenswert?

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

von Thomas Fischl (Gast)


Lesenswert?

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

von Niki Hammler (Gast)


Lesenswert?

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

von Thomas Fischl (Gast)


Lesenswert?

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

von Niki Hammler (Gast)


Lesenswert?

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