Forum: Mikrocontroller und Digitale Elektronik Bytes per IR versenden


von Franz (Gast)


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!

von Eddy C. (chrisi)


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.

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.