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