Hallo,
ich hab mir ein bisschen das RC5 Protokoll im Internet angesehen.
Öfters habe ich zu der RC% Dokumentation auch ein paar zugehörige
Beispielprogramme zur Dekodierung eines RC5 Signals gesehen(sowohl
Assembler als auch C).
Bei diesen Programmen wurde eigentlich immer ein Timer eingesetzt,der
alle paar µs überläuft und einen Interrupt auslöst.
Ich bin jetzt nicht wirklich gut im Umgang mit µC,aber ginge das nicht
auch ohne einen Timer?
Was ich bisher verstanden hab(oder ich hoffe zumindest das ich das das
korrekt verstanden habe):
Wenn ich eine Taste auf der Fernbedienung drücke dann werden ja immer 14
bit gesendet( 2Starbits + 1 Toggle Bit + 5 Adressbits + 6 Kommandobits).
Eigentlich muss ich ja (zumindest hab ich das aus der RC5 Dokumentation
so verstanden) nur die einzelnen Bits auf "0" oder "1" überprüfen. Wie
lange so ein High bzw Low dauert ist ja eigentlich egal,oder?
Meine Überlegungen zum Programm:
Ich warte im Hauptprogramm so lange bis auf der Portleitung das erste
Mal ein High auftritt,damit weiß ich dann das die Übertragung gestartet
wird.
Nach dem Startbit kommen ja noch 13bit,das heißt ich müsste so lange
warten bis ich alle 14bits beisammen hätte. Da ich nicht so wirklich gut
im Erklären bin,noch ein kurzer Programmcode wie ich mir das vorgestellt
hätte:
1 | //----Include-Files----
|
2 | #include<stdio.h>
|
3 | #include<stdlib.h>
|
4 |
|
5 | sbit at P0^1 IR //P0.1 ist der Pin wo der IR Dekoder angeschlossen ist
|
6 |
|
7 | char string[15]; //Variable in der die Bitkombination später stehen soll
|
8 | int zaehler;
|
9 | int go = 0; //Hilfsvariable
|
10 |
|
11 | void main(void)
|
12 | {
|
13 |
|
14 | if(IR == 1) //die Fernbedienung sendet einen Code
|
15 | {
|
16 | zaehler = 0;
|
17 | string[zaehler] = 0x01; //Starbit speichern
|
18 | while(IR == 1); //solange der Pin noch High ist
|
19 | while(IR == 0); //danach kommt ein Low
|
20 |
|
21 | zaehler ++;
|
22 | while(zaehler = ! 13)
|
23 |
|
24 | {
|
25 | if(IR == 1)
|
26 | {
|
27 | string[zaehler] = 0x01;
|
28 | while(IR == 1);
|
29 | while(IR == 0);
|
30 | go = 1; //wird gesetzt,damit er nicht mehr in die andere Schleife geht
|
31 | }
|
32 |
|
33 | if(go == 0)
|
34 | {
|
35 | if(IR == 0)
|
36 | {
|
37 | string[zaehler] = 0x00;
|
38 | while(IR == 0);
|
39 | while(IR == 1);
|
40 | }
|
41 |
|
42 | }
|
43 | go = 0;
|
44 | zaehler ++ ;
|
45 |
|
46 | }
|
47 |
|
48 | }
|