Forum: Projekte & Code STM8S103: HX1838 und Chinafernbedienung


von Ralph S. (jjflash)


Angehängte Dateien:

Lesenswert?

Nachdem ich nun öfters auch mit STM8 und nicht nur mit AVR und STM32 zu 
tun habe, ist daraus ein Softwaremodul für IR Receiver HX1838 in 
Verbindung mit den billigen Chinafernbedienungen entstanden.

Die im Zip-File enthaltene(n) Softwaremodule sind für den SDCC 3.6 
(unter Linux) geschrieben.

Das Zip-File in ein Verzeichnis auspacken und ein "make" in diesem 
Verzeichnis auf der Konsole ausführen.

Leider habe ich nur die Chinafernbedienungen dekodiert und leider weiß 
ich nicht, wie deren Protokoll heißt. Kann mir das jemand nennen ? 
(siehe Impulsdiagramm im Anhang).

Hinweis:

"make" erstellt eine Datei namens "ir_receiver_demo.ihx". Dieses enthält 
das auf einen STM8S103 zu flashende Programm.

Dieses Programm empfängt mittels IR den Code der Fernbedienung und zeigt 
diesen auf der seriellen Schnittstelle an. Bei einem bestimmten Code 
(der meiner Fernbedienung lautet 0x45BA) kann ein LED-Blinken an- und 
ausgeschaltet werden.

Verdrahtung des IR-Receivers und der LED am STM8S103:
1
      +3.3V             +5V        +5V                        +5V
2
        ^                ^          ^                          ^
3
        |                |          |                          |
4
        |                |          |                          |
5
        |                |          |                          |
6
        |                #          #                          |
7
        |            560 #      10k #                          |
8
        |                #          #                          |
9
        |                |          |                          |
10
        |                |          |       +-------------+    |
11
        |                |    ^^    |       |   HX1838    |    |
12
        |               ---  //     |       |             |    |
13
     ---------+         \ /         |       | OUT GND +5V |    |
14
              |          v          |       +-------------+    |
15
      S       |         ---         |          |   |   |       |
16
      T       |          |  LED     |          |   |   |       |
17
      M       | 11       |          |          |   |   +-------+
18
      8   PB5 |----------+          |          |   |
19
      F       | 17                  |          |   |
20
      1   PC7 |---------------------+----------+   |
21
      0       |                                    |
22
      3       |                                    |
23
      F       | 2                                  |
24
      3   TxD |-------------o zu RxD Computer      |
25
      P       | 3                                  |
26
      6   RxD |-------------o zu TxD Computer      |
27
              |                                    |
28
              |                                    |
29
     ---------+                                   ---
30
        |
31
        |
32
        |
33
       ---

Funktionsweise des Softwaremoduls hx1838.c

Der Datenpin des Receivers löst am STM8 einen Interrupt aus, 
anschließend werden mittels Timer1 die Pulslängen der einzelnen Bits 
"vermessen" und zu einem 16 Bit Integerwert zusammen gefasst. Dieser 16 
Bit Integerwert wird in der globalen Variable ir_code abgelegt, die im 
Main-Programm gepollt werden kann. Eine weitere globale Variable ( 
ir_newflag ) zeigt an, dass ein neuer Wert einer gesendeten Information 
eingegangen ist.

Die Chinafernbedienungen liefern insgesamt 32 Impulse, wobei hier die 
ersten 8 Bits lo, die zweiten 8 Bits hi entsprechen. Bits 16 bis 31 
liefern die Informationen.

--------------------------------------------------

Für das Demoprogramm zusätzlich verwendet wurden stm8_init.c, 
my_printf.c und uart.c.
1
stm8_init.c :
2
3
beinhaltet die Systeminitalisierung (Grundtakteinstellung, hier 16 MHz interner Taktgeber
4
5
----------
6
7
uart.c :
8
9
rudimentäre Funktionen für die serielle Schnittstelle (uart_putchar, uart_getchar)
10
11
my_printf.c :
12
13
Ersatz für das printf der Standardbibliotheken (deutlich kleiner), dafür keine Floatingpointanzeige.
14
15
/* ------------------------------------------------------------
16
                             MY_PRINTF
17
     alternativer Ersatz fuer printf.
18
19
     Aufruf:
20
21
         my_printf("Ergebnis= %d",zahl);
22
23
     Platzhalterfunktionen:
24
25
        %s     : Ausgabe Textstring
26
        %d     : dezimale Ausgabe
27
        %x     : hexadezimale Ausgabe
28
                 ist Wert > 0xff erfolgt 4-stellige
29
                 Ausgabe
30
                 is Wert <= 0xff erfolgt 2-stellige
31
                 Ausgabe
32
        %k     : Integerausgabe als Pseudokommazahl
33
                 12345 wird als 123.45 ausgegeben (wenn
34
                 printfkomma= 2; definiert wurde) 
35
        %c     : Ausgabe als Asciizeichen
36
37
   ------------------------------------------------------------ */
38
39
Die Angabe: " #define printf       my_printf "  lässt eine Ausgabe
40
fast so komfortabel wie ein "echtes" printf zu.

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


Lesenswert?

Ralph S. schrieb:
> Nachdem ich nun öfters auch mit STM8 und nicht nur mit AVR und STM32 zu
> tun habe, ist daraus ein Softwaremodul für IR Receiver HX1838 in
> Verbindung mit den billigen Chinafernbedienungen entstanden.
...

> Leider habe ich nur die Chinafernbedienungen dekodiert und leider weiß
> ich nicht, wie deren Protokoll heißt. Kann mir das jemand nennen ?

Sieht schwer nach NEC aus. Warum hast du dir die Mühe gemacht? IRMP 
läuft prima auf STM8. Siehe auch meinen 
Beitrag "RGB Moodlight mit STM8"

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Axel S. schrieb:
> Sieht schwer nach NEC aus.

Sehe ich genauso.

@Ralph:

Hier ist das NEC-Protokoll dokumentiert:

  https://www.mikrocontroller.net/articles/IRMP#NEC_.2B_extended_NEC

Beim NEC-Protokoll sind Adresse und Kommando-Code nur jeweils 8 Bit 
groß. Aus Datensicherungsgründen (Redundanz) folgt der 8-Bit-Adresse 
nochmal dieselbe in invertierter Form. Dasselbe gilt für das 8-Bit 
Kommando. Macht insgesamt 32 Bits.

Beim Extended-NEC-Protokoll wurde diese Redundanz beim Kommando-Code 
zugunsten von 16-Bit Kommandos aufgegeben.

Zumindest diese Redundanz-Prüfung solltest Du noch in Deinen Code 
einbauen, um fehlerhafte Übertragungen auszuschließen. Oder Du wechselst 
direkt zu IRMP. Mit den über 40 unterstützten IR-Protokollen kannst 
Du dann nahezu jede Fernbedienung decodieren.

von Ralph S. (jjflash)


Lesenswert?

Axel S. schrieb:
> IRMP
> läuft prima auf STM8.

... das ... wußte ich nicht und deshalb schau ich mir jetzt IRMP noch 
mal genauer an. Schade, dass es kein Demo für den STM8 gibt, probier ich 
das ganze mal mit AVR oder STM32 um zu sehen, wie ich das mit STM8 
verwenden kann (und wie groß der Code wird).

Axel S. schrieb:
> Siehe auch meinen
> Beitrag "RGB Moodlight mit STM8"

Das wird jetzt mal meine Anlaufstelle zum lernen werden. Mal sehen, was 
der SDCC daraus macht !

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.