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 | BYTE b;
|
6 | BYTE test = 1, test2;
|
7 | BYTE iValue;
|
8 | int testneu, i;
|
9 | void eins (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 | void null(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 | void Delay025(void)
|
36 | {
|
37 | Counter16_Start();
|
38 | while (Counter16_wReadCounter()>47999)
|
39 | {
|
40 | }
|
41 | }
|
42 |
|
43 | void startIR(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 | void main(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
|
66 | SleepTimer_EnableInt(); // 64 Hz rate
|
67 | Counter16_EnableInt();
|
68 | M8C_EnableGInt;
|
69 |
|
70 |
|
71 | LED_1_Start();
|
72 | LED_1_On();
|
73 |
|
74 | TX8_DisableInt();
|
75 | RX8_DisableInt();
|
76 |
|
77 | while (1)
|
78 | {
|
79 | RX8_Start(RX8_PARITY_NONE);
|
80 |
|
81 | startIR();
|
82 | eins();
|
83 | null();
|
84 | null();
|
85 | eins();
|
86 | eins();
|
87 | null();
|
88 | eins();
|
89 | null();
|
90 |
|
91 | iValue = RX8_bReadRxData();
|
92 | LCD_Position(0,5);
|
93 | LCD_PrHexByte(iValue);
|
94 |
|
95 | }
|
96 | }
|
Viele Grüße,
Peter