Forum: Mikrocontroller und Digitale Elektronik IR Signal samplen


von Stefan (Gast)


Lesenswert?

Hallo,

habe mir einen TSOP1138 organisiert und will damit IR-Codes samplen.

Kann ich einen Timer verwenden (10kHz), den PortPin abfragen und die
Informationen in Bytes oder Words speichern und diese dann über RS232
an den PC weitersenden?

Könnte mir da bitte jemand behilflich sein?

thx
Stefan

von wolli (Gast)


Lesenswert?

Ja, das geht. ;-)

Ich würde aber keinen externen Timer verwenden, sondern den
Timer/Counter1 mit der capture-Funktion. So kann man mit minimaler
CPU-Last die Codes aufzeichnen.
Ist das Protokoll bekannt, kann man es die Bits ermitteln, bei
unbekannter codierung doch zumindest die Timing-Informationen
speichern.

von Stefan (Gast)


Lesenswert?

Hi,

hätte den Timer/Counter1 verwendet, nur was verstehst du unter caputre
funktion?

thx
Stefan

von Stefan (Gast)


Lesenswert?

Ok, über capture funktion hab ich mich ein bischen schlau gemacht ...
hab mal schnell einen testcode gemacht ...

könnte sich das mal bitte wer anschauen, ob das so stimmen könnte ...
oder hätte vielleicht ne andere lösung ...

wie kann ich jetzt die zeit dazwischen messen ...??????
der trigger bleibt hier immer stehen ...

thx
Stefan



#include <90s8535.h>

#define ICP PIND.6

unsigned char overflow_counter;
unsigned int rising_edge, falling_edge;

interrupt [TIM1_OVF] void timer1_ovf_isr(void)
{
  overflow_counter++;
}

interrupt [TIM1_CAPT] void timer1_capt_isr(void)
{
  if (ICP)
  {
    rising_edge = ICR1;    //pulsstartzeit
    ...????????
    ov_counter = 0;
  }
  else
  {
    falling_edge = ICR1;    //pulsendzeit
    ...????????
  }
}

void main(void)
{
  DDRB=0xFF;
  TCCR1B=0xC4;  (prescaler/256) 36864000/256 = 14400kHz
  TIMSK=0x24;

  #asm("sei");

  while (1)
  ;
}

von wolli (Gast)


Lesenswert?

Ich habe den 1/8 Prescaler bei 4 MHz Takt gewählt. Den Overflow habe ich
weggelassen, die Differenzbildung funktioniert, solange kein Impuls
länger als 131 ms dauert. Bei jedem Capture kannst Du (und musst Du)
die Flanke mit

TCCR1B ^= 1<<ICES1;

wechseln. Dann einfach den Wert von ICR1 speichern und beim nächsten
mal die Differenz bilden. Daraus lässt sich dann die Impulsdauer
errechnen.

Den Counter lässt man einfach weiterlaufen, die Abfrage von ICP kann
man weglassen, da der AVR immer nur an einer steigenden ODER fallenden
Flanke triggern kann.

Tritt für einen gewissen Zeitraum keine Flanke auf, so wird die Sequenz
als beendet erklärt. Das lässt sich z.B. mit der compare-Funktion
realisieren. Einfach bei jeder Flanke z.B.

OCR1A = ICR1 + 25000;

setzten, was einer Dauer von 50 ms bei o.g. Takt und Prescaler
entspricht.

Der Prescaler von 1/256 könnte ein bischen zu groß sein. Mir war 1/64
schon zu grob, die Impulse mancher der von mir erprobten
Fernbedienungen waren nur 100 us lang.

von Stefan (Gast)


Lesenswert?

Hi,

ich habe zahlreiche Versuche gestartet ... ich bekomme nicht einmal
annähernd einen wert der mit einem gemessenen wert übereinstimmt.

hättest du eventuell einen c-source der funktioniert bitte?

was ich nicht gecheckt habe ist die sache mit der compare funktion ...
bitte um erklärung ...

werde mal weiter testen ... gähhnn ...

danke, Stefan

von Stefan (Gast)


Angehängte Dateien:

Lesenswert?

Hi,

sorry ... könnte bitte ein admin das doppelte posting rauslöschen ...

im anhang mein testsource ... bitte um ratschläge ...

thx
Stefan

von Ralf (Gast)


Lesenswert?

Hallo,

habe zwar noch nix mit IR gemacht, aber wenn du Impulslängen messen
willst indem du zwei 16Bit Capturewerte subtrahierst, dann musst du die
subtaktion auch unsigned int durchführen, sonst erhälst du nicht die
richtige Zeitdifferenz zwischen den beiden Flanken.

Viele Grüße,

Ralf

von wolli (Gast)


Angehängte Dateien:

Lesenswert?

Im Anhang mein Programm, ist aber für AVR-GCC geschrieben. Die Ausgabe
erfolgt in Mikrosekunden seit der letzten Flanke, die erste Flanke nach
Timeout (20 ms) wird als "0" ausgegeben. Es schien mir nicht sinnvoll
die Art der Flanke mit auszugeben, da die erste immer eine fallende
ist.

von formtapez (Gast)


Lesenswert?

Man kann das Signal auch samplen, in dem man alle 100 µSec den Port
abfragt und den Zustand (1 oder 0) speichert.
Ich habe eine non-RC5 Fernbedienungsfunktion so in 43 Bytes gesamplet.

Code ist allerdings in Bascom.

MfG
formtapez

von wolli (Gast)


Lesenswert?

Der große Vorteil der capture-Methode ist ihr geringer Verbrauch von
Rechenzeit. Die Pin-Abfrage geschieht sozusagen in Hardware und wenn
kein Signal empfangen wird, verbraucht sie gar keine Rechenzeit.

von Stefan (Gast)


Angehängte Dateien:

Lesenswert?

hi,

thx WOLLI!!

habe das ganze jetzt mal für codevision c compiler angepaßt und zum
testen etwas vereinfacht;

ist      soll
9103     9100
4400     4000
661      700
468      400
661      700
473      500
640      600
472      500
662      700
1602    1600

alles was im ms bereich liegt stimmt - im µs bereich schwanken die
werte ...

hat jemand rat?

thx
Stefan

von Stefan (Gast)


Lesenswert?

ein tippfehler ... so stimmts ... (4000 -> 4400)

ist      soll
9103     9100
4400     4400
661      700
468      400
661      700
473      500
640      600
472      500
662      700
1602    1600

von Stefan (Gast)


Lesenswert?

Hi,

... wenn ich das ganze jetzt ausgeben will zB.:

Wert in µs

9100 L
4400 H
700  L
400  H
700  L
500  H
600  L
500  H
700  L
1600 H

... wenn ich ein High Signal übertragen will dann pulse ich die LED
sonst nicht ...
aber mit welche frequenz?

könnte mir da jemand erklären wie das funktioniert ...

thx
Stefan

von formtapez (Gast)


Lesenswert?

Meinst Du die Modulation der IR-Signals ?

Nimm mal eine Fotodiode, Oszilloskop und Deine Original Fernbedienung
und bestimmt erstmal die Frequenz. Meinstens sinds 38 kHz.
Das lässt sich prima mit dem NE555 Modulieren.

MfG
formtapez

von Stefan (Gast)


Lesenswert?

hi,

hab ich schon gemacht ... die eine fb hat 38kHz die andere 40kHz ....

ja, ich meine die modulation des IR-Signals ... würde die modulation
gerne mit software machen ...

weiteres verständnisproblem -> meine ersten sampling werte sind zB.:

9100 µs Low
4400 µs High
700  µs Low

von welchem pegel gehe ich dann beim senden aus ...?? ist der dann
invertiert? beim samplen ist die erste flanke ne falling ...
nur wenn ich 9100µs dann 0 Pegel ausgebe und dann 4400µs High ... das
kann net wirklich stimmen ...
der erste 0 Pegel wäre solange 0 bis eben hier zB.: die 4400µs High
kommen ... -> was ich hier im forum noch gelesen habe -> das high
signal wird moduliert ...

nur wie?? fragen über fragen?

thx
Stefan

von wolli (Gast)


Lesenswert?

Die IR-Dioden sind natürlich nicht invertierend. Wenn der Empfänger also
auf low geht, muss die Diode "leuchten". Die 38 kHz kann man mit
einem anderen Timer/Counter erzeugen oder eben mit einem externem
Baustein.
Die Abweichungen entstehen nicht durch die Software. Hast Du geglaubt,
die Werte würden exakt rüberkommen? Wenn ich meine Fernbedienung gegen
die Wand richte und das reflektierte Signal sample, haben die Pulse nur
noch 80%-50% (!) der Dauer des direkt eingestrahlten Signals. Ähnliches
Veralten konnte ich bei größeren Entfernungen beobachten. Auch die
Sonneneinstrahlung beeinflusst das Signal. Der Empfänger beinhaltet ja
auch eine Filterschaltung, geringe Veränderungen sind also nicht
verwunderlich.

Das Interessante war, dass ich mit einem TSOP1736, TSOP1738 und
TSOP1740 jeweils alle meine Fernbedienungen benutzen konnte. Die
Frequenz ist also mit den Sensoren schlecht feststellbar, da hilft nur
eine IR-Fotodiode.

von Stefan (Gast)


Lesenswert?

Hi Wolli,

dass das sampling nicht 100% ist war mir klar ... nur die grenzwerte
machten mich etwas unsicher ....

werde mal versuchen die 38kHz via software zu erzeugen ...

thx
Stefan

von Stefan (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

die 38kHz zu erzeugen hab ich geschafft ...

habe jetzt nochmal mit Oszilloskop eine fernbedienung nachgemessen ...
(siehe Bildanhang)

im oberen bild ist der erste block mit 9,1ms zu erkennen ... stimmt ja
auch ...
bei größerer auflösung mußte ich dann feststellen dass ein puls 80µs
dauert ... also 12.4kHz

kann das sein?????

danke, stefan

von Thomas Werner (Gast)


Lesenswert?

Vieleicht hilft euch ja das hier weiter?

http://www.cesko.host.sk/dlredir.php?file=IgorPlugUSBdoc.zip

von Stefan (Gast)


Lesenswert?

danke,

.... mich würd aber interessieren ob ich mit den messergebnissen
richtig liege ... wenn ja, hätte ichs so ungefähr verstanden ... wenn
nein ... bitte ich euch um ne erklärung ..

thx

von wolli (Gast)


Lesenswert?

Erzeugst Du die Pulse in Software? Könnte Probleme mit den Interrupts
geben, da diese sich im Normalfall nicht gegenseitig unterbrechen. Hast
Du das Signal direkt am uC über einem Widerstand (z.B. 10k)gemessen?

von Stefan (Gast)


Lesenswert?

hi wolli,

die zwei pictures vom osci sind messungen über ne fotodiode der
fernbedienung ... nur die 12.4kHz kommen mir spanisch vor ...
könntest du dir bitte das picture von oben mal anschauen ... kann das
sein??????

die ausgabe der sample daten mache ich nicht mit dem gleichen µC ...
habe einfach testweise

--------------
pin auf high
delay            delay = halber puls von 12.4kHz (80µs/2)
pin auf low
delay
--------------

und darüber ne schleife die einen sample lang läuft (im ersten fall
9.1ms -> 112,84 bei f=12.4kHz -> 113mal)

thx
Stefan

von Stefan (Gast)


Lesenswert?

könnte sich das jemand anschauen?

thx
Stefan

von wolli (Gast)


Lesenswert?

Sieht wie ein Software-Problem aus. Ohne den Quellcode kann ich nichts
sagen. Nimm anstatt einer Schleife lieber einen Timer. Ist erheblich
einfacher und ist auch leichter zu erweitern.

von Stefan (Gast)


Lesenswert?

ok, war jetzt leider ne woche nicht zu hause ...
werde es mal mit nem timer probieren und source dann
posten...

mich würde aber interessieren ob die 12.5kHz stimmen!?!
siehe dateianhang weiter oben ... gemessen an der diode der orginal
fernbedienung ...

thx
Stefan

von roboterheld (Gast)


Lesenswert?

hallo  "formtapez" kannst du deinen bascom-code mal reinstellen. ich 
versuche auch gerade zu fuss in bascom den ir-code zu empfangen, finde 
aber keinen anfang.

mfg

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.