mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Bytes per IR versenden


Autor: Franz (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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! :-)
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>

#define FREQ 36000                      // Modulationsfrequenz

#define PIN  PB1                        // IR-LED-Pin
#define DDR  DDRB                       // IR-LED-Port-Einstellungen
#define PORT PORTB                      // IR-LED-Port

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

int main()
{
  // Port
  DDR |= (1 << PIN);

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

  // Interrupt
  sei();                                // Interrupts: An

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

  // Hauptschleife
  while(1)
  {
    for (i = 0; i < sizeof(msg); i++)   // Bytes durchlaufen
    {
      for (n = 7; n >= 0; n--)          // Bits durchlaufen (MSB)
      {
        if (msg[(int)i] & (1 << n))
        {
          IR_LO;                        // LED aus
        }
        else
        {
          IR_HI;                        // LED an
        }
      }
      _delay_us(500);                  // Ein Bit ist 500µs lang
    }
    _delay_ms(10);                     // Nachricht alle 10ms senden
  }
}

Natürlich freue ich mich auch über generelle konstruktive stilistische 
Kritik!

Autor: Eddy Current (chrisi)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.