[Tiny2313] RFM12 + Medion X10 Fernbedienung

#1076658
Lesenswert?

Hallo,

mein zweites Projekt soll ein Aufwecken des PCs mittels der Medion X10 
werden.
Es soll also nur überprüft werden, ob die Power-Taste an der 
Fernbedienung gedrückt wird. Anschließend werden 2 Pins auf dem 
Mainboard kurz kurzgeschlossen und der PC startet.

Als Hardware habe ich:
Tiny2313
RFM12S Rev. 3.0
Medion X10 P/N 40009936

Ich habe mich schon durch diverse Dokumentationen gewühlt.

Laut RFM12 benötige ich das SPI-Interface mit:
nSEL, SDO, SDI und SCK

Diese konnte ich so zu meinem AVR zuordnen:

nSEL: beliebiger Port
SDO: MOSI (PB5)
SDI: MISO (PB6)
SCK: UCSK (PB7)

Soweit ich das nun durchschaut habe, habe ich nun alle Veraussetzungen, 
um auf den RFM12 zuzugreifen und ihn zu initialisieren.

Nun fehlt mir noch das Wissen (und vor allem Dokus), wie ich
1. Daten vom MC über das SPI zum RFM12 übertrage
und
2. mit welchen Befehlen ich den RFM12 steuere

Zu beiden Punkten fehlen mir im Moment die elementarsten Infos.

Die Beispielanwendung "RFM12 (Empfangen)" aus dem Pollin Datenblatt 
arbeitet anscheinend nicht nur mit dem SPI, sondern auch mit nIRQ.

Für alle Informationen bin ich dankbar!

Mit freundlichen Grüßen
Tobi
#1076662
Lesenswert?

...fraglich, ob du nicht besser den empfänger der x10 über usb versorgst 
und eine logikverknüpfung a la "rechner aus, aber empfänger empfängt 
was, also starte ich den pc" machst - sparst du dir den funkkram und 
viel arbeit.

ist doch das 433mhz ding von po**in?

Klaus.
#1076687
Lesenswert?

Klaus R. wrote:
> ...fraglich, ob du nicht besser den empfänger der x10 über usb versorgst
> und eine logikverknüpfung a la "rechner aus, aber empfänger empfängt
> was, also starte ich den pc" machst - sparst du dir den funkkram und
> viel arbeit.

Da habe ich allerdings erst recht keine Idee, wie ich das 
bewerkstelligen soll.
Denn diese Logikschaltung müsste dann zwischen USB-Empfänger und PC 
geschaltet werden?
Wenn du dazu weiterführende Ideen/Lektüren hast, wäre auch dies eine 
Idee.

> ist doch das 433mhz ding von po**in?

Richtig.


Vielen Dank für die schnelle Antwort
Tobi
Gast #1076744
Lesenswert?

Du brauchst noch eine Leitung vom DATA Ausgang zum InputCapture Eingang 
(wenn der Tiny den hat) um die Pulse/Pausen zu messen. Das RFM ist 
nämlich eigentlich für FSK (Frequenzmodulation) entworfen und mit ASK 
eigentlich unterfordert. Es geht aber trotzdem, man kann eine 
Signalschwelle einstellen und kriegt dann am Data Ausgang das Signal 
Träger/kein Träger.
Ich habe da auch mal eine Auswertung angefangen, funktioniert mit Mega32 
und nutzt den ICP Eingang. In der InputCapture ISR wird das Signal 
ausgemessen. Ich hänge den Code mal dran, ist aber 'as is' und weitere 
Auswertungen sind selbst zu bauen. Der Code ist etwas umfangreicher und 
beinhaltet noch eine .NET Applikation für Windows um einige 
Einstellungen am RFM online vornehmen zu können.
Angehängte Dateien:
Gast #1076750
Lesenswert?

@Tobi: da auf 433Mhz immer etwas los ist wird der PC bei so einer 
einfachen Lösung wohl ständig eingeschaltet werden, halte für keine gute 
Idee. Ich würde nur statt des Tiny einen Mega8 nehmen das man den 
wenigstens ordentlich in C programmieren kann.
#1076782
Lesenswert?

JojoS wrote:
> @Tobi: da auf 433Mhz immer etwas los ist wird der PC bei so einer
> einfachen Lösung wohl ständig eingeschaltet werden, halte für keine gute
> Idee.

Wenn man das aber an den Tastencode des Power-Buttons bindet, sollte es 
klappen, oder ist die "Streustrahlung" so groß, dass auch dieser Code 
durch Zufall erreicht wird?

>Ich würde nur statt des Tiny einen Mega8 nehmen das man den
> wenigstens ordentlich in C programmieren kann.

Den Tiny kann man doch auch gut in C programmieren.
Zumindest hatte ich bei meinem letzten Projekt keine Probleme und würde 
nur sehr ungern auf den Mega8 umsteigen, da soweit ich weiß, mein Board 
den nicht unterstützt.

Tobi
Gast #1076830
Lesenswert?

Wenn man den Code richtig auswertet wird der Empfang schon recht sicher, 
zumal der Code auch min. 3x nacheinander gesendet wird. Das bezog sich 
mehr auf den Vorschlag von Klaus den USB Empfänger irgendwie mit Logik 
anzuzapfen.
Der Tiny hat auch einen ICP habe ich im Datenblatt gesehen, von daher 
wird das auch mit der ISR aus meinem Code gehen. Mit C-Code ist der Tiny 
nur schnell voll, aber für diese Anwendung wird es reichen.
#1077157
Lesenswert?

Hi  JojoS,
erstmal vielen Dank für den Code.

Ich versuche gerade durchzusteigen.

In der Endlosschleife von main.c:

                        DispatchMessage();
                        ClearMessage();

sendet Daten entweder an RFM oder SFR oder 1. (was ist das)

Den zweiten Teil mit den TimeStamps verstehe ich gar nicht.
Was ist da der Zweck?

Wenn ich mich mal auf mein Vorhaben konzentriere:

Mit rf12_rxdata kann man Daten empfangen?
In der rf12.c muss ich die #define(s) ändern:

Wenn SDI bei mir an PB6 liegt, dann sollte es so aussehen:
#define RF_PORT PORTB
#define SDI             6

Denn: sbi(RF_PORT, SDI); welches dann quasi: sbi(PORTB6) entspricht.

Nun ist die Frage, was es mit RF_PIN und RF_DDR auf sich hat.

Wäre super, wenn Du mir dabei etwas auf die Sprünge helfen könntest :)

Vielen Dank

Tobi
Gast #1077199
Lesenswert?

Die Messages kommen seriell rein von der .Net App, darüber wird eben ein 
Register im RFM gesetzt oder ein beliebiges SFR im Prozessor, habe ich 
nur als Testausgabe auf PortC vom STK500 verwendet. Und eine Message 
startet den Bootloader um ein neues Programm über die serielle 
reinzuschieben. Das brauchst du nicht, nur die richtige Init Sequenz für 
das RFM Modul, die müsste im main noch passen. Und eben die ISR.
rf12_rxdata empfängt Daten, aber nur wenn man das mit Fifo verwendet. 
Und das geht eben nicht bei ASK, siehe mein erstes Posting. Also den ICP 
Pin am Tiny verwenden und Interrupt Routine aus 'decoder.c'. Wenn etwas 
passendes empfangen wurde steht das in BitCode drin, die Timestamps 
hatte ich zum Ausmessen des Signals mitgeschrieben, kann man auch 
weglassen.
#1082168
Lesenswert?

Hi,
ich habe mich erstmal um eine Verbindung vom MC zum PC über RS232 
gekümmert, damit ich Statusangaben, bzw. den BitCode auf dem Rechner 
angezeigt bekommen kann.

Nun sitze ich wieder vor deinem Code.

> Das brauchst du nicht, nur die richtige Init Sequenz für
> das RFM Modul, die müsste im main noch passen. Und eben die ISR.

RFM initialisieren und dann ISR aufrufen.


> Also den ICP Pin am Tiny verwenden und Interrupt Routine aus 'decoder.c'. > Wenn 
etwas passendes empfangen wurde steht das in BitCode drin.

Den ICP Pin am Tiny habe ich gefunden, aber leider weiß ich nicht, an 
welchen Pin beim RFM12 ich ihn anschließen muss.
Im Internet habe ich auch nichts gefunden. Dort gab es ein AVR Funkmodul 
Board, aber auch dort wurde PD6(ICP) nicht verwendet.


So wie ich dich nun verstehe, müsste ich anschließend den BitCode auf 
den Rechner übertragen.
Dort bekomme ich dann den Tastencode der jeweiligen Tasten an der 
Fernbedienung.
Mit dem Code kann ich dann abhängige Ereignisse basteln.

Vielen Dank

Tobi
#1082205
Lesenswert?

Nochmal: PC Status auswerten, also ob an oder aus (12V zB). Dann per 
5Vsb USB Spg (die ist immer da) den Funkempfänger versorgen, in diesem 
den empf Datenstrom abzapfen. Vergleich auf den Code des Powerbuttons, 
Atmel schaltet PC ein. Du sparst zusätzl. Funkstrecke, kompl. Einbau in 
FB.

Logik: Wenn Rechner aus & Datenstrom des X10 Empfängers = Tastendruck 
"ON" an der FB -> schalte Rechner über Optokoppler ein.

Wo ist das Problem? Gelten lasse ich allenfalls die 5Vsb USB, aber Saft 
brauchst du ja EH.

BTW: Bist du mit der FB ansonsten zufrieden? Hab sie auch gestern mal 
bestellt...

Klaus.
#1082234
Lesenswert?

Hi Klaus,

Problem gibt es dabei nur aufgrund meiner mangelnden Erfahrung.
Denn mit USB kenne ich mich nicht aus.
Ich müsste Pin 2+3 an den MC anschcließen und auswerten.

Leider weiß ich, zum Beispiel, nicht, wie ich Softwaremäßig alle Daten 
vom Pin2 über USART an meinen Rechner übetragen kann.

Ansonsten ist deine Idee natürlich sehr gut.

Ich denke es gibt viele Wege, die zum Ziel führen.
Warum ich mich erstmal für den Weg mit dem RFM12 entschieden habe, war 
folgender Gedanke:
Evtl. möchte ich später mit der Fernbedienung auch meine Boxen steuern.
Damit bräuchte ich dann einen "Funkempfänger" der auch bei 
angeschaltetem PC geht.

Parallel werde ich mich aber auch mit deiner Idee befassen.

Danke!
Tobi
#1082255
Lesenswert?

....ne, nix usb - ich meinte schon, den x10 empfänger zu öffnen und den 
datenstrom mit nem oszi und genauem hinschauen zu finden :)

das mit den boxen hab ich nicht so ganz kapiert, auch nicht, wofür man 
die usart des uC braucht - aber gut :)

deine lösung macht natürlich sinn, wenn du 2 unabhängige empfänger mit 
der selben FB steuern willst (boxen).

@x10: gut, dann freu ich mich mal, dass ich in meiner verwinkelten 
altbauwohnung bald quer durch alle räume die mussik umschalten kann (ir 
geht nicht mehr...)

Klaus.
#1082359
Lesenswert?

Mein späteres Vorhaben soll so aussehen:

Mikrocontroller ist an PC und Boxen angeschlossen.
Die Boxen haben im Moment noch eine manuelle Lautstärkesteuerung, das 
heißt, ich muss immer hinlaufen.
Diese ersetze ich durch den MC.

Somit kann ich dann mit der FB den Pc anschalten (wenn Power gedrückt 
wird), und mit Vol+ und Vol- die Lautstärke der Boxen regeln.

Dementsprechend brauche ich doch einen eigenständigen Funkempfänger, 
denn bei deiner Idee mit dem X10 Empfänger geht dieser doch nicht mehr, 
wenn der Rechner an ist, denn das Signal geht dann per USB zum PC?

Oder habe ich da deine Idee noch nicht richtig verstanden.

Tobi
#1082364
Lesenswert?

...hast du nicht :)

also, nochmal: mag sein, dass wir aneinander vorbei reden - ICH würde 
den datenstrom anzapfen, den der x10 empfänger INTERN bietet, also nicht 
usb. die FB und der empf funktionieren ja normal weiter, nur würde ich 
den datenstrom so auswerten, dass ein uC zusatzaufgaben wie zB rechner 
an/aus und box laut/leise übernimmt. mit der genannten logik verbaut man 
sich ja NICHT auch die mgl, die boxen zu setuern - das ist ja alles nur 
software im UC

FB -> X10empf -> USB (ganz normal)
         '-> Datenstrom anzapfen -> uC -> Boxen / Rechner I/O

AUSSER, du willst zu den Boxen AUCH eine Funkverbindung - dann würde ich 
aber immer noch nicht den Umweg über RFM12 gehen, sondern einen weiteren 
Empfänger "besorgen", um die FB direkt auszuwerten (du brauchts ja NUR 
den anlogen teil, der die 433MHz empf, den rest macht dein EIGENER uC)

Klaus.
#1082400
Lesenswert?

Habe mir auch schon überlegt die FB zu kaufen und sie so wie Klaus 
geschrieben hat zu verwenden. Leider war ich mir nicht sicher, ob da nur 
ein USB mit integrierten µC im Empfänger verwendet wird.

Wie sieht denn der Empfänger aus? Könnt ihr da vielleicht mal ein Bild 
zur Verfügung stellen?

Gruß
  Manuel
Gast #1082466
Lesenswert?

Es gibt aber anscheinend mehrere unterschiedliche Empfängervarianten.

Meiner (bei Pollin bestellt) wird über Kabel mit dem PC verbunden. Bei 
dem hat die Platine auf beiden Seiten verlöteten Abdeckungen.

Im Netz habe ich Photos vom Vorgänger gefunden, bei dem die Platine 
größer  und nur teilweise geschirmt ist. Mit diesen Empfängern gab es 
anscheinend teilweise Empfangsprobleme (die sich durch Neuabstimmung 
beheben ließen).

Gibt es eigentlich irgendwo im Netz eine Codeliste für diese 
Fernbedienung?
#1082523
Lesenswert?

So. Was ich getan habe:

1) 5+ und GND des USB Empfänger mit meinem Entwicklungsboard verbunden
2) Pin 8 des Empfängers an einen PD2 angeschlossen
1
        DDRD=0x00;
2
        PORTD=0x00;
3
        bPortD = PIND;
4
while(1)
5
        {
6
USART_transmit_str(PIND);
7
        }

Dann kommen kryptische Zeichen:
..3&x.H(.ÿ .@P.$. Dþhu.þ ..þ!   ..3&x.H(.ÿ .@P.$. Dþhu.þ ..þ! 
..3&x.H(.ÿ .@P.$. Dþhu.þ ..þ!

Dies ist unabhängig davon, ob PD2 angeschlossen ist.

Gleichzeitig geht ein Test am Taster PD5, der "Test" ausgibt ohne 
Probleme.
Somit sollten Fehler in der Baudrate etc. ausgeschlossen sein.

Tobi
#1082532
Lesenswert?

...str != PIND -> Problematik mit Pointern etc?

Mach nen ordentlichen Umweg über ne Variable und gib die als 1 oder 0 
aus.

Prinzipiell aber genau der richtige Ansatz. Power & Lautstärke +/- 
"samplen", in den Code einbauen, vergleichen und dann Aktionen (zB 
digitalpoti) auslösen, fertig.

Klaus.
#1082555
Lesenswert?

[c]
        DDRD=0x00;
        PORTD=0x00;
        bPortD = PIND
        while(1)
        {

                if (debounce(&PIND, PD5))             // Falls Taster an 
PIN PD5 gedrueckt..
                {
                        USART_transmit_str("Test");

                }
//      USART_transmit_str(PIND);

        USART_transmit_str(bPortD);
         }

Das hilft auch nichts:

.þ.[.þ.[.þ.[.þ.[.þ.[.þ.[.þ.[.þ.[.þ.[.þ.[.þ.[.þ.[.þ.[.þ.[.þ.[.þ.[.þ.[.þ.[ 
.þ.

Sowas habe ich schon gesehen, als die Baudrate nicht gestimmt hat.
Evtl übertrage ich es so schnell, dass nicht der richtig ASCII Code 
übertragen wird, sondern nur Bruchstücke, die dann obiges Bild ergeben?

Tobi
Gast #1083458
Lesenswert?

>Den ICP Pin am Tiny habe ich gefunden, aber leider weiß ich nicht, an
>welchen Pin beim RFM12 ich ihn anschließen muss.
>Im Internet habe ich auch nichts gefunden. Dort gab es ein AVR Funkmodul
>Board, aber auch dort wurde PD6(ICP) nicht verwendet.

steht in meiner ersten Antwort hier, ICP muss an DATA (ist ein 
programmierbarer Pin und heisst in der RFM12 Doku genauer 
FSK/DATA/nFFS). In den verschiedenen Projekten hier wird der nicht 
benutzt weil das für FSK Übertragungen eben nicht nötig ist, aber das 
erkläre ich jetzt nicht nochmal.
#1083746
Lesenswert?

Hallo,

so ich habe deinen Code für den Tiny2313 angepasst.

Das Einzige, was ich geändert habe, ist Folgendes:

//      TIMSK |= _BV(TICIE1); // | _BV(OCIE1A); // von dir
        TIMSK |= _BV(ICIE1); // | _BV(OCIE1A);  // von mir

Beidesmal sollte aber ein Input Capture interrupt entstehen.

Hier ist die main.c: http://rafb.net/p/pZVQ1V26.html
Nun will er leider nichts anzeigen.
Der BitCode scheint also leer zu sein.

Was ist da falsch?

Kann ich irgendwie "schrittweise" herausfinden, ob der RFM12 überhaupt 
angesteuert wird?


Vielen Dank
Tobi
Gast #1083768
Lesenswert?

am DATA Ausgang muss das Signal von der FB zu sehen (Oszi, Soundkarte) 
oder zu hören sein (über einen paar k Widerstand einen Ohrhöhrer oder 
Soundkarte dranhängen).
Und die Initialisierung aktiviert auch den 10Mhz Takt am Clockausgang 
vom RFM12. Den Mega32 hatte ich mit 12Mhz laufen, die Konstanten in der 
ISR sind fest dafür ausgelegt. Könnte man natürlich auch schöner 
lösen...
#1083786
Lesenswert?

EDIT:

Nachdem ich nun die richtigen Ports auch in der rfm12.c eingetragen 
habe, bekomme ich bei einem Tastendruck: 
................................

Daraufhin habe ich itoa verwendet, um dies zu bekommen:
ö..ö..ö..ö..ö..ö..ö..ö..ö..ö..ö..ö..ö..ö..ö..ö..ö..ö..ö..ö..ö..ö..ö..ö.. 
ö.-33-33-65-65-129-129-257-257-513-513.-1025-1025-2049
-2049-4097-4097-8193-8193-16385-163853276732767-1-1-1-1-1.-1-1-1-2-2-3-3 
-5-5-9-9-17-17-33-33-65-65-65-65-65-65-65-65-65-65-65-65-65-65þ.T_Ã-65-6 
5-130-130-259-
259-517-517-1033-1033-2065-2065-4129-4129-8257-8257-16513-16513325113251 
1-513-513-1025-1025-2049-2049-4097-4097-8193-8193-16385-163853276732767- 
1-1-1-1-1-1-1-1-
1-1-1-1-1*-1-1-1-1-1-2-2-3-3-5-5-10-10-19-19-37-37-73-73-145-145-289-289 
-577-577-1153-1153-2305-2305-4609-4609-9217-9217-18433-184332867128671-8 
193-8193-16385-
163853276732767-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-2-2-3-3-5-5-9-9-17-1 
7-33-33-65-65-129-129-257-257-513-513-1025-1025-2049-2049-4097-4097-8193 
-8193-16385-1638
53276732767-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1. 
á-1-1-1-1-1-1-1-1-2-2-3-3-5-5-9-9-17-17-33-33-65-65-129-129-257-257-513- 
513-1025-1025-2
049-2049-4097-4097-8193-8193-16385-163853276732767-1-1-1-1-1-1-2-2-3-3-5 
-5-9-9-17-17-33-33-65-65-129-129-257-257-513-513-1025-1025-2049-2049-409 
7-4097-8193-8193
-16385-163853276732767-1-1-1-1-1-1-1-1-1-2-2-3-3-5-5-9-9-17-17-33-33-65- 
65-129-129-257-257-513-513-1025-1025-2049-2049-4097-4097-8193-8193-16385 
-163853276732767
-1Á-1-1-2-2-3-3-6-6-11-11-21-21-41-41-81-81-161-161-321-321-641-641-1281 
-1281-2561-2561-5121-5121-10241-10241-20481-204812457524575-16385-163853 
2767-1-1-1-1-1-1
-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-2-2-4-4-7-7-13-13-25-25-49-49-97-97 
-193-193-385-385-769-769-1537-1537-3073-3073-6145-6145-12289-12289-24577 
-245771638316383
3276732767-1-1-1-1-1-1-1-1-2-2-4-4-7-7-13-13-25-25-49-49-97.============ 
======================================================================== 
================
======================================================================== 
======================================================================== 
================
======================================================================== 
======================================================================== 
================
======================================================================== 
======================================================================== 
================
======================================================================== 
=========================================================-97-193-193-385 
-385-769-769-153
7-1537-3073-3073-6145-6145-12289-12289-24577-2457716383163833276732767-1 
-1-1-1-1-1==-1-1-2-2-3-3-5-5-9-9-17-17-3


Was sagen mir die nun?

Zwischenzeitlich war ich der Meinung, dass 4097 der Code von der 
PowerTaste ist, aber dann kam das große Chaos, indem ich keine Ordung 
entdecken konnte.

Danke
Tobi
Gast #1233592
Lesenswert?

@Tobias Kaminsky: Hattest du Erfolg mit der X10 und dem RFM12 Modul?

Ich plane in etwa das selbe, habe die Hardware bereits aufgebaut 
(Atmega32, Computer hängt an nem Relais, RFM12 ist dran) und getestet. 
Ich müsste nur noch die Empfangssoftware für die X10 Bedienung 
schreiben, naja und bin dann über diesen Thread gestolpert.

Bin über alle Erfahrungsberichte und gerne auch C Beispielcode dankbar.

gruß,
david

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren