Forum: Projekte & Code IRMP - Infrared Multi Protocol Decoder


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Fluto (Gast)


Lesenswert?

Hallo,

auch auf die Gefahr hin, dass ich gleich gerügt werde, weil ich nicht 
den kompletten thread gelesen habe und die Antwort bereits geschrieben 
wurde:
habe eine dreambox dm800se und würde nur gern wissen, welches Protokoll 
die haben / freigeschaltetes werden muss b.z.w. ob die überhaupt 
steuerbar sind. Habe irgendwo etwas von einem TWIRP- Protokol gelesen...
Gruß und danke
Fluto.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Fluto schrieb:

> habe eine dreambox dm800se und würde nur gern wissen, welches Protokoll
> die haben / freigeschaltetes werden muss b.z.w. ob die überhaupt
> steuerbar sind. Habe irgendwo etwas von einem TWIRP- Protokol gelesen...

Habe auch eine Dreambox und kann Dir schon mal sagen, dass die 
Dreambox-FB momentan nicht von IRMP/IRSND unterstützt wird. Mach ich 
vielleicht irgendwann mal...

Gruß,

Frank

von jar (Gast)


Lesenswert?

BTW. Kaseikyo

@frank

ich weiss du machst Kaseikyo immer im Blindflug mangels Geräte, soweit 
funktioniert das auch, nur hab ich das Problem das ich mit Tastendruck 
varieren alles von NEC, Siemens, Ruwido simmulieren kann, wohlgemerkt 
mit einer Kaseikyo ! entweder IRMP kommt durcheinander bei halben 
Repeatframes oder bei halben Frames ? oder deine Pausenerkennung ist 
unzuverlässig bezüglich Kaseikyo

was kann ich für dich tun damit du die besser erkennen kannst, bzw. die 
bessere Erkennung in IRMP einpflegen kannst ?

von Joachim B. (jar)


Lesenswert?

evt. kanns auch am int. RC Oszi liegen, bin da aber unsicher weil der ab 
Werk ja schon kal. Byte gesetzt hat und die Toleranzen nicht so riesig 
sind

meine Abweichung

//OCR2A = 76;  // Reloadwert Timer 2 rechnerisch richtig wär 78,125,

76/78,125

~2,7% mit Oszi ermittelt für einen anderen Timer, nicht für IRMP, also 
ohne Korrektur muss IRMP mit diesem 2,7% Fehler leben, das kann aber 
nicht die Ursache sein, FBs haben ja deutlich größere Toleranzen

von Martin R. (m-joy)


Lesenswert?

Hallo zusammen,
ich möchte das IRSND protokoll bei meinem ATTINY88 benutzen. Leider hat 
der ATTINY88 kein OC0A oder OC0B, sondern nur OC1A und OC1B. Was muss 
ich jetzt hier eintragen, damit es klappt?:
#define IRSND_OCx

grüße

von Joachim B. (jar)


Lesenswert?

nimmst halt den OC1A oder 1B statt 0

#define IRSND_OC1A oder
#define IRSND_OC1B

du brauchst aber das passende OC Bein für die Sendediode

oc für output compare, dein TINY88 muss ja sowas auch haben

wäre am PDIP 28,3 Pin15 f. OC1A

von Joachim B. (jar)


Lesenswert?

hier müsstest du erweitern:
1
#elif defined (__AVR_ATtiny45__) || defined (__AVR_ATtiny85__)  // ATtiny45/85 uses OC0A = PB0 or OC0B = PB1
2
#if IRSND_OCx == IRSND_OC0A                             // OC0A
3
#define IRSND_PORT                              PORTB   // port B
4
#define IRSND_DDR                               DDRB    // ddr B
5
#define IRSND_BIT                               0       // OC0A
6
#elif IRSND_OCx == IRSND_OC0B                           // OC0B
7
#define IRSND_PORT                              PORTB   // port B
8
#define IRSND_DDR                               DDRB    // ddr B
9
#define IRSND_BIT                               1       // OC0B

mit || defined (_AVR_ATtiny88_)
1
#elif defined (__AVR_ATtiny45__) || defined (__AVR_ATtiny85__) || defined (__AVR_ATtiny88__)

und
1
#elif IRSND_OCx == IRSND_OC1A                           // OC1A
2
#define IRSND_PORT                              PORTB   // port B
3
#define IRSND_DDR                               DDRB    // ddr B
4
#define IRSND_BIT                               1       // OC0B


wenn ich das Datenblatt richtig gelesen hatte

von Martin R. (m-joy)


Lesenswert?

ah cool danke :) werde ich testen sobald die schaltung aufgebaut ist. 
super =)

von Cajus H. (cajush)


Angehängte Dateien:

Lesenswert?

Hallo Frank,

da wäre mal wieder ein Problem:
IRSND und KASEIKYO Codes einer Panasonic DVD-RW Fernbedienung.
Ich habe zwei Tasten, deren Codes vom Gerät einfach nicht aktzeptiert 
werden.
Es handelt sich dabei um die Tasten "rot" und "grün". Wenn ich das 
Signal mit IRMP logge, dann wird bei beiden Sendern (original FB und 
IRSND-FB) der gleiche Befehl erkannt. Das Gerät reagiert jedoch nur auf 
die original-FB. Die anderen Tasten scheinen alle zu funktionieren, 
zumindest ist mir noch keine weitere Taste aufgefallen. Ich habe die 
Logs in den Anhang gepackt. Die Tasten "gelb" und "blau" funtionieren 
und sind nur als Referenz in der Logdatei. Irgendwie ist das Signal der 
Original-FB deutlich länger. Bei "rot" und "blau" habe ich außerdem den 
Finger zu lange auf dem Knopf gehabt, weswegen eine Wiederholung 
vorhanden ist.
Ich verwende die letzten Sourcen aus dem SVN, F_INTERRUPTS 15000 auf 
einem ATmega644A (Sender und Empfänger auf getrennter Hardware). Ich 
habe fast alle Protokolle in IRSND und IRMP aktiviert.
Hast Du da einen Tip für mich?
...
Da war doch noch was mit dem SAMSUNG32 Protokoll und der 
Wiederholpause...

Viele Grüße
Cajus

von Cajus H. (cajush)


Lesenswert?

Hallo Frank,

ich habe meine Scans mal durch IRMP unter Linux geschickt und ich denke,
ich habe das Problem gefunden. Eines der 4 System-Bits (Genre2) ist 
unterschiedlich.
Das Parity-Byte am Ende dann natürlich auch. hier für Taste "grün", bei 
"rot" das gleiche Bit.

010000000000010000001101000000000100001001001111  original
010000000000010000001101100000000100001011001111  IRSND
123456789012345678901234567890123456789012345678
MMMMMMMMMMMMMMMMppppGGGGggggCCCCCCCCCCiipppppppp
                        ^               ^
In Beitrag "Re: IRMP - Infrared Multi Protocol Decoder"
stand etwas von

 - Kaseikyo: es werden nun die 4 System-Bits (Genre2) im Frame
   ausgewertet

Wo landen denn die Bits und wie bekomme ich die Bits wieder nach IRSND?
Welche 4 bits gehen denn dann verloren?

Könnte man die 4 Bits nicht in den oberen 4 Bits von "flags" 
unterbringen?
Die unteren 4 Bits werden bei IRSND schon für die Anzahl von 
Wiederholungen verwendet.
Die oberen Bits sind, soweit ich weis, noch frei.
Oder sollte man die IRMP_DATA-Struktur aufzuboren,
z.B. uint8_t flags in uint16_t wandeln?
Dann hätte man noch etwas mehr Luft.

Viele Grüße
Cajus

von Cajus H. (cajush)


Lesenswert?

Hallo Frank,

da Du offensichtlich im Moment nur wenig Zeit hast, habe ich mich mal 
daran gesetzt nach den Genre2-Bits im KASEIKYO Protokoll zu schauen.
Ich habe IRMP erweitert, die Genre2 Bits werden jetzt im MSB von flags 
zurückgegeben.
Danach habe ich die DVD-RW-Fernbedienung mal überprüft: Es sind 
tatsächlich nur die zwei Tasten "rot" und "grün", die ein Genre2 <> 0 
haben.
Ich habe allerdings noch einen neueren Blu-ray Player von Panasonic, der 
die gleichen Codes verwendet, dort sind schon 8 Tasten mit Genre2 <> 0.
Ich habe mich schon gewundert, warum meine IRSND-Fernbedienung bei 
diesem Gerät so schlecht funktioniert ...

Vielleicht komme ich am Wochenende dazu die Funktion in IRSND 
einzubauen. Dann werde ich den Diff zu den aktuellen SVN-Sourcen hier 
einstellen.

Falls Du Lust (und Zeit) hast, kannst Du ja vielleicht mal nach dem 
SAMSUNG32 Protokoll und der Wiederholpause sehen und die Änderungen ins 
SVN einchecken.

Viele Grüße
Cajus

von Cajus H. (cajush)


Angehängte Dateien:

Lesenswert?

Hallo Frank,

hier wäre dann die Änderung an irmp.c und irsnd.c, mit der die Genre2 
Bits der KASEIKYO Codes berücksichtigt werden. Wie schon erwähnt werden 
die 4 Bits in den oberen 4 Bits der flags eingeblendet. Diese Bits sind 
sowohl in irmp als auch in irsnd noch unbenutzt.
Die Quelle für den angehängten Patch sind die SVN-Sourcen von heute.
Es wäre schön, wenn die Änderung in Deinen offiziellen Sourcen eingebaut 
würden.

Viele Grüße
Cajus

von Joachim B. (jar)


Lesenswert?

Cajus H. schrieb:
> Hallo Frank,
> hier wäre dann die Änderung an irmp.c und irsnd.c, mit der die Genre2
> Bits der KASEIKYO Codes berücksichtigt werden. .......
> Viele Grüße
> Cajus

irgendwie blicke ich noch nicht durch wo genau ich das einfügen muss

kannst du die kompletten Texte mit deiner Änderung einstellen ?

die vielen + u. - verwirren mich

ich kenne - als entfernen und + als einfügen, heisst das aber lt. deimem 
Text nur zusätzlich einfügen an der Stelle oder wegen --- entfernen der 
orignal Texte ?


die Zeillennummern stimmen auch nicht mit meinen Versionen überein, 
weiss nicht ob ich da optimiert habe oder andere Quellen hatte.

Kaseikyo liegt mir ja auch sehr am Herzen, komme vermutlich erst heute 
dazu die IRSND in meinem RS232 zu BAS Konverter (Pollin) umgebaut zu 
RS232 zu IRMP implementieren

wenn das fertig ist werde ich Umbauplan und Source hier einstellen

das Teil versorgt sich selber über RS232 (RTS, DTR und TxD angezapft auf 
LM317CZ vom stromfressenden MAX232 befreit, mit sparsamer Trasischaltung 
ausgeführt) und kann von RS232 bedient werden

von Cajus H. (cajush)


Angehängte Dateien:

Lesenswert?

Hallo Joachim,

sorry, meine Patch-Datei war leider fehlerhaft. Ich habe am IRMP und 
IRSND Source noch einige andere Änderungen vorgenommen, die ich dann von 
Hand aus der Patch-Datei entfernt habe. Dadurch stimmten die 
Zeilennummern aber nicht mehr. Im Anhang sind jetzt die kompletten 
Dateien, Basis sind immer noch die SVN-Sourcen vom 2.12.2011.

Gruß
Cajus

von Martin R. (m-joy)


Lesenswert?

huhu, ich möchte nochmal auf den ATTINY88 zurück kommen.
ganz so leicht war es wohl doch nicht... in der irsnd.c
gibt es probleme. Anschinend fehlten definitionen und zwar...

Hier:

irsnd_on (void)
{
    if (! irsnd_is_on)
    {
#ifndef DEBUG
#if   IRSND_OCx == IRSND_OC1A             // use OC2
      TCCR1A |= (1<<COM1A0)|(1<<WGM12);   // toggle OC1A on compare 
match,  clear Timer 1 at compare match OCR1A

.....


hier:

irsnd_off (void)
{
    if (irsnd_is_on)
    {
#ifndef DEBUG
#if   IRSND_OCx == IRSND_OC1A    // use OC2
       TCCR1A &= ~(1<<COM1A0);   // normal port operation, OC1A 
disconnected.
..........


hier:
irsnd_set_freq (uint8_t freq)
{
#ifndef DEBUG
#if IRSND_OCx == IRSND_OC1A
OCR1A = freq;                       // use register OCR2 for OC2
#elif IRSND_OCx == IRSND_OC2A       // use OC2A

uner hier:
irsnd_init (void)
{
#ifndef DEBUG
    IRSND_PORT &= ~(1<<IRSND_BIT);    // set IRSND_BIT to low
    IRSND_DDR |= (1<<IRSND_BIT);      // set IRSND_BIT to output
#if IRSND_OCx == IRSND_OC1A         // use OC2
    TCCR1A = (1<<WGM12);          // CTC mode
    TCCR1A |= (1<<CS10);           // 0x01, start Timer 2, no prescaling




die werte für die timer habe ich jetzt eingesetzt, da diese nicht für 
IRSND_OC1A definiert waren. ich glaube aber da ist ziemlich viel falsch, 
leider weiß ich die richtigen werte nicht da ich total der überblick 
verloren habe :(

kann mir jemand helfen?

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Hallo Cajus,

vorab erstmal eine Entschuldigung, dass ich mich jetzt erst melde. Deine 
Vermutung wg. knapper Zeit war schon ganz richtig.

Cajus H. schrieb:

> 123456789012345678901234567890123456789012345678
> MMMMMMMMMMMMMMMMppppGGGGggggCCCCCCCCCCiipppppppp
>                         ^               ^
> In Beitrag "Re: IRMP - Infrared Multi Protocol Decoder"
> stand etwas von
>
>  - Kaseikyo: es werden nun die 4 System-Bits (Genre2) im Frame
>    ausgewertet

Da ging es mir um die 4 Bits, die Du oben mit GGGG gekennzeichnet hast. 
Die 4 Bits "gggg" habe ich bisher im IRMP einfach ignoriert, da sie 
nicht mehr in die IRMP_DATA-Struktur passten. Kaseikyo ist da mit 48 
Bits einfach zu fett. Bei den mir bekannten FBs war das auch kein 
Beinbruch, da die gggg-Bits immer 0000 waren.

> Könnte man die 4 Bits nicht in den oberen 4 Bits von "flags"
> unterbringen?

Ja, könnte man. Ich bin zwar mit der Lösung nicht ganz so glücklich, 
weil das eher ein Workaround als eine Lösung ist. Eher müsste man die 
IRMP-Datenstruktur aufblasen, z.B. Adresse und Kommando auf 32 Bits 
erweitern. Das würde aber zu Inkompatibilitäten zu bereits bestehenden 
Projekten führen, z.B. zum V-USB-IRMP-Projekt von Hugo Portisch, welcher 
momentan 6 Bytes über V-USB überträgt.

> Die unteren 4 Bits werden bei IRSND schon für die Anzahl von
> Wiederholungen verwendet.

So ist es, gut erkannt. Die oberen 4 Bits verwende ich teilweise in 
privaten IRMP-Projekten, z.B. bei meiner lernfähigen Fernbedienung.

> Die oberen Bits sind, soweit ich weis, noch frei.
> Oder sollte man die IRMP_DATA-Struktur aufzuboren,
> z.B. uint8_t flags in uint16_t wandeln?

Die Flags sind eigentlich nicht dafür gedacht, für Datenbits herzuhalten 
;-)

> Dann hätte man noch etwas mehr Luft.

Eher sollte man address & command aufbohren. Ich schwanke da hin und 
her... wegen einem einzigen Protokoll die Datengröße verdoppeln... 
kostet Zeit (im IRMP) und Speicher (z.B. in der makro-/lernfähigen FB).

Gruß,

Frank

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Hallo Cajus,

Cajus H. schrieb:

> hier wäre dann die Änderung an irmp.c und irsnd.c, mit der die Genre2
> Bits der KASEIKYO Codes berücksichtigt werden.

Vielen Dank, ich werde Deine Änderungen in den IRMP-Source einbauen. 
Aber die letzte Entscheidung, ob das so bleiben wird, ist darüber noch 
nicht gefallen. Ich finde die Verlagerung von Datenbits in die Flag-Bits 
eigentlich nicht so schön, habe (wie oben beschrieben) aber momentan 
auch keine bessere Lösung.

Gruß,

Frank

von Cajus H. (cajush)


Lesenswert?

Hallo Frank,

schön, dass Du wieder da bist!
Ich habe genau wie Du lange hin- und her-überlegt, ob man nicht lieber 
die Datenbits erweitert, aber wegen einem Protokoll?
Wenn Du meine Erweiterungen in IRMP und IRSND einbaust, dann kannst Du 
das Ganze ja in ein #ifdef stecken. Wer kein Kaseikyo verwendet, oder 
die Genre2 Bits nicht braucht, kann den Code ja rauslassen und die Bits 
für andere Zwecke verwenden. Allerdings ist Kaseikyo ziemlich 
gebräuchlich und ich vermute, es werden in Zukunft auch noch andere 
Geräte Gebrauch von den Genre2 Bits machen werden.

Auf die Gefahr, dass ich Dich mit der Frage inzwischen langweile...
Wolltest Du nicht auch noch meine Timing-Änderungen für SAMSUNG32 prüfen 
und in den Code einbauen?
Der Punkt mit der Zwangspause zwischen zwei Befehlen gleicher Kodierung 
ist auch noch offen...
( Beitrag "Re: IRMP - Infrared Multi Protocol Decoder" )

Schöne Feiertage!

Cajus

von Sebastian .. (zahlenfreak)


Lesenswert?

Wieso fügst du nicht noch einen weiteren Structmember für IRMP_DATA ein? 
Dann werden keine Flags missbraucht, man spart sichs, daten aus den 
flags zu operieren und die kompatibilität bleibt gewahrt. Alter Code mit 
neuem IRMP ignoriert die gggg-Bits einfach weiterhin. Und das problem 
mit dem unnötigen Speicher wäre auch weniger schlimm - man müsste ja nur 
ein Byte reservieren.


Viele Grüße,

Sebastian

von irmp (Gast)


Lesenswert?

hallo,

ich bekomme bei jeder Fernbedienung immer das heraus:

Code:
Address: 0x2X
Command: 0x2X

Hatte schon jemand diesen Fehler??



DANKE

von Michael H. (michael_h45)


Lesenswert?

Du gehst wohl auch im Keuschheitsgürtel zum Urologen...
Zeig deinen Code her. Vermutlich ist die Taktfrequenz falsch.

von Dieter (Gast)


Lesenswert?

Guten Abend,

ich habe fast das gleich Problem, nur bei mir erkennt er aber den Code.

Code: NEC
Address: 0x2X
Command: 0x2X

von Dieter (Gast)


Lesenswert?

du bekommst nur den Code, Address und Command sind leer.
1
printf("Code: %s\n",Proto[irmp_data.protocol-1]);
2
printf("Address: 0x%.2X\n",irmp_data.address);
3
printf("Command: 0x%.2X\n\n",irmp_data.command);

von Martin R. (m-joy)


Lesenswert?

huhu, kann mir denn niemand mit dem
IRSND protokoll bei meinem ATTINY88 helfen :(
ich bekomme die timer im protokoll net hin :(
das wär echt voll suuuuuuper !

grüße

von Michael H. (michael_h45)


Lesenswert?

du hast die antwort doch schon bekommen. sogar fertig ausgemalt...
Beitrag "Re: IRMP - Infrared Multi Protocol Decoder"

von Martin R. (m-joy)


Lesenswert?

Michael H. schrieb:
> du hast die antwort doch schon bekommen. sogar fertig ausgemalt...
> Beitrag "Re: IRMP - Infrared Multi Protocol Decoder"

huhu, das funktioniert leider nicht.... ganz so leicht wars wohl net, 
weil die timerbefehle in den funktionen
irsnd_on (void)
irsnd_off (void)
irsnd_set_freq (uint8_t freq)
irsnd_init (void)

für OCR1A nicht vorhanden sind....

von Mario G. (mario)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,
tolles Projekt. Meine Fernbedienungen hab schon ich geloggt aber
hat jemand schon mal probiert die Protokolle von so kleinen 
Modellhubschraubern mit Infrarot zu entschlüsseln.
Ich habe einen kleinen Nincoair 180 ALU G 
(http://www.thalia.de/shop/home/rubrikartikel/ID24972473.html?zUserID=733&zanpid=1596265215589458944)

Anbei ein Log der Fernbedieung. Kann jemand etwas damit anfangen. 
Interruptfrequenz habe ich auf 20000 ISR/s gestellt.

Mario

von Mario G. (mario)


Angehängte Dateien:

Lesenswert?

Hier nochmal ein Scan desselben Hubschraubers mit 10khz. Ich habe es 
schon versucht mit irmp zu analysieren (unter Windows). Er erkennt ein 
irgendwie fehlerhaftes unvollständiges RC5... ich werd nicht schlau 
draus.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Martin K. schrieb:
> huhu, kann mir denn niemand mit dem
> IRSND protokoll bei meinem ATTINY88 helfen :(
> ich bekomme die timer im protokoll net hin :(
> das wär echt voll suuuuuuper !

IRSND braucht 2 Timer:

  - 8-Bit-Timer  0 für die Modulation des Signals durch PWM, z.B. 36kHz,
    38kHz, 40kHz - je nach Protokoll.

  - 16-Bit-Timer 1 für das Senden des IR-Frames, läuft i.d.R. mit 10
    oder 15 kHz.

Leider kann man auf dem ATTiny88 keine PWM mit dem Timer0 benutzen. 
Genau dieses Feature hat man dem kastrierten ATTiny88 geklaut.

Um das Ganze auf dem ATTiny88 zum Laufen zu bekommen, müsste man das 
Ganze umdrehen:

  - 16-Bit-Timer 1 für die Modulation des Signals durch PWM

  - 8-Bit-Timer  0 für das Senden des IR-Frames

Das Umschreiben ist ein wenig Arbeit, wofür ich gerade wenig Zeit habe.

Aber mal eine Frage: Warum benutzt Du einen 28-Pinner, der so abgespeckt 
ist? Nimm doch einfach einen ATMega88 statt dem ATTiny88. Der scheint 
auf den ersten Blick pinkompatibel zu sein und bietet wesentlich mehr 
Möglichkeiten.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Mario Grafe schrieb:
> Hier nochmal ein Scan desselben Hubschraubers mit 10khz.

10kHz reicht dafür aus, die Pulse (und Pausen) sind lang genug.

> Ich habe es schon versucht mit irmp zu analysieren (unter Windows).

"Analysieren" macht man in IRMP mit der "Analyze-Option" (-a). Du 
hättest einfach mal

   irmp.exe -a < hubi.txt

eingeben sollen ;-)

Das habe ich gerade mal unter Linux mittels

   ./irmp -a < hubi.txt

gemacht. Dabei kommt raus:

1. Protokoll ist Bi-Phase (Manchester). Das erkennt man daran, dass
   es sowohl 2 verschiedene Puls- auch auch 2 verschiedene Pausenzeiten
   gibt.

2. Startbit ist: ca. 970 µs Puls, dann ca. 275 µs Pause

3. Pulse: 490 µs und 890 µs

4. Pausen: 280 µs und 670 µs

Eigentlich sollten bei Bi-Phase-Protokollen die kurzen Pulslängen 
genauso lang sein wie die kurzen Pausen. Das gleiche gilt für die langen 
Puls-/Pause-Zeiten. Das Timing ist hier stark asymmetrisch und 
dementsprechend schlecht... ist das so ein Billig-Hubschrauber?

Wenn ich das richtig in Erinnerung habe, habe ich mal vor einigen 
Monaten die Unterstützung von stark asymmetrischen Bi-Phase-Protokollen 
eingebaut. Muss ich mir bei Gelegenheit nochmal ansehen.

Gruß,

Frank

von Martin R. (m-joy)


Lesenswert?

huhuu vielen dank, sorry ich wusste nicht dass es so viel arbeit ist...
das doofe ist ich hab die schaltung schon gemacht weil ichd achte das 
klappt :D naja dann werd ich die schaltung wohl mal mit dem mega88 
aufbauen wenn ich dafür wieder zeit finde hehe =)

danke trotzdem, jetzt weiß ich immerhin woran es liegt ;)

grüüüße

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Martin K. schrieb:
> huhuu vielen dank, sorry ich wusste nicht dass es so viel arbeit ist...
> das doofe ist ich hab die schaltung schon gemacht weil ichd achte das
> klappt

Wie gesagt: der ATMega88 scheint weitestgehend pinkompatibel mit dem 
ATTiny88 zu sein. Wenn Du Deinen ATTIny88 nicht fest eingelötet hast, 
kannst Du ihn direkt gegen einen ATMega88 ersetzen.

von Mario G. (mario)


Lesenswert?

Hallo Frank,

vielen Dank für die schnelle Antwort.

Frank M. schrieb:
> .. ist das so ein Billig-Hubschrauber?

Ja ist so ein Billigteil (vor allem die Steuerung), fliegt aber 
erstaunlich gut. Wäre lustig wenn man den mit deiner Lib auch steuern 
könnte :)

Frank M. schrieb:
> Wenn ich das richtig in Erinnerung habe, habe ich mal vor einigen
> Monaten die Unterstützung von stark asymmetrischen Bi-Phase-Protokollen
> eingebaut. Muss ich mir bei Gelegenheit nochmal ansehen.

Wie hast du denn das Protokoll bezeichnet? Welches muß ich aktivieren?

Noch eine Frage: Ich habe zur Analyse die "irmp.exe" unter Windows 
benutzt. Ist das die Version für 10kHz? Für Windows hast du keine 15 
bzw. 20kHz-Version kompiliert, oder?

Gruß
Mario

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Mario Grafe schrieb:

> Wie hast du denn das Protokoll bezeichnet? Welches muß ich aktivieren?

Es geht nicht um ein bestimmtes Protokoll, sondern nur darum, dass IRMP 
bei Manchester-Codes (Bi-Phase) wie RC5, RC6, Grundig usw. nicht ins 
Schleudern gerät, wenn die Zeiten stark asymmetrisch sind. Dein 
Hubschschrauber-Protokoll wird momentan nicht unterstützt. Kann ich mir 
bei nächster Gelegenheit mal vornehmen...

> Noch eine Frage: Ich habe zur Analyse die "irmp.exe" unter Windows
> benutzt. Ist das die Version für 10kHz? Für Windows hast du keine 15
> bzw. 20kHz-Version kompiliert, oder?

Die ist mit 10kHz kompiliert.

Gruß,

Frank

von Mario G. (mario)


Lesenswert?

Frank M. schrieb:
> Kann ich mir
> bei nächster Gelegenheit mal vornehmen...

Da freu ich mich schon drauf :)
Hast du denn einen Ansatz wie man die Adress- bzw. Kommando-
Bitlängen rausbekommt? Letztenendes muß man schauen wann ein neues 
Startbit kommt, oder? Aber wieder erkennt man die Adressbitlänge?

Falls du noch mehr Logs brauchst, sag Bescheid.
Sobald man den Schubhebel bewegt sendet die Steuerung ohne Pause wild 
drauflos, d.h. es werden permanent Datenpakete geschickt. Evtl. gehen 
einige Bits bei Logging verloren. Vielleicht werde ich mal die Baudrate 
erhöhen...

Gruß
Mario

von P...s (Gast)


Lesenswert?

Hallo,

wenn ich eine Fernbedinung dekodieren will, dann wird nur das Protokoll 
erkannt, die Adresse und das Commando steht leer. Ich benutzt die letzte 
Version die noch CodeVision unterstützt, das ist glaub ich die 2.0.0 vom 
16.08.2011.

Hatte jemand auch schon mal so ein Problem? Würde mich über Eurer Hilfe 
freuen.

von Wolfgang B. (wolfgang6444)


Lesenswert?

Hallo zusammen,

ich benutze irmp, irsnd und V_USB zusammen mit einer
Funkstrecke auf der Basis der RFM01/02-Module von hope - alles zusammen 
auf atmega8. Das ganze kommuniziert mit vdr per irmplircd. Ich bin
begeistert!

Jetzt wuerde ich gerne meine 'historische" Fernbedienung Grundig TP 400
VT empfangen und insbesondere mit irsnd codes aussenden.

Es handelt sich um einen biphase-code mit 29.5khz-Traeger. Das Startbit
hat ca 500us Puls gefolgt von 2.75ms Pause. Danach kommen 7 Daten-Bits
im biphase-code. Das erste Datenbit ist immer eine '0' (d.h. ca 500us
Puls gefolgt von 500us Pause). Wiederholungen sind durch 96ms Pausen
getrennt. Offenbar wird einfach der gleiche Code weitergesendet (kein
Toggeln erkennbar). Wie man da sinnvoll in Adresse und Daten unterteilt
ist mir unklar.

Ich habe mir den code in irmp.c angesehen. Eine Ergaenzung ist nicht 
direkt
trivial.
Es waere super, wenn mir da jemand helfen koennte oder ein paar Tipps 
haette?

Ich habe auch ein paar scope-traces - aber leider keine gesacannten 
files, da ich z.Z. kein UART in Betrieb habe.
Gruss und vielen Dank

Wolfgang

von Peter K. (peko)


Lesenswert?

Hallo Frank,
befasse mich nach endlos langer Zeit mal wieder mit IRMP/IRSND. Das 
Projekt ist ja richtig erwachsen geworden. Mich interessiert hier 
hauptsächlich der RC6A Code. Gibt es Erfahrungen bezüglich IRSND und 
RC6A an "realen" Geräten? Ich habe mal mit einem zweiten IRMP den von 
IRSND ausgesandten Code mit Logging empfangen. Was IRSND da sendet, hat 
rein gar nichts mit dem zu tun, was die originale FB sendet. Bin im 
Moment etwas ratlos, wo hier zu suchen wäre.
PS
SIRCS funktioniert z.B. sowohl in IRMP als auch in IRSND prima.

-peko

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Hallo Peter,

Peter K. schrieb:
> Gibt es Erfahrungen bezüglich IRSND und RC6A an "realen" Geräten?

Nein, ich habe bzgl. RC6A und IRSND kein Feedback.

> Was IRSND da sendet, hat rein gar nichts mit dem zu tun, was die
> originale FB sendet. Bin im Moment etwas ratlos, wo hier zu suchen wäre.

Scans Deiner FB würden mir helfen.

Gruß,

Frank

von Peter K. (peko)


Angehängte Dateien:

Lesenswert?

Hallo Frank,

bei so prompter Antwort schicke ich doch gleich mal einen Scan. 
Erklärungen sind im file enthalten.
-peko

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Peter K. schrieb:
> bei so prompter Antwort schicke ich doch gleich mal einen Scan.

Habs mir angeschaut, kann mir nicht erklären, warum der IRSND bei Dir so 
einen Schrott produziert.

Ich habe gerade mal unter Linux ausprobiert:

       ./irsnd-15kHz 21 0046 0081
1
Ausgabe:
2
00000000000000000000000000000000000000001111111111110000000111111100000001111111000000011111111111111000000011111111111111000000000000000000000111111111111110000000111111100000001111111000000011111110000000111111100000001111111000000011111110000000111111100000000000000111111111111110000000111111100000001111111000000000000001111111000000011111111111111000000000000001111111111111100000001111111000000011111110000000111111100000001111111000000011111110000000111111100000000000000111111111111110000000111111100000001111111000000011111110000000111111100000001111111000000000000001111111111111111111111111111
3
4
Wenn man das mit Deinem Scan der Original-FB vergleicht, passt es perfekt:
5
000000000000000000000000000000000000000001111111111110000000011111100000001111110000000111111111111100000001111111111111000000000000000000001111111111111000000011111100000001111110000000011111100000001111110000000011111100000001111110000000111111000000000000001111111111111000000011111100000000111111000000000000001111110000000111111111111100000001111110000000111111000000001111110000000111111000000011111110000000111111000000011111100000000111111000000000000001111111111110000000011111100000001111110000000111111000000001111110000000111111000000000000001111111111111111

Also prinzipiell funktioniert IRSND, denn beide Frames sehen (bis auf 
kleinere vernachlässigbare Timing-Unterschiede und damit eine 
schleichende Verschiebung) deckungsgleich aus und werden auch beide von 
IRMP einwandfrei wiedererkannt.

Es muss also ein Problem beim µC sein. Entweder ist da eine 
Inkompatibilität des IRSND-Sources betreffend Zielsystem Linux / ATmega 
oder die Speicherverwaltung auf dem µC ist durcheinander. Ob das am 
IRSND liegt oder an dem, was Du "drumherum" programmiert hast, kann ich 
aber erst sagen, wenn ich das selbst mit 2 µCs getestet habe. Der 
Schrott, den Dein µC ausgibt, sieht nach zerwürfelter Speicherverwaltung 
(Überschreiber auf Stack oder sonst irgendwo im SRAM) aus.

Sag mal bitte was über verwendeten µC, Speicherbedarf Deiner Anwendung 
etc.
Oder wenn Deine IRSND-Anwendung klein ist, poste doch mal den Quellcode.

Gruß,

Frank

von Peter K. (peko)


Angehängte Dateien:

Lesenswert?

Hallo Frank,

jetzt habe ich nochmal alles komprimiert, das Ganze besteht fast nur 
noch aus IRMP / IRSND. Ich nutze main() aus irmp. IRMP dient jetzt nur 
als Trigger zum Senden des RC6A codes: Wenn ein IR-Code empfangen wird, 
geht RC6A raus. Gerade mal eine Blink-LED ist noch mit dabei, damit ich 
sehen kann, daß der µC arbeitet. Ich verwende einen 664P mit 20MHz 
getaktet. Anbei mal die gezippten sources. Ich bin mir nicht sicher, ob 
ich nicht irgendwo ein define vergessen / oder falsch eingestellt habe.

Gruß, peko

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Es steht eine neue Version 2.0.3 von IRMP + IRSND zum Download bereit.

Download über Artikel:

   http://www.mikrocontroller.net/articles/IRMP#Download
   http://www.mikrocontroller.net/articles/IRMP#Download_IRSND

und auch übers SVN möglich:

   http://www.mikrocontroller.net/svnbrowser/irmp/

Änderungen IRMP:

  - Bugfix: oberstes Bit in Adresse falsch bei NEC-Protokoll, wenn auch
    NEC42-Protokoll eingeschaltet ist.
  - Timing von SAMSUNG- und SAMSUNG32-Protokoll korrigiert
  - Genre2-Bits werden nun im oberen Nibble von flags gespeichert.

Änderungen IRSND:

  - Timing von SAMSUNG- und SAMSUNG32-Protokoll korrigiert
  - Genre2-Bits werden nun im oberen Nibble von flags gespeichert.
  - Zusätzliche Pause nach dem Senden des letzten Frames

Vielen Dank an Cajus.

Wünsche viel Spaß,

Frank

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

IRSND hatte in der Version 2.0.3 den Fehler, dass es nur einen einzigen 
Frame rausschickte.

Deshalb gibt es nun eine Version 2.0.4 - zum Download und im SVN.

Gruß,

Frank

von Mathias O. (m-obi)


Lesenswert?

Ähm was ist das genre2 Bit? Wozu ist das da?

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Mathias O. schrieb:
> Ähm was ist das genre2 Bit? Wozu ist das da?

Stimmt, dazu hätte ich mehr schreiben sollen. Es steht dazu aber einiges 
hier im Thread. Die Genre2-Bits sind 4 Bits aus dem Kaseikyo-Protokoll.

Leider ist das Kaseikyo-Protokoll mit 48 Bit so fett, dass die 4 
Genre2-Bits nicht mehr in die IRMP_DATA-Struct passen. Deshalb werden 
sie nun im oberen Nibble von flags gespeichert bzw. von IRSND 
ausgewertet. Ich bin zwar mit dieser Lösung nicht sehr glücklich, weiß 
aber im Moment auch keine bessere Lösung... außer IRMP_DATA zu 
vergößern. Ob das so bleibt, weiß ich noch nicht.

Das Ganze ist nur relevant, wenn man Kaseikyo nutzt. Die 4 Genre2-Bits 
sind bei Kaseikyo zudem meist 0, so dass diese Änderung nur in ganz 
speziellen Fällen zum Tragen kommt.

Ich werde dies noch im IRMP-Artikel erwähnen.

Gruß,

Frank

von jar (Gast)


Lesenswert?

Frank M. schrieb:
> Leider ist das Kaseikyo-Protokoll mit 48 Bit so fett, dass die 4
> Genre2-Bits nicht mehr in die IRMP_DATA-Struct passen

genau das verstehe ich immer noch nicht, du schreibst immer von 48 Bit 
bei Kaseikyo, aber in IRMP gibt es nur 16 Bit Address und 16 Bit Data, 
mit den 4 zusätzlichen (Genre2) landen wir bei 36 Bit, warum schreibst 
du bei Kaseikyo immer von 48 Bit, ich gehe davon aus das Protocolbyte 
eine IRMP spezifische ist, die nur festlegt welches Protokoll erkannt 
wurde und keine Nutzdaten aus der IR Übertragung trägt, genau wie Flags

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

jar schrieb:
> genau das verstehe ich immer noch nicht, du schreibst immer von 48 Bit
> bei Kaseikyo, aber in IRMP gibt es nur 16 Bit Address und 16 Bit Data,
> mit den 4 zusätzlichen (Genre2) landen wir bei 36 Bit, warum schreibst
> du bei Kaseikyo immer von 48 Bit, ich gehe davon aus das Protocolbyte
> eine IRMP spezifische ist, die nur festlegt welches Protokoll erkannt
> wurde und keine Nutzdaten aus der IR Übertragung trägt, genau wie Flags

Wenn Du Dir

 http://www.mikrocontroller.net/articles/IRMP#Die_IR-Protokolle_im_Detail

unter "Kaseikyo" anschaust, dann weißt Du warum. Im Frame stecken 4 + 8 
= 12 Parity-Bits. Die brauche ich nicht, die kann IRSND mühelos wieder 
aus den 36 Daten-Bits wieder reproduzieren. Aber auch 36 Bits sind 4 
Bits zuviel.

Gruß,

Frank

P.S.
Die Parity-Bits werden selbstverständlich von IRMP berücksichtigt, um 
die Korrektheit der Daten zu prüfen. Gespeichert werden brauchen sie 
aber nicht.

von jar (Gast)


Lesenswert?

Frank M. schrieb:
> ie kann IRSND mühelos wieder
> aus den 36 Daten-Bits wieder reproduzieren. Aber auch 36 Bits sind 4
> Bits zuviel.

danke, so wie ich das nun rauslese haben wir alle 36 relevanten Bits vom 
Kaseikyo, aufgeteilt in IRMP auf 16 Address Bits und 16 Command Bits + 4 
Genre2 Bits in Flags, du schreibst 4 sind zuviel, aber es gab ja User 
die die brauchten, ich konnte zwar alle Kaseikyo Codes auslesen, habe 
aber bis jetzt nur einen schwach senden können, kann aber an den Dioden 
oder der Frequenz liegen, das genau muss ich noch testen, ich bekomme ja 
die Bits aus einem TSOP (3)1736 der spuckt natürlich zwischen 32 und 38 
kHz locker Daten aus, meine Sendediode hat 940nm mit wenig sr, es gibt 
aber auch 950 und 880er nm Dioden mit viel mehr power, aber das ist 
wieder ne andere Baustelle

von KLaus (Gast)


Lesenswert?

Hallo

Ich verfolge nun dieses Thread schon seit Wochen .
Derzeit programmiere ich noch alles in Bascom, das wird sich aber 
ändern.
Da ich eh noch nicht so lange mit MC’s bastel is das auch nicht so 
weltbewegend, bin ja nicht festgewachsen 
Aber wird schon a bissal Hirnschmalz nötig sein!

Aber nichts desto trotz , ich hab ein Problem mit der integration von 
IRMP und IRSND in ein fertiges
Gerät, dass ich von der Arbeit gespendet bekomme. Es sind keine Layout 
Änderungen möglich.

Das is so ein Gaswarner für die Chemieindustrie mit einem Atmel an 
Board.
Den oder diese würde ich gerne für zukünftige Projekte verwenden.
Dazu sollte es möglich sein per IR Einstelungen von einem Laptop oder 
2.tem Gaswarner zu übertragen, dies will ich mit rc5 oder anderem z.B. 
Grundig Code übertragen.

Auf einer extra aufgebauten Schaltung (Polin Board) funktioniert IRMP 
tadel los mit 16Mhz Atmega 32! Die Grundig IR Variante hat bei mir die 
stabilste Erkennung.

Ausstattung :
-  Atmel Atmega169PV-8MU  /hab ich fürs compilieren in der IRMP 
atmega168 Sektion hinzugefügt)
-  1Mhz interner Takt (ckdiv8 gesetzt)  - dies ist die 
Standardeinstellung vor und nach dem Löschen des orginal beschriebenen 
microcontrollers und sollte auch so bleiben
-  SIR TFBS4711 (irda Transceiver)
Irgend ein Quarz(FSR 12.5) ohne Kondensatoren ist verlötet (evtl ein 
Uhrenquarz ?)

Mein Problem nun :
Der RX pin des IRDA ist auf PG4 (T0/SEG23)
Der TX Pin des IRDA ist auf PB4 (OC0A/PCINT12)

Ich kann Daten empfangen mit der Log Funktion(in der neuesten IRMP 
allerding lässt  sichs nicht mehr compilieren mit Log Flag) von IRMP, 
aber es wird nie etwas komplett erkannt so das ich keine Adresse , 
Command und sonstige Daten zum Auswerten bekomme.
Beim Senden wird’s wohl  auch nix werden .

Ich hab schon mehrfachi n einigen Foren gelesen , dass es möglich sein 
muss ohne externen quarz IR empfangen und senden zu können.
Aber Wie ?
Hab schon mit den Fuses (ckdiv8) und den FPU einstellungen gespielt aber 
leider nichts.

Beim Atmega32 gehst auch mit 8Mhz internem Takt (nur das Thomson wird 
dann nicht mehr erkannt), bei 1Mht internem Takt rührt sich allerdings 
auch beim Atmega32 nichts mehr.

Ich denke ich hab fürs empfangen hier ein eindeutiges Timing Problem 
aber wie mach ich das es funktioniert???
Kann mir bitte jemand auf die Sprünge helfen, oder zumindest erstmal 
noch fragen was er zu meiner Problemlösung noch wissen muss ?
Hab schon etliche Nächte weiss werdende Haare gezählt.


Gruß Klaus

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Hallo zusammen,

eine neue Version von IRMP und IRSND steht zum Download bereit. Diese 
ist nun auch für den C18-Compiler (PIC) verfügbar. Ebenso kann man nun 
auch unbekannte Formate auf dem PIC scannen (über USB).

Vielen Dank dafür an gera!

IRMP Version 2.0.4:

 - Bug in IR60-Decoder behoben
 - Bug in CRC-Berechnung von Kaseikyo-Frames behoben
 - Portierung auf C18 Compiler für PIC-Mikroprozessoren
 - Scannen von IR-Frames auf dem PIC (über USB)

IRSND Version 2.0.4:

 - Neues Protokoll: IR60
 - Bug beim Senden von Bi-Phase-Frames (Manchester) behoben
 - Portierung auf C18 Compiler für PIC-Mikroprozessoren

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

KLaus schrieb:
> Mein Problem nun :
> Der RX pin des IRDA ist auf PG4 (T0/SEG23)
> Der TX Pin des IRDA ist auf PB4 (OC0A/PCINT12)

IRMP funktioniert nicht mit IRDA. Diese IRDA-Controller benutzen ein 
eigenes Protokoll, dass Du überhaupt nicht beeinflussen kannst. Du 
kannst versuchen, den IRDA-Controller direkt über RX/TX als UART 
auszulesen bzw. Daten darüber zu senden. Das hat dann aber gar nichts 
mehr mit IRMP zu tun.

Gruß,

Frank

von jar (Gast)


Lesenswert?

KLaus schrieb:
> Ausstattung :
> -  Atmel Atmega169PV-8MU  /hab ich fürs compilieren in der IRMP
> atmega168 Sektion hinzugefügt)
> -  1Mhz interner Takt (ckdiv8 gesetzt)  - dies ist die
> Standardeinstellung vor und nach dem Löschen des orginal beschriebenen
> microcontrollers und sollte auch so bleiben
> Beim Atmega32 gehst auch mit 8Mhz internem Takt (nur das Thomson wird
> dann nicht mehr erkannt), bei 1Mht internem Takt rührt sich allerdings
> auch beim Atmega32 nichts mehr.

ich denke mit 1 MHz geht eh nix mehr, egal welcher Atmel, das wäre dann 
auch das was du schon beobachtet hast

von Klaus (Gast)


Lesenswert?

jar schrieb:
> KLaus schrieb:
>> Ausstattung :
>> -  Atmel Atmega169PV-8MU  /hab ich fürs compilieren in der IRMP
>> atmega168 Sektion hinzugefügt)
>> -  1Mhz interner Takt (ckdiv8 gesetzt)  - dies ist die
>> Standardeinstellung vor und nach dem Löschen des orginal beschriebenen
>> microcontrollers und sollte auch so bleiben
>> Beim Atmega32 gehst auch mit 8Mhz internem Takt (nur das Thomson wird
>> dann nicht mehr erkannt), bei 1Mht internem Takt rührt sich allerdings
>> auch beim Atmega32 nichts mehr.
>
> ich denke mit 1 MHz geht eh nix mehr, egal welcher Atmel, das wäre dann
> auch das was du schon beobachtet hast

Frank M. schrieb:
> KLaus schrieb:
>> Mein Problem nun :
>> Der RX pin des IRDA ist auf PG4 (T0/SEG23)
>> Der TX Pin des IRDA ist auf PB4 (OC0A/PCINT12)
>
> IRMP funktioniert nicht mit IRDA. Diese IRDA-Controller benutzen ein
> eigenes Protokoll, dass Du überhaupt nicht beeinflussen kannst. Du
> kannst versuchen, den IRDA-Controller direkt über RX/TX als UART
> auszulesen bzw. Daten darüber zu senden. Das hat dann aber gar nichts
> mehr mit IRMP zu tun.
>
> Gruß,
>
> Frank

Hallo Frank


Danke für deine Antworten
Aber jetzt werd ich wohl mal kalt duschen gehen müssen, ich dachte 
dieser irda controller lässt sich auch dazu bewegen die Daten korrekt zu 
empfangen und zu senden  da ich ja schon Daten empfing aber eben nur im 
log modus .
Da hab i jetzt echt 2 oder 3 wochen rumgedoktert , oh MAMA MIA , wo werd 
ich noch enden :-(. hätt wohl eher fragen sollen.

Zu aller Anfang versuchte ich alllerdings eine Kommunikation direkt über 
Software Uart mit 2 Gasmeldern.
Ich dachte ich könnte das einfach bei 1Mhz Controllertakt und 2400Baud 
übertragen incl verdunklung der Irda Transceiver.
Schien mir das einfachste . Aber irgendwas mache ich falsch .
Was genau da nicht funktioiert  kann ich erst sagen wann ich wieder an 
diesem Punkt anfange und weitermache. Denke aber es wurden einfach keine 
Daten am empfänger ausgegeben.

Kann mir evtl jemand ein Example zeigen das ohne encoder/decoder chip 
zwischen uart(controller) und irda transceiver auskommt und trotzdem 
Daten übertragen werden können?

gruß klaus

von jar (Gast)


Lesenswert?

es gab mal Irdeo welche über UART ging
mit etwas umlöten geht auch die Kombi WinLirc und IR Assistent

aber das hat nix mit hier zu tun, aber mit einem Tiny85 IR zu seriell 
und an der Seriellen geht das im Prinzip

von jar (Gast)


Lesenswert?

Klaus schrieb:
> Kann mir evtl jemand ein Example zeigen das ohne encoder/decoder chip
> zwischen uart(controller) und irda transceiver auskommt und trotzdem
> Daten übertragen werden können?

willst du wirklich echtes IRDA ?
http://www.infrarotport.de/

von Didi S. (kokisan2000)


Lesenswert?

Hallo Frank,

eigentlich ist es garnicht so dramatisch mit dem IrDA Transceiver. Doch 
eines Vorweg. Das IrDA Software Protokoll ist ausgelegt, um 
unterschiedlichste Geräte miteinander zu verbinden. Nach dem OSI Modell 
laufen zwischen zwei Geräten viele Kommunikationen ab, in denen sich die 
Geräte über Protokoll, maximale Geschwindigkeit, Errorkodierung und CRC 
Prüfsumme austauschen. Doch das sind alles sachen, die Du für eine 
eigene Punkt zu Punkt Verbindung NICHT benötigst. Wenn Du den gesamten 
Overhead weglässt, dann bleibt beim TFBS4711 Transceiver ein IR Bauteil 
das im Halbduplex Verfahren Daten senden und empfangen kann - und das 
sehr gut und fehlerfrei innerhalb gewisser Grenzen.

Der TFBS4711 ist ein SIR Bauteil, kann also Daten senden und empfangen 
von 2400 Baud bis 115200 Baud. Das SIR Protokoll ist zum UART Signal 
nicht kompatibel, weil High und Low als RZI (Return to Zero Inverted) 
gesendet werden. Um den Unterschied zum UART zu verstehen, schaue Dir 
doch bitte einmal das Bild 13 im Physical Layer von IrDA an: 
http://www.vishay.com/docs/82513/physical.pdf.
Statt einem "High" auf dem UART muß ein "Low" bereitgestellt werden. Für 
jedes "Low" auf dem UART muß ein "3/16 High" am TFBS4711 angelegt 
werden. Wenn Du den TFBS4711 so ansteuerst, dann funktioniert die 
Übetragung per IR genau so, als ob Du zwei Controller per UART 
kommunizieren lässt.

Du hast jetzt zwei Möglichkeiten:

1) Wenn Du das IrDa Bauteil an einem normalen UART eines Controllers 
anschliessen willst, benötigst Du ein Encoder-Decoder Baustein zwischen 
UART und TFBS4711. Ich habe vor vielen Jahren diese beiden 
mitentwickelt:
http://www.vishay.com/docs/81749/toim5232.pdf
http://www.vishay.com/docs/82546/toim4232.pdf

2) Wenn Du die Möglichkeit hast den TFBS4711 an zwei freien Pins des 
Controllers anzuschliessen, kannst Du das Timing des SIR Protokolles 
einfach selber programmieren.

Im Internet findest Du Softwarerealisierung des SIR Protokolls wie 
z.B.hier: http://www.gaw.ru/pdf/TI/app/msp430/slaa044.pdf

Wenn Du den Weg weiter verfolgen möchtest, dann müsste ich mal in meinem 
Fundus graben. Ich habe da eventuell noch Sourcecode Relikte für 
Prozessoren ...

Gruß
kokisan

von Didi S. (kokisan2000)


Lesenswert?

Hallo Frank,

sorry, meine ausführlichen Hinweise in meinem letzten Beitrag waren 
nicht für Dich, sondern für Klaus gedacht ;-)

Frank, klasse Arbeit mit IRMP !!!

Gruß
kokisan

von Klaus (Gast)


Lesenswert?

Hallo erstmaltschuldigung für das späte schreiben , bin gerade beruflich 
unterwegs
Danke für die vielen Anworten
@jar
willst du wirklich echtes IRDA ?


Nein das ist das was ich will .
Mein Bestreben ist es , den IRDA Transceiver mit einem irda transceiver 
kommunizieren zu lassen ohne zusätzliche beschaltung (wie vorgegeben) 
und sowie es didi in seinem ersten block beschrieben hat .
und evtl. auch über eine normale sende und empfangsdiode daten hin und 
herschieben und das ganze mit einem atmega169 bei 3,6 Volt.
Es  muss keine hoche Reichweite haben , 20cm reichen.

@Didi S. (kokisan2000)

Du bist meine Rettung , du hast mich verstanden :-))
Da ich nicht flexibel bin mit meiner Hardware , is ja ein fertig 
verbauter Gasmelder mit Atmega169 und Irda Transceiver
daher kommt für mich nur zweiteres in Frage .
Und ich hab mich grad riesig gefreut da du was zu dem 3/16 Dings 
geschrieben hast und das auch noch auf einfache weise
Ich werde mich mit diesem Thema beschäftigen,dazu kann ich sehr gerne 
deine SourceCode Schnippseln brauchen .
Evtl. hast du noch mehr solcher Erklärungsstützen auf Lager :-)
 wautschis AT gmx dot net
Versuche dann auch mir das gabnze zu erklären was aber am Anfang immer 
ein Riesenberg ist da einzusteigen:-(

Wanns mal klar ist dürfte das ganze gar nicht mehr so schwer werden

von Klaus (Gast)


Lesenswert?

@didi
eins hab i  ja noch vergessen
die original firmware die drauf
war konnte alles mit dem chkdiv8 teiler und 1 Mhz Prozessor takt

die programmierer haben das eben auch per programmierung gelöst und das 
mit 1mhz takt
bzw. es ist nooch ein quarz verbaut aber warsch. ein uhrenquarz.
dder gasmelder soll ja 18 monate rückwärts zählen und ausgehen oder wann 
Batterie leer ist.
Die Übertragung der sensor daten fand auch in unmittelbarerer nähe zum 
controllgerät statt.

von Klaus (Gast)


Lesenswert?

@jar
willst du wirklich echtes IRDA ?

fix verschrieben

natürlich will ich das nicht! :-)

von Hans W. (stampede)


Lesenswert?

Darf das IRMP auch kommerziell genutzt werden?

von Michael S (Gast)


Lesenswert?

Hat jemand die Lib schon auf einem atXmega eingesetzt ? Gibts evtl. nen 
Patch ?

Danke
Michael

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Hans W. schrieb:
> Darf das IRMP auch kommerziell genutzt werden?

Da IRMP unter der GPL-Lizenz läuft, kann es auch kommerziell genutzt 
werden.

Sobald Du die erste Million verdient hast, kannst Du mich gern mit 10% 
beteiligen ;-)

von Martin R. (m-joy)


Lesenswert?

Huhu, ich habe meine schaltung jetzt vom attiny88 auf den atmega88 
umgebaut. und siehe da es funktioniert ... super :)

aber eine sache funktioniert nicht, und zwar wenn ich am sender folgende 
routine benutze:
1
    for (VCount=0; VCount<=7; VCount++)
2
        {
3
    if( POSITION == VCount )
4
    {
5
    V=VCount;
6
    irmp_data.command  = VCount;    
7
    send=1;
8
    }
9
       }

dann funktioniert es mit diesem am empfänger:
1
  for (Vcommand=0; Vcommand<=7; Vcommand++)
2
       {
3
  if( irmp_data.command == Vcommand )
4
    {
5
    V=Vcommand;
6
    }
7
      
8
        }

ich möchte aber sehr viele IR codes benutzen und diese teilen,also 
dachte ich mir ich benutze 0x0A** für eine reihe, und 0x0B** (mit * von 
0-f) für die zweite reihe.
Jetzt habe ich beim sender eingegeben:

    for (VCount=0; VCount<=7; VCount++)
        {
    if( POSITION == VCount )
    {
    V=VCount;
    irmp_data.command  = (VCount + 0x0A00);
    send=1;
    }
       }

und dasselbe eben auch beim empfänger. wenn ich da einen wert aufaddiere 
dann geht es nicht mehr :( weiß jemand woran das liegen könnte...?

grüüße

von Martin R. (m-joy)


Lesenswert?

nach etwas rumprobieren bin ich auf die idee gekommen, dass es wohl 
probleme gibt bei den größeren werten....
wenn ich das command
0x0011 schicke, kann ich es emfpangen
bei 0x0101 klappts dann nicht mehr.... vielleicht liegts ja daran? wie 
kann das sein.... what is wrooong?
Ich benutze das NEC Protocol, der rest ist deaktiviert.


grüße

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Martin K. schrieb:
> wenn ich das command
> 0x0011 schicke, kann ich es emfpangen
> bei 0x0101 klappts dann nicht mehr.... vielleicht liegts ja daran? wie
> kann das sein.... what is wrooong?

Wenn Du unter

  http://www.mikrocontroller.net/articles/IRMP#Pulse-Distance_Protokolle

nachschaust, siehst Du, dass das NEC-Protokoll aus

  16 Bit Adresse + 8 Bit Kommando + 8 Bit invertiertes Kommando

besteht. Das NEC-Protokoll unterscheidet also nur 256 Kommandos. Damit 
geht Dein Wertebereich für irmp_data.command von 0x00 bis 0xff. Das 
Senden von 0x0101 ist also dasselbe wie das Senden von 0x0001, da IRSND 
die zusätzlichen Bits außerhalb des Wertebereichs einfach wegblendet.

> Ich benutze das NEC Protocol, der rest ist deaktiviert.

Versuche, mit 8 Bit hinzukommen oder wähle ein anderes Protokoll, wenn 
Du Daten übertragen willst.

Gruß,

Frank

P.S.

Ich verstehe Deine for-Schleifen nicht:

>  for (Vcommand=0; Vcommand<=7; Vcommand++)
>  {
>     if( irmp_data.command == Vcommand )
>     {
>         V=Vcommand;
>     }
>  }

Das kannst Du doch einfach als

     if( irmp_data.command <= 7 )
     {
         V=irmp_data.command;
     }

schreiben. Eine Schleife ist überhaupt nicht notwendig.

von Ephraim H. (ephi)


Lesenswert?

Hallo zusammen,

erstmal: ein grandioses Projekt!
Im wesentlichen funktioniert das bei mir auch grandios. Ich empfange die 
Volume +/- Befehle einer Apple Remote (die alte), um damit einen 
Motorpoti zu steuern. Das ganze werte ich wie folgt aus:
1
while(1)
2
    {
3
        irmp_get_data(&irmp_data);
4
        
5
        if(irmp_data.protocol == IRMP_APPLE_PROTOCOL)
6
        {
7
            // Volume up
8
            if((irmp_data.command&0x00FF) == 0x0B)
9
            {
10
                // Motor rechts
11
                PORTD |= (1<<PD5);
12
                PORTD &= ~(1<<PD6);
13
            }
14
            // Volume down
15
            else if((irmp_data.command&0x00FF) == 0x0D)
16
            {
17
                // Motor links
18
                PORTD |= (1<<PD6);
19
                PORTD &= ~(1<<PD5);
20
            }
21
            else
22
            {
23
            // Motor stop
24
            PORTD &= ~(1<<PD5);
25
            PORTD &= ~(1<<PD6);
26
            }
27
        }
28
    }
Funktioniert soweit prima, bis auf eine Kleinigkeit: Wenn ich einmal 
kurz Volume up oder down drücke, steht in irmp_data.command so lange 
dieser Befehl, bis ich einen anderen sende. D.h. ich muss irgendeine 
Taste drücken, um den Motor zu stoppen. Ist das ein Fehler? Oder muss 
ich irmp_data nach dem auslesen irgendwie bereinigen?

Gruß,
Ephraim

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Ephraim Hahn schrieb:
> Im wesentlichen funktioniert das bei mir auch grandios. Ich empfange die
> Volume +/- Befehle einer Apple Remote (die alte), um damit einen
> Motorpoti zu steuern. Das ganze werte ich wie folgt aus:
>
1
>     while(1)
2
>     {
3
>         irmp_get_data(&irmp_data);
4
>

Das ist falsch, Du musst den Rückgabewert prüfen. Wenn 0 zurückkommt, 
wurde nichts empfangen.

Also:
1
    while(1)
2
    {
3
        if (irmp_get_data(&irmp_data))
4
        {
5
            ... // hier Deinen restlichen Code einfügen
6
        }
7
    }

> Funktioniert soweit prima, bis auf eine Kleinigkeit: Wenn ich einmal
> kurz Volume up oder down drücke, steht in irmp_data.command so lange
> dieser Befehl, bis ich einen anderen sende. D.h. ich muss irgendeine
> Taste drücken, um den Motor zu stoppen. Ist das ein Fehler? Oder muss
> ich irmp_data nach dem auslesen irgendwie bereinigen?

Wie gesagt: Du musst den Rückgabewert prüfen. irmp_data wartet nicht, 
bis etwas empfangen wird, sondern kommt sofort zurück, wenn keine Daten 
anstehen. In diesem Fall steht natürlich noch das alte Zeugs in der 
Datenstruktur. Ein Zurücksetzen der Datenstruktur ist nicht notwendig, 
da die Daten valide sind, wenn irmp_get_data() TRUE zurückliefert.

Gruß,

Frank

von Ephraim H. (ephi)


Lesenswert?

ah okay, das macht Sinn. Probier ich nacher gleich aus, vielen Dank!

von Martin R. (m-joy)


Lesenswert?

ohhhjee ich idiot vielen dank.... naatürlich es gibt nur 8 command 
bit... :( ich habe das problem gelöst indem ich einfach zwei 
verschiedene adress bits genutzt habe ;)
vielen dank

p.s. die schleife muss man net verstehen G

von Ephraim H. (ephi)


Lesenswert?

Verzeihung, aber ich muss mich noch mal melden.
Konnte die Geschichte erst jetzt testen, da ich noch andere Hardware 
Probleme zu lösen hatte.

Dieser Code hier (wie oben) funktioniert, aber mit besagtem Problem, 
dass er nicht mehr aufhört, wenn ich einmal gedrückt habe, da ich den 
Rückgabewert von /irmp_get_data()/ nicht prüfe.
1
while(1)
2
    {
3
        irmp_get_data(&irmp_data);
4
 
5
            if(irmp_data.protocol == IRMP_APPLE_PROTOCOL)
6
            {
7
                // Volume up
8
                if((irmp_data.command&0x00FF) == 0x0B)
9
                {
10
                    // Motor rechts
11
                    PORTD |= (1<<PD5);
12
                    PORTD &= ~(1<<PD6);
13
                }
14
                // Volume down
15
                else if((irmp_data.command&0x00FF) == 0x0D)
16
                {
17
                    // Motor links
18
                    PORTD |= (1<<PD6);
19
                    PORTD &= ~(1<<PD5);
20
                }
21
                else
22
                {
23
                    // Motor stop
24
                    PORTD &= ~(1<<PD5);
25
                    PORTD &= ~(1<<PD6);
26
                }
27
            }
28
    }

Jetzt nehme ich die Überprüfung mit rein:
1
while(1)
2
    {
3
        if(irmp_get_data(&irmp_data))
4
        {
5
            if(irmp_data.protocol == IRMP_APPLE_PROTOCOL)
6
            {
7
                // Volume up
8
                if((irmp_data.command&0x00FF) == 0x0B)
9
                {
10
                    // Motor rechts
11
                    PORTD |= (1<<PD5);
12
                    PORTD &= ~(1<<PD6);
13
                }
14
                // Volume down
15
                else if((irmp_data.command&0x00FF) == 0x0D)
16
                {
17
                    // Motor links
18
                    PORTD |= (1<<PD6);
19
                    PORTD &= ~(1<<PD5);
20
                }
21
                else
22
                {
23
                    // Motor stop
24
                    PORTD &= ~(1<<PD5);
25
                    PORTD &= ~(1<<PD6);
26
                }
27
            }
28
        }
29
        else
30
        {
31
            // Motor stop
32
            PORTD &= ~(1<<PD5);
33
            PORTD &= ~(1<<PD6);
34
        }
35
    }

Und nun tut sich garnichts mehr. Habe ich irgendetwas übersehen?

von etMax (Gast)


Angehängte Dateien:

Lesenswert?

Hallo!

Ich stehe grade auf dem Schlauch: Ich versuche, die IRMP mit einem 
Atmega8 zum laufen zu bekommen.

Dazu habe ich einfach das aktuelle release genommen und 2 Zeilen 
eingefügt: der aktuell empfangene Command soll auf PortD ausgegeben 
werden.

Ich habe auf meinem STK600 den PORTD des Atmega8 mit den LEDs verbunden 
und den IR-Decoder an PB6 angeschlossen. Leider bleibt PORTD immer auf 
LOW.

Wenn ich PORTD = PINB; hinzufüge, sehe ich die LED an PD6 blinken, also 
das Signal kommt an.

Vielleicht kann sich das mal jemand anschauen, was das Problem ist? Ich 
hab den Quellcode beigelegt.

Vielen Dank und liebe Grüße,
etMax

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Ephraim Hahn schrieb:
>
1
while(1)
2
>     {
3
>         if(irmp_get_data(&irmp_data))
4
>         {
5
>             ....
6
>         }
7
>         else
8
>         {
9
>             // Motor stop
10
>             PORTD &= ~(1<<PD5);
11
>             PORTD &= ~(1<<PD6);
12
>         }
13
>     }
>
> Und nun tut sich garnichts mehr. Habe ich irgendetwas übersehen?

Ja, hast Du. Schau Dir mal obigen Code genauer an. Wenn irm_get_data() 
NICHTS empfängt, wird der else-Zweig durchlaufen und damit Dein Motor 
gestoppt. Denke daran: irmp_get_data() wartet NICHT. In 99,9995% der 
Zeit wird der else-Zweig durchlaufen und Dein Motor gestoppt.

Wenn Du mal was sendest, springt der Motor kurz an und wird danach 
direkt wieder gestoppt. Das ist so kurz, dass Du das gar nicht siehst.

Daher: Werfe den unteren else-Zweig komplett raus, also lass folgendes 
stehen:
1
   while(1)
2
   {
3
       if(irmp_get_data(&irmp_data))
4
       {
5
           if (...)
6
           {
7
               ...
8
           }
9
           else if (...)
10
           {
11
               ...
12
           }
13
           else // NUR HIER MOTORSTOPP!
14
           {
15
               ...
16
           }
17
       }
18
       // KEIN else!
19
   }

Die Volume-Tasten regeln dann den Links-/Rechtslauf, jede andere 
gedrückte Taste stoppt den Motor. Das ist vermutlich auch das, was Du 
haben möchtest.

Fazit: Wenn NICHTS empfangen wurde, dann auch NICHTS tun.

Gruß,

Frank

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

etMax schrieb:

> Ich stehe grade auf dem Schlauch: Ich versuche, die IRMP mit einem
> Atmega8 zum laufen zu bekommen.

Hast Du die Fuses vom ATmega8 auch so angepasst, dass er mit 8 MHz läuft 
und nicht mit den werksseitig eingestellten 1 MHz?

Schau mal hier:

  http://www.engbedded.com/fusecalc/

Gruß,

Frank

von Ephraim H. (ephi)


Lesenswert?

>
> Die Volume-Tasten regeln dann den Links-/Rechtslauf, jede andere
> gedrückte Taste stoppt den Motor. Das ist vermutlich auch das, was Du
> haben möchtest.
>
> Fazit: Wenn NICHTS empfangen wurde, dann auch NICHTS tun.
>
> Gruß,
>
> Frank

genau dieses Verhalten ergab sich ja bereits aus meiner allerersten 
Version. Was ich aber will, ist, den Motor nur zu bewegen solange die 
entsprechende Volume Taste gedrückt wird. Nun dachte ich, solange ich 
drücke, ist /irmp_get_data()/ positiv und liefert mir in der struct den 
Befehl. Kann es sein, da aber irmp_get_data() wesentlich öfter empfängt, 
als meine apple remote senden kann, und sich dadurch praktisch nichts 
bewegt, da der Motor stoppt, bevor er überhaupt angelaufen ist? In dem 
Fall müsste ich eine Art delay bzw. timeout für einen empfangenen befehl 
integrieren.

von etMax (Gast)


Lesenswert?

Frank M. schrieb:
> etMax schrieb:
>
>> Ich stehe grade auf dem Schlauch: Ich versuche, die IRMP mit einem
>> Atmega8 zum laufen zu bekommen.
>
> Hast Du die Fuses vom ATmega8 auch so angepasst, dass er mit 8 MHz läuft
> und nicht mit den werksseitig eingestellten 1 MHz?
>

Hallo,

ja, meine Fuses stehen auf e4 d9 . F_CPU ist auf 8000000 definiert und 
eine Lampe blinkt auch im Sekundentakt, wenn ich 10 mal 100ms delay 
zwischen den Blinkern mache.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Ephraim Hahn schrieb:
> Kann es sein, da aber irmp_get_data() wesentlich öfter empfängt,
> als meine apple remote senden kann, [...]

Ja, natürlich. Eine FB sendet ca. 10 Frames pro Sekunde. irmp_get_data 
wird aber wesentlich öfter mit FALSE zurückkommen.

Vorschlag der Lösung:

In der timer-ISR einen globalen Zähler hochzählen (static volatile 
uint16_t), diesen in den beiden if-Blöcken, wo Du tatsächlich 
Volume-UP/DOWN empfängst, auf 0 zurücksetzen. Im else-Block prüfen, ob 
ein bestimmer Wert des Zählers überschritten wurde. Dann hast Du Deinen 
Timeout und Du kannst den Motor stoppen.

Gruß,

Frank

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

etMax schrieb:
> ja, meine Fuses stehen auf e4 d9 . F_CPU ist auf 8000000 definiert und
> eine Lampe blinkt auch im Sekundentakt, wenn ich 10 mal 100ms delay
> zwischen den Blinkern mache.

Welche Fernbedienungen hast Du ausprobiert?

Ich sehe, dass Du in irmpconfig.h lediglich die Standsrd-Protokolle 
aktiviert hast, die ich als wichtig empfinde. Aktiviere bitte auch mal 
RC5, RC6, NEC16, NEC42, GRUNDIG, SIEMENS, NOKIA - also alles, was unter 
"more protocols" steht. Die "exotic protocols" lasse erstmal weg.

Gruß,

Frank

von M. K. (kichi)


Lesenswert?

Ich habe mir nicht den ganzen Thread durchgelesen: hat schon jemand das 
Projekt inkl. IRSND auf einen ARM (STM32) portiert?

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Michael K. schrieb:
> Ich habe mir nicht den ganzen Thread durchgelesen: hat schon jemand das
> Projekt inkl. IRSND auf einen ARM (STM32) portiert?

Schau Dir mal Beitrag "Re: IRMP - Infrared Multi Protocol Decoder" an.

von M. K. (kichi)


Lesenswert?

Hast du das implementiert oder muss speziell diese Version genommen 
werden? Und wie steht es mit IRSND?

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Michael K. schrieb:
> Hast du das implementiert oder muss speziell diese Version genommen
> werden? Und wie steht es mit IRSND?

Nein, habe ich nicht implementiert. Aber wenn Du Dir die Unterschiede 
durch Suchen nach IRMP_FLEXIBLE_VERSION anschaust, siehst Du, dass Jan 
neben einigen kosmetischen Sachen (die so für den ARM nicht existieren) 
lediglich das Interface der Funktion irmp_ISR() geändert hat, um den 
IRMP-Source komplett hardwareunabhängig zu machen.

Über den hardware-abhängigen Teil

  1) wie lese ich einen PIN?

  2) wie rufe ich irmp_ISR() 10000 mal (oder 15000 mal) pro Sekunde auf?

schweigen sich seine Source-Änderungen leider aus. Da ich selber mit ARM 
noch nichts gemacht habe, kann ich Dir da auch nicht weiterhelfen. Aber 
eigentlich musst Du nur die beiden obigen Punkte klären, das ist alles. 
Dann kann man das auch in den aktuellen IRMP integrieren.

Punkt 1) ist simpel: Schreibe in irmpconfig.h ein Macro namens input().
Punkt 2) ist auch nicht viel schwieriger: Schreibe eine Funktion 
timer_init() und sorge damit dafür, dass irmp_ISR() 15000 mal pro 
Sekunde aufgerufen wird.

Wie Du siehst, ist das nicht schwierig. Wenn Du Dich einigermaßen mit 
ARM-Programmierung auskennst, solltest Du das hinbekommen. Deine 
Source-Anpasssungen baue ich gern in den IRMP ein.

Gruß,

Frank

von M. K. (kichi)


Lesenswert?

Frank M. schrieb:
> Punkt 1) ist simpel: Schreibe in irmpconfig.h ein Macro namens input().
> Punkt 2) ist auch nicht viel schwieriger: Schreibe eine Funktion
> timer_init() und sorge damit dafür, dass irmp_ISR() 15000 mal pro
> Sekunde aufgerufen wird.
Werde ich tun. Ich komme dann nochmal auf dich zu.

Wie sieht ist es mit der Hardwareunabhängigkeit von IRSND aus? Du nutzt 
doch den Timer 2 dafür, oder?

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Michael K. schrieb:
> Werde ich tun. Ich komme dann nochmal auf dich zu.

Prima, bin gespannt.

> Wie sieht ist es mit der Hardwareunabhängigkeit von IRSND aus? Du nutzt
> doch den Timer 2 dafür, oder?

IRSND benutzt (genauso wie IRMP) einmal den Timer 1 (irsnd_ISR()) und 
zusätzlich den Timer 2 für die Erzeugung der Modulationsfrequenz. Bei 
den ATtinys ist es stattdessen der Timer 0, siehe irsndconfig.h.

Gruß,

Frank

von etMax2 (Gast)


Lesenswert?

Frank M. schrieb:
> Welche Fernbedienungen hast Du ausprobiert?
>
> Ich sehe, dass Du in irmpconfig.h lediglich die Standsrd-Protokolle
> aktiviert hast, die ich als wichtig empfinde. Aktiviere bitte auch mal
> RC5, RC6, NEC16, NEC42, GRUNDIG, SIEMENS, NOKIA - also alles, was unter
> "more protocols" steht. Die "exotic protocols" lasse erstmal weg.

Oh je, ich bin ja ein Idiot...
Ich habe eine RC5-Fernbedienung und war mir sicher, dass RC5 zu den 
Standard-Protokollen gehört...
Danke fürs Drüberschauen, Frank! Jetzt klappt es einwandfrei!

etMax

von Martin (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

ich versuche gerade eine 44-Tasten-RGB-Fernbedienung eines 5m
LED-Streifens am Atmega88 zum laufen zu kriegen, bis jetzt ohne Erfolg. 
Der RGB Streifen wurde
in der Bucht gekauft und beinhaltet bereits einen Controller und eine
Fernbedienung.

Das IR-Protokoll ist das NEC-Protokoll. Im Anhang habe ich das Timing
für die "Rot"-Taste.
In der IRMPconfig.h wurde nur das NEC-Protokoll aktiviert und der Pin 
für den Empfänger auf PB.5 gesetzt.

Der Atmega88 wurde, wie in der main.c beschrieben, für interne 8MHz
gefused. Für die Übertragung der "Rot"-Taste habe ich folgende Werte
erhalten:

Startbit > 0x00 (Adressbyte) > 0xFF (inv. Adressbyte) > 0x1A
(Commandbyte) > 0xE5 (inv. Commandbyte) > Stopbit

Könnt ihr bitte mal über meine Switch-Case-Anweisung drüber schauen, ob
die Abfrage des irmp_data.command richtig ist?
1
int
2
main (void)
3
{
4
    IRMP_DATA irmp_data;
5
6
    irmp_init();                                                            // initialize irmp
7
    timer1_init();                                                          // initialize timer 1
8
    sei ();                                                                 // enable interrupts
9
10
  DDRC |= (1 << DDC1) | (1 << DDC2) | (1<<DDC3);
11
12
    for (;;)
13
    {
14
        if (irmp_get_data (&irmp_data))
15
        {
16
            //if (irmp_data.protocol == IRMP_NEC_PROTOCOL)// &&     // NEC-Protokoll
17
        //irmp_data.address == 0x00FF)                   // Adresse 0x1234
18
        //{
19
          switch (irmp_data.command)
20
          {
21
            case 0x9A65: PORTC|=(1<<PC1); break;          // Taste grün
22
            case 0x18E7: PORTC|=(1<<PC2); break;          // Taste gelb
23
            case 0x1AE5: PORTC|=(1<<PC3); break;          // Taste rot
24
          }
25
  }
26
    }
27
}

Gruß Martin

von Martin (Gast)


Lesenswert?

Jetzt hab ichs. Ich darf nur das 8-Bit-Commandbyte verwenden. Jetzt 
gehts:-) Das IRMP ist ein Spitzenprojekt!!:-) Danke Frank für dieses 
Projekt.

Frohe Ostern

von Ulli -. (ulli2k)


Lesenswert?

Hallo zusammen,

Ich habe die Library IRMP und IRSND schon mit Erfolg auf einem Atmega8
anwenden können. Dafür erstmal ein dickes Lob für die tolle Lib.

Jetzt habe ich nur das Problem, dass ich an dem Atmega8 die SPI
Schnittstelle dringend benötige. Leider liegt der PWM Pin für die IRSND
Funktion auf dem MOSI Pin PB3. Ist es möglich diesen auf den PB1 (OC1A)
zu verschieben um die SPI Schnittstelle zu nutzen?

Seht ihr da eine Möglichkeit?

von Graf-von-Socke (Gast)


Lesenswert?

hallo zusammen
ich möchte gernen meine digicam über infarot ansteuern und habe da 
folgendes gefunden

begin remote

  name  Olympus_RM-1
  bits           16
  flags SPACE_ENC|CONST_LENGTH
  eps            30
  aeps          100

  header       8853  4489
  one           559  1670
  zero          559   555
  ptrail        559
  repeat       8853  2259
  pre_data_bits   16
  pre_data       0x61DC
  gap          107013
  toggle_bit      0


      begin codes
          capture                  0x000000000000807F
          w                        0x00000000000040BF
          t                        0x000000000000C03F
          -                        0x00000000000020DF
          +                        0x000000000000A05F
      end codes

end remote

wie muss ich das nun verstehen und wie muss ich das auf irsend anwenden

mfg

Graf-von-Socke

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Graf-von-Socke schrieb:

> begin remote

Ich vermute mal, dass das eine lirc-Berschreibungsdatei ist? Ich kenne 
mich damit nicht so aus, aber ich versuche mal zu deuten:

>   bits           16

16 Datenbits.

>   header       8853  4489

Das ist ein offenbar vom Timing ein NEC-Startbit, siehe auch:

  http://www.mikrocontroller.net/articles/IRMP#Die_IR-Protokolle_im_Detail

>   one           559  1670
>   zero          559   555

Das sieht ebenso nach NEC-Timing aus.

>   ptrail        559

Könnte das Stoppbit sein.

>   pre_data_bits   16

16 bits vor den Datenbits, scheint die NEC-Adresse zu sein.

>   pre_data       0x61DC

0x61DC ist offenbar die Adresse.

>           capture                  0x000000000000807F
>           w                        0x00000000000040BF
>           t                        0x000000000000C03F
>           -                        0x00000000000020DF
>           +                        0x000000000000A05F

Das scheinen die Kommando-Codes zu sein.

> wie muss ich das nun verstehen und wie muss ich das auf irsend anwenden

Also probiere es mal mit
1
  IRMP_DATA irmp_data;
2
  ...
3
4
  irmp_data.protocol = IRMP_NEC_PROTOCOL;
5
  irmp_data.address  = 0x61DC;       // address of camera
6
  irmp_data.protocol = 0x40BF;       // command "w"
7
  irmp_data.flags    = 0x00;         // reset flags
8
  irsnd_send_data (&irmp_data);      // send data

Gruß,

Frank

von Ulli -. (ulli2k)


Lesenswert?

hat keiner eine Vorstellung, ob man den IRSEND Pin bei einem Atmega8 von 
PB3 auf PB1 ändern kann und wenn ja wie?

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Ulli -- schrieb:
> hat keiner eine Vorstellung, ob man den IRSEND Pin bei einem Atmega8 von
> PB3 auf PB1 ändern kann und wenn ja wie?

IRSND benötigt den Timer1 bereits für das periodische Aufrufen der 
15kHz-ISR. Wenn Du die ISR über einen anderen Timer laufen lässt, kannst 
Du natürlich IRMP anpassen an OC1A (PB1). Dazu musst Du allerdings den 
Code erweitern.

IRMP benutzt den Timer0 bzw. Timer2 zur Erzeugung der 
Modulationsfrequenz per PWM. Der veraltete ATmega8 ist da ziemlich 
beschränkt. Wenn Du ihn gegen den moderneren ATmega88 tauschst, hast Du 
die Wahl zwischen OC2A (PB3) und OC2B (PD3), ohne den IRSND-Code 
erweitern zu müssen.

Gruß,

Frank

von Ulli -. (ulli2k)


Lesenswert?

Frank: D.h. ja, mit einem Atmega8 kann ich IRMP und IRSND nicht 
gleichzeitig mit der SPI Schnittstelle benutzen, da die Timer nicht 
ausreichen? Auch nicht mit Code Erweiterung?

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Ulli -- schrieb:
> Frank: D.h. ja, mit einem Atmega8 kann ich IRMP und IRSND nicht
> gleichzeitig mit der SPI Schnittstelle benutzen, da die Timer nicht
> ausreichen? Auch nicht mit Code Erweiterung?

Mit Code-Erweiterung gehts auch mit einem ATmega8.

Dann benutzt Du halt Timer 0 oder Timer 2 zum Aufruf der ISR mit 15kHz 
und verwendest Timer1 (und damit OC1A = PB1) als Sender-Ausgang. Aber 
die PWM-Routinen für die Modulation des Timer 1 musst Du dann neu 
schreiben, die habe ich nur für Timer 0 oder Timer 2 implementiert.

von eku (Gast)


Lesenswert?

Hallo Frank,

mein IRMP hat NEC, RC5, DENON, NUBERT, GRUNDIG, NOKIA, SIEMENS und FDC 
einkompiliert und tastet mit 15kHz ab. Kürzlich habe ich von Revision 71 
auf 95 aktualisiert und nun funktioniert die Erkennung nicht:

* DENON wird nur noch sporadisch erkannt
* RUWIDO wird erkannt obwohl nicht einkompiliert, z.B. bei DENON 
Signalen
* SIEMENS werden nicht mehr alle Tasten erkannt
* die FB meines SHARP (siehe Beiträge Januar 2011) wird nicht mehr 
erkannt

Meine zugelieferten Scans liegen in IR-Data und ich nehme an, dass Du 
alle
nach Änderungen am Quellcode testest. Anscheinend macht es aber die 
Kombination der aktivierten Protokolle. Welche Deiner Änderungen könnte 
für meine Probleme verantwortlich sein?

Gruß, eku

von Christian R. (idl0r)


Lesenswert?

hm, passt vielleicht nicht ganz zum thema aber trotzdem.. ich habe 
einige schaltungen mit 2 TSOPs gesehen, bringt das tatsaechlich was? 
wenn beide versetzt voneinander angeordnet sind ok.. aber 
ueber/nebeneinander?

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Christian Ruppert schrieb:
> hm, passt vielleicht nicht ganz zum thema aber trotzdem.. ich habe
> einige schaltungen mit 2 TSOPs gesehen, bringt das tatsaechlich was?
> wenn beide versetzt voneinander angeordnet sind ok.. aber
> ueber/nebeneinander?

Vielleicht arbeiten beide mit unterschiedlichen Modulationsfrequenzen?

von jar (Gast)


Lesenswert?

eku schrieb:
> Kürzlich habe ich von Revision 71
> auf 95 aktualisiert und nun funktioniert die Erkennung nicht:
>
> * DENON wird nur noch sporadisch erkannt

so was ähnliches ist mir auch ab und an mal aufgefallen,
habe alles aktiviert was <=15kHz ist und bekam für eine Kaseikyo alles 
von Siemens bis RUWIDO je nach Tastendrück

habe nun wieder die aktuelle in meine SW eingepflegt

 * $Id: irmp.h,v 1.73 2012/02/24 15:00:18 fm Exp $

und prompt kommt wieder der Fehler:
../irmp.h:489:1: warning: "TRUE" redefined

ich mag nun nicht jedesmal suchen wo das herkommt
wäre folgendes nicht sinnvoll ?

#ifndef FALSE
  #define FALSE 0
#endif
#ifndef TRUE
  #define TRUE !FALSE
#endif

hatte ich auch in der letzten eingebauten Version nachgerüstet, aber 
jedesmal nachfummeln ist irgendwie unnötig zeitraubend

von jar (Gast)


Lesenswert?

Korrektur zur Erkennung

umstellen mit rc5_ISR(); nach (void) irmp_ISR();

half für bessere Erkennung

ändert aber nix am redefine TRUE FALSE Problem





  if (! irsnd_ISR())         // call irsnd ISR
  {                          // if not busy...
    (void) irmp_ISR();      // call irmp 3-16µs
    (void) rc5_ISR();      // call rc5 8-10µs
    }

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

eku schrieb:
> mein IRMP hat NEC, RC5, DENON, NUBERT, GRUNDIG, NOKIA, SIEMENS und FDC
> einkompiliert und tastet mit 15kHz ab. Kürzlich habe ich von Revision 71
> auf 95 aktualisiert und nun funktioniert die Erkennung nicht:
>
> * DENON wird nur noch sporadisch erkannt
> * RUWIDO wird erkannt obwohl nicht einkompiliert, z.B. bei DENON
> Signalen
> [...]

Ich habe probeweise IRMP mit obigen Protokollen übersetzt und dann gegen 
IR-Data/denon-15kHz.txt laufen lassen... keine Probleme bei der 
Erkennung.

> Meine zugelieferten Scans liegen in IR-Data und ich nehme an, dass Du
> alle
> nach Änderungen am Quellcode testest.

Ja, ich checke sie immer mit test-suite.sh. Das Script schaltet alle 
Protokolle frei und lässt den generierten IRMP gegen die im Shell-Script 
aufgeführten Scan-Dateien laufen. Nur wenn diese fehlerfrei durchgehen, 
gebe ich eine Version frei. Natürlich ist mit diesem Check lediglich 
eine notwendige Bedingung für Fehlerfreiheit gegeben, aber nicht 
unbedingt eine hinreichende.

> Anscheinend macht es aber die
> Kombination der aktivierten Protokolle. Welche Deiner Änderungen könnte
> für meine Probleme verantwortlich sein?

Keine Ahnung. Nenne mir bitte die Scan-Dateien unter IR-Data, die von 
Dir sind. Dann kann ich diese nochmal gezielt in Deiner Kombination 
testen.

Gruß,

Frank

von finnjet (Gast)


Lesenswert?

Ich stehe zur Zeit vor einem ähnlichen Problem, indem ich für einen 
Kenwood Receiver eine Ansteuerung implementieren möchte.  Es existiert 
eine LIRC Konfiguration, die auch funktioniert:
http://lirc.sourceforge.net/remotes/kenwood/RC-R0813

begin remote

  name  Kenwood_RC-R0813
  bits           24
  flags SPACE_ENC|CONST_LENGTH
  eps            30
  aeps          100

  header       9065  4480
  one           580  1660
  zero          580   550
  ptrail        580
  repeat       9060  2230
  pre_data_bits   8
  pre_data       0x1D
  gap          108434
  toggle_bit      0


      begin codes
        power       0x00B946
        thx         0x8043BC
        listenmodeup 0x00fb04
        listenmodedown 0xe0f807
        activeeq    0x60e21d
        speakereq   0x60926d
        inputmode   0x20f906
        dspmode     0x8030cf
        mute        0x0039c6
        stereo      0x00eb14
        vol+        0x00d926
        vol-        0x0059a6
        setup       0xc09867
        sound       0x80ea15
        up          0x80aa55
        down        0x802ad5
        left        0x4000ff
        right       0x40807f
        tunerev     0x4040bf
        tunefwd     0x40c03f
        flip        0xc0906f
        band        0xc0609f
        inputsel    0xc06a95
        a/b         0x0010ef
        auto        0x4020df
        dimmer      0x40b847
        dvd6ch      0xc001fe
        cd/dvd      0x0049b6
        phono       0x0009f6
        tuner       0x008976
        video1      0x006996
        video2      0x0040bf
        video3      0xc0b847
        md/tape     0x00a956
        avaux       0x00c936
        loudness    0x00fa05
        tone        0x80AB54
        bass        0x40EA15


        1       0x00817E
        2       0x0041be
        3       0x00c13e
        4       0x0021de
        5       0x00a15e
        6       0x00619e
        7       0x00e11e
        8       0x0011ee
        9       0x00916e
        0       0x0001fe
        +10     0x00b04f
        +100    0x40f20d


      end codes

end remote

von finnjet (Gast)


Lesenswert?

...Sorry! ich wollte nicht die ganze Datei posten!

Die Lirc Remote files sind ja sehr hilfreich, leider habe ich bislang 
keine ausführliche Beschreibung des Formats gefunden.

Meine Frage dazu ist folgende: 24 Daten Bits + 8 Pre-data (address?) 
Bits scheint mir ja weder das normale NEC noch NEC48 Protokoll zu sein. 
Die Timings sehen dagegen recht passend aus.

Sehe ich es richtig, dass ich mir hier gewissermaßen ein NEC36 
implementieren muss?

Gruß

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

finnjet schrieb:

> Meine Frage dazu ist folgende: 24 Daten Bits + 8 Pre-data (address?)
> Bits scheint mir ja weder das normale NEC noch NEC48 Protokoll zu sein.
> Die Timings sehen dagegen recht passend aus.

Stimmt, diese sehen tatsächlich passend aus. Schalte einfach 
IRMP_LOGGING in irmpconfig.h ein, scanne die Tasten 0...9 ein und poste 
hier die Text-Datei. Ich baue das Protokoll dann ein. Den Aufbau der 
Scan-Datei siehst Du auch als Beispiele unter IR-Data/*.txt. Kommentare 
mit # eingeleitet wären hilfreich.

Hast Du denn schon mal Deine FB mit IRMP getestet?

Gruß,

Frank

von Hans W. (stampede)


Lesenswert?

Hallo Frank,

ich möchte einfach mal "DANKE" sagen für dieses hervorragende Projekt. 
Gut dokumentiert, innerhalb von 30min in meinen Code eingebunden und für 
den verwendeten PIC32 portiert. Lief auf Anhieb, so soll es sein.

Grüße
Stampede

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Hallo Hans,

Hans W. schrieb:

> ich möchte einfach mal "DANKE" sagen für dieses hervorragende Projekt.
> Gut dokumentiert, innerhalb von 30min in meinen Code eingebunden und für
> den verwendeten PIC32 portiert. Lief auf Anhieb, so soll es sein.

Erstmal Danke fürs "Danke" ;-)

Ist bei Deiner Portierung vielleicht irgendetwas wichtiges, das in den 
allgemeinen Source zurückfließen sollte?

Gruß,

Frank

von jar (Gast)


Lesenswert?

Frank M. schrieb:
> vielleicht irgendetwas wichtiges, das in den
> allgemeinen Source zurückfließen sollte?

möglicherweise in:

irmp.h:489:1: warning: "TRUE" redefined

ich mag nun nicht jedesmal suchen wo das herkommt
wäre folgendes nicht sinnvoll ?

#ifndef FALSE
  #define FALSE 0
#endif
#ifndef TRUE
  #define TRUE !FALSE
#endif

oder lag der Fehler bei mir ?

ansonsten, auch von mir noch mal ein Riesen DANKE

auch wenn ich momentan nicht weiterkomme in der ausschliesslichen 
Nutzung von IRMP allone, in der Verbindung mit "meinen" alten RC5 
Auswertecode tuts ganz hervorragend :-)

alle Versuche das change key bit vom RC5 in IRMP zu generieren sind bis 
jetzt fehlgeschlagen, aber macht nix, irgendwann finde(t) ich (sich) ne 
Lösung
jar

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

jar schrieb:
> möglicherweise in:
>
> irmp.h:489:1: warning: "TRUE" redefined

Es gibt im IRMP-Source ausschließlich diese Stelle. Das redefine ist 
eine Folge einer TRUE-Definition, die aus Deinem Source kommt.

Sagt der Compiler nicht, wo die ursprüngliche Definition steht?

> ich mag nun nicht jedesmal suchen wo das herkommt
> wäre folgendes nicht sinnvoll ?
>
> #ifndef FALSE
>   #define FALSE 0
> #endif
> #ifndef TRUE
>   #define TRUE !FALSE
> #endif

Könnte ich machen, aber theoretisch gibt es ja tausend Möglichkeiten 
solcher Konflikte.

Gruß,

Frank

von jar (Gast)


Lesenswert?

Frank M. schrieb:
> Es gibt im IRMP-Source ausschließlich diese Stelle. Das redefine ist
> eine Folge einer TRUE-Definition, die aus Deinem Source kommt.

die ich bestimmt auch brauche an der Stelle ;-)

klaro um das abzukürzen suche ich alle meine TRUE def und bau das bei 
mir ein

dann muss das in IRMP.H nicht geändert werden, sollte auch klappen 
(hoffe ich)

danke
jar

PS. da IRMP aber immer in andere Projekte integriert wird ist es nicht 
auszuschliessen das man immer wieder drüber stolpert, also so dumm ist 
mein Gedanke nicht das auch in irmp.h einzubauen

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

jar schrieb:
> PS. da IRMP aber immer in andere Projekte integriert wird ist es nicht
> auszuschliessen das man immer wieder drüber stolpert, also so dumm ist
> mein Gedanke nicht das auch in irmp.h einzubauen

Ich habe es jetzt so geändert:
1
#ifndef TRUE
2
#define TRUE                                    1
3
#define FALSE                                   0
4
#endif

Kommt mit dem nächsten Release.

von jar (Gast)


Lesenswert?

Frank M. schrieb:
> #ifndef TRUE
> #define TRUE                                    1
> #define FALSE                                   0
> #endif
>
> Kommt mit dem nächsten Release

Klasse, braucht man nicht mehr zusätzlich Hand anzulegen beim Einbau !

danke
jar

von Sebastian (Gast)


Lesenswert?

Hallo zusammen,

ich hab ja mittlerweile IRMP auf einem PIC16F917 (mit CCS Compiler (auch 
so'n Kandidat für dreckstool.de)) zum laufen bekommen. Der PIC läuft mit 
20Mhz und die ISR mit 9,766kHz. Ich kann also die IR Signale decodieren, 
und die sehen auch plausibel aus. Nun dachte ich, dass das Senden 
deutlich einfacher ist, aber das will einfach nicht laufen. Die 
Schaltung und die Bauteile des Sendezweigs sind nach dem Artikel 
aufgebaut. Ich hab schon folgende Dinge überprüft:
 - 36/38kHz Trägerfrequenz --> gemessen mit Multimeter 35.95/38.15kHz 
duty cycle jeweils 49.6%. Sieht auf'm Scope eigentlich auch gut aus.
 - ein/ausschalten der PWM passt auch
 - ich hab mir das binär Signal zu einem empfangen Kommando mit irsnd 
erzeugt und sende das direkt aus einem Puffer. Der IR-Receiver am PIC 
empfängt auch genau dieselbe Bitfolge.

Bin gerade etwas ratlos. Hat vielleicht noch jemand nen heißen Tipp für 
mich?

Viele Grüße
Sebastian

von Sebastian .. (zahlenfreak)


Lesenswert?

Hallo Frank,

ich hab da ein etwas seltsames Problem mit IRMP:

Die meiste Zeit läuft alles einwandfrei. Nur manchmal kommt es vor, dass 
eine Taste reproduzierbar andere Daten liefert als normalerweise. Das 
hält dann so lange an, bis ich wieder eine andere Taste gedrückt habe, 
danach gehen wieder alle wie gewohnt.

Von dem Fehler sind mehrere (alle?) Tasten meiner FB betroffen.
Der (falsche) Code, den IRMP ausgibt, wenn der Fehler auftritt, scheint 
dann erstmal immer der gleiche zu sein, konnte das aber noch nicht 
verifizieren. Es ist aber auf jeden Fall nicht bei jeder Taste der 
gleiche.

Meine Ferbedienung ist eine DENON RC-176, definitiv aufgetreten ist der 
Bug bei
Protocol 8
Address 4
Command 1E8 und 0E8

Bei anderen Tasten auch, aber da müsste ich die richtigen Codes erst 
wieder raussuchen.

Hatte auch schon überlegt, ob vielleicht die Fernbedienung einen Bug 
hat, aber eine andere mit NEC-protocol zeigt das gleiche Verhalten, wenn 
auch deutlich schwerer zu provozieren.

Ich weiß momentan nicht so recht weiter. In meiner Software hab ich 
nichts gefunden, zumal ich den Bug auch schon in zwei Projekten hatte.

Vielleicht hat hier ja jemand eine Idee, was das sein könnte. Bei Bedarf 
mach ich natürlich gerne noch weitere Versuche.

Viele Grüße,
Sebastian

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Sebastian schrieb:
> ich hab ja mittlerweile IRMP auf einem PIC16F917 (mit CCS Compiler (auch
> so'n Kandidat für dreckstool.de)) zum laufen bekommen. Der PIC läuft mit
> 20Mhz und die ISR mit 9,766kHz. Ich kann also die IR Signale decodieren,
> und die sehen auch plausibel aus.

Welches IR-Protokoll?

> Nun dachte ich, dass das Senden
> deutlich einfacher ist, aber das will einfach nicht laufen. Die
> Schaltung und die Bauteile des Sendezweigs sind nach dem Artikel
> aufgebaut. Ich hab schon folgende Dinge überprüft:
>  - 36/38kHz Trägerfrequenz --> gemessen mit Multimeter 35.95/38.15kHz
> duty cycle jeweils 49.6%. Sieht auf'm Scope eigentlich auch gut aus.
>  - ein/ausschalten der PWM passt auch
>  - ich hab mir das binär Signal zu einem empfangen Kommando mit irsnd
> erzeugt und sende das direkt aus einem Puffer. Der IR-Receiver am PIC
> empfängt auch genau dieselbe Bitfolge.

Es lässt sich mit IRMP auch wieder dekodieren?

Es kann sein, dass der Original-Empfänger vom Timing her empfindlicher 
ist als IRMP, welcher auch noch bei größeren zeitlichen Abweichungen das 
Signal noch erkennt.

Ein IRMP-Scan (siehe auch IR-Data/*.txt) von der Original-FB wäre nicht 
schlecht.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Sebastian ... schrieb:
> ich hab da ein etwas seltsames Problem mit IRMP:
>
> Die meiste Zeit läuft alles einwandfrei. Nur manchmal kommt es vor, dass
> eine Taste reproduzierbar andere Daten liefert als normalerweise.

Wie sehen die Daten bzgl. Protokollnr, Adresse und Kommando-Code vorher 
und nachher aus?

> Das
> hält dann so lange an, bis ich wieder eine andere Taste gedrückt habe,
> danach gehen wieder alle wie gewohnt.

Das hört sich so an, als ob irgendetwas in der Statemachine nicht 
korrekt zurückgesetzt wird.

Hilfreich wäre ein IRMP-Scan mit einer Tastenfolge, wo der Fehler 
auftritt. Dann müsste ich das unter Linux reproduzieren können.

> Meine Ferbedienung ist eine DENON RC-176, definitiv aufgetreten ist der
> Bug bei
> Protocol 8
> Address 4
> Command 1E8 und 0E8

Das oben ist der korrekte? Wie sieht der fehlerhafte Code aus?

> Ich weiß momentan nicht so recht weiter. In meiner Software hab ich
> nichts gefunden, zumal ich den Bug auch schon in zwei Projekten hatte.

Gibt es außer IRMP noch weitere Software-Module, die in beiden Projekten 
stecken?

Ich bräuchte da Scans... sonst kann ich Dir wahrscheinlich nicht helfen.

von Sebastian (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Frank,

anbei die Scans von den beiden Fernbedienungen (Denon RC-1016, Toshiba 
CT-90327). Ich habe mir allerdings selbst eine ISR geschrieben, die die 
Pulslänge misst. Vielleicht fällt dir ja noch was auf.

Viele Grüße
Sebastian

von jar (Gast)


Lesenswert?

Sebastian schrieb:
> Der PIC läuft mit
> 20Mhz und die ISR mit 9,766kHz.

ist unter 10 kHz nicht etwas knapp ?
ich denke IRMP will als minimum 10kHz ?

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Hallo Sebastian,

Sebastian schrieb:

> anbei die Scans von den beiden Fernbedienungen (Denon RC-1016, Toshiba
> CT-90327). Ich habe mir allerdings selbst eine ISR geschrieben, die die
> Pulslänge misst. Vielleicht fällt dir ja noch was auf.

Beide Scans lassen sich einwandfrei decodieren, auch wenn ich sagen 
muss, dass die 9766Hz beim Denon-Protokoll schon arg knapp sind.
1
# ./irmp  <rx_denon_9766Hz.txt
2
-------------------------------------------------------------------
3
#1
4
010001000111100
5
010000111000011 p =  8, a = 0x0008, c = 0x023c, f = 0x00
6
-------------------------------------------------------------------
7
#2
8
010001000111100
9
010000111000011 p =  8, a = 0x0008, c = 0x023c, f = 0x00
10
-------------------------------------------------------------------
11
#3
12
010001000111100
13
010000111000011 p =  8, a = 0x0008, c = 0x023c, f = 0x00
14
-------------------------------------------------------------------
15
#4
16
010001000111100
17
010000111000011 p =  8, a = 0x0008, c = 0x023c, f = 0x00
18
-------------------------------------------------------------------
19
#5
20
010001000111100
21
010000111000011 p =  8, a = 0x0008, c = 0x023c, f = 0x00
22
23
24
# ./irmp-20kHz < rx_test_19990Hz.txt
25
-------------------------------------------------------------------
26
#1 denon vol+
27
010001000111100
28
010000111000011 p =  8, a = 0x0008, c = 0x023c, f = 0x00
29
-------------------------------------------------------------------
30
#2 denon vol+
31
010001000111100
32
010000111000011 p =  8, a = 0x0008, c = 0x023c, f = 0x00
33
-------------------------------------------------------------------
34
#3 denon vol+
35
010001000111100
36
010000111000011 p =  8, a = 0x0008, c = 0x023c, f = 0x00
37
-------------------------------------------------------------------
38
#4 nec vol+
39
00000010111111010101100010100111 p =  2, a = 0xbf40, c = 0x001a, f = 0x00
40
-------------------------------------------------------------------
41
#5 nec vol+
42
00000010111111010101100010100111 p =  2, a = 0xbf40, c = 0x001a, f = 0x00
43
-------------------------------------------------------------------
44
#6 nec vol+
45
00000010111111010101100010100111 p =  2, a = 0xbf40, c = 0x001a, f = 0x00

Zu rx_denon_9766Hz.txt:

Du hast bei #1 bis #5 immer dieselbe Taste gedrückt, oder?

Zu rx_test_19990Hz.txt: auch kein Problem.

Wenn ich Dein vorhergendes Posting richtig verstanden habe, hast Du 
lediglich ein Problem beim Senden dieser Codes mittels IRSND.

Wenn ich den Output von IRSND in den IRMP mittels Unix-Pipe schicke, 
klappt alles sauber:
1
# ./irsnd 8 0008 023c 0 | ./irmp
2
010001000111100
3
010000111000011 p =  8, a = 0x0008, c = 0x023c, f = 0x00
4
5
# ./irsnd-20kHz 8 0008 023c 0 | ./irmp-20kHz
6
010001000111100
7
010000111000011 p =  8, a = 0x0008, c = 0x023c, f = 0x00
8
9
# ./irsnd-20kHz 2 bf40 001a 0 | ./irmp-20kHz
10
00000010111111010101100010100111 p =  2, a = 0xbf40, c = 0x001a, f = 0x00

Vergleich des IRSND-Outputs mit Deiner Text-Datei:
1
# ./irsnd-20kHz 2 bf40 001a 0 
2
000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111000000000001111111111100000000000111111111110000000000011111111111000000000001111111111100000000000111111111110000000000011111111111000000000001111111111111111111111111111111111000000000001111111111100000000000111111111111111111111111111111111100000000000111111111111111111111111111111111100000000000111111111111111111111111111111111100000000000111111111111111111111111111111111100000000000111111111111111111111111111111111100000000000111111111111111111111111111111111100000000000111111111110000000000011111111111111111111111111111111110000000000011111111111000000000001111111111111111111111111111111111000000000001111111111100000000000111111111111111111111111111111111100000000000111111111111111111111111111111111100000000000111111111110000000000011111111111000000000001111111111100000000000111111111111111111111111111111111100000000000111111111110000000000011111111111111111111111111111111110000000000011111111111000000000001111111111100000000000111111111111111111111111111111111100000000000111111111111111111111111111111111100000000000111111111111111111111111111111111100000000000111111111...
3
# tail -1 rx_test_19990Hz.txt
4
000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011111111111111111111111111111111111111111111111111111111111111111111111111111111111111110000000000000111111111100000000000011111111110000000000000111111111100000000000001111111110000000000000111111111100000000000001111111110000000000000111111111111111111111111111111110000000000000111111111100000000000011111111111111111111111111111111100000000000011111111111111111111111111111111000000000000011111111111111111111111111111111000000000000011111111111111111111111111111111000000000000011111111111111111111111111111111000000000000011111111111111111111111111111111000000000000111111111100000000000001111111111111111111111111111111100000000000001111111110000000000000111111111111111111111111111111110000000000000111111111100000000000011111111111111111111111111111111100000000000011111111111111111111111111111111000000000000011111111110000000000000111111111000000000000011111111110000000000000111111111111111111111111111111110000000000001111111111000000000000011111111111111111111111111111111000000000000011111111110000000000001111111111000000000000011111111111111111111111111111111000000000000011111111111111111111111111111111000000000000111111111111111111111111111111111000000000000111111111...

Bis auf minimale, zu vernachlässigende Abweichungen ist der Output 
derselbe.

Kannst Du den IRSND mittels zweitem µC auch scannen?

Gruß,

Frank

von Sebastian (Gast)


Lesenswert?

Hallo Frank,

ja, #1-#5 in rx_denon_9766Hz.txt ist immer dieselbe Taste.

OK, du meinst also, dass das von IRMP decodierte Signal OK ist. Davon 
gehe ich auch aus. Ich verstehe nur nicht, warum das Senden im IRSND 
nicht klappt. Welchen Wert für F_INTERRUPT empfiehlst du für's Senden 
des Denon/Nec Protokoll?

Das Scannen des IRSND Signals über einen 2. µC werde ich die mal 
testen...

Gruß
Sebastian

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Sebastian schrieb:
> OK, du meinst also, dass das von IRMP decodierte Signal OK ist.

Ja.

> Ich verstehe nur nicht, warum das Senden im IRSND
> nicht klappt. Welchen Wert für F_INTERRUPT empfiehlst du für's Senden
> des Denon/Nec Protokoll?

Für das NEC-Protokoll sind 10kHz (oder Deine 9,7kHz) ausreichend. Daher 
sollte Dein Toshiba-Fernseher problemlos klarkommen. Ich habe auch einen 
Toshiba, den ich mit IRSND und 10kHz problemlos bedienen kann.

Bei Denon ist das jedoch kritisch, siehe auch:

  http://www.mikrocontroller.net/articles/IRMP#Pulse-Distance_Protokolle

Auszug für Denon:

In der Praxis (diverse Scans von verschiedenen IRMP-Anwendern) sind es:

0-Bit   310µs Puls, 745µs Pause
1-Bit   310µs Puls, 1780µs Pause

Laut diverser Dokus im Netz sind es jedoch:

0-Bit   275µs Puls, 775µs Pause)
1-Bit   275µs Puls, 1900µs Pause)

Das sind gerade mal 3 Timer-Takte zum Generieren der Pulse. Da könnte 
die Abweichung schon so groß sein, dass der Denon-Empfänger das nicht 
mehr akzeptiert. Bei 15kHz und mehr sollten die Abweichungen wesentlich 
geringer sein.

Ich habe gerade mal Deine 1990er Scans durch den IRMP-Analyzer 
geschickt:
1
pulse avg:  5.7= 284.9 us, min:  5= 250.0 us, max:  7= 350.0 us, tol: 22.8%
2
pause avg: 15.2= 759.8 us, min: 14= 700.0 us, max: 16= 800.0 us, tol:  7.9%
3
pause avg: 35.9=1794.4 us, min: 34=1700.0 us, max: 37=1850.0 us, tol:  5.3%

Die Pulse entsprechen eher den Werten aus der Doku, der Rest eher den 
Erfahrungen, die bisher mit Denon-FBs gemacht wurden.

Du könntest also mal
1
#define DENON_PULSE_TIME                         310.0e-6                       //  310 usec pulse in practice,  275 in theory

in
1
#define DENON_PULSE_TIME                         275.0e-6                       //  310 usec pulse in practice,  275 in theory

ändern. Ich bezweifle aber, dass das was bringt. Irgendetwas anderes ist 
da faul, denn zumindest Dein Toshiba sollte problemlos mit dem 
IRSND-Output klarkommen.

> Das Scannen des IRSND Signals über einen 2. µC werde ich die mal
> testen...

Ja, ich glaube, das bringt uns eher weiter.

Gruß,

Frank

von Sebastian .. (zahlenfreak)


Angehängte Dateien:

Lesenswert?

Hallo Frank,

Vielen Dank schonmal für deine Antwort und sorry, dass ich so lange 
brauche. Ist zur Zeit leider etwas stressig hier.


Hier jetzt also die Ergebnisse:
Drücke ich die unten genannten Tasten oft genug im Wechsel (reichen auch 
zwei davon), wird irgendwann mal eine konsequent falsch erkannt. Auch 
bei mehrmaligem drücken kommt immer der gleiche falsche code bis ich 
wieder eine beliebige andere Taste drücke. Der Falsch erkannte Code ist 
"characteristisch" für die Taste und jedes mal der gleiche, wenn der 
Fehler auftritt.
Der Fehler dürfte ziemlich sicher in IRMP liegen. Habe testweise einen 
Controller nur mit IRMP geflasht. Den Code habe ich nur um eine simple 
UART-routine erweitert, die die erkannten codes ausgibt.
Außerdem ist aufgefallen, dass, wenn der extra eingerichtete Controller 
die codes falsch erkannt hat, ein anderes Projekt gleichzeitig die 
Commandos richtig decodiert. Bei dem anderen Projekt tritt der Fehler 
prinzipiell aber auch auf. Die Fernbedienung kanns also nicht sein. 
Vielleicht noch der Empfänger. Das sind zwei unterschiedliche in den 
beiden Projekten. Wäre aber komisch...

Der fehler tritt auch mit anderen Tasten auf, aber mit diesen habe ichs 
jetzt mal nachvollzogen. Auch mit einer anderen Fernbedienung 
(NEC-protocol) habe ich den Bug schon gehabt, aber wie gesagt kaum 
reproduzierbar.

Anbei sind Scans der vier Tasten mit 20kHz. Sobald ich zeit finde, 
scanne ich auch die ganze Fernbedienung ein, aber jetzt muss ich erstmal 
ins Bett.

Viele Grüße,

Sebastian



Die (vermutlich) Richtigen Codes sind:

Stop-Taste
Protocol 0x08
Address 0x0004
Command 0x01E8


Play >-Taste
Protocol 0x08
Address 0x0004
Command 0x00E8

Pause -Taste
Protocol 0x08
Address 0x0004
Command 0x02E8

Play < -Taste
Protocol 0x08
Address 0x0004
Command 0x03A8




Stop -Taste Falscher Code
Protocol 0x08
Address 0x0004
Command 0x0217

Play > -Taste Falscher Code
Protocol 0x08
Address 0x0004
Command 0x317

Pause -Taste Falscher Code
Protocol 0x08
Address 0x0004
Command 0x0117

Play < -Taste Falscher Code
Protocol 0x08
Address 0x0004
Command 0x0057

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Hallo Sebastian,

Sebastian ... schrieb:
> Drücke ich die unten genannten Tasten oft genug im Wechsel (reichen auch
> zwei davon), wird irgendwann mal eine konsequent falsch erkannt. Auch
> bei mehrmaligem drücken kommt immer der gleiche falsche code bis ich
> wieder eine beliebige andere Taste drücke.
>

Ich glaube zu verstehen, was da falsch läuft. Das Denon-Protokoll 
schickt jeden Frame zweimal raus, wobei beim zweiten mal die 
Command-Bits invertiert sind. Zwischen diesen beiden Frames ist eine 
Pause von 65ms.

IRMP wartet immer den 2. Frame ab und vergleicht die Command-Bits, ob 
sie invertiert sind. Soweit okay, aber: Bekommt IRMP mal den ersten 
Frame nicht richtig mit, klinkt er sich beim 2. Frame ein und wartet 
dann auf den vermeintlichen 2. Frame mit invertierten Bits. Drückst Du 
die Taste dann nochmal, nimmt er den 1. Original-Frame als invertierten 
Frame auf und bestätigt diesen als vermeintlich richtigen Code. Aus 
diesem "falschen Takt" kommt IRMP nur wieder raus, wenn irgendwann 
wieder eine Übertragunsstörung auftritt.

Diesen Fehler kann man hier auch gut erkennen:

> Die (vermutlich) Richtigen Codes sind: [...]
> Command 0x01E8
> Stop -Taste Falscher Code [...]
> Command 0x0217

0x01E8 = 01 1110 1000
0x0217 = 10 0001 0111

Man sieht, dass hier alle 10 Bits gekippt sind. Das gleiche gilt auch 
für die anderen Kommando-Codes, die Du genannt hast.

Um diesen Fehler zu beheben, muss ich eine Abbruchbedingung in IRMP 
einbauen, wie lange er auf den 2. Frame warten soll. Ist die Zeit 
wesentlich größer als 65ms, sollte IRMP den empfangenen Frame einfach 
verwerfen und wieder "von vorn" anfangen.

> Anbei sind Scans der vier Tasten mit 20kHz.

Danke. Aus irgendeinem Grunde kommt der IRMP mit den Scans nicht ganz 
klar. Er erkennt zwar Denon, bricht aber dann irgendwann die Decodierung 
ab. Das schaue ich mir nochmal genauer an, kann sein, dass bei 20kHz der 
Log-Buffer überläuft und die Scans nicht lang genug sind für 2 Frames.

Warum verwendest Du 20kHz und nicht 15kHz?

Gruß,

Frank

von Sebastian .. (zahlenfreak)


Angehängte Dateien:

Lesenswert?

Hallo Frank,

das klingt ja schonmal sehr gut!


Das mit den Scans scheint meine Schuld bzw die der Fernbedienung zu 
sein. Das dürften unvollständige Kommandos sein. Sorry dafür.
Kam so, dass ich wiederholungen vermeiden wollte, also möglichst kurz 
gedrückt hab. Aber die FB scheint die Übertragung wieder abzubrechen, 
wenn man zu kurz drückt. Jedenfalls Reagieren ein IRMP-Projekt und der 
original-Verstärker nur, wenn ich die Taste etwas länger drücke. Dann 
sind auch die scans des gleichzeitig laufenden Scan-IRMPs länger.

Anbei jetzt also ein Komplettscan der FB mit ein wenig längerem 
Tastendruck. Und mit 15kHz.
Die 20kHz kamen übrigens aus der überlegung "viel hilft viel" ;) Das 
Verhalten mit kurzen und langen scans hab ich aber bei 15 und 20 kHz 
gleichermaßen.


Viele Grüße,

Sebastian

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Hallo Sebastian,

Sebastian ... schrieb:

> Anbei jetzt also ein Komplettscan der FB mit ein wenig längerem
> Tastendruck. Und mit 15kHz.

Nachdem ich alle Kommentarzeilen mit "#" auch als solche gekennzeichnet 
und in irmp.c die Zeile
1
#define DENON_PULSE_LEN_MAX                     ((uint8_t)(F_INTERRUPTS * DENON_PULSE_TIME * MAX_TOLERANCE_10 + 0.5) + 1)

in
1
#define DENON_PULSE_LEN_MAX                     ((uint8_t)(F_INTERRUPTS * DENON_PULSE_TIME * MAX_TOLERANCE_20 + 0.5) + 1)

geändert habe, ging der Scan einwandfrei durch.

Deine FB scheint außergewöhnlich lange Pulse zu machen. Ich empfehle Dir 
daher, die Toleranz in irmp.c auf 20% zu erhöhen - so wie oben 
geschrieben. Ich werde das ebenso ins nächste Release einbauen.

Mittlerweile habe ich eine Abbruchbedingung in der IRMP-Statemachine 
eingebaut, damit die invertierten Frames beim Denon-Protokoll nicht als 
Initial-Frames erkannt werden. Funktioniert soweit mit künstlich 
generierten "fehlerhaften" Scan-Dateien tadellos. Desweiteren habe ich 
das Denon-Timing im IRSND auch verbessern können, so dass das Verhalten 
(nach 65ms kommt der invertierte Frame) nun exakt nachgebildet wird.

Damit sollten Deine Probleme erledigt sein. Das neue Release kommt in 
Kürze.

Viele Grüße,

Frank

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Es steht eine neue Version 2.2.0 von IRMP + IRSND zum Download bereit.

Download über Artikel:

   http://www.mikrocontroller.net/articles/IRMP#Download
   http://www.mikrocontroller.net/articles/IRMP#Download_IRSND

und auch übers SVN möglich:

   http://www.mikrocontroller.net/svnbrowser/irmp/

Die wichtigsten Änderungen IRMP:

    - Portierung auf ARM STM32
    - Bugfix Frame-Erkennung beim Denon-Protokoll

Die wichtigsten Änderungen IRSND:

    - Portierung auf ARM STM32 (ungetestet!)
    - Bugfix Timing für 2. Frame beim Denon-Protokoll

Da IRMP/IRSND nun auf den Zielsystemen AVR/PIC/STM32 läuft, war eine 
größere Umstrukturierung des Sources notwendig, um weiterhin die 
Konfigurationsdateien irmpconfig.h und irsndconfig.h möglichst einfach 
und übersichtlich zu belassen.

Die IR-Protokoll-spezifischen Definitionen haben dafür eine neue 
Include-Datei irmpprotocols erhalten. Ebenso sind die für die 
verschiedenen Zielsysteme notwendigen Konstanten in die neue Datei 
irmpsystem.h gewandert.

Anzupassen ist weiterhin lediglich eine Datei, nämlich irmpconfig.h bzw. 
irsndconfig.h.

Achja, noch eine Kleinigkeit: Der Applikationssource darf nun nur noch 
irmp.h bzw. irsnd.h per Include einfügen. Alle anderen notwendigen 
H-Dateien werden automatisch von irmp.h bzw. irsnd.h per Include 
eingefügt.

Also:
1
#include "irmp.h"
2
3
main ()
4
{
5
  ....
6
}

Siehe auch die dazugehörigen Beispiel-Dateien main.c bzw. irsndmain.c.

Sämtliche Änderungen und neue Dateien wurden auch im Artikel IRMP 
dokumentiert bzw. aktualisiert.

Vielen Dank an kichi (Michael K.) für seine unermüdliche Arbeit an der 
STM32-Portierung.

Wünsche viel Spaß,

Frank

P.S.
@Sebastian: Mit diesem Release sollten Deine Probleme mit dem 
Denon-Protokoll behoben sein.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Hallo zusammen,

ein paar Bugs wurden in der STM32-Portierung gefunden und behoben. Im 
SVN unter

   http://www.mikrocontroller.net/svnbrowser/irmp/

ist daher jetzt die Version 2.2.1 eingecheckt.

Die Änderungen betreffen nur die STM32-Variante. Für AVRs und PICs hat 
sich gegenüber 2.2.0 nichts geändert. Sobald die Tests von IRSND unter 
STM32 abgeschlossen sind, wird es auch neue Zip-Dateien direkt zum 
Download aus dem IRMP-Artikel geben.

Viele Grüße,

Frank

von Hugo P. (portisch)


Lesenswert?

Hallo!

Ich habe mal eine kleine Zwischenfrage:
Ich wollte nun den USB IR Remote Receiver updaten.

Nun darf ja nurmehr die "irmp.h" ins Projekt eingebunden werden.
Leider kann aber der Compiler (AVR Studio 5) die Defines von der 
"irmpconfig.h" nicht mehr lesen.

Ich habe z.B. in der "configUSBIRRemoteReceiver.h" ein:
#if IRMP_LOGGING == 1
drinnen.

Das ist aber nun immer 0 weil die irmpconfig.h nicht mehr eingebunden 
ist.
Was gibt es da für einen Trick um das wieder hinzubekommen?

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Hallo Hugo,

Hugo Portisch schrieb:

> Nun darf ja nurmehr die "irmp.h" ins Projekt eingebunden werden.
> Leider kann aber der Compiler (AVR Studio 5) die Defines von der
> "irmpconfig.h" nicht mehr lesen.

Kann ich mir überhaupt nicht erklären, denn in irmp.h steht nun
das

  #include irmpconfig.h

drin.

Das heisst, irmpconfig.h wird eingebunden und dadurch auch z.B. 
IRMP_LOGGING definiert.

> Ich habe z.B. in der "configUSBIRRemoteReceiver.h" ein:
> #if IRMP_LOGGING == 1
> drinnen.

Sollte ganz normal (also wie immer) gehen.

Ich habe gerade mal testweise in das Beispiel-main.c von IRMP eingefügt:
1
#if IRMP_LOGGING == 1
2
xxxxxx
3
#endif

und IRMP_LOGGING auf 1 in irmpconfig.h gestellt.

Beim Neucompilieren bekomme ich sofort den (gewünschten) Syntax-Error 
als Indikator, dass IRMP_LOGGING den korrekten Wert hat.

> Das ist aber nun immer 0 weil die irmpconfig.h nicht mehr eingebunden
> ist.

Doch, wird sie - über irmp.h

> Was gibt es da für einen Trick um das wieder hinzubekommen?

Es ist eigentlich kein Trick notwendig, siehe oben.

Kann es sein, dass Dein Compiler nicht bemerkt, dass Du irmpconfig.h 
geändert hast und er deshalb Dein main-Modul nicht neu übersetzt? Du 
solltest auf jeden Fall irmpconfig.h mit in Dein Projekt einfügen. Sonst 
fehlt die Abhängigkeit und die entsprechenden C-Sources werden nicht neu 
übersetzt, wenn Du irmpconfig.h änderst.

Im Notfall hilft auch eine Neuübersetzung des kompletten Codes.

Gruß,

Frank

von Sebastian .. (zahlenfreak)


Lesenswert?

Hallo Frank,

schonmal vielen vielen Dank für den schnellen Bugfix! So guten Support 
sieht man selten. Leider kam das Update genau zu meiner Abreise in den 
Urlaub, ich konnte also noch nichts testen. Sobald ich zurück bin werde 
ich aber die neue Version ausprobieren und berichten.


Viele Grüße,

Sebastian

von Dirk W. (glotzi)


Lesenswert?

Hallo,

die Merlin Tastatur von Pollin scheint wohl doch mit IRMP zu 
funktionieren: man muss nur den richtigen TSOP benutzen und das RUWIDO 
Protokoll enablen.

So stehts zumindest hier:
http://www.easyvdr-forum.de/forum/index.php?topic=13723.msg118182#msg118182

Allerdings geht dann wohl nur noch die Merlin. Hat jemand ne Idee wie 
man das etwas allgemeingültiger hinbekommt?

von Martin S. (drunkenmunky)


Lesenswert?

Kann mir jemand gerade sagen, wie groß der Flash von einem PIC18 sein 
muss, wenn mal alle Protokolle aktivieren will? Bin gerade am Controller 
auswählen und es wär super, wenn das jemand auf die Schnelle weiß.

Danke,
Gruß

von jar (Gast)


Lesenswert?

den PIC kenne ich nicht, der Atmel braucht ca. 8k

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Dirk W. schrieb:
> die Merlin Tastatur von Pollin scheint wohl doch mit IRMP zu
> funktionieren: man muss nur den richtigen TSOP benutzen und das RUWIDO
> Protokoll enablen.
>
> So stehts zumindest hier:
> http://www.easyvdr-forum.de/forum/index.php?topic=13723.msg118182#msg118182

Die Merlin-Tastatur scheint eine Modulationsfrequenz von 56kHz zu 
benötigen. Damit sind die anderen Protokolle, die meist nah bei 38kHz 
arbeiten, gar nicht mehr oder nur schwach zu empfangen.

> Allerdings geht dann wohl nur noch die Merlin. Hat jemand ne Idee wie
> man das etwas allgemeingültiger hinbekommt?

Schließe einfach zwei TSOPs an zwei verschiedene Pins desselben Ports 
des µCs an: einen mit 56kHz, den anderen mit 38kHz. Passe dann das 
input()-Makro (im neuesten Source ist das in irmp.h, früher in 
irmpconfig.h) dermaßen an, dass beide TSOPs eingelesen werden und 
verknüpfe beide Signale.

Alternativ könnte man die TSOP-Ausgänge mit einem AND-Gatter verbinden 
und dann den Ausgang des Gatters an den µC anschließen.

Beispiel:

irmpconfig.h
1
#  define IRMP_PORT_LETTER                      B
2
#  define IRMP_BIT_NUMBER_1                     6
3
#  define IRMP_BIT_NUMBER_2                     5

irmp.h:
1
#  define IRMP_BIT_1                            IRMP_BIT_NUMBER_1
2
#  define IRMP_BIT_2                            IRMP_BIT_NUMBER_2
3
4
#  define input(x)                              ((x) & ((1 << IRMP_BIT_1) | (1 << IRMP_BIT_2)) == ((1 << IRMP_BIT_1) | (1 << IRMP_BIT_2)))

Wenn einer der beiden TSOPs das Ausgangssignal auf LOW (TSOPs sind 
active low!) zieht, wird input(x) eine 0 liefern - wie gewünscht.

Gruß,

Frank

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Martin S. schrieb:
> Kann mir jemand gerade sagen, wie groß der Flash von einem PIC18 sein
> muss, wenn mal alle Protokolle aktivieren will?

Alle Protokolle zu aktivieren ist nicht unbedingt sinnvoll. Die als 
"exotic protocols" in irmpconfig.h angegebenen Protokolle würde ich nur 
dann aktivieren, wenn man sie explizit braucht. Zudem wirst Du einen 
Konflikt bekommen, wenn Du DENON und RUWIDO gleichzeitig aktivierst, da 
man beide Protokolle nicht so einfach auseinanderhalten kann. Das Timing 
ist einfach zu ähnlich. Ausserdem ist es Quatsch, wenn man das 
Bang&Olufsen-Protokoll aktiviert, was einen TSOP mit 455 kHz erfordert, 
wobei die meisten anderen Protokolle mit 38kHz arbeiten. Man wird da mit 
nur einem TSOP nicht alles empfangen können.

> Bin gerade am Controller
> auswählen und es wär super, wenn das jemand auf die Schnelle weiß.

Ich kann es nur für den AVR angeben. Wenn man alle Protokolle aktiviert, 
aber die "exotischen" weglässt (s.o.), dann sind es bei einem ATmega88 
4420 Bytes fürs Flash.

Gruß,

Frank

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

jar schrieb:
> den PIC kenne ich nicht, der Atmel braucht ca. 8k

Das ist Unsinn. Theoretisch sind es 6,5k (alle 30 Protokolle aktiviert), 
tatsächlich sind es aber nur 4,5k - siehe dazu mein vorheriges 
Statement.

von jar (Gast)


Lesenswert?

Frank M. schrieb:
> Das ist Unsinn

OK, ich hatte nur mal deine flash Verbräuche addiert

natürlich machen alle zusammen akktiviert so keinen Sin 455kHz und 56kHz 
aber wir lernen ja dazu, für einen IR Tester haben sehr wohl alle 
aktiviert Sinn, Ausnahme die "faule" Frequenzen

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

jar schrieb:
> OK, ich hatte nur mal deine flash Verbräuche addiert

Das sind nur ungefähre Angaben. Je nach Kombination der aktivierten 
Protokolle können es auch weniger "verbrauchte" Bytes sein, da einige 
Protokolle gemeinsamen Code verwenden. Hat man z.B. schon mal ein 
Protokoll mit Manchester-Codierung ausgewählt, verbraucht ein zweites 
Manchester-Protokoll evtl. weniger als angegeben.

Gruß,

Frank

von Martin S. (drunkenmunky)


Lesenswert?

Ok danke, das hilft mir schon mal weiter.

Hätte noch ein paar Fragen...

Mit welchen Strom muss man die IR LED ungefähr betreiben, damit man eine 
"gute" Übertragung erhält (also nicht nur direkt, sondern auch über 
Reflektionen durch Wände)?

Sollte die Strahlungsleistung der LED so hoch wie möglich sein? Da 
gibt's ja welche von 1 mW/sr bis über 100 mW/sr.

Habt ihr Erfahrungen mit verschiedenen Abstrahlwinkeln der LEDs gemacht?

Was empfehlt ihr für eine "universelle" Empfängerfrequenz? Wo gibt es 
denn bezahlbare 455 kHz Empfänger?

Sehe ich das richtig, dass man für den Empänger jeden beliebigen 
digitalen Eingang nehmen kann? Und für die LED einen 
Hardware-PWM-Ausgang?

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Martin S. schrieb:
> Mit welchen Strom muss man die IR LED ungefähr betreiben, damit man eine
> "gute" Übertragung erhält (also nicht nur direkt, sondern auch über
> Reflektionen durch Wände)?

Soviel, wie die IR-LED an Strom verkraftet. Das Datenblatt zur LED 
sollte Auskunft geben. Da IRSND die LED ja nicht mit einem Konstantstrom 
versorgt, sondern wegen der Modulation (und auch wegen des 
IR-Protokolls!) nur immer eine Teilzeit wirklich "an" ist, darf der 
Strom 2-3 mal höher als der typische Konstantstrom sein - vorausgesetzt, 
die LED verkraftet solche "Pulse" auch. Das steht aber auch 
normalerweise im Datenblatt.

> Sollte die Strahlungsleistung der LED so hoch wie möglich sein? Da
> gibt's ja welche von 1 mW/sr bis über 100 mW/sr.

Kommt drauf an, wieviele Meter Du überbrücken willst. ;-)

> Habt ihr Erfahrungen mit verschiedenen Abstrahlwinkeln der LEDs gemacht?

Ich habe nur die IRMP-Artikel erwähnte SFH409 (3mm IR-LED) getestet. Da 
muss man schon ziemlich genau zielen - gerade, wenn man auch keinen 
Reflexionsspiegel hinter der LED hat. Je größer der Abstrahlwinkel, 
desto besser. Allerdings dürfte da die Reichweite schlechter werden.

> Was empfehlt ihr für eine "universelle" Empfängerfrequenz?

Mit 38kHz für den TSOP emfängst Du so alles zwischen 36 und 40kHz. Damit 
bist Du gut dabei.

> Wo gibt es denn bezahlbare 455 kHz Empfänger?

Google mal nach TSOP7000. Hier ein Treffer:

  http://www.mara-elektronik.de/TSOP7000

Fragt sich nur, ob 4,50 EUR für Dich bezahlbar heisst.

> Sehe ich das richtig, dass man für den Empänger jeden beliebigen
> digitalen Eingang nehmen kann?

Ja.

> Und für die LED einen Hardware-PWM-Ausgang?

Ja, vorzugsweise einer, der in irsndconfig.h in den Kommentaren 
angegeben ist.


Gruß,

Frank

von Martin S. (drunkenmunky)


Lesenswert?

Danke für schnelle und ausführliche Antwort!

Das Einschaltverhältnis der schnellen PWM Frequenz ist 50%, oder? Um es 
genau zu berechnen, darf der Effektivwert des Diodenstroms nicht größer 
sein als der konstant Zugelassene (oder der arithmetische Mittelwert?)? 
Klar, der hängt dann noch vom verwendeten Protokoll ab.

D.h. du betreibst die LED mit 200 bis 300mA? Das erzeugt ja dann ne 
Menge Verlustleistung im Vorwiderstand.

Betreibst du die LED dann mit der gleichen Spannung wie den uC? Kann das 
zu Problemen führen?

von Fridolin O. (muebau)


Lesenswert?

Hi,
ich betreibe IRMP mit der MERLIN Tastatur:
http://www.easyvdr-forum.de/forum/index.php?topic=13723.msg118182#msg118182

Nun zeigt sich nach den ersten Versuchen aber das die Erkennungsrate 
recht schlecht ist. Ich bekomme eine Mischung von RUWIDO (23) und 
SIEMENS (17). Aktiviert habe ich nur RUWIDO. Meine 
"MediaMall"-Fernbedienung (RUWIDO) funktioniert einwandfrei.

Was sollte ich nun versuchen?

muebau

von Klaus L. (Gast)


Lesenswert?

Martin S. schrieb:
> Was empfehlt ihr für eine "universelle" Empfängerfrequenz? Wo gibt es
> denn bezahlbare 455 kHz Empfänger?

Darisus hat wohl auch noch welche:
http://darisusgmbh.de/shop/product_info.php/info/p34359_TSOP7000-----Miniatur-Infrarotempf-nger-455kHz.html

Grüße,
Klaus

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Fridolin Onteca schrieb:
> Hi,
> ich betreibe IRMP mit der MERLIN Tastatur:
> http://www.easyvdr-forum.de/forum/index.php?topic=13723.msg118182#msg118182
>
> Nun zeigt sich nach den ersten Versuchen aber das die Erkennungsrate
> recht schlecht ist. Ich bekomme eine Mischung von RUWIDO (23) und
> SIEMENS (17). Aktiviert habe ich nur RUWIDO. Meine
> "MediaMall"-Fernbedienung (RUWIDO) funktioniert einwandfrei.

Die Merlin-Tastatur wird von IRMP nur schlecht bis gar nicht 
unterstützt. Vielleicht ist dieses Programm besser für Dich geeignet:

  Beitrag "AVR ATmega48 RUWIDO Merlin IR Keyboard Dekoder (Pinchange Interrupt basiert)"

Günter hat seine spezielle Lösung für die Merlin-Tastatur an IRMP stark 
angelehnt.

Vielleicht implementiere ich irgendwann eine saubere Erkennung für die 
Merlin-Tastatur im IRMP. Bis dahin kann ich nur auf Günters Programm 
verweisen.

Viele Grüße,

Frank

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Neue Version 2.2.2 von IRMP + IRSND:

Download über Artikel:

   http://www.mikrocontroller.net/articles/IRMP#Download
   http://www.mikrocontroller.net/articles/IRMP#Download_IRSND

und auch übers SVN möglich:

   http://www.mikrocontroller.net/svnbrowser/irmp/

Die wichtigsten Änderungen IRMP:

    - Portierung auf ARM STM32 abgeschlossen
    - Include-Korrektur in irmpextlog.c
    - Bugfix, wenn nur NEC und NEC42 aktiviert

Die wichtigsten Änderungen IRSND:

    - Portierung auf ARM STM32 abgeschlossen

Viel Spaß mit IRMP,

Frank

von Christoph (Gast)


Lesenswert?

@Frank M.

Gibt es etwas neues zum Thema Dreambox ?


Gruß Christoph

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Christoph schrieb:
> Gibt es etwas neues zum Thema Dreambox ?

Sorry, neín. Mache ich vielleicht nächste Woche.

Gruß,

Frank

von Sebastian .. (zahlenfreak)


Lesenswert?

Hallo Frank,

ich bin jetzt endlich auch mal dazu gekommen, den Denon Bugfix zu testen 
(Version 2.2.2). Sorry, dass es so lange gedauert hat.
Hin und wieder wird noch ein Tastendruck falsch erkannt und der falsche 
Code zurückgeliefert. Aber so wie ich dich verstanden habe, lässt sich 
das nicht beheben. Ist auch nicht so schlimm.
Aber IRMP bleibt auf jeden Fall nicht mehr bei dem falschen Code hängen. 
Funktioniert in der Hinsicht jetzt einwandfrei. Das ist sehr gut.
Vielen Dank für deine tolle und Arbeit und den schnellen Bugfix!

Viele Grüße,
Sebastian

von Sebastian (Gast)


Lesenswert?

Frank M. schrieb:
>> Das Scannen des IRSND Signals über einen 2. µC werde ich die mal
>
>> testen...
>
>
>
> Ja, ich glaube, das bringt uns eher weiter.

Hallo Frank,

bin leider erst jetzt wieder dazu gekommen, mich mit dem Projekt zu 
beschäftigen. Mittlerweile habe ich auch gute Nachrichten. Nachdem ich 
spontan noch an ein Speicher Oszi gekommen bin, konnte ich mir die 
Signale von der FB und das vom PIC gesendete Signal mal am IR Receiver 
anschauen und musste feststellen, dass die Abweichung der beiden Signale 
bei 1-10µs lag. Um's kurz zu machen, es lag einfach am Winkel, aus dem 
ich zum TV/Receiver gesendet hab. Mit der Original FB ging das zwar, 
aber nicht mit dem PIC. Hätte ich mal lieber gleich ein längeres Kabel 
für die IR Diode genommen, dann hätte ich uns ne Menge Zeit/Nerven 
gespart. Aber nochmal vielen vielen Dank für deine Unterstützung.

Gruß
Sebastian

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Sebastian schrieb:
> Hätte ich mal lieber gleich ein längeres Kabel
> für die IR Diode genommen, dann hätte ich uns ne Menge Zeit/Nerven
> gespart.

Welchen Basiswiderstand verwendest Du am Transistor vor der IR-Diode? 
Ich bin erst kürzlich darauf gekommen, dass 4,7K (so wie im IRMP-Artikel 
im Schaltbild zu sehen) eventuell etwas hoch sind. Vielleicht wäre 1K 
besser, um so die Reichweite zu erhöhen.

Gruß,

Frank

von Phil M. (Gast)


Angehängte Dateien:

Lesenswert?

Hey Community,

Bin vor Kurzem auf IRMP gestoßen, sofort alle Bauteile besorgt und aufs 
Steckbrett gepackt!
Super Arbeit! Nur leider will das ganze nicht bei mir ;-)
Verwende einen atmega168, einen TSOP 4836 und 2x 10 µF Elkos in Reihe, 
somit 5µF.
Habe durch LED Test herausgefunden, dass irmp_get_data immer 0 
zurückliefert, also kein Protokoll erkannt wird...
Ich habe es mit ner Sony, Bose, Epson und Telsky Fernbedienung 
probiert... leider alles tot.
Habe zusätzlich jetzt UART_Logging eingeschaltet, (vorher mit Testcode 
geguckt, ob die Verbindung funktioniert) nur leider liefert dieser in 
sehr unregelmäßigen Abständen (ca. 30 sek bis 1 min.) "trash". Bild habe 
ich angefügt.
UART derzeit nur mit Epson und Telsky probiert, jedoch schreibt er gar 
nichts an den PC, wenn man Tasten drückt, sondern einfach so 
zwischendurch.

Würde mich sehr über eine Antwort freuen!!
Vielen Dank
Gruß Phil

von Michael H. (michael_h45)


Lesenswert?

Phil M. schrieb:
> Elkos in Reihe
Wirklich? In Reihe?


CLKDIV8 Fuse?

von Phil M. (Gast)


Lesenswert?

Hey Michael,

Ich wollte eigentlich heute die passenden 4.7 uF Elkos holen, hab mich 
aber leider vergriffen und 47 uF geholt... solange verwende ich 2 Elkos 
10uF in Reihe, um die Kapazität zu halbieren. Ist da ein Denkfehler?

CLKDIV8 Fuse ist nicht gesetzt, ich habe einen externen 16 MHz Quarz mit 
22pF Kondensatoren als Taktgeber, mit derselben Schaltung funktioniert 
ja auch der UART Testcode, somit kann es schlecht am Timing liegen.

Ich habe in dem IRMP Code nur einen Hinweis auf 9600 Baud gefunden, 
nichts über Stop Bit und co.
Deshalb habe ich standartmäßig 1 stop bit, no parity und no flow control 
gewählt... ist das richtig?

Außerdem habe ich noch über den includes in der main.c die Taktfrequenz 
mit F_CPU 16000000UL angegeben.

Vielen Dank für die überaus schnelle Antwort!
Gruß Phil

von Michael H. (michael_h45)


Lesenswert?

Phil M. schrieb:
> 10uF in Reihe, um die Kapazität zu halbieren. Ist da ein Denkfehler?
Aah, alles klar! Ich dachte, du hättest die in Reihe zur Versorgung!
Du kannst auch 47uF parallel schalten, das ist überhaupt kein Problem - 
im Gegenteil, es verbessert die Tiefpass- und Versorgungscharakteristig.
Die 4,7uF aus einem Datenblatt sind ein Minimalwert oder Richtangabe.

> ja auch der UART Testcode, somit kann es schlecht am Timing liegen.
stimmt.

> Deshalb habe ich standartmäßig 1 stop bit, no parity und no flow control
> gewählt... ist das richtig?
ja.

> Außerdem habe ich noch über den includes in der main.c die Taktfrequenz
> mit F_CPU 16000000UL angegeben.
Ob das UL-aftertag nötig ist, oder nicht, kann ich dir auf die Schnelle 
nicht sagen. Aber probiers doch mal ohne aus.


Kriegst du warnings beim Compilerlauf?

von Phil M. (Gast)


Lesenswert?

Ich bekomme Warnings vom Compiler, wenn ich die F_CPU nicht einfüge.
Dann meckert nämlich delay.h (die ich im projekt nirgendwo gebraucht 
sehe), dass kein Takt angegeben ist und nimmt dann 1 MHz.
Deshalb habe ich das gleich eingefügt
Sonst keine weiteren Warnings!
PS: Mit den 47 uF wirds derzeit auch noch nicht besser ;-)

Gruß Phil

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Phil M. schrieb:

> Verwende einen atmega168, einen TSOP 4836 und 2x 10 µF Elkos in Reihe,
> somit 5µF.

Sind auch 100nF zwischen Vcc und GND bzw. zwischen AVcc und GND?

Kommt dieser "Trash" einfach so? Oder wenn Du auf eine Taste der 
Fernbedienung drückst

> UART derzeit nur mit Epson und Telsky probiert, jedoch schreibt er gar
> nichts an den PC, wenn man Tasten drückt, sondern einfach so
> zwischendurch.

Zeige bitte Dein Programm und sämtliche Fuse-Einstellungen. Das sieht 
für mich so aus, als ob der µC nicht mit den gewünschten 16MHz läuft.

Phil M. schrieb:
> Ich bekomme Warnings vom Compiler, wenn ich die F_CPU nicht einfüge.

Sorge dafür, dass F_CPU in allen .c-Dateien zur Verfügung steht. Das 
geht am einfachsten, wenn Du F_CPU in Deiner IDE einstellst bzw. Du 
F_CPU im Makefile angibst.

Gruß,

Frank

von Phil M. (Gast)


Angehängte Dateien:

Lesenswert?

Frank M. schrieb:
> Sind auch 100nF zwischen Vcc und GND bzw. zwischen AVcc und GND?

Die Entstörkondensatoren sind vorhanden.

Frank M. schrieb:
> Kommt dieser "Trash" einfach so? Oder wenn Du auf eine Taste der
> Fernbedienung drückst

Dieser "Trash" kam bei den ersten 2 Testläufen unabhängig von der 
Fernbedienung. Hatte das Logging nebenher laufen und auf einmal tauchte 
es auf...danach habe ich es gar nicht mehr gesehen, UART war tot.

Frank M. schrieb:
> Zeige bitte Dein Programm
1
#define F_CPU 16000000
2
#include "irmp.h"
3
4
#ifndef F_CPU
5
#error F_CPU unkown
6
#endif
7
8
void
9
timer1_init (void)
10
{
11
#if defined (__AVR_ATtiny45__) || defined (__AVR_ATtiny85__)                // ATtiny45 / ATtiny85:
12
13
#if F_CPU >= 16000000L
14
    OCR1C   =  (F_CPU / F_INTERRUPTS / 8) - 1;                              // compare value: 1/15000 of CPU frequency, presc = 8
15
    TCCR1   = (1 << CTC1) | (1 << CS12);                                    // switch CTC Mode on, set prescaler to 8
16
#else
17
    OCR1C   =  (F_CPU / F_INTERRUPTS / 4) - 1;                              // compare value: 1/15000 of CPU frequency, presc = 4
18
    TCCR1   = (1 << CTC1) | (1 << CS11) | (1 << CS10);                      // switch CTC Mode on, set prescaler to 4
19
#endif
20
21
#else                                                                       // ATmegaXX:
22
    OCR1A   =  (F_CPU / F_INTERRUPTS) - 1;                                  // compare value: 1/15000 of CPU frequency
23
    TCCR1B  = (1 << WGM12) | (1 << CS10);                                   // switch CTC Mode on, set prescaler to 1
24
#endif
25
26
#ifdef TIMSK1
27
    TIMSK1  = 1 << OCIE1A;                                                  // OCIE1A: Interrupt by timer compare
28
#else
29
    TIMSK   = 1 << OCIE1A;                                                  // OCIE1A: Interrupt by timer compare
30
#endif
31
}
32
33
/*---------------------------------------------------------------------------------------------------------------------------------------------------
34
 * Timer 1 output compare A interrupt service routine, called every 1/15000 sec
35
 *---------------------------------------------------------------------------------------------------------------------------------------------------
36
 */
37
#ifdef TIM1_COMPA_vect                                                      // ATtiny84
38
ISR(TIM1_COMPA_vect)
39
#else
40
ISR(TIMER1_COMPA_vect)
41
#endif
42
{
43
  (void) irmp_ISR();                                                        // call irmp ISR
44
  // call other timer interrupt routines...
45
}
46
47
int
48
main (void)
49
{
50
  DDRC = 0xFF;
51
    IRMP_DATA irmp_data;
52
    irmp_init();                                                            // initialize irmp
53
    timer1_init();                                                        // initialize timer 1
54
    sei ();                                                                 // enable interrupts
55
56
    for (;;)
57
    {
58
    //PORTC = irmp_data.flags;
59
    PORTC |= 0x01; //Status LED
60
        if (irmp_get_data (&irmp_data))
61
        {
62
            // ir signal decoded, do something here...
63
            // irmp_data.protocol is the protocol, see irmp.h
64
            // irmp_data.address is the address/manufacturer code of ir sender
65
            // irmp_data.command is the command code
66
            // irmp_protocol_names[irmp_data.protocol] is the protocol name (if enabled, see irmpconfig.h)
67
      PORTC = irmp_data.flags;
68
        }
69
    }
70
}

Frank M. schrieb:
> und sämtliche Fuse-Einstellungen.

Bild im Anhang.

Frank M. schrieb:
> Sorge dafür, dass F_CPU in allen .c-Dateien zur Verfügung steht. Das
> geht am einfachsten, wenn Du F_CPU in Deiner IDE einstellst

Ich verwende AVR-Studio 5.1 /Atmel Studio 6.
In beiden habe ich schon lange gesucht und keine Einstellung für die 
Taktfrequenz wie in AVR studio 4 gefunden.

Vielen Dank für die schnelle Hilfe!

Gruß Phil

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Phil M. schrieb:
> Die Entstörkondensatoren sind vorhanden.

Gut.

Hast Du beachtet, dass der TSOP4836 ein anderes Pinout als z.B. ein 
TSOP1736 hat?

Beim TSOP4836 ist:

1 Out
2 GND
3 Vs
1
>   DDRC = 0xFF;

Port C komplett auf Ausgang?
Wo hängt denn Dein TSOP dran?
Hast Du F_CPU auch in irmp.c gesetzt?

Schreibe mal statt

#define F_CPU 16000000

besser

#define F_CPU 16000000UL

oder besser: trage es ins Projekt ein (s. weiter unten).

Kannst Du mal Deine irmpconfig.h zeigen?

> Bild im Anhang.

Scheint laut http://www.engbedded.com/fusecalc/ in Ordnung zu sein.

> Ich verwende AVR-Studio 5.1 /Atmel Studio 6.
> In beiden habe ich schon lange gesucht und keine Einstellung für die
> Taktfrequenz wie in AVR studio 4 gefunden.

Die Forumssuche nach "AVRStudio F_CPU" wirft jede Menge Treffer, z.B. 
diesen Link:

Beitrag "Re: define F_CPU in AVR Studio 5, nur wo?"

Gruß,

Frank

von Phil M. (Gast)


Lesenswert?

Frank M. schrieb:
> Hast Du beachtet, dass der TSOP4836 ein anderes Pinout als z.B. ein
> TSOP1736 hat?

Jo ;-)

Frank M. schrieb:
> Port C komplett auf Ausgang?
> Wo hängt denn Dein TSOP dran?

TSOP hängt an B1, siehe irmp_config.
PortC auf Ausgang, da ich darüber die Flags darstellen wollte zum Test. 
klappt aber nicht. Nur die eine Status LED leuchtet

Frank M. schrieb:
> Kannst Du mal Deine irmpconfig.h zeigen?
1
#ifndef _IRMPCONFIG_H_
2
#define _IRMPCONFIG_H_
3
4
#ifndef _IRMP_H_
5
#  error please include only irmp.h, not irmpconfig.h
6
#endif
7
8
/*---------------------------------------------------------------------------------------------------------------------------------------------------
9
 * Change F_INTERRUPTS if you change the number of interrupts per second,
10
 * Normally, F_INTERRUPTS should be in the range from 10000 to 15000, typical is 15000
11
 * A value above 15000 costs additional program space, absolute maximum value is 20000.
12
 *---------------------------------------------------------------------------------------------------------------------------------------------------
13
 */
14
#ifndef F_INTERRUPTS
15
#  define F_INTERRUPTS                          15000   // interrupts per second, min: 10000, max: 20000, typ: 15000
16
#endif
17
18
/*---------------------------------------------------------------------------------------------------------------------------------------------------
19
 * Change settings from 1 to 0 if you want to disable one or more decoders.
20
 * This saves program space.
21
 *
22
 * 1 enable  decoder
23
 * 0 disable decoder
24
 *
25
 * The standard decoders are enabled per default.
26
 * Less common protocols are disabled here, you need to enable them manually.
27
 *
28
 * If you want to use FDC or RCCAR simultaneous with RC5 protocol, additional program space is required.
29
 * If you don't need RC5 when using FDC/RCCAR, you should disable RC5.
30
 * You cannot enable both DENON and RUWIDO, only enable one of them.
31
 *---------------------------------------------------------------------------------------------------------------------------------------------------
32
 */
33
34
// typical protocols, disable here!             Enable  Remarks                 F_INTERRUPTS            Program Space
35
#define IRMP_SUPPORT_SIRCS_PROTOCOL             1       // Sony SIRCS           >= 10000                 ~150 bytes
36
#define IRMP_SUPPORT_NEC_PROTOCOL               1       // NEC + APPLE          >= 10000                 ~300 bytes
37
#define IRMP_SUPPORT_SAMSUNG_PROTOCOL           1       // Samsung + Samsung32  >= 10000                 ~300 bytes
38
#define IRMP_SUPPORT_MATSUSHITA_PROTOCOL        1       // Matsushita           >= 10000                  ~50 bytes
39
#define IRMP_SUPPORT_KASEIKYO_PROTOCOL          1       // Kaseikyo             >= 10000                 ~250 bytes
40
#define IRMP_SUPPORT_DENON_PROTOCOL             1       // DENON, Sharp         >= 10000                 ~250 bytes
41
42
// more protocols, enable here!                 Enable  Remarks                 F_INTERRUPTS            Program Space
43
#define IRMP_SUPPORT_RC5_PROTOCOL               0       // RC5                  >= 10000                 ~250 bytes
44
#define IRMP_SUPPORT_RC6_PROTOCOL               0       // RC6 & RC6A           >= 10000                 ~250 bytes
45
#define IRMP_SUPPORT_JVC_PROTOCOL               0       // JVC                  >= 10000                 ~150 bytes
46
#define IRMP_SUPPORT_NEC16_PROTOCOL             0       // NEC16                >= 10000                 ~100 bytes
47
#define IRMP_SUPPORT_NEC42_PROTOCOL             0       // NEC42                >= 10000                 ~300 bytes
48
#define IRMP_SUPPORT_IR60_PROTOCOL              0       // IR60 (SDA2008)       >= 10000                 ~300 bytes
49
#define IRMP_SUPPORT_GRUNDIG_PROTOCOL           0       // Grundig              >= 10000                 ~300 bytes
50
#define IRMP_SUPPORT_SIEMENS_PROTOCOL           0       // Siemens Gigaset      >= 15000                 ~550 bytes
51
#define IRMP_SUPPORT_NOKIA_PROTOCOL             0       // Nokia                >= 10000                 ~300 bytes
52
53
// exotic protocols, enable here!               Enable  Remarks                 F_INTERRUPTS            Program Space
54
#define IRMP_SUPPORT_KATHREIN_PROTOCOL          0       // Kathrein             >= 10000                 ~200 bytes
55
#define IRMP_SUPPORT_NUBERT_PROTOCOL            0       // NUBERT               >= 10000                  ~50 bytes
56
#define IRMP_SUPPORT_BANG_OLUFSEN_PROTOCOL      0       // Bang & Olufsen       >= 10000                 ~200 bytes
57
#define IRMP_SUPPORT_RECS80_PROTOCOL            0       // RECS80 (SAA3004)     >= 15000                  ~50 bytes
58
#define IRMP_SUPPORT_RECS80EXT_PROTOCOL         0       // RECS80EXT (SAA3008)  >= 15000                  ~50 bytes
59
#define IRMP_SUPPORT_THOMSON_PROTOCOL           0       // Thomson              >= 10000                 ~250 bytes
60
#define IRMP_SUPPORT_NIKON_PROTOCOL             0       // NIKON camera         >= 10000                 ~250 bytes
61
#define IRMP_SUPPORT_NETBOX_PROTOCOL            0       // Netbox keyboard      >= 10000                 ~400 bytes (PROTOTYPE!)
62
#define IRMP_SUPPORT_FDC_PROTOCOL               0       // FDC3402 keyboard     >= 10000 (better 15000)  ~150 bytes (~400 in combination with RC5)
63
#define IRMP_SUPPORT_RCCAR_PROTOCOL             0       // RC Car               >= 10000 (better 15000)  ~150 bytes (~500 in combination with RC5)
64
#define IRMP_SUPPORT_RUWIDO_PROTOCOL            0       // RUWIDO, T-Home       >= 15000                 ~550 bytes
65
#define IRMP_SUPPORT_LEGO_PROTOCOL              0       // LEGO Power RC        >= 20000                 ~150 bytes
66
67
/*---------------------------------------------------------------------------------------------------------------------------------------------------
68
 * Change hardware pin here for ATMEL AVR
69
 *---------------------------------------------------------------------------------------------------------------------------------------------------
70
 */
71
#if defined (ATMEL_AVR)                                                 // use PB6 as IR input on AVR
72
#  define IRMP_PORT_LETTER                      B
73
#  define IRMP_BIT_NUMBER                       1
74
75
/*---------------------------------------------------------------------------------------------------------------------------------------------------
76
 * Change hardware pin here for PIC C18 compiler
77
 *---------------------------------------------------------------------------------------------------------------------------------------------------
78
 */
79
#elif defined (PIC_C18)                                                 // use RB4 as IR input on PIC
80
#  define IRMP_PIN                              PORTBbits.RB4
81
82
/*---------------------------------------------------------------------------------------------------------------------------------------------------
83
 * Change hardware pin here for PIC CCS compiler
84
 *---------------------------------------------------------------------------------------------------------------------------------------------------
85
 */
86
#elif defined (PIC_CCS)
87
#  define IRMP_PIN                              PIN_B4                  // use PB4 as IR input on PIC
88
89
/*---------------------------------------------------------------------------------------------------------------------------------------------------
90
 * Change hardware pin here for ARM STM32
91
 *---------------------------------------------------------------------------------------------------------------------------------------------------
92
 */
93
#elif defined (ARM_STM32)                                               // use C13 as IR input on STM32
94
#  define IRMP_PORT_LETTER                      C
95
#  define IRMP_BIT_NUMBER                       13
96
97
/*---------------------------------------------------------------------------------------------------------------------------------------------------
98
 * Handling of unknown target system: DON'T CHANGE
99
 *---------------------------------------------------------------------------------------------------------------------------------------------------
100
 */
101
#elif !defined (UNIX_OR_WINDOWS)
102
#  error target system not defined.
103
#endif
104
105
/*---------------------------------------------------------------------------------------------------------------------------------------------------
106
 * Set IRMP_LOGGING to 1 if want to log data to UART with 9600Bd
107
 *---------------------------------------------------------------------------------------------------------------------------------------------------
108
 */
109
#ifndef IRMP_LOGGING
110
#  define IRMP_LOGGING                          1       // 1: log IR signal (scan), 0: do not. default is 0
111
#endif
112
113
/*---------------------------------------------------------------------------------------------------------------------------------------------------
114
 * Use external logging routines
115
 * If you enable external logging, you have also to enable IRMP_LOGGING above
116
 *---------------------------------------------------------------------------------------------------------------------------------------------------
117
 */
118
#ifndef IRMP_EXT_LOGGING
119
#  define IRMP_EXT_LOGGING                      0       // 1: use external logging, 0: do not. default is 0
120
#endif
121
122
/*---------------------------------------------------------------------------------------------------------------------------------------------------
123
 * Set IRMP_PROTOCOL_NAMES to 1 if want to access protocol names (for logging etc), costs ~300 bytes RAM!
124
 *---------------------------------------------------------------------------------------------------------------------------------------------------
125
 */
126
#ifndef IRMP_PROTOCOL_NAMES
127
#  define IRMP_PROTOCOL_NAMES                   0       // 1: access protocol names, 0: do not. default is 0
128
#endif
129
130
/*---------------------------------------------------------------------------------------------------------------------------------------------------
131
 * Use Callbacks to indicate input signal
132
 *---------------------------------------------------------------------------------------------------------------------------------------------------
133
 */
134
#ifndef IRMP_USE_CALLBACK
135
#  define IRMP_USE_CALLBACK                     0       // 1: use callbacks. 0: do not. default is 0
136
#endif
137
138
#endif /* _WC_IRMPCONFIG_H_ */

Frank M. schrieb:
> oder besser: trage es ins Projekt ein (s. weiter unten).

habe es im Projekt als "F_CPU=16000000UL" eingetragen.
Hat er auch angenommen, da delay.h nicht meckert.
Ich werde gleich testen, obs klappt.

Vielen Dank!
Gruß Phil

von Phil M. (Gast)


Lesenswert?

Statusbericht:

Habe F_CPU jetzt im Projekt global eingetragen.
Leider meldet sich der µC immer noch nicht zu Wort.
Die Status LED lässt er leuchten, woran man erkennen kann, dass der µC 
arbeitet.
über UART ist der controller immer noch tot, auch kein "trash" kommt.
Ich habe den code ja so geschrieben, dass eigentlich mehrere LEDs 
angehen (irmp_flags) sollten, soblad ein Protokoll erkannt wurde.
1
if (irmp_get_data (&irmp_data))
2
        {
3
            // ir signal decoded, do something here...
4
            // irmp_data.protocol is the protocol, see irmp.h
5
            // irmp_data.address is the address/manufacturer code of ir sender
6
            // irmp_data.command is the command code
7
            // irmp_protocol_names[irmp_data.protocol] is the protocol name (if enabled, see irmpconfig.h)
8
      PORTC = irmp_data.flags;
9
        }

Leider klappt dies nicht.

Vielen Dank!

Gruß Phil

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Phil M. schrieb:
> über UART ist der controller immer noch tot, auch kein "trash" kommt.
> Ich habe den code ja so geschrieben, dass eigentlich mehrere LEDs
> angehen (irmp_flags) sollten, soblad ein Protokoll erkannt wurde.

irmp_flags ist entweder 0 (keine Wiederholung) oder 1 (Wiederholung). Da 
Du sowieso immer das Bit 0 in der Endlosschleife anschaltest, wirst Du 
da kaum was sehen, denn die anderen Bits werden durch die flags sowieso 
nicht gesetzt.

Besser wäre so etwas:
1
    for (;;)
2
    {
3
        PORTC |= 0x01; //Status LED
4
5
        if (irmp_get_data (&irmp_data))
6
        {
7
            PORTC = 0xFF;
8
            _delay_ms (1000);
9
            PORTC = 0x00;
10
        }
11
    }

Dann sollten alle LEDs am PORTC für eine Sekunde leuchten, sobald IRMP 
etwas erkannt hat.

Gruß,

Frank

von Phil M. (Gast)


Lesenswert?

Hey Frank!

Habe den Port von PB1 auf PB0 geändert.
An diesem funktioniert es!!
Ich möchte euch allen hier aus dem Forum sehr danken für die tollen und 
schnellen Antworten!
Werde mir jetzt auch n Konto erstellen und mal gucken, ob  ich meinen 
Beitrag auch hier leisten kann ;-)

Die Sony Fernbedienung erkennt er (alle Leds an = Protokoll erkannt), 
die Bose aber nicht.
UART funktioniert jetzt, d.h. ich kann dir ruhig n scan von der bose 
schicken, wenn du noch keinen hast.

Vielen Dank nochmal!

L.G. Phil

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Phil M. schrieb:
> Habe den Port von PB1 auf PB0 geändert.
> An diesem funktioniert es!!

Sehr merkwürdig.... habe keine Erklärung dafür.
Trotzdem Gratulation :)

> UART funktioniert jetzt, d.h. ich kann dir ruhig n scan von der bose
> schicken, wenn du noch keinen hast.

Kannst Du gern machen. Bitte zumindest Scans von den Tasten 0-9 schicken 
- je mehr, desto besser. Das Format einer Scan-Datei kannst Du Dir in 
den Dateien unter IR-Data anschauen - simple Text-Datei mit Kommentaren, 
eingeleitet durch '#'.

Gruß,

Frank

von Phil M. (Gast)


Angehängte Dateien:

Lesenswert?

Habe eben gemerkt, dass der TSOP die ganze Zeit an PB0 angeschlossen 
war, und es eben auf PB1 eingestellt war. Sowas ist echt peinlich...

Anbei der Bose-Scan. Dies ist nur eine Radio-Fernbedienung mit Tasten 
1-6, deshalb hab ich noch Play, Eject und Power On hinzugefügt.

http://c0021679.cdn1.cloudfiles.rackspacecloud.com/BoseWaveMusicSystem_remote.jpg

Vielen Dank!

Gruß Phil

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Phil M. schrieb:
> Habe eben gemerkt, dass der TSOP die ganze Zeit an PB0 angeschlossen
> war, und es eben auf PB1 eingestellt war. Sowas ist echt peinlich...

Dafür müsstest Du eigentlich ein Bier ausgeben ;-)

> Anbei der Bose-Scan. Dies ist nur eine Radio-Fernbedienung mit Tasten
> 1-6, deshalb hab ich noch Play, Eject und Power On hinzugefügt.

Danke, schaue ich mir an.

Gruß,

Frank

von Frank M. (ukw) (Moderator) Benutzerseite


Angehängte Dateien:

Lesenswert?

Phil M. schrieb:
> Anbei der Bose-Scan.

Anbei die Änderungen fürs BOSE-Protokoll.

Das war ziemlich einfach: 16 Bits, davon ist das erste Byte das Kommando 
und das zweite Byte ist einfach zwecks Fehlererkennung invertiert. IRMP 
berücksichtigt die Fehlererkennung und verwirft solche Frames 
automatisch.

Tausche einfach die 3 Dateien in der Zip-Datei aus und stelle Deine 
Pinkonfiguration neu ein. Du solltest BOSE nicht zusammen mit RC5 oder 
RUWIDO einschalten, da es hier noch Konflikte in der Erkennung gibt. 
Zumindest für RC5 werde ich die noch ausbügeln. Daher ist der Source 
erstmal hier nur zum Test.

Gruß,

Frank

EDIT:
Da ist noch ein Fehler drin:

Zeile 1211 in irmp.c:

Alt:
#if IRMP_SUPPORT_NEC_PROTOCOL == 1

Neu:
#if IRMP_SUPPORT_BOSE_PROTOCOL == 1

Sonst klappt es nur, wenn Du auch NEC enabled hast.

von Phil M. (Gast)


Lesenswert?

Hey Frank!

Die Bose-Protokoll-Routine funktioniert, vielen Dank!

Gruß Phil

von Martin S. (drunkenmunky)


Lesenswert?

Hallo,

ich probiere gerade IRSND auf einem PIC18 zum laufen zu bekommen.

Es kommt aber die Fehlermeldung:
Error - could not find definition of symbol 'SetDCPWM1' in file 
'./build/default/production/irsnd.o'.

In der Funktion irsnd_set_freq() wird ja OpenPWM(freq) aufgerufen. In 
der irsnd.h gibt's ja das define
1
 # define OpenPWM(x)                          OpenPWM1(x)

und OpenPWM1() wird ja wohl die von Microchip bereitgestellte Funktion 
von der Library in pwm.h sein, oder? Muss man die dann noch irgendwo mit 
einbinden? Hab ich schon gemacht, Fehler ist aber immer noch da...

von Martin S. (drunkenmunky)


Lesenswert?

Servus,

also ich hab das Problem gefunden. PWM 1 bis 3 ist bei meinem Controller 
eine Enhanced PWM. Also muss man entweder normale PWM 4 nehmen oder es 
in der irsnd.h auf die Enhanced anpassen.
1
#  if IRSND_OCx == IRSND_PIC_CCP1        
2
#    define IRSND_PIN                           TRISCbits.TRISC2        // RC2 = PWM1
3
#    define SetDCPWM(x)                         SetDCEPWM1(x)
4
#    define ClosePWM                            CloseEPWM1
5
#    define OpenPWM(x)                          OpenEPWM1(x, ECCP_1_SEL_TMR12)
6
#  endif

Jetzt läuft bei mir senden und empfangen.

Klasse Projekt! Vielen Dank!

von Martin S. (drunkenmunky)


Lesenswert?

Eine Frage hätte ich allerdings noch.

Ich habe die Fernbedienung eines Philips TV ausgelesen und es wurde als 
RC6 Code erkannt, was ja gut sein kann. Z.B. Adress = 0, Comannd = 12 
für dein Einschaltknopf. Wenn ich das aber sende, reagiert der TV nicht. 
NEC Protokoll geht ohne Problem. Habe leider auch grad kein Oszi da zum 
Messen. Bei Senden ist es egal, wenn man alle Protokolle einschaltet, 
oder?

Weiß vielleicht jemand, woran das liegen könnte?

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Martin S. schrieb:
> Eine Frage hätte ich allerdings noch.
>
> Ich habe die Fernbedienung eines Philips TV ausgelesen und es wurde als
> RC6 Code erkannt, was ja gut sein kann. Z.B. Adress = 0, Comannd = 12
> für dein Einschaltknopf. Wenn ich das aber sende, reagiert der TV nicht.

Kann IRMP das gesendete Telegramm wieder dekodieren? Läuft Dein PIC mit 
Quarz? Einige kommerzielle Geräte achten sehr genau auf das Timing.

Gruß,

Frank

P.S.
Danke für die TIPs zum PIC mit der "Enhanced PWM" :-)

von Martin S. (drunkenmunky)


Lesenswert?

Frank M. schrieb:
> Kann IRMP das gesendete Telegramm wieder dekodieren?

Sollte er das können? Habe gedacht, wenn die ISR so aufgebaut ist:
1
if (!irsnd_ISR())          // call irsnd ISR
2
{                           // if not busy...
3
    irmp_ISR();             // call irmp ISR
4
}
wird nur empfangen, wenn nicht grad gesendet wird.

Frank M. schrieb:
> Läuft Dein PIC mit Quarz?

Ich verwende den internen Oszillator, der auf 1% kalibiriert wurde und 
im Datenblatt bei einer Temperatur von 0 bis 70°C mit einer Toleranz von 
+/- 2% angegeben wird. Ich denk mit einem Quarz ist man auch nicht 
besser dran, oder?

Ich habe den Timer so eingestellt, dass alle 67us ein Interrupt kommt. 
Sollte ich dann F_INTERRUPTS besser auf 14925 statt 15000 stellen? 
Bringt es viel, wenn man mit 20 kHz arbeitet?

von Joachim B. (jar)


Lesenswert?

Martin S. schrieb:
> Ich habe den Timer so eingestellt, dass alle 67us ein Interrupt kommt.
> Sollte ich dann F_INTERRUPTS besser auf 14925 statt 15000 stellen?

ich denke man sollte F_INTERRUPTS auf die richtige Zahl stellen, bei mir
F_CPU/Teiler, bei dir wäre ja 14925 richtig (1/67µs)

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Martin S. schrieb:

> Ich verwende den internen Oszillator, der auf 1% kalibiriert wurde und
> im Datenblatt bei einer Temperatur von 0 bis 70°C mit einer Toleranz von
> +/- 2% angegeben wird. Ich denk mit einem Quarz ist man auch nicht
> besser dran, oder?

Sollte reichen.

> Ich habe den Timer so eingestellt, dass alle 67us ein Interrupt kommt.
> Sollte ich dann F_INTERRUPTS besser auf 14925 statt 15000 stellen?

Ja, solltest Du. F_INTERRUPTS sollte auf dem exakten Wert stehen. Naja, 
bei 14925 ist die Abweichung allerdings minimal.

> Bringt es viel, wenn man mit 20 kHz arbeitet?

Nein.

Noch eine andere Idee: Vielleicht stimmt die Modulationsfrequenz von 
36kHz nicht. Geh mal auf 38kHz für RC6. Suche dafür nach

            irsnd_set_freq (IRSND_FREQ_36_KHZ);

(findest Du mehrfach, z.Z. für RC6 und RC6A).

von Martin S. (drunkenmunky)


Lesenswert?

Habe beides angepasst. Hat aber beides nicht geholfen. Da werde ich dann 
wohl mal mit einem Oszi nachmessen müssen...

Oder sonst noch Tips?

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Martin S. schrieb:
> Oder sonst noch Tips?

Leider nein.

Außer Du nimmst erst mit der Original-Fernbedienung einen IRMP-Scan auf 
und anschließend nochmal mit IRMP vom IRSND-Sender. Da brauchst Du aber 
dann 2 PICs dafür.

Gruß,

Frank

von Martin S. (drunkenmunky)


Lesenswert?

Ok, danke. Die Hardware habe ich zum Glück zwei mal. Sobald meine 
Prüfungen vorbei sind, werde ich es testen und dann berichten.

von Martin S. (drunkenmunky)


Lesenswert?

Die Logging Funktion ist ja noch gar nicht für PIC implementiert. Mal 
sehen, ob ich noch irgendwann Zeit finde, dies zu ergänzen.

Aber den Fehler habe ich mittlerweile gefunden. Es liegt daran, dass die 
Interrupt-Routine zum senden zu lange benötigt. Es sollte ja eigentlich 
alle 67us ein Interrupt erzeugt werden, aber die Bearbeitung dauer über 
90us. Dann stimmt natürlich das ganze Timing nicht mehr. Das wundert 
mich etwas da ich schon den schnellsten PIC18 mit 16 MIPS (64 MHz) 
verwende (ohne Compileroptimierung, da Lite). Alle 100us Interrupt 
funktioniert jetzt, aber dann kann man ja nicht alle Protokolle nutzen.

Wieso wird nicht zuerst die du sendende Bitfolge berechnet und dann im 
Interrupt nur die PWM an/aus geschalten? Die Routine ist schon ganz 
schön lang...

Würde mich mal interessieren, wie andere das mit PICs bewerkstelligt 
haben. Wäre nett, wenn mal jemand von seinen Erfahrungen berichten 
würde!

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Martin S. schrieb:
> Die Logging Funktion ist ja noch gar nicht für PIC implementiert. Mal
> sehen, ob ich noch irgendwann Zeit finde, dies zu ergänzen.

Schau bitte mal nach in irmpextlog.c, dort ist speziell für PICs mit 
USB-Anschluss ein Logging implementiert. UART-Logging für PICs gibt es 
allerdings (noch) nicht.

> Aber den Fehler habe ich mittlerweile gefunden. Es liegt daran, dass die
> Interrupt-Routine zum senden zu lange benötigt. Es sollte ja eigentlich
> alle 67us ein Interrupt erzeugt werden, aber die Bearbeitung dauer über
> 90us. Dann stimmt natürlich das ganze Timing nicht mehr. Das wundert
> mich etwas da ich schon den schnellsten PIC18 mit 16 MIPS (64 MHz)
> verwende (ohne Compileroptimierung, da Lite). Alle 100us Interrupt
> funktioniert jetzt, aber dann kann man ja nicht alle Protokolle nutzen.

Das ist allerdings sehr merkwürdig, da das auch die ATmegas mit "nur" 8 
MHz problemlos schaffen. Die Interrupt-Routine sieht zwar lang aus, ist 
aber ein Zustandsautomat, wo nur wenige Befehle pro ISR-Aufruf 
abgearbeitet werden. Ausserdem wird sehr wohl das Muster, das gesandt 
werden muss, außerhalb der ISR vor dem eigentlichen Senden 
"zusammengebaut". Ich kann mir das nur so erklären, dass irgendein 
Code-Abschnitt in der ISR nicht optimal übersetzt wird. Da müsste man 
sich das Assembler-Listing, das vom C-Compiler erzeugt wird, mal näher 
unter die Lupe nehmen...

> Wieso wird nicht zuerst die du sendende Bitfolge berechnet und dann im
> Interrupt nur die PWM an/aus geschalten? Die Routine ist schon ganz
> schön lang...

Wie gesagt, die Bitfolge wird bereits in irsnd_send_data() vor dem 
Senden und nicht in der ISR berechnet. Vielleicht könnte man aber noch 
den großen Case-Switch, wo vor dem Absenden des Start-Bits die 
jeweiligen Puls-/Pause-Längen gesetzt werden, noch rausziehen und vorab 
machen. Aber das wird nicht die Ursache sein, da dies nur 1x pro Frame 
passiert. Hier liegt etwas ganz anderes (PIC-spezifisches?) im Argen. 
Wäre prima, wenn Du mal einen Blick in den produzierten Assembler-Output 
des Compilers werfen könntest.

Gruß,

Frank

von Bernhard M. (boregard)


Lesenswert?

Hallo,

vielleicht erzeugt derCompiler ja "lahmen" Code, da, Zitat "(ohne 
Compileroptimierung, da Lite)"

Gruß,
Bernhard

von Joachim B. (jar)


Lesenswert?

Frage, hat einer Quellen für Service Codes ?

es gibt für Panasonic HD Recorder (Kaseikyio) eine Service FB die
DVD/HD Recorder Ländercode free schaltet, man kann die kaufen, wäre aber 
ziemlich Unfug wenn man die nur einmalig braucht und hier jedem hier 
IR-SND zur Verfügung steht

Irgendwie müsste mal ein Code Sammlung entstehen so das man auch ohne 
OriginalFB alles nachgebildet werden kann.

was meint ihr ?

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Joachim B. schrieb:
> Frage, hat einer Quellen für Service Codes ?

Eine Möglichkeit, "undokumentierte" Befehle herauszubekommen, ist, sich 
eine Tabelle anzulegen, welche Kommandos die herkömmliche FB sendet und 
dann gezielt per IRSND die "Lücken", also nicht-verwendete 
Kommando-Codes auszuprobieren. Bei irgendeinem wird das Gerät dann schon 
reagieren ;-)

von Joachim B. (jar)


Lesenswert?

Frank M. schrieb:
> welche Kommandos die herkömmliche FB sendet und
> dann gezielt per IRSND die "Lücken", also nicht-verwendete
> Kommando-Codes auszuprobieren.

ziemlich aussichtslos bei

drücke 6 warte 10s drücke Taste Service Menü usw.

ich kann keine Kombination aus nicht vorhandenen Tasten in Verbindung 
mit Sequenzen und Zwischenzeiten probieren.

ich versuche mal so eine Service FB zu bekommen

es gab mal IRDEO wo an der seriellen PC Schnitte .....

evt. gehts ja damit ? (Bytefolgen)
0082 0015 0089 0004 00F2 0033 0017 0010 0091 0013

mal probieren

von Maik (Gast)


Lesenswert?

Hallo,
ich versuche gerade das Signal einer Lego IR zu empfangen.
Leider funktioniert die Erkennung des Startpulses nicht.

Der erste Puls passt einfach nicht in die Tolleranz.
Ich verwende einen SFH505A mit tON=100uS and tOFF=200us.

Wenn ich das Signal mit einem Logic Analyzer betrachte,
dann geht das IR Signal zuerst für 505uS auf Low und ist dann
für 710uS auf High. Die gesamte Impulslänge ist dann 1215uS.

Mann könnte doch tON und tOFF in der Software rausrechnen!
Wird das gemacht?

Wie wird mit diesem Fehler umgegangen?

Danke

Maik

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Maik schrieb:

> ich versuche gerade das Signal einer Lego IR zu empfangen.
> Leider funktioniert die Erkennung des Startpulses nicht.

Kannst Du Scans erstellen und hier einstellen? Dann schaue ich es mir 
an.

> Mann könnte doch tON und tOFF in der Software rausrechnen!
> Wird das gemacht?

Das wird nicht gemacht, da ich bisher davon ausging, dass die 
IR-Empfänger ein zeitrichtiges Signal ausgeben.

> Wie wird mit diesem Fehler umgegangen?

Momentan gar nicht.

Gruß,

Frank

von Konrad S. (maybee)


Lesenswert?

@Frank M.

Ich habe eben IRMP (Danke für diese Super-Software!) auf einem Arduino 
verwendet. Im Abschnitt für das IRMP_KASEIKYO_PROTOCOL musste ich die 
lokale Variable "xor" umbenennen, das scheint bei Arduino ein 
reservierter Bezeichner zu sein.

Version IRMP:  2.2.2 25.05.2012
 * $Id: irmp.c,v 1.123 2012/05/24 08:16:28 fm Exp $

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Konrad S. schrieb:
> Ich habe eben IRMP (Danke für diese Super-Software!) auf einem Arduino
> verwendet. Im Abschnitt für das IRMP_KASEIKYO_PROTOCOL musste ich die
> lokale Variable "xor" umbenennen, das scheint bei Arduino ein
> reservierter Bezeichner zu sein.

Danke, ich habe "xor" in "xor_value" umbenannt - sowohl in irmp.c als 
auch in irsnd.c. Kommt mit dem nächsten Release.

Gruß,

Frank

von Carsten Presser (Gast)


Angehängte Dateien:

Lesenswert?

Hi,

ich hab ein Protokoll gefunden das ich nicht identifizieren kann.
Im Anhang ein Foto vom Oszi (hab leider kein Hardcopy) vom Anfang der 
Sequenz.
Die Fernbedienung gehört zu einer Dreambox-8000.

'Abgeschrieben' ergibt sich folgende Puls-Pause-Folge
Puls 320
Pause 1000
Puls 320
Pause 2000
Puls 320
Pause 1000
Puls 320
Pause 2760 (!?)
Puls 320
Pause 1000
Puls 320
Pause 1000
Puls 320
Pause 800 (!?)
Puls 320
Pause 2000
Puls 320
Pause 12920 (!?)
Puls 320
Pause 1000
Puls 320
Pause 2360 (Taste0) ...  1000 (Taste9) als zwischenwert: 5->1640, 
3->1900, 7->1360


Interessant ist das in dem zweite Block (nach der 12ms-Pause) die Pausen 
unterschiedliche Längen haben je nachdem welche Taste gedrückt wird.
Die Pausen-Länge skaliert auch mit dem Wert der Taste (also 0-9).

Das ganze scheint also nicht 'diskret' kodiert zu sein.

vllt. hat hier ja jemand eine Idee was das für ein Proto ist :)

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Carsten Presser schrieb:
> Die Fernbedienung gehört zu einer Dreambox-8000.

Tut mir leid, die Dreambox-FB wird nicht von IRMP unterstützt. Das 
Protokoll ist leider ziemlich kompliziert und weicht von den 
Standard-Protokollen so weit ab, dass für diese Fernbedienung besser ein 
eigener spezieller Decoder geschrieben werden müsste. Das 
Dreambox-Protokoll passt einfach schlecht bis gar nicht zum Konzept des 
IRMP.

Mich persönlich ärgert das auch, denn ich habe ebenso eine Dreambox in 
meinem Wohnzimmer.

von Carsten Presser (Gast)


Lesenswert?

Frank M. schrieb:
> Tut mir leid, die Dreambox-FB wird nicht von IRMP unterstützt. Das
> Protokoll ist leider ziemlich kompliziert und weicht von den
> Standard-Protokollen so weit ab, dass für diese Fernbedienung besser ein
> eigener spezieller Decoder geschrieben werden müsste.

Gibts es denn irgendwo Doku zu dem Protokoll? Oder mal ein Name?
So wirklich viel hat Googeln mir zu dem Thema bisher nicht gebracht.

Ich hab schon nen eigenen Decoder (keinen so schönen wie deiner), der 
aber dank einer Auflösung von 0.3us das Protokoll schaffen sollte :)
Ich dachte nur, ich frage mal hier nach, weil sich in im Thread viele 
Leute aufhalten die viel Ahnung von IR-Protokollen haben.

von jar (Gast)


Lesenswert?

Frank M. schrieb:
> Tut mir leid, die Dreambox-FB wird nicht von IRMP unterstützt. Das
> Protokoll ist leider ziemlich kompliziert und weicht von den
> Standard-Protokollen so weit ab, dass für diese Fernbedienung besser ein
> eigener spezieller Decoder geschrieben werden müsste. Das
> Dreambox-Protokoll passt einfach schlecht bis gar nicht zum Konzept des
> IRMP.

und ein eigener ist nicht möglich ? so nachgeschaltet ?

Carsten Presser schrieb:
> Ich hab schon nen eigenen Decoder (keinen so schönen wie deiner), der
> aber dank einer Auflösung von 0.3us das Protokoll schaffen sollte :)
> Ich dachte nur, ich frage mal hier nach, weil sich in im Thread viele
> Leute aufhalten die viel Ahnung von IR-Protokollen haben.

momentan behelfe ich mich ja mit IRMP vor RC5 Dannegger

also wenn der Interrupt kommt, hüpf ich erst in die IRMP und gleich 
danach in die RC5, so habe ich alle IRMP Protokolle zum auswerten, sowie 
Programmkompatiblität mit meiner FB wegen toogle Bit, ich weiss Frank 
das sollte auch mit IRMP gehen, aber bis jetzt läufts so ohne weitere 
Versuche, wenn ich Zeit finde werde ich mein Problem mit dem toogle Bit 
angehen

ich denke evt. wäre eine eigene Dekoderroutine nach IRMP auch hier 
möglich, die dann eben das gewünschte hinter IRMP (wenn das weiterhin 
gebraucht wird) dekodiert.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Carsten Presser schrieb:
> Gibts es denn irgendwo Doku zu dem Protokoll? Oder mal ein Name?
> So wirklich viel hat Googeln mir zu dem Thema bisher nicht gebracht.

Schau Dir mal

 Beitrag "Re: Dreambox mit RC5 "bedienen""

an. Einige behaupten, das Protokoll heisst TWIRP, andere sagen, es wäre 
XMP-1. Ich tippe auf letzteres, wenn ich mir diverse IRMP-Scanlogs von 
Dreambox-FBs anschaue.

Wenn man sich anstrengt beim Googlen, findet man über XMP-1 schon 
diverse Dokumentationen bzw. Schnippselchen. Leider habe ich mir die 
Links nicht explizit gemerkt, dass ich sie jetzt hier aufführen konnte. 
Jedenfalls kam ich damals zu dem Schluss, dass man XMP-1 mittels IRMP 
schlecht bis gar nicht "einfangen" kann.

Gruß,

Frank

von martin (Gast)


Lesenswert?

Hallo

Ich habe einen Verstärker mit IR-in an dem bei IR-Bedienung ein 
IR-Singnal anliegt. Ich möchte nun mit einem µC den Verstärker steuern. 
Beitrag "IR-IN des Hifi-Verstärkers per µC ansteuern"

Ich verwende einen Atmega32 auf einem Board mit 8MHz Quarz. USB ISP 
Programmer ist vorhanden.

Ich habe mir das Projekt IRSND mal ins AtmelStudio geladen, leider 
kämpfe ich noch mit ein paar noobsachen.

Ohne Änderungen des Codes kommen bei mir Fehler:
#warning "F_CPU not defined for <util/delay.h>"
#error mikrocontroller not defined, please fill in definitions here.


1.) Wo kann ich die Frequenz jetzt einstellen?
 - Im AtmelStudio selbst?
 - Aber sie ist doch schon in den Fusebits definiert?!
 - Wo und wie im code?

2.) Brauche ich noch ein Hauptprogramm oder werfe ich meinen Teil in 
irsndmain.c ganz unten ran?

3.) Wo genau in den files und wie wird der Controller  definiert?

Ich habe schon gesehen dass Frank sehr viel Zeit in sein Projekt 
gesteckt hat, und das mit Erfolg! Vielleicht gibts einen Kenner hier der 
einem Anfänger wie mir weiterhelfen kann.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

martin schrieb:

> Ich habe mir das Projekt IRSND mal ins AtmelStudio geladen, leider
> kämpfe ich noch mit ein paar noobsachen.

Welche Studio-Version? 4, 5 oder 6?

> Ohne Änderungen des Codes kommen bei mir Fehler:
> #warning "F_CPU not defined for <util/delay.h>"
> #error mikrocontroller not defined, please fill in definitions here.

> 1.) Wo kann ich die Frequenz jetzt einstellen?
>  - Im AtmelStudio selbst?

Ja, Du musst F_CPU=8000000UL oder einen adäquaten Wert im Projekt 
einstellen.

>  - Aber sie ist doch schon in den Fusebits definiert?!

Nein, da sagst Du nur, ob Du einen Quarz verwendest und in welchem 
Frquenzbereich.

>  - Wo und wie im code?

Sie oben: im Projekt selber. Wenn Du nicht weisst, google einfach mal 
nach AVR Studio F_CPU einstellen.

> 2.) Brauche ich noch ein Hauptprogramm oder werfe ich meinen Teil in
> irsndmain.c ganz unten ran?

irsndmain ist nur ein Beispiel. Es kommt natürlich darauf an, was Du 
machen willst. IRMP und IRSND sind lediglich Bibliotheken zur Einbindung 
in eigene Anwendungen.

> 3.) Wo genau in den files und wie wird der Controller  definiert?

Du stellst Im AVR Studio das Target, d.h. den µC ein. Offenbar hast Du 
da gar nicht ATmega32 eingestellt.

Gruß,

Frank

von martin (Gast)


Lesenswert?

Hallo und vielen Dank für die Antworten, haben mir sehr weitergeholfen.

Ich bin auf eclipse umgestiegen, da ich mit AtmelStudio nicht mehr 
weiterkam.
Das hakte dann einen Tag, und schließlich lief es dann.

Jetzt möchte ich noch wissen was ich ändern muss damit er nicht auf den 
Träger aufmoduliert, sondern das "normale" Signal rauswirft.

zitat:
Um nun mittels IRSND zu senden, musst Du lediglich die
Modulationsfunktion deaktivieren, so dass keine Frequenz, sondern ein
LOW-Signal erzeugt wird.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

martin schrieb:

> Jetzt möchte ich noch wissen was ich ändern muss damit er nicht auf den
> Träger aufmoduliert, sondern das "normale" Signal rauswirft.

Ersetze die Funktionen irsnd_off(), irsnd_on(), irsnd_set_freq() und 
irsnd_init() durch folgende:
1
static void
2
irsnd_on (void)
3
{
4
    if (! irsnd_is_on)
5
    {
6
        HIER PORT-PIN AUF LOW!
7
8
#if IRSND_USE_CALLBACK == 1
9
        if (irsnd_callback_ptr)
10
        {
11
            (*irsnd_callback_ptr) (TRUE);
12
        }
13
#endif // IRSND_USE_CALLBACK == 1
14
15
        irsnd_is_on = TRUE;
16
    }
17
}
18
19
static void
20
irsnd_off (void)
21
{
22
    if (irsnd_is_on)
23
    {
24
        HIER PORT-PIN AUF HIGH!
25
26
#if IRSND_USE_CALLBACK == 1
27
        if (irsnd_callback_ptr)
28
        {
29
           (*irsnd_callback_ptr) (FALSE);
30
        }
31
#endif // IRSND_USE_CALLBACK == 1
32
33
        irsnd_is_on = FALSE;
34
    }
35
}
36
37
static void
38
irsnd_set_freq (IRSND_FREQ_TYPE freq)
39
{
40
    return;
41
}
42
43
void
44
irsnd_init (void)
45
{
46
    HIER PORT-PIN AUF OUTPUT und auf HIGH!
47
}

Gruß,

Frank

von martin (Gast)


Lesenswert?

Guter Frank, bitte hilf mir noch einmal. :)

HIER PORT-PIN AUF OUTPUT und auf HIGH!
HIER PORT-PIN AUF LOW!

(ich verwende OC0 )

von Michael H. (michael_h45)


Lesenswert?

Ach bitte, du wirst doch wohl einen Pin setzen können!?

von martin (Gast)


Lesenswert?

Stimmt das so?

HIER PORT-PIN AUF OUTPUT und auf HIGH!

DDRB |= (1 << DDB3);  //PB3 auf Ausgang
DDRB =(1 << DDB3);  //PB3 auf 1



HIER PORT-PIN AUF LOW!

DDRB =(0 << DDB3);       //PB3 auf 0

von Chris (Gast)


Lesenswert?


von martin (Gast)


Lesenswert?

Ich hab mir vor einiger Zeit schon den Kopf über folgende Syntax 
zerbrochen:

(1 << n) : Zuerst wird durch die '<<'-Ausdrücke eine "1" n-mal nach 
links geschoben

und dann:
DDRB =(1 << DDB3);

Meine interpretation: Es wird "DDB3" mal eine 1 nach links geschoben.
?

Ok ich hab da was mit dem verwechselt mit DDRB und PORTB, richtig müsste 
der Code also lauten:

//HIER PORT-PIN AUF OUTPUT und auf HIGH!:
DDRB |= (1 << DDB3);  //PB3 auf Ausgang
PORTB=(1<<PB3);  //PB3 auf 1


//HIER PORT-PIN AUF LOW!:
PORTB &= ~(1<<PB3); //PB3 auf 0

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.