Hallo,
ich versuche zur Zeit eine Datenübertragung über Infrarot zu
realisieren. Die Übertragung soll zwischen zwei Microcontrollern von
Cypress stattfinden (PSoC 1, Bezeichnung cy8c27443-24pxi). Mit der
Übertragung soll ein Modellauto gesteuert werden. Für den Infrarot
Empfänger nutze ich das TSOP31238 (Carrier Freq: 38 Khz). Wenn ich eine
Fernsehfernbedienung auf den Empfänger halte, empfange ich scheinbar
sinnvolle Daten.
Nun möchte ich aber auch Daten senden. Im Datenblatt des TSOP31238 steht
(http://www.farnell.com/datasheets/529935.pdf), dass das NEC-Protokoll
unterstützt wird für den Empfang von Daten. Ich habe auf folgender Seite
genauer angeschaut, wie das Protkoll funktionieren soll:
http://www.sbprojects.com/knowledge/ir/nec.php . Anschließend habe ich
versucht das im PSoC Designer zu realisieren. Ein Bild der internen
Schaltung habe ich angehängt. Mithilfe meiner Handykamera konnte ich
feststellen, dass die IR LED blinkt, aber ich habe leider kein oszi zur
Hand, um die Daten, die ich senden möchte zu überprüfen.
Der 16 Bit Counter, den ich verwende, zählt mit einer 24Mhz (Clockrate)
von 53999 runter und wird abgefragt, um die Zeiten zu erzeugen für High
und Low.
Die Carrier Frequenz von 38Khz erzeuge ich mit einer 16Bit PWM. Das PWM
wird mithilfe der Counterabfrage ein und ausgeschaltet.
Ich habe mir verschiedene Funktionen für das senden von 1 und 0 und
Startsequenz geschrieben.
Leider bekomme ich am Empfänger (der zur Zeit auf dem gleichen Board
realisiert ist) keinerlei sinnvolle Daten. Das folgende Beispiel soll
eine 59in Hex senden. Das erste Bit ist LSB, das letzte MSB.
Am Empfänger kommt 5E an.
Hat jemand eine Idee, wo der Fehler liegen könnte? Ich bin für jede
Antwort sehr dankbar. :)
1
#include<m8c.h> // part specific constants and macros
2
#include"PSoCAPI.h" // PSoC API definitions for all User Modules
3
4
5
BYTEb;
6
BYTEtest=1,test2;
7
BYTEiValue;
8
inttestneu,i;
9
voideins(void)
10
{PWM16_Start();
11
Counter16_Start();
12
while(Counter16_wReadCounter()>40559)
13
{
14
}
15
PWM16_Stop();
16
Counter16_Start();
17
while(Counter16_wReadCounter()>13439)
18
{
19
}
20
}
21
22
voidnull(void)
23
{PWM16_Start();
24
Counter16_Start();
25
while(Counter16_wReadCounter()>40559)
26
{
27
}
28
PWM16_Stop();
29
Counter16_Start();
30
while(Counter16_wReadCounter()>40559)
31
{
32
}
33
34
}
35
voidDelay025(void)
36
{
37
Counter16_Start();
38
while(Counter16_wReadCounter()>47999)
39
{
40
}
41
}
42
43
voidstartIR(void)
44
{
45
PWM16_Start();
46
for(i=0;i<36;i++){
47
Delay025();
48
i++;
49
}
50
PWM16_Stop();
51
for(i=0;i<18;i++){
52
Delay025();
53
i++;
54
}
55
}
56
57
58
59
voidmain(void)
60
{LCD_Start();// Initialize LCD
61
RX8_Start(0x00);
62
63
M8C_EnableGInt;// Turn on interrupts
64
SleepTimer_Start();
65
SleepTimer_SetInterval(SleepTimer_8_HZ);// Set interrupt to a
Peter A. schrieb:> Im Datenblatt des TSOP31238 steht> (http://www.farnell.com/datasheets/529935.pdf), dass das NEC-Protokoll> unterstützt wird für den Empfang von Daten.
Solange der Träger wirklich 38kHz liefert, sollte dem TSOP das Protokoll
sowieso völlig wurscht sein.
Schau dir mal das Pulsdiagramm hier an:
http://www.sbprojects.com/projects/ircontrol/nec.php
Soweit ich deine Software richtig verstehe, fehlt bei dir noch die Lücke
zwischen dem Synchron(Start-)signal und dem ersten gesendeten Zeichen.
(Die erste '4' nach dem State '1' und '2'). Genauer gesagt wird ein Bit
umgekehrt gesendet, erst ein 'PWM16_Stop' und dann das 'PWM16_Start'.
Matthias Sch. schrieb:> Peter A. schrieb:>> Im Datenblatt des TSOP31238 steht>> (http://www.farnell.com/datasheets/529935.pdf), dass das NEC-Protokoll>> unterstützt wird für den Empfang von Daten.>> Solange der Träger wirklich 38kHz liefert, sollte dem TSOP das Protokoll> sowieso völlig wurscht sein.> Schau dir mal das Pulsdiagramm hier an:> http://www.sbprojects.com/projects/ircontrol/nec.php> Soweit ich deine Software richtig verstehe, fehlt bei dir noch die Lücke> zwischen dem Synchron(Start-)signal und dem ersten gesendeten Zeichen.> (Die erste '4' nach dem State '1' und '2'). Genauer gesagt wird ein Bit> umgekehrt gesendet, erst ein 'PWM16_Stop' und dann das 'PWM16_Start'.
Danke für deine Antwort. :)
Also ich habe mich an das Diagramm aus meinem Startpost gehalten
(http://www.sbprojects.com/knowledge/ir/nec.php). Das Pulsdiagramm das
du gepostet hast, ist scheinbar das invertierte Signal davon, oder habe
ich was falsch verstanden?
Peter A. schrieb:> Das Pulsdiagramm das> du gepostet hast, ist scheinbar das invertierte Signal davon, oder habe> ich was falsch verstanden?
Ja, kann sein, das ich da was invertiert gelesen habe. Deine
Empfängerroutine ist über jeden Verdacht erhaben, liefert also korrekte
Codes aus einer echten Fernbedienung?
Von Repeat Code mal abgesehen würde dir ein Oszi (selbst ein simples
über die Soundkarte) dir wirklich weiterhelfen. Das hier z.B. ist ein
echter Helfer:
http://www.ostan.cz/IR_protocol_analyzer/
Und braucht nur eine simple Photodiode als Empfänger.
Peter A. schrieb:> ich versuche zur Zeit eine Datenübertragung über Infrarot zu> realisieren. Die Übertragung soll zwischen zwei Microcontrollern von> Cypress stattfinden (PSoC 1, Bezeichnung cy8c27443-24pxi).> Im Datenblatt des TSOP31238 steht> (http://www.farnell.com/datasheets/529935.pdf), dass das NEC-Protokoll> unterstützt wird für den Empfang von Daten.
Dem TSOP ist das Protokoll weitgehend Wurst. Die Trägerfrequenz muß
stimmen und die Bursts dürfen eine bestimmte Länge nicht übersteigen.
> versucht das im PSoC Designer zu realisieren. Ein Bild der internen> Schaltung habe ich angehängt. Mithilfe meiner Handykamera konnte ich> feststellen, dass die IR LED blinkt, aber ich habe leider kein oszi zur> Hand, um die Daten, die ich senden möchte zu überprüfen.
1
...
2
startIR();
3
eins();
4
null();
5
null();
6
eins();
7
eins();
8
null();
9
eins();
10
null();
Das ist kein NEC was du da sendest. Du sendest hier den 9ms Start-Burst
(den der TSOP nutzt um seine AGC einzupegeln) und dann 8 Bits. NEC hat
aber 32 Bits, die außerdem noch eine logische Bedingung erfüllen müssen
und ein 33. Bit (Stop-Bit).
Für echtes NEC mußt du erst mal eine System-Adresse wählen (8 Bit). Um
dann ein Kommando (nochmal 8 Bit) zu senden mußt du physisch
rausschieben:
- Start-Bit
- 8 Bit Adresse
- 8 Bit Adresse invertiert
- 8 Bit Kommando
- 8 Bit Kommando invertiert (alles LSB first)
- Stop-Bit
Siehe auch die Beschreibung im hiesigen Artikel IRMP
XL
Axel Schwenke schrieb:> Für echtes NEC mußt du erst mal eine System-Adresse wählen (8 Bit). Um> dann ein Kommando (nochmal 8 Bit) zu senden mußt du physisch> rausschieben:>> - Start-Bit> - 8 Bit Adresse> - 8 Bit Adresse invertiert> - 8 Bit Kommando> - 8 Bit Kommando invertiert (alles LSB first)> - Stop-Bit>> Siehe auch die Beschreibung im hiesigen Artikel IRMP>>> XL
Ja das habe ich auch versucht, wobei die invertierten Bits scheinbar
redundant sind. Ich danke euch jedenfalls vielmals für die guten
Antworten!!! Ich habe das Problem gefunden, es lag wie Matthias vermutet
hat, tatsächlich am Empfänger. Dort hat die Interpretation der Pegel
nicht gestimmt. Puh! Jetzt bin ich aber erleichtert und glücklich :)
Peter A. schrieb:> Ja das habe ich auch versucht, wobei die invertierten Bits scheinbar> redundant sind.
Die Redundanz ist beabsichtigt. Die positiven Effekte sind
1. man kann kaputte Frames erkennen indem man prüft ob die wiederholte
Adresse/Kommando auch wirklich invertiert ist
2. jedes Telegramm enhält genau 16 Einsen und 16 Nullen, ist also
unabhängig vom Inhalt immer gleich lang
Aber wenn es jetzt klappt, ist ja gut.
XL
Eine eigene Frage?
Dieser Thread ist über 13 Jahre alt.
Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.