Bytes per IR versenden

Gast #1210568
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!
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

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.