Forum: Mikrocontroller und Digitale Elektronik Infrarot Übertragung zwischen Microcontroller mit dem NEC Protokoll


von Peter A. (peterchen2)


Angehängte Dateien:

Lesenswert?

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

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

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'.

von Peter A. (peterchen2)


Lesenswert?

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?

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

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.

von Axel S. (a-za-z0-9)


Lesenswert?

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

von Peter A. (peterchen2)


Lesenswert?

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 :)

von Axel S. (a-za-z0-9)


Lesenswert?

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

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.