Forum: Compiler & IDEs IR Code RC6 U.Radig Pollin NET IO


von Johannes S. (gnubert)


Lesenswert?

Hallo Leute,

ich habe mir hier eine kleine IR Fernbedienung nachgebaut. SIRCS und 
Samsung Codes funktionieren schon. Jetzt haperts aber an dem RC6 und ich 
komme einfach nicht weiter.

Eingelesen habe ich die Codes meines Philips DVD Players mit Hilfe von 
IRMP.
Von dort und hier (http://www.sbprojects.com/knowledge/ir/rc6.php) habe 
ich mir die Timings zusammengesucht.

Start Sequenz wird direkt angegebenm und Info- und Datenbits werden aus 
einem Array ausgelesen.

CTC Timer funktioniert auf 36kHz.

Anbei mein Code, ich vermute ich habe was mit der Bitmanipulation nicht 
richtig geamcht. Kann da mal jemand drüber schauen?! Wäre sehr dankbar 
:)
1
void ir_philips_send(unsigned char ir_code_array[40])  //Senderoutine für Samsung IR-Codes
2
{
3
  
4
  cli();  //global Interupts deaktivieren
5
  
6
    int i = 0;  //Zähler zum Auslesen des Arrays
7
    int toggle =0;
8
    
9
    
10
11
      TCCR0 |= (1 << COM00);    //Start
12
      _delay_us(2666);          //Start
13
      TCCR0 &=~(1 << COM00);    //Start
14
      _delay_us(889);           //Start
15
      
16
      TCCR0 |= (1 << COM00);    //1 Erst 444us Puls
17
      _delay_us(444);      
18
      TCCR0 &=~(1 << COM00);    //dann 444us Pause
19
      _delay_us(444);        
20
      
21
      
22
      
23
      TCCR0 &= (0 << COM00);    //0 Erst 444us Pause 
24
      _delay_us(444);      
25
      TCCR0 |=(1 << COM00);    // dann 444us Puls
26
      _delay_us(444);      
27
      
28
      TCCR0 &= (0 << COM00);    //0
29
      _delay_us(444);      
30
      TCCR0 |=(1 << COM00);    
31
      _delay_us(444);  
32
      
33
      TCCR0 &= (0 << COM00);    //0
34
      _delay_us(444);      
35
      TCCR0 |=(1 << COM00);    
36
      _delay_us(444);  
37
      
38
      
39
      if (toggle == 1){
40
      TCCR0 |= (1 << COM00);    //1
41
      _delay_us(889);      
42
      TCCR0 &=~(1 << COM00);    
43
      _delay_us(889);  
44
      toggle = 0;
45
      }
46
      else{
47
      TCCR0 &= (0 << COM00);    //0
48
      _delay_us(889);      
49
      TCCR0 |=(1 << COM00);    
50
      _delay_us(889);  
51
      toggle=1;
52
      }
53
      
54
      for (i=0;i<16;i++) // die 16 Zeichen aus dem Array auslesen
55
      {
56
57
        if (ir_code_array[i] == '1')
58
        {
59
        TCCR0 |= (1 << COM00);    //1
60
        _delay_us(444);          
61
        TCCR0 &=~(1 << COM00);    
62
        _delay_us(444);  
63
        }
64
      
65
        else
66
        {
67
        TCCR0 &= (0 << COM00);    //0
68
        _delay_us(444);      
69
        TCCR0 |=(1 << COM00);    
70
        _delay_us(444);              
71
        }
72
        
73
      }
74
      i=0;
75
      TCCR0 &= (0 << COM00);    //0
76
        
77
      _delay_us(2666);
78
      
79
      
80
      
81
  
82
  sei();  //global Interrupts wieder aktivieren
83
}

Bin mal wieder über jeden Tipp dankbar!!
MfG
Johannes

von Stefan E. (sternst)


Lesenswert?

1
TCCR0 &= (0 << COM00);
Wo kommt das her? An anderen Stellen steht es doch richtig.

Sieht so aus, als ob du diese Bitmanipulationen noch nicht wirklich 
verstanden hast, also: Bitmanipulation

von Johannes S. (gnubert)


Lesenswert?

Danke für deine Antwort. Auf wleche Zeile beziehst du dich, oder auf 
alle wo das drin steht ;)?

Ich habe das so verstanden, dass wenn ich an die Stelle COM00 eine 0 
schiebe diese mit dem akteullen Wert (sagen wir mal da steht eine 1 
drin) UND Verknüpfe in jedem Fall eine 0 rauskommen wird.
Das was ich für den Fall " eine 0 senden" (also erst 444us Pause , dann 
444us Puls) ja will.
Das ist also nicht korrekt!?

Vorschlag:
1
TCCR0 |=~(1 << COM00);

von Johannes S. (gnubert)


Lesenswert?

Ich meinte natürlich
1
TCCR0 &=~(1 << COM00);

Funktioniert jetzt auch, danke für den Denkanstoß und für den Hinweis 
auf die Bitmanipulationsseite. Man muss sich das dann doch noch mal auf 
nem Papier aufmalen, dann klappts auch ;)

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.