Bytes per IR versenden

Gast #1210568
Lesenswert?

Hallo,

ich möchte Daten über die serielle Schnittstelle verschicken. Dazu werde 
ich die Nachrichten in Manchester kodieren, was aber hier zunächst 
uninteressant sein soll. Es geht mir darum, dass ich im Moment mit einem 
delay() warte, um zum nächsten zu übertragenden Bit zu wechseln. Diese 
Methode finde ich allerdings nicht optimal. Ich freue mich auf die 
Lehrbuchlösungen, die Ihr mir bietet! :-)
1
#include <avr/io.h>
2
#include <avr/interrupt.h>
3
#include <util/delay.h>
4

5
#define FREQ 36000                      // Modulationsfrequenz
6

7
#define PIN  PB1                        // IR-LED-Pin
8
#define DDR  DDRB                       // IR-LED-Port-Einstellungen
9
#define PORT PORTB                      // IR-LED-Port
10

11
#define IR_LO TCCR1A = 0                // Modulations-Interrupt deaktivieren
12
#define IR_HI TCCR1A = (1 << COM1A0)    // Modulations-Interrupt aktivieren
13

14
int main()
15
{
16
  // Port
17
  DDR |= (1 << PIN);
18

19
  // Timer
20
  OCR1A  = (F_CPU + FREQ) / (FREQ * 2); // Frequenz korrekt runden
21
  TCCR1A = (1 << COM1A0);               // OC1A togglen, CTC-mode
22
  TCCR1B = (1 << CS10) | (1 << WGM12);  // Vorteiler: 1
23

24
  // Interrupt
25
  sei();                                // Interrupts: An
26

27
  // Daten
28
  char msg[] = "A";                     // Zu sendende Nachricht
29
  char i;                               // Byte-Zähler
30
  char n;                               // Bit-Zähler
31

32
  // Hauptschleife
33
  while(1)
34
  {
35
    for (i = 0; i < sizeof(msg); i++)   // Bytes durchlaufen
36
    {
37
      for (n = 7; n >= 0; n--)          // Bits durchlaufen (MSB)
38
      {
39
        if (msg[(int)i] & (1 << n))
40
        {
41
          IR_LO;                        // LED aus
42
        }
43
        else
44
        {
45
          IR_HI;                        // LED an
46
        }
47
      }
48
      _delay_us(500);                  // Ein Bit ist 500µs lang
49
    }
50
    _delay_ms(10);                     // Nachricht alle 10ms senden
51
  }
52
}

Natürlich freue ich mich auch über generelle konstruktive stilistische 
Kritik!
#1210592
Lesenswert?

Das Lehrbuch (Irda) sagt: Sende alle "aktiven" Bits als Puls und lasse 
inaktive Bits weg. Das Startbit ist also schon mal ein Puls. Mit einer 
Pulsverlängerung im Empfänger kannst Du das Original rekonstruieren. Und 
ja, die "schnellen" Irda-Verfahren funktionieren noch ein wenig anders.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren