Forum: Mikrocontroller und Digitale Elektronik Demodulation eines PWM modulierten digitalem Signals mithilfe des ATTiny45


von chuck (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

ich versuche zur Zeit ein PWM moduliertes Digitales Signal mithilfe 
eines ATTiny45 zu demodulieren. Das Signal kommt von einer 
Wetterstation. Das ganze Reverse Engineering habe ich schon betrieben. 
Das Signal hat 9 Synchronisationsbits am Anfang (logisch 1). Ein kurzer 
Puls (25 Samples) ist eine 1, ein langer Puls (68 Samples) ist eine 0. 
Die Pause zwischen den hohen Planken beträgt immer 40 Samples. Ein 
komplettes Datenpaket hat 88Bits.
Da ich das Signal mithilfe meiner Soundkarte und Audacity abgetastet 
habe weiss ich dass mit 44100 Samples/s abgetastet wird. Soweit die 
Theorie.

Jetzt wollte ich das Ganze bitweise auslesen und an den PC übertragen, 
nur bekomme ich nicht die Daten die ich will.
Zum auslesen habe ich mir überlegt dass ich einen Timer alle 23µs 
überlaufen lasse. Dabei wird eine Variable um 1 erhöht. Bei einem PCINT 
an meinem Empfänger PIN lese ich dann diese Variable aus und ( mit einer 
Toleranz von 20 ) schreibe das entsprechende Signal in das entsprechende 
Bit.

Im Anhang noch der Code.

Jetzt meine Frage: Ist mein vorgehen soweit korrekt oder geht das auch 
noch besser? Bzw. wo ist der logische/technische Fehler in meiner 
Vorgehensweise?

PS.: Die "Debug LED" blinkt munter vor sich hin. Wenn ich auf meinem 
Autoschlüssel drücke kommt auch etwas am UART raus, jedoch nicht solange 
nur die Wetterstation funkt.

Achja.: Die Wetterstation sendet alle 48 Sekunden

von chuck (Gast)


Angehängte Dateien:

Lesenswert?

Oh man das tut mir leid. Jetzt habe ich die Datei 2x angehängt weil nach 
einem klick auf Vorschau die erste nichtmehr eingetragen schien und 
jetzt ist das auchnoch 2x die alte Version.

Tut mir leid: Hier die neue

von chuck (Gast)


Lesenswert?

Also ich hatte jetzt definitiv zuviel im ISR behandelt.
Ich habe jetzt die ganze Timingbehandlung aus dem ISR rausgezogen, 
arbeite jetzt dafür mit 88byte Buffern.

Falls es jemanden interessiert, meine PCINT_vect sieht jetzt 
folgendermassen aus:
1
  timedata[j++] = i;
2
  if( j > 87 )
3
  {
4
    j=0;
5
    memcpy( buffer, timedata, sizeof(char)*88 );
6
    needsending = true;
7
  }
8
  i=0;

Damit bekomme ich jetzt bereits sehr stabile Ergebnisse.

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.