FS20 Empfangsmodul auszulesen

Guten Tag,

ich habe in einem aktuellen Projekt vor, das Empfangssignal eines FS20 Empfangsmodul mit dem Arduino Duemilanove auszulesen.

elv.de/868-MHz-Empfangsmodul-RX868-3V/x.aspx/cid_74/detail_10/detail2_12822

Das FS20 Protokoll ist ja folgendermassen aufgebaut: fhz4linux.info/tiki-index.php?page=FS20+Protocol

Daher haben die übertragenden 1 eine andere Impulsdauer wie die 0. Da über das Empfangsmodul auch jede Menge Rauschen übertragen wird, muss ich diese Impulsdauern messen. Jetzt zu meiner Idee:

Ich wollte durch externe Interrupts an PIN2 eine Unterscheidung zwischen Rissing und Falling machen. Nachdem das Interrupt aktiviert wurde, wollte ich mit der Funktion "micros()" und dem vorherigen Zeitpunkt die Impulsdauer für eine logische 0 oder 1 messen, um zwischen Rauschen und wirklichen Daten zu unterscheiden. Jedoch funktioniert das nicht so wie gefacht. Habe ich einen Denkfehler?

Schau doch mal in folgende Links:

http://talk.jeelabs.net/topic/35 http://www.ip-symcon.de/forum/f19/fs20-steuerung-per-uc-atmega-8388/

Vielleicht hilft Dir das weiter.

Danke erst mal, aber ich verstehe halt nicht so recht, worin mein Fehler liegt!? Ich bin noch ein Neuling mit dem Arduino Duemilanove Board.
Also das Empfangsmodul liefert mir die entsprechenden Daten die ich über PIN 2 mittels externen Interrups auslese:
Hier ein kleines Beispiel, wo das Interrupt beim Flankenwechsel aktiv sein soll:

volatile byte irq_flag = 0;
int sensorValue = 0;
unsigned int time_old = 0;
unsigned int time_new = 0;
unsigned int time_dif = 0;

void setup() {
Serial.begin(9600);
pinMode(2, INPUT);
attachInterrupt(0, function, CHANGE);

}

void loop(void) {
if(irq_flag == 1) {
sensorValue = digitalRead(2);
Serial.println(sensorValue,DEC);
time_new = micros();
if(time_new > time_old)
{
time_dif = time_new - time_old;

}
else{
time_dif = (65535 - time_old);
time_dif = time_dif + time_new;
}
Serial.println(time_dif,DEC);
irq_flag = 0;
}
}

void function(void) {
irq_flag = 1;
}

Dadurch möchte ich dann den aktuellen Pegel und die vorherige Impulsdauer berechnen und ausgeben! Jedoch müsste dort ja ein ständiger Wechsel zwischen logisch 0 und 1 vorhanden sein. Jedoch wird folgendes ausgeben:
0
448
1
8768
1
18128
1
28532
0
38928
1
49328
0
59728
0
4592
1
13952

Daher ist kein ständiger Wechsel vorhanden. Liegt es evt. daran, dass mir das Empfangsmodul keine gescheite Eingangsspannung liefert, dass der Schwellwert nicht passend ist!? oder sind die Frequenzen (fmax = ca. 2kHZ) für den externen Interrupt zu hoch?

Bevor Du Dich in Dein Programm festbeißt:

Wieso probierst Du es nicht mal mit einem Programm, was bei anderen schon erfolgreich gelaufen ist? Zumindest hättest Du dann einen Hinweis, ob es mit der Hardware stimmt. Ein Empfänger mit 3 V Versorgungsspannung könnte tatsächlich zu niedrige Pegel liefern, da würde ich den Arduino ebenfalls mal mit niedrigerer Spannung (3,3V ) versorgen.

Ein Oszilloskop würde auch wesentlich weiterhelfen. Notfalls reicht auch mal der Eingang einer Soundkarte.

Eine Interruptfrequenz von 2 kHz sollte der Arduino eigentlich verkraften können.

So ich habe einmal das Empfangsmodul ans Oszilloskop angeschlossen, dort bekomme ich einen High-Pegel von ca. 2.2V.
Wie kompliziert ist das denn den Arduino in dem 3,3V Modus zu versorgen?
Mit deinen Links habe ich mich auch schon beschäftigt, weiss aber nicht genau, auf welchen Quellcode sich das beziehen soll!?

Ist dieser damit gemeint!?
http://cafe.jeelabs.net/sketches/recv868ook.pde

Danke aber schonmal für deine Hilfe!

Ja genau die ..pde. Lies aber mal das gesamte Posting wegen diverser Einstellungen (z.b. Hauscode). Arduino auf 3,3V: Keine externe Spannungsquelle über USB oder dem Netzteilstecker anschließen, sondern stabilisierte 3,3V direkt in den 5V-Anschluss der Buchsenleiste. Kann aber sein, dass der Oszillator mit der niedrigen Spannung nicht anspringt (schau mal hier rein: http://www.atmel.com/dyn/resources/prod_documents/doc8161.pdf Seite 316). Ansonsten benötigst du einen Level-Konverter (Level-Shifter), was sicher die beste Methode wäre.

Sooo, also mit dem FS20 Protokoll, hatte ich ja noch nicht das Problem. Mir ging es mehr ums Empfangen. Habe nun im Interrupt (Change) jeweils einen Counter für die zustände high und low mitlaufen lassen. Habe daran gemerkt, dass beide Zustände abwechselnd vorkommen. Daher konnte ich das Problem mit der 2,2V Eingangsspannung ausschließen! Das eigentliche Problem lag daher in der seriellen Ausgabe! Hierbei wurde in der Hauptschleife nicht jede Pegeländerrung übertragen! Aus diesem Grund konnte ich nun die Decodierung des FS20 Protokolls durchführen. Was jetzt auch funzt:) Kann das Protokoll der Fernbedienung richtig ausgeben! Habe dazu dann auch meine Lösung verwendet. Trotzdem danke für deine Hilfe! Jetzt muss ich mich noch um den Sender kümmern, werde dazu aber einen neuen Tread aufmachen! Habe dazu wieder eine Frage;)