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
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.
Hi, hätte den Timer/Counter1 verwendet, nur was verstehst du unter caputre funktion? thx Stefan
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) ; }
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.
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
Hi, sorry ... könnte bitte ein admin das doppelte posting rauslöschen ... im anhang mein testsource ... bitte um ratschläge ... thx Stefan
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
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.
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
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.
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
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
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
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
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
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.
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
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
Vieleicht hilft euch ja das hier weiter? http://www.cesko.host.sk/dlredir.php?file=IgorPlugUSBdoc.zip
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
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?
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
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.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.