mikrocontroller.net

Forum: Projekte & Code IRMP - Infrared Multi Protocol Decoder


Autor: Wilhelm M. (wimalopaan)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Frank M. schrieb:
> Wilhelm M. schrieb:
>> a) Auslagerung der Deklaration der Funktionsprototypen irmp_int(),
>> irmp_get_data() und irmp_ISR() zusammen mit dem typedef für IRMP_DATA in
>> eine eigene Header-Datei.
>
> Ganz habe ich das nicht verstanden. Die externen Deklarationen stehen
> doch bereits in irmp.h? Kannst Du mal schematisch andeuten, wie Du irmp
> nutzt?

Wenn ich irmp.h inkludiere, dann bekomme ich tonnenweise #define's, die 
ich nicht haben will. Die sind ja ohne scope ... deswegen möchte ich die 
in meinem C++-Code nicht haben (ich verwende keine Cpp-Makros mehr).

Ich hätte also nur gerne die Prototypen und die typedefs. Dann kann ich 
in einer eigenen Header-Datei statt dem folgenden
namespace Irmp {
extern "C" {
struct IrmpData {
    uint8_t                             protocol;                                   // protocol, e.g. NEC_PROTOCOL
    uint16_t                            address;                                    // address
    uint16_t                            command;                                    // command
    uint8_t                             flags;                                      // flags, e.g. repetition
} __attribute__ ((__packed__));

typedef struct IrmpData IRMP_DATA;

extern void                             irmp_init (void);
extern uint_fast8_t                     irmp_get_data (IRMP_DATA *);
extern uint_fast8_t                     irmp_ISR (void);

}
constexpr uint8_t Repetition = 0x01;

}
einfach innerhalb des namespaces die (neue) Headerdatei inkludieren (mit 
Ausnahme des constexpr ...).

Ganz am Ende(!) meiner (einzigen) Implmentierungsddatei kommt dann:
constexpr auto finterrupts = IrInterruptFrequency.value;

static_assert(finterrupts >= 10000, "IR Interrupts frequeny too low");
static_assert(finterrupts <= 20000, "IR Interrupts frequeny too high");

#define F_INTERRUPTS finterrupts

#define input(x) iRPin::read()

namespace Irmp {
#include "irmp/irmp.c"
}

>
> "header-only Libs" hört sich danach an, dass Du den IRMP-Source
> includest statt dazuzubinden mittels IRMP_USE_AS_LIB. Ist es das?

Ja: s.o.

>
>> b) das Cpp-Macro input(x) mit einem #ifndef versehen.
>
> #ifndef WAS-Denn?

Ja, das Macro eben, damit ich das obige benutzen kann ;-)
Also etwa:
#ifndef input
#  define input(x)                              ((x) & (1 << IRMP_BIT))
#endif

: Bearbeitet durch User
Autor: Marcel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Frank M. schrieb:
> Marcel schrieb:
>> kannst Du noch bitte das SAMSUNGAH Protokoll in IRSND übernehmen?
>
> Gern. Läuft es denn im IRMP? Laut Deinem letzten Beitrag wolltest Du es
> testen und Dich dann nochmal melden...

Entschuldige. Ja wir haben es getestet und es sieht gut aus.
Die Werte sind, bis auf die wechselnden Tasten, immer identisch.
Man kann also sehr gut damit arbeiten =). Danke hierfür!

Autor: Jörg R. (jrie)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
In 3.0.7 ist SAMSUNGAH defaultmäßig an.
Damit gehen verschiedene andere Protokolle nicht mehr.
Das sollte auf defaultmäßig aus.
Gruß, Jörg

Autor: Frank M. (ukw) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jörg R. schrieb:
> In 3.0.7 ist SAMSUNGAH defaultmäßig an.
> Damit gehen verschiedene andere Protokolle nicht mehr.
> Das sollte auf defaultmäßig aus.

Upps, da habe ich vergessen, es nach dem Test wieder abzuschalten. 
Sorry, ich deaktivier das wieder. Danke für den Hinweis.

Autor: Marcel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

ich wollte mal fragen was der Stand ist bzgl. dem SamsungAh Protokoll 
und IRSND?

Gruß
Marcel

Autor: Frank M. (ukw) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Marcel schrieb:
> ich wollte mal fragen was der Stand ist bzgl. dem SamsungAh Protokoll
> und IRSND?

Sorry, ich bin noch nicht dazu gekommen. Aber ich denke, dass ich das am 
kommenden Wochenende fertigstellen werde.

Autor: Stefan B. (n0b0dy)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

würde das Interesse bestehen das Protokoll von MCE Funkfernbedienungen 
für PCs wie es sie z.B. von Medion, Toshiba oder Pearl gibt/gab zu 
integrieren?

: Bearbeitet durch User
Autor: Frank M. (ukw) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stefan B. schrieb:
> würde das Interesse bestehen das Protokoll von MCE Funkfernbedienungen
> für PCs wie es sie z.B. von Medion, Toshiba oder Pearl gibt/gab zu
> integrieren?

Ja, auf jeden Fall.

Autor: Stefan B. (n0b0dy)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Frank M. schrieb:
> Ja, auf jeden Fall.

Prima, dann wurdest du mir nicht umsonst im VDR-Portal empfohlen. ;-)

Ich bin leider kein top Programmierer und habe quasi null Erfahrung mit 
Protokollanalyse, trotzdem habe ich mich mal mit dem kleinen Saleae 
Logic Analyzer versucht.
Ich kann gerne mal jeden Tastendruck aufnehmen und hier die Logic oder 
die  CSV Datei(en) anhängen.

Zum Datenabgreifen habe ich einen Empfänger geöffnet, einen IC 
vorgefunden für den man ein Datenblatt findet und der Datenausgang auf 
eine Lötöse geführt wird.

Sagt mir was ihr ihr braucht und ich stelle euch die Daten zur 
Verfügung. :-)

Autor: Leo C. (rapid)
Datum:
Angehängte Dateien:

Bewertung
1 lesenswert
nicht lesenswert
Heute, bzw. gestern habe ich IRMP auf einem China STM32F103C8T6 Mini 
Development Board mit libopencm3 [1] zum Laufen gebracht. Es waren nur 
geringe Änderungen/Ergänzungen nötig (Diff im Anhang). Wenn Interesse 
besteht, die Änderungen in die Codebasis zu übernehmen, würde ich das 
ganze noch etwas aufhübschen und ein lauffähiges Beispielprogramm 
nachreichen.

Und vielen Dank für den super Decoder. Hat auf Anhieb funktionert. Um 
meinen vor Jahren mal geschriebenen RC5-Decoder anzupassen, hätte ich 
wahrscheinlich länger gebraucht.


[1] https://github.com/libopencm3/libopencm3

Autor: Frank M. (ukw) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Leo C. schrieb:
> Wenn Interesse besteht, die Änderungen in die Codebasis zu übernehmen,
> würde ich das ganze noch etwas aufhübschen und ein lauffähiges
> Beispielprogramm nachreichen.

Sehr gern kann ich Deine Änderungen in die Codebasis übernehmen.

Autor: Marcel (Gast)
Datum:

Bewertung
-1 lesenswert
nicht lesenswert
Frank M. schrieb:
> Marcel schrieb:
> ich wollte mal fragen was der Stand ist bzgl. dem SamsungAh Protokoll
> und IRSND?
>
> Sorry, ich bin noch nicht dazu gekommen. Aber ich denke, dass ich das am
> kommenden Wochenende fertigstellen werde.

Hi,

wollte mal fragem was der aktuelle Stand ist.
Gruß Marcel

Autor: Leo C. (rapid)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Meine libopencm3 Anpassungen dürften inzwischen einigermaßen vollständig 
sein. IRSND läuft jetzt auch, und zuletzt habe ich das IRMP-Logging über 
einen USART eingebaut.

Wens interessiert: Die Demoprogramme können unter [2] und das angepasste 
irmp unter [1] heruntergeladen werden.

Am schnellsten gehts mit
git clone --recursive http://cloudbase.mooo.com/git/irmp-demo

irmp und libopencm3 werden dann in Unterverzeichnisse von irmp-demo 
installiert.

[1] http://cloudbase.mooo.com/git/irmp
[2] http://cloudbase.mooo.com/git/irmp-demo

Autor: Text (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Leo:

>Am schnellsten gehts mit git clone --recursive http://cloudbase.mooo.com/
> git/irmp-demo

Nein, damit geht's gar nicht:

ssh: Could not resolve hostname cu.loc: Name or service not known
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.
fatal: clone of 'cu.loc:git/irmp' into submodule path 
'/tmp/irmp-demo/2/irmp-demo/irmp' failed
Failed to clone 'irmp'. Retry scheduled

Wo kommt dieses cu.loc her?

Wenn ich dann in irmp-demo/.git/config

[submodule "irmp"]
  url = cu.loc:git/irmp


durch

[submodule "irmp"]
  url = http://cloudbase.mooo.com/git/irmp

ersetze, kann ich per git submodule init/update
das Repo aktualisieren.

Aber dann:

$ make
libopencm3.rules.mk:93: libopencm3/mk/genlink-config.mk: No such file or 
directory
libopencm3.rules.mk:167: libopencm3/mk/genlink-rules.mk: No such file or 
directory


???

Autor: Leo C. (rapid)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Erstmal danke fürs Testen.

> Wo kommt dieses cu.loc her?

Schlamperei, mein lokaler Nameserver kennt den Host aber.

> Wenn ich dann in irmp-demo/.git/config
>
> [submodule "irmp"]
>   url = cu.loc:git/irmp
> durch
>
> [submodule "irmp"]
>   url = http://cloudbase.mooo.com/git/irmp

Das habe jetzt so auf dem Server korrigiert.

> ersetze, kann ich per git submodule init/update
> das Repo aktualisieren.

> Aber dann:
>
> $ make
> libopencm3.rules.mk:93: libopencm3/mk/genlink-config.mk: No such file or
> directory
> libopencm3.rules.mk:167: libopencm3/mk/genlink-rules.mk: No such file or
> directory

Bei mir wurde wg. obigem Fehler das Submodul libopencm3 nicht richtig 
geladen (Alle Dateien waren gelöscht). Ein 'git reset HEAD' im 
Verzeichnis libopencm3 hats gerichtet.

Die Alternative wäre in einem neuen Verzeichnis nochmal ganz vorne mit
'git clone --recursive ...' anzufangen.

Wenn man libopencm3 schon irgendwo installiert hat, kann man auch im 
irmp-demo Makefile den Pfad (OPENCM3_DIR) dorthin zeigen lassen.

Autor: Text (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
git clone jetzt ok.

Aber immer noch:

$ (cd libopencm3; git reset HEAD)
$ make
libopencm3/mk/genlink-config.mk:63: libopencm3/lib/libopencm3_stm32f1.a 
library variant for the selected device does not exist.
make: Nothing to be done for 'all'.

Das:

>Wenn man libopencm3 schon irgendwo installiert hat, kann man auch im
>irmp-demo Makefile den Pfad (OPENCM3_DIR) dorthin zeigen lassen.

geht allerdings.

Autor: Text (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
NB:

Wenn man zuerst im libopencm3 ein

$ make

laufen lässt und dann in  ./irmp-demo
ebenfalls, geht es.

Hätte man das wissen müssen?

Autor: Text (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Hätte man das wissen müssen?

Ja, wenn man

>libopencm3/mk/genlink-config.mk:63: libopencm3/lib/libopencm3_stm32f1.a
>library variant for the selected device does not exist.

richtig interpretiert hätte...

Autor: Andres Bergmann (adb)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo liebe Leute.
Gibt es beim ATmega 328P irgend welche Besonderheiten die ich beachten 
muss, um die IRMP zum laufen zu bekommen. In Anderen Schaltkreisen 
ATtiny26_16UP und ATtiny 85  klappe das sofort.
Der ATmega 328P soll andere Pinbezeichnungen haben PORTB6 anstand PB6,
oder müssen andere FUSE Bits gesetzt werden,  der Defaultwerte ist 8Mhz 
Werksseitig  ? Selbst mit der irmp-main-avr.c   um eine LED zu Starten 
if (irmp_get_data (&irmp_data)) {PORTD = (1<<PORTD7);} Die IDE ist, AVR 
Studio 7, und im C Compiler - Symbols ist bei (-D) F_CPU=8000000UL 
eigetragen bei Optimization ist (-Os) gesetzt.
Passiert nix.
Liebe Grüße an alle

Autor: Andres Bergmann (adb)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich hab es gefunden, und läuft, Liebe Grüße an Frank.M, ich hatte 
vergessen in den Low Fuse das Häckcen für die interne Teilung durch 8 
rauszunehmen.
Liebe Grüße Andres

Autor: Ulf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dieses Projekt is eine super Sache!
Vor vielen Jahren hatte ich mal mit RC5 rumgespielt...

Jetzt soll was mit einer FB vom Schrott angesteuert werden. Die kleinen 
Stolpersteine ließen sich durch lesen der Dokumentation vollständig 
beseitigen.

Danach geguckt, welches Protokoll verwendet wird, alle anderen 
Protokolle wieder ausgeknipst und man kann sich auf die eigentliche 
Applikation konzentrieren.

Vielen herzlichen Dank an alle Beteiligten!
Ulf

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich bin neu auf dem Gebiet der AVRs. Ziel meines ersten Projektes soll 
es sein, u. a. Relais auf einer Netzteilplatine mittels einer 
Fernbedienung zu schalten. Nicht die schwerste Angelegenheit, aber an 
einer Stelle hänge ich nun. Mein Code sieht folgendermaßen aus:


//wenn Taste auf Fernbedienung gedrückt
if (irmp_get_data (&irmp_data))
{

  //wenn Apple Protokoll
  if (irmp_data.protocol == IRMP_APPLE_PROTOCOL)
  {

    //wenn Play-Taste grdrückt
    if (irmp_data.command == 0x05)
    {

      //wenn Taste nicht lang gehalten (aber entprellt)
      if (!(irmp_data.flags & IRMP_FLAG_REPETITION))
      {

        //wenn ausgeschalteter Zustand
  if(prev==0)
  {

    // toggle Relais
      PORTD ^= ((1<<PD6) | (1<<PD4));

      // toggle LEDs
      PORTB ^= ((1<<PB1) | (1<<PB2));

    prev=1;
  }
      }

      //wenn Taste lang gehalten
      if (irmp_data.flags & IRMP_FLAG_REPETITION)
      {

        //wenn eingeschalteter Zustand
  if(prev==1)
  {

          // toggle Relais
      PORTD ^= ((1<<PD6) | (1<<PD4));

      // toggle LEDs
      PORTB ^= ((1<<PB1) | (1<<PB2));

    prev=0;
  }
      }
    }
  }
}


Natürlich kann man das kürzer schreiben, aber zum Probieren und 
Auskommentieren vorteilhaft.
Ich verwende eine Apple Remote. Durch kurzes Drücken der 
Play/Pause-Taste sollen die Relais anziehen und durch langes Drücken 
wieder abfallen. Das funktioniert auch soweit, allerdings könnte die 
Zeitspanne, bis eine langes Drücken erkannt wird länger sein. Kann man 
das nachjustieren oder muss ich das in meinem Code berücksichtigen?

Des Weiteren ist es bei der Apple Remote der Fall, dass die 
Play/Pause-Taste zwei verschiedene Befehle direkt nacheinander sendet. 
Diese sind 0x5f gefolgt von 0x05. Ich habe festgestellt, dass das lange 
Drücken in Verbindung mit dem Befehl 0x5f nicht erkannt wird, mit dem 
Befehl 0x05 allerdings schon. Wie ist das zu erklären?

Verwende ich nun eine andere Taste, die lediglich einen einzigen Befehl 
sendet, habe ich festgestellt, dass mit meinem obigen Code das 
vermeintlich kurze Drücken dieser Taste zum Ein- und wieder zum 
sofortigen Ausschalten der Relais führt. Der kurze Tastendruck wird also 
vereinzelt bereits als langer Tastendruck erkannt? Auch hier stelle ich 
wieder die gleiche Frage. Kann die Zeitspanne, nach deren Ablauf ein 
langer Tastendruck erkannt wird, vergrößert werden?
Und warum tritt das Verhalten bei der Play/Pause-Taste mit zwei 
gesendeten Befehlen nicht auf?


Viele Grüße
Oliver

Autor: Jörg R. (jrie)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das kannst du mit einem Repeat Counter machen.
https://github.com/j1rie/IRMP_STM32/blob/master/ST...
Zeile 669 bis 675.
MIN_REPEATS entsprechend deinem Bedarf einstellen.

Autor: Frank M. (ukw) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oliver schrieb:
> Das funktioniert auch soweit, allerdings könnte die Zeitspanne, bis eine
> langes Drücken erkannt wird länger sein. Kann man das nachjustieren oder
> muss ich das in meinem Code berücksichtigen?

Du hast eventuell die Bedeutung des Flags etwas missverstanden. Flag = 1 
heisst nicht unbedingt, dass der Anwender die Taste wesentlich länger 
gedrückt hat. Es heisst eher, dass die FB einen Frame wiederholt 
ausgesandt hat - meist aufgrund eines längeren Tastendrucks. Das können 
auch schon mal 10 Frames (und damit auch 10x IRMP-Daten mit gesetztem 
Flag) lang sein, obwohl Du gefühlt erst eine halbe Sekunde gedrückt 
hast. Die FB feuert dann halt so schnell sie kann.

> Kann man das nachjustieren oder
> muss ich das in meinem Code berücksichtigen?

Jörg hat es mit seiner Antwort schon angerissen.

Hier nochmal mit anderen Worten:

Du musst das selber machen: Zähle einfach, wie oft Du Du einen 
Wiederholungsframe erhältst, also wie oft das Flag = 1 hintereinander 
gesetzt ist. Teste erstmal den Zähler auf 10, wenn dir das zu lang 
vorkommt, dann reduziere den Testwert.

: Bearbeitet durch Moderator
Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich danke Euch für die Hilfe! Fünf kleine Zeilen ergänzt und es 
funktioniert wie gewünscht.

Grüße
Oliver

Autor: Arthur (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oliver schrieb:
> Ich danke Euch für die Hilfe! Fünf kleine Zeilen ergänzt und es
> funktioniert wie gewünscht.

Schön das du uns an der Lösung teil haben läßt, so das Leute mit 
ähnlichen Problemen hier gleich die Lösung finden können.

Autor: Marcel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Moin,

da ich irgendwie vergessen worden bin was das Samsung AH Protokoll in 
der IRSND Lib angeht, hab ich mich mal selbst versucht da das Projekt 
sonst umsonst war!

Reicht es folgenden Block in die irsnd.c aufzunehmen mit entsprechenden 
Konstanten in irsndconfig.h?

Leider verstehe ich die Kommentare nich bei den Bitoperationen wie 
AAAAAAAAA oder CCCCCCCC. Evtl. kann mir das jmd. erklären.

#if IRSND_SUPPORT_SAMSUNGAH_PROTOCOL == 1
        case IRMP_SAMSUNGAH_PROTOCOL:
        {
            address = bitsrevervse (irmp_data_p->address, 
SAMSUNGAH_ADDRESS_LEN);
            command = bitsrevervse (irmp_data_p->command, 
SAMSUNGAH_COMMAND_LEN);

            irsnd_buffer[0] = (address & 0xFF00) >> 8; 
// AAAAAAAA
            irsnd_buffer[1] = (address & 0x00FF); 
// AAAAAAAA
            irsnd_buffer[2] = (command & 0xFF00) >> 8; 
// CCCCCCCC
            irsnd_buffer[3] = (command & 0x00FF); 
// CCCCCCCC
            irsnd_busy      = TRUE;
            break;
        }
#endif

Autor: Uwe (Gast)
Datum:

Bewertung
1 lesenswert
nicht lesenswert
Hallo,

ich habe mal einen Versuch gestartet irmp in nodemcu unterzubringen und 
folglich mittels Lua zugänglich zu machen. Das war letztlich garnicht so 
schwer und funktioniert gut. Es reichen dann folgende Aufrufe in Lua:

irmp.init()
irmp.startrecv(
  function(pn, n, a, c, f)
    print(pn..": addr="..a..", cmd="..c..", flag="..f)
  end
)

Mit jedem empfangenen Code wird die Callback-Funktion aufgerufen, die in 
diesem Fall das Protokoll, die Adresse, das Kommando und die Flags 
ausgibt.

z.B.

NEC: addr=47685, cmd=5, flag=1

Wenn daran Interesse besteht, kann ich das mal zusammen packen und z.B. 
hier posten.

  Uwe

Autor: Helmut K. (chaosbastler)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Frank

ich benutze das  IR-LCD von Klaus Leidinger. Weshalb wird bei einem 
normalen NEC-Code (8bit-Adresse, 8bit Befehl) der Code immer 4-stellig 
als Hex ausgegeben.
Als Beispiel: Yamaha Fernbedienung RAX9, Power-Taste.
Angezeigt wird: Adresse: 857A , Command: 1F
Ich habe den Schaltplan zum Yamaha Gerät und da stehen auch
die Hex-Codes für die Fernbedienung drin. Power-Taste = Adresse: 7A , 
Command: 1F
Wenn ich jetzt den Code einer Fernbedienung nicht kenne , diesen mit 
IRMP auslese und dann in meinem Programm verwende, würde dies ja nicht 
funktionieren da die FB ja nur die Hex-Adresse 7A sendet u. nicht 857A.
Wie müßte ich denn IRMP abändern wenn ich die Ausgabe auf dem LCD
nicht im Hex- sondern im Dezimal-Format haben möchte.
Ich bin ein kpl. Anfänger was C betrifft.

Im Vorraus besten Dank
Helmut

Autor: Frank M. (ukw) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Helmut K. schrieb:
> Weshalb wird bei einem normalen NEC-Code (8bit-Adresse, 8bit Befehl) der
> Code immer 4-stellig als Hex ausgegeben.

Das liegt daran, dass der NEC-IR-Code irgendwann später aufgebohrt 
wurde, um mehr verschiedene Geräteadressen zu ermöglichen. Schau Dir das 
aus dem IRMP-Artikel an:

  https://www.mikrocontroller.net/articles/IRMP#NEC_...

Aus dem NEC-Frame:
8 Adress-Bits + 8 invertierte Adress-Bits + 8 Kommando-Bits + 8 invertierte Kommando-Bits

wurde irgendwann im Extended NEC-Format:
16 Adress-Bits + 8 Kommando-Bits + 8 invertierte Kommando-Bits 

Das heisst: die 8 invertierten Adress-Bits gibt es nicht mehr zwingend, 
sondern sind nun frei wählbar. Dadurch erhöht sich die Anzahl der 
maximalen Geräeteadressen von 265 auf 65536.

Aus diesem Grund verwendet IRMP die kompletten 16 Bit zur Angabe der 
Adresse und ist damit abwärtskompatibel zum alten Standard-NEC-Format. 
Möchtest Du einen NEC-Code per IRSND auch wieder senden, dann musst 
Du für die Adresse deshalb den kompletten 16-Bit-Code für die 
Geräteadresse angeben.

> Ich habe den Schaltplan zum Yamaha Gerät und da stehen auch
> die Hex-Codes für die Fernbedienung drin. Power-Taste = Adresse: 7A

Der invertierte Wert von 7A (alle Bits kippen) ist 85. Das passt also 
perfekt zu 857A, was IRMP ausgibt. Im Yamaha-Handbuch steht halt die 
alte Schreibweise drin, als es noch kein Extended NEC-Format gab.

> Wie müßte ich denn IRMP abändern wenn ich die Ausgabe auf dem LCD
> nicht im Hex- sondern im Dezimal-Format haben möchte.

In IRMP: Gar nicht. IRMP ist lediglich eine Bibliothek, die keine 
Benutzerinteraktion hat und sich schon gar nicht um 
Ausgabe-Zahlenformate kümmert.

Die Ausgabe auf dem LCD hat Klaus dazuprogrammiert, wahrscheinlich zu 
finden in seinem main.c.

Ich halte von der dezimalen Ausgabe in diesem Fall jedoch wenig bis gar 
nichts. Die meisten IR-Fernbedienungen benutzen eine Tastatur-Matrix, 
deren Kommandos hexadezimal codiert sind. Da findest Du dann z.B.
Taste "1" = 0x11  erste  Reihe, erste  Spalte
Taste "2" = 0x12  erste  Reihe, zweite Spalte
Taste "3" = 0x12  erste  Reihe, dritte Spalte
Taste "4" = 0x21  zweite Reihe, erste  Spalte
Taste "5" = 0x22  zweite Reihe, zweite Spalte
Taste "6" = 0x23  zweite Reihe, dritte Spalte
Taste "7" = 0x31  dritte Reihe, erste  Spalte
Taste "8" = 0x32  dritte Reihe, zweite Spalte
Taste "9" = 0x33  dritte Reihe, dritte Spalte

Oder auch:
Taste "1" = 0x31
Taste "2" = 0x32
...
Taste "9" = 0x39

In dezimaler Schreibweise würde man so eine Systematik schwerlich 
erkennen.

> Ich bin ein kpl. Anfänger was C betrifft.

Ich empfehle, Dir zumindest Grundkenntnisse über das Hexadezimal-System 
anzueignen. Gerade bei der Programmierung von µCs hilft es ungemein, 
Werte hexadezimal lesen zu können - zumindest bis 0xFF. Dafür muss man 
nicht konkret wissen, was z.B. 0xE5 in dezimal ist. Es geht lediglich 
um das Verständnis.

Dass das Yamaha-Handbuch die Adresse ebenso in Hex (7A) ausgibt, hat 
schon einen Grund...

: Bearbeitet durch Moderator
Autor: Helmut K. (chaosbastler)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Frank
danke für deine Antwort.

> Frank M. schrieb
>Aus dem NEC-Frame: 8 Adress-Bits + 8 invertierte Adress-Bits
> + 8 Kommando-Bits + 8 invertierte Kommando-Bits
> wurde irgendwann im Extended NEC-Format:
> 16 Adress-Bits + 8 Kommando-Bits + 8 invertierte Kommando-Bits

Ich hatte mir so etwas schon gedacht.
Danke

Autor: Matthias Frank (frank91)
Datum:
Angehängte Dateien:

Bewertung
1 lesenswert
nicht lesenswert
Hallo

ich habe die IRMP und IRSND Library erweitert.
Nun werden STM32 Controller mit der HAL-Library unterstützt.
Es ist somit möglich ein Projekt mittels STM32CubeMX zu erstellen und 
die Library einzubinden.

Momentan ist die Library so eingestellt, dass wenn man im Cube die 2 
benötigten Pins "IRMP_Receive" und "IRSND_Transmit" bennent, diese 
direkt von der Library übernommen werden.
In diesem Fall muss man nur noch den Timer in irsndconfig.h anpassen

Verwendet habe ich hierfür das Board "NUCLEO F103RB" mit dem Controller 
STM32f103RB.
Da die HAL-Library für alle STM32 Controller gleich ist sollten alle 
anderen Controller auch kein Problem sein.
Getestet habe ich es allerdings nur mit dem STM32f103RB.

: Bearbeitet durch User
Autor: Frank M. (ukw) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Matthias F. schrieb:
> Nun werden STM32 Controller mit der HAL-Library unterstützt.

Vielen Dank, werde ich mir anschauen und ins nächste Release mit 
einbauen :-)

Autor: Klaus R. (klaus2)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

hat schon mal jmd von euch IRMP Sender & Empfängerroutine als eine 
lernbare FB laufen lassen und dazu vll ein fertiges Projekt? Ich suche 
eine Möglichkeit 10 Tasten mit B&O Codes zu belegen (eine normale 
lernbare FB kann das wg den 455kHz nicht).

Danke!

Autor: Frank M. (ukw) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Artikel "DIY Lernfähige Fernbedienung mit IRMP":

http://www.mikrocontroller.net/articles/DIY_Lernf%...

Beachte, dass Du wg. den 455 kHz einen passenden TSOP brauchst.

: Bearbeitet durch Moderator
Autor: Klaus R. (klaus2)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
...jepp, das weiß ich...Top, da ist ja alles fertig! Das suchte ich als 
Grundlage...wenn ich NICHT lerne müssten ja auch 2xAAA reichen, oder?

Klaus.

: Bearbeitet durch User
Autor: Frank M. (ukw) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Da Du 10 Tasten brauchst, musst Du entweder die Schaltung und das 
Programm etwas anpassen oder die 5 Tasten in den 3 angebotenen Ebenen 
verwenden.

Autor: Klaus R. (klaus2)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja ist mir klar...wird kein Problem sein, deine Doku ist ja gut. 2xAAA 
natürlich nur mit lowvolt AVR...aber dann gehts, oder? Wie groß wird der 
Code, reichen 4k (Atiny44 hätte ich noch genug da)?

Klaus

: Bearbeitet durch User
Autor: Frank M. (ukw) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Klaus R. schrieb:
> wenn ich NICHT lerne müssten ja auch 2xAAA reichen, oder?

Neuere TSOPs arbeiten auch schon ab 2,5V. Der TSOP wird in dem oben 
genannten Projekt vom ATmega selbst versorgt und wird abgeschaltet, 
solange man nicht anlernt. Er verbraucht also im Normalbetrieb keinen 
Strom.

Bei 2xAAA solltest Du den Basiswiderstand vor dem Transistor anpassen, 
nämlich z.B. 820 Ohm wählen.

Autor: Klaus R. (klaus2)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Anpassungen auf 3V waren klar, die TSOP 2,5V Info kannte ich nicht - ich 
prüfe ob TSOP7000 das auch kann, Danke! Code wird um die 7k, mal sehen 
ob er unter 4k geht, wenn ich nur B&O nutze.

Werden die Befhele im E² abgelegt, falls mal die Batterie leer ist? Dazu 
fand ich keine Infos (würde das dann mit einer 150er LiPo aufbauen).

Tolles Teil und schon fast ein Youngtimer! :) Danke, Frank!

Autor: Frank M. (ukw) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Klaus R. schrieb:
> Wie groß wird der Code, reichen 4k (Atiny44 hätte ich noch genug da)?

Wenn Du nur B&O als Protokoll freischaltest, könnten 4k (knapp) reichen, 
musst Du ausprobieren. Ich hatte den ATmega gewählt, weil der ein 
relativ großes EEPROM zum Speichern der Codes hat. Aber Du kannst 
natürlich die Makro-Fähigkeit rauswerfen, schließlich gibts für jede 
Taste 3 Ebenen und pro Ebene und Tasten 5 Codes, also 15 pro Taste. 5 x 
15 = 75 Codes. Du brauchst aber nur 10.

Sollten IRMP und IRSND zusammen mit dem nötigen Anwendungscode nicht in 
die 4K Flash passen könntest Du folgendes machen:

Die 10 Tasten einmal per IRMP (ohne IRSND) anlernen und dann im EEPROM 
speichern, anschließend die abgespeckte Anwendung mit IRSND (ohne IRMP) 
flashen.

Da bei Dir das Anlernen der 10 Tasten wahrscheinlich ein einmaliger 
Vorgang ist, wäre das ein gangbarer Weg für Dich.

Autor: Klaus R. (klaus2)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
...daran dachte ich auch schon - und ob ich die Tasten über den ADC 
eines Tiny45 einlesen werde...hmmm :) Das mit der LED als Receiver hat 
sich vermtl nie umsetzen lassen, oder (ist ja auch egal, aber sehr 
interessant)?

Klaus.

Autor: Frank M. (ukw) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Klaus R. schrieb:
> - ich prüfe ob TSOP7000 das auch kann, Danke!

TSOP7000 geht ab 2,7V, sollte also passen.

> Code wird um die 7k, mal
> sehen ob er unter 4k geht, wenn ich nur B&O nutze.

Wie gesagt: Du könntest daraus auch 2 Programme machen, eins zum 
Anlernen und eins zum Abspielen. Dann sollte es auf jeden Fall passen.

> Werden die Befhele im E² abgelegt, falls mal die Batterie leer ist?

Ja, die werden im EEPROM gespeichert. Beim ATTiny ist natürlich nicht so 
viel Platz, da musst Du abspecken, siehe Tipps oben. 10 Codes gehen auf 
jeden Fall :-)

: Bearbeitet durch Moderator
Autor: Frank M. (ukw) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Klaus R. schrieb:
> Das mit der LED als Receiver hat sich vermtl nie umsetzen lassen

LED als Receiver? Das wird wohl nur gehen, wenn Du sämtliche Störungen 
aus der Umgebung ausschließen kannst. Nimm lieber einen TSOP, damit geht 
das wesentlich entspannter.

Autor: Klaus R. (klaus2)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
...habe IRMP schonmal verwendet um ein altes Radio aus den 70iger FBbar 
zu machen, da passten in den Attiny auch alles rein für 10 Tasten plus 
das andere Zeug für Releais & Quellenstrg, Anzeige, I2C Poti und so - 
ich versuchs mal am Wochenende, bin schon sehr gespannt :)

Danke & schönen Feierabend!

: Bearbeitet durch User
Autor: Frank M. (ukw) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Klaus R. schrieb:
> und ob ich die Tasten über den ADC eines Tiny45 einlesen werde..

Ich weiß nicht, ob Du damit den Tiny aufwecken kannst. Normalerweise ist 
der verwendete ATmega im Sleep-Mode und verbrät nur wenige µA, um die 
Batterie zu schonen.

: Bearbeitet durch Moderator
Autor: Frank M. (ukw) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Klaus R. schrieb:
> ...habe IRMP schonmal verwendet um ein altes Radio aus den 70iger FBbar
> zu machen, da passten in den Attiny auch alles rein für 10 Tasten plus
> das andere Zeug für Releais & Quellenstrg, Anzeige, I2C Poti und so -
> ich versuchs mal am Wochenende, bin schon sehr gespannt :)

Na dann viel Spaß!

Wenns läuft, kannst Du Dein Projekt ja gerne vorstellen :-)

Autor: Klaus R. (klaus2)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
...dann muss ich wieder Prügel für den dirty-Code enstecken :) Daher 
gibts dann nur Bilder und die B&O Codes (aus dem EEPROM). Aber du weißt 
ja, wie das mit so Vorhaben am WE ist - es kommt immer was dazwischen! 
:)

Gruß, Klaus.

Autor: Frank M. (ukw) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Klaus R. schrieb:
> ...dann muss ich wieder Prügel für den dirty-Code enstecken :)

Wieso "wieder"? ;-)

Ich biete mich gern an, den Code zu überarbeiten, wenn er dann nächstes 
... ähem ... übernächstes Wochenende fertig wird ;-)

Autor: Klaus R. (klaus2)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
...so, was ich hier an Geräten nicht habe, habe ich entfernt (zudem UART 
+ BOOTLOADER) - bin bei knapp 5k, aber dem Attiny85 ja egal. Afaik läuft 
das auch mit internem RC ausreichend sauber, oder (auch beim 455kHz 
Protokoll)?

Nun muss ich noch kapieren, wie die Tastenroutine genau funktioniert und 
durch den ADC die Tasten auswerten (am besten einfach der existierenden 
Routine "vorgaukeln") - da die üblichen Mikrotaster ja immer 
Doppelkontakte haben, werde ich damit den ADC und einen PCINT0 bedienen 
- dann weckt jeder Tastendruck den uC UND kann per ADC ausgewertet 
werden - oder?

Ich würde nur eine LED verwenden und diese je nach gewählter "Bank" 
n-Mal blinken lassen. Vll auch beim Senden, damit man immer mal wieder 
sieht, "wo" man ist.

EDIT: Aber vll flansche ich das erstmal auf ein BB und teste, ob das B&O 
"Master Control Panel 5500" überhaupt damit läuft - sonst kann ich mir 
das gleich schenken.

Klaus.

: Bearbeitet durch User
Autor: Frank M. (ukw) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Klaus R. schrieb:
> da die üblichen Mikrotaster ja immer Doppelkontakte haben,

Wäre mir neu, wenn sie Doppelkontakte haben. Ich kenne das nur so, dass 
jeweils zwei der vier Pins immer paarweise miteinander verbunden sind. 
Aber ich lasse mich gern eines besseren belehren :)

> werde ich
> damit den ADC und einen PCINT0 bedienen - dann weckt jeder Tastendruck
> den uC UND kann per ADC ausgewertet werden - oder?

Hm, wenn die Taster wirklich Doppelkontakte haben, ja. Sonst: nein.

> EDIT: Aber vll flansche ich das erstmal auf ein BB und teste, ob das B&O
> "Master Control Panel 5500" überhaupt damit läuft - sonst kann ich mir
> das gleich schenken.

Ja. Alles Step by Step.

Autor: Klaus R. (klaus2)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Grmpf - du hast natürlich Recht. Also einige BAT42 in SMD spendieren, 
auch OK.

Klaus.

Autor: Klaus R. (klaus2)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
...da ich den TSOP ja eh sockeln muss (wg 38 vs 455 kHz) überlegte ich, 
ob man den OUTPUT Pin (vom uC) der IR Diode nicht als INPUT Pin für den 
TSOP nutzen kann (ggf mit Steckbrücke im TSOP Sockel) - beides 
gleichzeitig braucht man ja eh nicht und es wäre eine weitere 
Optimierung. Geschaltete Stromversorgung für den TSOP entfällt dann eh.
Nun ist mal alles aufs Breadboard gesteckt und ich muss die Register 
noch auf Tiny85 ändern, dann erfolgt ein erster Versuch mit einem 
"normalen" 38kHz Gerät...

Klaus.

Autor: Klaus R. (klaus2)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
...sooo, nachdem ich kapiert habe, dass IRSND in dem Projekt einfach zu 
alt war (Definitionen für die Tinys fehlten), habe ich die neue Version 
eingebunden und kann nun über 2 Tasten (Select & PWR) immerhin einen 
Befehl aus den 3 Bänken mit dem Tiny schicken. HW und SW sind also 
soweit iO, die Glotze geht an/aus. Nun muss die Abfrage der am ADC 
angeschlossenen Tasten implementiert werden, (für mich) die eigentliche 
Herausforderung an der Sache.

Klaus.

Autor: Frank Link (Firma: Flk Consulting UG) (flk)
Datum:

Bewertung
-1 lesenswert
nicht lesenswert
Hallo,
Warum die Tasten mit ADC auswerten, wieviele Tasten willst Du abfragen 
und wieviele Pins hast Du frei?

Gruß
Frank

Autor: Frank M. (ukw) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Frank L. schrieb:
> Warum die Tasten mit ADC auswerten, wieviele Tasten willst Du abfragen
> und wieviele Pins hast Du frei?

Klaus schrieb oben etwas vom ATTiny85. Damit hat man nicht viel 
Spielraum ;)

Autor: Klaus R. (klaus2)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
...so, auch das mit dem ADC läuft - ABER aus einem mir noch unbekannten 
Grund blockiert der ADC_read(); den IR Empfang / Lernprozess. Das kapier 
ich aber heute wohl nicht mehr...alles was sonst so geplant war, läuft. 
Fast fertig.
/*-----------------------------------------------------------------------------------------------------------------------
 * Initialize ADC
 *-----------------------------------------------------------------------------------------------------------------------
 */
static void
adc_init (void)
{

  ADMUX = (1<<REFS1);                                    // Interne Referenz 1,1V
  ADCSRA = (1<<ADSC) | (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS1);                  // Frequenzvorteiler 128
  ADCSRB |= (0<<ADLAR);                                    // Linksbündig = 1
  ADCSRA |= (1<<ADEN);                                    // Enable ADC

}


/*-----------------------------------------------------------------------------------------------------------------------
 * Read ADC value
 *-----------------------------------------------------------------------------------------------------------------------
 */

uint16_t ADC_Read(void){

  uint16_t ADC_value=0;

  ADMUX  |= (1<<MUX0);                      // Kanal ADC1 (PB2)
  
  ADCSRA |= (1<<ADSC);                            // eine Wandlung "single conversion"
  
  while (ADCSRA & (1<<ADSC) ) {}                   // auf Abschluss der Konvertierung warten

  ADC_value = ADCL;                           // mit uint16_t x
  ADC_value += (ADCH<<8);                     // in zwei Zeilen (LSB/MSB-Reihenfolge und
                                        // C-Operatorpriorität sichergestellt)
  
  return ADC_value;                               // ADC auslesen und zurückgeben

}

Den ADC habe ich nun über ein mode-flag während RX bzw TX abgeschaltet, 
weil das sonst nicht geht - aber wieso? Iwas bremst der aus...ist das 
sampling eine ISR?

@Frank L.: Mein Ziel ist es das ganze zu minimalisieren - ich hatte iwie 
keinen Lust auf einen AT168 (und auch keinen da) und Tasten über ADC 
auswerten find ich iwie grdstzl pfiffig.

EDIT: cnt = irmp_data[k].flags+1;  // get number of frames to send

-> Die "+1" sorgt bei mir dafür, dass der Fernseher (Toshiba!) stehts 
an->aus->an geht, vermtl in Verbindung mit der neuen irsnd iwie fehl am 
Platze? Gelöscht, geht.

Klaus.

: Bearbeitet durch User
Autor: Klaus R. (klaus2)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
key_poll(); wird in der ISR aufgerufen und triggert dann den 
ADC_read();, der mit while alles blockiert - das muss geändert werden, 
keine Frage.

@ukw: Wieso aber die Befehle immer 2x gesendet werden (ich schalte in 
send_key(); die LED pro Frame einmal an/aus) und der Toshiba dann 
ein->aus->ein geht, ist mir noch nicht klar, da bist du aber eher der 
Profi? Fehlt dann da das Wiederholungs-Flag? Oder hat sich beim Toshiba 
Protokoll etwas geändert? Ich versuche es mal mit anderen IR Geräten...

Klaus.

Autor: Klaus R. (klaus2)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
ADC wird nun alle x-ms aufgerufen, die Diodenveroderung mit PCINT1 
funktioniert auch, alles läuft. sleep_cpu() musste ersetzt werden, bin 
nun im tiefschlaf im AT85. Fast fertig, dann muss ich noch eine HW (die 
den Namen verdient) mit etwas WAF fertigen...und der TSOP7000 muss mich 
endlich erreichen (oder ich zapfe den Beomaster direkt an).

EDIT: Letztes Problem ist, das durch Umbau auf ADC Tasten der Prog-Modus 
immer einen "Abbruch" erkennt, bin aber noch nicht ganz dahinter 
gekommen, wo & warum...

Klaus.

: Bearbeitet durch User
Autor: Klaus R. (klaus2)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
...mit einer JVC FB geht es, es wird nur 1x gesendet (bzw das 
entsprechende "Toggle Bit" gesetzt), der Receiver regiert nur mit "an" 
oder "aus". Vermutung ist also, das im IRMP beim Toshiba Protokoll etwas 
nicht ganz stimmt...falls du Infos brauchst (ein eep Dump zB), gerne.

EDIT: Der Abbruch wurde ausgelöst, weil der ADC dtl seltender die Tasten 
abfragt und daher noch der "alte" Wert drnsteht, was zu einem Abbruch 
führt:

else if (key == KEY_PROG_VALUE)
                        {
                            cancelled = TRUE;
                            break;
                        }

Klaus.

: Bearbeitet durch User
Autor: Klaus R. (klaus2)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
...so, wenn ich das Ganze auf der Ziel-HW habe, dann ist wieder das 
Problem, dass die ADC Werte der Tasten etwas unterschiedlich zum 
Breadboard sind - hier wäre nun noch eine Anlern-Routine sinnvoll: 
Drücke 3x Taste n bis LED kurz an geht, dann Taste n+1...usw, die 
Mittelwerte dann inkl. im EEPROM sichern und mit einer erlaubten 
Abweichung zur Auswertung nutzen. Mal sehn...

Klaus.

Autor: Frank M. (ukw) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Klaus R. schrieb:
> Wieso aber die Befehle immer 2x gesendet werden (ich schalte in
> send_key(); die LED pro Frame einmal an/aus) und der Toshiba dann
> ein->aus->ein geht, ist mir noch nicht klar,

Ich hatte Dir ja schon geantwortet per Mail, eben gerade nochmal.

Du solltest beim Anlernen grundsätzlich Wiederholungsframes ignorieren, 
also nur die Frames speichern, wo das Repetition-Flag NICHT gesetzt ist.

Pseudocode:
if (! (irmp_data.flags & IRMP_FLAG_REPETITION))
{
    store_in_eeprom (irmp_data.protocol, irmp_data.address, irmp_data.command, irmp_data.flags & 0xF0);
}
else
{
    ignore frame;
}

Damit ist dann auch ausgeschlossen, dass Du beim Senden versehentlich 
Wiederholungsframes erzeugst, die zu 95% unsinnig sind.

Autor: Klaus R. (klaus2)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
...ich hatte dir auch schon geantwortet :) und bin davon ausgegangen, 
das irmp & irsnd das in Verbindung mit remotecontrol.c 
(DIY_Lernfähige_Fernbedienung_mit_IRMP) selber regeln - das war aber 
dann wohl falsch. Also muss ich morgen "mal gucken".

EDIT: Vll liegt hier der Hase im Pfeffer...:

while (ms_cnt < 250)
                    {
                        // some devices need a repeated frame to accept the command, e.g. POWER command on Toshiba TV to switch off
                        if (! cancelled && irmp_data[k].protocol != 0xFF)       // after 250 ms....
                        {
                            IRMP_DATA id;

                            if (irmp_get_data (&id))                            // ... receive IR signal again
                            {
                                if (id.flags == 1)                              // it's a repeated frame, store it!
                                {
                                    framecnt++;
                                }
                                cli ();
                                ms_cnt = 0;
                                sei ();
                            }
                        }
                    }

                    irmp_data[k].flags = framecnt;


Danke, Klaus.

: Bearbeitet durch User
Autor: Frank M. (ukw) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Klaus R. schrieb:
> Vll liegt hier der Hase im Pfeffer...:

Ja, glaube ich auch.

> // some devices need a repeated frame to accept
> the command, e.g. POWER command on Toshiba TV to switch off

Mittlerweile kann ich mich daran wieder erinnern. Ich hatte damals auch 
einen Tobshiba-Fernseher. Der wollte immer 2 Frames beim 
Ein-/ausschalten, sonst hat der Fernseher nicht reagiert. Die 
Original-FB hat das auch immer brav bei der Power-Taste so gemacht, egal 
wie kurz man die Power-Taste gedrückt hat.

Aus diesem Grund habe ich auch die Anzahl der Wiederholungen im EEPROM 
gespeichert.

Das war aber wohl ein spezielles Feature meines Fernsehmodells. Ich 
empfehle Dir daher, den Code folgendermaßen zu ändern:

Die letzte Zeile aus Deinem Code-Auszug:
irmp_data[k].flags = framecnt;

folgendermaßen ändern:
irmp_data[k].flags = 0;

Bei Deiner FB sollte es aber eigentlich nur passieren, wenn Du beim 
Anlernen die Taste zu lange drückst. Mit obiger Änderung sollte es dann 
kein Problem mehr sein.

: Bearbeitet durch Moderator
Autor: Klaus R. (klaus2)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
GENAU das hatte ich QnD morgen vor!

Toshiba hat das übrigens geändert ;)

Danke! Klaus.

: Bearbeitet durch User
Autor: Frank M. (ukw) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Klaus R. schrieb:
> GENAU das hatte ich QnD morgen vor!

Gut.

> Toshiba hat das übrigens geändert ;)

Das glaube ich. Ist auch schon 7 Jahre her, wo mir das aufgefallen ist.

Übrigens steht im Artikel der DIY-FB:

"Die Tasten auf der Originalfernbedienung sollten sehr kurz gedrückt 
werden, da die Wiederholbefehle mitgespeichert werden"

Das ist dann mit obiger Änderung dann auch hinfällig.

Autor: Klaus R. (klaus2)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
...ich hab so kurz gedrückt wie irgend mgl...keine Chance. Aber das 
Geheimnis scheint ja nun gelüftet...

Klaus.

Autor: Klaus R. (klaus2)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
...hatte heute morgen noch ne Std Zeit - funktioniert nun. Ich glaube, 
das lag aber letztendlich daran, dass der ADC die Tasten zu langsam 
sampelt und daher der Befehl "Taste x gedrückt" 2 Sendezyklen auslöste. 
Habe den Code auch kommentiert und vertikutiert - wenn das auf der 
finalen HW läuft, dann poste ich den auch hier, weil das Ganze schon 
sehr adrett & minimalistisch geworden ist.

Klaus.

Autor: Frank M. (ukw) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Klaus R. schrieb:
> Ich glaube, das lag aber letztendlich daran, dass der ADC die Tasten zu
> langsam sampelt und daher der Befehl "Taste x gedrückt" 2 Sendezyklen
> auslöste.

Ja, das klingt plausibel. Hast Du auch schon den Sleep-Modus umgesetzt? 
Wenn ja, wie hoch ist dann noch der Stromverbrauch?

Autor: Klaus R. (klaus2)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
...nicht für mich messbar, ich bin im kompletten deepsleep Nirvana. Iwo 
im x uA Bereich, damit unerheblich da ich ja ne LiPo nutze (siehe Foto 
oben).

Klaus.

Autor: Klaus R. (klaus2)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
...so, nachdem ich - mangels debug Möglichkeit aus dem "inneren des 
Attiny" - ewig nach den letzten Fehlern auf der Ziel-HW gesucht habe, 
funktioniert nun auch die Lernroutine der Tasten. Man baut die FB auf, 
wählt schön gleichverteilte Widerstände und beim Einsetzen der Batterien 
drückt man kurz alle Tasten in einer festgelegten Reihenfolge - die ADC 
Werte werden dann im E² abgelegt. Damit sind Toleranzen etc egal...hoffe 
ich ;)

Die Todo & Ideen-Liste wird immer kürzer, einzig eine Doppelbelegung der 
5 Funktionstasten (exkl. SELECT) mit Longpress-Funktion wäre noch 
interessant (z.B. MUTE auf VOL- bei Longpress). Das wären dann 10 Fkt 
pro Bank bei 5 Tasten.

Aber so langsam frage ich mich auch, wieso ich mir nicht einfach eine 
2te Harmony 300 gekauft habe ;)

Klaus.

Autor: Klaus R. (klaus2)
Datum:
Angehängte Dateien:

Bewertung
1 lesenswert
nicht lesenswert
...so, das war jetzt - auf dem letzten Meter ist dann noch der 
ungesockelte AT85 auf der Ziel HW hopps gegeangen...war ja klar :)

Anbei Bilder & Code als Inspiration...

Klaus.

Autor: Klaus R. (klaus2)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
5 Tasten sind im praktischen Betrieb zu wenig, mir fehlen zB Mute und 
Prg1...also muss ich doch noch auf longpress erweitern, vll gleich mit 
Peter Ds Taster-Lib, die aber erst ADC fähig werden müsste...puh O.o

Klaus.

Autor: Klaus R. (klaus2)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Peter hat (fast) alles fertig, war ja klar :)

Beitrag "Tastenmatrix auslesen über nur 2 Leitungen"

Klaus.

Autor: Klaus R. (klaus2)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
...an bestimmten Stellen wird auf "gültiges Protokoll" geprüft oder dies 
auf "ungültig" gesetzt (0xFF) wenn ein Lernvorgang beendet wurde - das 
initiale .eep enthält aber 0-en, so dass erstmal alle Code gültig sind. 
Ich habe hierzu #defines eingeführt mit VALID 23 / INVALID 0 und setze 
diese. Zudem leuchtet die Sende-LED nur sehr kurz, wenn erfolgreich 
gesendet wurde, bleibt aber dtl länger an, wenn man einen "leeren" Platz 
erwischt hat.

Das mit der Doppelbelegung durch longpress ist noch etwas aufwendiger, 
aber die letzte Hürde. Anbei der Code in v2.0

Klaus.

Autor: Frank M. (ukw) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Klaus R. schrieb:
> das initiale .eep enthält aber 0-en

Der Trick ist, gar keine .eep einzuspielen.

Autor: Klaus R. (klaus2)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
...stimmt, wie einfach es sein kann ;) Muss ich mein savecodes flag noch 
auf 0xFF statt auf 0 prüfen.

Klaus.

Autor: Klaus R. (klaus2)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Frank,

ich habe nun einen TSOP7000 erhalten (von Sascha, Danke!) und es ist wie 
es hat sein müssen - IRMP erkennt den Code nicht. Hast du eine Idee, ob 
es mehrere Code bei B&O (Mein Receiver ist BJ85 mit Bedienteil "Master 
Control Panel 5500") gibt? Verwundert es dich vll gar nicht? UART wird 
bei mir eng, weil ich ja "minimalistisch" unterwegs bin, könnte ich aber 
auf dem Breadboard iwie drankommen, denke ich.

Vll helfen ja die "screenshots" im Anhang (Überblick / die ersten 3 
Startimpulse) bei einer ersten Idee? Wäre toll, wenn du mir helfen 
könntest...hat aber keine Eile!

Gruß, Klaus.

EDIT: Das scheint es wohl nicht zu sein...ist das "dein" Protokoll`?

Frequency:  455 kHz
Coding:   pulse distance (manchester biphase code)
Frame:   4 start bits + 16 data bits + 1 trailer bit + 1 stopbit
Data:   8 address bits + 8 command bits
Start-Bit 1:   200µs puls, 3125µs pause
Start-Bit 2:   200µs puls, 3125µs pause
Start-Bit 3:   200µs puls, 15625µs pause
Start-Bit 4:   200µs puls, 3125µs pause
0-Bit:   200µs puls, 3125µs pause
1-Bit:   200µs puls, 9375µs pause
R-Bit:   200µs puls, 6250µs pause, repetition of last bit
Trailer bit:   200µs puls, 12500µs pause
Stop bit:   200µs puls
Repetition:   none
Pushbutton repetition:   N-times repetition of original-frames within 
100ms
Bit order:   MSB first

: Bearbeitet durch User
Autor: Frank M. (ukw) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Klaus R. schrieb:

> ich habe nun einen TSOP7000 erhalten (von Sascha, Danke!) und es ist wie
> es hat sein müssen - IRMP erkennt den Code nicht.

Schade, wahrscheinlich benutzt(e) B&O verschiedene Codierungen.

> Vll helfen ja die "screenshots" im Anhang (Überblick / die ersten 3
> Startimpulse) bei einer ersten Idee? Wäre toll, wenn du mir helfen
> könntest...hat aber keine Eile!

Am besten wären ein paar Scans (mit eingeschaltetem IRMP_LOGGING, siehe 
Artikel). Leider hat der ATTiny keinen UART. Du müsstest es also 
entweder über SW-UART erstellen oder doch einen AVR nehmen, der auch 
einen HW-UART hat.

Anhand solcher Scans kann ich dann ziemlich flott ein neues Protokoll 
einbauen.

> EDIT: Das scheint es wohl nicht zu sein...ist das "dein" Protokoll`?

Das habe ich auch aufgrund von Scans, die ich von einem User erhalten 
habe, eingebaut. Er hat mir dann auch bestätigt, dass es so 
funktioniert. Wenn ich es richtig in Erinnerung habe, habe ich damals 
auch eine Dokumentation im Internet zu diesem Protokoll gefunden.

Also: Wenn Du mir Scan-Dateien zuschickst, baue ich es gerne ein.

Autor: Klaus R. (klaus2)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Frank,

gut, dann sattel ich den ganzen Kram (bzw nur irmp.h) in der kommenden 
Woche nochmal auf ATMEGA um und schicke dir entsprechende Scans - jetzt 
aufgeben ist keine Option :)

Ich habe in deinem Artikel gelesen, wie man die analysiert, bin mir aber 
unsicher ob deine irmp.exe nach Einlesen der scans direkt die für irmp.h 
relevanten Daten rausspuckt...ich überlasse das daher gerne & dankbar 
dem Profi!

Gruß, Klaus!

Autor: Frank M. (ukw) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Klaus R. schrieb:
> Ich habe in deinem Artikel gelesen, wie man die analysiert, bin mir aber
> unsicher ob deine irmp.exe nach Einlesen der scans direkt die für irmp.h
> relevanten Daten rausspuckt...ich überlasse das daher gerne & dankbar
> dem Profi!

Spuckt die Exe schon aus, aber wahrscheinlich ist es besser, Du schickst 
mir die Scans zu. Ich glaube, die Exe kann nur Scans mit 10kHz 
auswerten. Außerdem hat sie schon ein paar Jahre auf dem Buckel.

Autor: Frank M. (ukw) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du musst ja nicht Dein Projekt portieren. Ein Standard-IRMP reicht 
vollkommen.

Autor: Klaus R. (klaus2)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
...ja klar, nur standard irmp. Ich meld mich!

Klaus.

Autor: Frank Lorenzen (florenzen)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Frank M. schrieb:

[...]
> Das habe ich auch aufgrund von Scans, die ich von einem User erhalten
> habe, eingebaut. Er hat mir dann auch bestätigt, dass es so
> funktioniert. Wenn ich es richtig in Erinnerung habe, habe ich damals
> auch eine Dokumentation im Internet zu diesem Protokoll gefunden.
[...]

Wenn ich mich richtig erinnere war ich derjenige, der damals die Scans 
gemacht hat.
Die Scans wurden mit einer B&O-Fernbedienung "Video Terminal 
Bang&Olufsen", Baujahr ca. mitte '90 erstellt und die Funktion in IRMP 
von mir auch mit modernen B&O-FB geprüft.
Wahrscheinlich hatte B&O in den 80'ern noch ein anderes Protokoll.

Gruß,
f

Autor: Daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

Ich habe schon seit viel Jahre auf Deutsch nicht gesprochen.

Ich habe einige IR-scan von Samsung, Akai and Gree.
Wer kann mir helfen in diesem Topik?

If possible in English :)

Danke schon!

Autor: Frank M. (ukw) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Daniel schrieb:
> Ich habe einige IR-scan von Samsung, Akai and Gree.

I have already answered per E-Mail.... 5 minutes before ;-)

Autor: Klaus R. (klaus2)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
I will (also) post my B&O scan if it is raining again :)

Klaus.

Antwort schreiben

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

Wichtige Regeln - erst lesen, dann posten!

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

Formatierung (mehr Informationen...)

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




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

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