Forum: Mikrocontroller und Digitale Elektronik IRMP und IRSND gleichzeitig verwenden


von marius208 (Gast)


Lesenswert?

Hallo an die Forumsgemeinde.

Ich will die Steuerung eines Hubtischsystems über ein AVR NET IO mit dem 
ATMega32 automatisieren. Die Steuerung des Hubtischsystems kommuniziert 
hier über RECS80 mit einem Handbedienteil, über das man den Tisch hoch 
und runter fahren kann.

Ich will hierbei mit meinem MCB das Handbedienteil ersetzen.

Ich bin schon soweit, dass ich über das MCB durch IRSND das Hubmodul 
hoch und herunterfahren kann. Außerdem kann ich über einen weiteren Pin 
und IRMP das Höhensignal auslesen, welches auch im RECS80 Format von der 
Steuerung ausgegeben wird.

Ich sende also für den Befehl Hochfahren sowie Herunterfahren ein 
bestimmtes Muster und lese dann die vom Steuergerät auf einer weiteren 
Leitung ausgegebene Höhe über einen weiteren Pin am MCB ein.

Nun zu meiner Frage: Ist es möglich, IRSND und IRMP gleichzeitig laufen 
zu lassen? Für mein Vorhaben wäre es nötig, immer die aktuelle Höhe 
einlesen zu können, aktuell geht das aber nur, wenn IRSND keinen Befehl 
sendet.

Im IRSND Forumseintrag wird nur gezeigt, wie man zwar beide parallel, 
aber zeitversetzt verwenden kann.

Ich möchte also zur selben Zeit einen Befehl senden können über IRSND an 
OC0 und über IRMP an PC2 einen Datenstrom einlesen. Erst Senden und dann 
Einlesen geht hier leider nicht, da das Stg nur dann einen Höhenwert als 
Datenstrom zurücksendet wenn er sich verändert.

Das zwingt mich also dazu, die Höhe dann auslesen zu müssen, wenn IRSND 
noch am senden ist und der Höhenwert sich deshalb verändert.

mfg

Marius

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Siehe dazu das Kapitel "Paralleles Betreiben von IRMP und IRSND":

  https://www.mikrocontroller.net/articles/IRSND#Paralleles_Betreiben_von_IRMP_und_IRSND

Wenn Du - wie im Artikel angegeben - folgende ISR benutzt:
1
ISR(TIMER1_COMPA_vect)
2
{
3
  if (! irsnd_ISR())          // call irsnd ISR
4
  {                           // if not busy...
5
      irmp_ISR();             // call irmp ISR
6
  }
7
}

... dann hält sich IRMP zurück, solange IRSND sendet, d.h. es kann 
nichts empfangen werden.

Wenn Du jedoch schreibst:
1
ISR(TIMER1_COMPA_vect)
2
{
3
    irsnd_ISR();          // call irsnd ISR
4
    irmp_ISR();           // call irmp ISR
5
}

... kann gleichzeitig empfangen und gesendet werden. Allerdings solltest 
Du dann Sender und Empfänger voneinander optisch isolieren, sonst fängst 
Du Dir beim Empfänger das wieder ein, was Du gerade sendest.

von batman (Gast)


Lesenswert?

Ich glaube, man kann generell nicht mehrere IR-Sendungen gleichzeitig 
übertragen, die sich mit ähnlicher Trägerfrequenz überlagern. Dafür ist 
diese Technik nicht gemacht.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

batman schrieb:
> Ich glaube, man kann generell nicht mehrere IR-Sendungen gleichzeitig
> übertragen, die sich mit ähnlicher Trägerfrequenz überlagern.

Solange das optisch isoliert wird - und davon gehe ich aus - sollte das 
gleichzeitige Senden und Empfangen an/von einem anderen Controller 
durchaus gehen.

von batman (Gast)


Lesenswert?

Joa, kann ich mir nur schwer vorstellen, wie das umzusetzen wäre. Klar, 
man könnte die FB per Glasfaser mit dem Empfänger verkabeln. :)

von Marius M. (marius208)


Lesenswert?

Danke für die schnelle Rückmeldung.

Die Übertragung der Signale erfolgt nicht optisch, sondern über Kabel, 
da sollten Überlagerungen jeglicher Art also keine Rolle spielen.

Meine ISR sieht seit ca. einer Woche so aus wie du es geschrieben hast, 
ich dachte mir auch dass der Parallelaufruf so funktionieren müsste.

Aber wenn der Fehler nicht hier liegt, liegt er wohl woanders in meinem 
Programm. Kann mir vorstellen, dass ich das eingelesene Signal falsch 
verarbeite und deshalb verschiedene Bedingungen in meinem Programm nicht 
dann eintreten wenn Sie das sollen.

Ich mach mich mal weiter auf die Suche und berichte dann.

mfg

Marius

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Marius M. schrieb:
> Meine ISR sieht seit ca. einer Woche so aus wie du es geschrieben hast,
> ich dachte mir auch dass der Parallelaufruf so funktionieren müsste.

Ich weiß auch von anderen Leuten, die das schon getestet haben, dass der 
Parallelbetrieb tatsächlich funktioniert. Was natürlich sein kann, dass 
die ISR nun insgesamt ziemlich viel Zeit verbrät.

Daher wäre noch die Angabe des verwendeten µCs nebst Takt noch sinnvoll. 
Warum benutzt Du nicht einfach eine UART-Verbindung, wenn Du Kabel 
nimmst?

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.