Forum: Projekte & Code IRMP - Infrared Multi Protocol Decoder


von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Aktualisierung
Die IRMP-Software kann unter IRMP --> Download
heruntergeladen werden.


Hallo zusammen,

Anmerkung:

Dieser Source entstand im Rahmen des Projektes "WordClock", siehe

Artikel

   http://www.mikrocontroller.net/articles/Word_Clock

bzw. Thread, der alles zum Auslösen gebracht hat:

   http://www.mikrocontroller.net/topic/156661

Da RC5 nicht nur veraltet, sondern mittlerweile obsolet ist und immer 
mehr die elektronischen Geräte der fernöstlichen Unterhaltungsindustrie 
in unseren Haushalten Einzug finden, ist es an der Zeit, einen 
IR-Decoder vorzustellen, der ca. 90% aller bei uns im täglichen Leben zu 
findenden IR-Fernbedienungen "versteht".

IRMP - der Infrarot-Fernbedienungsdecoder, der mehrere Protokolle auf 
einmal decodieren kann, beherrscht folgende Protokolle:

SIRCS:      Sony.
NEC:        NEC, Yamaha, Canon, Tevion, Harman/Kardon, Hitachi, JVC,
            Pioneer, Toshiba, Xoro, Orion, NoName
            und viele weitere japanische Hersteller.
SAMSUNG:    Samsung
MATSUSHITA: Matsushita
KASEIKYO:   Panasonic, Denon und andere japanische Hersteller, welche 
Mitglied
            der  "Japan's Association for Electric Home Application" 
sind.
RECS80      Philips, Nokia, Thomson, Nordmende, Telefunken, Saba


Zum Source-Code

irmp.c:

Zu Anfang werden die verschiedenen Signalformen und -Zeiten 
dokumentiert. Ein Blick darauf zum Verständnis ist bestimmt ganz 
interessant :-)

IRMP decodiert sämtliche oben aufgelisteten Protokolle in einer ISR. 
Möchte man davon einige aus Platzgründen deaktivieren, sind die 
entsprechenden Werte in irmp.c

#define IRMP_SUPPORT_SIRCS_PROTOCOL           1 // flag: support SIRCS, 
1=yes, 0=no
#define IRMP_SUPPORT_NEC_PROTOCOL             1 // flag: support NEC, 
1=yes, 0=no
#define IRMP_SUPPORT_SAMSUNG_PROTOCOL         1 // flag: support 
Samsung, 1=yes, 0=no
#define IRMP_SUPPORT_MATSUSHITA_PROTOCOL      1 // flag: support 
Matsushita, 1=yes, 0=no
#define IRMP_SUPPORT_KASEIKYO_PROTOCOL        1 // flag: support 
Kaseikyo, 1=yes, 0=no
#define IRMP_SUPPORT_RECS80_PROTOCOL          1 // flag: support RECS80, 
1=yes, 0=no

auf 0 zu setzen. Dann wird der Decoder für diese Protokolle nicht 
mitübersetzt.

Diese Protokolle weisen Bitlängen - teilweise variabel, teilweise fest - 
von 12 bis 48 Bit auf. Diese werden über Preprocessor-Defines 
beschrieben.

IRMP trennt diese IR-Telegramme prinzipiell in 3 Bereiche:

 1. ID für verwendetes Protokoll
 2. Adresse bzw. Herstellercode
 3. Kommando

Mittels der Funktion

   irmp_get_data (IRMP_DATA * irmp_data_p)

kann man ein decodiertes Telegramm abrufen. Der Return-Wert ist 1, wenn 
ein Telegramm eingelesen wurde, sonst 0. Im ersten Fall werden die 
Struct-Members

      irmp_data_p->protocol
      irmp_data_p->address
      irmp_data_p->command

gefüllt, einen Beispiel-Aufruf nebst Erklärung findet man in main.c, 
welches lediglich ein Grundgerüst darstellen soll.

Das "Working Horse" von IRMP ist die Interrupt Service Routine 
irmp_ISR() welche 10.000 mal pro Sekunde aufgerufen werden sollte. 
Weicht dieser Wert ab, muss die Preprocessor-Konstante F_INTERRUPTS 
angepasst werden. Dieser kann durchaus höher werden, aber nicht 
wesentlich kleiner. Sonst wird es kritisch mit der Protokoll-Erkennung.

irm_ISR detektiert zunächst die Länge und die Form des/der Startbits und 
ermittelt daraus das verwendete Protokoll. Sobald das Protokoll erkannt 
wurde, werden die weiter einzulesenden Bits parametrisiert, um dann 
möglichst effektiv in den weiteren Aufrufen das komplette IR-Telegramm 
einzulesen.

Um direkt Kritikern den Wind aus den Segeln zu nehmen:

Ich weiss, die ISR ist ziemlich groß. Aber da sie sich wie eine State 
Machine verhält, ist der tatsächlich ausgeführte Code pro Durchlauf 
relativ gering. Solange es "dunkel" ist (und das ist es ja die meiste 
Zeit ;-)) ist die aufgewendete Zeit sogar verschwindend gering. Im 
WordClock-Projekt werden mit ein- und demselben Timer 8 ISRs aufgerufen, 
davon ist die irmp_ISR() nur eine unter vielen. Bei mindestens 8 MHz 
CPU-Takt traten bisher keine Timining-Probleme auf. Daher sehe ich bei 
der Länge von irmp_ISR überhaupt kein Problem.

Achja, ein Quarz ist nicht unbedingt notwendig, es funktioniert auch mit 
dem internen Oszillator des AVRs, wenn man die Prescaler-Fuse 
entsprechend gesetzt hat, dass die CPU auch mit 8MHz rennt ... Die 
Fuse-Werte für einen ATMEGA88 findet man in main.c

Zur Hardware: IRMP sollte so ziemlich für alle ATMegas übersetzbar sein, 
das Beispiel-Projekt wurde auf ATMEGA88 eingestellt.

Der Pin, an dem der IR-Empfänger angeschlossen wird, ist frei wählbar 
und wird in irmp.c über

    #define IRMP_PORT  PORTB
    #define IRMP_DDR   DDRB
    #define IRMP_PIN   PINB
    #define IRMP_BIT   6       // use PB6 as IR input

eingestellt.

Als letztes:

irmp.c lässt sich auch unter Linux direkt kompilieren, um damit 
Infrarot-Scans, welche in Dateien gespeichert sind, direkt zu testen. Im 
Unterordner IR-Data finden sich solche Dateien, die man dem IRMP direkt 
zum "Fraß" vorwerfen kann, nämlich folgendermaßen:

  cc irmp.c -o irmp                              # IRMP compilieren
  ./irmp.c < IR-Data/Samsung_DVD_Rec_00062C.txt  # irmp ausführen

IRMP gibt dann das erkannte Protokoll und weitere Timing-Daten aus. 
Diese Dateien haben mir bei der Entwicklung des IRMP enorm geholfen, 
Dank an Vlad Tepesch, der diese Dateien mittels 10000Hz-ISR gescannt und 
über UART protokolliert hat!

Achja: Der Decoder für das RECS80-Protokoll ist ungetestet und wurde 
anhand von Dokumentationen im Internet erstellt und lediglich mittels 
künstlich erzeugten Scan-Dateien getestet... daher: keine Gewähr!

Viel Spaß damit!

Frank M.

von I. E. (anfaenger69)


Lesenswert?

Sehr geil, ich werde mal schauen, ob ich es zum laufen bekomme. Ich habe 
eine ähnliche Sache gebaut: Eine lernbare Fernbedienung.

Ich verwende jedoch keine 10000Hz Routine, die die Sachen einscannt, 
sondern ich lege den IR Eingang auf den externen IRQ0 Pin und erkenne 
das Ende des IR Codes mit dem ISR(TIMER1_OVF_vect). Die Hauptroutine hat 
in dieserm Fall gar nichts mehr zu machen und kann sich auf etwas ganz 
anderes konzentrieren, man spart sich die Preprozessor-Konstante:

int main(){
    TCNT1 = 0;          //Timer1 gestoppt lassen, bei 65ms Überlauf
    IRQ0_aktivieren();    //INT0_vect wartet auf erste IR Signal flanke


    while (etwas_empfangen){
        empfangspuffer_auswerten();
        ausgabe_auf_dem_lcd_display();
        etwas_empfangen = 0;
    }
}

ISR(INT0_vect){
    empfangspuffer(position) = TCNT1;   //gemessene Flankenlänge
                                        // abspeichern
    position++          //für die nächste Abspeicherung vorbereiten
    TCNT1 = 0;                //Timer auf 0 zur Messung der nächsten
                              //Flankenlänge
    Timer1_aktivieren();
}

ISR(TIMER1_OVF_vect){         //IR Ende wenn 65ms keine Flankenänderung
    Timer1_deaktivieren();
    etwas_empangen = 1;       //nun kann main es auswerten
    empfangspuffer(position) = 60000  //IR Ende Markierung in den Puffer
                                      // schreiben. Eindeutig, weil
                                      //keine IR Flanke wäre 60ms lang
}


Der Empfangspuffer sieht dann so aus:

17382   //erste Messung ist müll, je nach dem wann erste IR Flanke kam
09000   //Start Bit 9000ms
00560   //erstes Pausensignal 560ms
00560   //erstes Datenbit
00560   //Pausensignal zum Datenbit
01200   //zweites Datenbit
00560   //Pausensignal zum Datenbit
.
.
.
60000   //Ende Markierung

Die Auswertung ist dann einfach, wie z.B. Du sie selbst geschrieben 
hast. Ich selbst habe keine Auswerung geschrieben, sondern ich lege die 
Daten in einem EEPROM ab und sende sie auf Befehl wieder raus:

int main(){
    pin_ir = 0;
    position ++        //erste Müllmessung im Puffer ignorieren
    TCNT1 = empfangspuffer(position);  //Timer1 füttern
    position ++        //Puffer auf nächste Position
    Timer1_aktivieren();

    while (1);               //keine weiteren Aktionen mehr,
                             // sendung erfolgt automatisch über IRQ
}

ISR(TIMER1_OVF_vect){
    port_ir ^= (1<<pin_ir);           //IR Ausgang einfach nur toggeln
    TCNT1 = (65535-empfangspuffer(position));     //Timer neu füttern
    if (empfangspuffer(position) == 60000) timer1_deaktivieren;
    position++           //Puffer auf nächste Position
}

von eku (Gast)


Lesenswert?

Hallo Frank!

In Deiner ISR wird bereits das Protokoll erkannt. Ist das sinnvoll? 
Könnte man nicht den IR-Eingang im konstanten Timerraster abtasten und 
das Ergebnis in eine FIFO legen. Eine Dekoderfunktion sammelt die Werte 
aus der FIFO, erkennt das Protokoll und dekodiert die Sequence. Worin 
liegt der Vorteil Deiner Implementierung?

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

eku schrieb:
> In Deiner ISR wird bereits das Protokoll erkannt. Ist das sinnvoll?
> Könnte man nicht den IR-Eingang im konstanten Timerraster abtasten und
> das Ergebnis in eine FIFO legen.

Das verbraucht aber dann evtl. ne Menge Speicherplatz. Wenn ich da ans 
Kaseikyo-Protokoll mit 48 Bit denke, müsste ich 48 x 2 = 92 Bytes haben, 
um die Timingwerte für jede Hell-/Dunkelsequenz zu speichern.

> Eine Dekoderfunktion sammelt die Werte
> aus der FIFO, erkennt das Protokoll und dekodiert die Sequence. Worin
> liegt der Vorteil Deiner Implementierung?

Der Vorteil liegt beim niedrigen Speicherbedarf. Nach dem eingetroffenen 
Startbit wird das Protokoll sofort erkannt und dann werden die weiteren 
Hell-Dunkelphasen nur noch als einzelne Bits gespeichert, weil sich die 
ISR aufs Protokoll "eingeschossen" hat. So kommt man mit 5 Bytes aus, in 
denen alles nötige gespeichert ist - hier als struct definiert:
1
typedef struct
2
{
3
  uint8_t   protocol;          // protocol, i.e. IRMP_NEC_PROTOCOL
4
  uint16_t  address;           // address
5
  uint16_t  command;           // command
6
} IRMP_DATA;

Das heisst: am Ende bekommt man dann über irmp_get_data() einfach drei 
Werte, die man über ein if oder switch checken kann, z.B. hier eine 
Routine, welche die Tasten 1-9 auf einer Fernbedienung auswertet:
1
   if (irmp_data.protocol == IRMP_NEC_PROTOCOL &&     // NEC-Protokoll
2
       irmp_data.address == 0x00FF)                   // Adresse 0x00FF
3
   {
4
      switch (irmp_data.command)
5
      {
6
         case 0x0001: key1_pressed(); break;          // Taste 1
7
         case 0x0002: key2_pressed(); break;          // Taste 2
8
         ...
9
         case 0x0009: key9_pressed(); break;          // Taste 9
10
      }
11
   }

Die Werte muss man natürlich für eine unbekannte Fernbedienung einmal 
auslesen und dann über ein UART oder LC-Display ausgeben, um sie dann im 
Programm hart zu kodieren. Oder man hat eine Anlernroutine, wo man 
einmal die gewünschten Tasten drücken muss, um sie anschließend im 
EEPROM abzuspeichern.

Einfacher gehts doch nicht, oder?

Gruß,

Frank

von Sebastian___ (Gast)


Lesenswert?

Hallo Frank,
wie erkennst du zb wenn per Fernbedienung ein Lautstärkekomando kommt.
Soweit ich das bei deinem Code erkennen konnte wird der empfangene Code 
nur 1x ausgewertet.
Wie geht das beim Sircs Protokoll? ein Kommando wird 3x wiederholt, nach 
der wiederholung müsste man das kommando erneut auslösen.

von eku (Gast)


Lesenswert?

Hallo Frank!

Frank M. schrieb:
> eku schrieb:
>
>> In Deiner ISR wird bereits das Protokoll erkannt. Ist das sinnvoll?
>
>> Könnte man nicht den IR-Eingang im konstanten Timerraster abtasten und
>
>> das Ergebnis in eine FIFO legen.
>
>
>
> Das verbraucht aber dann evtl. ne Menge Speicherplatz. Wenn ich da ans
>
> Kaseikyo-Protokoll mit 48 Bit denke, müsste ich 48 x 2 = 92 Bytes haben,
>
> um die Timingwerte für jede Hell-/Dunkelsequenz zu speichern.
>
>
>
>> Eine Dekoderfunktion sammelt die Werte
>
>> aus der FIFO, erkennt das Protokoll und dekodiert die Sequence. Worin
>
>> liegt der Vorteil Deiner Implementierung?
>
>
>
> Der Vorteil liegt beim niedrigen Speicherbedarf. Nach dem eingetroffenen
>
> Startbit wird das Protokoll sofort erkannt und dann werden die weiteren
>
> Hell-Dunkelphasen nur noch als einzelne Bits gespeichert, weil sich die
>
> ISR aufs Protokoll "eingeschossen" hat. So kommt man mit 5 Bytes aus, in
>
> denen alles nötige gespeichert ist

Das habe ich soweit verstanden. Würdest Du die Daten jedes Protokolls
in einer Struktur zusammenfassen, bräuchtest Du nur einen Zeiger auf
die jeweilie Struktur (=Protokoll) setzen und nicht so viele statisch 
Variablen in der ISR initialisieren. Die einen Indirektion bei der 
Adressierung sollte auf Grund der anderen Ersparnis nicht ins Gewicht 
fallen. Der Code würde noch dazu leserlicher.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Sebastian___ schrieb:
> Hallo Frank,
> wie erkennst du zb wenn per Fernbedienung ein Lautstärkekomando kommt.
> Soweit ich das bei deinem Code erkennen konnte wird der empfangene Code
> nur 1x ausgewertet.

Der Code wird lediglich innerhalb einer gewissen Zeitspanne ignoriert, 
nämlich innerhalb der Wiederholungszeitspanne.

> Wie geht das beim Sircs Protokoll? ein Kommando wird 3x wiederholt, nach
> der wiederholung müsste man das kommando erneut auslösen.

Nein, soviel ich weiß, wird bei SIRCs nach den Wiederholungen dann das 
Kommando erneut gesandt, wenn Du die Taste gedrückt hältst. Aber erst 
nach einer gewissen Pause, die wesentlich größer ist als die Zeitspanne 
zwischen 2 Wiederholungen. Und dann greift die ISR wieder zu.

Gruß,

Frank

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

eku schrieb:
> Das habe ich soweit verstanden. Würdest Du die Daten jedes Protokolls
> in einer Struktur zusammenfassen, bräuchtest Du nur einen Zeiger auf
> die jeweilie Struktur (=Protokoll) setzen und nicht so viele statisch
> Variablen in der ISR initialisieren. [...]

Stimmt.

> [...] Die einen Indirektion bei der
> Adressierung sollte auf Grund der anderen Ersparnis nicht ins Gewicht
> fallen. Der Code würde noch dazu leserlicher.

Hm, ob ich da tatsächlich was einspare? Werde mir den Code diesbezüglich 
demnächst nochmal anschauen.

Gruß,

Frank

von eku (Gast)


Lesenswert?

Hallo Frank!

Frank M. schrieb:
> Nein, soviel ich weiß, wird bei SIRCs nach den Wiederholungen dann das
>
> Kommando erneut gesandt, wenn Du die Taste gedrückt hältst. Aber erst
>
> nach einer gewissen Pause, die wesentlich größer ist als die Zeitspanne
>
> zwischen 2 Wiederholungen. Und dann greift die ISR wieder zu.

Mir gefällt dieses Ping-Pong zwischen ISR und main() nicht. Die ISR 
wartet mit der Erkennung bis main() vorheriges abgeholt hat. Eine 
FIFO entkoppelt die Routinen.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

eku schrieb:
> Mir gefällt dieses Ping-Pong zwischen ISR und main() nicht. Die ISR
> wartet mit der Erkennung bis main() vorheriges abgeholt hat. Eine
> FIFO entkoppelt die Routinen.

Die ISR wartet nicht (eine ISR sollte niemals warten), sie ignoriert 
halt IR-Befehle, bis die main das letzte Kommando abgeholt hat.

Wenn der Mensch an der Fernbedienung schnell hintereinander 2 Tasten 
drückt, dann willst Du das tatsächlich durch ein FIFO puffern? Zwischen 
den beiden Tastendrücken vergeht für den µC eine Ewigkeit.... bis dahin 
hat er die erste Taste längst abgearbeitet.

Bei einer RS232 halte ich ja ein FIFO für sinnvoll, aber für eine IR-FB? 
Willst Du etwa mit einem IR-Sender Daten mit konstanter Geschwindigkeit 
übermitteln? Ja, dann wäre das sinnvoll. Sonst nicht - für mich 
jedenfalls.

Gruß,

Frank

von Sebastian___ (Gast)


Lesenswert?

bei SIRC  ist es jeden fall so das man da nicht zwischen den Repeats 
unterscheiden kann.
Taste kurz gedrückt = 3x command im 45ms Raster.
Taste länger gedrückt = nx command im 45ms Raster.
Ich habe mir das mal auf dem Oszi angeschaut. (ist ein Sony DVD Player)

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Sebastian___ schrieb:
> bei SIRC  ist es jeden fall so das man da nicht zwischen den Repeats
> unterscheiden kann.
> Taste kurz gedrückt = 3x command im 45ms Raster.
> Taste länger gedrückt = nx command im 45ms Raster.

Hm, das ist wirklich blöd. Leider habe ich keine Sony-Fernbedienung, um 
das zu testen, hatte da lediglich die Scans von Vlad Tepesch.

Ich habe da gerade nochmal in den Source geschaut:
1
#define SIRCS_REPETITION_TIME                 (uint16_t)(F_INTERRUPTS * 50.0e-3 + 0.5)          // repetition after ~45-50 msec
2
...
3
        // if SIRCS protocol and the code will be repeated inside of 50 ms, we will ignore it.
4
        if (irmp_protocol != IRMP_SIRCS_PROTOCOL || last_irmp_command != irmp_tmp_command || repetition_counter > SIRCS_REPETITION_TIME)
5
...

Wenn also die Zeiten bei heruntergedrückter Taste tatsächlich nicht 
größer sind als die Wiederholzeit, muss man wirklich erst die Taste 
loslassen....

Dumm gelaufen. Man könnte natürlich bis 3 zählen und die vierte 
Wiederholung wieder zulassen. Fragt sich nur, ob das definitiv immer so 
ist, dass Sony-Fernbedienungen grundsätzlich jeden Code 3 mal 
wiederholen.

Gruß,

Frank

von Michael M. (Gast)


Lesenswert?

um sowas zu testen und solche codes zu simulieren würde ich einen 
simulator für AVRs benutzen - namentlich proteus isis.
gibt viele möglichkeiten, sich dort eine passende quelle 
zusammenzubauen.

demo und info unter: 
http://www.labcenter.co.uk/products/vsm_overview.cfm

frank, falls du das machen willst und ich dir helfen kann, schreib mich 
doch kurz an.

holli

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Michael M. schrieb:
> um sowas zu testen und solche codes zu simulieren würde ich einen
> simulator für AVRs benutzen - namentlich proteus isis.

Ist erstmal eine gute Idee, aber der Code von irmp trägt den Simulator 
in sich mit :-) Ich kann dem Code (wenn man ihn unter Linux übersetzt) 
einfach eine Datei zum Fraß vorwerfen. Diese Datei kann ein echter Scan 
einer Fernbedienung sein oder eine künstlich erzeugte.

Ein weiterer Simulator wäre daher kein Gewinn für mich - sehe ich 
jedenfalls momentan so. Und er beantwortet mir auch nicht die Frage, ob 
jede Sony-Fernbedienung den Code immer genau 3x wiederholt.

Trotzdem danke für den Tipp, vielleicht kann ich ihn bei Gelegenheit für 
ein ganz anderes Projekt verwenden :-)

@Sebastian___

Ich werde einfach mal meine SIRCS-Scandatei nehmen, ein Telegramm 
(sprich Zeile) ver-N-fachen mit dem Editor, wobei ich eine Pause von 
45ms einbaue. Dann den Code dahingehend ändern, dass er die 4te, 7te, 
10te (usw) Wiederholung wieder auswertet statt sie zu ignorieren.

Wäre Dir damit geholfen?

Gruß,

Frank

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Ich habe mir gerade nochmal die gängigen Quellen angeschaut, wo SIRCS 
als Code beschrieben wird. Nirgendwo steht da was von 2 weiteren 
automatischen Wiederholungen (also 3 Telegramme), immer liest man nur 
solches wie dieses:

 "Commands are repeated every 45ms(measured from start to start) for as 
long as the key on the remote control is held down."

Ich habe mir daraufhin nochmal die Scan-Datei Sony_Bravia_RM-ED0009.txt 
näher angeschaut. Da sind die Wiederholungen auch drin, aber offenbar 
nicht für alle Tasten wird wiederholt, z.B.

power, rot, gelb, grün, blau, up, down, left, right, vol+, vol-: keine 
Wiederholung

theatre, digital, tools, buch(?): 2 Wiederholungen, also insg. 3 
Telegramme

Rätselhaft das ganze...

Gruß,

Frank

von Vlad T. (vlad_tepesch)


Lesenswert?

Ich kann das ganze ja bei gelegenheit nochmal wiederholen.

vielleicht sind auch zu viele einsen zwischen den wiederholungen, so 
dass meine Scan-Routine, den scan schon vorher abgebrochen hat.
ich hatte da 200 samples gewartet

wenn man sich die wiederholten scans aber anschaut, sieht man, dass die 
wiederholungen nach 190 einsen kommen.
wenn das Kommando also am Ende ein paar einsen hat, dann wird die 
Abrruchbedingung überschritten.


Pack doch den code zum Scannen nochmal mit rein, dann können die anderen 
auch ein paar Scans machen.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Vlad Tepesch schrieb:

> Pack doch den code zum Scannen nochmal mit rein, dann können die anderen
> auch ein paar Scans machen.

Ich war einfach bisher zu faul, den Code fürs Scanning aus dem 
WordClock-Code zu extrahieren, so dass er isoliert zur Verfügung 
steht...
gebe ich ja zu :-)

Hole ich jetzt nach.

Es wäre klasse, wenn die anderen ihre Fernbedienungen, die bisher nicht 
unterstützt werden, einscannen würden. Dann kann ich den Code diesbzgl. 
erweitern.

Gruß,

Frank

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Aktualisierung
Die IRMP-Software kann unter IRMP | Download
heruntergeladen werden.



Vlad Tepesch schrieb:

> Pack doch den code zum Scannen nochmal mit rein, dann können die anderen
> auch ein paar Scans machen.

Okay, ich habe nun die nötigen Routinen aus dem WordClock-Source 
extrahiert und direkt mit in irmp.c integriert.

In der Zeile
1
#define IRMP_LOGGING    0   // 1: log IR signal (scan), 0: do not (default)

kann nun das Logging eingeschaltet werden, wenn man den Wert auf 1 
setzt.

Dann werden die Hell- und Dunkelphase auf dem UART mit 9600Bd 
ausgegeben:

1=Dunkel, 0=Hell. Eventuell müssen dann die Konstanten in den Funktionen 
uart_init() und uart_putc() angepasst werden, kommt auf den verwendeten 
AVR-µC an.

README.txt ist entsprechend angepasst - am Ende der Datei.

Getestet habe ich es allerdings noch nicht... sollte aber passen.

Gruß,

Frank

von Sebastian___ (Gast)


Lesenswert?

Ich bin gerade dabei den IRMP Code auf Interrups umzubauhen.
Die Zeitbasis commt aus einem Counter mit 25Khz (per IRQ).
Somit kann das Polling entfallen und man hat eine Speichersparende 
lösung.
Das ist aber nicht ganz so einfach. ;)

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Sebastian___ schrieb:
> Ich bin gerade dabei den IRMP Code auf Interrups umzubauhen.

Verstehe ich jetzt nicht so recht. Das Ding läuft doch auf 
Interrupt-Basis, nämlich einem Timer-Interrupt.

> Die Zeitbasis commt aus einem Counter mit 25Khz (per IRQ).
> Somit kann das Polling entfallen und man hat eine Speichersparende
> lösung.

Warum ist das speichersparend?

Gruß,

Frank

von Sebastian___ (Gast)


Lesenswert?

ja eben,
das frisst rechenleistung wen man keinen timer irq damit blockieren 
will.
Daher ist es meiner meinung nach besser einen richtigen Init zu nehmen 
der flankengesteuert reagiert. Und nur noch ab und zu mal im timer IRQ 
auf timeout zu prüfen.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Sebastian___ schrieb:
> Daher ist es meiner meinung nach besser einen richtigen Init zu nehmen
> der flankengesteuert reagiert.

Ahso, flankengetriggert. Ich hatte da eben was von Zeitbasis gelesen... 
deshalb hatte ich das nicht direkt kapiert. Aber klar, Du brauchst bei 
jeder Flanke auch die dazugehörige Zeit.

Klingt ja ganz gut, bin gespannt.

Aber ich sehe da immer noch nicht die Speichereinsparung, ich lass mich 
da von Dir überraschen ;-)

Gruß,

Frank

von Sebastian___ (Gast)


Lesenswert?

Speichereinsparung war drauf bezogen im Vergleich zu der hier geposteten 
Interruptgesteuerten Routine die ja das komplette data Frame gesichert 
hat und dann in der Main auswertet.

im prinzip geht deine Routine auch flankengetriggert, man muss nur ne 
zeitbasis hinzufügen (aus timer) und für ne abbuchbedingung sorgen wenn 
keine flanken mehr kommen.
Wenn ich soweit bin werde ich mal ein bischen was dazu posten.
Deine Defines der verschiedenen protokolle sind auf jeden fall sehr 
hilfreich.

von Sebastian___ (Gast)


Lesenswert?

Hallo ich habe noch einen kleine Fehler gefunden, das 
MATSUSHITA_PROTOCOL wird nie erkannt, nur das SAMSUNG_PROTOCOL.

die Defines für das erkennen der start Bits haben eine zu große 
Toleranz, wenn man die für :

#define MATSUSHITA_START_BIT_PULSE_LEN_MIN
#define MATSUSHITA_START_BIT_PULSE_LEN_MAX
#define MATSUSHITA_START_BIT_PAUSE_LEN_MIN
#define MATSUSHITA_START_BIT_PAUSE_LEN_MAX

und

#define SAMSUNG_START_BIT_PULSE_LEN_MIN
#define SAMSUNG_START_BIT_PULSE_LEN_MAX
#define SAMSUNG_START_BIT_PAUSE_LEN_MIN
#define SAMSUNG_START_BIT_PAUSE_LEN_MAX

auf 20% setzt, geht die Protokollerkennung.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Sebastian___ schrieb:
> die Defines für das erkennen der start Bits haben eine zu große
> Toleranz, wenn man die für :
> [...] auf 20% setzt, geht die Protokollerkennung.

Super, danke für den Tipp! Werde ich anpassen.

Gruß,

Frank

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Frank M. schrieb:
> Sebastian___ schrieb:
>> die Defines für das erkennen der start Bits haben eine zu große
>> Toleranz, wenn man die für :
>> [...] auf 20% setzt, geht die Protokollerkennung.
>
> Super, danke für den Tipp! Werde ich anpassen.

Habe ich gerade mal gemacht und gegen die Scan-Datei
Samsung_DVD_Rec_00062C.txt laufen lassen: Bei 20% Toleranz für SAMSUNG 
erkennt die Routine keine Samsung mehr. Selbst bei 40% klappt das nicht 
mehr, erst bei 50% geht es. Das liegt wohl daran, dass Vlads Samsung-FB 
stark von den Timingwerten abweicht... Die 50%, die ich da eingestellt 
hatte, kamen nicht von ungefähr ;-)

Das heisst: Wir haben hier einen Konflikt, beide Startbits (von Samsung 
und Matsushita) sind ähnlich lang - jedenfalls innerhalb der großzügigen 
Toleranzen von 50%.

Wenn Du in der Zeile

#define IRMP_SUPPORT_SAMSUNG_PROTOCOL      1

die 1 auf 0 setzt, sollte die Matsushita auch erkannt werden - ohne 
Änderung der Toleranzen. Hat natürlich den Nachteil, dass immer nur eins 
von beiden Protokollen gleichzeitig erkannt werden kann....

Es gibt einen großen Unterschied zwischen Samsung und Matsushita:

Die Anzahl der Bits pro Telegramm und das Sync-Bit mit sehr langer 
Dunkelphase zwischendrin bei der Samsung, d.h. nach den ersten 16 Bit. 
Damit kann man beide Protokolle definitiv auseinanderhalten.

Kannst Du mir so eine Scan-Datei für die Matsushita erstellen? Dann 
würde ich die Unterscheidung anhand des Sync-Bits einbauen.

Gruß,

Frank

von Sebastian___ (Gast)


Lesenswert?

Das ist leider nicht so einfach mit den Daten schicken. Da ich nur 
kleine Teile aus deinem Code nutze und die Codes auf einem Oszi anschaue 
und mit einer Universalfernbedinung teste.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Sebastian___ schrieb:
> Das ist leider nicht so einfach mit den Daten schicken. Da ich nur
> kleine Teile aus deinem Code nutze und die Codes auf einem Oszi anschaue
> und mit einer Universalfernbedinung teste.

Auch gut, dann erstelle ich die Matsushita-Daten künstlich. Die 
Timing-Daten zur Matsushita-FB kannst Du aber schon so bestätigen, oder?

Gruß,

Frank

von Vlad T. (vlad_tepesch)


Lesenswert?

hast du die Abbruchbedingung für die Scans ein wenig angehoben?
200 scheint ja zu kurz zu sein.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Vlad Tepesch schrieb:
> hast du die Abbruchbedingung für die Scans ein wenig angehoben?
> 200 scheint ja zu kurz zu sein.

Nein, habe ich nicht gemacht. Werde ich nachholen.

Gruß,

Frank

von Bastler (Gast)


Lesenswert?

Hat evtl. jemand von euch ne Apple Fernbedienung aus Alu?

von IR (Gast)


Lesenswert?

@Frank M. (ukw):
Ich fände es sehr hilfreich, wenn du den Code mit ein paar kleinen 
Erläuterungen als Artikel hier mit reinstellst und am Besten im "Word 
Clock" Artikel darauf verweist. Das ganze kann man ja schon als 
eigenständig betrachten.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

IR schrieb:
> Ich fände es sehr hilfreich, wenn du den Code mit ein paar kleinen
> Erläuterungen als Artikel hier mit reinstellst und am Besten im "Word
> Clock" Artikel darauf verweist. Das ganze kann man ja schon als
> eigenständig betrachten.

Ich hatte den Code für die IR-Decodierung absichtlich isoliert und hier 
reingestellt, damit er unabhängig vom WordClock-Projekt Verwendung 
findet.

Gern lege ich einen Artikel an, hatte mir Vlad sowieso schon 
vorgeschlagen ;-)

Mache ich am Wochenende.

Gruß,

Frank

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Es gibt nun einen eigenen Artikel zu IRMP. Das hat auch den Vorteil, 
dass die Software zum Download immer auf dem neuesten Stand ist und hier 
der Leser nicht immer erst alle Beiträge lesen muss, um die letzte 
Version zu finden.

Artikel-Link: http://www.mikrocontroller.net/articles/IRMP

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

Software-Stand: 05.02.2010

In dieser Version wurde auch der Konflikt zwischen dem Samsung- und dem 
Matsushita-Protokoll ausgeräumt, beide Protokolle werden nun ohne 
Klimmzüge zuverlässig erkannt.

@Vlad: Sorry, die Scan-Länge habe ich noch nicht vergrößert, hole ich 
nach.

Gruß,

Frank

von Di P. (drpepper) Benutzerseite


Lesenswert?

Hi!

Erstmal: danke für dieses schöne Stück code :)

Damit kann ich endlich die Reichelt-RGB-Fernbedienung lesen, die ich mir 
bestellt habe ;)
Leider (bestimmt mache ich irgendwas falsch) kann ich mit der IRMP-Lib 
meine "alte" rc5-Fernbedienung nichtmehr auslesen, die ich bisher für 
meine Steuerung verwendet habe. Gibt es eine möglichkeit, dass das alte 
rc5-protokoll auch von der IRMP-Lib erkannt wird?

Gruß, DiPi

p.s.: bisher habe ich diese rc5-routine benutzt: 
Beitrag "Fernbedien RC5 Empfänger"

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Di Pi schrieb:

> Damit kann ich endlich die Reichelt-RGB-Fernbedienung lesen, die ich mir
> bestellt habe ;)

Sag mal bitte die Bestellnummer, interessiert mich immer wieder, welche 
FBs damit so laufen...

> Leider (bestimmt mache ich irgendwas falsch) kann ich mit der IRMP-Lib
> meine "alte" rc5-Fernbedienung nichtmehr auslesen, die ich bisher für
> meine Steuerung verwendet habe. Gibt es eine möglichkeit, dass das alte
> rc5-protokoll auch von der IRMP-Lib erkannt wird?

RC5 wird von IRMP nicht unterstützt, weil ich RC5 als obsolet ansehe, 
sorry. Wenn Du mir einen triftigen Grund nennst, überlege ich es mir 
nochmal ;-)

Gruß,

Frank

von RC5 (Gast)


Lesenswert?

Frank M. schrieb:
> RC5 wird von IRMP nicht unterstützt, weil ich RC5 als obsolet ansehe,
> sorry. Wenn Du mir einen triftigen Grund nennst, überlege ich es mir
> nochmal ;-)

So ziemlich alle FB bei mir laufen auf RC5. Gerade bei Universal-FBs ist 
das noch weit verbreitet und sollte der Vollstädigkeit halber mit 
eingebunden werden. Gerade einfache Projekte im µC Bereich nutzen of 
noch RC5.

von Michael M. (Gast)


Lesenswert?

Frank M. schrieb:
>> Damit kann ich endlich die Reichelt-RGB-Fernbedienung lesen, die ich mir
>> bestellt habe ;)
>
> Sag mal bitte die Bestellnummer, interessiert mich immer wieder, welche
> FBs damit so laufen...
LED RGB REMOTE
http://www.reichelt.de/?;ARTICLE=92594

von Toralf W. (willi)


Lesenswert?

Frank M. schrieb:

> RC5 wird von IRMP nicht unterstützt, weil ich RC5 als obsolet ansehe,
> sorry. Wenn Du mir einen triftigen Grund nennst, überlege ich es mir
> nochmal ;-)
>
Stimmt schon, wenn man sich so umsieht bentutzen nur noch die "soliden 
alten deutschen Marken" den RC5 Code. Auf der anderen Seite, ist er sehr 
verbreitet gewesen und deswegen sind Massenhaft gebrauchte RC5 im 
Umlauf, die noch gut weiter verwendet werden könnten. Das spricht für 
RC5.
Ist aber auch so ein Super "gemeinnütziges Projekt".

GrußWilli

von Di P. (drpepper) Benutzerseite


Lesenswert?

Ich meinte genau die Remote, die Michael M. genannt hat.

Es wäre eine schöne sache, wenn neben den sechs bereits implementierten 
Protokollen auch noch RC5 vertreten wäre (genauso ein- und 
ausschaltbar), um letztlich so gut wie alle gängigen Protokolle mit 
einer Lib abzudecken.
Dem Programmierer ist dann überlassen, welche Protokolle "gehört" werden 
sollen.

Viele Grüße, DiPi

von Michael M. (Gast)


Angehängte Dateien:

Lesenswert?

ich vermute übrigens, die RGB FB sendet NEC-code.
hier mal ein csv-file und bild mit einem scan der off-taste. sample rate
50kHz.
T->A: 9,14ms
A->B: 4,42ms
B->C: 660us

von Di P. (drpepper) Benutzerseite


Lesenswert?

Stimmt: Es wird code 2 (NEC, Pioneer, JVC, Toshiba, NoName etc.) 
erkannt.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Michael M. schrieb:
> ich vermute übrigens, die RGB FB sendet NEC-code.
> hier mal ein csv-file und bild mit einem scan der off-taste. sample rate
> 50kHz.
> T->A: 9,14ms
> A->B: 4,42ms
> B->C: 660us

Ja, das ist das NEC-Protokoll.

Ich habe nun die einzelnen Protokolle vom Timing her im IRMP-Artikel 
dokumentiert. Wäre nett, wenn ich Dein Bildchen da mit reinhängen dürfte 
:-)

Gruß,

Frank

von Michael M. (Gast)


Lesenswert?

Frank M. schrieb:
> Ich habe nun die einzelnen Protokolle vom Timing her im IRMP-Artikel
> dokumentiert. Wäre nett, wenn ich Dein Bildchen da mit reinhängen dürfte
> :-)
klar, gerne!

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Michael M. schrieb:
> Frank M. schrieb:
>> Ich habe nun die einzelnen Protokolle vom Timing her im IRMP-Artikel
>> dokumentiert. Wäre nett, wenn ich Dein Bildchen da mit reinhängen dürfte
>> :-)
> klar, gerne!

Danke, ist eingebaut:

http://www.mikrocontroller.net/articles/IRMP#Protokolle

Gruß,

Frank

von Michael M. (Gast)


Lesenswert?

Frank M. schrieb:
> Danke, ist eingebaut
ui, da hat es aber eine prominente position bekommen =)
danke!

grüße,
michael

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Michael M. schrieb:
> ui, da hat es aber eine prominente position bekommen =)

Ich wollte ein wenig Farbe in den Artikel bekommen ;-)

Aber das Bild ist zweimal drin, weiter unten nochmal miniaturisiert 
unter Angabe Deiner gemessenen Zeiten.

Gruß,

Frank

von Michael M. (Gast)


Lesenswert?

da fällt mir grade was auf:
in dem bild "Anschluß eines IR-Empfängers an µC" ist der im datenblatt 
vorgeschlagene RC tiefpass falsch aufgebaut.
der aufbau in dem bild dürfte die empfindlichkeit um einiges 
verschlechtern.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Michael M. schrieb:
> in dem bild "Anschluß eines IR-Empfängers an µC" ist der im datenblatt
> vorgeschlagene RC tiefpass falsch aufgebaut.

Du hast Recht: eigentlich gehört der Kondensator direkt zwischen Pin1 
und Pin2 des TSOP, mein Fehler.

> der aufbau in dem bild dürfte die empfindlichkeit um einiges
> verschlechtern.

Davon ist witzigerweise nichts zu merken ;-) Genau mit diesem Fehler 
habe ich mir einen IR-Empfänger aufgebaut, der bei einer Distanz von 5m 
überhaupt keine Probleme hat.

Trotzdem danke für den Tipp, ich habe das Schaltbild korrigiert (evtl. 
muss man einmal im Browser Refresh drücken). Ich werde das bei 
zukünftigen Schaltungen berücksichtigen.

Gruß,

Frank

von Di P. (drpepper) Benutzerseite


Lesenswert?

Werden jetzt auch Wiederholungen beim NEC-Protokoll erkannt? (der 
Hinweis auf eine noch fehlende Implementierung ist weg.)

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Di Pi schrieb:
> Werden jetzt auch Wiederholungen beim NEC-Protokoll erkannt? (der
> Hinweis auf eine noch fehlende Implementierung ist weg.)

Nein, der Hinweis ist mir leider beim Bearbeiten der Tabellen 
flötengegangen. Ist nun wieder drin.

Aber bis jetzt habe ich noch keine FB in der Hand gehabt, wo wirklich 
die spezielle Wiederholungs-Sequenz augesandt wird. Bei meiner Toshiba-, 
Xoro- und Media-Player-Fernbedienung, die allesamt das NEC-Protokoll 
benutzen, wird davon jedenfalls kein Gebrauch gemacht. Stattdessen wird 
einfach der jeweilige Code solange wiederholt, bis man die Taste 
loslässt.

Die Sache mit Erkennung der Wiederholungssequenz steht trotzdem auf 
meiner TODO-Liste.

Gruß,

Frank

von M. K. (kichi)


Lesenswert?

Di Pi schrieb:
> Es wäre eine schöne sache, wenn neben den sechs bereits implementierten
> Protokollen auch noch RC5 vertreten wäre (genauso ein- und
> ausschaltbar), um letztlich so gut wie alle gängigen Protokolle mit
> einer Lib abzudecken.
> Dem Programmierer ist dann überlassen, welche Protokolle "gehört" werden
> sollen.

Der Meinung bin ich auch. Das sollte ja kein großer Mehraufwand sein und 
macht das Projekt auf jeden Fall nicht uninteressanter.

von Frank B. (frank_boe)


Lesenswert?

Frank M. schrieb:
> Aber bis jetzt habe ich noch keine FB in der Hand gehabt, wo wirklich
> die spezielle Wiederholungs-Sequenz augesandt wird.

Meine "Cyberhome" (alter DVD-Player) sendet sie.

von Michael M. (Gast)


Lesenswert?

meine yamaha-fb auch.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Michael K. schrieb:
> [RC5]
> Der Meinung bin ich auch. Das sollte ja kein großer Mehraufwand sein und
> macht das Projekt auf jeden Fall nicht uninteressanter.

Leider ist das schon einiges an Mehraufwand, denn RC5 passt überhaupt 
nicht in das Schema rein, wie die meisten anderen Protokolle aufgebaut 
sind. RC5 ist bi-phasen-kodiert (Manchester) und damit kann man die Bits 
nicht in das Schema:

0-Bit: m µsec hell, n µsec dunkel
1-Bit: x µsec hell, y µsec dunkel

pressen. Sondern:

0-Bit: m µsec hell, n µsec dunkel
1-Bit: x µsec dunkel(!), y µsec hell(!)

Und da liegt das Problem: je nach Folge der 1en und 0en gibt es 
verschieden lange Hell- oder Dunkelphasen.

Siehe auch: http://www.sbprojects.com/knowledge/ir/rc5.htm

Konsequenz: RC5 muss durch einen Extra-Code geschleust werden. Allein 
schon die Erkennung des Start-Bits als RC5-Code gestaltet sich als 
schwierig. Ursprünglich gab es 2 Start-Bits, die beide "1" sein mussten:

1. Start-Bit: 889µs dunkel, 889µs hell
2. Start-Bit: 889µs dunkel, 889µs hell

Daran ist aussergewöhnlich, dass das Bit mit einer Dunkelphase beginnt, 
das "sieht" man also schon mal gar nicht. Aber man kann das als RC5 
durchaus erkennen, da ja nach den 889µs immer eine Dunkelphase von 
konstant 889µs folgt. Bis dahin passt das alles noch...

Aber:

Das RC5-Protokoll wurde nach einiger Zeit abgeändert ("RC5-Extended") - 
nämlich derart, dass das 2. Start-Bit zu einem invertierten Kommando-Bit 
6 umfunktioniert wurde, um mehr Kommandos umsetzen zu können.

Damit sehen die beiden ersten Bits folgendermaßen aus:

Entweder:

  Start-Bit:      889µs dunkel, 889µs hell
  Kommando-Bit 6: 889µs dunkel, 889µs hell

oder:

  Start-Bit:      889µs dunkel, 889µs hell
  Kommando-Bit 6: 889µs hell, 889µs dunkel

Das heisst: wir haben entweder eine Hellphase von 1 x 889µs bei den 
ersten beiden Bits oder eine Hellphase von 2 x 889µs.

Peter Daneggers RC5-Decoder hat es da wesentlich einfacher: Dieser ist 
fest auf RC5 und dessen Manchester-Codierung fixiert und hart drauf 
programmiert. Wenn man nichts anderes berücksichtigen muss, ist das sehr 
sehr einfach.

Ich werde mir jedoch erst einmal Gedanken machen müssen, wie man 
RC5-Code als solchen überhaupt erkennen kann. Der Rest ist dann einfach: 
sobald klar ist, dass es sich um RC5 handelt, muss dann in der 
State-Machine in einen Manchester-Decoder gesprungen werden - also in 
eine Sonderbehandlung. Da kann dann der Code von Peter Dannegger 
herhalten.

Also bitte etwas Geduld, RC5 kann man nicht einfach durch 
Preprocessor-Konstanten parametrisieren, wie ich das mit den anderen 
Protokollen gemacht habe.

Gruß,

Frank

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Frank Boe schrieb:
>> [Wiederholungs-Sequenz beim NEC-Protokoll]
> Meine "Cyberhome" (alter DVD-Player) sendet sie.
Michael M. schrieb:
> meine yamaha-fb auch.

Okay, ich baus ein, ist ja nicht wirklich schwierig :-)

Gruß,

Frank

von Toralf W. (willi)


Lesenswert?

Frank M. schrieb:

> Daran ist aussergewöhnlich, dass das Bit mit einer Dunkelphase beginnt,
> das "sieht" man also schon mal gar nicht. Aber man kann das als RC5
> durchaus erkennen, da ja nach den 889µs immer eine Dunkelphase von
> konstant 889µs folgt. Bis dahin passt das alles noch...
>
Du tastest doch recht oft ab, wenn Du 1x 889µs erkennst passt das doch 
nur als RC5 Startbit.
Danach muß man ja nicht "ala" Peter weitermachen. Ich zähle einfach die 
ankommenden Pulse, wobei ein 889µs mit 1 und ein 1778µs mit 2 gezählt 
wird. Beim erkannten Startbit schiebe ich die erste 1 in den Bitspeicher 
und dann wird immer wenn der Pulszähler ungerade ist, bei einem 889µs 
Puls das letzte Bit erneut bzw. bei 1778µs letzte Bit invertiert in den 
Bitspeicher eingeschoben. Das dann bis alle 14 Bits eingesammelt sind.

Gruß Willi

P.s.: ich bewundere Euch, was ihr so alles auf die Reihe bekommt. Seit 
Ihr alle noch ledig, oder habt ihr einfach nur tollerante Frauen? Meine 
hat diese Woche Nachtdienst, da bleibt dann auch mal wieder etwas mehr 
Zeit.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Toralf Wilhelm schrieb:
> Du tastest doch recht oft ab, wenn Du 1x 889µs erkennst passt das doch
> nur als RC5 Startbit.

Fast: es können 1x889µs oder 2x889µs sein - jedenfalls beim extended 
RC5, also da, wo das ursprüngliche 2. StartBit als Kommando-Bit No. 6 
benutzt wird. Aber vielleicht vernachlässige ich das und kümmere mich 
erstmal einfach um das Classic-RC5.

> Danach muß man ja nicht "ala" Peter weitermachen. Ich zähle einfach die
> ankommenden Pulse, wobei ein 889µs mit 1 und ein 1778µs mit 2 gezählt
> wird. Beim erkannten Startbit schiebe ich die erste 1 in den Bitspeicher
> und dann wird immer wenn der Pulszähler ungerade ist, bei einem 889µs
> Puls das letzte Bit erneut bzw. bei 1778µs letzte Bit invertiert in den
> Bitspeicher eingeschoben. Das dann bis alle 14 Bits eingesammelt sind.

Danke für den Tipp, das werde ich mir nochmal durch die Gehirnwendungen 
laufen lassen.

> P.s.: ich bewundere Euch, was ihr so alles auf die Reihe bekommt. Seit
> Ihr alle noch ledig, oder habt ihr einfach nur tollerante Frauen?

Verheiratet, Frau ist tolerant und auch toll-erant ;-)

Gruß,

Frank

von Toralf W. (willi)


Lesenswert?

Frank M. schrieb:
> Fast: es können 1x889µs oder 2x889µs sein - jedenfalls beim extended
> RC5, also da, wo das ursprüngliche 2. StartBit als Kommando-Bit No. 6
> benutzt wird. Aber vielleicht vernachlässige ich das und kümmere mich
> erstmal einfach um das Classic-RC5.

Genauso mache ich es, einfach immer extended RC5 und das Bit invertiert 
als Bit6 einfügen.

> Verheiratet, Frau ist tolerant
Du glücklicher!
> und auch toll-erant ;-)
Mist da war sie wieder, meine Legasthenie.

Gruß Willi

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Toralf Wilhelm schrieb:
> Frank M. schrieb:
> Danach muß man ja nicht "ala" Peter weitermachen. Ich zähle einfach die
> ankommenden Pulse, wobei ein 889µs mit 1 und ein 1778µs mit 2 gezählt
> wird. Beim erkannten Startbit schiebe ich die erste 1 in den Bitspeicher
> und dann wird immer wenn der Pulszähler ungerade ist, bei einem 889µs
> Puls das letzte Bit erneut bzw. bei 1778µs letzte Bit invertiert in den
> Bitspeicher eingeschoben.

Habe das jetzt so eingebaut, aber mit einer leichten Änderung des 
Algorithmus: ob das neue Bit invertiert oder nicht invertiert neu 
eingeschoben wird bei einem kurzen Puls, ist nicht abhängig von der 
letzten Pulsdauer, sondern von der Pause davor.

Lange Pause vor kurzem Puls: neues Bit = letztes Bit invertiert
Kurze Pause vor kurzem Puls: neues Bit = letztes Bit

Wahrscheinlich hatte ich Dich da nicht genau verstanden, auf jeden Fall 
läuft das nun. Den Code stelle ich heute abend oder morgen zum Download 
bereit.

Dank und Gruß,

Frank

von Toralf W. (willi)


Lesenswert?

Frank M. schrieb:
> Toralf Wilhelm schrieb:
>> Frank M. schrieb:
>
> Lange Pause vor kurzem Puls: neues Bit = letztes Bit invertiert
> Kurze Pause vor kurzem Puls: neues Bit = letztes Bit
>
> Wahrscheinlich hatte ich Dich da nicht genau verstanden, auf jeden Fall
> läuft das nun. Den Code stelle ich heute abend oder morgen zum Download
> bereit.
>
Ja da habe ich mich nicht sehr deutlich ausgedrückt, ich messe jeden 
Flankenwechsel egal ob Puls oder Pause. Mich interessiert nur die Länge. 
Aber Du hast das schon richtig verstanden.
Gruß Willi

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

RC5 ist nun implementiert, der vom Compiler generierte Code ist kaum 
größer geworden, weil ich noch ein paar Sachen optimiert habe. Download 
findet Ihr im IRMP-Artikel:

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

Noch ein Tipp am Rande:

Jedes von IRMP unterstützte IR-Protokoll "verbrät" ungefähr 200 Byte an 
Code. Wer sparen muss, weil ihm der Flash-Speicher ausgeht, der sollte 
die Unterstützung von KASEIKYO und/oder RECS80 ausschalten. Beides sind 
eher exotische Protokolle, ausserdem ist die Modulationsfrequenz von 
56Khz beim Kaseikyo-Protokoll weit ab von den Frequenzen, die von den 
anderen Protokollen verwendet werden.

Über Feedback zum RC5 würde ich mich freuen, ich habe hier nur mit 
künstlich generierten Scan-Dateien getestet, da ich selbst keine RC5-FB 
habe.

Viel Spaß,

Frank

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Neue Version unter http://www.mikrocontroller.net/articles/IRMP#Download 
:

Beim NEC-Protokoll werden nun auch die "Repetition Frames" erkannt. Wenn 
die FB so eine Wiederholungssequenz aussendet, ersetzt IRMP diese 
einfach durch das zuletzt empfangene Kommando.

Gruß,

Frank

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Habe noch einen Bug korrigiert:

Die Puls/Pausen-Counter waren immer um 1 zu niedrig, das gab manchmal 
Probleme bei der SIRCS-Erkennung bei Sony-FBs mit stark abweichenden 
Timings.

Download-Zip-Datei habe ich aktualisiert.

Gruß,

Frank

von Simon K. (simon) Benutzerseite


Lesenswert?

Wie testest du das eigentlich? Hast du von jedem Protokoll ne 
Fernbedienung zuhause? ;) Oder haste bei nem Pollin 
1kg-Fernbedienungspaket zugegriffen hehe.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Simon K. schrieb:
> Wie testest du das eigentlich?

Steht im ersten Beitrag ganz oben, nicht gelesen? ;-)

irmp kann man auch unter Linux compilieren und dann mit einer Scan-Datei 
füttern. Wie man eine Scan-Datei mit IRMP erstellt, ist ebenso oben 
beschrieben. Ich teste den Code ausschließlich unter Linux, das geht 
wesentlich einfacher und schneller. Wenn dann alles wie gewünscht läuft, 
schicke ich den Source noch einmal durch den AVR-Compiler und flashe ihn 
dann.

> Hast du von jedem Protokoll ne Fernbedienung zuhause? ;)

Nein, 7 von 9 Fernbedienungen bei mir arbeiten mit dem NEC-Protokoll. 
Dann habe ich noch eine Samsung. Den Rest teste ich entweder mit 
Scan-Dateien, die mir Vlad Tepesch zur Verfügung gestellt hat (steht 
auch oben) oder mit künstlich erzeugten Dateien, die man einfach mit 
einem ASCII-Editor erstellt. Jedes Telegramm wird einfach pro Zeile mit 
0en (Puls) und 1en (Pause) beschrieben, fertig. Beispiel-Dateien sind im 
ZIP-Archiv enthalten.

> Oder haste bei nem Pollin 1kg-Fernbedienungspaket zugegriffen hehe.

Tatsächlich habe ich mir einen Packen Technisat-FBs für 95 Cent das 
Stück von Pollin kommen lassen, diese wurden (jedenfalls vor ein paar 
Wochen) nicht von IRMP erkannt. Entweder ist das RC5 (welches erst 
kürzlich auf besonderen Wunsch dazukam) oder noch was anderes... Mal 
sehen, bin zum Testen mit realer Hardware schon länger nicht mehr 
gekommen.

Wenn mir jemand Scan-Dateien schickt, welche von IRMP nicht erkannt 
wird, prüfe ich das und baue den Decoder dafür ein, wenn ich das für 
sinnvoll halte. Aber ich bin der Meinung, dass IRMP bereits jetzt über 
90% aller Fernbedienungen, die heutzutage so im Umlauf sind, bereits 
erkennt.

Gruß,

Frank

von Toralf W. (willi)


Lesenswert?

> Tatsächlich habe ich mir einen Packen Technisat-FBs für 95 Cent das
> Stück von Pollin kommen lassen, diese wurden (jedenfalls vor ein paar
> Wochen) nicht von IRMP erkannt. Entweder ist das RC5 (welches erst
> kürzlich auf besonderen Wunsch dazukam)

Genau so ist es!

RC5: fast alle Philips, Grundig, Metz, Loewe, Technisat, (ich glaube 
auch alles was Thomson war - Telefunken/Saba/Nordmende)

Gruß Willi

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Toralf Wilhelm schrieb:
> Genau so ist es!
>
> RC5: fast alle Philips, Grundig, Metz, Loewe, Technisat, (ich glaube
> auch alles was Thomson war - Telefunken/Saba/Nordmende)

Da wäre ich mir nicht so sicher. Laut

http://www.mikrocontroller.net/attachment/67261/Pollin-IR-Codes.txt

gibt es bei der Fernbedienung "Technisat DSR-B" (Pollin-Bestellnummer 
620062) zwei Ausführungen. Da bei mir kein 9V-Block einzusetzen ist, 
nehme ich an, dass es die erste im Text aufgeführte FB ist. Und diese 
enthält einen SAA3004 (SA2004 gibt es nicht, das scheint ein Vertipper 
zu sein) als IR-Encoder. Durch das Datenblatt steige ich noch nicht ganz 
durch, habe auch erstmal nur flüchtig draufgeguckt.

Kandidat könnte RECS80 sein, welches ja die zweite FB mit der 
Bestellnummer 620062 benutzt. Spricht auch deswegen dafür, weil eine 
LED, die beim damaligen Test vom µC synchron geschaltet wurde, um das 
Signal sichtbar zu machen, nur ganz ganz schwach leuchtete, wenn ich 
eine Taste drückte. Bei RECS80 sind die Impulse ultrakurz, nämlich nur 
158µs. Die Pausen hingegen sind 32 mal länger! Ein echter Batteriesparer 
also ;-)

Bei einer Timerfrequenz von 10000 kHz macht das gerade mal 1 oder 2 
Impulse. Da ich erst gestern den Bug gefixed habe, dass der Pulscounter 
immer 1 zu niedrig war, könnte das schon der Grund sein, warum die FB 
damals beim flüchtigen Test nach dem Auspacken nicht erkannt wurde. Da 
wurde nämlich schnell mal aus einem Puls gar keiner mehr ;-)

Da hilft alles nix: Ich muss das mit der "echten" Hardware und mit dem 
aktuellen IRMP-Code nochmal testen, im Notfall einen Scan machen...
Wenn sie dann aber funktionieren, sind das unschlagbar billige Teile ;-)

Gruß,

Frank

von siegmar (Gast)


Lesenswert?

Hi Leute,
tolles Projekt !!
Ich habe aber leider ein gänzlich anderes Problem.
Weiß Jemand ob es eine Art Datenbank gibt, wo man herausfinden kann, 
welches IR Protokoll ein Gerät benutzt ?
Hintergrund meiner Frage ist, das ich einen Digital Sat receiver 
(Philips DIS 2221) ohne Fernbedienung rumliegen habe und keine bisher 
von mir getestete Universalfernbedienung funktioniert.
Der IR Epfänger funktioniert.
Habe mir die Signale mit dem Scope angeschaut.
Würde den Sat Receiver ungern wegwerfen, denn wenn ich bedenke wieviel 
Dreck bei der Produktionen einen Neuen ensteht ...
Vielleicht hat ja Jemand einen guten Tip.

Wünsche allen noch schönen Tag
Gruß
Siegmar

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

siegmar schrieb:

> Hintergrund meiner Frage ist, das ich einen Digital Sat receiver
> (Philips DIS 2221) ohne Fernbedienung rumliegen habe und keine bisher
> von mir getestete Universalfernbedienung funktioniert.

Mein erster Gedanke wäre die Lirc-DB.

Sicher, dass der Receiver tatsächlich was empfängt?

Google sagt, dass der Receiver öfters Wärmeprobleme hat und deswegen 
sehr oft der IR-Empfang nach einiger Zeit ausfällt. Andere konnten den 
Empfang verbessern, indem sie die Blende vor dem IR-Sensor ausgebaut 
haben. Aber einen Hinweis, wie man eine Universal-FB damit zum Laufen 
bekommt, habe ich nicht gefunden.

Gruß,

Frank

von siegmar (Gast)


Lesenswert?

Frank M. schrieb:
> Sicher, dass der Receiver tatsächlich was empfängt?

Hallo Frank,
ja, ich hab das Oszi dran gehabt und saubere Impulse gesehn.
Eine Universalfernbedienung hat alle mölichen Protokolle durchgepulst 
und ich hab mir dann auf dem Oszi die Signale angeschaut.
Die Originalfernbedienung hab ich leider nicht mehr !!

Danke für deinen Tipp
Noch einen schönen Abend
Gruß
Siegmar

von M. K. (kichi)


Lesenswert?

Von der Philips-Universal-FB-Seite (http://www.pronto.philips.com) 
gibt's einen Link auf http://onlyoneremote.com. Dort kann eine Datenbank 
für sehr viele Hersteller heruntergeladen werden, darunter auch viele 
Philips-Codesets. Öffnen kann man die Datei mit den Konfigurationstools 
von Philips, die man kostenlos herunterladen kann, nachdem man sich 
registriert hat.

Leider kann man in den Philips-Tools nur die Bitfolgen ansehen, die man 
selbst aufgezeichnet hat. Vielleicht kannst du ja aber mit etwas reverse 
engineering was brauchbares aus der Datenbank holen. Vielleicht kennst 
du ja auch jemanden mit einer Philips-UFB der dir helfen könnte.

von Klaus L. (kllei)


Angehängte Dateien:

Lesenswert?

Hallo Frank,

cooles Projekt, ich habe es gestern mal provisorisch aufgebaut und 
gleich ein paar Anmerkungen und Fragen dazu:
RC5: wird weitgehend erkannt, allerdings habe ich festgestellt, das z.B. 
die Taste 2 einer Löwe FB öfter mal 4 oder 5 zurückgibt, manchmal stimmt 
auch die Adresse nicht. Die 6 "spinnt" ebenfalls öfter, andere Tasten 
gehen sehr stabil.
Eine andere RC5 FB (Inverto) zeigt ein fast identisches Verhalten (auch 
Taste 2 und 6 besonders auffällig)

Außerdem habe ich noch eine neuere Philips FB (TV) die nicht erkannt 
wird, er versucht RC5, findet aber nichts. ich habe einen Portscan mal 
angehängt, vielleicht kommt Dir die bekannt vor? Achtung, der Portscan 
ist invertiert, dann wird das Bitvergleichen einfacher.

An Protokollen fehlt mir noch DENON, zumindest die älteren DENON Codes 
werden nicht erkannt. Link zum Protokoll kann ich mal raussuchen, wenn 
Du hier unterstützen kannst/möchtest.

SIRCS und NEC werden anscheinend sicher erkannt, andere FB konnte ich 
noch nicht testen.

Mangels GCC "Übung" habe ich das Projekt nach Codevision "portiert" und 
auch gleich den DEBUG Mode in die AVR Variante eingebaut. Ich denke mal 
dabei ist nichts schiefgegangen. Allerdings scheint der output manchmal 
das Ergebnis zu beinflussen. Die Abweichungen habe ich allerdings auch 
ohne DEBUG bzw. IRMP_LOGGING

Kann das an dem von mir verwendeten Quarz liegen? Du hattest ja den 
Oszillaor benutzt. Könnte am Timing etwas verändern, oder? Ich habe um 
die Abarbeitung zu beschleunigen einen 16MHz Quarz und den Compiler auf 
maximalen speed optimiert.
Der Interrupt ist ebenfalls mit 10kHz eingestellt.

Kannst Du mir ein paar Tipps geben wo ich ansetzen kann?

Vielen Dank für den Code und Deine Unterstützung.

Grüße,
Klaus

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Hallo Klaus,

Klaus Leidinger schrieb:
> RC5: wird weitgehend erkannt, allerdings habe ich festgestellt, das z.B.
> die Taste 2 einer Löwe FB öfter mal 4 oder 5 zurückgibt, manchmal stimmt
> auch die Adresse nicht. Die 6 "spinnt" ebenfalls öfter, andere Tasten
> gehen sehr stabil.

Da wäre eine über den UART übertragene Scan-Datei klasse, wenn Du da mal 
die Tasten 0-9 aufzeichnen könntest.

> Eine andere RC5 FB (Inverto) zeigt ein fast identisches Verhalten (auch
> Taste 2 und 6 besonders auffällig)

Dito.

> Außerdem habe ich noch eine neuere Philips FB (TV) die nicht erkannt
> wird, er versucht RC5, findet aber nichts. ich habe einen Portscan mal
> angehängt, vielleicht kommt Dir die bekannt vor? Achtung, der Portscan
> ist invertiert, dann wird das Bitvergleichen einfacher.

Werde ich mir mal näher anschauen und dann noch was dazu schreiben. Wenn 
Du schon beim Einscannen über UART bist, kannst Du das ja auch direkt 
mal für diese FB tun.

> An Protokollen fehlt mir noch DENON, zumindest die älteren DENON Codes
> werden nicht erkannt. Link zum Protokoll kann ich mal raussuchen, wenn
> Du hier unterstützen kannst/möchtest.

Doku zu älterem DENON-Protokoll ist mir mal über den Weg gelaufen, wenn 
Du da einen Link hättest, wäre nett.

> SIRCS und NEC werden anscheinend sicher erkannt, andere FB konnte ich
> noch nicht testen.

Prima.

> Mangels GCC "Übung" habe ich das Projekt nach Codevision "portiert" und
> auch gleich den DEBUG Mode in die AVR Variante eingebaut.

Das ist schlecht. Die DEBUG-Variante ist eigentlich nur zum Testen unter 
Linux gedacht, auf dem AVR verändern Dir direkte printf-Ausgaben zu sehr 
das Zeitverhalten. Daher halte ich das für überhaupt nicht sinnvoll.

> Ich denke mal
> dabei ist nichts schiefgegangen. Allerdings scheint der output manchmal
> das Ergebnis zu beinflussen.

Eben. Lass das besser mit dem DEBUG-Modus auf dem AVR. Schalte lediglich 
IRMP_LOGGING ein. Die empfangenen Bytes werden gepuffert und sollten 
daher das Zeitverhalten während der Aufzeichnung nicht beeinflussen.

> Kann das an dem von mir verwendeten Quarz liegen? Du hattest ja den
> Oszillaor benutzt. Könnte am Timing etwas verändern, oder?

Mit einem Quarz sollte es eher besser sein. Wie gesagt, der DEBUG-Modus 
ist nicht für die Ausgabe geeignet, da er in der ISR direkt ausgeführt 
ist. Unter Linux oder Windows ist das absolut zeitunkritisch, weil da 
die Daten ja dann aus der Datei gelesen werden.

Gruß,

Frank

von Albert K. (datasec)


Lesenswert?

Hallo Klaus, steht die "portierte" Version für CV zum Download an?

Grüße,
Albert

von Klaus L. (kllei)


Lesenswert?

Albert K. schrieb:
> Hallo Klaus, steht die "portierte" Version für CV zum Download an?
>
Hallo Albert,

Du hast Post.

Wennn der Code "stabil" ist, stelle ich die gerne zur Verfügung.

Falls mehr Leute Interesse daran haben, könnte Frank dann die
#ifdef CV
vielleicht in den Original Code mit reinnehmen?

Mal sehen wieviel Aufwand das wird ;-)

Grüße,
Klaus

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Klaus Leidinger schrieb:

> Falls mehr Leute Interesse daran haben, könnte Frank dann die
> #ifdef CV
> vielleicht in den Original Code mit reinnehmen?

Klar, mache ich. Schick mir bitte die geänderten Dateien zu.

Gruß,

Frank

von siegmar (Gast)


Lesenswert?

Michael K. schrieb:
> Leider kann man in den Philips-Tools nur die Bitfolgen ansehen, die man
> selbst aufgezeichnet hat. Vielleicht kannst du ja aber mit etwas reverse
> engineering was brauchbares aus der Datenbank holen. Vielleicht kennst
> du ja auch jemanden mit einer Philips-UFB der dir helfen könnte.

Danke für den Tip.
Ob es micht weiter bringt ?
Wenn ich nur wüßte, welche Codierung der SAT Receiver benutzt.
Nun ja ....... mal sehn.
Trotzdem Danke und noch einen schönen Tag
Gruß
Siegmar

von Di P. (drpepper) Benutzerseite


Lesenswert?

Frank M. schrieb:
> Di Pi schrieb:
>> Werden jetzt auch Wiederholungen beim NEC-Protokoll erkannt? (der
>> Hinweis auf eine noch fehlende Implementierung ist weg.)
>
> Nein, der Hinweis ist mir leider beim Bearbeiten der Tabellen
> flötengegangen. Ist nun wieder drin.
>
> Aber bis jetzt habe ich noch keine FB in der Hand gehabt, wo wirklich
> die spezielle Wiederholungs-Sequenz augesandt wird. Bei meiner Toshiba-,
> Xoro- und Media-Player-Fernbedienung, die allesamt das NEC-Protokoll
> benutzen, wird davon jedenfalls kein Gebrauch gemacht. Stattdessen wird
> einfach der jeweilige Code solange wiederholt, bis man die Taste
> loslässt.

Die Reichelt-RGB-FB sendet die spezielle Wiederholungssequenz. :)

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Di Pi schrieb:
> Die Reichelt-RGB-FB sendet die spezielle Wiederholungssequenz. :)

Danke für die Info. Mit der Download-Version vom 13.02. im IRMP-Artikel 
sollte das auch von IRMP erkannt werden.

Gruß,

Frank

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Es gibt eine neue Version von IRMP zum Download:

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

Änderungen:

 - Erkennung von NEC-Protokoll-Varianten, z.B. Apple-Fernbedienung
 - Neuer Decoder: RC6
 - Neuer Decoder: Denon und Denon-Varianten
 - Verbesserung des RC5-Decoders (Bugfixes)

Vielen Dank an  Klaus Leidinger, der mich mit den entsprechenden 
Scan-Dateien versorgte ;-)

Desweiteren gibt es nun im Unterverzeichnis IR-Data ein irmp.exe, mit 
dem man Scan-Dateien auch unter Windows analysieren kann.

Beispiel:

1. Eingabeaufforderung starten
2. In das Verzeichnis irmp\IR-Data wechseln
3. Aufruf von:

   irmp.exe <rc5x.txt

Da manche Ausgaben sehr lang werden, empfiehlt es sich, diese in eine 
Datei zu lenken oder in den more weiterzuleiten, damit man seitenweise 
blättern kann:

   irmp.exe <rc5x.txt | more


Viel Spaß,

Frank

von Klaus L. (kllei)


Lesenswert?

...
und für die Codevision Nutzer ist die main.c entsprechend angepasst...
einfach das //#define CODEVISION auskommentieren.

Danke an Frank, auch für die Nachtschichten ;-)

Klaus

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Klaus Leidinger schrieb:
> ...
> und für die Codevision Nutzer ist die main.c entsprechend angepasst...
> einfach das //#define CODEVISION auskommentieren.

Upps, hab ich doch tatsächlich vergessen... ich schreibs noch mit in den 
Artikel.

Gruß,

Frank

von Chris M. (shortie)


Lesenswert?

ich habe mal eine Liste von 6 Fernbedienungen dem Artikel hinzugefügt - 
u.a. auch eine mit KASEIKYO Protokoll - die ich mal spontan 
durchgetestet habe.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Chris M. schrieb:
> ich habe mal eine Liste von 6 Fernbedienungen dem Artikel hinzugefügt -
> u.a. auch eine mit KASEIKYO Protokoll - die ich mal spontan
> durchgetestet habe.

Hey, und es hat funktioniert? Das Kaseikyo-Protokoll hatte ich lediglich 
nach Infos aus dem Internet implementiert, ohne es jemals testen zu 
können.

Gute Idee, eine Liste von Fernbedienungen in den Artikel einzufügen, 
vielleicht ist die Angabe der Adresse aber besser in Hex sinnvoll?

Wer noch weitere FBs mit IRMP getestet hat, kann diese ja auch noch im 
Artikel eintragen, zum Beispiel die Reichelt-RGB-FB.

Gruß,

Frank

von Chris M. (shortie)


Lesenswert?

Frank M. schrieb:

> Hey, und es hat funktioniert? Das Kaseikyo-Protokoll hatte ich lediglich
> nach Infos aus dem Internet implementiert, ohne es jemals testen zu
> können.

Ja problemlos - mit der Version die Du um den 10.02. veröffentlicht 
hattest ging noch nichts und ich dachte schon die wird noch ein ganz 
anderes Protokol nutzen. Auch die RC5 Codes stimmen nun mit der anderen 
Software von Peter Dannegger die ich nutze überein.

von Michael U. (murban)


Lesenswert?

Moin,

habe den Code heute zum ersten Mal ausprobiert. Läuft auf einem Atmega16 
einwandfrei mit NEC Protokoll.

Eine kleine Erweiterung habe ich eingebaut: Die Datenstruktur irmp_data 
habe ich um ein Flag erweitert, das anzeigt, ob das Kommando aus einem 
Repetition-Frame stammt. Damit kann ich dann im Programm entscheiden, ob 
ich einen Auto-Repeat haben möchte oder nicht.

Mag vielleicht auch noch für andere hilfreich sein...

Viele Grüsse
Michael

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Michael Urban schrieb:

> Eine kleine Erweiterung habe ich eingebaut: Die Datenstruktur irmp_data
> habe ich um ein Flag erweitert, das anzeigt, ob das Kommando aus einem
> Repetition-Frame stammt. Damit kann ich dann im Programm entscheiden, ob
> ich einen Auto-Repeat haben möchte oder nicht.

Ist das generell sinnvoll und damit von allgemeinem Interesse?

Ich meine, nicht nur für NEC, auch bei RC5 und RC6 könnte man das gewiss 
einbauen...

@Michael: Für was brauchst Du das?

Gruß,

Frank

von Di Pi (Gast)


Lesenswert?

Ich bin sehr daran interessiert, unterscheiden zu können, ob es eine 
Wiederholung oder ein neuer tastendruck (auch derselben taste) ist.

von Vlad T. (vlad_tepesch)


Lesenswert?

was versteht ihr unter Wiederholung?
a) den mehrfachen Empfang eines Frames, weil das Protokoll so 
implementiert ist, dass es jeden Frame 3x verschickt
b) eine Wiederholung durch dauerhaft gedrückte Taste

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Vlad Tepesch schrieb:
> was versteht ihr unter Wiederholung?
> a) den mehrfachen Empfang eines Frames, weil das Protokoll so
> implementiert ist, dass es jeden Frame 3x verschickt
> b) eine Wiederholung durch dauerhaft gedrückte Taste

b)

Das Protokoll "darunter" soll ja gerade für die Applikation 
unsichtbar/uninteressant sein.

Gruß,

Frank

von Michael U. (murban)


Lesenswert?

Moin,

ich meinte die Erkennung, ob ein Kommando erstmalig gesendet wird oder 
aufgrund eines Wiederholungsframes erzeugt wurde.

Ich brauchte das, weil ich die Fernbedienung zur Eingabe von Daten 
verwende - und wenn man da nicht kurz genug drückt, dann "prellt" die 
Sache eben...

Ich habe das ganz einfach gelöst:

Die Datenstruktur IRMP_DATA habe ich durch ein viertes Feld ergänzt:
1
typedef struct
2
{
3
  uint8_t               protocol;                                                               // protocol, i.e. NEC_PROTOCOL
4
  uint16_t              address;                                                                // address
5
  uint16_t              command;                                                                // command
6
  uint8_t               repetition;                                                               // repetition frame
7
} IRMP_DATA;

an der entsprechenden Stelle für die Erkennung von repetition frames:
1
          if (irmp_tmp_protocol == IRMP_NEC_PROTOCOL && irmp_bit == 0)                            // repetition frame
2
          {
3
            irmp_protocol = irmp_tmp_protocol;
4
            irmp_address = last_irmp_address;                                                     // address is last address
5
            irmp_command = last_irmp_command;                                                     // command is last command
6
            irmp_repetition = 1;   // Marker repetition flag
7
          }

(Variablendeklarationen, etc. habe ich hier jetzt mal weggelassen)

Das funktioniert bei allen Protokollen, die einen repetition frame 
besitzen

In der Auswerteroutine im Programm kann mann jetzt irmp_data.repetition 
auswerten und selbst entscheiden, ob man die Wiederholung haben will 
oder nicht.

Ich habe z.B. für die Zahlentasten, die ich zur Eingabe verwende, die 
Wiederholungen ignoriert, für Cursortasten sie aber eingeschaltet 
gelassen.

Ob das jetzt Allgemein interessant ist, mag ich nicht beurteilen - für 
mich ist es ein nutzbares Feature.

Viele Grüsse
Michael

von Michael U. (murban)


Lesenswert?

Ach ja, vergessen:

Variante b) - das "Auto-Repeat" bei länger gedrückter Taste (schlägt bei 
mir schon bei einer gefühlten 1/10 Sek. zu...

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

> Ob das jetzt Allgemein interessant ist, mag ich nicht beurteilen - für
> mich ist es ein nutzbares Feature.

Okay, ich bau das so ähnlich ein, aber etwas allgemeingültiger:
1
#define IRMP_FLAG_REPETITION    0x01
2
#define IRMP_FLAG_WASWEISSICH   0x02
3
....
4
5
typedef struct
6
{
7
  uint8_t          protocol;           // protocol, i.e. NEC_PROTOCOL
8
  uint16_t         address;            // address
9
  uint16_t         command;            // command
10
  uint8_t          flags;              // flags, e.g. repetition frame
11
} IRMP_DATA;

Denn wer weiß, vielleicht kommen da noch ein paar Flags hinzu?

Dann wird bei länger gedrückter Taste das Bit IRMP_FLAG_REPETITION in 
flags gesetzt - nicht nur bei NEC, sondern auch bei RC5 und RC6. Bei den 
anderen Protokollen ist das schwerlich möglich, ausser ich arbeite mit 
Timeouts ("wenn derselbe Befehl innerhalb X Millisekunden reinkommt, 
dann hat der User schon länger den Finger auf der Taste")... mal sehen.

In main() kann man das dann so abfragen:
1
   if (irmp_data.flags & IRMP_FLAG_REPETITION)
2
   {
3
      finger_blau();
4
   }
5
   else
6
   {
7
      normale_taste();
8
   }

Gruß,

Frank

von Di Pi (Gast)


Lesenswert?

Timeouts würde ich dafür nicht verwenden (oder abschaltbar machen). Was 
ich an diesem Projekt nämlich am meisten schätze ist die Möglichkeit, 
alles nicht benötigte per Flag abzuschalten.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Di Pi schrieb:
> Timeouts würde ich dafür nicht verwenden (oder abschaltbar machen). Was
> ich an diesem Projekt nämlich am meisten schätze ist die Möglichkeit,
> alles nicht benötigte per Flag abzuschalten.

Ich dachte einfach an einen Zähler, der bei jedem Call der ISR 
hochgezählt wird. Wenn

a) ein neuer Frame erkannt wird und
b) der Zähler einen gewissen Wert (REP_TIMEOUT) nicht übersteigt und
c) erkanntes ProtoKoll = letztes Protokoll und
d) Adresse = letzte Adresse und
e) Kommando = letztes Kommando

dann setze das Repetition-Flag.

Der Zähler wird bei jedem erkannten Protokoll einfach wieder auf 0 
gesetzt.

REP_TIMEOUT müsste auf ca. 0,2 Sekunden stehen. Jede FB schafft bei 
Festhalten einer Taste ca. 10 Frames pro Sekunde. Aber keiner klickt so 
schnell einzeln auf der FB rum.

Meinetwegen kann ich das auch abschaltbar machen, aber ich schätze den 
zusätzlichen Aufwand an µC-Code auf max. 50 Bytes.

Gruß,

Frank

von Di Pi (Gast)


Lesenswert?

Wenn es wirklich nur 50 Bytes sind, ists meiner Meinung nach nicht 
nötig, es per Flag abschaltbar zu machen.

Ich habe mir noch nicht so detaillierte Gedanken über die konkrete 
Umsetzung gemacht. Dein Ansatz aber klingt für mich sehr plausibel und 
wirklich klein.

Er könnte sogar diverse Togglebits komplett ablösen (und dadurch den 
code verkleinern), wenn man davon ausgeht, dass

"
>Jede FB schafft bei
>Festhalten einer Taste ca. 10 Frames pro Sekunde. Aber keiner klickt so
>schnell einzeln auf der FB rum.
"

immer gilt.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Es gibt eine neue Version von IRMP zum Download:

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

Einzige Änderung: Neue Variable flags in IRMP_DATA zur Erkennung von 
langen Tastendrücken

Um zu unterscheiden, ob eine Taste lange gedrückt wurde oder lediglich 
einzeln, dient das Bit IRMP_FLAG_REPETITION. Dieses wird im 
Struct-Member flags gesetzt, wenn eine Taste auf der Fernbedienung 
längere Zeit gedrückt wurde und dadurch immer wieder dasselbe Kommando 
innerhalb kurzer Zeitabstände ausgesandt wird.

Beispiel:
1
    if (irmp_data.flags & IRMP_FLAG_REPETITION)
2
    {
3
      finger_blau (irmp_data.command);
4
    }
5
    else
6
    {
7
      einzeln (irmp_data.command);
8
    }

Dies kann zum Beispiel dafür genutzt werden, um die Tasten 0-9 zu 
"entprellen", indem man Kommandos mit gesetztem Bit IRMP_FLAG_REPETITION 
ignoriert. Bei dem Drücken auf die Tasten VOLUME+ oder VOLUME- kann die 
wiederholte Auswertung ein und desselben Kommandos aber durchaus 
gewünscht sein - zum Beispiel, um LEDs zu faden.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Es gibt eine neue Version vom IRMP zum Download:

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

Änderungen:

1. SIRCS: Korrekte Erkennung und Unterdrückung von automatischen 
Frame-Wiederholungen

Eine Sony-Fernbedienung wiederholt automatisch jeden Frame 2-3 mal. Das 
wurde nicht immer korrekt als solche erkannt. Solche Wiederholungen 
werden nun weggefiltert.

2. SIRCS: Device-ID-Bits werden nun in irmp_data.command und nicht mehr 
in irmp_data.address gespeichert

Je nach Sony-FB-Tasten (z.B. für TV-Kanal oder für Videotext) werden 
unterschiedliche ID-Kennungen mitgeschickt. IRMP hat diese bisher in der 
Adresse abgebildet. Das ist aber nicht praxisgerecht, weil dann ein- und 
dieselbe Fernbedienung unterschiedliche Adressen aufweist. Die 
ID-Kennung wird nun zusammen mit dem Kommando in der Variablen 
irmp_data.command abgelegt. Somit hat nun jede Sony-FB ein- und dieselbe 
Adresse, nämlich 0.

Ausnahme: Ist der Frame 20 Bits statt 12 oder 15 Bits lang (nur bei 
neueren FBs), werden die letzten 5 Bits in der Adresse abgelegt.

3. Vergrößerung des Scan-Buffers (zwecks Protokollierung)

Der Scan-Buffer wurde vergrößert, um solche automatischen 
Wiederholungen, wie sie z.B. von Sony-FBs ausgesandt werden, überhaupt 
zu erkennen und als solche für Scans zu protokollieren. Da der 
Scan-Buffer im Normalfall abgeschaltet ist, hat das keine Auswirkung auf 
die Größe des Programms.

Gruß,

Frank

von Peter K. (peko)


Lesenswert?

Hi Frank,

zunächst mal vielen Dank für das große Engagement bei diesem 
Softwareprojekt. Das trifft genau mein Thema, ich habe gerade ein 
Projekt geatartet um verschiedene Kommandos der "vielen" Fernbedienungen 
meiner Anlage aufzufangen um dann Zusatzfunktionen auszulösen.
Vielleicht hier mal kurz meine Erfahrungen mit deiner Software nach den 
ersten 2..3 h herumspielen:
Mit 8Mhz internem Oszillator hatte ich massive Probleme mit dem Timing, 
(gleiche Tastendrücke führen zu unterschiedlichen Codes). Nun, mit 16MHz 
externem Quarz läuft es wesentlich besser.

Zu den Protokollen, die ich mit original FB testen kann:

SIRCS läuft gut, allerdings ist eine Sony Videorecorder-FB offenbar mit 
ihrem Timing etwas grenzwertig, es kommt immer mal vor, daß verschiedene 
Codes bei gleichem Tastendruck gezeigt werden.
NEC von einer Yamaha-FB läuft richtig super.
KASEIKYO von einer Panasonic Blueray FB läuft auch super.
SAMSUNG von einer TV-FB geht überhaupt nicht, null Output.
Dann kann ich noch eine Kathrein-Sat-Rx FB bieten - dort meldet IRMP zu 
90% RC5(x) und ab und zu RC6. (Timing-Problem?) Am funktionieren dieses 
Protokolls wäre ich am stärksten interessiert...

Noch eine Anmerkung zu der neuesten Änderung vom 2.3.: Meiner Meinung 
nach hat der Wegfall der Systemadresse bei SIRCS keinen Sinn bzw. es 
kommt auf den Anwendungsfall (?) an. Wenn ich an der TV-FB Power drücke 
will ich das doch von z.B. Power beim DVD-Player unterscheiden. Das geht 
nun nicht mehr, alles sieht gleich aus.

Und eine letzte Sache ist mir noch aufgefallen: Die Kommandos die IRMP 
ausgibt sind in der Bitorder verdreht. Ok, das mag egal sein, denn 
eindeutig ist es auch so, aber typischerweise haben Zifferntasten 1..9 
aufsteigende Codes, in welchem Bereich auch immer. Daran kann man das 
Problem ganz gut erkennen. Dreht man die Bits um, sieht es sowohl bei 
SIRCS, NEC und KASEIKYO "schön" aus. Ggf. sind auch die Systemadressen 
bitverdreht, konnte ich noch nicht checken.

Ok, langer Beitrag, sorry ;) Wenn ich mit meinem FB-Fundus irgendwie zum 
Fortgang dieses Projektes beitragen kann, würde ich es im Rahmen meines 
Zeitbudgets gerne tun.

-Peter

von Di P. (drpepper) Benutzerseite


Lesenswert?

Peter Kostov schrieb:
> typischerweise haben Zifferntasten 1..9
> aufsteigende Codes

Da habe ich mit einer NoName-RC5 FB andere Erfahrungen gemacht. Da 
scheinem mir die Kommandos rein zufällig vergeben worden zu sein (sowohl 
1..9 als auch alle anderen Tasten). Sicher, dass dein Hersteller nicht 
vllt einfach absteigend nummeriert?

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Hi Peter,

Peter Kostov schrieb:

> Mit 8Mhz internem Oszillator hatte ich massive Probleme mit dem Timing,
> (gleiche Tastendrücke führen zu unterschiedlichen Codes). Nun, mit 16MHz
> externem Quarz läuft es wesentlich besser.

Interessant, die anderen, die mich mit IR-Scans und anderen Infos 
versorgen, benutzen den internen Oszillator und haben keine 
Timing-Probleme.

> SIRCS läuft gut, allerdings ist eine Sony Videorecorder-FB offenbar mit
> ihrem Timing etwas grenzwertig, es kommt immer mal vor, daß verschiedene
> Codes bei gleichem Tastendruck gezeigt werden.

Da bräuchte ich einen Scan von mehreren Tasten. Dazu bitte IRMP_LOGGING 
einschalten, über den UART mitprotokollieren und mir die Scans schicken 
- am besten mit einem Kommentar "# Taste 1" vor jeder Zeile. 
Beispiel-Dateien sind im Ordner IR-Data.

> KASEIKYO von einer Panasonic Blueray FB läuft auch super.

Hier würden mich auch Scans interessieren, weil ich nämlich gerade das 
Programm für eine IR-Sende-Funktion schreibe, welcher man die 
IRMP-Datenstruktur übergibt. Diese Funktion rekonstruiert aus den 
IRMP-Daten wieder den Original-Frame und gibt diesen dann über eine 
IR-Diode aus. Beim Kaseikyo-Protokoll sind das aber 48 Bits, von welchen 
ich beim Decodieren einige ignoriere, um sie überhaupt in die 
IRMP-Datenstruktur pressen zu können. D.h. beim Decodieren gehen 
Informationen verloren. Diese sind zwar fürs Decodieren der Tasten nicht 
wichtig, aber für das Encodieren des kompletten Frames. Wäre also nett, 
wenn Du mir da entsprechende Scans schicken könntest, da ich selber noch 
nie eine Kaseikyo-kompatible FB gesehen habe ;-)

> SAMSUNG von einer TV-FB geht überhaupt nicht, null Output.

Bitte Scans her. Ich passe das dann an.

> Dann kann ich noch eine Kathrein-Sat-Rx FB bieten - dort meldet IRMP zu
> 90% RC5(x) und ab und zu RC6. (Timing-Problem?) Am funktionieren dieses
> Protokolls wäre ich am stärksten interessiert...

RC6 sieht verschiedene Modes vor und kann ziemlich kompliziert werden. 
Ich habe bisher nur Mode 0 implementiert, der auch hier

http://www.sbprojects.com/knowledge/ir/rc6.htm

dokumentiert ist. Da RC6 teilweise(!) dieselben Timings wie RC5 benutzt, 
kann das dann schnell "verwechselt" werden - jedenfalls dann, wenn der 
Frame nicht den Mode 0, sondern irgendeinen anderen verwendet.

Auch hier helfen mir nur Scans.

> Noch eine Anmerkung zu der neuesten Änderung vom 2.3.: Meiner Meinung
> nach hat der Wegfall der Systemadresse bei SIRCS keinen Sinn bzw. es
> kommt auf den Anwendungsfall (?) an. Wenn ich an der TV-FB Power drücke
> will ich das doch von z.B. Power beim DVD-Player unterscheiden. Das geht
> nun nicht mehr, alles sieht gleich aus.

Die Infos gehen ja nicht verloren, die Device-IDs landen halt nun im 
Byte "command" statt "address". Daher sollte die TV-Power- und die 
DVD-Power-Taste durchaus ein unterschiedliches Kommando liefern. Vor 
dieser Änderung waren halt die Adressen verschieden aber die Kommandos 
gleich.

Bist Du sicher, dass da alles gleich aussieht? Dann muss es auch vor 
dieser Änderung gleich ausgesehen haben.

> Und eine letzte Sache ist mir noch aufgefallen: Die Kommandos die IRMP
> ausgibt sind in der Bitorder verdreht. Ok, das mag egal sein, denn
> eindeutig ist es auch so, aber typischerweise haben Zifferntasten 1..9
> aufsteigende Codes, in welchem Bereich auch immer. Daran kann man das
> Problem ganz gut erkennen. Dreht man die Bits um, sieht es sowohl bei
> SIRCS, NEC und KASEIKYO "schön" aus. Ggf. sind auch die Systemadressen
> bitverdreht, konnte ich noch nicht checken.

Einige Protokolle senden mit MSB-First, andere mit LSB-First. Die 
Arbeit, die Bits in der jeweils "richtigen" Reihenfolge zu speichern, 
wollte ich mir nicht machen. Hauptsache, die empfangenen Codes sind 
verschieden. Ist die Bitreihenfolge für Dich wichtig?

> Ok, langer Beitrag, sorry ;) Wenn ich mit meinem FB-Fundus irgendwie zum
> Fortgang dieses Projektes beitragen kann, würde ich es im Rahmen meines
> Zeitbudgets gerne tun.

Danke im voraus für die Scans ;-)

Gruß,

Frank

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Di Pi schrieb:
> Da habe ich mit einer NoName-RC5 FB andere Erfahrungen gemacht. Da
> scheinem mir die Kommandos rein zufällig vergeben worden zu sein (sowohl
> 1..9 als auch alle anderen Tasten).

Interessant, bei RC5 sind die Codes für die Tasten eigentlich fest 
definiert, d.h. jede RC5-FB sollte das gleiche Command senden, wenn man 
die Taste "1" drückt. Die Adressen können natürlich voneinander 
abweichen.

> Sicher, dass dein Hersteller nicht vllt einfach absteigend nummeriert?

Das Problem ist die Bitreihenfolge. Einige Protokolle arbeiten mit 
MSB...LSB, andere mit LSB...MSB. Diese verschiedenen Bitreihenfolgen 
beachte ich nicht. Halte ich auch (bisher) nicht für wichtig. 
Hauptsache, jede Taste wird mit einem unterschiedlichen Code empfangen.

RC5 sendet übrigens mit MSB first, d.h. die Bitreihenfolge ist hier im 
IRMP "richtig" herum. Die Commands müssen dann für die Tasten 1-9 immer 
folgendermaßen aussehen:

Taste 1: command 0x0001
Taste 2: command 0x0002
...
Taste 9: command 0x0009

Ich werde die Bitreihenfolge im IRMP-Artikel mal dokumentieren. Dann 
kann sich jeder selbst überlegen, ob er die Bits nach dem Empfang 
nochmal "drehen" will oder nicht. Ich würde es nicht tun, halte ich für 
unnötigen Verschleiss des µCs ;-)

Gruß,

Frank

von Peter K. (peko)


Angehängte Dateien:

Lesenswert?

Hallo Frank,

anbei Scans von verschiedensten Codes. Insbesondere die letzten Tests 
mit der Kathrein FB sehen sehr merkwürdig aus, da IRMP meistens SIRCS 
meldet, es ist definitiv kein SIRCS. Ich vermute sehr stark RC5 / RC6, 
irgendetwas mit einem Toggle-Bit, damit kommt meine programmierbare FB 
nicht klar.

Interessant auch die Samsung Scans, die vom IRMP auf "höherem Layer" gar 
nicht angezeigt werden.

Getestet wurde das Ganze mit einem ATMEGA32@16MHz.

-Peter

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Hallo Peter,

Peter K. schrieb:
> anbei Scans von verschiedensten Codes.

Vielen Dank für die Arbeit, die Du Dir gemacht hast. Ich schaue sie mir 
im Laufe des Tages an und melde mich dann.

Gruß,

Frank

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Ich habe nun die einzelnen Scans von Peter durchgearbeitet:

Sony-RM-S-310:

  Protokoll: SIRCS
  Erkennung: 100%

Sony-RMT-V406:

  Protokoll: SIRCS
  Erkennung: 100%

Sony-RM-U305C:

  Protokoll: SIRCS
  Erkennung : 100% (nach Anpassung der SIRCS-Toleranzen)

Sony-RMT-D142P-DVD:

  Protokoll: SIRCS
  Erkennung : 100%

Panasonic-Blue-Ray:

  Protokoll: KASEIKYO
  Erkennung: 100% (nach Anpassung der Kaseikyo-Toleranzen)

  Prinzipiell kommt jeder Code 2x, beim 2. Mal ist Repetition-Flag
  gesetzt.
  @Peter: Du hast die Tasten aber nur kurz gedrückt? Wenn ja, muss ich
  Kaseikyo-Wiederholungen wegfiltern

Yamaha-RAV388:

  Protokoll: NEC
  Erkennung: 100%

  Auch hier kommt jeder Code 2x, Repetition-Flag ist ebenso gesetzt.
  Beim NEC-Protokoll habe ich das bisher aber noch nicht erlebt, dass
  Frames wiederholt werden.
  @Peter: Nochmal die Frage: auch da jede Taste nur 1x kurz gedrückt?

Samsung_TV:

  Diese FB benutzt zwar die gleichen Timings wie das bisherige SAMSUNG-
  Protokoll, aber es fehlt das längere Sync-Bit an 16. Stelle. Ausserdem
  ist die Länge nur 32 statt 37 Bits.

  Protokoll: SAMSUNG2 (NEU!)
  Erkennung: 100% (nach Anpassung des Source auf IRMP_SAMSUNG2_PROTOKOL)

  Siehe auch IRMP-Artikel, wurde angepasst bzgl. SAMSUNG2

Kathrein-UFS-912-Remote:

  Das ist echt ein harter Brocken. Das Protokoll ist RC6, aber der Frame
  besteht nicht aus 20 Bits, sondern aus 36 Bits. Der RC6-Mode ist ein
  anderer als der bisher bekannte, ausserdem liegt das Timing der
  Start-Bits sehr nahe am SIRCS-Protokoll. Da muss ich noch ein wenig
  Arbeit reinstecken...

Den Download im IRMP-Artikel werde ich heute abend aktualisieren, dann 
klappt es auch mit allen oben genannten Fernbedienungen einwandfrei. 
Ausnahme: Kathrein-FB, da kann es evtl. länger dauern.

Gruß,

Frank

von Peter K. (peko)


Lesenswert?

Hi Frank,

na das Verarbeiten der Infos geht ja schnell... Ich werde heute abend 
nochmal einige Scans jeweils mit "Taste kurz gedrückt" vs. "Taste lang 
gedrückt" schicken. Wenns interessiert, kann ich auch noch verschiedene 
andere FB mal einscannen. Z.B. noch 'ne Kathrein, Thomson und Skymaster.

-Peter

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Hi Peter,

Peter K. schrieb:

> na das Verarbeiten der Infos geht ja schnell...

Die meiste Arbeit war das Separieren in verschiedene Dateien und die 
Anpassung der Kommentare mit dem Editor ;-)

> Ich werde heute abend
> nochmal einige Scans jeweils mit "Taste kurz gedrückt" vs. "Taste lang
> gedrückt" schicken.

Prima, wäre klasse, wenn Du folgende Form wählen würdest:

1. Für jede FB eine eigene Datei
2. Vor jedem Scan eine Kommentar-Zeile, die mit '#' beginnt.

Beispiel für Sony-RM-S-310.txt:

# Taste: Power
00000000000000000000000000111100000000000000111100000000...
# Taste: 1
00000000000000000000000000111100000000000000111100000000...
usw.

> Wenns interessiert, kann ich auch noch verschiedene
> andere FB mal einscannen. Z.B. noch 'ne Kathrein, Thomson und Skymaster.

Kannst Du gerne machen.

Gruß,

Frank

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Neue Version von IRMP zum Download verfügbar:

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

Erweiterungen/Änderungen:

- Neues Protokoll: SAMSUNG32 (Mix aus SAMSUNG & NEC-Protokoll)
- Änderung/Anpassung der SIRCS- und Kaseikyo-Timing-Toleranzen

Dank an Peter K. für die Scans.

Gruß,

Frank

von Klaus L. (kllei)


Lesenswert?

Peter K. schrieb:
> KASEIKYO von einer Panasonic Blueray FB läuft auch super.

Hallo Peter,

Du hast anscheinend eine KASEIKYO FB, die müsste ja mit 56KHz senden. 
Hast Du einen TSOP1756 als Empfänger? Oder was sonst?

Ich hatte hier gerade ein Problem mit einem SFH 5110-36, der hat nicht 
mal mehr die 40KHz der Sony FB erkannt, ein TSOP1736 geht bei Sony noch, 
aber nicht bei 56KHz.

Hat eventuell jemand einen Tipp für einen breitbandigeren Empfänger?

Vielen Dank und viele Grüße an die IR Fans ;-)
Klaus

von Peter K. (peko)


Lesenswert?

Hi Klaus,

ich habe hier so eine kleine Blechbüchse 1,5x1,5x1 cm als IR-Rx, vor 
Jahren mal bei "C" gekauft. Die funktioniert mit allen FB (Sony, 
Samsung, Yamaha, Panasonic) in ca. 50cm Entfernung. Das "DX"-Verhalten 
aus mehreren Metern Entfernung hab ich noch nicht getestet.

-Peter

von Peter K. (peko)


Angehängte Dateien:

Lesenswert?

Hi Frank,
anbei noch mal ein kurzer Scan von der Panasonic FB. Es gibt dort einen 
Unterschied bei Taste 3: Einmal ganz kurz gedrückt, einmal einen Moment 
länger. Ich wollte auch Dauerdrück aufzeichnen, allerdings stürzt dabei 
das Prog. anscheinend ab. Genauso hängt sich wohl was auf, wenn ich auf 
der Samsung32 dauernd drücke. Ich vermute, da läuft der scan-buffer 
über? Ich muss gestehen daß ich bisher mir noch nicht näher angucken 
konnte wie du das ganze implementiert hast.
Aber: Samsung wird jetzt gut erkannt, prima!

Ciao - Peter

Mehr Zeit müsste man haben :)

von Klaus L. (kllei)


Lesenswert?

Peter K. schrieb:
> ich habe hier so eine kleine Blechbüchse 1,5x1,5x1 cm als IR-Rx, vor

OK, so ein Teil habe ich auch noch aus einem alten Fernseher, aber so 
was gibts wohl nicht mal mehr bei P*llin...

Danke für die Info,
Klaus

von Michael H. (mah)


Lesenswert?

ich möchte mit einer Anwendung einige wenige Tasten einer (vorab 
unbekannten) Fernbedienung aufzeichnen und diese später wiedergeben 
können (in genau diesem Protokoll).

Hat jemand einen Tip für eine dazupassende generische *Sende*routine?

-Michael

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Michael Haberler schrieb:
> ich möchte mit einer Anwendung einige wenige Tasten einer (vorab
> unbekannten) Fernbedienung aufzeichnen und diese später wiedergeben
> können (in genau diesem Protokoll).
>
> Hat jemand einen Tip für eine dazupassende generische *Sende*routine?

IRSND - diese hat gerade Klaus im Test ;-)

IRSND ist das Gegenstück zu IRMP. IRSND generiert aus der 
IRMP-Datenstruktur den Frame und schickt ihn auf eine IR-LED. Ich werde 
spätestens am Wochenende den IRSND zum Download ablegen.

Gruß,

Frank

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Hi Peter,

Peter K. schrieb:
> anbei noch mal ein kurzer Scan von der Panasonic FB. Es gibt dort einen
> Unterschied bei Taste 3: Einmal ganz kurz gedrückt, einmal einen Moment
> länger.

Vielen Dank, sehr aufschlussreich. Der Frame wird nur 1x geschickt, wenn 
Du kurz drückst. Bei der Taste 3 (länger gedrückt) gab es zwei Frames, 
wobei IRMP dann korrekterweise das Repetition-Flag in irmp_data.flags 
gesetzt hat. Ist also alles okay.

> Ich wollte auch Dauerdrück aufzeichnen, allerdings stürzt dabei
> das Prog. anscheinend ab. Genauso hängt sich wohl was auf, wenn ich auf
> der Samsung32 dauernd drücke. Ich vermute, da läuft der scan-buffer
> über?

Könnte sein, da muss ich mir die Log-Funktion nochmal näher ansehen. 
Diese hatte Vlad Tepesch für das WordClock-Projekt erstellt und ich habe 
sie kurzerhand "assimiliert" ;-)

> Aber: Samsung wird jetzt gut erkannt, prima!

Freut mich. Ohne Logging stürzt das Programm auch nicht ab, oder?

> Mehr Zeit müsste man haben :)

Wie wahr...

Gruß,

Frank

von Klaus L. (kllei)


Lesenswert?

Ich zitiere mich mal selbst ;-)
>OK, so ein Teil habe ich auch noch aus einem alten Fernseher, aber so
>was gibts wohl nicht mal mehr bei P*llin...

Als universeller Empfänger wäre wohl der U2538B prinzipiell geeignet:
Beitrag "Schaltung mit IR-Empfänger (LED) gesucht"

Mal sehen, wann der verfügbar wird, im Moment hat ihn digikey auch 
nicht.

Klaus

von Hugo P. (portisch)


Lesenswert?

Hi!

Zuerst: super Arbeit hier!

Ich bin ain AVR Anfänger und habe dazu nun etwas Unsicherheit um den 
Code für den Atmeg8 zu verwenden!

1. F_CPU, benutze einen Quarz 12MHz:
1
main.c: #define F_CPU       12000000

2. Timer Register geändert:
1
TIMSK  = 1 << OCIE1A;                                                    // OCIE1A: Interrupt by timer compare (use TIMSK for ATMEGA162)

3. PD3 als Input:
1
/*---------------------------------------------------------------------------------------------------------------------------------------------------
2
 * Change hardware pin here:
3
 *---------------------------------------------------------------------------------------------------------------------------------------------------
4
 */
5
#define IRMP_PORT                               PORTD
6
#define IRMP_DDR                                DDRD
7
#define IRMP_PIN                                PIND
8
#define IRMP_BIT                                3                             // use PD3 as IR input

Habe aber etwas weiter oben im irmp.c das gefunden: static int PINB;
Muss ich denn auch auf PIND ändern?

Danke für Hilfe!

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Hugo Portisch schrieb:

> 1. F_CPU, benutze einen Quarz 12MHz:
>
1
main.c: #define F_CPU       12000000

Wenn Du genau hinschaust, gilt das nur für den Codevision Compiler, Du 
siehst da was von

#ifdef CODEVISION
...
#define F_CPU 8000000
...
#endif

Hier nützt eine Änderung gar nichts, wenn Du den WinAVR (gcc) als 
Compiler nutzt. In diesem Fall musst Du im Projekt unter

    Project -> Configuration Options

den Processor_ und die _Taktrate einstellen.

> 2. Timer Register geändert:

Sieht gut aus.

> 3. PD3 als Input:
>  * Change hardware pin here:

Korrekt.

> Habe aber etwas weiter oben im irmp.c das gefunden: static int PINB;
> Muss ich denn auch auf PIND ändern?

Das ist nicht für Dich relevant, da dieses Statement im Block

#ifdef DEBUG
...
#endif

eingebettet ist. Das ist nur zum Debuggen unter Linux oder Windows.

Gruß,

Frank

von Hugo P. (portisch)


Lesenswert?

Das mit F_CPU habe ich mir schon gedacht. Benutze GCC und habe in den 
Optionen Atmega8+12MHz eingestellt.

Sollte dann also passen, danke!

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Eine neue Version von IRMP ist unter

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

verfügbar.

Änderungen:

1) Neues Protokoll: Apple

2) Bit-Order ist nun dem jeweiligen Protokoll angepasst.

Zu 1)

Das Apple-Protokoll ist bis auf eine Kleinigkeit identisch mit dem 
NEC-Protokoll und wird mit IRMP_SUPPORT_NEC_PROTOCOL == 1 erschlagen. 
Bisher wurde die Apple-FB immer als NEC-Protokoll ausgegeben, was aber 
eigentlich "gelogen" ist. Die Apple-FB hat daher jetzt einen eigenen 
Bezeichner IRMP_APPLE_PROTOCOL erhalten, damit der zukünftige Encoder 
IRSND den Apple-Frame wieder reproduzieren kann.

Zu 2)

Es hat hier schon einige gestört, dass bei Protokollen, welche das LSB 
zuerst ausgeben, die Tasten 1-9 scheinbar willkürliche Muster in 
irmp_data.command haben. Die gesendete Bitreihenfolge wird nun von IRMP 
berücksichtigt, bisher wurde immer mit MSB first gespeichert. Nun haben 
bei vielen FBs die Tasten 1-9 auch eine aufsteigende Reihenfolge in 
irmp_data.command. Dasselbe gilt natürlich auch für die Adresse.

Nachteil: Diejenigen, die Adressen und Kommandos von bestimmten 
Fernbedienungen bisher schon aufgezeichnet, gespeichert und verwendet 
haben, müssen das leider noch mal wiederholen, da nun für die 
LSB-Protokolle (siehe IRMP-Artikel) ganz andere Werte als bisher 
herauskommen. Sorry, aber Klaus Leidinger hat mich mittlerweile davon 
überzeugt, dass diese Lösung die bessere ist ;-)

Gruß,

Frank

von Klaus L. (kllei)


Lesenswert?

Frank M. schrieb:
> Änderungen:
>
> 1) Neues Protokoll: Apple

Für alle CV Nutzer: damit stimmt diese Sequenz im aktuellen Download für 
den CodeVision Teil natürlich nicht mehr. Ich werde das anpassen und 
Frank schicken.

@Frank: Du bist immer für eine Überraschung gut ;-)

Klaus

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Klaus Leidinger schrieb:
> @Frank: Du bist immer für eine Überraschung gut ;-)

Sorry, aber danke für Deine Anpassung in der main-Funktion des 
Codevision-Teils. Beim nächsten mal denke ich dran :-)

Den Download habe ich eben aktualisiert.

Gruß,

Frank

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Eine neue Version von IRMP ist unter

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

verfügbar.

Grund:

Bugfix: Zurücksetzen der Statemachine nach einem unvollständigen 
RC5-Frame oder anderen "Schrott-Daten"

Der Fehler sorgte dafür, dass bei nachfolgenden Frames anderer 
Protokolle das Bit 6 im command prinzipiell immer gesetzt war. Durch 
Plausibilitätskontrollen wurden dann weitere empfangene Nicht-RC5-Frames 
verworfen oder falsch abgebildet - bis zum Reset des AVR oder bis wieder 
ein vollständiger RC5-Frame empfangen wurde.

Vielen Dank an Klaus Leidinger, der diesem Fehler durch unermüdliches 
nächtelanges Suchen auf die Spur kam :-)

Gruß,

Frank

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Hallo,

wie bereits angekündigt, gibt es nun eine Alpha-Version von IRSND.

IRSND ist das Gegenstück zu IRMP: es reproduziert aus den Daten, die mit 
IRMP empfangen wurden, wieder den Original Frame, der dann über eine 
Infrarot-Diode ausgegeben werden kann.

IRSND unterstützt die folgenden Protokolle:

    * SIRCS
    * NEC
    * SAMSUNG
    * SAMSUNG32
    * MATSUSHITA
    * RECS80
    * RC5
    * DENON
    * APPLE

IRSND unterstützt folgende Protokolle (noch) nicht:

    * KASEIKYO
    * RC6


Näheres dazu steht im IRMP-Artikel, nämlich unter

  http://www.mikrocontroller.net/articles/IRMP#IRSND_-_Infrarot-Multiprotokoll-Encoder

Der Download-Link ist dort auch zu finden.

Vielen Dank an Klaus Leidinger, der mich bei der Entwicklung von IRSND 
tatkräftig als Tester unterstützt hat :-)

Gruß,

Frank

von Hugo P. (portisch)


Lesenswert?

Hi,

ich hätte da noch eine Frage zu dem Timer.

Ich habe Irmp mit V-USB kombiniert.

Bei einem PC geht es ohne Probleme, bei einem anderen PC wird der AVR 
nicht als USB-Gerät erkannt.

Durch testen habe ich rausgefunden, wenn ich den Timer-Init raus lasse, 
geht es:
1
int main(void)
2
{
3
uchar   i;
4
5
6
    wdt_enable(WDTO_2S);
7
    /* Even if you don't use the watchdog, turn it off here. On newer devices,
8
     * the status of the watchdog (on/off, period) is PRESERVED OVER RESET!
9
     */
10
    DBG1(0x00, 0, 0);       /* debug output: main starts */
11
    /* RESET status: all port bits are inputs without pull-up.
12
     * That's the way we need D+ and D-. Therefore we don't need any
13
     * additional hardware initialization.
14
     */
15
    odDebugInit();
16
    usbInit();
17
    usbDeviceDisconnect();  /* enforce re-enumeration, do this while interrupts are disabled! */
18
    i = 0;
19
    while(--i){             /* fake USB disconnect for > 250 ms */
20
        wdt_reset();
21
        _delay_ms(1);
22
    }
23
    usbDeviceConnect();
24
25
  //clear irmp_data
26
  irmp_data.protocol = 0;
27
  irmp_data.address = 0;
28
  irmp_data.command = 0;
29
  irmp_data.flags = 0;
30
31
  irmp_init();                                                              // initialize irmp code
32
  //timer_init();                                                             // initialize timer
33
34
    sei();
35
36
    DBG1(0x01, 0, 0);       /* debug output: main loop starts */
37
    for(;;){                /* main event loop */
38
        DBG1(0x02, 0, 0);   /* debug output: main loop iterates */
39
        wdt_reset();
40
        usbPoll();
41
    }
42
    return 0;
43
}

Wie kann ich das Problem umgehen? Danke!

von Michael M. (Gast)


Lesenswert?

vermutlich bekommst du probleme mit dem timing seitens usb, wenn die 
v-usb routinen vom timer interrupt unterbrochen werden.
die v-usb routinen müsstest du also mit cli()...sei() umklammern. ob das 
der funktion guttut, steht auf einem anderen blatt.

von Hugo P. (portisch)


Angehängte Dateien:

Lesenswert?

Schaffe es einfach nicht!

Habe schon vieles Probiert - jedoch kein Erfolg.

Es geht Problemlos bei diesem Board:
http://www.gigabyte.com.tw/Products/Motherboard/Products_Overview.aspx?ProductID=2624

Bei diesem geht es nicht:
http://www.gigabyte.com.tw/Products/Motherboard/Products_Overview.aspx?ProductID=3141

Im Anhang der derzeitige Source.
Atmega8 mit 12MHz Quarz.

von Michael M. (Gast)


Lesenswert?

ja, das wird ein timing-problem sein.
erstell doch einfach einen eigenen thread, das wird sicher noch ne 
längere angelegenheit.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Michael M. schrieb:
> die v-usb routinen müsstest du also mit cli()...sei() umklammern. ob das
> der funktion guttut, steht auf einem anderen blatt.

Vermutlich geht das so nicht, weil die V-USB-Funktionen laut 
http://www.obdev.at/products/vusb/index-de.html einen "edge triggered 
interrupt" benötigen.

Da müsste man schon gezielt den Timer1-Interrupt ein-/ausschalten.

@Hugo: Klappt es denn mit der USB-Erkennung, wenn Du in irmp_ISR() einen 
vorzeitigen return einbaust?

Gruß,

Frank

von Michael M. (Gast)


Lesenswert?

hm, wo steht das denn? ich hab nur das hier gefunden:
> No UART, timer, input capture unit or other special hardware is required

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Michael M. schrieb:
> hm, wo steht das denn? ich hab nur das hier gefunden:
>> No UART, timer, input capture unit or other special hardware is required

Direkt in der Zeile darunter:

"No UART, timer, input capture unit or other special hardware is 
required (except one edge triggered interrupt)."

Gruß,

Frank

von Michael M. (Gast)


Lesenswert?

puh... dann nehm ich mal die tomaten runter ^^
sorry

von Hugo P. (portisch)


Lesenswert?

1
@Hugo: Klappt es denn mit der USB-Erkennung, wenn Du in irmp_ISR() einen
2
vorzeitigen return einbaust?
3
4
Gruß,
5
6
Frank

Ja, wenn ich irmp_ISR(); auskommentiere dann geht es!

Das komische ist halt, dass an einem PC ohne Probleme geht.
An dem PC wo ich den Empfänger eigentlich einsetzen will geht es nicht 
:(

von Hugo P. (portisch)


Lesenswert?

Da ich leider den Beitrag nicht editieren kann:

V-USB benötigt ja die D+ Line auf einen Interrupt Pin. Am besten INT0.
Beim Atmega8 PD2.

Die TSOP1736 habe ich auf PD3 (INT1) gelegt.
Irmp braucht ja keinen Interrupt Pin da es ja mit Polling arbeitet, 
oder?
Vielleicht hilft es, wenn man einen anderen Port als PD3 verwendet?

von Sebastian___ (Gast)


Lesenswert?

Das problem beim V-USB ist, das ein anderer IRQ den externen IRQ für den 
USB um max 20µs verzögern darf. Dh. wenn man andere IRQs mit dem USB 
nutzen will muß man dafür sorgen das der USB IRQ immer möglichst ohne 
latenz abgearbeitet werden kann, sonst passt das timeing für die USB 
frames nicht mehr.
Das Polling vom usb in der Main ist unktitisch. Wichtig ist NUR das der 
externe IRQ für den USB immer sofort bearbeitet werden kann.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Hugo Portisch schrieb:

> Irmp braucht ja keinen Interrupt Pin da es ja mit Polling arbeitet,
> oder?

Richtig.

> Vielleicht hilft es, wenn man einen anderen Port als PD3 verwendet?

Nein, das wird nichts bringen. Aber da es mit dem einen Board geht und 
mit dem anderen nicht, liegt der AVR wohl knapp am Timing vorbei. 
Schalte doch mal in irmp.c diejenigen Protokolle ab, die Du nicht 
brauchst. Vielleicht hilft das schon... obwohl, solange kein IR-Signal 
reinkommt, macht die ISR auch so gut wie gar nichts.

Gruß,

Frank

von Hugo P. (portisch)


Lesenswert?

Man O Man, ich dreh noch durch!

Bei auskommentieren des irmp_ISR(); geht es bei beiden PCs.
Mit der Funktion geht es nur bei einem.

Auch ein "Abspecken" der IR-Funktionen auf NEC, RC5 & RC6 bringt nichts.

Kann man es irgendwie machen, dass der Timer1 erst ~ 2 Sekunden nach dem 
Reset/Boot gestartet wird?

Ich schätze einmal, das wenn nach dem Einstecken (Reset) das USB-Init 
mit dem Host vorbei ist es keine Probleme mehr geben sollte...

Danke!

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Hugo Portisch schrieb:

> Kann man es irgendwie machen, dass der Timer1 erst ~ 2 Sekunden nach dem
> Reset/Boot gestartet wird?

Dafür gibt es mehrere Möglichkeiten, zum Beispiel könntest Du 
timer_init() erst nach 2 Sekunden aufrufen, z.B. so:
1
  _delay_ms (2000);
2
  timer_init ();

> Ich schätze einmal, das wenn nach dem Einstecken (Reset) das USB-Init
> mit dem Host vorbei ist es keine Probleme mehr geben sollte...

Gruß,

Frank

von Hugo P. (portisch)


Angehängte Dateien:

Lesenswert?

Habe es geschafft!

Dem _delay habe ich nicht getraut, da warscheinlich auch das USBPoll 
benötigt wird.

Ich starte nun den Timer0 beim Reset.
Nach 0xFF durchläufen wird Timer0 abgeschaltet und der Timer1 für das IR 
Polling gestartet.

Somit fängt der IR Timer erst ~5s nach dem Reset an.

AVR wird als USB Gerät erkannt und funktioniert einwandfrei!

Ist zwar nicht so schön geht aber nun!

Anbei das neue Projekt!

Danke für Hilfe und für Irmp!

von Hugo P. (portisch)


Lesenswert?

Hi, nochmal ich!

Kann die Beiträge einfach nicht editieren :(

Da es nun am zweiten PC läuft habe ich mir den Empfang der IR Codes 
angesehen.
Es geht sehr träge und es wird nicht jeder Code erkannt.

Beim anderen PC geht es ohne Probleme, schnelle Erkennung und es werden 
auch alle Tasten erkannt.

NEC wird z.B am 2. PC gar nicht erkannt.

Woran kann das jetzt noch liegen, oder wie kann ich dem Problem auf die 
Spur kommen?

von Micha (Gast)


Lesenswert?

Hugo Portisch schrieb:
> Habe es geschafft!
Ich habe mir deinen Quelltext nicht im Detail angesehen: betreibst du 
den AVR als USB-HID, sprich "Tastaturersatz"? Falls ja wofür und 
funktioniert es einwandfrei?

Hugo Portisch schrieb:
> Kann die Beiträge einfach nicht editieren :(
Das geht nur ein paar Minuten (10?) nach dem Verfassen eines Beitrages, 
danach nicht mehr.

von Michael M. (Gast)


Lesenswert?

Micha schrieb:
> Hugo Portisch schrieb:
>> Habe es geschafft!
> Ich habe mir deinen Quelltext nicht im Detail angesehen: betreibst du
> den AVR als USB-HID, sprich "Tastaturersatz"? Falls ja wofür und
HID ist nicht zwingend eine tastatur oder maus.
siehe http://en.wikipedia.org/wiki/USB_human_interface_device_class

> Hugo Portisch schrieb:
>> Kann die Beiträge einfach nicht editieren :(
> Das geht nur ein paar Minuten (10?) nach dem Verfassen eines Beitrages,
> danach nicht mehr.
15 min sind es. und es geht auch dann nicht mehr, wenn jemand nach dem 
zu editierenden betrag etwas geschrieben hat.
dass der link zum editieren auch nach 15min noch angezeigt wird, ist ein 
(schon bekannter) fehler.

sry für den OTp

von Hugo P. (portisch)


Lesenswert?

1
Ich habe mir deinen Quelltext nicht im Detail angesehen: betreibst du
2
den AVR als USB-HID, sprich "Tastaturersatz"? Falls ja wofür und
3
funktioniert es einwandfrei?

Kein "Tastaturersatz"...

Per USB-Polling des AVRs können die Codes gelesen werden (Protokoll, 
Adress, Command & Flags). Er wird als USB-HID betrieben, somit sind 
keine Treiber notwendig.

Bei HID ist ein Feature Transfer von <=8 Bytes recht einfach. Die 
Struckt von Irmp sind ja nur 6Bytes ;).

Was man mit den Daten dann macht ist jedem selber überlassen.
Ich z.B. benütze es als Input-Plugin für DVBViewer.
Der AVR lernt auch den ersten empfangen Befehl. Per Flag kann dann 
dieser Befehl zum schalten eines Optokopplers verwendet werden um die 
Powertaste des PCs zu betätigen (Einschalten des PCs per Fernbedienung).
Werde dann noch eine Beispiel-Host Anwendung bereitstellen.

Man könnte aber auch ein Programm schreiben, dass die Codes in 
Tastendrücke umwandelt. So ist ja die Idee von Irmp.
Jedoch will ich das nicht im AVR machen, sondern auf der Host Seite.
Somit muss ich für neue Befehle den AVR nicht neu programmieren.

Ein kleines Update zu dem USB Problem bei dem einem Mainboard.
Ich glaube fast, dass es am USB von Mainbaord liegt.
Die Codes werden schon richtig vom AVR ausgewertet, jedoch funktioniert 
das Polling über USB nur sehr träge.

Beim anderen PC flutschen die Daten sofort rüber. Steuerung des 
DVBViewer geht Super.

Werde mir einmal eine PCI-USB Karte ausleihen, damit ich den Fehler 
weiter eingrenzen kann.

von Peter K. (peko)


Angehängte Dateien:

Lesenswert?

Hallo Frank,

geniale Sache, dieses IRSND. Habe heute mal damit etwas rumgespielt und 
kann bestätigen, daß SIRCS funktioniert (andere Protos hab ich noch 
nicht getestet). Allerdings ist es ziemlich unempfindlich, kann sein daß 
es an meiner IR-Diode liegt oder aber am Timing. Zu weitergehenden 
Untersuchungen bin ich leider noch nicht gekommen.

Da einige Timerregister insbesondere beim Mega32 anders heißen und auch 
der Output-Pin anders liegt, habe ich mal in die beiden *.c - files ein 
paar "if defined" reingebaut. Es wäre schön, wenn du dies in deine 
sourcen übernehmen könntest, das würde helfen, die Software leicht auf 
einem Mega32 oder Mega644P (mit den beiden hab ich herumgespielt) laufen 
zu lassen. Weitere AVR-Typen könnte man bei Bedarf hinzufügen.
Die modifizierten sourcefiles sind hier angehängt.

-Peter

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Hallo Peter,

Peter K. schrieb:

> Da einige Timerregister insbesondere beim Mega32 anders heißen und auch
> der Output-Pin anders liegt, habe ich mal in die beiden *.c - files ein
> paar "if defined" reingebaut.

Danke für Deine Vorschläge, werde ich so übernehmen.

Gruß,

Frank

von Hugo P. (portisch)


Lesenswert?

Um nicht zu sehr Off-Topic zu werden habe ich einmal einen neuen Thread 
aufgemacht: Beitrag "Irmp + V-USB, geht nicht an jedem USB-Port"

Es geht um Irmp + V-USB, Probleme an verschiedenen USB-Ports.

von Christian F. (bleuicebox)


Lesenswert?

IRMP löft auch auf einen PIC

danke für die Arbeit

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Christian F. schrieb:
> IRMP löft auch auf einen PIC

Super! Kann man Deine Portierung irgendwie in den Source übernehmen? 
Wäre doch eine echte Bereicherung.

Gruß,

Frank

von eku (Gast)


Lesenswert?

Hallo Frank!

irmp_ISR() macht mehrfach IRMP_PIN & (1 << IRMP_BIT) zu 
unterschiedlichen (Lauf-)Zeiten bei immer gleichen irmp_pulse_time. 
Außerdem geht der Code davon aus, dass der IR-Empfänger low-aktiv ist.

Ich würde den Code zum Einlesen aus irmp_ISR() herausziehen und den 
aktuellen Wert per Argument übergeben, z.B.:
1
--- Irmp.org/irmp.c     2010-03-07 11:54:40.000000000 +0100
2
+++ Irmp/irmp.c 2010-03-12 18:06:15.105627851 +0100
3
@@ -668,7 +668,7 @@
4
  *---------------------------------------------------------------------------------------------------------------------------------------------------
5
  */
6
 void
7
-irmp_ISR (void)
8
+irmp_ISR (const uint8_t data)
9
 {
10
     static uint8_t    irmp_start_bit_detected;                                  // flag: start bit detected
11
     static uint8_t    wait_for_space;                                           // flag: wait for data bit space
12
@@ -705,7 +705,7 @@
13
     {                                                                           // yes... wait for application to get data
14
         if (! irmp_start_bit_detected)                                          // start bit detected?
15
         {                                                                       // no...
16
-            if (!(IRMP_PIN & (1 << IRMP_BIT)))                                  // receiving burst?
17
+            if (!data)                                                          // receiving burst?
18
             {                                                                   // yes...
19
                 irmp_pulse_time++;                                              // increment counter
20
             }
21
@@ -734,7 +734,7 @@
22
         {
23
             if (wait_for_start_space)                                           // we have received start bit and are counting the dark...
24
             {
25
-                if (IRMP_PIN & (1 << IRMP_BIT))                                 // still dark?
26
+                if (data)                                                       // still dark?
27
                 {                                                               // yes
28
                     irmp_pause_time++;                                          // increment counter
29
30
@@ -1111,7 +1111,7 @@
31
             {                                                                   // counting the dark....
32
                 uint8_t got_light = FALSE;
33
34
-                if (IRMP_PIN & (1 << IRMP_BIT))                                 // still dark?
35
+                if (data)                                                       // still dark?
36
                 {                                                               // yes...
37
                     if (irmp_bit == complete_len && stop_bit == 1)
38
                     {
39
@@ -1368,7 +1368,7 @@
40
             }
41
             else
42
             {                                                                   // counting the light (pulse)...
43
-                if (!(IRMP_PIN & (1 << IRMP_BIT)))                              // still light?
44
+                if (!data)                                                      // still light?
45
                 {                                                               // yes...
46
                     irmp_pulse_time++;                                          // increment counter
47
                 }
48
diff -rBuw Irmp.org/irmp.h Irmp/irmp.h
49
--- Irmp.org/irmp.h     2010-03-05 11:24:18.000000000 +0100
50
+++ Irmp/irmp.h 2010-03-12 17:40:14.600896408 +0100
51
@@ -194,7 +194,7 @@
52
  *  ISR routine
53
  *  @details  ISR routine, called 10000 times per second
54
  */
55
-extern void                           irmp_ISR (void);
56
+extern void                           irmp_ISR (const uint8_t);
57
58
 #ifdef __cplusplus
59
 }

Der Aufrufer kann dann auch die Phase umkehren, falls der IR-Empfänger 
high-aktiv ist.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

eku schrieb:
> irmp_ISR() macht mehrfach IRMP_PIN & (1 << IRMP_BIT) zu
> unterschiedlichen (Lauf-)Zeiten bei immer gleichen irmp_pulse_time.
> Außerdem geht der Code davon aus, dass der IR-Empfänger low-aktiv ist.

In meinem aktuellen Source ist es mittlerweile ein Makro. Das habe ich 
im Zusammenhang mit Christians PIC-Portiertung gemacht. Ich werde dafür 
sorgen, dass dieses Makro zukünftig nur noch einmal aufgerufen wird, 
nämlich am Anfang von irmp_ISR().

> Der Aufrufer kann dann auch die Phase umkehren, falls der IR-Empfänger
> high-aktiv ist.

Das kann er dann im Makro direkt tun.

Danke für die Anregung,

Frank

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Eine neue Version von IRMP ist unter

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

verfügbar.

Zum einen ist die PIC-Portierung von Christian F. (blueicebox) in den 
Source eingeflossen, zum anderen habe ich die Anregung von eku 
übernommen, den Input-Pin nur noch an einer Stelle und immer zur 
gleichen Zeit abzufragen.

Vielen Dank an Christian für seine Tipps zur PIC-Portierung.

Gruß,

Frank

von Markus B. (mb27)


Lesenswert?

Hallo,

könnte mir jemand einen Tip oder Code geben wie ich die drei Telegramme

1. ID für verwendetes Protokoll
2. Adresse bzw. Herstellercode
3. Kommando

auf meinem LCD ausgebe. Benutze das Programm von Peter Fleury.
So bekomme ich immer eine Fehlermeldung:
1
if (irmp_get_data (&irmp_data))
2
    {
3
    /* clear display and home cursor */
4
        lcd_clrscr();
5
        // ir signal decoded, do something here...
6
7
        // irmp_data.protocol is the protocol, see irmp.h
8
    lcd_puts(irmp_data.protocol);
9
        // irmp_data.address is the address/manufacturer code of ir sender
10
        lcd_puts(irmp_data.address);
11
        // irmp_data.command is the command code
12
        lcd_puts(irmp_data.command);

../../main.c:182: warning: passing argument 1 of 'lcd_puts' makes 
pointer from integer without a cast
muss ich hier itoa anwenden?

Bin Anfänger und sitze schon drei Tage dran und bekomms nicht hin.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Markus B. schrieb:
> ../../main.c:182: warning: passing argument 1 of 'lcd_puts' makes
> pointer from integer without a cast
> muss ich hier itoa anwenden?

lcd_puts möchte einen C-String, Du übergibst aber Zahlen. Das geht 
nicht. Also musst Du vorher die Zahlen in Strings - z.B. mit itoa() - 
umwandeln, z.B. so:
1
#include <stdlib.h>
2
...
3
4
main ()
5
{
6
   char protocol[10];
7
   char address[10];
8
   char command[10];
9
10
...
11
   if (irmp_get_data (&irmp_data))
12
   {
13
        itoa(irmp_data.protocol, protocol, 10);
14
        itoa(irmp_data.address, address, 10);
15
        itoa(irmp_data.command, command, 10);
16
17
        lcd_clrscr();
18
        lcd_puts(protocol);
19
        lcd_puts (" ");
20
        lcd_puts(address);
21
        lcd_puts (" ");
22
        lcd_puts(command);
23
   }

Das dritte Argument gibt die Zahlenbasis an. Eventuell ist es 
sinnvoller, address & command in Hex auszugeben statt dezimal. Dann muss 
das dritte Argument für itoa() 16 sein.

Gruß,

Frank

von Michael M. (Gast)


Lesenswert?

lcd_putS puttet einen string. was es als parameter erwartet ist eine 
adresse (pointer) zum ersten zeichen dieses strings, den es anzeigen 
soll.
was du übergibst, ist eine zahl.

du kannst also entweder deine zahlen zu einem string konvertieren (itoa) 
und dann anzeigen lassen.
oder du schaust mal, ob peter nicht genau für diesen falle eine funktion 
geschrieben hat, die zahlen aus einer variablen anzeigen lässt.

von Markus B. (mb27)


Lesenswert?

Frank fettes Danke für die schnelle Antwort und für IRMP  :-)

von Michael M. (Gast)


Lesenswert?

:*-(

von Chris (Gast)


Lesenswert?

Hallo,

ich habe Probleme mit den Timer-Einstellungen auf einem Atmega8. Timer 1 
ist leider schon durch PWM belegt, so dass ich Timer 2 verwenden muss. 
Ich verwende als F_CPU 8Mhz (interner Takt).

Ich habe mit einer Universalfernbedienung getestet. Manche Protokolle 
kennt er anscheinend, auf andere reagiert er nicht.

Grundsätzlich die Frage: Geht das mit dem 8-Bit Timer überhaupt?

Hier meine Timer-Init mit Prescaler 8:
1
OCR2   =  ((F_CPU/8) / F_INTERRUPTS) - 1; // compare value: 1/10000 of CPU frequency/prescaler  = 99
2
  
3
TCCR2  |= (1 << WGM21); // switch CTC Mode on, 
4
TCCR2  |= (1 << CS20); 
5
TCCR2  |= (1 << CS21); //set prescaler to 8 mit cs20 und cs21
6
  
7
TIMSK  |= (1 << OCIE2); // OCIE1A: Interrupt by timer compare

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Chris schrieb:

> Ich habe mit einer Universalfernbedienung getestet. Manche Protokolle
> kennt er anscheinend, auf andere reagiert er nicht.

Welche Protokolle werden von IRMP erkannt, welche nicht?

> Grundsätzlich die Frage: Geht das mit dem 8-Bit Timer überhaupt?

Ja, solange er hinreichend genau geht.

> Hier meine Timer-Init mit Prescaler 8:
>
1
> OCR2   =  ((F_CPU/8) / F_INTERRUPTS) - 1; // compare value: 1/10000 of
2
> CPU frequency/prescaler  = 99
3
> 
4
> TCCR2  |= (1 << WGM21); // switch CTC Mode on,
5
> TCCR2  |= (1 << CS20);
6
> TCCR2  |= (1 << CS21); //set prescaler to 8 mit cs20 und cs21
7
> 
8
> TIMSK  |= (1 << OCIE2); // OCIE1A: Interrupt by timer compare
9
>

Das sieht eigentlich ganz gut aus...

Gruß,

Frank

von Werner B. (werner-b)


Lesenswert?

Ich musste bei lsb in irsnd.c lange grübeln um herauszufinden was da 
erreicht werden soll (IMHO ist der Name auch irreführend).
Darum habe ich mir auch gleich eine (wenigstens für mich) leichter 
vertändliche Version gebastelt. Die hat auch ein besseres 
Laufzeitverhalten da für jedes Bit nur zwei mal geschoben wird. Die 
Bitschiebe-Orgie entfällt ;-).
1
static uint16_t
2
lsb (uint16_t x, uint8_t len)
3
{
4
#if 0
5
    uint16_t    xx = 0;
6
    uint8_t     i;
7
8
    for (i = 0; i < len; i++)
9
    {
10
        if (x & (1<<i))
11
        {
12
            xx |= (1<<(len - i - 1));
13
        }
14
    }
15
    return xx;
16
#else
17
    uint16_t    xx = 0;
18
19
    while(len)
20
    {
21
        xx <<= 1;
22
        if (x & 1)
23
        {
24
            xx |= 1;
25
        }
26
        x >>= 1;
27
        len--;
28
    }
29
    return xx;
30
#endif
31
}

von Chris (Gast)


Lesenswert?

Ich habe per Interrupt einen Pin "blinken" lassen und die Frequenz 
gemessen: Weit von 10khz entfernt. Durch Probieren kam ich auf OCR2=25.

Verstehe ich nicht. F_CPU stimmt auf jeden Fall, sonst würden andere 
Sachen auch nicht funktionieren.

Damit konnte ich folgende Protokolle empfangen:
Code: 9 Address: 0x00 Command: 0x00
Code: A Address: 0x2D2D Command: 0xA758
Code: 7 Address: 0x05 Command: 0x02
Code: 2 Address: 0xF708 Command: 0x02

Ein Preset auf der Fernbedienung wird nicht erkannt, wahrscheinlich ist 
das ein Exot.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Chris schrieb:
> Ich habe per Interrupt einen Pin "blinken" lassen und die Frequenz
> gemessen: Weit von 10khz entfernt. Durch Probieren kam ich auf OCR2=25.

Dein Denkfehler liegt wohl hier:

  TCCR2  |= (1 << CS20);
  TCCR2  |= (1 << CS21); //set prescaler to 8 mit cs20 und cs21

Damit wird der Prescaler lt. ATMega8-Datenblatt nicht auf 8, sondern auf 
32 gesetzt. Demnach müsste OCR2 dann 24 sein:

OCR2   =  ((F_CPU/32) / F_INTERRUPTS) - 1; // compare value: 1/10000 of

Mit Deinem empirisch ermittelte Wert von 25 lagst Du also schon fast 
richtig ;-)

Um den Prescaler auf 8 zu setzen, müsstest Du lediglich CS21 setzen.

Gruß,

Frank

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Werner B. schrieb:
> Ich musste bei lsb in irsnd.c lange grübeln um herauszufinden was da
> erreicht werden soll (IMHO ist der Name auch irreführend).

Nenne mir bitte einen besser geeigneten Namen, mir ist auch kein 
besserer eingefallen ;-)

> Darum habe ich mir auch gleich eine (wenigstens für mich) leichter
> vertändliche Version gebastelt. Die hat auch ein besseres
> Laufzeitverhalten da für jedes Bit nur zwei mal geschoben wird. Die
> Bitschiebe-Orgie entfällt ;-).

Wow, Deine Version spart wirklich einiges ein!

Vielen Dank, werde ich so übernehmen.

Gruß,

Frank

P.S.
Es gibt noch eine kürzere (und damit auch schnellere) Version:
1
static uint16_t
2
lsb_neu (uint16_t x)
3
{
4
   x = ((x >>  1) & 0x5555) | ((x <<  1) & 0xaaaa);
5
   x = ((x >>  2) & 0x3333) | ((x <<  2) & 0xcccc);
6
   x = ((x >>  4) & 0x0f0f) | ((x <<  4) & 0xf0f0);
7
   x = ((x >>  8) & 0x00ff) | ((x <<  8) & 0xff00);
8
   return x;
9
}

Nur arbeitet hat das Ding einen Nachteil: es arbeitet konstant mit der 
Länge 16 ;-)

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Da ich heute zufällig beim Durchforsten des Sources nach 
Optimierungsmöglichkeiten bemerkt habe, dass die RECS80-Startbit-Timings 
komplett falsch in IRMP definiert waren, habe ich die Timings nicht nur 
angeglichen, sondern auch noch zusätzlich die Erkennung des "RECS80 
Extended-Protokolls" eingebaut, damit ich endlich mal selbst ein paar 
Technisat-FBs von Pollin (für 95 Cent!), die den SAA3008 (und damit das 
RECS80EXT-Protokoll) benutzen, testen kann.

Vorab schon mal eine neue Version von IRMP unter

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

Die Erweiterung auf RECS80EXT kostete nur 50 Bytes im Binary, ist aber 
selbstverständlich - wie alle anderen Protokolle auch - abstellbar.

Und noch eine Neuigkeit:

Das kompilierte Binary von IRMP ist - trotz der Erweiterung auf 
RECS80EXT - durch diverse Code-Optimierungen, die ich in den letzten 
Tagen vorgenommen habe, nun ca. 350 Bytes kleiner geworden :-)

Gruß,

Frank

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

IRSND ist nun auch angepasst, Änderungen:

 - Korrektur der RECS80-Startbit-Timings
 - Neues Protokoll: RECS80 Extended
 - Diverse Codeoptimierungen, u.a. die von Werner, siehe oben.

Download:

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

Gruß,

Frank

von Werner B. (werner-b)


Lesenswert?

Frank M. schrieb:
> Nenne mir bitte einen besser geeigneten Namen, mir ist auch kein
> besserer eingefallen ;-)

z.B. bitsreverse

Edit:
  ich sehe gerade deinen Coding Style. Also besser bits_reverse.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Werner B. schrieb:

> z.B. bitsreverse

Sehr gut. Habe ich gerade übernommen. Ebenso noch eine Korrektur für 
TCCR2,
Dank an Werner. Download ist aktualisiert.

> Edit:
>   ich sehe gerade deinen Coding Style. Also besser bits_reverse.

Nö, die erste Version finde ich besser. Man kanns mit den Underscores 
auch übertreiben ;-)

Gruß,

Frank

von DiPi (Gast)


Lesenswert?

In der Anwendung beim CRC wird diese Prozedur "reflect" genannt...

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

DiPi schrieb:
> In der Anwendung beim CRC wird diese Prozedur "reflect" genannt...

mirror() bzw. mirror_bits() habe ich auch schon mal gesehen, 
bitsreverse() finde ich aber am aussagekräftigsten.

Gruß,

Frank

von Peter K. (peko)


Angehängte Dateien:

Lesenswert?

Hallo Frank,

habe heute die neuen IRMP für neue scans genutzt. Anbei 2 scans, einmal 
von meiner Kathrein UFS912 FB - ein RC6 Code. Da stimmt wohl irgendetwas 
noch nicht... Ich habe 2 Tasten jeweils 3mal einzeln gedrückt. Das 
Einzige, was sich im Command ändert, ist das LSB. Dies ist jedoch das 
Togglebit wie es mir scheint. Mehr ändert sich am Command nicht, egal 
welche Taste gedrückt wird. Auch bei RC5 Commands habe ich den Effekt 
beobachtet. Leider kann ich keinen RC5 scan machen weil der Controller 
abstürzt.

Der zweite scan in der zip ist ein bisher von IRMP nicht erkanntes 
Protokoll von einer Nubert (Lautsprecherhersteller) Subwoofer-FB.

Soviel für heute...

-Peter

von Peter K. (peko)


Lesenswert?

Hallo Frank,

hier noch ein Nachtrag zum Thema IRMP und IRSND: Habe einige Tests mit 
Kaseikyo (Panasonic Blue Ray) gemacht.
Die Commands werden weitestgehend stabil decodiert und angezeigt (Ob sie 
jedoch stimmen?). Wenn ich mit einer solchen IRMP_DATA Struktur den Code 
wieder mit IRSND aussende, passiert am Player nichs.
IRSND läuft dagegen gut und schaltet mein Samsung TV mit Samsung32 
Protocol ein. Auch SIRCS und NEC werden von IRSND zuverlässig erzeugt.

Gerne würde ich IRMP / IRSND mit RC6 nutzen, jedoch gibts da ja noch 
einige Problemchen - siehe meinen vorherigen post.

-Peter

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Hi Peter,

Peter K. schrieb:

> Die Commands werden weitestgehend stabil decodiert und angezeigt (Ob sie
> jedoch stimmen?). Wenn ich mit einer solchen IRMP_DATA Struktur den Code
> wieder mit IRSND aussende, passiert am Player nichs.

Siehe IRMP-Artikel:

http://www.mikrocontroller.net/articles/IRMP#IRSND_-_Infrarot-Multiprotokoll-Encoder

Zitat:

| IRSND unterstützt folgende Protokolle (noch) nicht:
|
|     * KASEIKYO
|     * RC6

Um aus den 32-bit-IRMP-Daten wieder das 48-Bit-Kaseikyo-Protokoll zu 
reproduzieren, ist noch ein wenig Gehirnschmalz bzw. Verständnis 
meinerseits bzgl. Kaseikyo notwendig. IRMP filtert aus dem 
Kaseikyo-Protokoll nur das raus, was zum Decodieren interessant ist, 
Parity-Bits und andere Infos gehen dabei verloren. Beim Encodieren 
braucht man sie dann aber wieder. Da muss ich noch ein wenig forschen, 
um die Parity-Bits und den Rest im IRSND wieder zu rekonstruieren: 32 
Bit IRMP -> 48 Bit Kaseikyo.

> IRSND läuft dagegen gut und schaltet mein Samsung TV mit Samsung32
> Protocol ein. Auch SIRCS und NEC werden von IRSND zuverlässig erzeugt.

Freut mich :-)

> Gerne würde ich IRMP / IRSND mit RC6 nutzen, jedoch gibts da ja noch
> einige Problemchen - siehe meinen vorherigen post.

RC6 ist ein komplexes System von variablen Modi: je nach RC6-Modus sind 
die RC6-Daten komplett anderes strukturiert. Im Moment ist RC6 ein 
erhebliches Problem, da IRMP im Moment nur den sogenannten Mode0 
unterstützt. Die Kathrein-FB benutzt aber einen anderen Mode - mit 
erheblich mehr Bits im Telegramm. Da sind dann nur spärliches Infos zu 
finden. Ich bin aber weiterhin dran.

Danke für die Scans, werde ich mir anschauen.

Gruß,

Frank

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Peter K. schrieb:

> Der zweite scan in der zip ist ein bisher von IRMP nicht erkanntes
> Protokoll von einer Nubert (Lautsprecherhersteller) Subwoofer-FB.

Ich habe mir das Protokoll angeschaut, das ist was ganz Neues, aber auch 
ziemlich triviales. Ich habe es mal eingebaut in den IRMP, verbrät 
zusätzliche 50 Bytes an Code, ist natürlich abschaltbar.

Wie die anderen Protokolle auch ist das "NUBERT-Protokoll" (so habe ich 
das mal getauft, solange es da keine Vergleichsvariante gibt) im 
IRMP-Artikel dokumentiert.

Es hat 1 Start-Bit + 10 Daten-Bits + 1 Stop-Bit und wird immer 2x 
gesendet.
Die Timings habe ich empirisch aus dem Scan ermittelt.

Die automatische Wiederholung wird von IRMP unterdrückt, eine 
Wiederholung durch langen Tastendruck wird von IRMP im Flags-Byte 
gekennzeichnet - so wie sich das gehört ;-)

Wie sich diese 10 Bit Daten in Adresse + Kommando aufteilen, weiß ich 
nicht, da ich keine Dokumentation dazu gefunden habe. Hat Deine 
Nubert-FB noch mehr Tasten? Deine 2 Tasten zur Analyse, wie sich Adresse 
und Kommando aufteilen, sind da als Vergleich ziemlich mager ;-)

Ich habe daher alle 10 Daten-Bits in das Kommando gelegt, d.h. als 
Adresse gibt IRMP immer 0 zurück.

Achja: Deine beiden Volume-Tasten senden das Kommando 0x0082 und 0x0084.

Neue Version von IRMP unter

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

Gruß,

Frank

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Nun gibt es auch eine neue Version von IRSND.

Download:

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

Änderungen:

* Neues Protokoll: Nubert

  Damit kann Peter nun seine Subwoofer auch über IRSND voll
  aufdrehen ;-)

* Korrektur der Pausen zwischen Wiederholungen von Frames

Gruß,

Frank

von Klaus L. (kllei)


Angehängte Dateien:

Lesenswert?

Hallo,

damit zur Software auch ein Stück Hardware zum ausprobieren kommt, habe 
ich heute mein kleines IR-LCD Projekt online gestellt.

Die Hardware basiert auf der IRMP und IRSND Software von Frank mit ein 
paar kleinen Erweiterungen. Die Software wird auch noch ein bischen 
wachsen ;-)

Schaut es Euch mal an, Feedback auch gerne hier im Forum, so lange es 
Frank nicht zu lästig wird ;-) sonst eröffne ich einen neuen Beitrag.

Viele Grüße und viel Spaß,
Klaus

Das komplette Projekt findet Ihr hier:
http://www.mikrocontroller-projekte.de -> IR-LCD

von Werner B. (werner-b)


Lesenswert?

@Klaus Leidinger,

da IR Sendedioden (zumindest meine hier) im Impulsbetrieb bis zu 3A für 
10uS verkraften, kannst du R2 auf fast 1 Ohm verkleiner (Ich verwende 
1,2 Ohm).
Das erhöht die Reichweite beträchtlich. R3 begrenzt den Strom falls sich 
der AVR mal "aufhängt" (Wobei ich nicht verstehe warum die Sendediode 
und der TSOP beide hinter R3 liegen. Lieber den TSOP mit 100 Ohm an Vcc 
und die Sendediode mit ca. 40 Ohm direkt an Vcc und noch einen weiteren 
C spendieren).

Gruß
Werner

von Klaus L. (kllei)


Lesenswert?

Werner B. schrieb:
> (Wobei ich nicht verstehe warum die Sendediode
> und der TSOP beide hinter R3 liegen. Lieber den TSOP mit 100 Ohm an Vcc
> und die Sendediode mit ca. 40 Ohm direkt an Vcc und noch einen weiteren
> C spendieren)

Senden und Empfangen wird ja nicht gleichzeitig benutzt, und die 
Sendediode soll ja aus dem Elko gespeist werden. Außerdem war es schon 
recht eng ;-)

Je nach Verwendungszweck ist ja eine unterschiedliche Bestückung 
machbar. Für eine Entwicklungsplattform war mir der Weg mit lieber "zu 
großen" Widerständen sicherer.

Reichweitentests habe ich noch nicht gemacht, ich werde aber gerne Deine 
/ Eure Erfahrungen dokumentieren.

Danke für Dein Feedback.

Viele Grüße,
Klaus

von eku (Gast)


Lesenswert?

Hallo Frank!

Eine Frage zum Source von IRMP:
1
#define DEBUG_PUTCHAR(a)                        { if (! silent) { putchar (a);              } }
2
#define DEBUG_PRINTF1(a)                        { if (! silent) { printf (a);               } }
3
#define DEBUG_PRINTF2(a,b)                      { if (! silent) { printf (a,b);             } }
4
#define DEBUG_PRINTF3(a,b,c)                    { if (! silent) { printf (a,b,c);           } }
5
#define DEBUG_PRINTF4(a,b,c,d)                  { if (! silent) { printf (a,b,c,d);         } }
6
#define DEBUG_PRINTF5(a,b,c,d,e)                { if (! silent) { printf (a,b,c,d,e);       } }
7
#define DEBUG_PRINTF6(a,b,c,d,e,f)              { if (! silent) { printf (a,b,c,d,e,f);     } }
8
#define DEBUG_PRINTF7(a,b,c,d,e,f,g)            { if (! silent) { printf (a,b,c,d,e,f,g);   } }

Warum verwendest Du keine Variadic Macros 
(http://en.wikipedia.org/wiki/Variadic_macro) in der Form:
1
#define DEBUG_PRINTF(...)   {if (!silent) printf(__VA__ARGS__);}

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Hi eku,

eku schrieb:

> Warum verwendest Du keine Variadic Macros

Weil ich ein alter Knochen bin, der C 1984 unter UNIX kennengelernt 
habe. Die Variadic Macros gibt es erst seit 1999. Ich hatte es zwar mal 
am Rande mitbekommen, dann aber wieder verdrängt, da ich es damals nicht 
brauchte.

Ich werde es bei Gelegenheit umstellen, vielen Dank für den Hinweis.

Gruß,

Frank

von eku (Gast)


Lesenswert?

Hallo Frank!

Zwei meiner Fernbedienungen können nicht dekodiert werden:

 Nokia Dbox2
 Siemens Gigaset M740AV

Reicht für die Analyse wenn ich die UART-Ausgaben mit IRMP_LOGGING=1 
aufzeichne?

von Micha (Gast)


Lesenswert?

Hallo Frank,

was hältst du davon sämtliche Konfigurationsmöglichkeiten in eine 
separate Header-Datei (z.B. irmpconfig.h) auszulagern? Ich finde das 
momentan etwas unübersichtlich: jede Menge defines und diese dann auch 
noch im .h und im .c verteilt, so dass man (zumindest ich) nicht so 
recht weiß an welcher Schraube man drehen kann und was man besser so 
belassen sollte.

Ansonsten finde ich dieses Projekt großartig und möchte mich vielmals 
dafür bedanken.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

eku schrieb:
> Reicht für die Analyse wenn ich die UART-Ausgaben mit IRMP_LOGGING=1
> aufzeichne?

Ja, müsste reichen, am besten so viele Tasten wie möglich und dann in 
der Form:

# Taste 1
000011110000.......
# Taste 2
000011110000.......

Also pro Taste ein Kommentar, eingeleitet mit '#' und alle Tasten einer 
FB in derselben Datei.

Gruß,

Frank

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Micha schrieb:

> was hältst du davon sämtliche Konfigurationsmöglichkeiten in eine
> separate Header-Datei (z.B. irmpconfig.h) auszulagern?

Ja, ist wohl sinnvoll. Mache ich.

Gruß,

Frank

von Christoph (Gast)


Lesenswert?

Wäre es nicht eine gute Idee den Sourcecode in das neue svn 
einzustellenß
Dann müsste man nicht immer den aktuelllen Sourcecode herunterladen.

von Peter K. (peko)


Angehängte Dateien:

Lesenswert?

Hallo Frank,

ich habe gestern mal bezüglich RC6 etwas im IRMP geforscht und komme mit 
dem Verhalten von IRMP irgendwie nicht klar. Dazu anbei die kleine 
Log-Datei. Ich habe mal jedes Bit, das irmp_store_bit bekommt, in ein 
Array schreiben lassen und schaue es mir nach empfangenen Code an.

Beim RC5 sieht das richtig gut aus, alle Bits kommen so wie sie sollen 
und man kann am Binärcode Adresse und Command gut erkennen.

Beim RC6 trudeln allerdings irgendwelche Bits herein, die ich mir 
überhaupt nicht erklären kann. Vor allem das Togglebit, das ja auch 
relativ weit vorne im RC6-Frame kommt erscheint, (wenn es das überhaupt 
ist...) erst an 21. Stelle.

Könntest Du da bitte etwas Aufklärungsarbeit leisten? Danke... ;)

-Peter

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Peter K. schrieb:

> ich habe gestern mal bezüglich RC6 etwas im IRMP geforscht und komme mit
> dem Verhalten von IRMP irgendwie nicht klar.

Ich bin selbst nicht mit der Umsetzung des RC6-Protokolls im IRMP 
zufrieden. Es funktioniert zwar mit der RC6-Fernbedienung von Klaus 
Leidinger, welche im sog. "Mode 0" läuft, aber nicht mit RC6-FBs, die 
einen anderen Mode benutzen.

Der "Mode 0" ist hier dokumentiert:

http://www.sbprojects.com/knowledge/ir/rc6.htm

Dabei ist da was ganz fieses drin, nämlich:

"Finally the header is terminated by the trailer bit TR. Please note 
that the bit time of this symbol is twice as long as normal bits! This 
bit also serves as the traditional toggle bit, which will be inverted 
whenever a key is released. This allows the receiver to distinguish 
between a new key or a repeated key. "

Das Toggle-Bit ist also doppelt so breit wie die anderen Bits. Im 
Zusammenhang mit der Bi-Phase-Codierung haben dann die Pulse und die 
Pausen ganz blöde Längen, nämlich - je nach Nachbar-Bits(!) - die ein- 
oder 1,5-fache Länge. Das bringt den Code von IRMP arg ins Schleudern. 
Ich hatte das damals anhand der Scans von Klaus dann so "hingefrickelt", 
aber mir war klar, dass dieser Code nicht allgemeingültig funktionieren 
könne.

Mangels anderer RC6-Scans habe ich da aber nichts mehr weiter dran 
getan, hat mich schon so genug Nerven gekostet ;-)

Nun habe ich von Dir die Kathrein-Scans erhalten und musste einsehen, 
dass meine Art, wie ich Bi-Phase-Signale decodiere, an seine Grenzen 
stößt - was auch wieder mit der doppelten Länge des Toggle-Bits zu tun 
hat. Dieses folgt nämlich den sog. drei Mode-Bits. Und die haben bei Dir 
andere Werte - eben nicht "Mode 0". Und damit funktioniert die Art und 
Weise, wie ich die doppelte Länge des Toggle-Bits "behandle", nicht 
mehr.

Ich werde also den RC6-Part im IRMP neu schreiben müssen, so hat das 
keinen Zweck... einfach zu viel Code-Gebastel und Rumprobiererei.

> Beim RC5 sieht das richtig gut aus, alle Bits kommen so wie sie sollen
> und man kann am Binärcode Adresse und Command gut erkennen.

Ja, bei gleichen Signal-Längen (RC5) funktioniert der Code, bei 
wechselnden Bit-Breiten (RC6) macht er die Grätsche.

> Beim RC6 trudeln allerdings irgendwelche Bits herein, die ich mir
> überhaupt nicht erklären kann. Vor allem das Togglebit, das ja auch
> relativ weit vorne im RC6-Frame kommt erscheint, (wenn es das überhaupt
> ist...) erst an 21. Stelle.

Das sollte eigentlich überhaupt nicht auftauchen, da IRMP die 
Toggle-Bits (RC5 und RC6) ignoriert.

> Könntest Du da bitte etwas Aufklärungsarbeit leisten? Danke... ;)

Ich bin gerade an einem anderen Algorithmus für RC6 dran, habe Dich und 
Deine Kathrein-FB nicht vergessen. Allerdings wolltest Du mir noch Scans 
von einer weiteren Kathrein-FB zur Verfügung stellen, wenn ich das 
richtig in Erinnerung habe.

Achja: dass IRMP "zwischendurch" bei Deiner RC6-FB meint, da plötzlich 
RC5-Code zu erkennen, ist leicht erklärt: RC6 benutzt exakt die Hälfte 
der Bit-Breite von RC5, nämlich 444µs. Bei einer Bi-Phase-Codierung 
addieren sich dann oft die Pulse von 2 Nachbar-Bits auf die doppelte 
Breite - und damit exakt auf die Puls-Breite eines RC5-Bits von 889µs.

Gruß,

Frank

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Christoph schrieb:
> Wäre es nicht eine gute Idee den Sourcecode in das neue svn
> einzustellenß

Danke für die Anregung, ich habe das direkt beantragt und auch schon 
einen Platz für IRMP auf dem SVN-Server von mikrocontroller.net von 
Andreas erhalten. Ich schiebe den Source demnächst ins SVN und melde 
mich dann nochmal dazu.

Trotzdem wird man die Sources auch weiterhin "klassisch" über den 
Download-Link herunterladen können.

> Dann müsste man nicht immer den aktuelllen Sourcecode herunterladen.

Das müsstest Du bei SVN ja auch ;-)

Die Verwendung eines SVN bietet eigentlich genau dann Vorteile, wenn 
mehrere Leute an einem Source arbeiten. Dafür ist es eigentlich gedacht 
- nicht zum Publizieren von Code. Das ist nur ein Seiteneffekt von SVN.

Gruß,

Frank

von eku (Gast)


Lesenswert?

Hallo Frank!


> Zwei meiner Fernbedienungen können nicht dekodiert werden:
>
>  Nokia Dbox2
>
>  Siemens Gigaset M740AV

LIRCD kennt die Siemens Gigaset Fernbedienung als

  bits           8
  eps            30
  aeps          100

  one             0     0
  zero            0     0
  pre_data_bits   24
  pre_data       0x10
  gap          210000
  min_repeat      2
  toggle_bit      25

von Peter K. (peko)


Lesenswert?

Hallo Frank,
danke für die prompte Antwort. Ja, die zweite Kathrein-FB... Die ist 
etwas ein Sorgenkind, wahrscheinlich ist es kein RC6 Code. Ich kann mit 
der neuesten Version von IRMP nichts scannen. IRMP in einer 
Test-Compilierung reagiert gar nicht darauf. Allerdings - und das ist 
merkwürdig, habe ich die gleiche IRMP-Version in meinem eigentlichen 
Projekt zusammen mit Softwaremodulen des U.Radig-Webservers compiliert. 
Dort zeigt IRMP an, dass diese FB RC5 machen würde. Allerdings reportet 
IRMP jedes Mal andere Cmd / Addr, so dass ich annehme, das da irgendwas 
in der Decodierung nicht stimmt. Leider ist bei diesem Projekt der RAM 
schon so voll, dass ich kein IRMP Logging mehr machen kann. Also komme 
ich momentan beim Scannen dieser 2. FB nicht so richtig voran. Mal 
schaun was ich da noch machen kann.

Hier nun auch noch ein allgemeiner Vorschlag von mir: Eine schöne 
Versionsnumerierung von IRMP / IRSND wäre gut, dann könnte man sich 
immer genau auf bestimmte Releases beziehen.

-Peter

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Hallo Peter,

Peter K. schrieb:

> Hier nun auch noch ein allgemeiner Vorschlag von mir: Eine schöne
> Versionsnumerierung von IRMP / IRSND wäre gut, dann könnte man sich
> immer genau auf bestimmte Releases beziehen.

Ja, hatte ich auch schon mal dran gedacht. Die nächste Version wird dann 
einfach mal 1.0 heißen ;-)

Gruß,

Frank

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Hi eku,

eku schrieb:

>> Zwei meiner Fernbedienungen können nicht dekodiert werden:
>>
>>  Nokia Dbox2
>>
>>  Siemens Gigaset M740AV
>
> LIRCD kennt die Siemens Gigaset Fernbedienung als
> [...]

Ich hatte Dir darauf schon mal geantwortet:

  Beitrag "Re: IRMP - Infrared Multi Protocol Decoder"

Schick mir einfach Scans und ich versuche, diese FBs einzubauen - 
entweder durch Vergrößerung der Toleranzen des jeweiligen (bekannten) 
Protokolls oder durch neue Parametrisierung.

Gruß,

Frank

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

IRMP ist jetzt auch im SVN auf mikrocontroller.net:

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

Ich werde den Link auch noch in den IRMP-Artikel einfügen, den 
Download-Link im Artikel wird es aber auch weiterhin geben.

Gruß,

Frank

von Andreas S. (andreas) (Admin) Benutzerseite


Lesenswert?

Du kannst auch direkt auf einen aktuellen Snapshot als .tar.gz 
verlinken, dann musst du nicht von Hand ein Paket erstellen:
http://www.mikrocontroller.net/svnbrowser/irmp/?view=tar

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Andreas Schwarz schrieb:
> Du kannst auch direkt auf einen aktuellen Snapshot als .tar.gz
> verlinken, dann musst du nicht von Hand ein Paket erstellen:
> http://www.mikrocontroller.net/svnbrowser/irmp/?view=tar

Danke für den Tipp, hatte ich schon gesehen bzw. kenne ich schon aus 
anderen Open-Source-Projekten. Das tar.gz-Format ist in der Windows-Welt 
leider nicht so geläufig, mein Filzip kann damit jedenfalls nichts 
anfangen - erst wenn ich die Datei in .tgz umbenenne.

Wäre es auch möglich, den Tarball als "Zipball" zur Verfügung zu 
stellen? Dann wäre es ideal.

Gruß,

Frank

von M. K. (kichi)


Lesenswert?

Frank M. schrieb:
> Das tar.gz-Format ist in der Windows-Welt
> leider nicht so geläufig, mein Filzip kann damit jedenfalls nichts
> anfangen - erst wenn ich die Datei in .tgz umbenenne.

Mit 7-Zip funktioniert es auch unter Windows ohne Probleme.

von Vlad T. (vlad_tepesch)


Lesenswert?

Das größere Problem an dem SVN repository ist, dass auf Top-Level-Ebene 
keine Ordner für Branches oder Tags angelegt wurden.

von Simon K. (simon) Benutzerseite


Lesenswert?

Stimmt. Und leider sind alle Dateien lieblos in ein Verzeichnis geworfen 
worden. Die Binaries und der Code für den PC könnte man doch in ein 
Unterverzeichnis packen. Genauso mit dem AVR-spezifischen Code.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Simon K. schrieb:
> Stimmt. Und leider sind alle Dateien lieblos in ein Verzeichnis geworfen
> worden. Die Binaries und der Code für den PC könnte man doch in ein
> Unterverzeichnis packen. Genauso mit dem AVR-spezifischen Code.

Es gibt keinen "Code für den PC" und auch keinen "AVR-spezifischen 
Code", der Source ist für beide derselbe. Das einzige, was hier 
PC-spezifisch ist, sind die beiden Executables irmp.exe bzw. irsnd.exe. 
Dafür bedarf es meiner Meinung nach keines Unterverzeichnisses.

Aber wie immer bei Simon K.: Er liest nur oberflächlich, stromert in 
vielen Threads herum, lässt seinen Mecker los und verschwindet dann 
wieder für Wochen auf Nimmerwiedersehen. Sowas kann ich nicht ernst 
nehmen.

Gruß,

Frank

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Hi Vlad,

Vlad Tepesch schrieb:
> Das größere Problem an dem SVN repository ist, dass auf Top-Level-Ebene
> keine Ordner für Branches oder Tags angelegt wurden.

Hätte ich diese anlegen können/müssen? Das Repository hat Andreas 
Schwarz auf meine Bitte hin angelegt. Ich musste dann nur noch die 
Dateien reinschieben. Muss Andreas als SVN-Verwalter da was tun oder 
kann ich das auch als reiner "SVN-Anwender"?

Gruß,

Frank

von Vlad T. (vlad_tepesch)


Lesenswert?

Um nicht noch mehr OT zu produzieren antworte ich dir privat

von Jens C. (Gast)


Lesenswert?

Hallo zusammen,

erstmal höchstes Lob für dieses Projekt an Frank M. und seine Helfer!

Ich teste derzeit ein wenig mit dem IRMP und mir stellt sich folgende 
Frage:

Durch das IRMP_FLAG_REPETITION kann ich auswerten, ob eine Taste kurz 
oder lange gedrückt wurde. Aber wie erfahre ich wann sie losgelassen 
wird/wurde?

> Beispiel:
>
>    if (irmp_data.flags & IRMP_FLAG_REPETITION)
>    {
>      finger_blau (irmp_data.command);
>    }
>    else
>    {
>      einzeln (irmp_data.command);
>    }

> Dies kann zum Beispiel dafür genutzt werden, um die Tasten 0-9 zu
> "entprellen", indem man Kommandos mit gesetztem Bit IRMP_FLAG_REPETITION
> ignoriert. Bei dem Drücken auf die Tasten VOLUME+ oder VOLUME- kann die
> wiederholte Auswertung ein und desselben Kommandos aber durchaus
> gewünscht sein - zum Beispiel, um LEDs zu faden.

Wenn ich mit meiner FB im NEC Protokoll die "Plus" oder "Minus" Taste 
länger gedrückt halte, bekomme ich zwar bei der zweiten Auswertung das 
Repetition Flag gesetzt, aber weiter bekomme ich keine Auswertungen, 
d.h.ich bekomme nicht mit, wann die Taste losgelassen wurde :-)

Oder habe ich da einen falschen Denkansatz...

Gruß Jens

von Di P. (drpepper) Benutzerseite


Lesenswert?

naja, wenn das signal nicht mehr kommt, wurde die taste losgelassen. Die 
FBs senden ja keine extra-sequenz, wenn man eine taste loslässt.
Sie senden nur solange die taste gedrückt ist immer wieder in festen 
zeitabständen eine bestimmte bitfolge, die IRMP immer wieder aufs neue 
interpretiert.

von Jens C. (Gast)


Lesenswert?

@ Di Pi

Guten Morgen,

die Taste wurde nicht losgelassen, die Sequenzen werden noch empfangen 
(mit Oszi beobachtet) aber irmp_get_data(...) liefert mir nach dem 
IRMP_FLAG_REPETITION gesetzt wird FALSE zurück.

Also, das/mein Problem muss woanders liegen

Gruß Jens

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Hallo Jens,

Jens C. schrieb:

> die Taste wurde nicht losgelassen, die Sequenzen werden noch empfangen
> (mit Oszi beobachtet) aber irmp_get_data(...) liefert mir nach dem
> IRMP_FLAG_REPETITION gesetzt wird FALSE zurück.

Ich habe das mal gerade emuliert mit dem IRMP-Executable und 
IR-Data/nec-repetition.txt. Da gibt es tatsächlich ein Problem mit den 
Wiederholungen von Repetition-Frames. Diese werden zwar erkannt, aber 
bis auf den ersten Repetition-Frame werden alle weitere verworfen.

Ich schaue gleich mal nach dem Grund und melde mich dann nochmal.

Gruß,

Frank

P.S.
Ich hatte Dein Schreiben auch erstmal so verstanden wie Di Pi...

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Das Problem mit den Wiederholungen von NEC-Repetition-Frames konnte ich 
lösen. Daher gibt es eine neue Version zum Download:

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

Änderungen:
  - Bugfix beim Erkennen von mehrfachen NEC-Repetition-Frames
  - Konfiguration in irmpconfig.h ausgelagert, siehe Doku im
    IRMP-Artikel
  - Einführung einer Programmversion in README.txt: Version 1.0

von Jens C. (Gast)


Lesenswert?

Hallo Frank,

herzlichen Dank für´s Update/BugFix.
Jetzt funktioniert´s problemlos...

Schönen Tag noch
Gruß Jens

von Simon K. (simon) Benutzerseite


Lesenswert?

Frank M. schrieb:
> Simon K. schrieb:
>> Stimmt. Und leider sind alle Dateien lieblos in ein Verzeichnis geworfen
>> worden. Die Binaries und der Code für den PC könnte man doch in ein
>> Unterverzeichnis packen. Genauso mit dem AVR-spezifischen Code.
>
> Es gibt keinen "Code für den PC" und auch keinen "AVR-spezifischen
> Code", der Source ist für beide derselbe. Das einzige, was hier
> PC-spezifisch ist, sind die beiden Executables irmp.exe bzw. irsnd.exe.

Ach so. Aber die Source Files kann man doch von den Executables 
separieren.

> Aber wie immer bei Simon K.: Er liest nur oberflächlich, stromert in
> vielen Threads herum, lässt seinen Mecker los und verschwindet dann
> wieder für Wochen auf Nimmerwiedersehen. Sowas kann ich nicht ernst
> nehmen.

Was lässt dich das annehmen? Soll ich mich dafür entschuldigen, dass ich 
nicht den ganzen Tag im Forum bin und alle Threads lese und beantworte?
Außerdem: Wenn man schon ein Projekt ins Forum stellt, dann sollte man 
sich auch der Kritik annehmen können. Ansonsten könntest du deinen Kram 
nämlich auch für dich behalten, wenn du auf sowas allergisch reagierst.
Ansonsten finde ich die Bemerkung ziemlich unangebracht und macht auf 
mich einen ziemlich eingebildeten Eindruck.

von ... .. (docean) Benutzerseite


Lesenswert?

1
#include "irmp.c"

gefunden in main.c im Codevison Teil.

Warum das ?

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

... ... schrieb:
>
1
> #include "irmp.c"
2
>
>
> gefunden in main.c im Codevison Teil.
>
> Warum das ?

Ich kenne CV nicht, das hat Klaus Leidinger so angepasst, vermutlich um 
die Sources alle ins main zu integrieren, damit man sie dann alle durch 
einmaliges Compilieren des main-Sources mitzuübersetzen kann. Ob es eine 
andere Möglichkeit gibt (Erstellen eines Makefiles etc), um die einzeln 
zu übersetzenden Module zusammenzulinken, entzieht sich meiner Kenntnis.

Wenn Du es besser weisst, wäre ich für Verbesserungsvorschläge dankbar.

Gruß,

Frank

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Simon K. schrieb:
> Frank M. schrieb:
>> Simon K. schrieb:
>>> Stimmt. Und leider sind alle Dateien lieblos in ein Verzeichnis geworfen
>>> worden. Die Binaries und der Code für den PC könnte man doch in ein
>>> Unterverzeichnis packen. Genauso mit dem AVR-spezifischen Code.
>>
>> Es gibt keinen "Code für den PC" und auch keinen "AVR-spezifischen
>> Code", der Source ist für beide derselbe. Das einzige, was hier
>> PC-spezifisch ist, sind die beiden Executables irmp.exe bzw. irsnd.exe.
>
> Ach so. Aber die Source Files kann man doch von den Executables
> separieren.

Schauen wir mal in die Liste der Dateien im SVN:

IR-Data/
README.txt
irmp.aps
irmp.c
irmp.exe
irmp.h
irmpconfig.h
irsnd.aps
irsnd.c
irsnd.exe
irsnd.h
irsndmain.c
main.c

Es sind also gerade mal 10 Dateien (und ein Ordner) im SVN-Repository, 
die übrigens im dazugehörenden Artikel 
http://www.mikrocontroller.net/articles/IRMP ausführlichst dokumentiert 
sind. Gestern waren es übrigens sogar noch lediglich 9 Dateien.

Was ist daran "lieblos in ein Verzeichnis geworfen"? Du hast vermutlich 
nur die Ignore-List unter 
http://www.mikrocontroller.net/svnbrowser/irmp/ gesehen und hast daraus 
dann vorschnell geschlossen, dass da "Code für den PC" extra drin ist. 
Die Dateien der Ignore-List sind ja gar nicht im SVN enthalten - ganz im 
Gegenteil: sie sind ausgeschlossen. Das meinte ich mit "oberflächlich 
lesen".

Und die beiden EXE-Dateien sind mit voller Absicht im Hauptverzeichnis, 
um auf die dazugehörenden Scan-Dateien unter IR-Data einfach zugreifen 
zu können - wie es auch im IRMP-Artikel dokumentiert ist. Lägen sie in 
einem weiteren Unterverzeichnis, dann wäre der Zugriff auf den Ordner 
IR-Data ein wenig komplizierter und für den Anwender unverständlicher - 
Stichwort: "../IR-Data".

>> Aber wie immer bei Simon K.: Er liest nur oberflächlich, stromert in
>> vielen Threads herum, lässt seinen Mecker los und verschwindet dann
>> wieder für Wochen auf Nimmerwiedersehen. Sowas kann ich nicht ernst
>> nehmen.
>
> Was lässt dich das annehmen?

Weil es mir schon mal sauer aufgestoßen ist, nämlich im 
WordClock-Thread:

http://www.mikrocontroller.net/topic/156661#1482557

Zitat:

| Nehmt es mir nicht übel, aber im Moment kommt mir der Thread ein wenig
| "Amateurhaft" vor. Nicht, dass ich es spontan besser könnte, aber solche
| "Dann sammeln wir mal, was drauf kommt"-Projekte enden nicht selten im
| Desaster.

Mittlerweile wurden 320 Platinen der "amateuerhaften" 
WordClock-Schaltung sammelbestellt und auch verteilt! Desweiteren sind 
180 dazugehörende Frontplatten produziert worden. Die "amateurhafte" 
Schaltung funktioniert nicht nur reibungslos, macht Farbe mittels 
HUE-Fading, sondern sie ist auch für Anfänger absolut nachbausicher.

Auf Deine oberlehrerhaften Töne bzgl. der Behandlung der ISP will ich 
erst gar nicht eingehen. Merkst Du eigentlich gar nicht mehr, wie Du die 
Leute von oben herab behandelst?

> Soll ich mich dafür entschuldigen, dass ich
> nicht den ganzen Tag im Forum bin und alle Threads lese und beantworte?

Nein, mich stört das 
Einmal-Drüberfliegen-und-dann-Senf-dazugeben-Gehabe. Erinnert mich an 
das Markieren-Gehabe von Katzen.

> Außerdem: Wenn man schon ein Projekt ins Forum stellt, dann sollte man
> sich auch der Kritik annehmen können.

Du nennst das "Kritik". Ich nicht.

> Ansonsten könntest du deinen Kram
> nämlich auch für dich behalten, wenn du auf sowas allergisch reagierst.

Wenn Du Dir diesen Thread (oder auch den WordClock-Thread) mal 
genauestens durchlesen würdest, wirst Du feststellen, dass ich auf 
angebrachte Kritik immer eingegangen bin. Deine Kritik ist aber 
einfach nur von oben herablassend, deshalb schreibst Du ja jetzt hier 
auch wieder mal "deinen Kram". Diese Formulierung spricht Bände.

> Ansonsten finde ich die Bemerkung ziemlich unangebracht und macht auf
> mich einen ziemlich eingebildeten Eindruck.

Glashaus, Steine.

Gruß,

Frank

von Klaus L. (kllei)


Lesenswert?

Frank M. schrieb:
>>> #include "irmp.c"
>> >
>> gefunden in main.c im Codevison Teil.
>>
>> Warum das ?
>
> Ich kenne CV nicht, das hat Klaus Leidinger so angepasst, vermutlich um
> die Sources alle ins main zu integrieren, damit man sie dann alle durch
> einmaliges Compilieren des main-Sources mitzuübersetzen kann. Ob es eine

Ja, genau das ist der Grund.
Alle die sich mit CV auskennen, wissen natürlich das das auch im Setup 
eingestellt werden kann... und können es problemlos ändern. So brauche 
ich das Projektfile nicht dazupacken.

Viele Grüße,
Klaus

von Simon K. (simon) Benutzerseite


Lesenswert?

Frank M. schrieb:
> Es sind also gerade mal 10 Dateien (und ein Ordner) im SVN-Repository,

Du bist echt nicht kritikfähig. Beruhig dich, lass es halt so, aber 
unterlasse solche dämlichen Bemerkungen, dass ich nicht ernst zu nehmen 
sei.
EDIT: Der einzige der hier Leute von oben herab behandelt bist du, wenn 
überhaupt.

> Was ist daran "lieblos in ein Verzeichnis geworfen"? Du hast vermutlich
> nur die Ignore-List unter
> http://www.mikrocontroller.net/svnbrowser/irmp/ gesehen und hast daraus
> dann vorschnell geschlossen, dass da "Code für den PC" extra drin ist.
> Die Dateien der Ignore-List sind ja gar nicht im SVN enthalten - ganz im
> Gegenteil: sie sind ausgeschlossen. Das meinte ich mit "oberflächlich
> lesen".

Nö habe ich nicht.

> Und die beiden EXE-Dateien sind mit voller Absicht im Hauptverzeichnis,
> um auf die dazugehörenden Scan-Dateien unter IR-Data einfach zugreifen
> zu können - wie es auch im IRMP-Artikel dokumentiert ist. Lägen sie in
> einem weiteren Unterverzeichnis, dann wäre der Zugriff auf den Ordner
> IR-Data ein wenig komplizierter und für den Anwender unverständlicher -
> Stichwort: "../IR-Data".

Ist doch wunderbar, wie gesagt, dann lass es halt so. Es ist ja dein 
Projekt.

>>> Aber wie immer bei Simon K.: Er liest nur oberflächlich, stromert in
>>> vielen Threads herum, lässt seinen Mecker los und verschwindet dann
>>> wieder für Wochen auf Nimmerwiedersehen. Sowas kann ich nicht ernst
>>> nehmen.
>>
>> Was lässt dich das annehmen?
>
> Weil es mir schon mal sauer aufgestoßen ist, nämlich im
> WordClock-Thread:
>
> http://www.mikrocontroller.net/topic/156661#1482557
>
> Zitat:
>
> | Nehmt es mir nicht übel, aber im Moment kommt mir der Thread ein wenig
> | "Amateurhaft" vor. Nicht, dass ich es spontan besser könnte, aber solche
> | "Dann sammeln wir mal, was drauf kommt"-Projekte enden nicht selten im
> | Desaster.

Ganz toll, da kann selbst ich mich nicht mehr dran erinnern.

> Mittlerweile wurden 320 Platinen der "amateuerhaften"
> WordClock-Schaltung sammelbestellt und auch verteilt! Desweiteren sind
> 180 dazugehörende Frontplatten produziert worden. Die "amateurhafte"
> Schaltung funktioniert nicht nur reibungslos, macht Farbe mittels
> HUE-Fading, sondern sie ist auch für Anfänger absolut nachbausicher.

Schön, habe ich mich halt geirrt. Irren ist menschlich. Zu dem Zeitpunkt 
wo ich das gepostet hat, war das auch (von mir) so noch nicht abzusehen.
Oder willst du mir jetzt vorhalten, dass ich mich geirrt habe? Ich habe 
nämlich kein Problem damit.

Außerdem: Wo denn sonst noch? Liest du alle Threads in denen ich poste?

> Auf Deine oberlehrerhaften Töne bzgl. der Behandlung der ISP will ich
> erst gar nicht eingehen. Merkst Du eigentlich gar nicht mehr, wie Du die
> Leute von oben herab behandelst?

Haha, ist klar! Kritikfähigkeit, wo bist du? Oberlehrerhaft? Ich denke 
wir missverstehen uns.

>> Soll ich mich dafür entschuldigen, dass ich
>> nicht den ganzen Tag im Forum bin und alle Threads lese und beantworte?
>
> Nein, mich stört das
> Einmal-Drüberfliegen-und-dann-Senf-dazugeben-Gehabe. Erinnert mich an
> das Markieren-Gehabe von Katzen.

Und mich stört das: Du urteilst über Sachen die du nicht weißt. Ich habe 
ein paar Wochen lang den Thread verfolgt, bis es mir zu viele Posts 
wurden pro Tag.

>> Ansonsten finde ich die Bemerkung ziemlich unangebracht und macht auf
>> mich einen ziemlich eingebildeten Eindruck.
>
> Glashaus, Steine.

Ja, oder so ähnlich.
Der schlauere gibt auch nach. In dem Sinne.

von Vlad T. (vlad_tepesch)


Lesenswert?

Och mensch Frank,
füttere solche Trolle doch nicht auch noch.
Die werden noch übermütiger, wohlgenährter und am ende vielleicht auch 
noch geschlechtsreif.

                            _________________________
                   /|  /|  |                          |
                   ||__||  |       Please don't       |
                  /   O O\__           feed           |
                 /          \       the trolls        |
                /      \     \                        |
               /   _    \     \ ----------------------
              /    |\____\     \     ||
             /     | | | |\____/     ||
            /       \|_|_|/   |    __||
               \            |____| ||
          /   |   | /|        |      --|
          |   |   |//         |____  --|
   * _    |  |_|_|_|          |     \-/
*-- _--\ _ \     //           |
  /  _     \\ _ //   |        /
*  /   \_ /- | -     |       |
  *      _ c_c_c_C/ \C_c_c_c____________

von Hugo P. (portisch)


Lesenswert?

Hi,

jetzt muss ich wegen der Logging Funtkion einmal nachfragen:
1
                if (s_ctr > c_endBits)
2
                {                                                       // if stop condition (200 sequenced ones) meets, output on uart
3
                    uint16_t i;
4
5
                    for (i = 0; i < c_startcycles; ++i)
6
                    {
7
                        irmp_uart_putc ('0');                                   // the ignored starting zeros
8
                    }

Also werden immer 2 '0' ausgegeben? Denn c_startcycles = 2 ist fix 
defined!?
1
#define c_startcycles                     2                         // min count of zeros before start of logging

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Hugo Portisch schrieb:
> jetzt muss ich wegen der Logging Funtkion einmal nachfragen:
> Also werden immer 2 '0' ausgegeben? Denn c_startcycles = 2 ist fix
> defined!?

Ja, momentan sind es zwei. Früher waren es mal 4, aber dann lief der 
Scanner bei sehr kurzen Impulsen erst gar nicht los. Daher hab ich das 
auf 2 geändert. Davon solltest Du aber nicht ausgehen, dass das so 
bleibt. Vielmehr solltest Du für das Logging über USB einfach die Zahl 
c_startcycles übertragen und nicht das c_startcycles x Nullen. Der PC 
kann dann aus der Zahl 2 (oder 4 oder wasweiss ich) einfach zwei 0en 
machen.

Gruß,

Frank

von Frank L. (florenzen)


Lesenswert?

Frank M. schrieb:
> Das Problem mit den Wiederholungen von NEC-Repetition-Frames konnte ich
> lösen.
[...]

Auch von mir ein Dankeschön, auch wenn's erst spät kommt. Ich bin zur 
Zeit "etwas" überlastet und erst heute zum ausprobieren gekommen.

Gruß
f

von Florian (Gast)


Lesenswert?

Hallo Frank,

das Projekt ist echt supper Großes lob!
Eine frage hätte ich allerdings.
Ist es theroretisch auch möglich die IR-Signale einer
Bang & Olufsen FB zu erkennen?
Problem könnte sein das die Trägerfrequenz bei 455Khz liegt,
und ich nix brauchbares zum Protokoll gefunden habe.
(Kann mann da evtl die eingangsschaltung anpassen oder
geht das mit dem aufbau)

Gruß

von Vlad T. (vlad_tepesch)


Lesenswert?

Die Trägerfrequenz ist ja egal, solange du den passenden Empfänger dafür 
hast. Die Frage ist halt, wie die Daten darauf kodiert sind.

von Frank L. (florenzen)


Lesenswert?

Morgen oder übermorgen werde ich eine B&O FB aufzeichnen und die Daten 
an Frank schicken.

Gruß
f

von Florian (Gast)


Lesenswert?

Da bin ich mal gespannt...
Hatte noch vergessen zu erwähnen das ich im Forum
ein Projekt von Rene
(http://www.gutwenger.com/ -> Projekt Beo2pc) gefunden habe
Da stört halt das Beolink "Auge",welches er als
empfänger nutzt, für 70,- =)

von Klaus L. (kllei)


Lesenswert?

Frank Lorenzen schrieb:
> Morgen oder übermorgen werde ich eine B&O FB aufzeichnen und die Daten
> an Frank schicken.

Hi Frank,

welchen Empfänger zum demodulieren benutzt Du für die B&O Signale? Die 
IR sendet ja mit 455KHz. Hast Du den von B&O oder einen TSOP7000 
aufgetrieben? (wo?)

Danke für eine Info,
Klaus

von Frank L. (florenzen)


Lesenswert?

Ich habe einen TSOP7000 den ich vor einiger Zeit mal bei Farnell 
bestellt hatte. Wie ich gerade sehe ist der aber bei Farnell nicht mehr 
erhältlich weil abgekündigt.

TME hat ihn noch im Programm aber z.Z. 0 Stück auf Lager, vielleicht 
fragst du bei denen mal an ob sie erwarten nochmal welche zu bekommen?
Bei TME nicht von den Preisen verwirren lassen! Die muß man erst von 
Zloty auf Euro umstellen ;-)

HtH.

Danke Klaus. Ohne deine Nachfrage wüsste ich nicht das der TSOP7000 
abgekündigt ist

Gruß
f

von Micha (Gast)


Lesenswert?

Es gibt hier http://www.vishay.com/ir-receiver-modules/agc-list ein 
Hilfstool zur Auswahl, aber ich bin etwas verunsichert. Ich würde gerne 
möglichst viele Protokolle empfangen können, daher sollte es ein 
AGC1-Receiver werden. Auf der anderen Seite ist dieser am 
empfindlichsten ggü. Störungen - stellt dies für IRMP ein Problem dar?

Der Empfänger läuft als IR-Tastatur von ione und ich habe (noch) keine 
Ahnung welches Protokoll das ist. Ein TSOP17xx kommt nicht in Frage, da 
ich nur 3,3V zur Verfügung habe.

von Abdul K. (ehydra) Benutzerseite


Lesenswert?

455KHz ist eine gängige Frequenz für ZF-Verstärker im HF-Bereich. Im 
Prinzip kann man also alles aus diesem Bereich übernehmen. Eine 
Fotodiode mit TCA440 beispielsweise.

von Micha (Gast)


Lesenswert?

Ich weiß leider nicht einmal die Frequenz. Ich habe beim Hersteller aber 
eben wegen des Protokolls angefragt - mal sehen was die antworten. 
Vielleicht ist es ja irgendein bereits unterstütztes Standardprotokoll.

von Frank L. (florenzen)


Lesenswert?

Zum Thema B&O Fernbedienungen habe ich gestern von einem Bekannten recht 
interessante Informationen bekommen:

Das B&O Fernbedienungs-System wurde wohl bisher von Loewe hergestellt. 
Da Loewe aber mittlerweile zu großen Teilen von Sharp aufgekauft wurde 
und Sharp an der Produktion von Baugruppen für B&O wohl wenig Interesse 
zeigt wird es in Zukunft wohl ein neues FB-System von B&O geben.

Man munkelt die Fernbedienung soll der Harmony sehr ähnlich sehen ;-)
Ob dieses System dann aber noch 455kHz IR unterstützt?

Gruß
f

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Frank Lorenzen hat mir die B&O-Daten geschickt, ein Scan hat aber erst 
mit einer Interrupt-Frequenz von 15kHz funktioniert, da die Pulsdauern 
extrem kurz sind und die Scan-Routine erst bei einer Mindestlänge 
startet.

Interessantes Protokoll, was da benutzt wird. Die Pulsdauern sind immer 
gleich, im Durchschnitt lediglich 210 usec, das spart Strom. Die Pausen 
bestimmen die Wertigkeit der Bits - wie bei den meisten anderen 
Protokollen auch.

Der Aufbau ist:

4 Startbits + 18 Datenbits.

1. Startbit: Pause  3000 usec, entspricht einer 0
2. Startbit: Pause  3000 usec, entspricht einer 0
3. Startbit: Pause 15000 usec, das eigentliche Startbit
4. Startbit: Pause  3000 usec, entspricht einer 0

Die Werte der 18 Datenbits selbst werden über drei statt zwei 
verschiedenen Pausenzeiten gebildet, das macht das ganze so besonders:

Pause 3000 usec: 0
Pause 9000 usec: 1
Pause 6000 usec: Wiederholung des letzten Bits

Mit dieser Regel werden aus den Tasten "0" bis "9" die numerischen Werte 
0 bis 9, das passt also ganz gut. Eine Adresse scheint die FB nicht 
auszusenden, die ersten drei Datenbits sind immer 0, so passen die 18 
Bits glücklicherweise gut in die 16 Code-Bits von IRMP.

War nicht ganz einfach, das Ding zu knacken - wegen der dritten 
Pausenzeit von 6000 usec, die ich erstmal verstehen musste. Morgen baue 
ich den Algorithmus in den IRMP ein, vervollständige die Protokoll-Doku 
im IRMP-Artikel und stelle eine neue Version zum Download zur Verfügung.

Gruß,

Frank

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Version 1.1 von IRMP ist verfügbar:

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

Änderungen:
  - Neues Protokoll: BANG_OLUFSEN (B&O)

@Frank Lorentzen: Würde mich über Feedback freuen, ob es klappt. Bitte 
einmal für 10kHz und einmal für 15kHz testen, da ich selbst nur mit der 
Scan-Datei testen konnte. Danke Dir noch einmal für die Scan-Datei, 
diese ist nun auch im Verzeichnis IR-Data abgelegt, einmal als 10kHz- 
und einmal als 15kHz-Verion.

Gruß,

Frank

von Micha (Gast)


Lesenswert?

@ Frank M.
Würde es sich bzgl. deiner Änderung von eben 
http://www.mikrocontroller.net/wikisoftware/index.php?title=IRMP&diff=46141&oldid=prev 
nicht anbieten ein enum zu verwenden, oder gibt es bestimmte Gründe 
warum du das nicht machst?

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Micha schrieb:
> Würde es sich bzgl. deiner Änderung von eben [...] nicht anbieten ein enum
> zu verwenden, oder gibt es bestimmte Gründe warum du das nicht machst?

Natürlich kann ich auch ein enum nehmen. So habe ich halt die Zahlen 
konkret vor mir und muss nicht immer mit dem Finger abzählen, was denn 
nun die IRMP-Ausgabe "protocol = 14" konkret bedeutet ;-)

Okay, ich stelle das beim nächsten Update um.

Gruß,

Frank

von Micha (Gast)


Lesenswert?

Frank M. schrieb:
> was denn
> nun die IRMP-Ausgabe "protocol = 14" konkret bedeutet

Du kannst ja auch dort den (?) enum nehmen... Also z.B.
"protocol = IRMP_BANG_OLUFSEN_PROTOCOL"

Siehe: 
http://openbook.galileocomputing.de/c_von_a_bis_z/015_c_strukturen_010.htm

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Micha schrieb:

> Du kannst ja auch dort den (?) enum nehmen... Also z.B.
> "protocol = IRMP_BANG_OLUFSEN_PROTOCOL"

Ja, das ist mir schon klar, dass ich das kann. Mir ging es darum, dass 
jeder - egal ob er den Wert auf einem LCD, auf dem UART oder auf einer 
numerischen 7-Segment-Anzeige ausgibt, sofort sehen kann, was denn die 
"14" bedeutet.

> Siehe:
> http://openbook.galileocomputing.de/c_von_a_bis_z/015_c_strukturen_010.htm

Mir sind enums nach mittlerweile 25 Jahren C-Programmierng wohlbekant, 
aber danke für den schönen Link ;-)

Gruß,

Frank

von Micha (Gast)


Lesenswert?

Nachteilig ist allerdings der erhöhte Speicherbedarf, da enums 16bit 
haben (können?)...

von Micha (Gast)


Lesenswert?

Frank M. schrieb:
> Mir ging es darum, dass
> jeder - egal ob er den Wert auf einem LCD, auf dem UART oder auf einer
> numerischen 7-Segment-Anzeige ausgibt, sofort sehen kann, was denn die
> "14" bedeutet.

Verstehe. Damit hast du natürlich recht. Das war nur ein Vorschlag und 
deswegen stellte ich oben die Frage nach den Gründen...

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Micha schrieb:
> Nachteilig ist allerdings der erhöhte Speicherbedarf, da enums 16bit
> haben (können?)...

enums werden immer auf den kleinst-möglichen Typ abgebildet, der möglich 
ist.

Beispiel A:
1
enum zahl { NU_LL, EINS, ZWEI, DREI, VIER};
2
3
uint8_t
4
funktion (enum zahl xx)
5
{
6
  xx >>= 4;
7
  return xx;
8
}

Dann steht in der lss-Datei:
1
00000046 <funktion>:
2
uint8_t funktion (enum zahl xx)
3
{
4
  xx >>= 4;
5
  return xx;
6
}
7
  46:  82 95         swap  r24
8
  48:  8f 70         andi  r24, 0x0F  ; 15
9
  4a:  08 95         ret

Die lss-Datei ist dann identisch beim Code von:
1
uint8_t funktion (uint8_t xx)
2
{
3
  xx >>= 4;
4
  return xx;
5
}

Die Variable xx ist also in beiden Fällen 8 Bit breit.

Beispiel B:
1
enum zahl { NU_LL = -2, EINS, ZWEI, DREI, VIER};
2
3
uint8_t
4
funktion (enum zahl xx)
5
{
6
  xx >>= 4;
7
  return xx;
8
}

Jetzt braucht die Beispiel-Funktion wesentlich mehr Speicherplatz:
1
00000046 <funktion>:
2
uint8_t
3
funktion (enum zahl xx)
4
{
5
  xx >>= 4;
6
  return xx;
7
}
8
  46:  85 95         asr  r24
9
  48:  85 95         asr  r24
10
  4a:  85 95         asr  r24
11
  4c:  85 95         asr  r24
12
  4e:  08 95         ret

EDIT:

Hier wird 4x mittels asr geschoben, weil nun int8_t statt uint8_t 
verwendet wird.

Beispiel C:
1
enum zahl { NU_LL = 300, EINS, ZWEI, DREI, VIER};
2
3
uint8_t
4
funktion (enum zahl xx)
5
{
6
  46:  24 e0         ldi  r18, 0x04  ; 4
7
  48:  96 95         lsr  r25
8
  4a:  87 95         ror  r24
9
  4c:  2a 95         dec  r18
10
  4e:  e1 f7         brne  .-8        ; 0x48 <funktion+0x2>
11
  xx >>= 4;
12
  return xx;
13
}
14
  50:  08 95         ret

Hier wird dann tatsächlich eine 16-Bit-Operation verwendet, weil der 
Wertebereich von 0-255 überschritten wurde.

Ergo: Wenn man den Wertebereich von 0 bis 255 nicht überschreitet, ist 
alles in Butter. Trotzdem lasse ich das so, wie es ist - aus obigen 
Gründen.

Gruß,

Frank

von Frank L. (florenzen)


Lesenswert?

Frank M. schrieb:
[...]
> Änderungen:
>   - Neues Protokoll: BANG_OLUFSEN (B&O)
>
> @Frank Lorentzen: Würde mich über Feedback freuen, ob es klappt. Bitte
> einmal für 10kHz und einmal für 15kHz testen, da ich selbst nur mit der
> Scan-Datei testen konnte.

Das ging aber schnell! Ich teste selbstverständlich - leider nicht mehr 
heute sondern erst morgen, mein Testaufbau hat aus unerfindlichen 
Gründen den Geist aufgegeben.

Ich habe noch eine zweite B&O Fernbedienung gefunden, sieht von Design 
auch wie eine Beolink 1000 aus hat aber weniger und anders beschriftete 
Tasten ("Video Terminal Bang & Olufsen" steht drauf). Die Teste ich 
morgen gleich mal mit.


Ich bin außerdem noch auf ein Problem gestossen: SIRCS scheint nur für 
die ersten ein, zwei Frames zu funktionieren obschon die FB dauerhaft 
ein Signal aussendet. Ich habe aber noch nicht geschaut woran das liegen 
könnte.


Gruß,

f

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Frank Lorenzen schrieb:

> Ich bin außerdem noch auf ein Problem gestossen: SIRCS scheint nur für
> die ersten ein, zwei Frames zu funktionieren obschon die FB dauerhaft
> ein Signal aussendet. Ich habe aber noch nicht geschaut woran das liegen
> könnte.

Die kannst Du ja dann bei der Gelegenheit mal direkt scannen und mir die 
Datei zuschicken.

Gruß,

Frank

von Frank L. (florenzen)


Lesenswert?

[...]
>> @Frank Lorentzen: Würde mich über Feedback freuen, ob es klappt. Bitte
>> einmal für 10kHz und einmal für 15kHz testen, da ich selbst nur mit der
>> Scan-Datei testen konnte.
[...]

Funktioniert wunderbar sowohl mit 10 als auch mit 15kHz.
Danke dir.

Sorry daß ich so Wortkarg bin, aber ich bin heute wirklich hundemüde.
Gruß,
f

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Frank Lorenzen schrieb:

> Funktioniert wunderbar sowohl mit 10 als auch mit 15kHz.

Freut mich.

> Sorry daß ich so Wortkarg bin, aber ich bin heute wirklich hundemüde.

Danke für den Test - auch wenn ich Dir nicht den Schlaf rauben wollte 
;-)

Gruß,

Frank

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Analog zum IRMP ist nun das Bang&Olufsen-Protokoll auch im IRSND 
integriert.

Download:

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

Viel Spaß,

Frank

von J. K. (kum)


Angehängte Dateien:

Lesenswert?

Hallo Zusammen,

habe einige Probleme IRMP+IRSND für einen IR-Tranciever gemeinsam zum 
Laufen zu bewegen.

AVR-GCC, Atmega8, lfuse0xe2, hfuse0xd9, Kompilleren klappt, Flashen 
auch, irsndmain.c wird nicht mitkompilliert.

Mangels MAX232 und LCD wollte ich einfach eine Led toggeln, damit ich 
erkennen kann, ob definierter Tastendruck erkannt wird. Das habe ich 
ohne Erfolg mit TSOP7000 (B&O) und TSOP1738 (Apple) probiert. Output 
TSOP hängt an Pin9. Der TSOP1738 könnte auch ein TSOP1736 sein. Kam aus 
der Bastelkiste und ich kann mich nicht mehr genau erinnern, welchen ich 
damals bestellt hatte.

In der Steckbrett-Schaltung ist zusätzlich ein BC548 mit Fotodiode oder 
einfache Led an Pin17 untergebracht. Ein irmp_send_data lässt die 
normale Led zumindest wie ein IR-Code blinken, aber mit einer Fotodiode 
reagiert kein getestetes Gerät.

Jetzt ein anderer Test: Direktes Durchschleifen des IR-Signals auf eine 
normale Led, die dann in der Theorie genauso blinken sollte wie der 
empfangene Code. TSOP7000 keine Reaktion. Beim  TSOP1738 reagiert die 
Led ab und zu mal auf einen Tastendruck - die Led blinkt aber nur sehr 
kurz auf und das sieht keinesfalls wie ein IR-Code-Blinken aus. Auf eine 
RC5-FB reagiert er gar nicht.

Entweder liegt ein einem fehlerhaften zusammenfügen der Sourcen von IRMP 
und IRSND und der Anpassungen an den Atmega8 oder an der Schaltung? Oder 
beides ;-)

Habe den Quell-Code mal angehängt. Wäre für einen Hinweis dankbar.

Gruß, Kum

von J. K. (kum)


Lesenswert?

Hallo noch mal,

also ich vermute ein Timing-Problem. Beim Empfang funktioniert es schon 
nicht richtig und ab und zu denkt irmp es hätte was dekodiert und 
schickt dieses verkrüppelte Paket an irsnd und daher blinkt es mal kurz 
auf. Lasse ich ein definiertes Paket direkt von irsnd abarbeiten, dann 
erscheint es wie IR-Code-Blinken, aber wahrscheinlich zu langsam bzw. 
irgendwie fehlerhaft. Komme einfach nicht dahinter...

Viele Grüße, Kum

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

J. Kum schrieb:

> AVR-GCC, Atmega8, lfuse0xe2, hfuse0xd9

Habe die Werte gerade mal in den Fuse-Calculator

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

eingegeben.

2 MHz ist ein bisschen zu wenig, oder?

Gruß,

Frank

von Frank L. (florenzen)


Lesenswert?

Nicht nur das. Zu allem Übel ist im Makefile 8MHz angegeben.
Das kann nicht funktionieren.
Fuse doch bitte mal auf h=0xD9 l=0xE4

Gruß,
f

von J. K. (kum)


Lesenswert?

Lieber Frank, Lieber Frank,

wie peinlich. Den Kalkulator von Mark (<-- auch ein ganz, ganz netter 
Kerl) habe ich benutzt und war mir da auch ganz sicher. Oje, oje, ist 
das peinlich ... vielen, vielen Dank für den Hinweis. Neue Fuses: die 
Schaltung und das noch viel tollere Stück Software rennt wie der Teufel!

Dann kann ich jetzt weiter damit rumspielen ... ich freu mich.

Viele Grüße, Kum

von Klaus L. (kllei)


Lesenswert?

Hallo Frank L. und B&O Anwender,

Frank Lorenzen schrieb:
> Ich habe einen TSOP7000 den ich vor einiger Zeit mal bei Farnell
> bestellt hatte. Wie ich gerade sehe ist der aber bei Farnell nicht mehr
> erhältlich weil abgekündigt.
>
> TME hat ihn noch im Programm aber z.Z. 0 Stück auf Lager, vielleicht
> ...
> Danke Klaus. Ohne deine Nachfrage wüsste ich nicht das der TSOP7000
> abgekündigt ist
>

Ich hab den TSOP7000 gerade von Darisus http://www.darisus.de erhalten, 
dort gibt es auch den TSOP1156 und der Shop ist auch sonst bestens 
sortiert (nicht nur) im Bereich IR-Empfänger.

Ich hoffe das war keine unzulässige Werbung...

Viele Grüße,
Klaus

von siegmar (Gast)


Lesenswert?

Klaus Leidinger schrieb:
> Ich hab den TSOP7000 gerade von Darisus http://www.darisus.de erhalten,
> dort gibt es auch den TSOP1156 und der Shop ist auch sonst bestens
> sortiert (nicht nur) im Bereich IR-Empfänger.
>
> Ich hoffe das war keine unzulässige Werbung...


Gerade diese Tips, bezüglich Lieferquellen, finde ich besonders wertvoll 
!!

Noch einen schönen Abend
Gruß
Siegmar

von J. K. (kum)


Lesenswert?

Hallo Zusammen,

stehe bzgl. IRSND und der Unterstützung für Apple auf dem Schlauch. Im 
Artikel ist das Protokoll als "supported" beschrieben, aber kann im Code 
kein

#define IRSND_SUPPORT_APPLE_PROTOCOL

finden. Auch kein umswitchen von NEC zu Apple analog zu IRMP. Dort wird 
zunächst NEC geprüft, und dann auf Apple geswitched, weil Protokolle 
sehr ähnlich. Bei IRSND müsste es doch eine ähnliche Vorgehensweise 
geben, oder nicht? Wenn Apple --> switch zu NEC. Diesen Part kann ich 
aber nirgends finden.

Vielen Dank, Kum

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

J. Kum schrieb:

> stehe bzgl. IRSND und der Unterstützung für Apple auf dem Schlauch. Im
> Artikel ist das Protokoll als "supported" beschrieben, aber kann im Code
> kein
>
> #define IRSND_SUPPORT_APPLE_PROTOCOL
>
> finden.

Tut mir leid, das hat historische Gründe:

Das Apple-Protokoll lief früher im IRMP als NEC-Protokoll mit einem 
bestimmten Bit-Muster in den Datenbits des Frames (keine Invertierung, 
sondern festes Bitmuster in den Datenbits 24 bis 31). Später habe ich 
das Apple-Protokoll im IRMP separiert, das aber im IRSND einfach 
vergessen. Ich werde das im IRSND nachholen.

Gruß,

Frank

von J. K. (kum)


Lesenswert?

Frank M. schrieb:

> Später habe ich
> das Apple-Protokoll im IRMP separiert, das aber im IRSND einfach
> vergessen. Ich werde das im IRSND nachholen.

Mach dir keinen Stress ;-) Hatte versucht mich selbst darum zu bemühen 
es in irsnd.c einzupflegen, aber das ging vollends in die Hose.

Vielen lieben Dank für dein Engagement.

Viele Grüße, Kum

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

J. Kum schrieb:

> Mach dir keinen Stress ;-) Hatte versucht mich selbst darum zu bemühen
> es in irsnd.c einzupflegen, aber das ging vollends in die Hose.

Hier ist der Fix, den kannst Du in irsnd selbst einbauen:

Wie bisher:
1
        case IRMP_NEC_PROTOCOL:
2
        {
3
           ...
4
        }

Darunter einfügen (also noch vor dem #endif:
1
        case IRMP_APPLE_PROTOCOL:
2
        {
3
            irsnd_protocol = IRMP_NEC_PROTOCOL; // APPLE protocol is NEC with fix bitmask instead of inverted command
4
5
            address = bitsrevervse (irmp_data_p->address, NEC_ADDRESS_LEN);
6
            command = bitsrevervse (irmp_data_p->command, NEC_COMMAND_LEN);
7
8
            irsnd_buffer[0] = (address & 0xFF00) >> 8;                                                          // AAAAAAAA
9
            irsnd_buffer[1] = (address & 0x00FF);                                                               // AAAAAAAA
10
            irsnd_buffer[2] = (command & 0xFF00) >> 8;                                                          // CCCCCCCC
11
            irsnd_buffer[3] = 0x8B;                                                                             // 10001011
12
            irsnd_busy      = TRUE;
13
            break;
14
        }

Das wars. Ein IRSND_SUPPORT_APPLE_PROTOCOL wird es nicht geben, denn es 
ist einfach IRSND_SUPPORT_NEC_PROTOCOL auf 1 zu setzen. Ich werde das 
auch so nochmal im IRMP-Artikel erläutern.

Gruß,

Frank

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Neue Version von IRSND im Downloadbereich:

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

Änderungen:

 - Unterstützung des APPLE-Protokolls
 - Konfiguration über irmpconfig.h - analog zum IRMP
 - Einige Codeoptimierungen, um Flash-Speicher zu sparen

Viel Spaß,

Frank

von Patrick H. (patrickhh)


Angehängte Dateien:

Lesenswert?

Hallo Frank,

endlich bin ich heute dazu gekommen den IRMP mal aufzubauen und zu 
testen. Hab mal alle FB aus meinem Sortiment zu Hause rausgekramt, um zu 
sehen, was die alle so "senden". Da kamen schon einige Protokolle 
zusammen:
NEC, RC5x, RC5, SIRC, RC6, KASEIKYO

Jetzt noch zu einer FB (wahrscheinlich Fernseher) von Grundig (FB Typ: 
TP 715). Die wurde von IRMP nicht erkannt. Kannst du mal schauen, ob es 
möglich ist, diese mit in IRMP zu integrieren.
Im Anhang findest du die Scans.

Außerdem habe ich in meinen Dokus noch ein Grundig-Protokoll gefunden.
Vielleicht kann das ja mal einer gebrauchen.


Danke schon mal für deine/eure Unterstützung...


Gruß

PatrickHH

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Hallo Patrick,

Patrick Hh schrieb:

> Jetzt noch zu einer FB (wahrscheinlich Fernseher) von Grundig (FB Typ:
> TP 715). Die wurde von IRMP nicht erkannt. Kannst du mal schauen, ob es
> möglich ist, diese mit in IRMP zu integrieren.
> Im Anhang findest du die Scans.

Ich habe mir die Scans angeschaut: Das ist eine Manchester-Codierung - 
ähnlich zu RC5, aber doch wieder ganz anders...

> Außerdem habe ich in meinen Dokus noch ein Grundig-Protokoll gefunden.
> Vielleicht kann das ja mal einer gebrauchen.

Die Doku ist spitze, sie beschreibt genau die Signale, die ich in Deinen 
Scans fand. :-)

Ich schaue mal, dass ich das Grundig-Protokoll in den IRMP integriere. 
Leider ist es wegen der Manchester-Codierung nicht damit getan, einfach 
nur die Preprocessor-Konstanten für die Timings zu definieren.

Gruß,

Frank

von Patrick H. (patrickhh)


Lesenswert?

Das ging ja schnell!

Das hört sich ja schon mal ganz gut an. Ist auch nicht so eilig für 
mich.

Dann viel Erfolg. Mal sehen ob es klappt.

Schönen Abend noch...


PatrickHH

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Frank M. schrieb:

> Ich schaue mal, dass ich das Grundig-Protokoll in den IRMP integriere.

Habe es erfolgreich einbauen können, kostet auch nur "150" weitere Bytes 
im Binary.

@Patrick:
Bevor ich nun ein neues Release mache, würde ich das gerne einmal von 
Dir testen lassen, deshalb hänge ich hier nur mal die geänderten Sources 
dran, bevor ich ein neues Download-Paket zusammenstelle.

Wäre auch nicht schlecht zu wissen, wie IRMP auf längere Tastendrücke 
reagiert, eventuell muss ich da noch nacharbeiten. Hilfreich wäre da ein 
Scan mit länger gedrückter Taste - aber nicht zu lang, da sonst der 
Log-Buffer überläuft.

Das Grundig-Protokoll hat einiges gemeinsam mit RC5. Ich werde mal 
schauen, ob ich da noch einiges an gemeinsamen Code für RC5 und Grundig 
zusammenfassen kann, um noch etwas an Flash-Speicher einzusparen.

Gruß,

Frank

von Frank M. (ukw) (Moderator) Benutzerseite


Angehängte Dateien:

Lesenswert?

Sorry, Anhang vergessen.

von Patrick H. (patrickhh)


Lesenswert?

Super,

ich werde es heute Vormittag mal testen (Jetzt ist es schon zu spät).

Eine andere Frage hätte ich da auch noch. Ist es möglich den Controller, 
wenn er gerade nichts Empfängt, schlafen zu legen? Ich denke da an den 
externen Interrupt. Wenn der TSOP ein Signal bekommt, dann erwacht der 
Controller und macht dann seine IR-Erkennung.
Die Funktion währe für den Batterie/Akku Betrieb sehr von Vorteil.
Denn jetzt ist der Sromverbrauch schon bei 15mA.

Wenn dies Funktionieren würde, was muß ich dann im Programm hinzu fügen. 
Leider hab ich es nicht so mit der C Programmierung (mache lieber .asm)


Gruß

PatrickHH

von Patrick H. (patrickhh)


Angehängte Dateien:

Lesenswert?

Hallo Frank,

es Fuktioniert! Codes werden Zuverlässig erkannt. Wenn eine Taste länger 
gedrückt wird, dann wird der Code erneut zurückgegeben. Das Repetition 
Flag wird dann aber nicht gesetzt.
Ich habe nochmal ein Scan gemacht, wo ich die Taste etwas länger 
gedrückt habe.

Bezüglich Repetition Flag und SIRC:
Bei mir wird bei einem längeren Tastendruck der Code nur einmal 
Ausgegeben. Auch wenn ich eine Taste länger drücke. Ich bekomme keine 
Wiederholung! Ist das so gewollt?
Da ich ja schon mal mit dem Logging beschäftigt war, habe ich auch noch 
von meiner SonyFB einige Scans gemacht.

Danke nochmal und Gruß


PatrickHH

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Hallo Patrick,

Patrick Hh schrieb:

> Eine andere Frage hätte ich da auch noch. Ist es möglich den Controller,
> wenn er gerade nichts Empfängt, schlafen zu legen?

Ja, wäre möglich.

> Die Funktion währe für den Batterie/Akku Betrieb sehr von Vorteil.
> Denn jetzt ist der Sromverbrauch schon bei 15mA.

Das Problem ist aber, dass der TSOP allein schon permanent 5mA zieht. 
Und den kannst Du nicht "schlafen legen".

> Wenn dies Funktionieren würde, was muß ich dann im Programm hinzu fügen.
> Leider hab ich es nicht so mit der C Programmierung (mache lieber .asm)

Muss ich mir erstmal selbst anschauen, ich habe mich bisher damit noch 
nicht beschäftigt.

Gruß,

Frank

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Patrick Hh schrieb:

> es Fuktioniert! Codes werden Zuverlässig erkannt.

Freut mich :-)

> Wenn eine Taste länger
> gedrückt wird, dann wird der Code erneut zurückgegeben. Das Repetition
> Flag wird dann aber nicht gesetzt.

Hatte ich befürchtet. Aus Deinen Scans ging das nämlich nicht hervor.

> Ich habe nochmal ein Scan gemacht, wo ich die Taste etwas länger
> gedrückt habe.

Prima, werde ich mir anschauen.

> Bezüglich Repetition Flag und SIRC:
> Bei mir wird bei einem längeren Tastendruck der Code nur einmal
> Ausgegeben. Auch wenn ich eine Taste länger drücke. Ich bekomme keine
> Wiederholung! Ist das so gewollt?

Nein, aber ich muss zugeben, dass ich das mangels Sony-FB auch niemals 
austesten konnte.

> Da ich ja schon mal mit dem Logging beschäftigt war, habe ich auch noch
> von meiner SonyFB einige Scans gemacht.

Sehr schön, dann bekomme ich das dann wohl auch für SIRCs endlich mal 
richtig gelöst.

Gruß und Dank,

Frank

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Patrick Hh schrieb:

> es Fuktioniert!

Eins vergaß ich noch zu fragen: mit welchem IR-Empfänger hast Du die 
Signale aufgenommmen? In der Grundig-Doku las ich was von 485kHz, das 
ist genaz schön viel für einen "normalen" TSOP.

Gruß,

Frank

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Patrick Hh schrieb:

> Wenn eine Taste länger
> gedrückt wird, dann wird der Code erneut zurückgegeben. Das Repetition
> Flag wird dann aber nicht gesetzt.

Ich habe gerade Deine Scans mit

./irmp < IR-Data/Grundig_TP715_lange.txt |less

unter Linux getestet.

Da bei längerem Drücken der Scan-Buffer irgendwann überläuft, geht der 
Scan zwar nach 3 Frames einer jeden Taste voll in die Hose, aber irmp 
setzt bei mir trotzdem das Repetition-Flag beim zweiten Frame:

# 1 lange (wird in IRMP als 11 Dezimal ausgewertet)
protcol = 15, address = 0x0000, code = 0x0011, flags = 0x00
protcol = 15, address = 0x0000, code = 0x0011, flags = 0x01
-------------------------------------------------------------------
# 2 lange (wird in IRMP als 12 Dezimal ausgewertet)
protcol = 15, address = 0x0000, code = 0x0012, flags = 0x00
protcol = 15, address = 0x0000, code = 0x0012, flags = 0x01
-------------------------------------------------------------------
# 0 ganz lange (wird in IRMP als 10 Dezimal ausgewertet)
protcol = 15, address = 0x0000, code = 0x0010, flags = 0x00
protcol = 15, address = 0x0000, code = 0x0010, flags = 0x01

Kannst Du das nochmal überprüfen?

Gruß,

Frank

von Patrick H. (patrickhh)


Lesenswert?

Hi Frank,

also ich benutze den TSOP mit 38KHz. Mit 36KHz habe ich es eben auch 
noch mal getestet -> Funktioniert auch.

Ich habe auch nochmal den langen Tastendruck getestet, aber ich bekomme 
das Flag nicht gesetzt. Hoffe es liegt nicht an meinem Programm. Ich 
habs (noch) nicht so mit der "C" Programmierung.
Ich lasse mir den Code und das Flag (wie im Artikel beschrieben) via 
RS232 (danke an Klaus Leidinger) senden. Eigentlich nicht viel.

> Das Problem ist aber, dass der TSOP allein schon permanent 5mA zieht.
> Und den kannst Du nicht "schlafen legen".

Mein TSOP verbraucht im Ruhezustand nur ca. 1mA!


Gruß

PatrickHH

von Tishima (Gast)


Lesenswert?

Patrick Hh schrieb:
> Bezüglich Repetition Flag und SIRC:
> Bei mir wird bei einem längeren Tastendruck der Code nur einmal
> Ausgegeben. Auch wenn ich eine Taste länger drücke. Ich bekomme keine
> Wiederholung! Ist das so gewollt?
> Da ich ja schon mal mit dem Logging beschäftigt war, habe ich auch noch
> von meiner SonyFB einige Scans gemacht.

Hallo!

Ich beschaeftige mich zur Zeit auch mit dem IRMP Code.
Das Phänomen mit dem SIRC Protocoll kann ich auch bei mir beobachten, 
und der Samsung Empfang verhält sich genauso, es werden keine neuen 
Codes bei langem Tastendruck ausgewertet.

Scans kann ich leider nicht machen da aus unerklärlichen gründen die 
eingebauten UART Funktionen bei mir nicht funktionieren wollen, ich zeig 
die empfangenen Bytes mit der UART Routine von Peter Flury an.


mfg,
Bjoern

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Tishima schrieb:

> Ich beschaeftige mich zur Zeit auch mit dem IRMP Code.
> Das Phänomen mit dem SIRC Protocoll kann ich auch bei mir beobachten,
> und der Samsung Empfang verhält sich genauso, es werden keine neuen
> Codes bei langem Tastendruck ausgewertet.

Das Problem mit dem SIRCs-Code habe ich dank Patricks Scan-Datei 
reproduzieren können. Sony-FBs senden bei jedem (kurzem) Tastendruck 2 
bis 3 Wiederholungen. IRMP erkennt aber auch die vierte, fünfte usw. 
Wiederholung als Low-Level-Wiederholung statt als langen Tastendruck und 
unterdrückt diese dann.

In manchen SIRCs-Dokus steht, dass jeder Frame 2mal (in anderen Dokus 
steht 3mal) automatisch wiederholt wird.

Jetzt habe ich ein Problem: Patrick hat 3 Tasten lange gedrückt.

Taste A: 8 Frames aufgezeichnet
Taste B: 9 Frames aufgezeichnet
Taste C: 9 Frames aufgezeichnet

Wie habe ich das nun zu verstehen?

Möglichkeit 1:

Taste A: 1 Frame + 1 automatische Wiederholung - das ganze 4 mal?
Taste B: 1 Frame + 2 automatische Wiederholungen - das ganze 3 mal?
Taste C: 1 Frame + 2 automatische Wiederholungen - das ganze 3 mal?

Warum wiederholt die FB bei Taste A jeden Tastendruck nur 2mal, bei den 
Tasten B und C dreimal? Das widerspricht sich.

Möglichkeit 2:

Taste A: 1 Frame + 1 automatische Wiederholung + 6 Wiederholungen wegen 
langer Taste

Taste B: 1 Frame + 1 automatische Wiederholung + 7 Wiederholungen wegen 
langer Taste

Taste C: 1 Frame + 1 automatische Wiederholung + 7 Wiederholungen wegen 
langer Taste

Das hieße dann: Der erste Frame wird automatisch wiederholt, alle 
weiteren geben die Länge des Tastendrucks wieder und werden daher nicht 
automatisch 2- bzw. 3-fach gesendet...

Ich tendiere zu Möglichkeit 2, habe leider nichts spezielles darüber 
gefunden, wie lange Tastendrücke codiert werden.

Dein Problem mit der Samsung-FB scheint ähnlich gelagert zu sein, werde 
ich mir näher anschauen.

Gruß,

Frank

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Hi Patrick,

Patrick Hh schrieb:

> also ich benutze den TSOP mit 38KHz. Mit 36KHz habe ich es eben auch
> noch mal getestet -> Funktioniert auch.

Okay, dann habe ich das mit den 485kHz falsch interpretiert.

> Ich habe auch nochmal den langen Tastendruck getestet, aber ich bekomme
> das Flag nicht gesetzt. Hoffe es liegt nicht an meinem Programm. Ich
> habs (noch) nicht so mit der "C" Programmierung.

Gut, dann muss ich nochmal den Source prüfen. Danke für Deine 
Bestätigung.

> Mein TSOP verbraucht im Ruhezustand nur ca. 1mA!

Laut Datenblatt zieht der 5mA. Nun gut, da scheint der Wert im 
Datenblatt ein Maximalwert zu sein.

Gruß,

Frank

von Patrick H. (patrickhh)


Lesenswert?

Hallo,

was ich noch in meinen Unterlagen zu SIRC gefunden habe ist:

"Die Übertragung muss nach einer Pause noch mindestens zweimal (fünfmal 
bei Camcorder) wiederholt werden, sonst wird von einem Übertragunsfehler 
ausgegangen."

Das hört sich so an, als ob die Wiederholungen von Gerät zu Gerät 
unterschiedlich sein können.

Vielleicht hilft die Info...


Gruß

PatrickHH

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Patrick Hh schrieb:

> "Die Übertragung muss nach einer Pause noch mindestens zweimal (fünfmal
> bei Camcorder) wiederholt werden, sonst wird von einem Übertragunsfehler
> ausgegangen."

"Zweimalige Wiederholung" heisst 3x derselbe Frame, okay.

Aber was passiert bei längerem Tastendruck? Habe ich dann N x 3 Frames?
Oder 3 Frames + N weitere?

Gegen N x 3 Frames spricht, dass die erste Taste aus Deinem Scan exakt 8 
Frames erzeugt hat. Das ist nicht durch 3 teilbar.

> Das hört sich so an, als ob die Wiederholungen von Gerät zu Gerät
> unterschiedlich sein können.

Noch schlimmer. Wie lange unterdrücke ich also Wiederholungen, bevor ich 
sie wieder an die Applikation mit gesetztem Repetition-Bit weitergebe?

Ich habe mir jetzt nochmal sämtliche Sony-FB-Scans im Verzeichnis 
IR-Data angeschaut, die ich von verschiedenen Leuten bekommen habe.

Dort habe ich folgende Häufigkeiten finden können:

49 x 3 Frames
65 x 4 Frames
18 x 5 Frames
 2 x 6 Frames
 4 x 7 Frames
 2 x 8 Frames
 3 x 9 Frames

Auffallend ist:

1. Es werden mindestens 3 Frames gesandt.

2. Danach kann jede x-beliebige Anzahl von Frames erfolgen, es gibt
   keine ganzzahligen Vielfachen von 2 oder 3 Frames.

Ergo werde ich den Code derart ändern, dass die erste und zweite 
Wiederholung des Original-Frames ignoriert wird und anschließend jede 
weitere Wiederholung des Frames (innerhalb des Zeitrahmens natürlich) 
mit gesetztem Repetition-Bit an die Applikation wieder zurückgemeldet 
wird.

Gruß,

Frank

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Tishima schrieb:

> Das Phänomen mit dem SIRC Protocoll kann ich auch bei mir beobachten,
> und der Samsung Empfang verhält sich genauso, es werden keine neuen
> Codes bei langem Tastendruck ausgewertet.

Frage: geht es um SAMSUNG oder SAMSUNG32?

Gruß,

Frank

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Eine neue Version von IRMP ist unter

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

verfügbar.

Änderungen:

1) Neues Protokoll: Grundig

2) Behandlung von automatischen Frame-Wiederholungen beim SIRCS-,
   SAMSUNG32- und NUBERT-Protokoll verbessert.

Zu Punkt 2:

Beim SIRCS-Protokoll werden nun bei Frame-Wiederholungen nur noch der 
zweite und der dritte Frame ignoriert, alle weiteren Wiederholungen 
werden als langer Tastendruck gewertet und das entsprechende 
Repetition-Flag gesetzt.

Bei SAMSUNG32 und NUBERT wird jeder 2. Wiederholungsframe ignoriert, 
weil hier wohl immer 2 Frames gesendet werden. Ein dritter, fünfter usw. 
Frame wird als langer Tastendruck gewertet und das entsprechende 
Repetition-Flag gesetzt.

Viel Spaß,

Frank

P.S.

@Patrick:

Da bei meinen Tests mit Grundig einwandfrei das Repetition-Flag gesetzt 
wird, wenn derselbe Frame N-fach wiederholt wird, kann ich das 
Verhalten, was bei Dir auftritt, nicht nachvollziehen. Hilfreich wäre da 
ein Auszug des Sources, den Du zur Ausgabe von irmp_data.flags 
verwendest.

von Tishima (Gast)


Lesenswert?

Ha

Frank M. schrieb:
> Frage: geht es um SAMSUNG oder SAMSUNG32?
>
> Gruß,
>
> Frank

Hallo!

Kann ich jetzt momentan garnicht sagen. Der Ausgabestring ist ja bei 
beiden SAMSUNG im Beispiel Code gleich. An das Protkoll Byte kann ich 
mich garnicht erinnern. Wenn ich meine Universalfernbedienung nochmal 
dazu überedet kriege SAMSUNG Codes auszuspucken, werde ich mal aufs 
Protokoll Byte achten.

gruß,
Bjoern

von Tishima (Gast)


Lesenswert?

Hallo!

So habe eben den neuen Code getestet.

Sirc wird nun sauber bei mir erkannt, jedoch beim Samsung32 Code haut 
ein langer Tastendruck immer noch nicht hin.

gruß,
Bjoern

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Neue Version 1.3.1 von IRMP verfügbar, Download unter

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

Änderungen:

 - Bit-Maske für SAMSUNG32 korrigiert, das niederwertigste Bit wurde 
bisher
   komplett ignoriert

 - Timing-Werte für SAMSUNG32 geändert

Ebenso ist nun die Version 1.3.1 von IRSND verfügbar, Download unter

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

Änderungen:

 - GRUNDIG-Protokoll hinzugefügt

 - Behandlung von Frame-Wiederholungen für SIRCS, SAMSUNG32 und NUBERT
   korrigiert

Viel Spaß,

Frank

von Patrick H. (patrickhh)


Angehängte Dateien:

Lesenswert?

Hi Frank,

> zu: Grundig
also hier mal meine main.c.
Als Compiler nehme ich GCC. Als Controller nehme ich einen Mega8.

Wenn ich eine Taste lange drücke, dann bekomme ich auch nacheinander die 
Codes angezeigt, jedoch ohne das Flag.

> zu: SIRC
Den Code kann ich erst am Wochenende testen. Dann gibts Feedback.


Gruß


Patrick

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Tishima schrieb:

> Sirc wird nun sauber bei mir erkannt,

Prima, freut mich.

> jedoch beim Samsung32 Code haut ein langer Tastendruck immer noch nicht hin.

Was bekommst du stattdessen? N x denselben Befehl? Oder nur 1x?
Und es handelt sich definitiv um SAMSUNG32?

IRMP erkennt lange Tastendrücke bei Protokollen, die nicht explizit 
einen Repetition-Frame oder einen anderen Mechanismus dafür bieten, 
einfach daran, dass die Frame-Wiederholungen innerhalb von 100 msec 
reinkommen.

Um da jetzt weiterzukommen, bräuchte ich einen Scan von Dir. Du sagtest, 
Du benutzt die Fleury-Lib auf dem UART? Lass die mal weg, dann sollte es 
gehen. Der Scan wird mit 9600Baud, 8bit, no parity ausgegeben.

Gruß,

Frank

P.S.
Ich habe gerade eben eine neue Version 1.3.1 hochgeladen, da war sowieso 
noch ein Fehler beim Erkennen des SAMSUNG-Kommando-Codes. Das 
niederwertigste Bit wurde verschlabbert. Dürfte aber keine Änderung bei 
Dir bzgl. langer Tastendrücke bringen.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Hi Patrick,

Patrick Hh schrieb:

> Wenn ich eine Taste lange drücke, dann bekomme ich auch nacheinander die
> Codes angezeigt, jedoch ohne das Flag.

Bei jeder FB? Oder nur bei Grundig? Wenn es bei jeder FB ist, dann liegt 
die Vermutung nahe, dass in Deiner main-Funktion der Wurm drin ist. 
Schaue ich mir an.

Gruß,

Frank

von Patrick H. (patrickhh)


Lesenswert?

Hi Frank,

> Bei jeder FB? Oder nur bei Grundig? Wenn es bei jeder FB ist, dann liegt
> die Vermutung nahe, dass in Deiner main-Funktion der Wurm drin ist.

Bis jetzt nur bei der Grundig. Bei Anderen z.B. RC5 oder NEC bekomme ich 
beim dauer Drücken das Flag gesetzt.


PatrickHH

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Patrick Hh schrieb:

> Bis jetzt nur bei der Grundig. Bei Anderen z.B. RC5 oder NEC bekomme ich
> beim dauer Drücken das Flag gesetzt.

Hm, dann kann es nicht an der main-Funktion liegen, habe sie mir auch 
angeschaut, sieht alles okay aus.

Bin nun etwas ratlos. Warum klappt das bei mir mit den Scans und bei Dir 
nicht?

Gruß,

Frank

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Patrick Hh schrieb:

> Bis jetzt nur bei der Grundig. Bei Anderen z.B. RC5 oder NEC bekomme ich
> beim dauer Drücken das Flag gesetzt.

Ich habe mir nochmal die Doku zum Grundig-Protokoll angeschaut. Dort 
haben die Info-Frames, die bei längerem Tastendruck wiederholt werden, 
einen Abstand von 117,76ms.

In der Scan-Datei müssten die Info-Frames bei einem so großem Abstand 
eigentlich alle in einer separaten Zeile stehen. Tun sie aber nicht, sie 
sind alle in einer Zeile.

Meine Frage: Hast Du da vielleicht mittels Editor etwaige Mehrfachzeilen 
zu einer einzigen Zeile zusammenkopiert - zum Beispiel zwecks 
Übersichtlichkeit? In den Scans haben die Info-Frames nämlich lediglich 
einen Abstand von 2ms. Dieser Zeitrahmen liegt weit unterhalb der 100ms, 
die ich zur Erkennung von langen Tastendrücken als obere Grenze 
definiert habe. Das würde auch erklären, warum bei der Auswertung der 
Scans das Repetition-Bit auch gesetzt wird.

Meine Bitte: Ändere mal in irmp.c die Zeile
1
#define IRMP_REPETITION_TIME  (uint16_t)(F_INTERRUPTS * 100.0e-3 + 0.5)  // autodetect key repetition within 100 msec

in
1
#define IRMP_REPETITION_TIME  (uint16_t)(F_INTERRUPTS * 150.0e-3 + 0.5)  // autodetect key repetition within 150 msec

ab und teste die Grundig-FB nochmals mit langen Tastendrücken.

Die 100ms sind als Grenze wohl zu knapp, denn laut Grundig-Doku sind wir 
mit 117ms knapp drunter. Fragt sich nur, warum in den Scans nur 2ms als 
Pausen zwischen den Frames zu sehen sind....

Gruß,

Frank

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Hallo Bjoern,

Tishima schrieb:

> [...] jedoch beim Samsung32 Code haut
> ein langer Tastendruck immer noch nicht hin.

Für Dich gilt dasselbe: Ändere bitte mal die 100 msec in 150 msec, siehe 
Code im vorherigen Posting. Der Grund, warum beim SAMSUNG32-Protokoll 
keine langen Tastendrücke erkannt werden, könnte derselbe wie bei der 
Grundig-FB sein.

Gruß,

Frank

von Patrick H. (patrickhh)


Lesenswert?

Hi Frank,

> Meine Frage: Hast Du da vielleicht mittels Editor etwaige Mehrfachzeilen
> zu einer einzigen Zeile zusammenkopiert - zum Beispiel zwecks
> Übersichtlichkeit?

Ich habe, glaube ich, bei den Scan-Daten alles in eine Zeile gemacht. 
Denn mein Terminal Programm setzt nach jeder Übertragung ein "CR/LF" am 
Ende. Das habe ich eigentlich nur entfernt. Vielleicht lag es ja daran.
Kann am Wochenende ja nochmal ein anderes Terminal Programmm benutzen 
und nochmals einen Scan machen.

> Meine Bitte: Ändere mal in irmp.c die Zeile......
Werde ich testen. Wird aber erst am Wochenende was.

Gruß

PatrickHH

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Hi Patrick,

Patrick Hh schrieb:

> Ich habe, glaube ich, bei den Scan-Daten alles in eine Zeile gemacht.

Jau, dann hattest Du mich mit der Scan-Datei auf die falsche Fährte 
geführt und ich dachte, 100ms reichen völlig aus ;-)

> Werde ich testen. Wird aber erst am Wochenende was.

Bin mir nun ziemlich sicher, dass es mit der Änderung funktionieren 
wird.

Gruß,

Frank

von Tishima (Gast)


Lesenswert?

Frank M. schrieb:
> Für Dich gilt dasselbe: Ändere bitte mal die 100 msec in 150 msec, siehe
> Code im vorherigen Posting. Der Grund, warum beim SAMSUNG32-Protokoll
> keine langen Tastendrücke erkannt werden, könnte derselbe wie bei der
> Grundig-FB sein.

Hallo!

Habe soeben die neue Version getestet mit ner Phillips 
Universalfernbedienung, der Samsung32 Code wird nun richtig erkannt, 
auch ohne das ich den Wert auf 150 geaendert habe.
Meine Pollin UFB will nun garkeinen SAMSUNG32 Code mehr ausspucken 
obwohl ich mir sicher bin den selben device Code eingeben zu haben, wie 
bei den letzten Tests.
Aber die UFB ist eh der letzte Chinaschrott und wird von mir nicht mehr 
verwendet.

So, ich klink mich hier erstmal aus und bastle mit Eventghost rum um 
meine Software zu steuern die ich benötige.


Viel, Spaß noch....

mfg,
Bjoern

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Tishima schrieb:

> Habe soeben die neue Version getestet mit ner Phillips
> Universalfernbedienung, der Samsung32 Code wird nun richtig erkannt,
> auch ohne das ich den Wert auf 150 geaendert habe.

Freut mich :-)

> So, ich klink mich hier erstmal aus und bastle mit Eventghost rum um
> meine Software zu steuern die ich benötige.

Viel Spaß, ich hoffe, Du erzählst nachher etwas über Dein Projekt, wenn 
es dann fertig ist.

Frank

von Patrick H. (patrickhh)


Lesenswert?

Hi Frank,

ich habe die neue Version getestet:

SIRC funktioniert jetzt auch mit langen Tastendruck. Das Flag wird nun 
auch gesetzt.

Bei Grundig wird nun auch das REPETITION Flag gesetzt, wenn ich die 
REPETITION TIME auf mindestens 120ms setzte. Also stimmen die Werte, die 
im Datenblatt stehen.


Vielen Dank nochmal für deine Unterstützung...


Gruß

PatrickHH

von eku (Gast)


Angehängte Dateien:

Lesenswert?

Frank M. schrieb:
> eku schrieb:
>
>> Reicht für die Analyse wenn ich die UART-Ausgaben mit IRMP_LOGGING=1
>
>> aufzeichne?
>
> Ja, müsste reichen, am besten so viele Tasten wie möglich und dann in
> der Form:

Anbei die Protokolle für Gigaset M740AV (gigaset.txt) ud Nokia D-Box 2 
(dbox.txt). Letztere wird seit der Unterstützung des Grundig-Protokolls 
wechselnd als RC(x) und Grundig erkannt. Die Codes sind aber Müll.

Die Unterstützung sowohl in IRMP als auch in IRSND wäre super!

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Hi Patrick,

Patrick Hh schrieb:

> SIRC funktioniert jetzt auch mit langen Tastendruck. Das Flag wird nun
> auch gesetzt.

Freut mich.

> Bei Grundig wird nun auch das REPETITION Flag gesetzt, wenn ich die
> REPETITION TIME auf mindestens 120ms setzte. Also stimmen die Werte, die
> im Datenblatt stehen.

Gut. Dann werde ich auf Nummer sicher gehen und die REPETITION TIME fürs 
nächste Release auf 130ms setzen.

Gruß,

Frank

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

eku schrieb:

> Anbei die Protokolle für Gigaset M740AV (gigaset.txt) ud Nokia D-Box 2
> (dbox.txt). Letztere wird seit der Unterstützung des Grundig-Protokolls
> wechselnd als RC(x) und Grundig erkannt. Die Codes sind aber Müll.

Ich habe gerade mal reingeschaut. Das Gigaset-Protokoll scheint auch 
Manchester-codiert zu sein, da sowohl Pulsdauern als auch Pausen in ein- 
und zweifacher Länge vorkommen. Die Zeiten sind sehr knapp, da ist die 
Abtastrate von 10000/sec fast zuwenig. Muss ich mal schauen, dass ich da 
ein System reinbekomme.

Die D-Box scheint eine Abart des Grundig-Protokolls zu verwenden, 
offenbar ist hier einfach das Telegramm länger als 10 Bits, nämlich 16. 
Deshalb steigt der Grundig-Code nach 10 Bits aus und die restlichen 6 
Bits werden als RC5 erkannt, da die verbliebenen Daten-Bits ohne 
Start-Bit so "aussehen" wie RC5. Ich schaue, dass ich die beiden 
Protokolle über eine variable Längenerkennung auseinanderdividiert 
bekomme. Dann sollte die Erkennung sowoh für D-Box als auch für Grundig 
funktionieren.

Gruß,

Frank

von eku (Gast)


Lesenswert?

Frank M. schrieb:
> Ich habe gerade mal reingeschaut. Das Gigaset-Protokoll scheint auch
> Manchester-codiert zu sein, da sowohl Pulsdauern als auch Pausen in ein-
> und zweifacher Länge vorkommen. Die Zeiten sind sehr knapp, da ist die
> Abtastrate von 10000/sec fast zuwenig. Muss ich mal schauen, dass ich da
> ein System reinbekomme.

Laut LIRC Datensatz gelten folgende Parameter:
1
  bits           8
2
  eps            30
3
  aeps          100
4
  one             0     0
5
  zero            0     0
6
  pre_data_bits   24
7
  pre_data       0x10
8
  gap          210000
9
  min_repeat      2
10
  toggle_bit      25

und für doe DBox
[code]
  bits           8
  eps            30
  aeps          100

  one             0     0
  zero            0     0
  pre_data_bits   24
  pre_data       0x10
  gap          210000
  min_repeat      2
  toggle_bit      25
[code]

Hilft Dir das?

von eku (Gast)


Lesenswert?

eku schrieb:
> und für doe DBox

kleiner Fehler im Posting
1
name  D-BOX2
2
  bits            8
3
  flags SHIFT_ENC|CONST_LENGTH
4
  eps            10
5
  aeps          300
6
7
  header        510  2520
8
  one           450   550
9
  zero          450   550
10
  pre_data_bits   1
11
  pre_data       0x0
12
  post_data_bits  8
13
  post_data      0xC5
14
  gap          59500
15
  repeat_bit      0

von Frank M. (ukw) (Moderator) Benutzerseite


Angehängte Dateien:

Lesenswert?

eku schrieb:

> Anbei die Protokolle für Gigaset M740AV (gigaset.txt) ud Nokia D-Box 2
> (dbox.txt). Letztere wird seit der Unterstützung des Grundig-Protokolls
> wechselnd als RC(x) und Grundig erkannt. Die Codes sind aber Müll.

Ich habe das Nokia-Protokoll in den IRMP integriert. Mein erster 
Eindruck hat sich bestätigt: Das Nokia-Protokoll unterscheidet sich nur 
durch 16 Datenbits (8 Adressbits + 8 Kommandobits) statt 9 Datenbits (0 
Adressbits + 9 Kommandobits) beim Grundig-Protokoll. Das Timing ist 
annähernd gleich.

Anbei die geänderten Sources. Kannst Du das mal testen, auch was lange 
Tastendrücke angeht? Wenn es bei Dir funktioniert, werde ich ein neues 
Release für IRMP erstellen.

Gruß,

Frank

P.S.
An der Gigaset-FB bin ich noch dran.

von eku (Gast)


Lesenswert?

Hallo Frank!

Frank M. schrieb:
> Anbei die geänderten Sources. Kannst Du das mal testen, auch was lange
> Tastendrücke angeht? Wenn es bei Dir funktioniert, werde ich ein neues
> Release für IRMP erstellen.

Die Dekodierung funktioniert nun. Aus Mangel einer Grundig-FB kann ich 
nicht testen, ob diese auch noch geht. Die dekodierten Codes 
unterscheiden sich allerdings von 
http://lirc.sourceforge.net/remotes/nokia/DBOX2. Hat das was zu 
bedeuten?

Mit den Änderungen kann ich irsnd.c nicht länger übersetzen.
1
irmp/irsnd.c: In function 'ir_tx_process':
2
irmp/irsnd.c:526: error: 'SIRCS_REPETITION_CNT' undeclared (first use in this function)
3
irmp/irsnd.c:526: error: (Each undeclared identifier is reported only once
4
irmp/irsnd.c:526: error: for each function it appears in.)
5
irmp/irsnd.c:527: error: 'SIRCS_REPETITION_TIME' undeclared (first use in this function)
6
irmp/irsnd.c:576: error: 'SAMSUNG32_REPETITION_CNT' undeclared (first use in this function)
7
irmp/irsnd.c:577: error: 'SAMSUNG32_REPETITION_TIME' undeclared (first use in this function)
8
irmp/irsnd.c:661: error: 'DENON_REPETITION_CNT' undeclared (first use in this function)
9
irmp/irsnd.c:662: error: 'DENON_REPETITION_TIME' undeclared (first use in this function)
10
irmp/irsnd.c:678: error: 'NUBERT_REPETITION_CNT' undeclared (first use in this function)
11
irmp/irsnd.c:679: error: 'NUBERT_REPETITION_TIME' undeclared (first use in this function)
12
irmp/irsnd.c:713: error: 'GRUNDIG_REPETITION_CNT' undeclared (first use in this function)
13
irmp/irsnd.c:714: error: 'GRUNDIG_REPETITION_TIME' undeclared (first use in this function)

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

eku schrieb:

> Die Dekodierung funktioniert nun.

Freut mich!

> Aus Mangel einer Grundig-FB kann ich nicht testen, ob diese
> auch noch geht.

Macht nix, das habe ich bereits mit den mir vorliegenden 
Grundig-Scan-Dateien gemacht. War ein wenig Arbeit, eine vernünftige 
Abbruchbedingung zu finden, um Grundig und Nokia zu unterscheiden, die 
sich tatsächlich nur in der Anzahl der Bits unterscheiden ;-)

> Die dekodierten Codes
> unterscheiden sich allerdings von
> http://lirc.sourceforge.net/remotes/nokia/DBOX2.

Ich weiß nicht, wie lirc die Codes generiert, ich vermute, die haben da 
noch einen weiteren Abstraktionslayer mit drin.

Die Codes, die IRMP ausspuckt, halte ich jedoch für absolut plausibel, 
da Taste 0 = 0x00, Taste 1 = 0x01, .... Taste 9 = 0x09 ist. Ausserdem 
habe ich heute morgen noch eine weitere Nokia-TV-Scan-Datei per Mail von 
einem anderen IRMP-Anwender erhalten, so dass ich da einen Quercheck 
machen konnte. Lediglich die Adresse unterschied sich, passt also alles 
wunderbar.

> Mit den Änderungen kann ich irsnd.c nicht länger übersetzen.

Das liegt daran, dass ich den IRMP-/IRSND-Source in der Zwischenzeit 
weiterbearbeitet und optimiert habe, deshalb hatte ich auch nur die 3 
Dateien zwecks Test hier ins Zip-Archiv gepackt. Mit dem nächsten 
Release gibt es dann wieder einen einheitlichen Stand.

Vielen Dank fürs Feedback,

Frank

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Neue Version 1.4.0 von IRMP verfügbar, Download unter

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

Änderungen:

 - Neues Protokoll: NOKIA

 - Erkennung von langen Tastendrücken beim Grundig-Protokoll

Ebenso ist nun die Version 1.4.0 von IRSND verfügbar, Download unter

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

Änderungen:

 - NOKIA-Protokoll hinzugefügt

Viel Spaß,

Frank

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

eku schrieb:

> Anbei die Protokolle für Gigaset M740AV (gigaset.txt) [...]

Wie gestern schon angedeutet: Die Pulse/Pausen sind arg kurz. Es handelt 
sich um ein 23-bittiges Manchester-Protokoll, wobei jeder Frame einmal 
zusätzlich wiederholt wird. Leider ist die Aufzeichnungsrate von 
10000/sec hier zu niedrig, um eindeutige Werte zu erhalten. Fast jede 
Wiederholung ist nicht identisch mit dem Original-Frame, weil ein Puls 
mehr oder weniger schon das Bit im Frame kippen lässt.

Kannst Du dieselben Scans nochmal mit F_INTERRUPTS 15000 machen? Dann 
sollte die Genauigkeit ausreichen.

Gruß,

Frank

von eku (Gast)


Angehängte Dateien:

Lesenswert?

Frank M. schrieb:
> Kannst Du dieselben Scans nochmal mit F_INTERRUPTS 15000 machen? Dann
> sollte die Genauigkeit ausreichen.

Samplerate 15kHz anbei.

von Frank M. (ukw) (Moderator) Benutzerseite


Angehängte Dateien:

Lesenswert?

eku schrieb:

> Samplerate 15kHz anbei.

Vielen Dank, die Datei ist echt brauchbar. Ich habe das Protokoll soweit 
"enschlüsseln" und den IRMP-Source anpassen können. Ich habe mal zum 
Testen die geänderten Sources angehängt.

Leider bleibt noch eine klitzekleine Unklarheit:

In der 10kHz-Datei wurde jeder Frame wiederholt, wobei in der 
Wiederholung immer das 15te Bit invertiert wurde. Dieses Bit hat 
offenbar eine ähnliche Bedeutung wie das Toggle-Bit beim RC5-Protokoll.

In der 15kHz-Datei gibt es diese Frame-Wiederholungen nicht.

Das kann zwei Gründe haben:

  a) Du hast beim 10kHz-Scan die Tasten länger gedrückt. Dann ist das
     15. Bit ein Flag für langen Tastendruck.

oder

  b) Die Wiederholungen wurden wegen der höheren Samplerate
     "verschluckt", d.h. es werden immer (auch bei kurzen
     Tastendrücken) 2 Frames verschickt, wobei das 15. Bit den
     automatischen Wiederholungs-Frame kenntlich macht.

Ich tippe mal auf Fall b).

Aber das lässt sich leicht herausfinden:

Sollten beim angehängten Source auch bei kurzem(!) Tastendruck 
konsequent immer 2 identische Frames erkannt werden und IRMP beim 
zweiten Frame das REPETION-Flag setzen, dann handelt es sich um Fall b) 
und ich muss das im Source noch gesondert behandeln.

Meine Bitte: Kannst Du das bitte testen? Am besten mit F_INTERRUPTS = 
15000. Wenn Du dann noch Lust/Zeit hast, kannst Du das ganze auch mal 
bei F_INTERRUPTS = 10000 testen und eine Aussage über die Erkennungsrate 
bei der niedrigeren Samplerate treffen.

Gruß,

Frank

von eku (Gast)


Lesenswert?

Frank M. schrieb:
> Sollten beim angehängten Source auch bei kurzem(!) Tastendruck
> konsequent immer 2 identische Frames erkannt werden und IRMP beim
> zweiten Frame das REPETION-Flag setzen, dann handelt es sich um Fall b)
> und ich muss das im Source noch gesondert behandeln.
>
> Meine Bitte: Kannst Du das bitte testen? Am besten mit F_INTERRUPTS =
> 15000. Wenn Du dann noch Lust/Zeit hast, kannst Du das ganze auch mal
> bei F_INTERRUPTS = 10000 testen und eine Aussage über die Erkennungsrate
> bei der niedrigeren Samplerate treffen.

Mit 15kHz wird zuverlässig erkannt. Die FB sendet nur ein Frame. 
Allerdings braucht es nur wenige Millisekunden für die 
Tastenwiederholung, die dann zuverlässig als solche von IRMP erkannt 
wird.

Mit 10kHz stimmen zwar die Codes, aber die Wiederholung wird nur 
sporadisch von IRMP als solche erkannt. Das ganze ist also, wie Du schon 
vermutetest, grenzwertig.

Ich habe kein Problem, IRMP mit 15kHz abtasten zu lassen. Siehst Du noch 
eine Stellschraube, um vielleicht mit 10kHz hinzukommen?

von eku (Gast)


Lesenswert?

eku schrieb:
> Mit 10kHz stimmen zwar die Codes, aber die Wiederholung wird nur
> sporadisch von IRMP als solche erkannt.

Gerade noch einmal getestet. Der Gerätecode wird nicht zuverlässig 
decodiert.

von eku (Gast)


Lesenswert?

Mit 15kHz werden keine anderen Protokolle erkannt. Woran kann das 
liegen?

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

eku schrieb:

> Mit 15kHz wird zuverlässig erkannt. Die FB sendet nur ein Frame.

Prima.

> Allerdings braucht es nur wenige Millisekunden für die
> Tastenwiederholung, die dann zuverlässig als solche von IRMP erkannt
> wird.

Dann lasse ich das mit der Extra-Auswertung des 15. Bits. Da ich dieses 
nur "ab und zu" im 10kHz-Scan gesehen habe, kann es auch sein, dass es 
einfach ein zufällig gekipptes Bit war. Wie gesagt, bei 10kHz liegen die 
Zeiten zu nah beieinander, um noch zuverlässig 0 oder 1 erkennen zu 
können.

> Mit 10kHz stimmen zwar die Codes, aber die Wiederholung wird nur
> sporadisch von IRMP als solche erkannt. Das ganze ist also, wie Du schon
> vermutetest, grenzwertig.

Okay, dann werde ich das im Source so machen, dass bei 10kHz der 
SIEMENS-Gigaset-Decoder unter Angabe einer Warnung deaktiviert wird.

> Ich habe kein Problem, IRMP mit 15kHz abtasten zu lassen. Siehst Du noch
> eine Stellschraube, um vielleicht mit 10kHz hinzukommen?

Nein. Bei dem 10kHz-Scan überlappen sich die Puls-/Pausenlängen 
teilweise. Hat einfach keinen Zweck.

Danke für Dein Feedback,

Frank

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

eku schrieb:
> Mit 15kHz werden keine anderen Protokolle erkannt. Woran kann das
> liegen?

Upps, weiß ich nicht. Es kann höchstens sein, dass eine gemessene 
Puls-/Pausen-Länge die 255 überschreitet. Ich dachte aber bisher, dass 
bis 15kHz noch alle Variablen mit uint8_t reichen... muss ich nochmal 
gegenchecken.

Welche anderen Protokolle hast Du denn getestet?

Notfalls könntest Du mal auf 14kHz runtergehen.

Gruß,

Frank

von Torsten K. (nobby)


Angehängte Dateien:

Lesenswert?

Hy,

ich versuche gerade das IRMP zu benutzen um damit NEC Codes zu meinem 
Receiver zu schicken. Der will aber nicht reagierren.
Ich habe das Modul von Klaus Leidinger nachgebaut, das zeigt mir den 
richtigen Code an, den ich sende, aber der Receiver mag nicht.
Ich hab mir das Signal der echten FB mal angeschaut und hier als Bild 
abgelegt. Da sieht man, das der eigentliche Befehl nur einmal kommt, und 
danach nur noch sowas wie "Taste noch gedrückt" ?

Das Timing der Repeats ist dieses:
9,1mS low, 2,1mS High, 700µS Low, 95,6mS High, dann gehts wieder mit 
9,1mS Low los.

Könnte die "Nichtfunktion" damit zusammenhängen, bzw. ist es möglich 
dieses Signal noch anzuhängen ??

Gruß
Torsten

von eku (Gast)


Lesenswert?

Frank M. schrieb:
> Upps, weiß ich nicht. Es kann höchstens sein, dass eine gemessene
> Puls-/Pausen-Länge die 255 überschreitet. Ich dachte aber bisher, dass
> bis 15kHz noch alle Variablen mit uint8_t reichen... muss ich nochmal
> gegenchecken.

Ich bin mir sicher, dass es da Überläufe gibt. Entferne mal den Cast 
uint8_t vor den Konstanten (Timing) an drehe die Compilerwarnungen hoch.

> Welche anderen Protokolle hast Du denn getestet?

NEC, Nubert, Denon, RC5, Grundig, Nokia

> Notfalls könntest Du mal auf 14kHz runtergehen.

Bring nichts. Bei 11kHz funktionieren die anderen, aber Siemens wird 
nicht zuverlässig erkannt. Wir werden die Konstanten auf 16 Bit 
verbreitern
müssen. Ob das generell so ist oder nur wenn F_INTERRUPTS > 10000 
überlasse ich Dir.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Torsten Kalbe schrieb:

> Ich habe das Modul von Klaus Leidinger nachgebaut, das zeigt mir den
> richtigen Code an, den ich sende, aber der Receiver mag nicht.

Das heisst also, der reagiert überhaupt nicht? Oder nur 1mal auf eine 
Taste?

> Ich hab mir das Signal der echten FB mal angeschaut und hier als Bild
> abgelegt. Da sieht man, das der eigentliche Befehl nur einmal kommt, und
> danach nur noch sowas wie "Taste noch gedrückt" ?
> Das Timing der Repeats ist dieses:
> 9,1mS low, 2,1mS High, 700µS Low, 95,6mS High, dann gehts wieder mit
> 9,1mS Low los.

Das entspricht genau dem, was in

   http://www.mikrocontroller.net/articles/IRMP#Protokolle

unter Protokoll "NEC, Tastenwiederholung" steht:

   9000µs Puls, 2250µs Pause, 560µs Puls, ~100ms Pause

Dieser Frame wird eigentlich nur geschickt, um eine Taste zu 
wiederholen, also dem Empfänger mitzuteilen, dass Du noch immer die 
Taste drückst.

> Könnte die "Nichtfunktion" damit zusammenhängen, bzw. ist es möglich
> dieses Signal noch anzuhängen ??

Schickt Deine Original-FB denn diesen Wiederholungsframe auch aus, wenn 
Du die Taste nur kurz drückst? Wenn nicht, reagiert dann der Empfänger 
in Deinem Gerät?

Wenn Deine FB diesen Wiederholungsframe generell sendet, egal wie lange 
Du die Taste drückst, dann würde ich dieses absonderliche Verhalten 
Deiner FB über ein Bit in irmp_data.flags nachbilden.

Gruß,

Frank

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

eku schrieb:

> Ich bin mir sicher, dass es da Überläufe gibt. Entferne mal den Cast
> uint8_t vor den Konstanten (Timing) an drehe die Compilerwarnungen hoch.

Werde ich mir ansehen.

> Bring nichts. Bei 11kHz funktionieren die anderen, aber Siemens wird
> nicht zuverlässig erkannt. Wir werden die Konstanten auf 16 Bit
> verbreitern müssen. Ob das generell so ist oder nur wenn F_INTERRUPTS
> 10000 überlasse ich Dir.

Das wäre bitter, denn nicht nur der Code würde größer werden, sondern 
auch das Laufzeitverhalten könnte kritisch werden.

Ich werde das überprüfen und dann nach einer geeigneten Lösung suchen.

Gruß,

Frank

von eku (Gast)


Lesenswert?

Gerade mal die Timings und Zählervariablen auf 16Bit verbreitert. Bis 
auf Denon funktioniert wieder alles bei 15kHz. Mehrverbrauch etwa 1kByte 
Flash.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

eku schrieb:

> Ich bin mir sicher, dass es da Überläufe gibt. Entferne mal den Cast
> uint8_t vor den Konstanten (Timing) an drehe die Compilerwarnungen hoch.

Entfernen darf man die Casts auf keinen Fall, denn dann sind die 
Konstanten alle Floats und die Floating-Point-Lib wird dann aktiv.

Die größten Werte im Source sind

NEC_START_BIT_PULSE_TIME mit 9000e-6

bzw.

BANG_OLUFSEN_START_BIT3_PAUSE_TIME mit 15625e-6

Damit rechne ich jetzt mal aus:
1
#define NEC_START_BIT_PULSE_LEN_MAX             ((uint8_t)(F_INTERRUPTS * NEC_START_BIT_PULSE_TIME * MAX_TOLERANCE_40 + 0.5) + 1)

Da kommt heraus bei 15kHz:

15000 x 9000e-6 x 1.4 + 0.5 + 1 = 136,5 -> 137

Jetzt noch:
1
#define BANG_OLUFSEN_START_BIT3_PAUSE_LEN_MAX   ((uint8_t)(F_INTERRUPTS * BANG_OLUFSEN_START_BIT3_PAUSE_TIME * MAX_TOLERANCE_05 + 0.5) + 1)

Bei 15kHz:

15000 x 15625e-6 x 1.05 + 1 = 247,09375 -> 247

Das passt also alles noch in den Wertebereich von 0 bis 255. Das Problem 
muss woanders liegen. Irgendwas läuft bei 15kHz über, aber was? Ich habe 
auch in Erinnerung, dass Klaus Leidinger den IRMP damals auch mit 15kHz 
erfolgreich getestet hat...

Ich werde weitersuchen,

Frank

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

eku schrieb:
> Gerade mal die Timings und Zählervariablen auf 16Bit verbreitert. Bis
> auf Denon funktioniert wieder alles bei 15kHz. Mehrverbrauch etwa 1kByte
> Flash.

1 kByte sind 30%. Das ist mir zuviel. Ich vermute auch, dass diese 
"Gewaltaktion" eigentlich nicht notwendig ist, siehe meine Berechnungen 
oben.
Es gibt irgendwo ein 8-Bit-Problem im Source bei 15kHz, aber mir wäre es 
lieber, den Übeltäter zu finden statt den Teufel mit dem Bezelbub 
auszutreiben...

Gruß,

Frank

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Frank M. schrieb:

> Da kommt heraus bei 15kHz:
>
> 15000 x 9000e-6 x 1.4 + 0.5 + 1 = 136,5 -> 137

Rechenfehler, korrekt ist:

15000 x 9000e-6 x 1.4 + 0.5 + 1 = 190,5 -> 190.

Der Wert bleibt trotzdem unter 256...

Ich habe auch eben mal ein kleines Programm geschrieben, um mir alle 
Timingwerte ausgeben zu lassen. Keines erzeugt bei 15kHz einen 
8-Bit-Überlauf.

Also weiter suchen...

Gruß,

Frank

von Simon K. (simon) Benutzerseite


Lesenswert?

Sind es denn auch genau 15kHz? Zum Beispiel mit 15,625kHz (Ist ja eine 
durchaus übliche Frequenz, wenn man einen 2^n Vorteiler benutzt).

Bang & Olufsen:
15625 x 15625e-6 x 1.05 + 1 = 257,3

von Torsten K. (nobby)


Lesenswert?

Zur Tastenwiederholung bei NEC.

Der Receiver reagiert garnicht.

Wenn ich die Taste an der FB dauerhaft drücke bekomme ich auch dauernd 
das Wiederholungssignal.

Die Taste so kurz zu drücken ist nicht wirklich einfach, außerdem sehe 
ich das dann ja auch nicht, was tatsächlich gesendet wird.
Ich müßte mal den zusätzlichen IR Empfänger direkt über den Receiver 
legen, damit ich dann mit dem Scope das Signal nachmessen kann.
Ich hab aber mal versucht die Taste ganz kurz zu drücken, da scheint der 
auch zu reagieren.

Das Signal selber, welches ich verschicke sieht vom Timing nahezu gleich 
aus, da habe ich an den Defines extra nachverändert, aber der Receiver 
reagiert trotzdem nicht.
Ich habe auch schonmal die IR Diode aus der FB an meiner Schaltung 
benutzt, weil ich eine ungewöhnliche Wellenlänge vermutet habe.
Das wars auch nicht.
Sehr merkwürdig.....

Gruß
Torsten

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Torsten Kalbe schrieb:
> Zur Tastenwiederholung bei NEC.
>
> Der Receiver reagiert garnicht.

Kannst Du mir Scan-Dateien zukommen lassen? Die Tasten 0-9 würden 
reichen.

Gruß,

Frank

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

eku schrieb:
> Gerade mal die Timings und Zählervariablen auf 16Bit verbreitert. Bis
> auf Denon funktioniert wieder alles bei 15kHz. Mehrverbrauch etwa 1kByte
> Flash.

Ich habe gerade mal stichprobenweise einige der mir vorliegenden 
Scan-Dateien mit dem Editor von 10kHz auf 15kHz "gestreckt", indem ich 
immer 00 durch 000 und 11 durch 111 ersetzt habe. Dann IRMP mit 15kHz 
unter Linux übersetzt und gegen die Scan-Dateien laufen lassen.

Ergebnis: überhaupt kein Problem, alle Scans wurden einwandfrei erkannt 
und dekodiert. Das NEC-Protokoll lief bei mir sogar noch bei 20kHz 
korrekt (mit entsprechend gestreckten Scan-Dateien).

Allerdings habe ich beim 20kHz-Test dann auch vom Compiler Warnungen 
bzgl. IRMP_TIMEOUT_LEN bekommen. Das läuft über ab 15425 Hz:
1
#define IRMP_TIMEOUT_TIME                       16500.0e-6                    // timeout after 16.5 ms darkness
2
#define IRMP_TIMEOUT_LEN                        (uint8_t)(F_INTERRUPTS * IRMP_TIMEOUT_TIME + 0.5)

F_INTERRUPTS darf also durchaus zwischen den Werten 10000 und 15000 
liegen.

Das Problem bei Dir muss woanders liegen. Ein Grund könnte sein, dass 
bei 15kHz der Time-Slot für die 15kHz-ISR zu eng wird, d.h. also 
Interrupts verlorengehen. Dagegen spricht, dass das Siemens-Protokoll 
immer noch korrekt erkannt wird. Ausserdem dürfte Deine 16-Bit-Version 
das Laufzeitverhalten noch weiter verschlimmern. Hattest Du vielleicht 
bei der 8-Bit-Version und F_INTERRUPTS = 15kHz noch das IRMP_LOGGING 
aktiviert? Das kostet natürlich auch noch einiges an Zeit.

Gruß,

Frank

von Torsten K. (nobby)


Lesenswert?

ähm, ja, eigentlich schon.
Muß ich dann nur die Zeile
#define IRMP_LOGGING                            0 
// 1: log IR signal (scan), 0: do not (default)
verändern in #define IRMP_LOGGING                            1 
// 1: log IR signal (scan), 0: do not (default)

Und dann den Empfäng mit Hterm pro Taste Speichern ?
oder kannst Du mit vielleicht die fertige Hex mailen ?

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Torsten Kalbe schrieb:
> ähm, ja, eigentlich schon.
> Muß ich dann nur die Zeile
> #define IRMP_LOGGING                            0
> // 1: log IR signal (scan), 0: do not (default)
> verändern in #define IRMP_LOGGING                            1
> // 1: log IR signal (scan), 0: do not (default)
>
> Und dann den Empfäng mit Hterm pro Taste Speichern ?

Ja, genau, siehe auch IRMP-Artikel.

Am besten schreibst Du dann am Schluss noch jeweils einen Kommentar vor 
jede Zeile, eingeleitet mit '#', z.B.

# Taste 1
0000011100000....

Gruß,

Frank

von Torsten K. (nobby)


Angehängte Dateien:

Lesenswert?

So, da ist dann mal der Scan von der FB mit NEC Protokoll.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Torsten Kalbe schrieb:
> So, da ist dann mal der Scan von der FB mit NEC Protokoll.

Danke, habe es mir angeschaut, bei jeder Taste wird nicht nur der 
normale NEC-Protokoll-Frame geschickt, sondern immer auch zusätzlich 
noch ein Repetition-Frame. Da ich annehme, dass Du die Tasten (bis auf 
Taste 1) immer nur kurz gedrückt hast, will Dein Empfänger wohl auch 
immer den Repetition-Frame "sehen", bevor er reagiert.

Ich werde in den IRSND einbauen, dass man über das Setzen eines Flags 
genau dieses (atypische) Verhalten reproduzieren kann.

Vielen Dank für den Scan,

Frank

von Torsten K. (nobby)


Lesenswert?

Oh, so eine Anpassung wäre ja Klasse, aber es würde ja auch erstmal eine 
"Testversion" reichen, vielleicht liegt es ja doch noch an was anderem.

von Frank M. (ukw) (Moderator) Benutzerseite


Angehängte Dateien:

Lesenswert?

Torsten Kalbe schrieb:
> Oh, so eine Anpassung wäre ja Klasse, aber es würde ja auch erstmal eine
> "Testversion" reichen, vielleicht liegt es ja doch noch an was anderem.

Ich dachte auch an eine "Testversion", nur war die mal nicht eben in 5 
Minuten zusammengehackt ;-)

Ich habe nun irsnd folgendermaßen erweitert, dass irmp_data.flags die 
Anzahl der Tasten-Wiederholungen angibt, also:

flags = 0: Normales Senden des Frames - wie bisher
flags = 1: 1-malige Wiederholung
flags = 2: 2-malige Wiederhulung
usw.

Dabei gelten folgende Besonderheiten:

Bei SIRCS werden sowieso immer 3 Frames gesandt - so erfordert es das 
Protokoll. Bei flags = 1 werden dann daraus 4 Frames, bei flags = 2 dann 
5 Frames usw.

Bei NEC werden die Wiederholungen als Repetition-Frames gesandt, also 
nicht der komplette Frame n-mal wiederholt.

Für Grundig und Nokia werden im Moment noch alle Pakete (welche aus 3 
Frames bestehen, nämlich Start-Frame + Info-Frame + Stop-Frame) n-malig 
wiederholt, also nicht nur der Info-Frame, wie es sein soll. Da muss ich 
noch nacharbeiten.

Bei allen anderen Protokollen wird einfach der Original-Frame n-mal 
wiederholt, mit entweder (mir) bekannten Pause-Zeiten zwischen den 
Frames oder mit der (von mir willkürlich gewählten) Pause-Zeit von 
45msec.

Um nun Dein Problem mit dem Skymaster-Empfänger zu lösen, musst Du vor 
dem Aufruf von irsnd_send_data() einfach irmp_data.flags = 1 setzen. 
Dann wird erst der Original-Frame gesandt, anschließend eine Pause von 
40ms gemacht und letztendlich der Repetition-Frame gesandt.

Im Anhang die Testversion.

Viel Glück!

Frank

von Torsten K. (nobby)


Lesenswert?

Hallo Frank,

erstmal vielen Dank für die schnelle Anpassung !!

Das Problem lag aber an einer anderen Stelle, manchmal kann es so 
einfach sein.
Nachdem ich den Receiver auseinander geschraubt hatte, und direkt am 
Empfänger gemessen habe, ist mir noch eine andere Idee eingefallen.

Diese neue Atmelgeneration hat ja einen elendigen Jitter vom RC 
Oszilator, daher habe ich mal einen 8mHz Quarz an den Prozessor gelötet, 
und schon hat es sofort funktioniert !!
Auch das einfache Senden des NEC-Codes, auch ohne Wiederholung hat 
gereicht !!
Ich denke aber, diese Fähigkeit der Wiederholungseinstellung sollte 
erhalten bleiben, denn das könnte vielleicht auch mal in anderen Fällen 
zu gebrauchen sein.

Ich werde jetzt mal an die Schaltung von Klaus auch einen Quarz hängen, 
da nämlich der RC5 Code bei mir nicht immer gut erkannt wird.

Gruß
Torsten

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Torsten Kalbe schrieb:

> Diese neue Atmelgeneration hat ja einen elendigen Jitter vom RC
> Oszilator, daher habe ich mal einen 8mHz Quarz an den Prozessor gelötet,
> und schon hat es sofort funktioniert !!

Danke für die Rückmeldung :-)

> Auch das einfache Senden des NEC-Codes, auch ohne Wiederholung hat
> gereicht !!

Prima.

> Ich denke aber, diese Fähigkeit der Wiederholungseinstellung sollte
> erhalten bleiben, denn das könnte vielleicht auch mal in anderen Fällen
> zu gebrauchen sein.

Ja, auf jeden Fall, damit kann man dann direkt ein Kommando n-fach 
schicken, was durchaus sinnvoll sein kann, z.B. zur Regelung von 
Lautstärken oder Helligkeiten etc.

> Ich werde jetzt mal an die Schaltung von Klaus auch einen Quarz hängen,
> da nämlich der RC5 Code bei mir nicht immer gut erkannt wird.

Ich werde im IRMP-Artikel entsprechend vermerken, dass die ganze 
Geschichte mit Quarz um einiges stabiler ist.

Gruß,

Frank

von Torsten K. (nobby)


Lesenswert?

Dann kannst Du vielleicht auch mal auf diese Seite verlinken:
http://www.scienceprog.com/avr-internal-oscillator-jitter-research/
Da sind ein paar erschreckende Bilder zu sehen !

von Klaus L. (kllei)


Lesenswert?

Torsten Kalbe schrieb:
> Hallo Frank,
>
> Ich werde jetzt mal an die Schaltung von Klaus auch einen Quarz hängen,
> da nämlich der RC5 Code bei mir nicht immer gut erkannt wird.
>
Hallo Torsten,
die Xtal Pins sind in meiner Schaltung leider für das LCD benutzt (wegen 
Kompatibilität mit Codevision). Für GCC kann die Pinbelegung natürlich 
auch einfach geändert werden. Ein Kalibrieren des Oszillators würde 
vielleicht auch helfen?

Gruß,
Klaus

von Torsten K. (nobby)


Angehängte Dateien:

Lesenswert?

Ich hatte den mit dem internen Wert calibriert, das hat aber nicht 
geholfen.
Das bringt auch nichts, wenn der am Jittern ist. Der Mega8 ist da noch 
gut, der Mega48/88/168 ist total am Jittern, wenn das dann bei der 
Signalgenerierung passiert, könnte ich mir gut vorstellen, das da 
vielleicht ein paar Bits nicht mehr erkannt werden ??
Ich hab hier das dazu passende Mesbild mal angehängt, Quelle dazu ist:
http://www.scienceprog.com/avr-internal-oscillator-jitter-research/

Sagt mal, hat schon jemand das Protokol einer Siku Controll angeschaut. 
Das ist eine Infrarot Fernbedienung für Modellauutos, wird gerner im 
1/87 bereich benutzt. Das läuft allerdings mit 455khz und ist ständig am 
senden.

Gruß

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Neue Version 1.5.0 von IRMP verfügbar, Download unter

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

Änderungen:

 - Neues Protokoll: SIEMENS (Gigaset)

Ebenso ist nun die Version 1.5.0 von IRSND verfügbar, Download unter

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

Änderungen:

 - Neues Protokoll: Siemens (Gigaset)
 - Simulation von langen Tastendrücken durch Angabe von Wiederholungen
   in der Variablen irmp_data.flags.

irmp_data_p.flags gibt die Anzahl der Wiederholungen an, z.B.

 irmp_data_p.flags = 0: Verhalten wie bisher
 irmp_data_p.flags = 1: 1 Wiederholung, d.h. Ausgabe von 2 Frames
 irmp_data_p.flags = 2: 2 Wiederholungen, d.h. Ausgabe von 3 Frames
 usw.

Sind Wiederholungen angegeben, wird entweder der Frame nach einer Pause 
(protokollabhängig) neu ausgegeben oder ein protkollspezifischer 
Wiederholungsframe (z.B. für NEC) gesendet.

ZU BEACHTEN:

Da bisher irmp_data_p.flags von IRSND nicht ausgewertet wurde, ist 
unbedingt ab Version 1.5.0 darauf zu achten, dass irmp_data_p.flags vor 
dem Aufruf von irsnd_send_data() einen definierten Wert hat!

Viel Spaß,

Frank

von eku (Gast)


Lesenswert?

Hallo Frank!

Frank M. schrieb:
> Das Problem bei Dir muss woanders liegen. Ein Grund könnte sein, dass
> bei 15kHz der Time-Slot für die 15kHz-ISR zu eng wird, d.h. also
> Interrupts verlorengehen. Dagegen spricht, dass das Siemens-Protokoll
> immer noch korrekt erkannt wird. Ausserdem dürfte Deine 16-Bit-Version
> das Laufzeitverhalten noch weiter verschlimmern. Hattest Du vielleicht
> bei der 8-Bit-Version und F_INTERRUPTS = 15kHz noch das IRMP_LOGGING
> aktiviert? Das kostet natürlich auch noch einiges an Zeit.


Ich bin am verzweifeln. Nutze Timer0 eines Mega32 als freilaufende 
Zähler (gemäß Peter Danegger) für die 15kHz-Interruptquelle. Will 
einfach nicht funktionieren. An der Interrupthäufigkeit kann es 
eigentlich nicht liegen.
Hast Du noch 'ne Idee, wo ich suchen könnte?

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Hi eku,

> Ich bin am verzweifeln. Nutze Timer0 eines Mega32 als freilaufende
> Zähler (gemäß Peter Danegger) für die 15kHz-Interruptquelle. Will
> einfach nicht funktionieren. An der Interrupthäufigkeit kann es
> eigentlich nicht liegen.

Es ist also weiterhin so, dass bei 15kHz nur das Siemens-Protokoll 
funktioniert? Die anderen nur bei Verbreiterung der Zählervariablen auf 
16 Bit?

Zeigst Du mal Deine Timer-(Initialisierungs-)Routinen?

Gruß,

Frank

von eku (Gast)


Lesenswert?

Frank M. schrieb:
> Zeigst Du mal Deine Timer-(Initialisierungs-)Routinen?
1
#define IR_HZ          15000    /* interrupts per second */
2
3
#define MAX_OVERFLOW   255UL
4
#if (F_CPU/IR_HZ) < MAX_OVERFLOW
5
#define HW_PRESCALER   1UL
6
#define HW_PRESCALER_MASK  _BV(CS00)
7
#elif (F_CPU/IR_HZ/8) < MAX_OVERFLOW
8
#define HW_PRESCALER   8UL
9
#define HW_PRESCALER_MASK  _BV(CS01)
10
#elif (F_CPU/IR_HZ/64) < MAX_OVERFLOW
11
#define HW_PRESCALER   64UL
12
#define HW_PRESCALER_MASK  _BV(CS01)|_BV(CS00)
13
#elif (F_CPU/IR_HZ/256) < MAX_OVERFLOW
14
#define HW_PRESCALER   256UL
15
#define HW_PRESCALER_MASK  _BV(CS02)
16
#elif (F_CPU/IR_HZ/1024) < MAX_OVERFLOW
17
#define HW_PRESCALER   1024UL
18
#define HW_PRESCALER_MASK  _BV(CS02)|_BV(CS00)
19
#else
20
#error F_CPU to large
21
#endif
22
#define SW_PRESCALER   ((F_CPU/HW_PRESCALER)/IR_HZ)
23
24
static uint16_t prescaler;
25
26
init()
27
{
28
  /* init timer0 to expire after 1000/IR_HZ ms */
29
  TCCR0 = HW_PRESCALER_MASK;
30
  OCR0 = SW_PRESCALER - 1;
31
  TCNT0 = 0;
32
  prescaler = (uint16_t) IR_HZ;
33
34
  /* enable interrupt */
35
  TIMSK |= _BV (OCIE0);
36
}
37
38
ISR (TIMER0_COMP_vect)
39
{
40
  uint8_t data = PIN (IR_RX_PORT) & _BV (IR_RX_PIN);
41
42
  if (data == IR_RX_MARK)
43
    IR_RX_LED_ON; /* Kontroll-LED */
44
  else
45
    IR_RX_LED_OFF;
46
47
  ir_rx_process (data);
48
49
  if (--prescaler == 0)
50
    prescaler = (uint16_t) IR_HZ;
51
#if (F_CPU/HW_PRESCALER) % IR_HZ
52
  if (prescaler <= (F_CPU / HW_PRESCALER) % IR_HZ)
53
    OCR0 += SW_PRESCALER + 1;   /* um 1 Takt längere Periode um
54
                                   den Rest abzutragen */
55
  else
56
#endif
57
    OCR0 += SW_PRESCALER;       /* kurze Periode */
58
}

von eku (Gast)


Lesenswert?


von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

eku schrieb:
1
> #define IR_HZ          15000    /* interrupts per second */

Ich verstehe nicht, warum Du es Dir so schwer machst. Du musst nicht 
genau auf 15000 Hz kommen, es ist nur wichtig, dass F_INTERRUPTS exakt 
ist. Wenn
also für ein bestimmtes TCCR0 und OCR0 etwa 14750 Hz rauskommen, dann 
stellst Du halt F_INTERRUPTS auf 14750 und gut ist.
1
> #error F_CPU to large

Ohne die Angabe von F_CPU sind die Preprocessor-Makros für mich schlecht 
nachvollziehbar. Sind es 8MHz mit internem Oszillator?
1
  ir_rx_process (data);

Was ist ir_rx_process()? Entspricht das der ISR vom IRMP? Ich vermute, 
Du hast soviel im Source umgebaut, dass es vielleicht deshalb nicht mehr 
funktioniert.

Ausserdem hast Du meine beiden Fragen nicht beantwortet, hier nochmal:

Es ist also weiterhin so, dass bei 15kHz nur das Siemens-Protokoll
funktioniert? Die anderen nur bei Verbreiterung der Zählervariablen auf
16 Bit?

Also:

A. Berechne einfach geeignete Werte für TCCR0 und OCR0, so dass das
   Ergebnis möglichst knapp unter 15000 ist.

B. Setze F_INTERRUPTS auf den exakten berechneten Wert.

C. Rufe in ISR(TIMER0_COMP_vect) einfach nur irmp_ISR() auf


Gruß,

Frank

von eku (Gast)


Lesenswert?

Frank M. schrieb:
> eku schrieb:
>> #define IR_HZ          15000    /* interrupts per second */
>
> Ich verstehe nicht, warum Du es Dir so schwer machst. Du musst nicht
> genau auf 15000 Hz kommen, es ist nur wichtig, dass F_INTERRUPTS exakt
> ist. Wenn also für ein bestimmtes TCCR0 und OCR0 etwa 14750 Hz
> rauskommen, dann stellst Du halt F_INTERRUPTS auf 14750 und gut ist.
>> #error F_CPU to large

Mein AVR soll neben IRMP noch andere Aufgaben erfüllen, mit nur einer
ISR. Warum soll ich Werte selbst berechnen, wenn es der Präprozessor 
übernimmt.

> Ohne die Angabe von F_CPU sind die Preprocessor-Makros für mich
> schlecht nachvollziehbar. Sind es 8MHz mit internem Oszillator?

16MHz Quarz

>   ir_rx_process (data);
>
> Was ist ir_rx_process()? Entspricht das der ISR vom IRMP? Ich vermute,
> Du hast soviel im Source umgebaut, dass es vielleicht deshalb nicht
> mehr funktioniert.

Nö, ich habe IRMP und IRSND in eine Bibliothek gepackt. Den eingelesenen 
Wert gebe ich an irmp_ISR(). Ansonsten habe ich nichts verändert.

> Ausserdem hast Du meine beiden Fragen nicht beantwortet, hier nochmal:
>
> Es ist also weiterhin so, dass bei 15kHz nur das Siemens-Protokoll
> funktioniert? Die anderen nur bei Verbreiterung der Zählervariablen
> auf 16 Bit?

Ja, bis auf Denon funktionieren die anderen Protokolle mit 15kHz und 
16Bit-Zählern.

> Also:
>
> A. Berechne einfach geeignete Werte für TCCR0 und OCR0, so dass das
>    Ergebnis möglichst knapp unter 15000 ist.
>
> B. Setze F_INTERRUPTS auf den exakten berechneten Wert.
>
> C. Rufe in ISR(TIMER0_COMP_vect) einfach nur irmp_ISR() auf

Probeweise werde ich das mal so machen. Mittelfristig soll IRMP/IRSND 
aber im Kontext meiner Anwendung für den AVR laufen. Ich stelle mir das 
als Modul für Ethersex auf einem Pollin Net-IO vor. Kommando- und 
Webinterface zur Fernbedienung der HiFi-Geräte.

von eku (Gast)


Lesenswert?

Frank M. schrieb:
> A. Berechne einfach geeignete Werte für TCCR0 und OCR0, so dass das
>    Ergebnis möglichst knapp unter 15000 ist.
>
> B. Setze F_INTERRUPTS auf den exakten berechneten Wert.

F_INTERUPTS=16000000/8/133=15037

Siemens, Nokia, RCx, Nec, Grundig gehen, nur Denon nicht. Hilft ein 
IRMP_LOGGING zur Analyse?

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

eku schrieb:

> Siemens, Nokia, RCx, Nec, Grundig gehen

Auch mit 8-Bit-Zählern? Freut mich.

> nur Denon nicht. Hilft ein IRMP_LOGGING zur Analyse?

Ja.

Gruß,

Frank

von eku (Gast)


Angehängte Dateien:

Lesenswert?

Frank M. schrieb:
>> Siemens, Nokia, RCx, Nec, Grundig gehen
>
> Auch mit 8-Bit-Zählern? Freut mich.

Ja. Mit 20kHz läuft dann aber der Pausenzähler über. Bemerkt schon der 
Compiler

>> nur Denon nicht. Hilft ein IRMP_LOGGING zur Analyse?
>
> Ja.

Anbei. Diesmal habe ich die bei 10kHz dekodierten Codes vor die Sequenz 
geschrieben. Hoffe das hilft. Bei 20kHz wird es mit Denon nicht besser. 
Ich hatte zu8nächste Rundungsfehler bei den Konstanten (10kHz +50%) in 
Verdacht, aber die Verdoppelung macht es nicht besser.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

eku schrieb:

> Ja. Mit 20kHz läuft dann aber der Pausenzähler über. Bemerkt schon der
> Compiler

Gut, das habe ich auch erwartet.

> Anbei. Diesmal habe ich die bei 10kHz dekodierten Codes vor die Sequenz
> geschrieben. Hoffe das hilft. Bei 20kHz wird es mit Denon nicht besser.

Ersetze in irmp.c die Zeile
1
#define DENON_1_PAUSE_LEN_MIN                   ((uint8_t)(F_INTERRUPTS * DENON_1_PAUSE_TIME * MIN_TOLERANCE_20 + 0.5) - 1)

durch
1
#define DENON_1_PAUSE_LEN_MIN                   ((uint8_t)(F_INTERRUPTS * DENON_1_PAUSE_TIME * MIN_TOLERANCE_30 + 0.5) - 1)

Dann geht es.

Gruß,

Frank

von eku (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Frank!

Frank M. schrieb:
> Ersetze in irmp.c die Zeile

Geht. Pefekt. Ich hoffe, auch den Sendeteil bald testen zu können.

PS: Es kommt keine Warnung wenn, Siemens mit 10kHz compiliert wird.

PS2: Einen hab' ich noch :-) Siehe Anhang. Ist eine IR-Tastatur aus 
China (Pollin 711 056). IRMP dekodiert bei 15kHz RCx + Siemens je Taste.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

eku schrieb:

> Geht. Pefekt. Ich hoffe, auch den Sendeteil bald testen zu können.

Na slso.

> PS: Es kommt keine Warnung wenn, Siemens mit 10kHz compiliert wird.

Das verstehe ich nicht. Wann kommt denn eine Warnung? Die Aussage, wann 
keine Warnung kommt, hilft mir nicht weiter. Redest Du von IRMP oder 
IRSND?

Am besten zeigst Du mal den Compiler-Output.

> PS2: Einen hab' ich noch :-) Siehe Anhang. Ist eine IR-Tastatur aus
> China (Pollin 711 056). IRMP dekodiert bei 15kHz RCx + Siemens je Taste.

Ein 42-Bit-Protokoll, keine Ahnung, was das sein soll. Aber relativ 
einfach zu dekodieren - allerdings nicht mehr bei 10 kHz. Ich schaue mir 
das mal näher an.

Gruß,

Frank

von Frank M. (ukw) (Moderator) Benutzerseite


Angehängte Dateien:

Lesenswert?

Frank M. schrieb:
> eku schrieb:
>> PS2: Einen hab' ich noch :-) Siehe Anhang. Ist eine IR-Tastatur aus
>> China (Pollin 711 056). IRMP dekodiert bei 15kHz RCx + Siemens je Taste.
>
> Ein 42-Bit-Protokoll, keine Ahnung, was das sein soll. Aber relativ
> einfach zu dekodieren - allerdings nicht mehr bei 10 kHz. Ich schaue mir
> das mal näher an.

Habe das Protokoll soweit dekodiert. Von den insgesamt 42 Bits (1 
Start-Bit, 40 Daten-Bits, 1 Stop-Bit) werden nur effektiv 12 Bits 
genutzt. Anbei eine Testversion. Nette Geschichte, damit kann man eine 
PC-Tastatur einfach an einen µC anbinden.

Wäre klasse, wenn Du mal sämtliche Tasten scannen könntest, ich habe 
noch nicht entscheiden können, ob das Protokoll mit LSB- oder MSB-first 
funktioniert. Meine Vermutung ist LSB-first, aber richtig kann man das 
erst erkennen, wenn sämtliche Tasten der Matrix (es sieht nach einem 
Matrix-Code aus) bekannt ist.

Auf jeden Fall bestelle ich mir mal ein paar von den Dingern. Bei 1,95 
EUR ist das ja kein großes Risiko ;-)

Gruß,

Frank

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Frank M. schrieb:

> Ersetze in irmp.c die Zeile
1
> #define DENON_1_PAUSE_LEN_MIN     ((uint8_t)(F_INTERRUPTS * DENON_1_PAUSE_TIME * MIN_TOLERANCE_20 + 0.5) - 1)
> durch
1
> #define DENON_1_PAUSE_LEN_MIN     ((uint8_t)(F_INTERRUPTS * DENON_1_PAUSE_TIME * MIN_TOLERANCE_30 + 0.5) - 1)
> Dann geht es.

Nach nochmaligem Studium von

   http://www.mikrocontroller.com/de/IR-Protokolle.php#DENON

habe ich festgestellt, dass die obige Lösung den Fehler nur vertuscht 
hat. In Wirklichkeit ist der Timing-Wert in irmp.h
1
#define DENON_0_PAUSE_TIME                       1050.0e-6                      //  1050 usec pause

falsch. Es muss heissen:
1
#define DENON_0_PAUSE_TIME                       775.0e-6                       //  775 usec pause

Dann kann man den Toleranzwert für DENON_1_PAUSE_LEN_MIN wieder auf 20 
Prozent zurückschrauben, also die obige Änderung in irmp.c wieder 
rückgängig machen, denn die Abweichungen der Denon-FB von den 
Idealwerten sind dann wieder wesentlich geringer.

Sorry, mein Fehler. Werde ich im nächsten Release berücksichtigen.

Gruß,

Frank

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Neue Version 1.6.0 von IRMP verfügbar, Download unter

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

Änderungen:

 - Neues Protokoll: FDC (IR keyboard)
 - Timings vom DENON-Protokoll korrigiert

Ebenso ist nun die Version 1.5.0 von IRSND verfügbar, Download unter

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

Änderungen:

 - Neues Protokoll: FDC (IR keyboard)
 - Timings vom DENON-Protokoll korrigiert

Damit kann man nun die bei Pollin erhältliche Infrarot-Tastatur FDC-3402 
(Bestellnr. 711 056) auch am µC nutzen.

Achtung:

Die Protokolle SIEMENS und FDC werden sowohl für IRMP als auch für IRSND 
beim Compilieren automatisch abgeschaltet, wenn F_INTERRUPTS kleiner als 
14500 Hz ist. Grund: Die Erkennung bei niedrigeren Scan-Raten ist nicht 
stabil.

Das ganze erkennt man in irmpconfig.h an folgendem Block:
1
/*--------------------------------------------------------------------------------------------------------------
2
 * Change settings from 1 to 0 if you want to disable one or more decoders.
3
 * This saves program space.
4
 * 1 enable  decoder
5
 * 0 disable decoder
6
 *---------------------------------------------------------------------------------------------------------------
7
 */
8
#define IRMP_SUPPORT_SIRCS_PROTOCOL             1       // flag: support SIRCS                 uses ~100 bytes
9
#define IRMP_SUPPORT_NEC_PROTOCOL               1       // flag: support NEC + APPLE           uses ~250 bytes
10
#define IRMP_SUPPORT_SAMSUNG_PROTOCOL           1       // flag: support Samsung + Samsung32   uses ~250 bytes
11
#define IRMP_SUPPORT_MATSUSHITA_PROTOCOL        1       // flag: support Matsushita            uses  ~50 bytes
12
#define IRMP_SUPPORT_KASEIKYO_PROTOCOL          1       // flag: support Kaseikyo              uses  ~50 bytes
13
#define IRMP_SUPPORT_RECS80_PROTOCOL            1       // flag: support RECS80                uses  ~50 bytes
14
#define IRMP_SUPPORT_RC5_PROTOCOL               1       // flag: support RC5                   uses ~250 bytes
15
#define IRMP_SUPPORT_DENON_PROTOCOL             1       // flag: support DENON                 uses ~250 bytes
16
#define IRMP_SUPPORT_RC6_PROTOCOL               1       // flag: support RC6                   uses ~200 bytes
17
#define IRMP_SUPPORT_RECS80EXT_PROTOCOL         1       // flag: support RECS80EXT             uses  ~50 bytes
18
#define IRMP_SUPPORT_NUBERT_PROTOCOL            1       // flag: support NUBERT                uses  ~50 bytes
19
#define IRMP_SUPPORT_BANG_OLUFSEN_PROTOCOL      1       // flag: support Bang & Olufsen        uses ~200 bytes
20
#define IRMP_SUPPORT_GRUNDIG_PROTOCOL           1       // flag: support Grundig               uses ~150 bytes
21
#define IRMP_SUPPORT_NOKIA_PROTOCOL             1       // flag: support Nokia                 uses ~150 bytes
22
23
/*--------------------------------------------------------------------------------------------------------------
24
 * THE FOLLOWING DECODERS WORK ONLY FOR F_INTERRUPTS > 14500!
25
 *---------------------------------------------------------------------------------------------------------------
26
 */
27
#if F_INTERRUPTS >= 14500
28
#define IRMP_SUPPORT_SIEMENS_PROTOCOL           1       // flag: support Siemens Gigaset       uses ~150 bytes
29
#define IRMP_SUPPORT_FDC_PROTOCOL               1       // flag: support FDC keyboard          uses ~150 bytes
30
#else
31
#define IRMP_SUPPORT_SIEMENS_PROTOCOL           0       // DO NOT CHANGE! F_INTERRUPTS too low!
32
#define IRMP_SUPPORT_FDC_PROTOCOL               0       // DO NOT CHANGE! F_INTERRUPTS too low!
33
#endif

Analoges gilt für irsndconfig.h.

Den IRMP-Artikel habe ich an den entsprechenden Stellen angepasst.

@Hugo Portisch:

Warte bitte noch ein wenig mit der Umsetzung auf die V-USB-Version, ich 
schätze, dass ich bzgl. des FDC-Protokolls noch etwas anpassen muss.

Gruß,

Frank

von eku (Gast)


Lesenswert?

Hallo Frank!

Vielen Danke für die prompte Reaktion. Ich komme erst am Abend zum 
Testen.

Ich hätte da noch ein paar Änderungswünsche für IRMP um mir dsa Patchen 
der Quellen zu ersparen:
1
Index: irmpconfig.h
2
===================================================================
3
--- irmpconfig.h        (Revision 21)
4
+++ irmpconfig.h        (Arbeitskopie)
5
@@ -81,6 +81,8 @@
6
  * Set IRMP_LOGGING to 1 if want to log data to UART with 9600Bd^M
7
  *---------------------------------------------------------------------------------------------------------------------------------------------------^M
8
  */^M
9
+#ifndef IRMP_LOGGING^M
10
 #define IRMP_LOGGING                            0                             // 1: log IR signal (scan), 0: do not (default)^M
11
+#endif^M
12
 ^M
13
 #endif /* _WC_IRMPCONFIG_H_ */^M

Der UART-Code kompoliert nicht auf einem Mega32. Die Registernamen 
enthalten keine Null ('0'). Die Initialisierung der Baudrate besser wie 
folgt (Mega32, andere Registernamen anpassen):
1
#define BAUD UART_BAUD
2
#include <util/setbaud.h>
3
4
  UBRRH = UBRRH_VALUE;          /* set baud rate */
5
  UBRRL = UBRRL_VALUE;
6
#if USE_2X
7
  UCSRA = _BV (U2X);
8
#else
9
  UCSRA = 0;
10
#endif
11
#ifdef URSEL
12
  UCSRC = _BV (UCSZ1) ^ _BV (UCSZ0) ^_BV (URSEL);
13
#else
14
  UCSRC = _BV (UCSZ1) ^ _BV (UCSZ0);    /* 8 Bit */
15
#endif
16
  UCSRB = _BV (TXEN);           /* enable TX */

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

eku schrieb:
> Ich hätte da noch ein paar Änderungswünsche für IRMP um mir dsa Patchen
> der Quellen zu ersparen:

Ich habe Deine Änderungswünsche eingearbeitet und bei der Gelegenheit 
die UART-Register bzw. -Kontanten portabel definiert, so dass das 
Übersetzen nun auf jedem ATMEGA funktionieren sollte.

Kommt dann im nächsten Release.

Gruß,

Frank

von Hugo P. (portisch)


Lesenswert?

>>@Hugo Portisch:

>>Warte bitte noch ein wenig mit der Umsetzung auf die V-USB-Version, ich
>>schätze, dass ich bzgl. des FDC-Protokolls noch etwas anpassen muss.

Ok, danke für die Info!

Wie sieht denn dann der empfange Code der FDC aus?
Also als IRMP_DATA Struct?

Stehen in Command dann die ASCII Werte?
Was für Werte hat z.B. die Windows Taste, STRG, Alt,...

Entsprechen diese dieser Liste:
http://msdn.microsoft.com/en-us/library/ms645540.aspx

Bitte 1-2 Beispiele als irmp_data posten damit ich das sehen kann. 
Danke!

Ich hätte nähmlich die Idee, wenn das FDC Protokoll empfangen wird dies 
direkt von der DLL in Tastendrücke umzuwandeln damit es wie eine 
"normale" Tastatur funktioniert.

Da bin ich einmal gespannt. Beim letzten Protokoll (Siemens) waren nur 
mehr 98 Bytes von meinem Atmega8 frei (8k - 2k Bootloader). Jetzt wird 
es schon happig alle Protokolle mit hineinzupacken...

von eku (Gast)


Lesenswert?

Hugo Portisch schrieb:
> Wie sieht denn dann der empfange Code der FDC aus?
> Also als IRMP_DATA Struct?
>
> Stehen in Command dann die ASCII Werte?
> Was für Werte hat z.B. die Windows Taste, STRG, Alt,...

Eher nicht. Bislang ist noch unklar, ob fürs Drücken und Loslassen 
getrennte Codes gesendert werden.

von Hugo P. (portisch)


Lesenswert?

>>Eher nicht. Bislang ist noch unklar, ob fürs Drücken und Loslassen
>>getrennte Codes gesendert werden.

Auch wär interressant wie es dann mit mehreren Tastendrücke aussieht. 
Also z.B. STRG-C, WIN-D, SHIFT-A, STRG-ALT-ENTF,....

von Frank M. (ukw) (Moderator) Benutzerseite


Angehängte Dateien:

Lesenswert?

Hugo Portisch schrieb:

> Wie sieht denn dann der empfange Code der FDC aus?
> Also als IRMP_DATA Struct?

Ich habe mal den Output vom IRMP unter Linux angehängt.

> Stehen in Command dann die ASCII Werte?
> Was für Werte hat z.B. die Windows Taste, STRG, Alt,...

Nein, für mich sieht das wie ein Matrix-Code aus, halt so, wie die 
Tastatur verdrahtet ist. Vielleicht kannst Du ja mehr damit anfangen.

Im Moment werte ich die Bits 0-15 als Adresse, die Bits 25-36 als 
Kommando aus. Wenn man sich den Scan der FDC-Tastatur im Detail (siehe 
irmp-fdc-detail.txt) anschaut, dann sieht man, dass bei der 
"Wiederholung" sich in den Bits 20-24 etwas ändert. Ob das jetzt ein 
Repetition-Code ist, der durch längeres Drücken entstanden ist, oder 
tatsächlich die Zustände "Drücken" und "Loslassen" beschreibt, weiss ich 
noch nicht. Dazu habe ich noch zu wenig Infos.

> Ich hätte nähmlich die Idee, wenn das FDC Protokoll empfangen wird dies
> direkt von der DLL in Tastendrücke umzuwandeln damit es wie eine
> "normale" Tastatur funktioniert.

Jau :-)

Eher noch interessanter finde ich, einen µC einfachst mit einer 
kompletten PC-Tastatur auszustatten - für die Bedienung von Menüs, 
Konfigurationen etc.

> Da bin ich einmal gespannt. Beim letzten Protokoll (Siemens) waren nur
> mehr 98 Bytes von meinem Atmega8 frei (8k - 2k Bootloader). Jetzt wird
> es schon happig alle Protokolle mit hineinzupacken...

Das wird knapp.

Ich sehe da aber noch Einsparungspotential. Durch geeignete 
Parametrisierung könnte ich die Behandlung der Manchester-basierten 
Protokolle (Bi-Phase) für RC5, RC6, GRUNDIG, NOKIA und SIEMENS noch 
weiter zusammenfassen und dadurch Code einsparen. Könnte dann aber etwas 
CPU-intensiver werden.

Gruß,

Frank

von Frank M. (ukw) (Moderator) Benutzerseite


Angehängte Dateien:

Lesenswert?

Hier nochmal eine kompaktere Darstellung, siehe Anhang. Sehr schön sieht 
man hier, dass die 4 Bits 20-23 in der Wiederholung von 0 auf 1 
wechseln.

Entweder ist das ein "Loslassen"-Flag oder das Zeichen für eine 
Wiederholung. Das müsste eku mal systematisch testen - durch kurze und 
lange Tastendrücke.

Da bei einigen Tasten der zweite Frame fehlt, nehme ich mal an, dass eku 
hier die jeweilige Taste nur kurz gedrückt hat. Damit wären die 4 
1er-Bits ein Zeichen für die Wiederholung, nicht das Loslassen.

Gruß,

Frank

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Frank M. schrieb:

> Nein, für mich sieht das wie ein Matrix-Code aus, halt so, wie die
> Tastatur verdrahtet ist. Vielleicht kannst Du ja mehr damit anfangen.

Es ist definitiv ein Matrix-Code, ich habe mal die mir zur Verfügung 
stehenden Tasten-Scans bitweise gruppiert:
1
# 1
2
  ADRESSE        ??????   REPEAT ?????    SPALTE  ZEILE  ?
3
11111100000000   000000   0000   010000    00101  1111   1
4
11111100000000   000000   1111   010000    00101  1111   1
5
-------------------------------------------------------------------
6
# 2
7
11111100000000   000000   0000   110000    00001  1111   1
8
11111100000000   000000   1111   110000    00001  1111   1
9
-------------------------------------------------------------------
10
# 3
11
11111100000000   000000   0000   001000    00110  1111   1
12
11111100000000   000000   1111   001000    00110  1111   1

Dann ergibt sich folgende Matrix, die genau zu obigem Schema passt:

1
         Spalte   Spalte   Spalte   Spalte   Spalte   Spalte   Spalte             Spalte   Spalte   Spalte   Spalte
2
          00011    00101    00001    00110    00010    00100    00000              00111    00011    00101    00001
3
       +--------+--------+--------+--------+--------+--------+--------+         +--------+--------+--------+--------+--------+--------+
4
       +        +        +        +        +        +        +        +         +        +        +        +        +        +        +
5
 ZEILE +        +   1    +   2    +   3    +   4    +   5    +   6    +   ZEILE +    7   +    8   +    9   +   0    +        +        +
6
  1111 +        +        +        +        +        +        +        +    0111 +        +        +        +        +        +        +
7
       +--------+--------+--------+--------+--------+--------+--------+         +--------+--------+--------+--------+--------+--------+
8
         Spalte   Spalte   Spalte   Spalte   Spalte   Spalte   Spalte             Spalte   Spalte   Spalte   Spalte
9
          00011    00101    00001    00110    00010    00100    00000              00111    00011    00101    00001
10
       +--------+--------+--------+--------+--------+--------+--------+         +--------+--------+--------+--------+--------+--------+
11
       +        +        +        +        +        +        +        +         +        +        +        +        +        +        +
12
 ZEILE +   Q    +   W    +   E    +   R    +   T    +   Z    +   U    +   ZEILE +    I   +    O   +    P   +        +        +        +
13
  1011 +        +        +        +        +        +        +        +    0011 +        +        +        +        +        +        +
14
       +--------+--------+--------+--------+--------+--------+--------+         +--------+--------+--------+--------+--------+--------+
15
         Spalte   Spalte   Spalte   Spalte   Spalte   Spalte   Spalte             Spalte   Spalte   Spalte   Spalte
16
          00011    00101    00001    00110    00010    00100    00000              00111    00011    00101    00001
17
       +--------+--------+--------+--------+--------+--------+--------+         +--------+--------+--------+--------+--------+--------+
18
       +        +        +        +        + LEER   +        +        +         +        +        +        +        +        +        +
19
 ZEILE +        +        +        +        + TASTE  +        +        +   ZEILE +        +        +        +        +        +        +
20
  0001 +        +        +        +        +        +        +        +    ???? +        +        +        +        +        +        +
21
       +--------+--------+--------+--------+--------+--------+--------+         +--------+--------+--------+--------+--------+--------+

Leider hat eku nur die Tasten 1234567890, qwertzuiop und die Leertaste 
gescannt. Bis dahin passt das Schema aber wie die Faust aufs Auge.

Fragt sich nur, was die Bits bedeuten, die ich mit Fragezeichen versehen 
habe. Vielelicht die Bits für STRG, ALT, SHIFT?

Bin gespannt auf mehr Input von eku.

Gruß,

Frank

von eku (Gast)


Lesenswert?

Frank M. schrieb:
> Leider hat eku nur die Tasten 1234567890, qwertzuiop und die Leertaste
> gescannt. Bis dahin passt das Schema aber wie die Faust aufs Auge.

Nun sei doch nicht su ungeduldig :-) Kommt Zeit, kommt Scan :-)

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

eku schrieb:
> Nun sei doch nicht su ungeduldig :-) Kommt Zeit, kommt Scan :-)

Och, lass mich doch... das ist spannender als Sudoku-Spielen ;-)

Gruß,

Frank

von Torsten K. (nobby)


Lesenswert?

Hallo,

ich bekomme leider mit der Pollin Tastatur immer nur RC5 oder Siemens 
Protokoll angezeigt. Bei mit läuft das ganze auf einem Mega 168 mit 8mHz 
Quarz.
Hab natürlich die Version 1.6 und den  F_INTERRUPTS auf 15000 gestellt.

Gruß
Torsten

von eku (Gast)


Lesenswert?

Frank M. schrieb:
> Ich habe Deine Änderungswünsche eingearbeitet und bei der Gelegenheit
> die UART-Register bzw. -Kontanten portabel definiert, so dass das
> Übersetzen nun auf jedem ATMEGA funktionieren sollte.
>
> Kommt dann im nächsten Release.

Ich nutze SVN und freue mich über jeden Commit. Ich brauche kein 
Release, Zwischenstand aus SVN reicht mit.

von Torsten K. (nobby)


Angehängte Dateien:

Lesenswert?

Ich hab hier mal einen kleinen Scan von den Tasten 0 bis 9 eingestellt, 
vielleicht hilft das für eine kurze Analyse.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Torsten Kalbe schrieb:
> Ich hab hier mal einen kleinen Scan von den Tasten 0 bis 9 eingestellt,
> vielleicht hilft das für eine kurze Analyse.

Deine Tastatur hat ein ganz anderes Timing.

Die Pulszeiten in Deinem Scan sind etwa doppelt so lang wie die bei eku. 
Ausserdem gibt es zwischendurch "Aussetzer", wo die Pulszeiten sogar auf 
die 4-fache Länge anwachsen.

Dagegen haben die Pause-Zeiten nur die Hälfte der Länge wie bei der 
Tastatur von eku - und das mit einer erheblichen Streuung.

Ein paar Fragen dazu:

1. Bist Du sicher, dass der Interrupt-Takt 15kHz und nicht mehr beträgt?

2. Welchen Timer benutzt Du?

3. Werden andere FBs bei 15kHz und 8MHz-Takt ohne Probleme erkannt?

4. Gab es Compiler-Warnungen?

5. Bist Du sicher, dass der Quarz auch genutzt wird und nicht nur der
   interne Oszillator läuft?

Vielleicht reicht auch bei der Vielzahl der mittlerweile unterstützten 
Protokolle und dem erhöhten Interrupt-Takt von 15kHz der Takt von 8MHz 
nicht mehr aus.

Schalte mal soviel wie möglich an Protokollen ab und teste dann nochmal.

Ich habe mir die Tastatur mittlerweile selbst bestellt, damit ich in den 
nächsten Tagen auch mal selbst testen kann.

Gruß,

Frank

von Torsten K. (nobby)


Lesenswert?

Na,

also was den Quarz angeht, das habe ich im AVR Studio so eingestellt, 
bzw. die Fuse so gesetzt.

Ob der Proz. wirklich den Interrupt-Takt 15kHz hat müßte ich mal 
nachschauen/messen.
Ich nutze den OCR1A.
Andere FBs mit 15kHz habe ich nicht.

Ich werde morgen mal nachmessen, ich kann auch den wirklichen Takt des 
IR Signals mal mit dem Scope nachmessen, dann sehen wir ja was los ist.

Gruß
Torsten

von eku (Gast)


Lesenswert?

Hallo Frank!

Änderungswunsch für irmp_ISR(): return irmp_ir_detected;

Vorteil: nach Aufruf von irmp_ISR() weiß der Aufrufer sofort, ob eine 
Sequenz dekodiert wurde und muss nicht extra irmp_get_data() aufrufen. 
Konsequenterweise könnte der Test auf irmp_ir_detected in 
irmp_get_data() entfallen. "Geradeaus-" uns "Kasko-"Programmierer 
benötigen den Test.

Vergelcihe mit irsnd_ISR(): liefert irsnd_busy zurück. Die 
while-Schleife in irsnd_send_data() finde ich schlecht. Sowas regelt man 
über Return-Codes. Soll doch der Aufrufer entscheiden, wie er darauf 
reagiert.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

eku schrieb:

> Änderungswunsch für irmp_ISR(): return irmp_ir_detected;

Kann ich gerne einbauen. Ich selbst würde das aber nicht nutzen und auch 
nicht in Beispielen dokumentieren. Denn normalerweise wird irmp_ISR() 
aus einer Interrupt-Funktion aufgerufen... und diese ist 
definitionsgemäß void.

Okay, Du könntest Dir dann in der Applikation eine globale Variable 
setzen und dann irmp_get_data() gezielt aufrufen.

Aber wo ist der Unterschied? irmp_get_data() macht sofort einen return, 
wenn irmp_ir_detected == FALSE. Das einzige, was Du maximal sparst, ist 
ein Funktionsaufruf.

> Vorteil: nach Aufruf von irmp_ISR() weiß der Aufrufer sofort, ob eine
> Sequenz dekodiert wurde und muss nicht extra irmp_get_data() aufrufen.

Ich sehe da keinen Vorteil, sorry. Ich sehe da nur schlechten 
Programmierstil.

> Konsequenterweise könnte der Test auf irmp_ir_detected in
> irmp_get_data() entfallen.

Nein, werde ich auf keinen Fall rausnehmen, sonst muss der Programmierer 
genau das machen, was ich oben beschrieb: irmp_ISR() aufrufen, den 
Return-Wert in einer globalen Variablen speichern und in der 
main-Routine dann auf diese globale Variable testen.

Da ich mich schon seit 25 Jahren mit UNIX beschäftige, selbst auch schon 
einige Device-Treiber für UNIX und LINUX geschrieben habe, denke ich, 
dass mein Verfahren eher einem vernünftigen Interface entspricht.

> "Geradeaus-" uns "Kasko-"Programmierer benötigen den Test.

Was sind "Geradeaus-" uns "Kasko-"Programmierer? ;-)

Beschreibe bitte ein Szenario, wo das nötig ist. Das einzige, was Du mit 
Deinem Verfahren sparst, ist ein Funktionsaufruf aus Deiner 
Main-Routine.

> Vergelcihe mit irsnd_ISR(): liefert irsnd_busy zurück.

Ja, aber nur deshalb, damit man irmp_ISR() und irsnd_ISR() so 
kombinieren kann, dass sie sich nicht ins Gehege kommen, vergleiche dazu 
den IRMP-Artikel:

http://www.mikrocontroller.net/articles/IRMP#Source-Code_2

<zitat>

Möchte man IRMP und IRSND parallel verwenden (also als Sender und 
Empfänger) schreibt man die ISR folgendermaßen:
1
ISR(TIMER1_COMPA_vect)
2
{
3
  if (! irsnd_ISR())          // call irsnd ISR
4
  {                           // if not busy...
5
      irmp_ISR();             // call irmp ISR
6
  }
7
  // call other timer interrupt routines...
8
}

Das heisst: Nur wenn irsnd_ISR() nichts zu tun hat, dann rufe die ISR 
des Empfängers auf. Damit ist der Empfänger solange abgeschaltet, 
während irsnd_ISR() noch Daten sendet. Die Timer-Initialisierungsroutine 
ist für IRMP und IRSND dann natürlich dieselbe.

</zitat>

> Die
> while-Schleife in irsnd_send_data() finde ich schlecht. Sowas regelt man
> über Return-Codes. Soll doch der Aufrufer entscheiden, wie er darauf
> reagiert.

Naja, darüber kann man streiten. Wenn der Ausgangsbuffer eines seriellen 
Kanals voll ist, dann wartet die UNIX-Systemfunktion write() auch, bis 
wieder "Platz" da ist. Jedenfalls im Normalfall - solange man das nicht 
mittels eines ioctl-Aufrufs umstellt. Dasselbe gilt in der Regel 
eigentlich auch für Windows-Systemfunktionen. Analoges gilt auch für 
TCPIP-Stacks, wenn Du da auf Sockets schreibst. Die Dinger warten immer, 
wenn das Gerät (z.B. Ethernet-Karte) zu langsam ist.

<EDIT>
Die Dinger warten immer aus Sicht der Applikation, nicht aus der Sicht 
des Kernels natürlich.
</EDIT>

Ich schlage da folgenden Kompromiss vor:
1
uint8_t irsnd_send_data (IRMP_DATA * irmp_data_p, uint8_t do_wait)

Das heisst: mittels TRUE oder FALSE für do_wait kannst du selbst 
bestimmen, ob irsnd_send_data() sofort mit einem Fehler zurückkommen 
soll oder selbst wartet, bis das "Ausgabegerät" - also die IR-Diode - 
wieder frei ist.

Gruß,

Frank

P.S.
Ich werde im Laufe des Tages mal ein Update im SVN einspielen.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Frank M. schrieb:

> Es ist definitiv ein Matrix-Code, ich habe mal die mir zur Verfügung
> stehenden Tasten-Scans bitweise gruppiert:

Mittlerweile bin ich bei der "Entschlüsselung" weiter. Die Matrix ist 
noch einfacher, als ich zunächst gedacht habe. Ausserdem steckt in dem 
IR-Telegramm der Tastatur Redundanz drin, nämlich nicht nur Zeile und 
Spalte, sondern auch noch ein Key-Code, der sich eigentlich aus Zeile 
und Spalte berechnen lässt.

Im Moment sieht das bisher entschlüsselte Format folgendermaßen aus:
1
-------------------------------------------------------------------
2
# 1
3
  ADRESSE        STATUS   REPEAT KEYCODE   SPALTE ZEILE   KEYCODE Spalte Zeile
4
11111100000000   000000   0000   01000000  1011   1111       2      13    15
5
11111100000000   000000   1111   01000000  1011   1111
6
-------------------------------------------------------------------
7
# 2
8
11111100000000   000000   0000   11000000  0011   1111       3      12    15
9
11111100000000   000000   1111   11000000  0011   1111
10
-------------------------------------------------------------------
11
# 3
12
11111100000000   000000   0000   00100000  1101   1111       4      11    15
13
11111100000000   000000   1111   00100000  1101   1111
14
-------------------------------------------------------------------

(Alle Binärzahlen mit LSB-first lesen!)

Verbleibt nur noch die Entschlüsselung der 6 Bits, die ich mit "STATUS" 
bezeichnet habe. Da vermute ich mal, dass dort die Zustände der 
Sondertasten - wie SHIFT, STRG, ALT usw. - gesendet werden. Es kann 
natürlich auch sein, dass die ADRESSE im Telegramm in Wirklichkeit 
kürzer ist und weitere Bits des Blocks ADRESSE mit Infos versehen sind. 
Die bekomme ich aber erst raus, wenn weitere Scans vorliegen.

Da obige Binär-Zahlengruppen immer mit LSB-first gelesen werden müssen, 
ergibt sich folgende Matrix:
1
         Spalte
2
         15   14   13   12   11   10   9    8    7    6    5    4    3    2    1    0
3
       +----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+
4
 ZEILE +    +    + 1  + 2  + 3  + 4  + 5  + 6  + 7  + 8  + 9  + 0  +    +    +    +    +
5
  15   + 0  + 1  + 2  + 3  + 4  + 5  + 6  + 7  + 8  + 9  + 10 + 11 + 12 + 13 + 14 + 15 +
6
       +----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+
7
 ZEILE +    + Q  + W  + E  + R  + T  + Z  + U  + I  + O  + P  +    +    +    +    +    +
8
  14   + 16 + 17 + 18 + 19 + 20 + 21 + 22 + 23 + 24 + 25 + 26 + 27 + 28 + 29 + 30 + 31 +
9
       +----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+
10
 ZEILE +    +    +    +    +    +    +    +    +    +    +    +    +    +    +    +    +
11
  13   + 32 + 33 + 34 + 35 + 36 + 37 + 38 + 39 + 40 + 41 + 42 + 43 + 44 + 45 + 46 + 47 +
12
       +----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+
13
 ZEILE +    +    +    +    +    +    +    +    +    +    + -  +    +    +LEER+    +    +
14
  12   + 48 + 49 + 50 + 51 + 52 + 53 + 54 + 55 + 56 + 57 + 58 + 59 + 60 + 61 + 62 + 63 +
15
       +----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+

In den Kästchen ist - soweit bekannt - eingetragen:

1. Aufdruck der Taste, also 1234567890, QWERTZUIOP und LEER
2. Keycode der Taste

Gruß,

Frank

von eku (Gast)


Lesenswert?

Frank M. schrieb:
> Okay, Du könntest Dir dann in der Applikation eine globale Variable
> setzen und dann irmp_get_data() gezielt aufrufen.

Interruptroutine und Anwendung (main) sind bei mir über FIFOs sowohl in 
Sende- als auch in Empfangsrichtung ge/ent-koppelt. Das erklärt 
hoffentlich meine Änderungswünsche:
1
ISR (TIMER0_COMP_vect)
2
{
3
  uint8_t data = PIN (IR_RX_PORT) & _BV (IR_RX_PIN);
4
5
  if (data == IR_RX_MARK)
6
    IR_RX_LED_ON;
7
  else
8
    IR_RX_LED_OFF;
9
10
  if (irmp_ISR (data) != 0)
11
    { // Sequenz dekodiert -> umspeichern
12
      uint8_t tmphead = FIFO_NEXT (ir_rx_fifo.write);
13
      if (tmphead != ir_rx_fifo.read)
14
        {
15
          if (irmp_get_data (&ir_rx_fifo.buffer[tmphead]))
16
            ir_rx_fifo.write = tmphead;
17
        }
18
    }
19
#ifdef IR_TX_PORT
20
  if (irsnd_ISR () == 0)
21
    { // Sender frei -> neue Sequenz laden
22
      if (ir_tx_fifo.read != ir_tx_fifo.write)
23
        irsnd_send_data (&ir_tx_fifo.buffer[ir_tx_fifo.read = FIFO_NEXT (ir_tx_fifo.read)]);
24
    }
25
#endif

Eine Verriegelung von Sender und Empfänger habe ich bewusst "ausgebaut".

Ich kann auch weiterhin auf den SVN-Stand meinen Patch anwenden und Du 
lässt alles so wie es ist.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

eku schrieb:

> Interruptroutine und Anwendung (main) sind bei mir über FIFOs sowohl in
> Sende- als auch in Empfangsrichtung ge/ent-koppelt. Das erklärt
> hoffentlich meine Änderungswünsche:

Nett, Du könntest damit ja Megabytes an Daten übertragen ;-)

> Ich kann auch weiterhin auf den SVN-Stand meinen Patch anwenden und Du
> lässt alles so wie es ist.

Nein, ich baue den Return-Wert in irmp_ISR() ja ein, kann ja durchaus 
für manche Szenarien sinnvoll sein. Ebenso das wait-Flag in irsnd_ISR().

Gruß,

Frank

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Sodele, Version 1.6.1 ist nun im SVN.

Änderungen:

 - Interface von irmp_ISR() geändert: gibt flag zurück, ob Frame
   empfangen wurde

 - Interface von irsnd_send_data() geändert: Nun auch Senden ohne
   Warteschleife möglich

 - UART-Routinen angepasst, damit das IRMP-Logging ohne Änderung
   auf allen ATMEGAs läuft

 - Debug-Output-Format angepasst für:

     Silent-Mode:  Option -s
     Verbose-Mode: Option -v
     Normal-Mode:  <keine Option>

Da diese (teils gravierenden) Änderungen noch nicht im IRMP-Artikel 
dokumentiert sind, gibt es auch noch keinen Download über den Artikel. 
Vielmehr werde ich dort vermerken, dass die SVN-Version keine 
Release-Version ist.

Gruß,

Frank

von eku (Gast)


Lesenswert?

Frank M. schrieb:
> Ich werde im Laufe des Tages mal ein Update im SVN einspielen.

Danke, aber UART0_UDR ist nicht definiert. Fehlt im Block '#ifdef 
UBRR0H'.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

eku schrieb:
> Danke, aber UART0_UDR ist nicht definiert. Fehlt im Block '#ifdef
> UBRR0H'.

Upps, ich hatte das durch eine schematische Änderung in die Konstante 
UART0_UDR_BIT_VALUE geändert... war natürlich Käse.

Ist korrigiert,

Frank

von Torsten K. (nobby)


Lesenswert?

Hallo,

ich habe jetzt meine Tastatur mal vermessen, direkt am IR Empfänger.
Gemessen mit einem Tektronix 2014.

2120 mS Low
920 µS High
330 µS Low
690 µS High
310 µS Low
680 µS High

Die 690 µS High, 310 µS Low wiederholen sich 6 mal.
Dann kommt

190 µS High
350 µS Low

Das wiederholt sich auch viele male und wird dann auch mal von einer
690 µS High, 310 µS Low Kombination unterbrochen.

Ich hab das mal so ins define umgesetzt

#define FDC_START_BIT_PULSE_TIME                2120.0e-6
#define FDC_START_BIT_PAUSE_TIME                 920.0e-6
#define FDC_PULSE_TIME                           330.0e-6
#define FDC_1_PAUSE_TIME                         690.0e-6
#define FDC_0_PAUSE_TIME                         190.0e-6

Ich bin mir nicht sicher ob ich das richtig gemacht habe, aber immerhin 
bekomme ich damit auch mal einen FDC Datensatz, allerdings tauchen dann 
auch noch RC5 und Siemens mit auf.

Wenn ich RC5 und Siemens beim compilieren deaktiviere erhalte ich die 
FDC Datensätze. Soweit mir das aussieht auch bei jeder Taste einen 
anderen.

Gruß
Torsten

von eku (Gast)


Lesenswert?

Hallo Frank und Torsten!

Auch ich kann mit IRMP keinen FDC-Code dekodieren, wechselnd RCx und 
SIEMENS. Beim Testen ist mir noch aufgefallen, dass last_pause noch von 
anderen Protkollen als RCx und SIEMENS benötigt wird -> Compilerfehler.

von Torsten K. (nobby)


Lesenswert?

Hy eku,

dann versuch doch mal die defines von mir und schalte den Siemens und 
RC5 ab, dann sollte es gehen.
Vielleicht hilft das Frank um zu erkennen woran es noch liegen kann.
Ich bin gerne bereit das hier weiter mit dem Scope zu vermessen.

Um nochmal auf die Taktung zu kommen.
Ich habe bei mir mal einen Pin wechseln lassen, wenn der in den OCR 
Interrupt geht.
Mit dem 8mhz Quarz habe ich exakt 15kHz, mache ich das mit dem internen 
RC Oscal bin ich bei 15,6kHz.
Daran ändern auch das auslesen des Oscal Calibration Byte nichts, das 
kann an der Toleranz liegen.

Gruß

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Hallo Torsten,

Torsten Kalbe schrieb:

> ich habe jetzt meine Tastatur mal vermessen, direkt am IR Empfänger.
> Gemessen mit einem Tektronix 2014.
>
> 2120 mS Low

Sicher, dass es nicht 2120 µs waren? ms kommt mir verdammt lang vor ;-)

> 920 µS High
> 330 µS Low
> 690 µS High
> 310 µS Low
> 680 µS High
>
> Die 690 µS High, 310 µS Low wiederholen sich 6 mal.
> Dann kommt
>
> 190 µS High
> 350 µS Low
>
> Das wiederholt sich auch viele male und wird dann auch mal von einer
> 690 µS High, 310 µS Low Kombination unterbrochen.

Das sieht ziemlich kaputt aus. Diese Timings habe ich auch im Scan 
gesehen, konnte es aber kaum glauben, denn bei ekus Tastatur waren 
Timings:

Start-Bit   1390µs Puls, 640µs Pause
0-Bit        200µs Puls, 145µs Pause
1-Bit        200µs Puls, 475µs Pause
Stop-Bit     200µs Puls

Siehe auch IRMP-Artikel:

   http://www.mikrocontroller.net/articles/IRMP#Protokolle

Dort habe ich alle Timings dokumentiert.

Bis auf das Start-Bit waren also alle Pulse gleich lang. Bei Dir ist das 
komplett anders. Die 190µs-Pause fällt auch komplett aus dem Rahmen.

> Ich hab das mal so ins define umgesetzt
>
> #define FDC_START_BIT_PULSE_TIME                2120.0e-6

Korrekt

> #define FDC_START_BIT_PAUSE_TIME                 920.0e-6

Korrekt.

> #define FDC_PULSE_TIME                           330.0e-6

Jepp.

> #define FDC_1_PAUSE_TIME                         690.0e-6
> #define FDC_0_PAUSE_TIME                         190.0e-6

Da glaube ich eher, dass es umgekehrt ist. Die 0en kommen öfter vor als 
die 1en. Aber das ist erstmal nebensächlich, dann ist das bei Dir halt 
erstmal invertiert.

> Ich bin mir nicht sicher ob ich das richtig gemacht habe, aber immerhin
> bekomme ich damit auch mal einen FDC Datensatz, allerdings tauchen dann
> auch noch RC5 und Siemens mit auf.

Das passiert, wenn sich ein Bit im Frame nicht an die vorgegebenen 
Zeiten hält. Dann "sucht" IRMP nach dem nächsten Start-Bit, um sich 
wieder zu synchronisieren. Dabei "erkennt" IRMP dann ein Daten-Bit des 
FDC-Stroms als Start-Bit von RC5 oder Siemens und klinkt sich dann dort 
wieder ein - fälschlicherweise. Da muss man dann die Toleranzen für die 
Daten-Bits höher drehen - nicht für die Start-Bits. Ich schicke Deinen 
Scan gleich nochmal durch den IRMP unter Linux und passe die Toleranzen 
an. Vielleicht klappt das. Allerdings sind bei Deiner Tastatur 
erhebliche Streungen im Timing. Vielleicht ist das Ding ja einfach nur 
kaputt?

> Wenn ich RC5 und Siemens beim compilieren deaktiviere erhalte ich die
> FDC Datensätze. Soweit mir das aussieht auch bei jeder Taste einen
> anderen.

Gut, ein Hoffnungsschimmer. Dann probiere ich mal, das als 
"FDC2"-Protokoll zu implementieren. Blöd, dass es da wieder eine 
Variante gibt. Bin mal gespannt, was meine bestellten Tastaturen 
aussenden... hoffentlich nicht noch eine dritte Variante...

Gruß,

Frank

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Hi eku,

eku schrieb:
> Auch ich kann mit IRMP keinen FDC-Code dekodieren, wechselnd RCx und
> SIEMENS. Beim Testen ist mir noch aufgefallen, dass last_pause noch von
> anderen Protkollen als RCx und SIEMENS benötigt wird -> Compilerfehler.

Wieso das? Das lief doch vorgestern noch bei Dir... ich habe die Timings 
seitdem nicht mehr geändert... merkürdig.

Habe gerade nochmal den Source im SVN gegen die Scan-Datei von Dir 
laufen lassen: FDC wird eindeutig erkannt. Du musst da noch irgendwas 
geändert haben... eine andere Erklärung habe ich nicht. Oder spinnt 
Deine Tastatur jetzt auch so rum wie die von Torsten?

Gibt es da vielleicht auf der Unterseite der Tastatur einen 
Schiebeschalter, mit dem man das Protokoll umschalten kann, damit sich 2 
baugleiche Tastaturen in einem Raum nicht ins Gehege kommen? Bei 
Funktastaturen habe ich das schon öfter mal gesehen...

Gruß,

Frank

von Torsten K. (nobby)


Angehängte Dateien:

Lesenswert?

Ich hab hier mal Taste 1 in "Bildform".

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Torsten Kalbe schrieb:

> 190 µS High
> 350 µS Low

Hier mal der irmp-Output von Deinem Scan (Option -a zeigt nur Timings):
1
# Model No.:FDC-3402
2
-------------------------------------------------------------------
3
# Taste 1
4
pulse: 33 pause: 12
5
pulse: 7 pause: 9
6
pulse: 5 pause: 10
7
pulse: 5 pause: 10
8
pulse: 6 pause: 10
9
pulse: 5 pause: 10
10
pulse: 6 pause: 9
11
pulse: 5 pause: 3
12
pulse: 5 pause: 3
13
pulse: 5 pause: 2
14
pulse: 6 pause: 2
15
pulse: 6 pause: 2
16
pulse: 6 pause: 2
17
pulse: 6 pause: 2
18
pulse: 5 pause: 3
19
pulse: 6 pause: 1
20
pulse: 6 pause: 3
21
pulse: 6 pause: 1
22
pulse: 6 pause: 2
23
pulse: 6 pause: 2
24
pulse: 5 pause: 3
25
pulse: 14 pause: 1
26
pulse: 6 pause: 2
27
pulse: 6 pause: 2
28
pulse: 5 pause: 3
29
pulse: 5 pause: 10
30
pulse: 6 pause: 2
31
pulse: 6 pause: 2
32
pulse: 5 pause: 3
33
pulse: 5 pause: 3
34
pulse: 5 pause: 3
35
pulse: 5 pause: 2
36
pulse: 6 pause: 10
37
pulse: 4 pause: 3
38
pulse: 5 pause: 11
39
pulse: 6 pause: 9
40
pulse: 6 pause: 9
41
pulse: 5 pause: 10
42
pulse: 6 pause: 10
43
pulse: 5 pause: 10

Das Start-Bit ist okay, die Pulsdauern schwanken zwischen 5 und 7, also 
zwischen 330µs und ca. 470µs.

Die Pausen sind offenbar:

9 - 11 = 600µs - 733µs  für 1-Bit
1 - 3  =  66µs - 200µs  für 0-Bit

Und diese Zeile ist der Knackpunkt (s.o.):

pulse: 14 pause: 1

Hier wurde gar keine Pause aufgezeichnet, weil sie einfach zu kurz war!
Dadurch "verlängert" sich die Pulsdauer auf ziemlich genau das Doppelte. 
In Wirklichkeit sind das aber 2 Bits, nämlich in etwa so was:

pulse: 7 pause: 0 <--- Pause zu kurz, wird nicht erkannt
pulse: 7 pause: 1 <--- Pause wird erkannt

Fazit: 15kHz sind zu kurz, um diese Frames mit den sehr kurzen Pulsen 
verlässlich zu detektieren. Das obige Phänomen tritt bei fast allen 
Tasten in Deinem Scan auf, nämlich ungefähr bei 50% der Scans.

Du könntest mal auf 20kHz hochgehen - und die Compiler-Warnungen 
entweder ignorieren oder vermeiden, indem Du z.B. BANG_OLUFSEN (und 
evtl. weitere) abschaltest, bis alle Compiler-Warnungen weg sind.

Gruß,

Frank

von Torsten K. (nobby)


Angehängte Dateien:

Lesenswert?

Ich hab alle Protokolle ausser dem FDC abgeschaltet, aber trotzdem zwei 
Warnungen bekommen.

Tasten 1 bis 4 hängen hier an.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Torsten Kalbe schrieb:
> Ich hab alle Protokolle ausser dem FDC abgeschaltet, aber trotzdem zwei
> Warnungen bekommen.

Okay, darum kümmern wir uns später.

> Tasten 1 bis 4 hängen hier an.

Danke, habe ich mir angeschaut, Deine ausgewählten Timings nochmal ein 
wenig abgeändert, die Toleranzen geändert und das Ganze als Protokol 
FDC2 (= 19) implementiert. Der Source ist im SVN. Damit werden Deine 
Tasten bei 20kHz erkannt. Das Ergebnis der Codes ist identisch mit denen 
von eku.

Deine Tastatur encodiert die Tasten also genauso wie die von eku, aber 
das Timing ist verschieden.

Nochmals meine Frage: Kein Schiebeschalter unter der Tastatur, wo man 
das Timing vielleicht umschalten kann, damit man 2 baugleiche Tastaturen 
in einem Raum nutzen kann?

Test bitte mal den Source bei 20kHz. Sollte Deine Tasten nun einwandfrei 
erkennen.

Ein Knackpunkt ist aber da noch: Ich musste die Toleranzen für RC5 auf 
0% runterschrauben, da das FDC2-Protokoll vom Startbit her mit dem 
RC5x-Protokoll kollidiert. Da muss ich mir also was einfallen lassen, 
denn im Moment wird bei Toleranz von 0% kein RC5 mehr erkannt :-(

Naja, erstmal ist die SVN-Version als Testversion zu sehen.

Gruß,

Frank

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Hi eku,

eku schrieb:
> Auch ich kann mit IRMP keinen FDC-Code dekodieren, wechselnd RCx und
> SIEMENS.

Ich bin mir ziemlich sicher, dass Du es geschafft hast, Deine Tastatur 
auf das Timing von Torsten umzuschalten, welches ich mittlerweile als 
FDC2 implementiert habe (siehe SVN). Das Timing von FDC2 kollidiert 
tatsächlich mit RC5 - vom Startbit her. Da suche ich noch nach einer 
Lösung.

> Beim Testen ist mir noch aufgefallen, dass last_pause noch von
> anderen Protkollen als RCx und SIEMENS benötigt wird -> Compilerfehler.

Danke für den Tipp, tatsächlich wird es bei allen Manchester-codierten 
Protokollen benutzt, also auch noch für Grundig und Nokia. Werde ich 
korrigieren.

Gruß,

Frank

von Torsten K. (nobby)


Lesenswert?

Einen Schalter finde ich nicht, vielleicht hat das Ding intern einen 
Jumper oder ähnliches.
EKU schrieb doch aber, das es bei Ihm auch nicht funktioniert hat.

Könnte es vielleicht auch am IR Empfänger liegen 36/38kHz ?

Pollin schreibt zu der Tastatur, das man Applikationen im Internet 
finden könnte, hat da schonmal jemand etwas gefunden. Vielleicht ist da 
auch was übers Timing zu sehen. Ich hab leider bisher nichts gefunden.
Sonst warten wir mal ab, wie es mit weiteren Tastaturen aussieht.

Es gibt übrigens bei Pollin noch einen weiteren Tastaturentyp für 1 
Euro.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Torsten Kalbe schrieb:
> Einen Schalter finde ich nicht, vielleicht hat das Ding intern einen
> Jumper oder ähnliches.

Hm, blöd.

> EKU schrieb doch aber, das es bei Ihm auch nicht funktioniert hat.

Es funktioniert aber bei mir mit den Scan-Dateien, die eku hier

Beitrag "Re: IRMP - Infrared Multi Protocol Decoder"

angehängt hat.

Hier die Timing-Daten, die ich aus ekus Scan-Dateien gewonnen habe:
1
#define FDC1_START_BIT_PULSE_TIME                1390.0e-6                       // 1390 usec pulse
2
#define FDC1_START_BIT_PAUSE_TIME                 640.0e-6                       //  640 usec pause
3
#define FDC1_PULSE_TIME                           200.0e-6                       //  200 usec pulse
4
#define FDC1_1_PAUSE_TIME                         475.0e-6                       //  475 usec pause
5
#define FDC1_0_PAUSE_TIME                         145.0e-6                       //  145 usec pause

Und hier Deine:
1
#define FDC2_START_BIT_PULSE_TIME                2120.0e-6                       // 2120 usec pulse
2
#define FDC2_START_BIT_PAUSE_TIME                 920.0e-6                       //  920 usec pause
3
#define FDC2_PULSE_TIME                           400.0e-6                       //  400 usec pulse
4
#define FDC2_1_PAUSE_TIME                         660.0e-6                       //  660 usec pause
5
#define FDC2_0_PAUSE_TIME                         145.0e-6                       //  140 usec pause

Zwischen diesen Werten liegt ungefähr ein Faktor 1,5.

Dafür gibt es folgende Möglichkeiten als Erklärung:

1. Beide Tastaturen arbeiten vom Timing her tatsächlich identisch
   und einer von Euch beiden arbeitete bei der Scan-Aufnahme mit
   einem Fehler von 150% bei der Timerparametrisierung.

2. Die Tastaturen arbeiten mit einer Abweichnung von 150% - vielleicht
   kosten sie deshalb nur knapp 2 EUR bei Pollin ;-)

Das FDC1-Timing (von eku) kollidiert aber seit Version 1.6.1 nicht mehr 
mit RC5 (weil ich die Toleranzen für RC5 auf 10% reduziert habe), das 
ist nur beim FDC2-Timing (von Dir) der Fall. Also könnte es sein, dass 
die Möglichkeit 1 bei eku der Fall war (zum Zeitpunkt des Scannens), er 
den Fehler mittlerweile korrigiert hat und deshalb nun in dieselbe 
RC5-Falle reinläuft wie Du.

Oder seine Tastatur hat sich umgestellt auf das andere Timing. Nur ein 
neuer Scan von eku kann das aufklären.

Ich bin gespannt auf die Lieferung meiner Tastaturen - ich hatte einfach 
mal frech 5 Stück bestellt. Dann hoffe ich, dass wir mehr Licht ins 
Dunkel bringen.

> Könnte es vielleicht auch am IR Empfänger liegen 36/38kHz ?

Glaube ich nicht.

> Pollin schreibt zu der Tastatur, das man Applikationen im Internet
> finden könnte, hat da schonmal jemand etwas gefunden. Vielleicht ist da
> auch was übers Timing zu sehen. Ich hab leider bisher nichts gefunden.

Nein, da habe ich nichts gefunden.

> Sonst warten wir mal ab, wie es mit weiteren Tastaturen aussieht.

Ja.

> Es gibt übrigens bei Pollin noch einen weiteren Tastaturentyp
> für 1 Euro.

Nämlich welchen?

Gruß,

Frank

von Torsten K. (nobby)


Lesenswert?

Moin,

das Signal selber habe ich mit dem Scope gemessen, und da hatte sich ja 
das Timing bestätigt, welches ich mit der Schaltung gescant habe.

Die Tastatur hat ja ein paar "Funktionstasten", vielleicht kann man 
durch drücken einer solchen gefolgt von einer zweiten das Timing 
verstellen, das wäre eine Möglichkeit.


Die zweite Tastatur ist diese:
http://www.pollin.de/shop/dt/MDk5ODgyOTk-/Computer_und_Zubehoer/Hardware/Tastaturen/Infrarot_Tastatur_SWK_8650.html

Die scheint aber ein ganz einfaches Signal zu haben, könnte ich Dir auch 
mal einen Scan zu schicken.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Torsten Kalbe schrieb:

> das Signal selber habe ich mit dem Scope gemessen, und da hatte sich ja
> das Timing bestätigt, welches ich mit der Schaltung gescant habe.

Stimmt. Wenn Du aber ekus 15kHz-Scan-Datei und Deine 15-kHz-Scan-Datei 
einfach mal in den Editor lädst, siehst Du, dass sowohl Pausen und auch 
Pulsdauern bei eku um den Faktor 1,5 kürzer sind. Dafür haben die Pausen 
in ekus Scan-Datei eine wesentlich geringere Schwankung, so dass der 
Fall "Pause=0" bei ihm trotz kürzerer Zeiten nicht auftritt. Deshalb 
funktionierte es mit seinen Scan-Dateien und meinem linux-irmp mit 15kHz 
perfekt.

Damit bleiben als Möglichkeiten übrig:

1. Beide Tastaturen arbeiten vom Timing her identisch und eku hat
   versehentlich mit 10kHz statt 15kHz (wie angegeben) gescannt.

2. Die Tastaturen arbeiten tatsächlich mit einer Abweichnung von 150%

> Die Tastatur hat ja ein paar "Funktionstasten", vielleicht kann man
> durch drücken einer solchen gefolgt von einer zweiten das Timing
> verstellen, das wäre eine Möglichkeit.

Jau.

Frage: Hattest Du die 1.6.2 mit den von mir angepassten Timings und dem 
neuen Protokoll "FDC2" (=19) aus dem SVN nochmal testen können?

> Die zweite Tastatur ist diese:
> 
http://www.pollin.de/shop/dt/MDk5ODgyOTk-/Computer_und_Zubehoer/Hardware/Tastaturen/Infrarot_Tastatur_SWK_8650.html

Ahja. Die Beschriftung der Tasten ist laut Pollin aber verschieden. Hast 
Du da eine mit deutschem Layout?

> Die scheint aber ein ganz einfaches Signal zu haben, könnte ich Dir auch
> mal einen Scan zu schicken.

Gern!

Gruß,

Frank

von eku (Gast)


Lesenswert?

Frank M. schrieb:
> Wenn Du aber ekus 15kHz-Scan-Datei und Deine 15-kHz-Scan-Datei
> einfach mal in den Editor lädst, siehst Du, dass sowohl Pausen und auch
> Pulsdauern bei eku um den Faktor 1,5 kürzer sind.

Ich komme erst am Wochenende dazu, weitere Scans aufzuzeichnen. Das 
FDC-Protokoll mag zwar im Linux-IRMP erkannt werden, bei mir mit 15kHz 
definiitiv nicht, auch wenn ich RCx und SIEMENS abklemme. Mehr dazu 
morgen.

von eku (Gast)


Angehängte Dateien:

Lesenswert?

Anbei die Tastaturbelegung meiner FDC.

von eku (Gast)


Lesenswert?

15kHz und FDC: return von irmp_ISR() und irmp_get_data() ist jeweils 1, 
aber proto, address und command sind Null

20kHz und FDC: dito

kurze Tastendruck: 3 Frames, 2. und 3. mit Repeat
langer Tastendurck: n Frames, 2. bis n. mit Repeat

20kHz und FDC2: proto FDC2, address 3F, command 0x00-0xFF

kurze Tastendruck: 2 Frames, 2. mit Repeat
langer Tastendurck: n Frames, 2. bis n. mit Repeat

Mit 20kHz liefert irmp_ISR() häufig 1 (irmp_detected), auch wenn keine 
IR-Signale gesendet werden.

von Torsten K. (nobby)


Angehängte Dateien:

Lesenswert?

Hallo Leute,

die Tastatur habe ich noch nicht mit dem neuen FD2 getestet, mache ich 
aber heute noch.

Meine andere Tastatur von Pollin hat eine QWERTY Layout, die Return und 
Sondertasten sind in einer mir momentan fremden Sprache :-)


Ich habe soeben einen neuen Scan einer IR Fernbedienung für 
Modellfahrzeuge aufgenommen, die würde ich sehr gerne entschlüsseln 
können, dann kann ich nämlich endlich meine Rennbahn entsprechend 
verbessern !!

Das ganze sieht auch sehr sehr übersichtlich aus, hab das schon fast 
selber entschlüsselt :-))

Hier eine erste Analyse:

Eine Fernbedienung kann eine Senderadresse von 0 bis 3 haben,
daher 4 Fahrzeuge.

Es können 3 AD Werte und 8 Schalterstellungen gesendet werden.

Die oberen zwei bits scheinen festzulegen, was gesendet wird.
Davon ausgehend das ein langer Puls, 900µS, 1 entspricht:

00, 10, 01, hier werden die AD Werte gesendet
11, dann werden die Schalterstellungen gesendet.

Die nächsten zwei Bits sind dann die vier möglichen Adressen.


Ist das vielleicht zu implementieren ?

von Torsten K. (nobby)


Lesenswert?

Habe jetzt die neu SVN installiert und das funktioniert sehr gut !
Ich bekomme immer FDC2 Codes angezeigt und auch plausible Hex-Zahlen.
Taste 1 entspricht 0x02 und Taste a ist 0x1F.

Frank, Du hast irgendwo geschrieben, ich könnte meinen Scan auch in 
einen Editor laden und könnte dann das Diagramm sehen ?
Was ist damit gemeint ? Kann ich damit so "schöne" Bilder erzeugen wie 
in Deiner Doku zu sehen ist ?
Ich habe allerdings nur Windows laufen.

Gruß
Torsten

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Hi Torsten,

Torsten Kalbe schrieb:

> Das ganze sieht auch sehr sehr übersichtlich aus, hab das schon fast
> selber entschlüsselt :-))

Sieht sehr einfach aus, sag mir noch die Frequenz, mit der Du das 
gescannt hast.

> Ist das vielleicht zu implementieren ?

Jau, das kriege ich hin. Ich melde mich dann, komme aber wohl frühestens 
heute abend dazu.

Gruß,

Frank

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Torsten Kalbe schrieb:
> Habe jetzt die neu SVN installiert und das funktioniert sehr gut !

Freut mich.

> Ich bekomme immer FDC2 Codes angezeigt und auch plausible Hex-Zahlen.
> Taste 1 entspricht 0x02 und Taste a ist 0x1F.

Passt, das ist der "Keycode", den ich oben in die Matrix geladen habe.

> Frank, Du hast irgendwo geschrieben, ich könnte meinen Scan auch in
> einen Editor laden und könnte dann das Diagramm sehen ?

Nein, kein Diagramm, Du siehst im Editor halt Folgen von 0en (Puls) und 
1en
(Pause). Bei Dir sind sie 1,5mal länger, also z.B.

00000000000000000000
0000000000000

> Was ist damit gemeint ? Kann ich damit so "schöne" Bilder erzeugen wie
> in Deiner Doku zu sehen ist ?

Die Bilder sind ein Oszi-Bild, nix weiter.

> Ich habe allerdings nur Windows laufen.

Dann scanne Deine Rennbahn-FB mit 10kHz ein und gebe dann ein:

irmp.exe -a < rennbahn.txt

Dann siehst Du eine Häufigkeitsverteilung als "Spektrum", das Ding 
"malt" Dir dann mit ASCII-Zeichen ein paar (unförmige) Glockenkurven. 
Geht aber erst mit Version 1.6.3, die ich gestern nachmittag ins SVN 
eingecheckt habe.

Beispiel für eine ekus Scan mit 15kHz:
1
--------------------------------------------------------------------------------------------------------------
2
START PULSES:
3
 20 oooooooooooooooo 3
4
 21 oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo 18
5
average: 20.86 = 1390.48 usec
6
--------------------------------------------------------------------------------------------------------------
7
START PAUSES:
8
  9 ooooooooooooooooooooooo 4
9
 10 oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo 17
10
average: 9.81 = 653.97 usec
11
--------------------------------------------------------------------------------------------------------------
12
PULSES:
13
  3 oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo 1517
14
  4 oo 41
15
average: 3.03 = 201.75 usec
16
 20  1
17
 21 o 16
18
average: 20.94 = 1396.08 usec
19
--------------------------------------------------------------------------------------------------------------
20
PAUSES:
21
  2 oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo 741
22
  3 oooooooooooooooooooooooo 179
23
average: 2.19 = 146.30 usec
24
  7 ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo 515
25
  8 ooooooooooo 85
26
  9 o 10
27
 10  7
28
average: 7.20 = 480.28 usec
29
--------------------------------------------------------------------------------------------------------------

Daraus kann man die Länge der Pulse/Pausen dann direkt ablesen :-)

irmp.exe -l <rennbahn.txt

Dann siehst Du die Längen der Pulse und Pausen in Zahlen - als Listing.

irmp.exe -v <rennbahn.txt

Zeigt Dir dann Protokoll-Infos an - aber nur, wenn irmp das Protokoll 
bereits kennt.

irmp.exe <rennbahn.txt

Dasselbe, aber kompakter, Fehler werden unterdrückt.

Zusammenfassung:

  -a  analyze
  -l  list
  -v  verbose

Das oben beschriebene gilt - wie gesagt - nur mit der neuesten 
SVN-Version, bei den vorherigen Versionen haben die Optionen andere 
Bedeutungen/Ausgabeformate.

Gruß,

Frank

von Torsten K. (nobby)


Lesenswert?

Hallo,

der Scan von meiner FB ist mit 20kHz gemacht, war noch so eingestellt 
von dern vorherigen Versuchen mit der Tastatur.

Gruß

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Hallo Torsten,

Torsten Kalbe schrieb:

> Ich habe soeben einen neuen Scan einer IR Fernbedienung für
> Modellfahrzeuge aufgenommen, die würde ich sehr gerne entschlüsseln
> können, dann kann ich nämlich endlich meine Rennbahn entsprechend
> verbessern !!

Habe das Protokoll in IRMP eingebaut, den Source findest Du im SVN. 
Protocol RCCAR (=20), RC5 muss dafür abgeschaltet werden.

Jeder Frame hat 13 Bits, ich habe sie allesamt mit MSB in irmp_data.code 
abgelegt. Das Ermitteln der Bedeutung der Bits überlasse ich damit Dir, 
Du brauchst Dir ja einfach nur mal die von IRMP ausgegebenen Codes als 
Binärzahl hinzuschreiben.

Viel Spaß,

Frank

von Torsten K. (nobby)


Lesenswert?

Hy,

das funktioniert klasse !!!

Die 13 bits sind auch sehr einfach aufgeteilt. Es müßte aber so 
eingebaut werden, das auch irmp_data.address benutzt wird.

Da es ja in Summe nur 13 bits insgesamt sind, sind die oberen drei immer 
null.
Dann folgen zwei, die die Art der Daten angeben, dann folgen die 
eigentlichen zwei Adressbits, dann 7 Datenbits, das letzte Bit ist wohl 
sowas wie ein Verify, das sorgt dafür, das immer eine ungerade Zahl an 1 
bits gesendet wird.
Aufgeteilt ist es also so:

xxxCCAADDDDDDDDV

Ich weis jetzt nicht, wie kompliziert es ist, aber ich fände es am 
besten, wenn die mit AA bezeichneten bits im irmp_data.address 
übertragen werden, dort wo jetzt immer Null kommt:
xxxxxxxx xxxxxxAA

Ins irmp_data.command käme dann:
xxxxxCCV DDDDDDDD

Gruß
Torsten

von Torsten K. (nobby)


Lesenswert?

Mir ist jetzt noch etwas aufgefallen.
Bei den Datenbits scheint es LSB first zu sein, also so:
xxxCCAA D0 D1 D2 D3 D4 D5 D6 D7 V

besser wäre dann, wenn das irmp_data.command so aussähe:

xxxxxCCV D7 D6 D5 D4 D3 D2 D1 D0

Natürlich kann man diese ganze Bitmanipulation auch im Hauptprogramm 
machen, aber bei den anderen Protokollen wird das ja auch entprechend 
übergeben.

von Torsten K. (nobby)


Lesenswert?

Was ich gerade feststelle ist, das es bei den Adress IDs auch so ist.
Bei den Commandbits wird es dann genauso sein, daher wäre auch da eine 
entsprechende Sortierung besser.

Also nochmal, bisher kommt das alles so im irmp_data.command an:

xxx C0 C1 A0 A1 D0 D1 D2 D3 D4 D5 D6 D7 V

Demnach sollte irmp_data.address so aussehen:
xxxxxxxx xxxxxx A1 A0


Das irmp_data.command würde ich so aufbauen:

xxxxx V C1 C0 D7 D6 D5 D4 D3 D2 D1 D0

Das verify-Bit habe ich ganz nach vorne gestellt. Damit ergibt sich, das 
der zweite Char dann die Daten sind und im ersten steht der Befehl und 
das Verify. Der Befehl kann dann direkt ausmaskiert werden, ohne danach 
noch geschoben zu werden.

Wäre das so ok, bzw. hab ich das verständlich rübergebracht ?

von eku (Gast)


Lesenswert?

Frank M. schrieb:
> Habe das Protokoll in IRMP eingebaut, den Source findest Du im SVN.
> Protocol RCCAR (=20), RC5 muss dafür abgeschaltet werden.

Hier machts sich eine Designschwäche des Dekoders bemerkbar. Dies 
passierte nicht, wenn zunächst die Pegelzeiten gespeichert und getrennt 
auswertet werden, d.h. alle Protokolle auf den Puffer testen. Das 
Festlegen auf ein Protokoll an Hand des Startbits führt bei mehreren 
Protokollen in die Sackgasse.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Hi Torsten,

Torsten Kalbe schrieb:

> Also nochmal, bisher kommt das alles so im irmp_data.command an:
>
> xxx C0 C1 A0 A1 D0 D1 D2 D3 D4 D5 D6 D7 V
>
> Demnach sollte irmp_data.address so aussehen:
> xxxxxxxx xxxxxx A1 A0
>
>
> Das irmp_data.command würde ich so aufbauen:
>
> xxxxx V C1 C0 D7 D6 D5 D4 D3 D2 D1 D0

Du kannst in irmp.h folgendes einstellen:
1
#define RCCAR_LSB               1   // LSB...MSB

Dann hast Du das schon mal auf LSB first umgestellt.

Der Frame sieht nach Deinen Ausführungen so aus:

Bit 0  1  2  3  4  5  6  7  8  9  10 11 12
    C0 C1 A0 A1 D0 D1 D2 D3 D4 D5 D6 D7 V

Damit die Adresse in irmp_data.address landet, könntest Du schreiben:
1
#define RCCAR_ADDRESS_OFFSET    2   // skip 2 bits
2
#define RCCAR_ADDRESS_LEN       2   // read 2 address bits

Dann sollte in irmp_data.address die Adresse stehen.

Jetzt zu den Kommando-Bits, das ist ein wenig schwierig, denn IRMP kann 
über die Preprocessor-Konstanten bisher nur Adress-Bits und 
Kommando-Bits in irmp_data.address und irmp_data.command aufteilen, wenn 
sie direkt aufeinanderfolgend sind.

Wenn Du schreibst:
1
#define RCCAR_COMMAND_OFFSET     4      // skip 4 bits
2
#define RCCAR_COMMAND_LEN        9      // read 9 bits

... dann fehlen Dir C0 und C1. Das Ganze funktioniert also nicht.

Daher empfehle ich, die Preprocessor-Konstanten bis auf die 
LSB-Geschichte unangetastet zu lassen und erstmal alles als data 
aufzufassen, also bitte nur ändern:
1
#define RCCAR_LSB               1   // LSB...MSB


Die Aufteilung in Adresse und Kommando kannst Du erst am Ende machen, 
nämlich in irmp_get_data().

Dazu fügst Du folgenden Block in irmp_get_data im case-switch ein - 
analog zu den anderen:
1
#if IRMP_SUPPORT_RCCAR_PROTOCOL == 1
2
            case IRMP_RCCAR_PROTOCOL:
3
                // frame in irmp_data:
4
                // Bit 12 11 10 9  8  7  6  5  4  3  2  1  0
5
                //     V  D7 D6 D5 D4 D3 D2 D1 D0 A1 A0 C1 C0   //         10 9  8  7  6  5  4  3  2  1  0
6
                irmp_address = (irmp_command & 0x000C) >> 2;    // addr:   0  0  0  0  0  0  0  0  0  A1 A0
7
                irmp_command = (irmp_command & 0x1000) >> 2 ||  // V-Bit:  V  0  0  0  0  0  0  0  0  0  0
8
                               (irmp_command & 0x0003) << 8 ||  // C-Bits: 0  C1 C0 0  0  0  0  0  0  0  0
9
                               (irmp_command & 0x0FF0) >> 4;    // D-Bits:          D7 D6 D5 D4 D3 D2 D1 D0
10
                rtc = TRUE;                                     // Summe:  V  C1 C0 D7 D6 D5 D4 D3 D2 D1 D0
11
#endif

Baue das bitte so ein. Wenn es klappt, übernehme ich die Änderungen in 
IRMP.

Gruß,

Frank

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

eku schrieb:
> Hier machts sich eine Designschwäche des Dekoders bemerkbar.

Ja, ich weiss, das hatte Dich ja schon vor Monaten (im Januar) gestört.

> Dies passierte nicht, wenn zunächst die Pegelzeiten gespeichert und getrennt
> auswertet werden, d.h. alle Protokolle auf den Puffer testen. Das
> Festlegen auf ein Protokoll an Hand des Startbits führt bei mehreren
> Protokollen in die Sackgasse.

Du hast nur zu einem Teil recht. In diesem Fall (RC5 und FDC2) würde 
auch das nachträgliche Auswerten des Gesamtframes nichts bringen. Es gab 
nämlich im FDC2-Protokoll durchaus Scans, die komplett ohne Fehler 
durch den RC5-Decoder durch laufen. Diese würden auch mit Deiner 
nachträglichen Methode fälschlicherweise als RC5 erkannt werden.

Der Grund liegt am Manchester-Code. Dieser besetzt leider mit den 4 
möglichen Abfolgen

  1-fach Länge Puls
  2-fach Länge Puls
  1-fach Länge Pause
  2-fach Länge Pause

ein breites Spektrum an möglichen Zeiten. Da bei RC5 das Start-Bit nicht 
ausgezeichnet ist (es hat dieselben Timings wie die nachfolgenden 
Daten), ist das geradezu ein Multiprotokoll-Decoder-Killer. Die 
Entwickler bei Siemens haben aus den Erfahrungen auch gelernt und das 
bei RC6 geändert: dort gibt es ein Start-Bit mit einem Timing, das nicht 
in den Daten selbst verwendet wird.

Bei den Pulse-Distance-Protokollen ist das anders. Da gibt es nur 2 
Möglichkeiten (im Start-Bit):

  1-fach Länge Puls
  1-fach Länge Pause

Daher gibt es hier naturgemäß untereinander wesentlich weniger Konflikte 
- bisher nämlich keine.

Deine damals schon vorgeschlagene Methode, den Frame erst nachträglich 
zu bewerten und zu dekodieren, ist wesentlich aufwendiger und kostet 
nicht nur einen Buffer zum Speichern des Frames, sondern auch einen 
wesentlichen Mehraufwand an Code. Ausserdem würde Deine Methode in der 
Kombination RC5+FDC2 oder RC5+RCCAR genauso kläglich versagen, denn auch 
bei der nachträglichen Auswertung würdest Du bestimmte FDC- und 
RCCAR-Frames komplett als RC5 auffassen können, ohne eine Regel zu 
verletzen.

IRMP wechselt sogar on-the-fly das erkannte Protokoll, z.B. vom SAMSUNG 
auf das SAMSUNG32-Protokoll, ebenso vom Grundig- auf das 
Nokia-Protokoll, wenn plötlzich mitten im Frame andere Bedingungen 
auftreten. Was IRMP nicht kann, ist von einem Manchester-Protokoll auf 
ein Puls-Distanz-Protokoll zu wechseln, da hier die bisher decodierten 
Bits nicht mehr "umzurechnen" sind.

Mein Fazit: Aus obigen Gründen halte ich an der Methode, wie IRMP die 
Protokolle detektiert, fest. Dass es bei mittlerweile 20 Protokollen, 
die IRMP "versteht", zu Konflikten kommen kann, halte ich für durchaus 
normal. Wenn diese Konflikte auch nur bei exotischen Protokollen (bzw. 
Kombinationen) auftreten, halte ich das auch für durchaus akzeptabel. 
Ich kann mir auch nicht vorstellen, dass ein Decoder für eine Rennbahn 
auch noch RC5 kennen muss.

Bei den Main-Stream-Protokollen gibt es im IRMP keine Konflikte. Das 
reicht für die meisten Anwendungen aus.

Gruß,

Frank

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Frank M. schrieb:

> Dazu fügst Du folgenden Block in irmp_get_data im case-switch ein -
> analog zu den anderen:
>
1
> #if IRMP_SUPPORT_RCCAR_PROTOCOL == 1
2
> ...
3
> #endif

Ein blöder Tippfehler: Statt den beiden "||" muss es natürlich jedesmal 
"|" heissen, also:
1
#if IRMP_SUPPORT_RCCAR_PROTOCOL == 1
2
            case IRMP_RCCAR_PROTOCOL:
3
                // frame in irmp_data:
4
                // Bit 12 11 10 9  8  7  6  5  4  3  2  1  0
5
                //     V  D7 D6 D5 D4 D3 D2 D1 D0 A1 A0 C1 C0   //         10 9  8  7  6  5  4  3  2  1  0
6
                irmp_address = (irmp_command & 0x000C) >> 2;    // addr:   0  0  0  0  0  0  0  0  0  A1 A0
7
                irmp_command = (irmp_command & 0x1000) >> 2 |   // V-Bit:  V  0  0  0  0  0  0  0  0  0  0
8
                               (irmp_command & 0x0003) << 8 |   // C-Bits: 0  C1 C0 0  0  0  0  0  0  0  0
9
                               (irmp_command & 0x0FF0) >> 4;    // D-Bits:          D7 D6 D5 D4 D3 D2 D1 D0
10
                rtc = TRUE;                                     // Summe:  V  C1 C0 D7 D6 D5 D4 D3 D2 D1 D0
11
                break;
12
#endif

Gruß,

Frank

von eku (Gast)


Angehängte Dateien:

Lesenswert?

eku schrieb:
> Ich komme erst am Wochenende dazu, weitere Scans aufzuzeichnen.

Die versprochenen Scans bei 20kHz, Reihe für Reihe von oben nach unten 
(vgl. Beitrag "Re: IRMP - Infrared Multi Protocol Decoder").

von eku (Gast)


Lesenswert?

Hallo Frank!

Könntest Du bitte die Variable irmp_pause_time auf uint16_t setzen um 
den Überlauf bei höheren Sampleraten zu verhindern.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

eku schrieb:
> Die versprochenen Scans bei 20kHz, Reihe für Reihe von oben nach unten

Danke, schaue ich mir an, bin gespannt...

Gruß,

Frank

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

eku schrieb:
> Könntest Du bitte die Variable irmp_pause_time auf uint16_t setzen um
> den Überlauf bei höheren Sampleraten zu verhindern.

Habe ich mir auch schon überlegt, die Variable last_pause muss dann aber 
auch auf 16 Bit erhöht werden.

Kostet zusätzliche 220 Programmcode und mehr Prozessorlast.

Ich überlege es mir noch (bzw. suche nach einer Alternativlösung, evtl. 
unter Benutzung einer Überlaufvariablen). Umschalten auf 16 Bit würde 
ich das auch erst ab F_INTERRUPT > 15000. Darunter braucht man es nicht.

Gruß,

Frank

von Torsten K. (nobby)


Lesenswert?

Hallo Frank,

jo das funktioniert.

Aber warum soll denn die Adresse nicht schon damit ummaskiert werden, 
das würde doch immerhin eine gewisse Gleichmäßigkeit zu den anderen 
Protokollen haben.

Damit die Adresse in irmp_data.address landet, könntest Du schreiben:
#define RCCAR_ADDRESS_OFFSET    2   // skip 2 bits
#define RCCAR_ADDRESS_LEN       2   // read 2 address bits

von Torsten K. (nobby)


Lesenswert?

Um das ganze zu vervollständigen möchte ich das RCCar jetzt auch noch in 
den IRSND einfügen.

Das habe ich schon gemacht:

in der irsndconfig.h habe ich eingefügt:
1
#define IRMP_SUPPORT_RCCAR_PROTOCOL             1       // flag: support RC car

in der irsnd.h habe ich eingefügt:
1
#define RCCAR_START_BIT_PULSE_LEN               (uint8_t)(F_INTERRUPTS * RCCAR_START_BIT_PULSE_TIME + 0.5)
2
#define RCCAR_START_BIT_PAUSE_LEN               (uint8_t)(F_INTERRUPTS * RCCAR_START_BIT_PAUSE_TIME + 0.5)
3
#define RCCAR_PULSE_LEN                         (uint8_t)(F_INTERRUPTS * RCCAR_PULSE_TIME + 0.5)       
4
#define RCCAR_1_PAUSE_LEN                       (uint8_t)(F_INTERRUPTS * RCCAR_1_PAUSE_TIME + 0.5)   
5
#define RCCAR_0_PAUSE_LEN                       (uint8_t)(F_INTERRUPTS * RCCAR_0_PAUSE_TIME + 0.5) 
6
#define RCCAR_FRAME_REPEAT_PAUSE_LEN            (uint8_t)(F_INTERRUPTS * RCCAR_FRAME_REPEAT_PAUSE_TIME + 0.5)

in der irsnd.c habe ich eingefügt:
1
#if IRMP_SUPPORT_RCCAR_PROTOCOL == 1
2
          case IRMP_RCCAR_PROTOCOL:
3
                    {
4
                        startbit_pulse_len          = RCCAR_START_BIT_PULSE_LEN;
5
                        startbit_pause_len          = RCCAR_START_BIT_PAUSE_LEN;
6
                        complete_data_len           = RCCAR_COMPLETE_DATA_LEN;
7
                        pulse_1_len                 = RCCAR_PULSE_LEN;
8
                        pause_1_len                 = RCCAR_1_PAUSE_LEN;
9
                        pulse_0_len                 = RCCAR_PULSE_LEN;
10
                        pause_0_len                 = RCCAR_0_PAUSE_LEN;
11
                        // has_stop_bit                = FDC1_STOP_BIT;
12
                        n_auto_repetitions          = 1;                                            // 1 frame
13
                        auto_repetition_pause_len   = 0;
14
                        repeat_frame_pause_len      = RCCAR_FRAME_REPEAT_PAUSE_LEN;
15
                        irsnd_set_freq (IRSND_FREQ_38_KHZ);
16
                        break;
17
                    }
18
#endif

Was muß mit dem has_stop_bit gemacht werden und wie ist es mit den 
repetitions, sowas gibt es da alles nicht.

Was wohl noch fehlt sind die eigentlichen Daten, da blicke ich aber noch 
nicht ganz durch was da gemacht werden muß ?
Auf jeden Fall müßte da ja auch wieder "zurückgeschoben" werden, aber 
ich weis nicht genau wo das dann hin muß

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Hi eku,

eku schrieb:
> Die versprochenen Scans bei 20kHz, Reihe für Reihe von oben nach unten
> (vgl. Beitrag "Re: IRMP - Infrared Multi Protocol Decoder").

Danke, habe sie nun mal durch den IRMP geschickt, Deine Tastatur hat 
dasselbe Timing wie Torsten, die Tasten werden alle als FDC2-Protokoll 
erkannt.

Das heisst, dass Dein damaliger Scan key15.txt aus

  Beitrag "Re: IRMP - Infrared Multi Protocol Decoder"

tatsächlich nur mit 10kHz erzeugt wurde - und nicht mit 15kHz, wie Du 
angegeben hast.

Was auffällig ist: die Timings Deiner Tastatur sind wesentlich exakter, 
sie würde auch bei 10kHz von IRMP einwandfrei erkannt werden. Die 
Streuungen der Puls-/Pausenlängen sind bei Torstens Tastatur wesentlich 
breiter, gerade die Pausen werden zwischendurch arg kurz, so dass hier 
20kHz als Scan-Rate benutzt werden muss.

Woran liegt das? Vielleicht doch am benutzten IR-Empfänger?

Daher Frage an Euch beide (eku und Torsten): welche IR-Empfänger nutzt 
Ihr?

Ich werde das FDC2-Protokoll in FDC umbenennen und das FDC1-Protokoll 
aus dem IRMP wieder rausnehmen. Es gibt keine zwei verschiedenen 
Timings, es gibt nur eins.

Ich melde mich dann später wegen der Tastatur-Matrix nochmal.

Gruß,

Frank

von Torsten K. (nobby)


Lesenswert?

Hy,

ich benutze diesen hier von Reichelt, ich ein 36kHz Typ.

SFH 5110-36
http://www.reichelt.de/?ACTION=3;GROUP=A54;GROUPID=3045;ARTICLE=37920;SID=26P0XrvqwQARoAAALlQXEa9209424a0712a39830a3d1b2f204a48

Ich würde das streuende Timing von mir aber nicht überbewerten, das 
liegt vielleicht auch irgendwo an meiner Platine/Prozessor, oder aber am 
RS232/USB Adapter ?

Ich hatte mir das Signal ja auch auf dem Oszilloskop angeschaut, und da 
konnte ich solche Ausreisser ja garnicht sehen.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Hi Torsten,

Torsten Kalbe schrieb:

> ich benutze diesen hier von Reichelt, ich ein 36kHz Typ.
>
> SFH 5110-36

Danke für die Info. Bin gespannt, ob eku einen mit höherer Frequenz 
benutzt und deshalb sein Timing besser ist.

> Ich hatte mir das Signal ja auch auf dem Oszilloskop angeschaut, und da
> konnte ich solche Ausreisser ja garnicht sehen.

Ich habe die Analyze-Funktion von IRMP mal ein wenig ausgebaut, hier die 
Timings von ekus Tastatur:
1
PULSES:
2
  6 oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo 4169
3
  7 oo 156
4
avg: 6.0 = 301.8 usec, min: 6 = 300.0, max: 7 = 350.0  tol: 16.0%
5
PAUSES:
6
  4 oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo 1575
7
  5 oooooooooooooooooooooooooooooooooooooooo 1072
8
avg: 4.4 = 220.2 usec, min: 4 = 200.0, max: 5 = 250.0  tol: 13.5%

Die (liegenden Glockenkurven) sind praktisch ein Strich, die 
Abweichungen liegen bei 13 - 16%.

Und jetzt das Timing Deiner Tastatur:
1
PULSES:
2
  6 oooooooooooooo 43
3
  7 oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo 184
4
  8 oooooooooooooooooooooooooooo 88
5
  9 ooo 10
6
 10  3
7
avg: 7.2 = 361.3 usec, min: 6 = 300.0, max: 10 = 500.0  tol: 38.4%
8
PAUSES:
9
  1  1
10
  2 oooooooooooooooooooo 28
11
  3 oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo 83
12
  4 oooooooooooooooooooooooooooooooooooooooooooooooooooooooo 78
13
  5 o 2
14
avg: 3.3 = 163.5 usec, min: 1 = 50.0, max: 5 = 250.0  tol: 69.4%

Hier sind die Kurven breiter und die Abweichhungen liegen bei 38 - 70%. 
Das ist schon happig.

Gruß,

Frank

von eku (Gast)


Lesenswert?

Hallo Frank,

ich benutze das Pollin ATMEL Addon-Board V1.0 (810 053) mit TSOPxx36, 
der breitbandiger als der SFH 5110-36 ist.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

eku schrieb:
> ich benutze das Pollin ATMEL Addon-Board V1.0 (810 053) mit TSOPxx36,
> der breitbandiger als der SFH 5110-36 ist.

Das könnte der Unterschied sein:

Wenn das FDC-Keyboard mit 40kHz oder höher sendet, könnte der 
SFH-Empfänger seine Probleme damit haben. Beim TSOP1736 gibt es keine 
Probleme mit einer 40kHz-Modulation, da wird "nur" die Reichweite ein 
wenig geringer.

Ich habe zu Hause sowohl TSOP1736 als auch TSOP1738 zum Testen.... aber 
leider ist immer noch keine FDC-Tastatur angekommen. Pollin lässt sich 
mal wieder ein wenig Zeit...

Gruß,

Frank

von Torsten K. (nobby)


Lesenswert?

Ich schraube die nächsten Tagen nochmal meine Tastatur auseinander und 
hänge das Scope an die IR-LED, dann sehen wir was da für eine Frequenz 
drauf liegt.

Pollin hat bei meiner letzten Lieferung auch über eine Woche gebraucht, 
die haben wohl momentan gut zu tun....

von Max M. (max_m)


Lesenswert?

hallo,

sorry schon mal für die dumme frage aber:

was läuft hier beim Kompilieren falsch?

meine makefile (arbeite unter linux und will es für einen atmega168 
erstellen)
1
# controller
2
MCU = atmega168
3
4
# frequency
5
F_CPU = 20000000UL
6
7
# main application name (without .hex)
8
# eg 'test' when the main function is defined in 'test.c'
9
TARGET = main
10
11
# c sourcecode files
12
# eg. 'test.c foo.c foobar/baz.c'
13
SRC = $(TARGET).c irmp.c
14
15
# asm sourcecode files
16
# eg. 'interrupts.S foobar/another.S'
17
ASRC =
18
19
# headers which should be considered when recompiling
20
# eg. 'global.h foobar/important.h'
21
HEADERS =
22
23
# include directories (used for both, c and asm)
24
# eg '. usbdrv/'
25
INCLUDES =
26
27
28
# use more debug-flags when compiling
29
DEBUG = 1
30
31
32
# avrdude programmer protocol
33
PROG = usbasp
34
# avrdude programmer device
35
DEV = usb
36
# further flags for avrdude
37
AVRDUDE_FLAGS =
38
39
####################################################
40
# 'make' configuration
41
####################################################
42
CC = avr-gcc
43
OBJCOPY = avr-objcopy
44
OBJDUMP = avr-objdump
45
AS = avr-as
46
SIZE = avr-size
47
CP = cp
48
RM = rm -f
49
RMDIR = rm -rf
50
MKDIR = mkdir
51
AVRDUDE = avrdude
52
53
# flags for automatic dependency handling
54
DEPFLAGS = -MD -MP -MF .dep/$(@F).d
55
56
# flags for the compiler (for .c files)
57
CFLAGS += -g -Os -mmcu=$(MCU) -DF_CPU=$(F_CPU) -std=gnu99 -fshort-enums $(DEPFLAGS)
58
CFLAGS += $(addprefix -I,$(INCLUDES))
59
# flags for the compiler (for .S files)
60
ASFLAGS += -g -mmcu=$(MCU) -DF_CPU=$(F_CPU) -x assembler-with-cpp $(DEPFLAGS)
61
ASFLAGS += $(addprefix -I,$(INCLUDES))
62
# flags for the linker
63
LDFLAGS += -mmcu=$(MCU)
64
65
# fill in object files
66
OBJECTS += $(SRC:.c=.o)
67
OBJECTS += $(ASRC:.S=.o)
68
69
# include config file
70
-include $(CURDIR)/config.mk
71
72
# include more debug flags, if $(DEBUG) is 1
73
ifeq ($(DEBUG),1)
74
  CFLAGS += -Wall -W -Wchar-subscripts -Wmissing-prototypes
75
  CFLAGS += -Wmissing-declarations -Wredundant-decls
76
  CFLAGS += -Wstrict-prototypes -Wshadow -Wbad-function-cast
77
  CFLAGS += -Winline -Wpointer-arith -Wsign-compare
78
  CFLAGS += -Wunreachable-code -Wdisabled-optimization
79
  CFLAGS += -Wcast-align -Wwrite-strings -Wnested-externs -Wundef
80
  CFLAGS += -Wa,-adhlns=$(basename $@).lst
81
  CFLAGS += -DDEBUG
82
endif
83
84
####################################################
85
# avrdude configuration
86
####################################################
87
ifeq ($(MCU),atmega8)
88
  AVRDUDE_MCU=m8
89
endif
90
ifeq ($(MCU),atmega48)
91
  AVRDUDE_MCU=m48
92
endif
93
ifeq ($(MCU),atmega88)
94
  AVRDUDE_MCU=m88
95
endif
96
ifeq ($(MCU),atmega168)
97
  AVRDUDE_MCU=m168
98
endif
99
100
AVRDUDE_FLAGS += -p $(AVRDUDE_MCU)
101
102
####################################################
103
# make targets
104
####################################################
105
106
.PHONY: all clean distclean avrdude-terminal
107
108
# main rule
109
all: $(TARGET).hex
110
111
$(TARGET).elf: $(OBJECTS)
112
  $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $^
113
114
# all objects (.o files)
115
$(OBJECTS): $(HEADERS)
116
117
# remove all compiled files
118
clean:
119
  $(RM) $(foreach ext,elf hex eep.hex map,$(TARGET).$(ext)) \
120
    $(foreach file,$(patsubst %.o,%,$(OBJECTS)),$(foreach ext,o lst lss,$(file).$(ext)))
121
122
# additionally remove the dependency makefile
123
distclean: clean
124
  $(RMDIR) .dep
125
126
# avrdude-related targets
127
install program: program-$(TARGET)
128
129
avrdude-terminal:
130
  $(AVRDUDE) $(AVRDUDE_FLAGS) -c $(PROG) -P $(DEV) -t
131
132
program-%: %.hex
133
  $(AVRDUDE) $(AVRDUDE_FLAGS) -c $(PROG) -P $(DEV) -U flash:w:$<
134
135
program-eeprom-%: %.eep.hex
136
  $(AVRDUDE) $(AVRDUDE_FLAGS) -c $(PROG) -P $(DEV) -U eeprom:w:$<
137
138
# special programming targets
139
%.hex: %.elf
140
  $(OBJCOPY) -O ihex -R .eeprom $< $@
141
  @echo "========================================"
142
  @echo "$@ compiled for: $(MCU)"
143
  @echo -n "size for $< is "
144
  @$(SIZE) -A $@ | grep '\.sec1' | tr -s ' ' | cut -d" " -f2
145
  @echo "========================================"
146
147
%.eep.hex: %.elf
148
  $(OBJCOPY) --set-section-flags=.eeprom="alloc,load" --change-section-lma .eeprom=0 -O ihex -j .eeprom $< $@
149
150
%.lss: %.elf
151
  $(OBJDUMP) -h -S $< > $@
152
153
-include $(shell $(MKDIR) .dep 2>/dev/null) $(wildcard .dep/*)

und das ergibt ein make
1
avr-gcc -g -Os -mmcu=atmega168 -DF_CPU=20000000UL -std=gnu99 -fshort-enums -MD -MP -MF .dep/main.o.d  -Wall -W -Wchar-subscripts -Wmissing-prototypes -Wmissing-declarations -Wredundant-decls -Wstrict-prototypes -Wshadow -Wbad-function-cast -Winline -Wpointer-arith -Wsign-compare -Wunreachable-code -Wdisabled-optimization -Wcast-align -Wwrite-strings -Wnested-externs -Wundef -Wa,-adhlns=main.lst -DDEBUG   -c -o main.o main.c
2
main.c:61: Warnung: kein vorheriger Prototyp für »timer_init«
3
avr-gcc -g -Os -mmcu=atmega168 -DF_CPU=20000000UL -std=gnu99 -fshort-enums -MD -MP -MF .dep/irmp.o.d  -Wall -W -Wchar-subscripts -Wmissing-prototypes -Wmissing-declarations -Wredundant-decls -Wstrict-prototypes -Wshadow -Wbad-function-cast -Winline -Wpointer-arith -Wsign-compare -Wunreachable-code -Wdisabled-optimization -Wcast-align -Wwrite-strings -Wnested-externs -Wundef -Wa,-adhlns=irmp.lst -DDEBUG   -c -o irmp.o irmp.c
4
irmp.c:1204: Fehler: expected identifier or »(« before »volatile«
5
irmp.c:1204: Fehler: expected »)« before »(« token
6
irmp.c:1296: Warnung: Redundante Redeklaration von »irmp_bit«
7
irmp.c:1193: Warnung: Vorherige Deklaration von »irmp_bit« war hier
8
irmp.c:2326: Warnung: kein vorheriger Prototyp für »print_spectrum«
9
irmp.c: In Funktion »print_spectrum«:
10
irmp.c:2368: Warnung: format »%0.2f« erwartet Typ »double«, aber Argument 3 hat Typ »float«
11
irmp.c: In Funktion »main«:
12
irmp.c:2565: Warnung: Übergabe des Arguments 1 von »print_spectrum« entfernt Kennzeichner von Zeiger-Ziel-Typ
13
irmp.c:2566: Warnung: Übergabe des Arguments 1 von »print_spectrum« entfernt Kennzeichner von Zeiger-Ziel-Typ
14
irmp.c:2567: Warnung: Übergabe des Arguments 1 von »print_spectrum« entfernt Kennzeichner von Zeiger-Ziel-Typ
15
irmp.c:2568: Warnung: Übergabe des Arguments 1 von »print_spectrum« entfernt Kennzeichner von Zeiger-Ziel-Typ
16
make: *** [irmp.o] Fehler 1

wo liegt da das problem?

von eku (Gast)


Lesenswert?

Max M. schrieb:
> wo liegt da das problem?

Welche Version? Release oder SVN Top?

von Michael M. (Gast)


Lesenswert?

scheint, als würde die irmp.c nicht mitkompiliert werden.
header-datei eingebunden?

von Max M. (max_m)


Lesenswert?

version 1.6
ich glaub versucht sie mit kompilieren sonst würde er doch in der irmp.c 
keine fehler finden oder?



header-dateien werden eingebunden

von Torsten K. (nobby)


Lesenswert?

Tastatur läuft auf 38kHz, hab ich grad nachgemessen.

Gruß
Torsten

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Max M. schrieb:

> was läuft hier beim Kompilieren falsch?
> # use more debug-flags when compiling
> DEBUG = 1

Das muss weg oder auf 0. Debuggen kann man unter Linux nur, wenn man 
IRMP nativ für Linux übersetzt.

Gruß,

Frank

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Hi Torsten,

Torsten Kalbe schrieb:
> Tastatur läuft auf 38kHz, hab ich grad nachgemessen.

Danke für die Info. Das sollte Dein IR-Empfänger aber noch packen. Oder 
hast Du alternativ einen 38kHz-Empfänger zur Hand?

Gruß,

Frank

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Hallo Torsten,

Torsten Kalbe schrieb:
> Um das ganze zu vervollständigen möchte ich das RCCar jetzt auch noch in
> den IRSND einfügen.

Du hast das schon ganz gut hinbekommen, aber ein paar wichtige Sachen 
fehlen noch. Solange es dafür keine Doku gibt, wie man einen Encoder in 
IRSND einbaut, wirds auch schwierig.

Ich schaue, dass ich RCCAR diese Woche in den IRSND einbaue. Vielleicht 
kannst Du das dann "abgucken" und im IRMP-Artikel dokumentieren ;-)

Gruß,

Frank

von Torsten K. (nobby)


Lesenswert?

Hy,

also ich habe einen TSOP1738 Empfänger hier, mit dem könnte ich ein paar 
Scans machen. Ich bin mir aber garnicht sicher, welchen ich ursprünglich 
mal verwendet hatte....

Zum RCCar und der Doku, das kann ich dann sicherlich mal versuchen.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Hi eku,

eku schrieb:
> Könntest Du bitte die Variable irmp_pause_time auf uint16_t setzen um
> den Überlauf bei höheren Sampleraten zu verhindern.

Wird jetzt abhängig von F_INTERRUPTS gemacht, sobald IRMP_TIMEOUT_LEN 
(das ist die Konstante mit dem höchsten Zeitwert) droht überzulaufen, 
werden irmp_pause_time und last_pause als uint16_t definiert.

So kommt der erhöhte Codebedarf nur bei höheren Frequenzen zum Tragen - 
aktuell ab 15875Hz und mehr. Ist eingecheckt im SVN als Version 1.6.5.

Gruß,

Frank

von eku (Gast)


Lesenswert?

Hallo Frank!

Schade das sich RC5 und FDC ausschließen. Im

Beitrag "Re: IRMP - Infrared Multi Protocol Decoder"

beschreibst Du ja, woran es liegt. Fällt Dir vielleicht noch ein Kniff 
ein, wie es doch gehen könnte?

Zum FDC-Protokoll noch ein paar Punkte: Jede Taste wird als zwei Frames 
erkannt, egal wie kurz ich sie betätige. Alle Maustasten werden immer 
als 0000 dekodiert. Ich vermute, dass beides an den nicht dekodierten 
Bits begründet sind.

In Beitrag "Re: IRMP - Infrared Multi Protocol Decoder" schreibst Du noch 
was von anderen Bits,

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Frank M. schrieb:
> Ich schaue, dass ich RCCAR diese Woche in den IRSND einbaue. Vielleicht
> kannst Du das dann "abgucken" und im IRMP-Artikel dokumentieren ;-)

FDC- und RCCAR-Protokoll sind nun auch im IRSND drin - eingecheckt im 
SVN.

Demnächst gibt es dann ein neues Release.

Gruß,

Frank

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

eku schrieb:

> Schade das sich RC5 und FDC ausschließen.

Ja, sehr schade.

> Fällt Dir vielleicht noch ein Kniff ein, wie es doch gehen könnte?

Im Moment "verrennt" sich der IRMP im RC5, weil er das Start-Bit früher 
gegen RC5 checkt als gegen FDC. Vielleicht drehe ich die Reihenfolge 
rum, denn ein FDC-Frame ist länger als ein RC5-Frame. Ich könnte ihn 
also zunächst in den FDC-Decoder reinlaufen lassen und wenn plötzlich 
völlige Dunkelheit herrscht, aber noch nicht alle vermeintlichen 
FDC-Bits empfangen wurden, die bisherigen Bits in RC5-Manchester-Code 
"umrechnen". Das könnte vielleicht gehen, ich werde mal drüber 
nachdenken.

> Zum FDC-Protokoll noch ein paar Punkte: Jede Taste wird als zwei Frames
> erkannt, egal wie kurz ich sie betätige.

Im Deinen Scans sehe ich die Wiederholung nur ab und zu, nicht 
ausnahmslos. Ich könnte die Regel einbauen, dass ein Frame mindestens 2x 
reinkommen muss (einmal mit vier 0-en im REPEAT-Block des Frames, einmal 
mit vier 1-en). Erst alle weiteren Repeat-Frames werden dann als 
tatsächlicher langer Tastendruck erkannt werden. Meinst Du das so?

Wenn Du meinst, dass das so besser wäre, mache ich das. Allerding 
wundere ich mich, dass ich diesen 2. Frame nur bei manchen Tastendrücken 
gesehen habe....

> Alle Maustasten werden immer
> als 0000 dekodiert. Ich vermute, dass beides an den nicht dekodierten
> Bits begründet sind.

Ja, die Maustasten werden noch nicht ausgewertet. Dafür werden die 
bisher nicht dekodierten Bits genutzt. Diese werden noch ignoriert.

Mich hätte aber schon mal interessiert, wie z.B. eine Tastenkombination 
STRG-C gesandt wird. Es kann nicht sein, dass zunächst der Keycode für 
STRG, dann der für C gesandt wird. Was ist bei der nächsten Taste? Da 
muss der Empfänger doch wissen, ob die STRG-Taste überhaupt noch 
gedrückt ist. Kannst Du das mal testen, evtl. mit Kombinationen von 
STRG, ALT, SHIFT?

Gruß,

Frank

von Max M. (max_m)


Lesenswert?

Frank M. schrieb:
> Max M. schrieb:
>
>> was läuft hier beim Kompilieren falsch?
>> # use more debug-flags when compiling
>> DEBUG = 1
>
> Das muss weg oder auf 0. Debuggen kann man unter Linux nur, wenn man
> IRMP nativ für Linux übersetzt.
>
> Gruß,
>
> Frank

Danke für den Hinweis hab es gerade abgeändert.

nun bekomm ich aber immer noch fehler... woran liegt jetzt bitte das?
1
avr-gcc -g -Os -mmcu=atmega168 -DF_CPU=20000000UL -std=gnu99 -fshort-enums -MD -MP -MF .dep/main.elf.d  -mmcu=atmega168 -o main.elf main.o irmp.o irmp.h
2
irmp.h:342: Fehler: expected specifier-qualifier-list before »uint8_t«
3
irmp.h:361: Fehler: expected »=«, »,«, »;«, »asm« or »__attribute__« before »irmp_get_data«
4
irmp.h:367: Fehler: expected »=«, »,«, »;«, »asm« or »__attribute__« before »irmp_ISR«
5
make: *** [main.elf] Fehler 1

von eku (Gast)


Lesenswert?

Frank M. schrieb:
>> Zum FDC-Protokoll noch ein paar Punkte: Jede Taste wird als zwei Frames
>> erkannt, egal wie kurz ich sie betätige.
>
> Im Deinen Scans sehe ich die Wiederholung nur ab und zu, nicht
> ausnahmslos.

Könnte das an IRMP_LOGGION=1 liegen? Die Uart-Ausgabe bremst die 
Interruptroutine aus und es werden weniger Sequenzen 
erkannt/protkolliert?

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

eku schrieb:
> Könnte das an IRMP_LOGGION=1 liegen? Die Uart-Ausgabe bremst die
> Interruptroutine aus und es werden weniger Sequenzen
> erkannt/protkolliert?

Die Uart-Ausgabe wird erst gestartet, wenn über eine längere Zeit kein 
Signal mehr am IR-Eingang anliegt. Bis dahin wird gepuffert. In Deinem 
allerersten Scan sandte fast jede Taste 2 Frames. Der lief mit 10kHz. In 
Deinem Scan mit 20kHz kam es nur vereinzelt zu Frame-Wiederholungen. Das 
kann daran liegen, dass bei 20kHz der Logging-Buffer schneller voll ist, 
denn hier wird das Doppelte an Speicher für einen Frame benötigt.

Okay, Du hast zwar meine Frage nicht beantwortet, aber ich nehme mal an, 
dass Du es auch für besser hältst, den ersten und zweiten Frame zusammen 
zu betrachten und erst weitere Frames (ab dem 3.) als Wiederholungen - 
analog zum SIRCS-Protokoll.

Gruß,

Frank

P.S.
Meine Pollin-Tastaturen sind gestern eingetroffen. Leider bin ich in den 
nächsten Tagen viel unterwegs und werde es wohl auch nicht am Wochenende 
schaffen, die Dinger mal selbst zu testen.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Max M. schrieb:
> nun bekomm ich aber immer noch fehler... woran liegt jetzt bitte das?
1
> avr-gcc -g -Os -mmcu=atmega168 -DF_CPU=20000000UL -std=gnu99
2
> -fshort-enums -MD -MP -MF .dep/main.elf.d  -mmcu=atmega168 -o
3
> main.elf main.o irmp.o irmp.h

Die Zeile ist irgendwie Unsinn.

Hier soll ein main.elf gelinkt werden, welches sich aus main.o, irmp.o 
und irmp.h zusammensetzt. So versucht nun der avr-gcc, das irmp.h für 
sich allein zu übersetzen. Das ist aber Quatsch, denn irmp.h ist kein 
eigenständiger Source, sondern nur eine Include-Datei. Das ist in der 
Zeile definitiv zu viel.

Da der make ja schon beim Linken angekommen ist, müsste die Compilierung 
von irmp.c und main.c bereits geschehen sein und Du müsstest dort 
bereits ein main.o und irmp.o vorliegen haben. Ist dem so?

Gruß,

Frank

von Max M. (max_m)


Lesenswert?

ja das ist so aber warum will er die header datei linken?

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Max M. schrieb:
> ja das ist so aber warum will er die header datei linken?

Keine Ahnung, ich habe mal eben Dein Makefile unter Linux abgespeichert, 
die führenden Blanks in den Kommando-Zeilen durch TABs ersetzt und 
anschließend eingegeben:
1
make -n -f Makefile.Max

Der Output dazu:
1
$ make -n -f Makefile.Max
2
avr-gcc -g -Os -mmcu=atmega168 -DF_CPU=20000000UL -std=gnu99 -fshort-enums -MD -MP -MF .dep/main.o.d  -Wall -W -Wchar-subscripts -Wmissing-prototypes -Wmissing-declarations -Wredundant-decls -Wstrict-prototypes -Wshadow -Wbad-function-cast -Winline -Wpointer-arith -Wsign-compare -Wunreachable-code -Wdisabled-optimization -Wcast-align -Wwrite-strings -Wnested-externs -Wundef -Wa,-adhlns=main.lst -DDEBUG   -c -o main.o main.c
3
avr-gcc -g -Os -mmcu=atmega168 -DF_CPU=20000000UL -std=gnu99 -fshort-enums -MD -MP -MF .dep/irmp.o.d  -Wall -W -Wchar-subscripts -Wmissing-prototypes -Wmissing-declarations -Wredundant-decls -Wstrict-prototypes -Wshadow -Wbad-function-cast -Winline -Wpointer-arith -Wsign-compare -Wunreachable-code -Wdisabled-optimization -Wcast-align -Wwrite-strings -Wnested-externs -Wundef -Wa,-adhlns=irmp.lst -DDEBUG   -c -o irmp.o irmp.c
4
avr-gcc -g -Os -mmcu=atmega168 -DF_CPU=20000000UL -std=gnu99 -fshort-enums -MD -MP -MF .dep/main.elf.d  -Wall -W -Wchar-subscripts -Wmissing-prototypes -Wmissing-declarations -Wredundant-decls -Wstrict-prototypes -Wshadow -Wbad-function-cast -Winline -Wpointer-arith -Wsign-compare -Wunreachable-code -Wdisabled-optimization -Wcast-align -Wwrite-strings -Wnested-externs -Wundef -Wa,-adhlns=main.lst -DDEBUG -mmcu=atmega168 -o main.elf main.o irmp.o
5
...

Wie man hier in der letzten Zeile sieht, werden nur main.o und irmp.o 
zusammen gelinkt - kein irmp.h. Das ist so vollkommen korrekt. Hast Du 
vielleicht Dein Makefile, was Du hier gepostet hattest, nochmal nachher 
geändert? Für mich sieht es so aus, als ob Du entweder die SRC-Variable 
im Makefile um irmp.h erweitert hast oder gar OBJECTS. Überprüfe das 
bitte nochmal oder nimm das Makefile, was Du hier gepostet hattest und 
setze lediglich DEBUG auf 0.

Gruß,

Frank

P.S.
Wenn Du das hiesige Makefile nimmst, musst Du wohl die führenden TABs 
reparieren. Ich musste das jedenfalls, bevor ich Dein Makefile testen 
konnte. Du kannst natürlich die letzte angezeigte Zeile auch einfach per 
Copy&Paste in der Shell ausführen ;-)

von eku (Gast)


Lesenswert?

Hallo Frank!

Mit der SVN-Version von IRMP werden nicht mehr alle Codes des 
Siemens-Protokolls erkannt. Samplerate ist 15kHz, kein anderes Protkoll 
aktiv.


DOS-Zeileenden in test-suite.sh sind Mist

./test-suite.sh
-bash: ./test-suite.sh: /bin/sh^M: bad interpreter: Datei oder 
Verzeichnis nicht gefunden
1
$ ../irmp-15kHz -v < Siemens-Gigaset-M740AV-15kHz.txt|grep error
2
error 1: pause after start bit pulse 3 too long: 249
3
error 1: pause after start bit pulse 3 too long: 249
4
error 2: pause 249 after data bit 24 too long
5
error 1: pause after start bit pulse 3 too long: 249
6
error 2: pause 249 after data bit 24 too long
7
error 1: pause after start bit pulse 4 too long: 249
8
error 2: pause 249 after data bit 24 too long
9
error 1: pause after start bit pulse 4 too long: 249
10
error 2: pause 249 after data bit 24 too long
11
error 1: pause after start bit pulse 4 too long: 249
12
error 2: pause 249 after data bit 24 too long
13
error 1: pause after start bit pulse 4 too long: 249
14
error 2: pause 249 after data bit 24 too long
15
error 2: pause 249 after data bit 24 too long
16
error 2: pause 249 after data bit 24 too long
17
error 1: pause after start bit pulse 3 too long: 249
18
error 2: pause 249 after data bit 24 too long
19
error 1: pause after start bit pulse 3 too long: 249
20
error 1: pause after start bit pulse 3 too long: 249
21
error 1: pause after start bit pulse 3 too long: 249
22
error 1: pause after start bit pulse 4 too long: 249
23
error 2: pause 249 after data bit 24 too long
24
error 1: pause after start bit pulse 4 too long: 249
25
error 2: pause 249 after data bit 24 too long
26
error 1: pause after start bit pulse 3 too long: 249
27
error 2: pause 249 after data bit 24 too long
28
error 1: pause after start bit pulse 3 too long: 249
29
error 2: pause 249 after data bit 24 too long
30
error 1: pause after start bit pulse 3 too long: 249
31
error 2: pause 249 after data bit 24 too long

Das ging schon mal besser ;-(

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Hi eku,

eku schrieb:

> DOS-Zeileenden in test-suite.sh sind Mist

Weiß ich schon seit 25 Jahren ;-)

Nee, im Ernst, ich nutze unter Linux noch meinen eigenen CVS-Server. 
Wenn ich dann unter Windows das Script wieder auschecke, geraten die 
DOS-Zeilenenden da rein. Wenn ich dann anschließend über SVN (unter 
Windows) das Script wieder einchecke, isses dann kaputt. Ich werde das 
Script im CVS explizit auf binary setzen, dann passiert das nicht mehr.

> [code]
> $ ../irmp-15kHz -v < Siemens-Gigaset-M740AV-15kHz.txt|grep error

Kann ich nicht nachvollziehen. Ich habe mir dazu extra nochmal die 
SVN-Version geholt, aus test-suite.sh die DOS-Zeilenenden entfernt und 
dann laufen lassen. Geht ganz normal durch.

Auch Deine obitge Zeile mit Siemens-Gigaset-M740AV-15kHz.txt läuft 
anstandslos durch. Wie hast Du denn irmp-15kHz erzeuhgt? Wenn, dann 
solltest Du die Linux-Binaries mit

  make -f makefile.lnx

erstellen.

> Das ging schon mal besser ;-(

Das geht immer noch so gut ;-)

Gruß,

Frank

von eku (Gast)


Lesenswert?

Frank M. schrieb:
>> [code]
>> $ ../irmp-15kHz -v < Siemens-Gigaset-M740AV-15kHz.txt|grep error
>
>
> Kann ich nicht nachvollziehen. Ich habe mir dazu extra nochmal die
> SVN-Version geholt, aus test-suite.sh die DOS-Zeilenenden entfernt und
> dann laufen lassen. Geht ganz normal durch.

Bitte setze in irmpconfg.h alle Protokolle außer Siemens auf 0 und
teste noch einmal!

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

eku schrieb:
> Bitte setze in irmpconfg.h alle Protokolle außer Siemens auf 0 und
> teste noch einmal!

Sag mal, kannst Du mit solchen Infos nicht sofort rauskommen, damit ich 
mir nicht einen Wolf suchen muss?

Sobald DENON eingeschaltet ist, funktioniert die SIEMENS-Erkennung.

Bin dran,

Frank

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

eku schrieb:
> Bitte setze in irmpconfg.h alle Protokolle außer Siemens auf 0 und
> teste noch einmal!

Ist korrigiert und eingecheckt. Es fehlte ein else im Code. Der Fehler 
trat nur auf bei deaktiviertem DENON-Protokoll.

Gruß,

Frank

von eku (Gast)


Lesenswert?

Frank M. schrieb:
> Der Fehler trat nur auf bei deaktiviertem DENON-Protokoll.

Danke. Die Testsuite sollte zusätzlich jedes Protokoll für sich testen, 
damit solche Fehler früher auffallen. Dazu braucht es aber Binaries für 
jedes Protokoll. Sollte per Makefile nichht zu kompliziert sein.

Fehlt noch ein Lösung für den Ausschluss von RC5 und FDC/RCCAR wie in
Beitrag "Re: IRMP - Infrared Multi Protocol Decoder" geschrieben.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Im SVN ist eine neue Testversion, welche den Konflikt zwischen RC5 und 
FDC bzw. RCCAR aufhebt.

Kurze Schilderung der Lösung:

Wird RC5 erkannt und passt das Start-Bit zeitlich auch als 
FDC-Protokoll, dann laufen 2 Decoder los. Sobald einer von beiden einen 
Timing-Fehler erkennt, beendet er sich und der andere gewinnt. Dasselbe 
gilt für das RCCAR-Protokoll. Funktioniert mit meinen vorliegenden 
Scan-Daten tadellos.

Man sollte sich aber wirklich überlegen, ob man RC5 und FDC bzw. RC5 und 
RCCAR in Kombination einschalten sollte. Der Decoder für FDC kostet nur 
50 Bytes im Binary, wenn RC5 deaktiviert ist. Ist sowohl RC5 als auch 
FDC eingeschaltet, dann erhöht sich der Platzbedarf des "dualen 
Decoders" auf 500 Bytes. Dasselbe gilt für das RCCAR-Protokoll.

Naja, wer RC5 unbedingt braucht... ich brauchs nicht ;-)

Viel Spaß,

Frank

von eku (Gast)


Lesenswert?

Frank M. schrieb:
> Naja, wer RC5 unbedingt braucht...

Das hängt doch in erster Linie von den rumliegenden Fernbedienungen ab. 
Und so alt ist mein DVD-Spieler nun auch nicht. Problematisch ist in 
meinen Augen, dass es so viele unterschiedliche Protokolle existieren.

von eku (Gast)


Lesenswert?

Hallo Frank!

Wenn man die "static PROGMEM IRMP_PARAMETER" Blöcke in ein Array 
ir_protos legt und darüber das Protkoll detektiert, spart das noch 
einmal Flash für die vielen Vergleiche:
1
          uint8_t i;
2
          for (i = 0; i < NELEMS (ir_protos); i++)
3
            {
4
              if (pulse_time >= ir_protos[i].start_len_min &&
5
                  pulse_time <= ir_protos[i].start_len_max &&
6
                  pause_time >= ir_protos[i].pause_len_min &&
7
                  pause_time <= ir_protos[i].pause_len_max)
8
                {
9
                  DPRINTF ("protocol %d\n", i);
10
                  ir_data.protocol = i;
11
                  ir_protop = &ir_protos[i];
12
                  break;
13
                }
14
            }
15
          if (i == NELEMS (ir_protos))
16
            {
17
              DPRINTF ("protocol UNKNOWN\n");
18
              /* wait for another start bit */
19
              start_bit_detected = 0;
20
            }

Bitte Variablennamen **kreativ** an irmp anpassen.

von Frank M. (ukw) (Moderator) Benutzerseite


Angehängte Dateien:

Lesenswert?

Ich habe gestern abend mal meine FDC-Pollin-Tastatur mit IRMP getestet. 
Dabei konnte ich noch ein paar Geheimnisse lüften. Die vermeintlichen 
REPEAT-Bits im Frame kennzeichnen keine Wiederholung, sondern das 
Drücken bzw. Loslassen einer Taste. Damit können dann auch 
Tasten-Kombinationen wie

  SHIFT + A
  ALT + M
  STRG + C
  usw.

erkannt werden.

Ich habe IRMP dahingehend angepasst, dass in den untersten 7 Bit der 
Keycode der Taste gespeichert ist und im oberen 8. Bit vermerkt wird, ob 
die Taste gedrückt oder losgelassen wird. Die entsprechende Änderungen 
im IRMP habe ich als Version 1.6.9 ins SVN eingecheckt.

Ebenso habe ich prototypisch eine kleine C-Funktion geschrieben, welche 
aus einem Keycode oder einer Keycode-Folge (bei obigen 
Tastenkombinationen) den zugehörigen ASCII-Code ermittelt, siehe Anhang.

Diese kann entweder direkt auf dem µC zur Ermittlung der Taste oder auf 
dem Host, wo die irmp-Datenstruktur hin übertragen wird, eingesetzt 
werden.

Gruß,

Frank

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Hi eku,

eku schrieb:
> Wenn man die "static PROGMEM IRMP_PARAMETER" Blöcke in ein Array
> ir_protos legt und darüber das Protkoll detektiert, spart das noch
> einmal Flash für die vielen Vergleiche:

Gute Idee, geht zwar nicht ganz so glatt, wie Du es darstellst, aber das 
kann durchaus was bringen. Werde ich testen.

Gruß,

Frank

von eku (Gast)


Lesenswert?

Noch ein Vorschlag:
1
#if F_INTERRUPTS >= 14500
2
#define IRMP_SUPPORT_SIEMENS_PROTOCOL           0       // flag: support Siemens Gigaset       uses ~150 bytes
3
#else
4
#define IRMP_SUPPORT_SIEMENS_PROTOCOL           0       // DO NOT CHANGE! F_INTERRUPTS too low!
5
#endif

ändern in
1
#if F_INTERRUPTS < 14500
2
#undef IRMP_SUPPORT_SIEMENS_PROTOCOL
3
#define IRMP_SUPPORT_SIEMENS_PROTOCOL 0
4
#pragma warning: F_INTERRUPTS too low, disapling SIEMENS protocol
5
#endif

und den eigentlichen
1
#define IRMP_SUPPORT_SIEMENS_PROTOCOL           0       // flag: support Siemens Gigaset       uses ~150 bytes

hoch zu den anderen Protokollen. Analog die anderen Problemprotokolle.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Neue Version 1.7.0 von IRMP verfügbar, Download unter

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

Änderungen gegenüber 1.6.0:

  - Neues Protokoll: RCCAR
  - Tastenerkennung für FDC-Protokoll (IR-keyboard) erweitert
  - Konflikte FDC <--> RC5 beseitigt
  - Interrupt-Frequenz nun bis zu 20kHz (und mehr) möglich

Ebenso ist nun die Version 1.7.0 von IRSND verfügbar, Download unter

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

Änderungen gegenüber 1.6.0:

  - Neues Protokoll: RCCAR


Die Dokumentation im IRMP-Artikel habe ich auch angepasst bzw. 
erweitert, siehe:

  http://www.mikrocontroller.net/articles/IRMP

Für die Pollin-FDC-Tastatur habe ich im Artikel ein eigenes Kapitel 
vorgesehen, wo sämtliche Tasten/Keycodes und die Anwendung mit IRMP 
dokumentiert sind:

  http://www.mikrocontroller.net/articles/IRMP#IR-Tastaturen

@Hugo Portisch:

Kannst loslegen mit der USB-Portierung ;-)

@eku & @ Torsten Kalbe:

Ich habe bei der FDC-Tastatur und einem TSOP1736 als Empfänger nur eine 
Reichweite von max. 15cm, das ist viel zu wenig. Klar, die 
Modulationsfrequenz der FDC-Tastatur ist 38kHz, daher sollte die 
Reichweite bei meinem Aufbau schon eingeschränkt sein. Aber ich dachte 
schon, dass ein paar Meter drin sein müssten. Naja, ich werden den 
TSOP1736 mal durch einen TSOP1738 ersetzen und dann nochmal testen. 
Welche Reichweite schafft Ihr mit der Tastatur?

Viel Spaß,

Frank

von eku (Gast)


Lesenswert?

Hallo Frank!

Frank M. schrieb:
> Tastenerkennung für FDC-Protokoll (IR-keyboard) erweitert

Was liefert eigentlich das Steuerkreuz rechts der Tastatur? Soweit ich 
mich erinnere sind da mehr als nur 4 Richtungen möglich.
1
#if IRMP_SUPPORT_SIEMENS_PROTOCOL == 1 && F_INTERRUPTS < 15000
2
#warning F_INTERRUPTS too low, SIEMENS protocol disabled (should be at least 15000)
3
#endif
4
5
#if IRMP_SUPPORT_RECS80_PROTOCOL == 1 && F_INTERRUPTS < 20000
6
#warning F_INTERRUPTS too low, RECS80 protocol disabled (should be at least 20000)
7
#endif
8
9
#if IRMP_SUPPORT_RECS80EXT_PROTOCOL == 1 && F_INTERRUPTS < 20000
10
#warning F_INTERRUPTS too low, RECS80EXT protocol disabled (should be at least 20000)
11
#endif

Wo sind denn die undefs für das 'disabled' geblieben?

Prinzipiell sollte F_INTERRUPTS auf den höchsten benötigten Wert anhand 
der aktivierten Protokolle automatisch gesetzt werden. Warum den 
Benutzer damit belasten. Dann entfallen auch die Warnungen und 
Automatismen zur Deaktivierung von Protkollen. Gegenteilige Meinungen?

von eku (Gast)


Lesenswert?

Frank M. schrieb:
> eku schrieb:
>> Wenn man die "static PROGMEM IRMP_PARAMETER" Blöcke in ein Array
>> ir_protos legt und darüber das Protkoll detektiert, spart das noch
>> einmal Flash für die vielen Vergleiche:
> Gute Idee, geht zwar nicht ganz so glatt, wie Du es darstellst, aber das
> kann durchaus was bringen. Werde ich testen.

Gibt es schon Erkenntnisse bezüglich Speicherverbrauch?

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Hi eku,

eku schrieb:
> Was liefert eigentlich das Steuerkreuz rechts der Tastatur? Soweit ich
> mich erinnere sind da mehr als nur 4 Richtungen möglich.

Das Ding ist nach meinen Versuchen her ziemlich unbrauchbar, da kommen 
relativ wirkürlich 4 verschiedene Bits für oben, unten, rechts, oben und 
bei Zwischenstellungen dann die Summen davon. Leider ist das aber so 
ungenau, dass da beim Drücken des Steuerkreuzes nach rechts so ziemlich 
alles kommt zwischen unten, unten-rechts, rechts, oben-rechts und oben.
Daher habe ich aufgegeben, das Steuerkreuz zu decodieren. Es wird 
schlichtweg ignoriert.

> Wo sind denn die undefs für das 'disabled' geblieben?

Vergessen ;-)

Werde ich dieses Wochenende korrigieren.

> Prinzipiell sollte F_INTERRUPTS auf den höchsten benötigten Wert anhand
> der aktivierten Protokolle automatisch gesetzt werden. Warum den
> Benutzer damit belasten. Dann entfallen auch die Warnungen und
> Automatismen zur Deaktivierung von Protkollen. Gegenteilige Meinungen?

Du kommst jedesmal, wenn ich was umbaue nach Deinen Wünschen, mit einer 
neuen Idee. ;-)

Ob eine 20kHz-Interrupt-Rate bei einer CPU-Frequenz von 8MHz noch 
sinnvoll ist, kann ich nicht beurteilen. Wenn man alle Protokolle 
einschaltet, könnte es dabei eng werden. Um das herauszubekommen, müsste 
man mal die Belastung der CPU in der ISR messen.

Ich halte wenig von Deiner Idee, die Interrupt-Frequenz selbst zu 
bestimmen, denn ich möchte den Anwender von IRMP nicht übermäßig 
bevormunden. Vielleicht hat er durchaus Gründe, die ISR mit 15kHz 
anzusprechen statt mit 10kHz, auch wenn 10kHz reichen würde. Auch kommt 
es darauf an, welchen Timer er nimmt. Die Wahl des Timers und die Wahl 
der Vorteiler/Timing-Register bestimmt die Frequenz und nicht umgekehrt.

Gruß,

Frank

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

eku schrieb:
> Frank M. schrieb:
>> eku schrieb:
>>> Wenn man die "static PROGMEM IRMP_PARAMETER" Blöcke in ein Array
>>> ir_protos legt und darüber das Protkoll detektiert, spart das noch
>>> einmal Flash für die vielen Vergleiche:
>> Gute Idee, geht zwar nicht ganz so glatt, wie Du es darstellst, aber das
>> kann durchaus was bringen. Werde ich testen.
>
> Gibt es schon Erkenntnisse bezüglich Speicherverbrauch?

Nein, da habe ich mich noch nicht durchringen können, das umzusetzen. 
Ich schwanke nämlich mittlerweile, ob ich diese "Optimierung" überhaupt 
machen soll, nämlich aus folgenden Gründen:

1. Jetzt werden die Startbit-Timings gegen Konstanten geprüft. Das ist
   mit nur wenigen CPU-Takten möglich. Beim Testen der Timings gegen
   Variablen in einer for-Schleife dauert der Check eines Protokolls
   gegen die Startbit-Timings wesentlich länger, weil dann erstmal
   die Variablen in Register geladen werden müssen, um sie gegen die
   ermittelten Timing-Werte zu testen. Bei knapp 20 Protokollen kommt
   da einiges an Laufzeit zusammen, was da zusätzlich verbraten wird.
   Da dies alles innerhalb eines einzigen ISR-Laufes passieren muss,
   kann das arg knapp werden. Man spart zwar Speicherplatz, aber auf
   Kosten von Laufzeit.

2. Wenn Du Dir die Startbit-Timing-Checks anschaust, wirst Du sehen,
   dass nur die wenigsten aller Tests identisch sind. Bei den
   Manchester-Protokollen (RC5, RC6, Grundig, usw.) sind 4 Tests
   notwendig, bei den anderen nur 2 Tests - aber nur, wenn sie
   ausgezeichnete Startbits haben. Beim Denon-Protokoll, welches
   keine Startbits aufweist, muss ich hingegen wieder 4 Tests machen,
   weil das erste Bit schon eine 0 oder eine 1 sein kann. Ausserdem
   kommen dann evtl. weitere Tests hinzu, beim RC5-Protokoll können
   (wegen des erweiterten RC5-X-Protokolls) auch die ersten beiden
   Puls-Pausen-Werte schon verschieden sein. Desweiteren kommt dann
   noch das "Starten" eines zweiten Parallel-Decoders hinzu, um
   den Konflikt zwischen RC5<->FDC und RC5<->RCCAR zu lösen.
   Wenn man diese ganzen Sonderbedingungen in die for-Schleife
   zusätzlich einbaut, wird das ähnlich viel Code verschlingen
   wie jetzt auch.

Man könnte einen Kompromiss eingehen:

Diejenigen Pulse-Distance-Protokolle, für die keine Sonderbedingungen 
anfallen, kann man in einer for-Schleife zusammenfassen - also SIRCs,
NEC, SAMSUNG, MatSUSHITA, KASEIKYO und noch ein paar andere. Aber ob 
sich das dann noch lohnt? Weiß ich nicht.

Mir schwebt eine andere Optimierung vor: Im Moment ist die Ermittlung 
des Protokolls aus den Startbit-Timings eine lineare Suche. Ab einer 
bestimmten Anzahl wird dies ineffektiv, weil dann N Tests gemacht werden 
müssen. Wenn man die lineare Suche gegen eine baumartige Suche ersetzen 
würde, geht das effektiver und spart Zeit. Die ISR kommt nämlich 
irgendwann ab einem bestimmten N (Anzahl der Protokolle) an seine 
Grenzen, und zwar genau nach dem Empfang des Startbits: hier geht die 
Sucherei los... und das kann lang dauern. Wenn man das durch eine 
Intervallschachtelung ersetzt, braucht man nur noch log2(N) viele Tests.

Ungefährer Algorithmus:

Man teilt die Protokolle in 2 Gruppen: Diejenigen mit kurzen und 
diejenigen mit langen Startbits. Dann kann man schon mal 50% der 
Protokolle auf einen Schlag ausschließen. Dann werden die diese 2 
Gruppen wieder in Untergruppen zerschlagen, so dass man mit einem 
weiteren Test von den 50% wieder 50% ausschließen kann. Dann bleiben nur 
noch 25% übrig usw.

Die Kunst besteht nun darin, diesen Abfragebaum zur Compilezeit 
zusammenzustellen - oder zumindest in der init-Funktion. Da denke ich 
noch drüber nach, wie ich das bewerkstellige.

Gruß,

Frank

von eku (Gast)


Lesenswert?

Hi Frank!

Frank M. schrieb:
> Du kommst jedesmal, wenn ich was umbaue nach Deinen Wünschen, mit einer
> neuen Idee. ;-)

In den 25 Jahren Deiner Softwareentwicklung hast Du bestimmt 
mitbekommen:
  * Softwareentwicklung ist ein iterativer Prozess
  * der Kunde hat immer neue Wünsche an die Software
  * ein Programm, das fertig ist, ist veraltet

Lass Dich von mir nicht entmutigen!

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

eku schrieb:

> Lass Dich von mir nicht entmutigen!

Nönö, alles noch im grünen Bereich ;-)

Ich hatte Dich noch gefragt, welche Reichweite Deine FDC-Tastatur hat, 
wahrscheinlich hast Du es überlesen... mit meinem TSOP1736 und einer 
Reichweite von nur 15cm bin ich nicht zufrieden. Ich weiß, dass ein 
TSOP1738 bei der Tastatur besser geeignet wäre, jedoch kann ich mir 
diese geringe Reichweite damit nicht allein erklären.

Gruß,

Frank

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

eku schrieb:
> Gibt es schon Erkenntnisse bezüglich Speicherverbrauch?

Ich habe das gerade mal getestet:

Alle Startbit-Timings in eine struct gepackt und dann zwei for-Schleifen 
(eine mit ausgezeichneten Startbits: 2 Tests, eine für diejenigen 
Protokolle, die direkt mit den Daten beginnen: 4 Tests) gebaut.

Ergebnis: Wenn alle Protokolle aktiviert sind, liegt die Ersparnis bei 
150 Bytes. Leider steigt die Größe des Datensegments dabei um 140 Byte. 
Wenn weniger Protokolle aktiviert sind, dann ist der Gewinn noch 
geringer.

Das kann man also vergessen: es bringt nichts. Im Gegenteil: die 
Laufzeit vergrößert sich drastisch wegen des Ladens aller Startbit-Werte 
aus der struct in die Register, um den Vergleich durchführen zu können. 
Das Einzige, was mir an der Änderung gefällt, ist, dass der Source 
"schöner" aussieht ;-)

Ich werde daher diese Änderung erstmal auf Eis legen und später 
vielleicht wieder aufgreifen, nämlich dann, wenn ich die lineare Suche 
durch eine Intervallschachtelung ersetzen werde.

Gruß,

Frank

von eku (Gast)


Lesenswert?

Frank M. schrieb:
> Ich hatte Dich noch gefragt, welche Reichweite Deine FDC-Tastatur hat,
> wahrscheinlich hast Du es überlesen... mit meinem TSOP1736 und einer
> Reichweite von nur 15cm bin ich nicht zufrieden.

Nicht überlesen, nur gerade den AVR nicht dabei :-)
Also mein TSOP1736 auf dem Pollin AVR Add-On reagiert noch am anderen 
Ende des Zimmers, d.h. mehr als drei Meter sind kein Problem.

von Torsten K. (nobby)


Lesenswert?

Hy,

ich kann die Reichweite auch nicht so einfach testen, was größer als ein 
paar Meter sein sollte. Dann müßte ich meinen Testempfänger mal mit 
einem 9Volt Block betreiben und die Straße unsicher machen.

Gruß
Torsten

von Micha (Gast)


Lesenswert?

Gehört zwar vielleicht nicht direkt hierher, hat aber mit IRMP zu tun:
wie lässt sich effektiv (speicher- und laufzeittechnisch) eine Art 
Lookup-Tabelle erstellen, die anhängig von empfangenen IR-Daten ein 
Zeichen über die UART sendet?

Ich will nicht den kompletten IR-Frame senden, sondern wirklich nur ein 
einzelnes 8-bit-Zeichen. Nach Möglichkeit sollte das Ganze lernbar sein, 
d.h. nicht festgelegt auf bestimmte IR-Protokolle/-Kommandos. Auch 
verschiedene Protokolle sollten möglich sein.

BTW: IRMP ist ein richtig feines Stück Software... Vielen Dank dafür!

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

eku schrieb:
> Also mein TSOP1736 auf dem Pollin AVR Add-On reagiert noch am anderen
> Ende des Zimmers, d.h. mehr als drei Meter sind kein Problem.

Torsten Kalbe schrieb:

> ich kann die Reichweite auch nicht so einfach testen, was größer als ein
> paar Meter sein sollte. Dann müßte ich meinen Testempfänger mal mit
> einem 9Volt Block betreiben und die Straße unsicher machen.

Danke fürs Feedback, da muss meine Tastatur (eine von 5, die ich 
bestellt hatte) nicht in Ordnung sein, normale Fernbedienungen werden 
nämlich auch bei mir auf 3-5 Meter erkannt. Muss ich heute abend mal die 
zweite Tastatur auspacken....

Gruß,

Frank

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Micha schrieb:
> wie lässt sich effektiv (speicher- und laufzeittechnisch) eine Art
> Lookup-Tabelle erstellen, die anhängig von empfangenen IR-Daten ein
> Zeichen über die UART sendet?

Das ginge mit einer Hash-Funktion. Da hatte mal jemand so etwas im 
Februar diesen Jahres hier in der Codesammlung vorgestellt:

   Beitrag "Universeller IR-Receiver für viele Protokolle"

Hier wird aus dem IR-Frame ein 32-Bit-Hash-Wert berechnet - ohne 
Kenntnis des Protokolls. Hat aber ein paar Stolpersteine... z.B. die 
Behandlung von Repetition-Frames, Eindeutigkeit usw.

Da Du sogar alles in ein einziges Byte packen möchtest, sind doppelte 
Rückgabewerte vorprogrammiert. Auch bei einem 32-Bit-Hash-Wert kann man 
nicht ausschließen, dass zwei verschiedene Fernbedienungen auf 
irgendwelchen Tasten denselben Hash-Wert ergeben. Aber es ist halt 
relativ unwahrscheinlich - jedenfalls dann, wenn die Hash-Funktion "gut" 
ist. Aber eine Hash-Funktion, die nur einen eindeutigen 8-Bit-Wert 
zurückgeben soll - und das ohne Kenntnisse irgendwelcher Protokolle - 
kannste vergessen.

Gruß,

Frank

von Micha (Gast)


Lesenswert?

Frank M. schrieb:
> Aber eine Hash-Funktion, die nur einen eindeutigen 8-Bit-Wert
> zurückgeben soll - und das ohne Kenntnisse irgendwelcher Protokolle -
> kannste vergessen.
Und wenn ich nur ein Protokoll "gleichzeitig" zulassen würde? Wie 
schätzt du die Chancen dann ein?

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Micha schrieb:
> Frank M. schrieb:
> Und wenn ich nur ein Protokoll "gleichzeitig" zulassen würde? Wie
> schätzt du die Chancen dann ein?

Das kommt darauf an, wieviele Tasten Du unterscheiden möchtest. Sind es 
lediglich die Tasten 0-9, kommst Du mit 4 Bit aus. Wenn wir uns noch das 
NEC-Protokoll anschauen, dann ist die Chance, dass Du in Deinem Haushalt 
2 NEC-kompatible Fernbedienungen hast, schon relativ groß. Dass es 
Überschneidungen bei den Tasten '0' bis '9' gibt, ist auch relativ 
wahrscheinlich.

Du müsstest Dich also nicht nur auf ein Protokoll einschränken, sondern 
auch noch auf eine Adresse konzentrieren, um ein Kommando einer FB 
eindeutig zu erkennen. Wenn Du bis zu 32 Tasten unterscheiden möchtest, 
sind 5 Bit weg und Du hast noch 3 Bit, um verschiedene FBs anhand ihrer 
Adresse zu unterscheiden. Das wird arg knapp.

IRMP nutzt nicht umsonst 16 Bit für die Adresse und 16 Bit für das 
Kommando. Meist kommt man mit 8 Bit für die Adresse und 8 Bit für das 
Kommando aus - aber nicht immer.

Warum willst Du Dich unbedingt auf 8 Bit beschränken? Hugo Portisch, der 
den IRMP im USB-IR-Receiver nutzt, überträgt einfach 6 Bytes, nämlich:

1. Byte: irmp_data.protocol
2. und 3. Byte: irmp_data.address
4. und 5. Byte: irmp_data.command
6. Byte: irmp_data.flags

Du könntest natürlich auch mittels IRMP alles in ein Byte packen:

a) Nur ein Protokoll aktivieren, alle anderen deaktivieren

b) irmp_data.address auf einen festen Wert prüfen, also nur
   eine Adresse zulassen

c) Für die Tasten, die Du übertragen willst, einen case-switch
   bauen, der bestimmte Werte von irmp_data.command in die Werte
   1, 2, 3, 4, usw. übersetzt.

Man könnte noch einen Schritt weiter gehen: Bei 32 verschiedenen Tasten 
hast Du dann noch 3 Bits übrig. Damit könntest Du in den 8 Bits 
folgendes codieren:

   RAACCCCC

wobei:

   R    =  Repetition Flag
   AA   =  00 Adresse FB Nr. 1
           01 Adresse FB Nr. 2
           10 Adresse FB Nr. 3
           11 Adresse FB Nr. 4
   CCCCC = 32 verschiedene Tasten

Somit könntest Du dann zumindest für 4 verschiedene FBs 32 verschiedene 
Tasten-Codes übertragen.

Das obige gilt aber nur für IRMP - unter der Voraussetzung, dass man 
nicht nur das Protokoll, sondern auch schon die Tastencodes kennt. Eine 
Hash-Funktion zu finden, die ohne Kenntnis des Protokolls alles in 8 Bit 
ohne Dubletten stopft, halte ich für illusorisch. Und dann auch noch 
"anlernbar"? Da müsste sich die Hash-Funktion selbst modifizieren, 
sobald ein neuer Code angelernt werden soll, um Dubletten zu vermeiden.

Okay, letzter Versuch:

Du nimmst die 32-Bit-Hashfunktion aus

     Beitrag "Universeller IR-Receiver für viele Protokolle"

und trägst den ermittelten 32-Bit-Hash-Wert in eine 256 x 4 Byte große 
Tabelle ein. Dann kannst Du den 8-Bit-breiten Index auf diese Tabelle 
nutzen, um eine Taste zu identifizieren. Kostet Dich leider 1KB RAM ;-)

Gruß,

Frank

von Micha (Gast)


Lesenswert?

Frank M. schrieb:
> Warum willst Du Dich unbedingt auf 8 Bit beschränken? Hugo Portisch, der
> den IRMP im USB-IR-Receiver nutzt, überträgt einfach 6 Bytes, nämlich:
Ich habe ähnliches vor wie Hugo, allerdings wollte ich den AVR (einen 
ATtiny84) "direkt als Tastatur" nutzen, also ohne dlls und dergleichen.

Anlernbar sollte heißen, dass man die IR-Kommandos beliebig einer Taste 
zuweisen kann, à la "Drücken Sie jetzt die Taste für 'a' auf Ihrer 
FB"...

von Micha (Gast)


Lesenswert?

Im Prinzip wollte ich das hier 
http://www.obdev.at/products/vusb/hidkeys.html ohne Tasten und 
stattdessen mit IR-Empfänger bauen.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Micha schrieb:
> Anlernbar sollte heißen, dass man die IR-Kommandos beliebig einer Taste
> zuweisen kann, à la "Drücken Sie jetzt die Taste für 'a' auf Ihrer
> FB"...

Wo ist das Problem? Du nimmst IRMP und eine NEC-kompatible 
Fernbedienung. Da sind die Codes zwischen 0x00 und 0xFF.

Zu jeder Taste (z.B. 'a') merkst Du Dir imrp_data.command.

Gruß,

Frank

von Micha (Gast)


Lesenswert?

Frank M. schrieb:
> Du nimmst IRMP und eine NEC-kompatible Fernbedienung. Da sind die Codes
> zwischen 0x00 und 0xFF.
Das wäre natürlich eine Möglichkeit. Nachdem ich eine 
Universal-Fernbedienung habe ist das Protokoll eh relative egal - ich 
muss mir halt ein entsprechendes Gerät aus der Datenbank suchen.

Wenn ich so darüber nachdenke müsste es sogar möglich sein mir was 
eigenes zu basteln.

Ich werd mal verschiedenes testen. Vielen Dank für die Tipps!

von Micha (Gast)


Lesenswert?

Frank M. schrieb:
> Du nimmst IRMP und eine NEC-kompatible Fernbedienung. Da sind die Codes
> zwischen 0x00 und 0xFF.
Das wäre natürlich eine Möglichkeit. Nachdem ich eine 
Universal-Fernbedienung habe ist das Protokoll eh relative egal - ich 
muss mir halt ein entsprechendes Gerät aus der Datenbank suchen.

Wenn ich so darüber nachdenke müsste es sogar möglich sein mir was 
eigenes zu basteln.

Ich werd mal Verschiedenes testen. Vielen Dank für die Tipps!

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Hallo zusammen,

es gibt einen Bugfix für IRMP - Version 1.7.2, Download unter

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

Änderungen gegenüber 1.7.1:

 - Bugfix: Einführen eines Timeouts für NEC-Repetition-Frames, um
   "Geisterkommandos" zu verhindern.

Was ist ein "Geisterkommando"?

Folgende Situation:

1. IRMP empfängt NEC-Kommonda A und weitere Repetition-Frames

2. Danach wird die Taste B lange gedrückt und IRMP empfängt das
   Kommando nicht vollständig - z.B. wegen zu geringer Reichweite oder
   weil die Katze durch den Strahl läuft.

3. Die FB sendet nun Repetition-Frames für Kommando B und IRMP
   interpretiert diese Wiederholungen als Wiederholungen für Kommando A!

Frank Lorenzen hat mich auf den Fehler aufmerksam gemacht, denn er 
konnte dieses Phänomen tatsächlich im "real life" erleben... naja... 
nicht die Katze war schuld ;-) Vielen Dank dafür!

Viel Spaß,

Frank

von eku (Gast)


Lesenswert?

Frank M. schrieb:
> Version 1.7.2

In irsndconfig.h ist noch die alte Behandlung für 
IRSND_SUPPORT_SIEMENS_PROTOCOL. Würdest Du das bitte an irmpconfig.h 
anpassen, d.h. Ausgabe einer Warnung mit Deaktivierung des Protokolls.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

eku schrieb:
> In irsndconfig.h ist noch die alte Behandlung für
> IRSND_SUPPORT_SIEMENS_PROTOCOL. Würdest Du das bitte an irmpconfig.h
> anpassen, d.h. Ausgabe einer Warnung mit Deaktivierung des Protokolls.

Ich hatte nur IRMP angepasst. IRSND hat noch die alte Version ;-)
Aber klar, ich korrigiere das.

Gruß,

Frank

von Frank L. (florenzen)


Lesenswert?

Frank M. schrieb:

[...]
> Änderungen gegenüber 1.7.1:
>
>  - Bugfix: Einführen eines Timeouts für NEC-Repetition-Frames, um
>    "Geisterkommandos" zu verhindern.
[...]

Funktioniert einwandfrei :-)

> Viel Spaß,
>
> Frank

Vielen Dank für den schnellen Bugfix.

Viele Grüße,
Frank

von jar (Gast)


Lesenswert?

puh alles durchgelesen,

nur habe ich das mit dem Widerholungsflag noch nicht gesehen

kein loslassen, Lautstärke Helligkeit geht ja mit repeat, aber bei 
Programmwahl wäre das ja unglücklich, ergo muss das Bit loslasen 
interpretieren

ist da schon was eingebaut ?

IRMP ist erstmal geil, bin schon am nachbauen,

Probleme bereitet mit bis jetzt nur der heftige Aufwand (für mich)

entweder, Neubau, + Codeumschreibung, denn im Prinzip liegen hier 2(3) 
Geräte mit mega644(32), TSOP1736, LCD, LED, Triber für LCD HG-LED und 
Taster

alle Codes zeigen auf einen mega 88 der einzige Plan (den ich bis jetzt 
gefunden hatte) aber auf einen mega 168

klar könnte ich aus dem Code für mega 88 die Ports ohne Plan extrahieren

da meine HW quasi schon fast steht mal eben die beiden Codes und Quellen 
verheiratet, was aber logisch schief ging, ich nutze halt timer1 für die 
LCD HG LED per pwm OCRA und OCRB für den Kontrast

Ziel ist es aber nach Dekodierung meiner pansonic FB einen FB Sender zu 
generieren der per PC aktiviert wird, über VNC meinen HD Recorder 
fernzuprogramieren, aber da ich nicht noch mehr IR Sendedioden frei 
plazieren möchte, was ist mit IR zu RF 433 MHz Umsetzung, 433 Empfänger 
und IR Sender sind vorhanden, da die ja auf alle FB reagiren vermute ich 
die Trägerfrequenz 30 - 40 kHz ist denen egal, morsen die in 433 Mhz nur 
das an und aus der IR LED ?, wie könnte man ein RF(m?) 12 Modul den 
Transmitter dafür nutzen ?

hier gibt es ja Beispiele für Atmel atmel mit Sender und Empfänger, also 
per seriell Umsetzung, aber ich weiss nicht ob es digital oder analog 
ist was da gesendet wird, habe so eine Funk FB mal belaucht mit dem Oszi 
und Empfängermodul, aber nur Grundrauschen bekommen oder Störsignale, 
weiss aber nicht ob die 433 Module dafür gehen.


wenn sich dazu jemand äussern kann würde mich freuen,

den PC als fernbedienten IR/433 MHz Sender zu nutzen aus dem ganzen 
I-Net muss doch mehr interessieren ?

Rückmeldung der Programmierung geht natürlich toll per winTV und den HD 
Rec am AV Modulator ins Subkabelnetz gespeist, muss also auf dem PC nur 
winTV starten, den HDrec Kanal einstellen und schon kann ich alles 
programmieren, mit 433 MHz brauch ich nicht mal ne Sichtverbindung PC 
HDrec (das macht die IR Pyramide)

von jar (Gast)


Lesenswert?

so
1 Nachbau läuft mit 644 intern 8MHz

meine panasonic DVD wird als KASEIKYO erkannt

nur warum die Tasten OFF (2002/3d0) und TV OFF (2002/3d0) denselben Code 
bringen obwohl 2 getrennte Tasten ist mir noch unklar

loggen kann ich (noch) nicht, kein Maxim spendiert und keine Ahnung wie 
ich das dem PC erkläre

erst mal das Prototypeboard auf Akku umstellen und heim alle FB testen

von jar (Gast)


Lesenswert?

alle in Urlaub ? oder sind meine Fragen zu doof ?

egal, noch ein Versuch

so nun verschiedenste FB durchprobiert

Samsung wird als solche erkannt
drei Panasonic als Kaseikyo

nur alle OFF Knöpfe bringen den selben Code (2002/3d0)

aber natürlich reagieren die Geräte nicht so

VHS off Kaseikyo 2002/3d0 nur der VHS geht aus
HDrec off Kaseikyo 2002/3d0 nur der HDrec geht aus
TV off Kaseikyo 2002/3d0 weder der HDrec noch der VHS geht aus

alle RC5 FB zeigen im IRMP nix an (interner 8MHz), dabei geht "meine" 
andere Schaltung mit 8 MHz Quarz und Fleury RC5 Lib wohl

wo soll ich nun suchen ?

Jitter ? auf 8 MHz Quarz umstricken ?
internen auf 8 MHz kalibrieren (keine Ahnung wie das geht) meine andere 
Idee, einfach an den Teilern drehen bis 1s Blink LED 1s auf dem Oszi 
wird ?

1s soll ja nach 10000 ISR aufrufen vergangen sein

ergo lasse ich eine uint16 VAR immer wieder von 0-10000 laufen

in ISR wird uint16 VAR++
in main auf uint16 VAR >= 10000 abgefragt und 0 gesetzt und LED Bit xor 
gesetzt

muss ja 1s Puls / Pause rauskommen

von Joachim B. (jar)


Lesenswert?

so, mal wieder angemeldet das ich Antworten per mail bekomme

danke

gruss
jar

von Joachim B. (jar)


Lesenswert?

jar schrieb:
>
> 1s soll ja nach 10000 ISR aufrufen vergangen sein
>
> ergo lasse ich eine uint16 VAR immer wieder von 0-10000 laufen
>
> muss ja 1s Puls / Pause rauskommen

Kommando zurück, man sollte RC5 auch enabeln

hatte ich schon mal dann aber neu angefangen und vergessen

wer also noch Codes braucht kann sich ja melden, ich versuche dann den 
Max nachzurüsten und aufzuzeichnen

und suche immer noch ne Lösung für 433 MHz send statt IR (das IR 
überlasse ich den IR Pyramiden)

hat schon jemand IRSND am PC zu USB mit Atmel ?

wenn hier keiner ne bessere Idee hat nehme ich einen Atmal als USB zu 
rs232 Umsetzer und frickel da IRSND ein, ggffs mit 433 MHz Modul

von Joachim B. (jar)


Angehängte Dateien:

Lesenswert?

puh, schwerer als gedacht

also die JVC RM C085 wird nicht erkannt, obwohl JVC unter Nec als RC5 
geführt wird, aus dem TSOP1736 kommt schönes Signal raus so das ich die 
Frequenz erst mal nicht vermessen hab,

Interrupt auf 15k hochgesetzt hat nix gebracht, den Rest nicht 
verschlechtert aber der JVC nicht geholfen.

Der Oszi liefert schönen Stream sieht aber dem RC5 der erkannt wird 
nicht ähnlich

Anlage in der Zip:
ein PIC vom Oszi
hardcopy -> Ref1 ist unbekannte JVC und Ref2 ist bekannte Pinnacle RC5

und die Daten als 2x CSV (JVC-FB und Pinnacle FB RC5) und einmal zu XLS 
umgesetzt

ich hoffe das Projekt lebt noch und sind alle nur in Urlaub

ich mache mich nun an die 433 MHz Umsetzung und hoffe weiter auf 
Antworten auf meine Fragen

liebe gruesse
jar

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

jar schrieb:

> meine panasonic DVD wird als KASEIKYO erkannt

Prima.

> nur warum die Tasten OFF (2002/3d0) und TV OFF (2002/3d0) denselben Code
> bringen obwohl 2 getrennte Tasten ist mir noch unklar

Beim Kaseikyo-Protokoll (48 Bit!) werfe ich sämtliche CRCs raus. 
Vielleicht etwas zuviel...

Aktiviere bitte IRMP_LOGGING und schicke mir die Scan-Dateien. Dann 
werde ich den Unterschied schon finden.

> loggen kann ich (noch) nicht, kein Maxim spendiert und keine Ahnung wie
> ich das dem PC erkläre

Du startest einfach ein Terminal-Emulationsprogramm (z.B. HyperTerm) und 
speicherst die Ausgabe.

jar schrieb:

> alle in Urlaub ? oder sind meine Fragen zu doof ?

Ja, bis gestern :-)

> Samsung wird als solche erkannt

Gut.

> drei Panasonic als Kaseikyo

Auch gut.

> nur alle OFF Knöpfe bringen den selben Code (2002/3d0)

Wie gesagt: ich brauche die Scans dazu.

> alle RC5 FB zeigen im IRMP nix an (interner 8MHz), dabei geht "meine"
> andere Schaltung mit 8 MHz Quarz und Fleury RC5 Lib wohl

Scan schicken. Vielleicht haben wir hier nur eine zu starke Abweichung 
vom RC5-Timing.

> Jitter ? auf 8 MHz Quarz umstricken ?

Quarz ist auf jeden Fall gut. Bitte auch hier die Scan-Datei schicken, 
dann kann ich Dir mehr sagen.

> internen auf 8 MHz kalibrieren (keine Ahnung wie das geht) meine andere
> Idee, einfach an den Teilern drehen bis 1s Blink LED 1s auf dem Oszi
> wird ?

IRMP ist vom Timing her ziemlich tolerant. Bist Du sicher, dass Dein 
Timer mit der richtigen Frequenz läuft? Zeigst Du bitte mal die Passagen 
Deiner Timer-Initialisierung?

Joachim B. schrieb:

> Kommando zurück, man sollte RC5 auch enabeln

RC5 geht also jetzt?

> wer also noch Codes braucht kann sich ja melden, ich versuche dann den
> Max nachzurüsten und aufzuzeichnen

Ja, wäre nicht schlecht.

> und suche immer noch ne Lösung für 433 MHz send statt IR (das IR
> überlasse ich den IR Pyramiden)

Du meinst die 433 MHz-Sender/Empfänger von Pollin, die RFM12?
Sag mal genau, was Du willst. Sowas vielleicht:

         IR               Funk
IR-FB ---------> RFM12 ---------> RFM12 ------> Und was dann????


> hat schon jemand IRSND am PC zu USB mit Atmel ?

Meines Wissens nicht. Nur IRMP zu USB, siehe

Beitrag "USB IR Remote Receiver (V-USB + IRMP)"

> wenn hier keiner ne bessere Idee hat nehme ich einen Atmal als USB zu
> rs232 Umsetzer und frickel da IRSND ein, ggffs mit 433 MHz Modul

Male bitte mal ein Schaubild, ich verstehe nicht ganz, was Du vorhast.

Joachim B. schrieb:

> also die JVC RM C085 wird nicht erkannt, obwohl JVC unter Nec als RC5
> geführt wird, aus dem TSOP1736 kommt schönes Signal raus so das ich die
> Frequenz erst mal nicht vermessen hab,

Bitte Scan schicken.

> Anlage in der Zip:
> ein PIC vom Oszi

Nützt mir nichts.

> hardcopy -> Ref1 ist unbekannte JVC und Ref2 ist bekannte Pinnacle RC5

Nützt mir nichts.

> und die Daten als 2x CSV (JVC-FB und Pinnacle FB RC5) und einmal zu XLS
> umgesetzt

Nützt mir nichts.

> ich hoffe das Projekt lebt noch und sind alle nur in Urlaub

Jau :-)

> ich mache mich nun an die 433 MHz Umsetzung und hoffe weiter auf
> Antworten auf meine Fragen

Siehe oben.

Gruß,

Frank

von Joachim B. (jar)


Lesenswert?

hmmm, schade das die die CSV Dateien nix nutzen
jede Zeile ist 10µs also ist bei Zeile 70 der Wechsel bei 700 µs und so 
weiter, ist das für dich nicht lesbar ?

ist Exelformat und die XLS ist schon zu µs umgesetzt

oszi zu CSV oder XLS ist halt schneller als HW bauen

ich verstehe auch nicht manche Kommentare im Quellcode

mal wird JVC als RC5 bezeichnet mal als NEC aber hier steht was anderes
http://www.sbprojects.com/knowledge/ir/jvc.htm

JVC unterscheidet in 1 und Null bits zu 1 ms und 2 ms und das sehe ich 
auf dem Oszi, aber im Quellcode nicht ???

ich dachte auch mein JVC hat zu große Abweichung im Timing, aber ! 1ms 
und 2ms sind nahezu exakt nur warum werden die nicht erkannt ?

also wenn es nicht anders geht muss ich den MAX wohl noch nachrüsten

433 MHz

Ziel ist es später im PC den Code nicht auf eine IR Diode auszugeben 
sondern statt IR Diode auf einen 433 MHz Sender ähnlich den 
Funkfernedienungen oder der FB Transmitter (IR Empfänger - Funkstrecke 
433 MHz - IR Sender)

da zwei 433 MHz Empfänger mit IR Sendedioden schon im Zimmer stehen wäre 
es doch schön wenn der PC den IR Code statt in IR zu senden 433 MHz 
senden würde, dann spart man sich die PC IR Sendediode Ausrichtung zu 
den Geräten. ausgerichtet sind die Pyramiden ja schon

Ziel des ganzen, per PC den HD Recorder zu programmieren, auch übers 
I-Net (VNC)

war der Urlaub schön ?

liebe gruesse
achim

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Joachim B. schrieb:
> hmmm, schade das die die CSV Dateien nix nutzen
> jede Zeile ist 10µs also ist bei Zeile 70 der Wechsel bei 700 µs und so
> weiter, ist das für dich nicht lesbar ?

Es muss nicht für mich, sondern für IRMP lesbar sein, ich analysiere die 
Scans mit IRMP unter Linux, siehe auch Artikel:

  http://www.mikrocontroller.net/articles/IRMP#IRMP_unter_Linux_und_Windows

Du kannst natürlich Deine XLS-Dateien wieder ins IRMP-Format umwandeln, 
das geht so: für jede zehntausendstel Sekunde schreibst Du eine 1, wenn 
der Empfänger aus war, für jede zehntausendstel Sekunde schreibst Du 
eine 0, wenn der Empfänger aktiv war. Das gibt dann eine Folge von 0en 
und 1en in einer langen Zeile z.B. so:

000000011111111111111000111000111.....

Davor schreibst Du noch einen Kommentar:

# OFF-Taste TV
000000011111111111111000111000111.....
# OFF-Taste VCR
000000011111111111111000111000111.....

> ist Exelformat und die XLS ist schon zu µs umgesetzt

Nützt mir nichts. IRMP "versteht" halt nur das IRMP-Format selbst.

> oszi zu CSV oder XLS ist halt schneller als HW bauen

Naja, einen MAX232 dranbauen ist auch nicht soooo schwierig.

> ich verstehe auch nicht manche Kommentare im Quellcode

Welche?

> mal wird JVC als RC5 bezeichnet mal als NEC aber hier steht was anderes
> http://www.sbprojects.com/knowledge/ir/jvc.htm

JVC ist nicht notwendigerweise RC5 oder NEC. JVC ist einfach ein 
Hersteller, der verschiedene IR-Protokolle verwendet. Meist jedoch NEC.

> JVC unterscheidet in 1 und Null bits zu 1 ms und 2 ms und das sehe ich
> auf dem Oszi, aber im Quellcode nicht ???

Schau Dir im IRMP-Artikel folgende Tabelle an:

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

Da sind alle Timings der von IRMP unterstützten Protokolle aufgeführt.

Im Quellcode findest Du diese Timings wieder in irmp.h. Sie sind in der 
Header-Datei, da sie auch von IRSND verwendet werden.

> ich dachte auch mein JVC hat zu große Abweichung im Timing, aber ! 1ms
> und 2ms sind nahezu exakt nur warum werden die nicht erkannt ?

Wie gesagt: Scan-Datei hilft weiter.

> also wenn es nicht anders geht muss ich den MAX wohl noch nachrüsten

Jepp :-)

> Ziel ist es später im PC den Code nicht auf eine IR Diode auszugeben
> sondern statt IR Diode auf einen 433 MHz Sender ähnlich den
> Funkfernedienungen oder der FB Transmitter (IR Empfänger - Funkstrecke
> 433 MHz - IR Sender)

Also:

        IR                        Funk                        IR
IR-FB -----> RFM-Sender mit IRMP -----> RFM-Empf. mit IRSND ------> 
fernzubedienendes Gerät

Geht mit IRSND, siehe IRMP-Artikel.

Das einzige, was fehlt, ist der Code für die RFM-Module. Aber da gibt es 
ja hier im Forum genügend Quellcode, wo man sich bedienen kann.

Gruß,

Frank

von Joachim B. (jar)


Lesenswert?

Sag mal genau, was Du willst. Sowas vielleicht:

         IR               Funk
IR-FB ---------> RFM12 ---------> RFM12 ------> Und was dann????


so ähnlich,

wenn der Atmel oder PC erst mal alle KASEIKYO Codes kennt soll der PC 
diese senden (notfalls über den Umweg eines Atmels)

aber es soll KASEIKYO nicht in IR gesendet werden, sondern in 433 MHz 
und ja ich denke an die RM12 Module, diese senden dann ungerichtet vom 
PC auf die Empfängerpyramiden die das dann zu IR Strahlung gerichtet 
umsetzen bis zum HD Recorder

Kaseikyo Code von PC (ggffs mit Hilfe eines ATMEGA) als 433 MHz an 
Funkempfängerpyramide - in IR an HDrec
PC kaseikyo Code ---------> RFM12 ---------> Funkempfängerpyramide 
------> IR ------> HD Rec

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Joachim B. schrieb:
> Ziel des ganzen, per PC den HD Recorder zu programmieren, auch übers
> I-Net (VNC)

Dann würde doch folgendes reichen:

USB-to-RS232 -> MAX232 -> AVR

Den USB-to-RS232-Wandler bekommst Du überall für ein paar Euros 
nachgeworfen. Dann kannst Du über die COM-Schnittstelle Befehle an den 
AVR senden. Dort läuft IRSND, welcher die Befehle per IR-LED wieder 
aussendet.

Anregungen findest Du vielleicht hier:

  http://www.klaus-leidinger.de/mp/Mikrocontroller/IR-LCD/IR-LCD.html

> war der Urlaub schön ?

Danke, oft über 40°C und viel Sonne :-)

Gruß,

Frank


P.S.
Ausgerechnet Kaseikyo unterstützt IRSND (das Gegenstück zu IRMP) noch 
nicht. Könnte sich aber ändern, wenn ich genügend "Futter" in Form von 
Scans bekomme ;-)

von Joachim B. (jar)


Lesenswert?

Frank M. schrieb:
> Joachim B. schrieb:
>> Ziel des ganzen, per PC den HD Recorder zu programmieren, auch übers
>> I-Net (VNC)
>
> Dann würde doch folgendes reichen:
>
> USB-to-RS232 -> MAX232 -> AVR

>> war der Urlaub schön ?
> Danke, oft über 40°C und viel Sonne :-)
> Gruß,
> Frank
>
> P.S.
> Ausgerechnet Kaseikyo unterstützt IRSND (das Gegenstück zu IRMP) noch
> nicht. Könnte sich aber ändern, wenn ich genügend "Futter" in Form von
> Scans bekomme ;-)

also da denke ich eher an:
http://www.embedded-projects.net/index.php?page_id=135

mit
http://www.embedded-projects.net/index.php?page_id=160

da habe ich etwas mitgewirkt (Platinengröße für USB Stickgehäuse), der 
kann auch als USB zu RS232 Umsetzer arbeiten (über virtcom Treiber) und 
statt den Code als RS232 auzugeben wird das Kommando direkt als KASEIKYO 
ausgegeben (mittels IRSND an 433 MHz)

Ich muss dann eben die RS232 Schnitte nachrüsten in meinem IRMP (seufs 
geht nicht wirklich leicht auf dem Steckbrett, muss wohl erst ne Platine 
schnitzen) damit ich dich mit KASEIKYO Codes füttern kann

dann ist da noch das 433 MHz Problem, senden empfangen mag ja in den 
RS232 Atmel Funkstrecken gehen, ist aber digital, meine Versuche eine 
China Funk FB (Cam RF Remote Auslöser , Canon Pentax, alle nach dem 
selben Prinzip, 4 DIP für Sende/Empfang an Cam mit kleinen Handsender 
mit Stabantenne) zu belauchen mit den Modulen war erfolglos, scheint mir 
analog zu sein....

von Joachim B. (jar)


Lesenswert?

Frank M. schrieb:
> Du kannst natürlich Deine XLS-Dateien wieder ins IRMP-Format umwandeln,
>
> das geht so: für jede zehntausendstel Sekunde schreibst Du eine 1, wenn
>
> der Empfänger aus war, für jede zehntausendstel Sekunde schreibst Du
>
> eine 0, wenn der Empfänger aktiv war. Das gibt dann eine Folge von 0en
>
> und 1en in einer langen Zeile z.B. so:
>
>
>
> 000000011111111111111000111000111.....
>
>
>
> Davor schreibst Du noch einen Kommentar:
>
>
>
> # OFF-Taste TV
>
> 000000011111111111111000111000111.....
>
> # OFF-Taste VCR
>
> 000000011111111111111000111000111.....
>
>
>
>> ist Exelformat und die XLS ist schon zu µs umgesetzt
>
>
>
> Nützt mir nichts. IRMP "versteht" halt nur das IRMP-Format selbst.
>
>
>
>> oszi zu CSV oder XLS ist halt schneller als HW bauen
>
>
>
> Naja, einen MAX232 dranbauen ist auch nicht soooo schwierig.


zu umwandeln, low aktiv oder high aktiv ?

in Ruhe kommen 5V aus dem TSOP 1736 wenn IR Signale erkannt werden 
wechselt es zu low


also 1 = 0 ? und 0 = 1 ?

dem MAX anbauen ist schwierig, weil 1. kein max232 in der Kiste, aber in 
der Datenbank, aber max233 in der Kiste aber nur SMD und da muss ich 
löten, dito macht sub-d in dem steckbrett keinen sinn und in smd hab ich 
den nicht, also muss ich max233 auf SMD und dann auf Lochraster mit 
SUB-D verheiraten bevor es ans Steckbrett geht, ist schon nicht trivial 
für mich mit meene ollen ogen :|

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Joachim B. schrieb:

> zu umwandeln, low aktiv oder high aktiv ?

low aktiv, also genau so, wie sie aus dem TSOP rauskommen.

Gruß,

Frank

von Joachim B. (jar)


Lesenswert?

so, ich baue grad mit dem max233 auf (murphy, natürlich habe ich den nur 
als SO und in der LBR gibt es den nur in DIL und die SO Variante hat 
andere Pinbelegung, deswegen erst mal Symbol und Dev in Eagle bauen, 
mann mann mann, das Leben könnte doch einfacher sein)

kann jemand kurz sagen wozu der Taster ist vergessen ? :o (Plan von Hr. 
Leidinger ?)

und warum muss Vcc an Ri ?

mit den Datenrichtungen DTE / DCE komme ich regelmäßig durcheinander

wer ist hier eigendlich was ? ich denke mal Atmel spielt Modem und 
betrachte ihn als DCE und nicht als DTE

glücklicherweise scheint bis jetzt im Plan alles zu stimmen

liebe gruesse
jar

von Joachim B. (jar)


Lesenswert?

Joachim B. schrieb:
> kann jemand kurz sagen wozu der Taster ist vergessen ? :o (Plan von Hr.
> Leidinger ?)

gefunden bootloader, SW nachladen, kann also raus,
bleibt also die Frage:

> und warum muss Vcc an Ri ?


liebe gruesse
jar

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Joachim B. schrieb:

> bleibt also die Frage:
>> und warum muss Vcc an Ri ?

Wovon redest Du? Vom Pullup am Reset-Pin in der Schaltung von Klaus 
Leidinger?

Gruß,

Frank

von Joachim B. (jar)


Angehängte Dateien:

Lesenswert?

Frank M. schrieb:
> Joachim B. schrieb:
>
>> bleibt also die Frage:
>>> und warum muss Vcc an Ri ?
>
> Wovon redest Du? Schaltung von Klaus Leidinger?
>
> Gruß,
>
> Frank

ja schrieb ich das nicht ?

bald kann ich scans von den FB loggen, dann schick ich alles was ich an 
FB finde

liebe gruesse
jar

von Joachim B. (jar)


Lesenswert?

und nun ? ich wusste ich hasse logging

#ifndef IRMP_LOGGING
#define IRMP_LOGGING                            1       // 1: log IR 
signal (scan), 0: do not (default)
#endif


ich verstehe logging auf 1 ?

steht ja auch da, 1 log IR


aber dann :

  #if IRMP_LOGGING == 0
  // USART initialization has to be done here if Logging is off
  // Communication Parameters: 8 Data, 1 Stop, No Parity
  // USART Receiver: Off
  // USART Transmitter: On
  // USART0 Mode: Asynchronous
  // USART Baud Rate: 9600
  #define BAUDRATE 9600L
  UCSR0A=0x00;
  UCSR0B=0x08;
  UCSR0C=0x06;
  UBRR0H = ((F_CPU+BAUDRATE*8)/(BAUDRATE*16)-1) >> 8;            // 
store baudrate (upper byte)
  UBRR0L = ((F_CPU+BAUDRATE*8)/(BAUDRATE*16)-1) & 0xFF;
  #endif


also wird das UART init wenn logging off ?

nix verstehen.....


bei build gibt:

../irmp.c:645: error: 'U2X' undeclared (first use in this function)

    UART0_UCSRA &= ~(1<<U2X);

ich finde die DEF von U2X nirgends ,

wo gehört sie wie hin ?

danke (sorry das ich blöd bin, ist immer schwer sich in fremden code 
zurechtzufinden und mit dem uart hab ich noch nie im atmel gearbeitet, 
tippe da muss irgendwo ein init vergessen sein)

liebe grüße jar

von Joachim B. (jar)


Lesenswert?

so uart ausgabe läuft,

irgendwie uart.c und .h vergessen

da der at644 irgendwie nicht drin lief eben ein paar defs geändert

egal läuft

nur com terminal spuckt nix aus

aber hterm aber mit sonderzeichen


nun weiss ich leider immer noch nicht wie ich mitloggen soll

entweder es ist zu dünne erklärt oder ich bin unfähig....


blicke grad nicht durch warum com terminal nix zeigt aber hterm und 
welches pc log prgramm laufen muss und unter xp laufen kann, mal eben 
linus booten ist grad nicht möglich und den rücken verdrehen zum anderen 
rechner auch nicht so lang sind meine kabel nicht

gruss
jar

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Joachim B. schrieb:

> aber hterm aber mit sonderzeichen

Du musst hterm auf 9600 Bd 8 Bit no Parity stellen.

> entweder es ist zu dünne erklärt oder ich bin unfähig....

Da ich von den IRMP-Anwendern bereits Dutzende Scan-Dateien erhalten 
habe, sollten die Erklärungen im IRMP-Artikel eigentlich reichen ;-)

Gruß,

Frank

von Joachim B. (jar)


Angehängte Dateien:

Lesenswert?

so

versuch mal dein Glück bitte

wenn das erfolgreich ist scanne ich alle Tasen und mher FBs

ich glaube meine Schaltung spinnt noch ein bissl,
nicht so leicht scans einzufangen wenn irgendjemand
irgendwo auf die FB drückt,
muss wohl in ein dunkles Zimmer ohne Fenster
und ohne IR Pyramiden,
die fangen sich offensichtlich auch was ein

lg
jar

: Wiederhergestellt durch Moderator
von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Joachim B. schrieb im Beitrag #1813217:
> so ?
> 11111111111111111110000......

Klasse, Du hast es geschafft, dass die Fensterbreite dieses Threads 
enorm gewachsen ist ;-)

Wäre wohl besser, den Beitrag zu löschen, sonst muss man zum Antworten 
erstmal eine halbe Stunde scrollen...

Gruß,

Frank

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Joachim B. schrieb:

> versuch mal dein Glück bitte

Habe es mir eben mal kurz angeschaut: Der Scan ist mit 15kHz 
aufgezeichnet worden... hättest Du auch sagen können ;-)

> nicht so leicht scans einzufangen wenn irgendjemand
> irgendwo auf die FB drückt,
> muss wohl in ein dunkles Zimmer ohne Fenster
> und ohne IR Pyramiden,
> die fangen sich offensichtlich auch was ein

Allerdings... die erste Zeile ist nur ein Fragment, die kann man nur in 
die Tonne stopfen. Die anderen 3 Zeilen sind brauchbar, allerdings hat 
sich da in die zweite Zeile neben eines Kaseikyo-Frames auch noch ein 
kompletter SAMSUNG32-Frame mit reingeschmuggelt. Ausserdem ist da auch 
noch ab und an anderer Schrott zwischendurch zu sehen.

Ich muss Deine Scans erstmal ein wenig säubern, bevor ich da näheres 
erkenne. Besser wäre es allerdings, mit 10kHz zu scannen (reicht für 
Kaseikyo vollkommen aus) und wirklich dafür zu sorgen, dass keine 
anderen IR-Sender dazwischenfunken.

Gruß,

Frank

von Joachim B. (jar)


Angehängte Dateien:

Lesenswert?

Frank M. schrieb:
> Joachim B. schrieb im Beitrag #1813217:
>> so ?
>> 11111111111111111110000......
>
> Klasse, Du hast es geschafft, dass die Fensterbreite dieses Threads
> enorm gewachsen ist ;-)
>
> Wäre wohl besser, den Beitrag zu löschen, sonst muss man zum Antworten
> erstmal eine halbe Stunde scrollen...
>
> Gruß,
>
> Frank

ich hab versucht zu löschen, geht nicht, ist mir ja auch peinlich, aber 
ich wollte kein Umbrüche drin haben

ich habe den Beitrag gemeldet, wenn ein Mod bitte diesen löscht !

kannst du mit den Scans was anfangen ?

hier noch mal

alle meine FB
die Kaseikyo würde ich scannen wenn du sagst du kannst sie auswerten, 
muss ich dann wirklich alle Tasten scannen ? ist ein Haufen Arbeit

warum wird die JVC immer noch nicht erkannt ? der Code sollte doch drin 
sein ?

habe mal jvc dazugelinkt

von Joachim B. (jar)


Angehängte Dateien:

Lesenswert?

Joachim B. schrieb:
> habe mal jvc dazugelinkt

hat nicht geklappt, neuer versuch

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Joachim B. schrieb:

> ich habe den Beitrag gemeldet, wenn ein Mod bitte diesen löscht !

Ich hatte ihn auch schon gemeldet ;-)

> kannst du mit den Scans was anfangen ?

Ja, habe ein Ergebnis. Die beiden verschiedenen OFF-Tasten bringen 
folgende 48 Daten-Bits:
1
         1         2         3         4
2
123456789012345678901234567890123456789012345678
3
010000000000010000001101000000001011110010110001 p =  5, a = 0x2002, c = 0x03d0, f = 0x00
4
010000000000010000000001000000001011110010111101 p =  5, a = 0x2002, c = 0x03d0, f = 0x00
5
ccccccccccccccccPPPPssssppppppppffffffffCCCCCCCC

IRMP ermittelt daraus jeweils die Adresse 0x2002 und das Kommando 
0x03d0. Tatsächlich unterscheiden sich aber die 48 Bits genau an 4 
Stellen, nämlich Bit21-22 und Bit45-46.

Dabei haben die 48 Bits folgenden Aufbau:

c = 16 Hersteller (customer) Bits
P = 4 Parity Bits
s = 4 System-Bits
p = 8 Produkt-Bits
f = 8 Funktions-Bits
C = 8 Datenüberprüfungs-Bits

Der signifikante Unterschied der beiden Tasten liegt in den 4 
System-Bits, die von IRMP bisher komplett ignoriert wurden - einfach, 
weil ich dafür keine genauen Infos herausgefunden habe, was diese Bits 
genau bedeuten. Dass IRMP überhaupt Datenbits bei Kaseikyo ignoriert, 
hat einen einfachen Grund: Ich muss die 48 bit irgendwie in 16 Adress- 
und 16 Kommando-Bits pressen. Ich muss mir also überlegen, wie ich die 4 
Systembits da noch unterbringe. Gib mir also bitte etwas Zeit ;-)

> alle meine FB
> die Kaseikyo würde ich scannen wenn du sagst du kannst sie auswerten,
> muss ich dann wirklich alle Tasten scannen ? ist ein Haufen Arbeit

10 Tasten reichen. Bitte aber nicht einfach nur die Zahlen 0-9 ;-)

> warum wird die JVC immer noch nicht erkannt ? der Code sollte doch drin
> sein ?

Ich werde mir den JVC-Scan anschauen. Ist der auch mit 15kHz gescannt?

Gruß,

Frank

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Frank M. schrieb:

> Ich werde mir den JVC-Scan anschauen.

Das Ding benutzt zwar die NEC-Timings, das Protokoll ist aber komplett 
anders aufgebaut: Nach jeweils 16 der insgesamt 50 Bits wird eine 
längere Pause von ca. 22msec eingelegt. Ausserdem scheinen die Daten 
(die nur eine Länge von 16 Bit haben) insgesamt 2x wiederholt zu werden.

Also ist der Aufbau:

 1 NEC-Start-Bit
16 Daten-Bits
 1 Stop-Bit + Pause (Synchronisation?)
16 Daten-Bits
 1 Stop-Bit + Pause (Synchronisation?)
16 Daten-Bits

Näheres kann ich Dir erst sagen, wenn Du mich mit mehr JVC-Scans 
versorgst.

Gruß,

Frank

von Joachim B. (jar)


Lesenswert?

Frank M. schrieb:
> 10 Tasten reichen. Bitte aber nicht einfach nur die Zahlen 0-9 ;-)

mach ich nach Wunsch oder Querbeet ?


Frank M. schrieb:
> Frank M. schrieb:
>
>> Ich werde mir den JVC-Scan anschauen.
>
> Das Ding benutzt zwar die NEC-Timings,...
> Gruß,
> Frank


auch das, s.o.
mach ich nach Wunsch oder Querbeet ?

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Joachim B. schrieb:

> mach ich nach Wunsch oder Querbeet ?

Querbeet - halt die Tasten, die Du für am wichtigsten erachtestest. Wäre 
nicht schlecht, wenn die Nummerntasten 0, 1, 2 dabeiwären, da kann man 
meist gut eine Systematik ablesen.

Gruß,

Frank

von Joachim B. (jar)


Angehängte Dateien:

Lesenswert?

Frank M. schrieb:
> Joachim B. schrieb:
>> mach ich nach Wunsch ?
>
> Querbeet - halt die Tasten, die Du für am wichtigsten erachtestest. Wäre
> nicht schlecht, wenn die Nummerntasten 0, 1, 2 dabeiwären, da kann man
> meist gut eine Systematik ablesen.
> Gruß,
> Frank

so getan, aber nicht alle 10er Tasten 1-5 jeweils doppelt

ich hoffe ich habe mich nicht ver C&P und verguckt

ich sehe Jitter ? oder Frequenzabweichung, da ich ja doppelt gescant 
hatte erwarte ich 1 und 0 immer fast gleich, mal eine mehr oder weniger 
muss dann Jitter sein ? oder Frequenzabweichung ?

so ich werde dann mal das 128 x 64 gLCD anfrickeln mit LED Beleuchtung
jetzt hängt ja nur das 4x20 Z dran unbeleuchtet

wenn dir Scans fehlerhaft scheinen oder fehlen, bitte sofort melden, 
schick ich dann nach

die pana VCR FB fehlt mir noch, muss ich nachreichen, habe nur noch 3 
Tage Zugriff drauf

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Joachim B. schrieb:

> ich sehe Jitter ? oder Frequenzabweichung,

Ich sehe da zwischendurch viel Schrott, auch mal zwischendurch 
Samsung32-Frames. Ausserdem sind da bei den ersten paar Tasten 
unerklärliche Zeilenumbrüche drin. Funkt da was dazwischen?

Hatte ich auch heute vormittag in

Beitrag "Re: IRMP - Infrared Multi Protocol Decoder"

geschrieben.

Bitte ausschließen, dass Deine "Pyramiden" dazwischenfunken und bitte 
auch die Scan-Frequenz auf 10kHz zurückschrauben. 15kHz sind hier nicht 
notwendig und verlängert die Scans unnötig.

Gruß,

Frank

von Joachim B. (jar)


Lesenswert?

Frank M. schrieb:
> Bitte ausschließen, dass Deine "Pyramiden" dazwischenfunken und bitte
> auch die Scan-Frequenz auf 10kHz zurückschrauben. 15kHz sind hier nicht
> notwendig und verlängert die Scans unnötig.
> Gruß,
> Frank

die heutigen scans ohne OFF Taste ohne Störungen von den Pyramiden, die 
sind daheim (die zuvor gescanten OFF Tasten hab ich aber reinkopiert um 
Arbeit zu sparen)

auf 10kHz umgestellt, nach Durchsicht der config brauche ich die wohl 
nicht

IRMP_SUPPORT_FDC_PROTOCOL
IRMP_SUPPORT_RCCAR_PROTOCOL
IRMP_SUPPORT_SIEMENS_PROTOCOL
IRMP_SUPPORT_RECS80_PROTOCOL
SUPPORT_RECS80EXT_PROTOCOL

Siemens könnte evt. noch kommen, dann wird man sehen

>15kHz sind hier nicht
> notwendig und verlängert die Scans unnötig.
> Gruß,
> Frank

aber hilft das nicht der Genauigkeit der Auswertung, weniger 
Jitterfehler ?

von Joachim B. (jar)


Lesenswert?

Frank M. schrieb:
> Allerdings... die erste Zeile ist nur ein Fragment, die kann man nur in
> die Tonne stopfen. Die anderen 3 Zeilen sind brauchbar, allerdings hat
> sich da in die zweite Zeile neben eines Kaseikyo-Frames auch noch ein
> kompletter SAMSUNG32-Frame mit reingeschmuggelt. Ausserdem ist da auch
> noch ab und an anderer Schrott zwischendurch zu sehen.
> Gruß,
> Frank

das hatte ich wohl überlesen,

ist halt doof wenn Frau beim Scan der Panasonic die Samsung bedient weil 
sie lauter oder leiser haben will (ich hatte vesucht aufzupassen, 
klappte wohl nicht immer) ausserdem sehe ich ab und an unmotiviert die 
IR Pyramiden blinken, war wohl keine gute Idee die alten scans 
dazuzulinken, OK und 15 kHz hatte ich verschwiegen, aber du findest 
offensichtlich alle Gemeinheiten die dir die User wohl unterjubeln (ohne 
Absicht)

also wie gesagt,

auf 10 kHz ist umgestellt (immer noch die Frage, wäre für Scan nicht 15 
kHz genauer?)
IR Pyramiden sind nicht hier und @work kann kein weiteres IR Signal 
stören, ausser Schmutz auf der Versorgungsleitung oder 
Maschineninduktion, hier sind schon irgendwo heftige Stanzen zu hören, 
aber wo die sind habe ich noch nicht rausgefunden, so ein Stahlbetonbau 
lääst die Gräusche zwar weit durch aber schlecht ortbar

ich sanne neu bei Bedarf

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Joachim B. schrieb:

> auf 10 kHz ist umgestellt

Gut.

> (immer noch die Frage, wäre für Scan nicht 15 kHz genauer?)

Nein, 10kHz reicht bei Deinen FBs vollkommen aus.

> ich sanne neu bei Bedarf

Ich baue erstmal die angekündigten Änderungen für Kaseikyo ein 
(Berücksichtigung der 4 System-Bits) und implementiere das 
JVC-Protokoll. Da wäre es aber klasse, wenn Du mir von der JVC ein paar 
10kHz-Scans liefern würdest.

Gruß,

Frank

von Joachim B. (jar)


Angehängte Dateien:

Lesenswert?

Frank M. schrieb:
> Ich baue erstmal die angekündigten Änderungen für Kaseikyo ein
> (Berücksichtigung der 4 System-Bits)

super DANKE dafür ! und bitte bitte IRSND nicht vergessen darauf kommt 
es ja hauptsächlich an (Ziel nicht aus den Augen verlieren will)

>und implementiere das
> JVC-Protokoll. Da wäre es aber klasse, wenn Du mir von der JVC ein paar
> 10kHz-Scans liefern würdest.

klaro das hat Zeit ist weniger für mich mehr für alle deren FB nicht 
mehr geht

ich hoffe ich habe keine copy paste Fehler drin

(einige scans waren zu lang und dann läuft hterm leicht über, im scroll 
fenster und man erwischt den anfang nicht)

heute frisch gescant 10 kHz ohne IR Pyramiden

#Sondertasten (VCR/DVD play rec usw.) unter Schiebeklappe bitte nicht 
noch auch, nur wenn die Not gross ist :-)

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Joachim B. schrieb:

> heute frisch gescant 10 kHz ohne IR Pyramiden

Die Scans sehen sehr gut aus. Die Abweichungen (Jitter) sind normal, die 
FBs senden nicht soooo genau. Ausserdem kommt schon durch das Pollen in 
der ISR ein Fehler von +/- 1 zustande. IRMP arbeitet aber mit 
Toleranzen, deshalb ist das überhaupt nicht tragisch.

Ich kümmere mich erstmal um Kaseikyo, dann melde ich mich wieder.

Gruß,

Frank

von Joachim B. (jar)


Lesenswert?

Frank M. schrieb:
> Ich kümmere mich erstmal um Kaseikyo, dann melde ich mich wieder.
> Gruß,
> Frank

fein morgen scanne ich alle meine Panasonic FB Kaseikyo neu
VCR NV FJ630 VHS
TV TX-L32S10ES
DVD/HDrec Panasonic DMR-EX 79

10 kHz ohne IR Pyramidenstörungen

von Joachim B. (jar)



Lesenswert?

Frank M. schrieb:
> Ich baue erstmal die angekündigten Änderungen für Kaseikyo ein
> (Berücksichtigung der 4 System-Bits)
> Gruß,
> Frank

brauchst du noch was ?

hier die KASEIKYO Panasonic VCR FB

von Joachim B. (jar)


Lesenswert?

Frank M. schrieb:
> Die Scans sehen sehr gut aus. Die Abweichungen (Jitter) sind normal,
> Gruß,
> Frank

das wundert mich nun etwas,

sagte ich nicht das an dem MAX nur +5 und NULL rauskamen ?

nun nachdem ich den Schluss unter dem SMD PAD (MAX233 9 GND nach 10 
irgendein int. Kondi) gefunden hatte habe ich jetzt endlich +-10V

aber wenn die Scans schon vorher gut waren soll das nicht weiter stören

von Michael H. (michael_h45)


Lesenswert?


von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Joachim B. schrieb:
> hier die KASEIKYO Panasonic VCR FB

Danke, habe ich mir angeschaut, leider sind nur 161 von 216 Scans okay. 
55 Scans weisen einen abweichenden Herstellercode auf, welcher für 
Panasonic 0x2002 ist. Ist die Datei auch schon mit dem MAX-Kurzschluss 
erstellt worden?

Macht nix, der Rest ist echt brauchbar.

Achja, noch eine Bitte: Beim Scannen bitte immer die Tasten so kurz wie 
möglich drücken. Beim JVC-Scan hast Du da offenbar des öfteren ziemlich 
lange den Finger auf den Tasten gehabt - jedenfalls zu Anfang bei den 
ersten Tasten ;-)

Dank und Gruß,

Frank

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Michael H. schrieb:
> http://de.wikipedia.org/wiki/Jitter

Ja, und? Ist hier die Bezeichnung "Jitter" falsch, wenn es um
Messabweichungen von Rechtecksignalen wie bei den folgenden geht?
1
1. Messung: 000000000000000111111111000000000011111111110000000
2
2. Messung: 000000000000000011111111100000000111111111100000000
3
3. Messung: 000000000000001111111110000000000011111111110000000

Trotzdem danke für den interessanten Link.

Gruß,

Frank

von Frank M. (ukw) (Moderator) Benutzerseite


Angehängte Dateien:

Lesenswert?

Frank M. schrieb:
> Ich baue erstmal die angekündigten Änderungen für Kaseikyo ein
> (Berücksichtigung der 4 System-Bits) und implementiere das
> JVC-Protokoll.

Anbei die geänderten Sources zum Test.

Neu:

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

 - Neues Protokoll: JVC

Viel Spaß,

Frank

von Joachim B. (jar)


Lesenswert?

Frank M. schrieb:
> Joachim B. schrieb:
>> hier die KASEIKYO Panasonic VCR FB
>
> Danke, habe ich mir angeschaut, leider sind nur 161 von 216 Scans okay.
> 55 Scans weisen einen abweichenden Herstellercode auf, welcher für
> Panasonic 0x2002 ist.

hmm, welche ?, könnte die ja nachliefern, hast ja die #Headerzeile dazu

>Ist die Datei auch schon mit dem MAX-Kurzschluss
> erstellt worden?

ja leider, wollte erst liefern, dann hat mich der Pegel doch nicht ruhen 
lassen und ich ging auf Fehlersuche

> Macht nix, der Rest ist echt brauchbar.
> Achja, noch eine Bitte: Beim Scannen bitte immer die Tasten so kurz wie
> möglich drücken. Beim JVC-Scan hast Du da offenbar des öfteren ziemlich
> lange den Finger auf den Tasten gehabt - jedenfalls zu Anfang bei den
> ersten Tasten ;-)
> Dank und Gruß,
> Frank

na ja man wartet immer auf Bestätigung, ich hab ne LED Quittung 
eingebaut, 1s LED Blink wenn Code erkannt, nur im Logging Mode erkennt 
er ja nix und ich warte vergebens und im HTERM kommen die Daten 
offensichtlich erst verzögert, also bleib ich zu lang drauf und dann 
wollen die Daten nicht enden

einige Tasten sind auch versenkt um Fehlbedienungen zu meiden, deren 
Druckpunkt ist schwer zu fühlen

ich weiss, alles Ausreden, aber wer so lange im Beruf ist der kann wohl 
nicht anders

danke und gruß zurück
jar

von Joachim B. (jar)


Lesenswert?

Frank M. schrieb:
> Frank M. schrieb:
> Ich baue erstmal die angekündigten Änderungen für Kaseikyo ein
> (Berücksichtigung der 4 System-Bits)
> Neu:
>  - Kaseikyo: es werden nun die 4 System-Bits (Genre2) im Frame
>    ausgewertet

hmm, aber scheinbar noch etwas wackelig (muss ich mir meine 
Abblockkondis ansehen oder meine 5V Versorgung ?), wenn die FB nicht 
genau ausgerichtet ist und man nicht lange drückt erkennt er viele 
Zufallscodes, ist nicht so stabil wie RC5, da kenne ich nur ja / erkannt 
oder nein / eben nicht, aber Zufallscodes seh ich nie


> und implementiere das
> JVC-Protokoll.
>  - Neues Protokoll: JVC
ah, erst verwundert, wird nicht angezeigt, dann aber

meine JVC wird erkannt , A + C wird angezeigt aber unter Code nicht JVC 
!

> Viel Spaß,
> Frank

danke den hab ich schon

von Michael H. (michael_h45)


Lesenswert?

Frank M. schrieb:
> Ja, und? Ist hier die Bezeichnung "Jitter" falsch, wenn es um
> Messabweichungen von Rechtecksignalen wie bei den folgenden geht?
Nein, nicht bei dir.
Nur bei Joachim klang es danach, dass er damit die 
Spannungs-Sonderheiten wegen seiner MAX-Beschaltung meinte.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Joachim B. schrieb:

> meine JVC wird erkannt ,

Gut.

> A + C wird angezeigt

Auch gut.

> aber unter Code nicht JVC

Den Satz verstehe ich nicht. Hast Du im main() eine Text-Ausgabe über 
ein Text-Array drin und vermisst nun das Wörtchen "JVC"? Das gehört 
nicht wirklich zu den IRMP-Sources dazu, denn:

irmp_get_data liefert lediglich

   uint8_t protocol
   uint16_t address
   uint16_t command

protocol hat den Wert 20 bei JVC, siehe irmp.h, da sind alle Protokolle 
drin.

Du müsstest bei Deiner Textausgabe das Text-Array auf 20 vergrößern und 
dort den String "JVC" eintragen.

Gruß,

Frank

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Joachim B. schrieb:

> hmm, aber scheinbar noch etwas wackelig (muss ich mir meine
> Abblockkondis ansehen oder meine 5V Versorgung ?), wenn die FB nicht
> genau ausgerichtet ist und man nicht lange drückt erkennt er viele
> Zufallscodes, ist nicht so stabil wie RC5,

Was für einen IR-Empfänger nutzt Du? TSOP1736 oder 1738? Das Problem 
ist, dass Kaseikyo mit 56 kHz moduliert wird und der TSOP mit seinen 
36kHz bzw. 38kHz ziemlich daneben liegt. Die Entfernung sinkt drastisch 
und die Fehlerquote nimmt zu.

Gruß,

Frank

von Joachim B. (jar)


Lesenswert?

Frank M. schrieb:
> Den Satz verstehe ich nicht. Hast Du im main() eine Text-Ausgabe über
> ein Text-Array drin und vermisst nun das Wörtchen "JVC"? Das gehört
> nicht wirklich zu den IRMP-Sources dazu, denn:
>
> irmp_get_data liefert lediglich
>
>    uint8_t protocol
>    uint16_t address
>    uint16_t command
> protocol hat den Wert 20 bei JVC, siehe irmp.h, da sind alle Protokolle
> drin.
> Du müsstest bei Deiner Textausgabe das Text-Array auf 20 vergrößern und
> dort den String "JVC" eintragen.
> Gruß,
> Frank

sowas dachte ich schon, nur hab ich die Zuweisung nicht gefunden

aber nun

static char 
*Proto[]={"SIRCS","NEC","SAMSUNG","MATSUSH","KASEIKYO","RECS80","RC5(x)" 
,"DENON","RC6","SAMSG32","APPLE","RECS80x","NUBERT","JVC"};

> Du müsstest bei Deiner Textausgabe das Text-Array auf 20 vergrößern

wie das ich finde nirgends eine Zuweisung von Array auf 20

soweit wie ich C gelernt habe ist durch anhängen von ,"JVC" das Array 
schon ab compile vergrößert, da es ja statisch initialisiert wird, eine 
seperate Zuweisung dürfte nicht (nötig) sein und finde ich auch nicht

hmm es funzt jedenfalls noch nicht

ich tippe auf NEC erkannt und JVC eben nicht

von Joachim B. (jar)


Lesenswert?

Frank M. schrieb:
> Was für einen IR-Empfänger nutzt Du? TSOP1736 oder 1738? Das Problem
> ist, dass Kaseikyo mit 56 kHz moduliert wird und der TSOP mit seinen
> 36kHz bzw. 38kHz ziemlich daneben liegt. Die Entfernung sinkt drastisch
> und die Fehlerquote nimmt zu.
> Gruß,
> Frank


TSOP 1736 , aber mein Scan an einer BPW21 lieferte 36 kHz Schwingungen

ich könnte ja noch mal einen OP vorschalten und eine FFT machen

gruss
jar

von Joachim B. (jar)


Lesenswert?

peinlich peinlich

sind ja nur 14 Text STR definiert, hab nicht nachgezählt

musste also 6x "", einfügen das 20 auf "JVC" zeigt ......

ja ich bin aus der Übung und sehe nicht immer alles (sofort)

gruss
jar

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Joachim B. schrieb:
> aber nun
>
> static char
> *Proto[]={"SIRCS","NEC","SAMSUNG","MATSUSH","KASEIKYO","RECS80","RC5(x)" 
,"DENON","RC6","SAMSG32","APPLE","RECS80x","NUBERT","JVC"};

Du hast "JVC" an 14. Stelle statt an 20. Stelle eingetragen, damit das 
Array auch nur auf 14 Elemente vergrößert.

>
>> Du müsstest bei Deiner Textausgabe das Text-Array auf 20 vergrößern
>
> wie das ich finde nirgends eine Zuweisung von Array auf 20

Eben, die Dimension von Proto[] ist nicht angegeben.

> hmm es funzt jedenfalls noch nicht

Trage alle fehlenden Namen ein (die einzelnen nicht zu lang machen!) und 
sorge dafür, dass "JVC" an 20. Stelle steht, siehe Nummern der 
Protokolle 1-20 in irmp.h.

Gruß,

Frank

von Joachim B. (jar)


Lesenswert?

Frank M. schrieb:
> Eben, die Dimension von Proto[] ist nicht angegeben.
> Trage alle fehlenden Namen ein (die einzelnen nicht zu lang machen!) und
> sorge dafür, dass "JVC" an 20. Stelle steht, siehe Nummern der
> Protokolle 1-20 in irmp.h.
> Gruß,
> Frank


hatte ich doch schon,

Joachim B. schrieb:
> peinlich peinlich
> sind ja nur 14 Text STR definiert, hab nicht nachgezählt
> musste also 6x "", einfügen das 20 auf "JVC" zeigt ......
> ja ich bin aus der Übung und sehe nicht immer alles (sofort)
> gruss
> jar



ich denke ich werde trotzdem noch mal einen Frequenz Scan aller FB 
machen

wie geschrieben mit BPW21 OP und FFT
und mal alle meine FB scannen

von Joachim B. (jar)


Lesenswert?

Frank M. schrieb:
> Das Problem ist, dass Kaseikyo mit
>> 56 kHz
> moduliert wird und der TSOP mit seinen 36kHz bzw. 38kHz
> ziemlich daneben liegt.
> und die Fehlerquote nimmt zu.
> Gruß,
> Frank

wo hast du die Daten her ?

ich kann hier machen was ich will

ich messe burst von 26-28 µs was 35,9 - 38,5 kHz gibt

übrigens alle
>> meine Kaseikyo liegen eher bei 36 kHz ,
nur die JVC scheint um 38 kHz zu liegen

bin verwirrt von deinen 56 kHz

gruss
jar

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Joachim B. schrieb:

> bin verwirrt von deinen 56 kHz

Laut
http://www.mikrocontroller.net/attachment/4246/IR-Protokolle_Diplomarbeit.pdf

auf Seite 26 (hier "Japan-Code" genannt) sind es 56 kHz. Da habe ich das 
her.

Aber es gibt noch eine zweite Quelle, nach welcher ich das 
Kaseikyo-Protokoll implementiert habe, nämlich:

http://www.roboternetz.de/phpBB2/files/entwicklung_und_realisierung_einer_universalinfrarotfernbedienung_mit_timerfunktionen.pdf

Und tatsächlich wird hier von 38kHz (auf Seite 8) geredet. Entweder 
werden verschiedene Modulationsfrequenzen bei Kaseikyo eingesetzt oder 
meine erste Quelle hat schlichtweg einen Fehler. Leider habe ich 
persönlich keine Kaseikyo-kompatible FB, kann daher nix dazu sagen.

Leider habe ich auch nicht mehr Doku als diese beiden Quellen. Wenn Du 
da noch irgendeine Doku ausgraben könntest, würde ich mich freuen.

Gruß,

Frank

von Wolfgang Dunczewski (midi-rakete) (Gast)


Lesenswert?

Ich lese oben, dass es Probleme gibt/gab mit dem Code einer Kathrein 
UFS-922 Fernbedienung. Wurde das Problem gelöst? Ich habe beim Bau einer 
FB diesen Code enträtselt.....

von Joachim B. (jar)


Lesenswert?


von Joachim B. (jar)


Lesenswert?

ach ja , vergessen

irgendwer schrieb mal was von 450 kHz IR Modulation, aber ich bin nicht 
sicher ob das so stimmt, weil :

einige modilieren auch mit x-facher Frequenz wegen oversampling

da können die paar 100 kHz auch vielfache von 36 oder 38 - 40 oder 56 
kHz sein

ggffs kann man später mal in IRSND oversampling einstellen und schauen 
was aus den TSOP rauskommt, ich vermute mit exakt doppelter oder gerade 
Vielfache werden die auch output liefern.......

gruss
jar

von Samuel (Gast)


Lesenswert?

Joachim B. schrieb:
> peinlich peinlich
Spiegelt deinen Auftritt hier gut wieder.
Du hast mal von jar nüscht Ahnung.

von Joachim B. (jar)


Lesenswert?

Samuel schrieb:
> Joachim B. schrieb:
>> peinlich peinlich
> Spiegelt deinen Auftritt hier gut wieder.
> Du hast mal von jar nüscht Ahnung.

danke danke, von nüscht würde ich nüscht sagen.....

OK ich bin nicht so der Softi und aus der Übung

aber war der Kommentar nötig ?

na egal wer anonym so was schreibt braucht das wohl

ich komm schon klar, hab halt nicht die Arrays ausgezählt

wer so perfekt ist wie du kann sich anmelden und auch besser Fragen 
beantworten und zum Rest höflich schweigen....

freundlichen gruss
jar

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Wolfgang Dunczewski (midi-rakete) schrieb:
> Ich lese oben, dass es Probleme gibt/gab mit dem Code einer Kathrein
> UFS-922 Fernbedienung. Wurde das Problem gelöst?

Nein, die Kathrein benutzt einen RC6-Mode, der nicht oder nur spärlich 
dokumentiert ist. IRMP unterstützt nur den sog. Mode 0 von RC6, siehe 
auch:

http://www.sbprojects.com/knowledge/ir/rc6.htm

> Ich habe beim Bau einer FB diesen Code enträtselt.....

Dann schieß mal los.

Gruß,

Frank

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Joachim B. schrieb:

> http://www.sbprojects.com/knowledge/ir/ir.htm

Keine Infos zum Kaseikyo-Protokoll.

> http://www.hifi-remote.com/forums/viewtopic.php?t=6401

Keine Infos zum Kaseikyo-Protokoll.

> 
http://www.hifi-remote.com/forums/viewtopic.php?t=12233&sid=cdf5a421a7ecc165af055f6555019261

Keine Infos zum Kaseikyo-Protokoll.

> http://www.google.de/url?sa=t&source=web&cd=6&ved=0CEMQFjAF&url=http%3A%2F......

Nette Tabelle, aber keine Infos zum Kaseikyo-Protokoll selbst.

> http://usa.denon.com/AVR-4308CI_IRCodes.pdf

Dito.

> sehr interessant:
> http://ecee.colorado.edu/~mcclurel/vishay_ir_data_formats.pdf

Danke, immerhin steht da drin, dass Kaseikyo mit 36.7kHz moduliert wird. 
Werde ich im IRMP-Artikel anpassen.

> Kaseikyo 56 kHz muss ein Fehler sein, finde nix, ausser beim Klaus

Der hat es wahrscheinlich von mir....

Insgesamt ist Deine Liste nicht so der Renner, trotzdem danke dafür.

Vielleicht hättest Du Dir vorher mal die Literatur-Hinweise aus dem 
IRMP-Artikel angucken sollen, um entsprechend auszufiltern und nicht 
jeden Google-Treffer einfach hier reinzukopieren ;-)

http://www.mikrocontroller.net/articles/IRMP#Literatur


Gruß,

Frank

von Wolfgang Dunczewski (midi-rakete) (Gast)


Lesenswert?

Frank M. schrieb:
> Nein, die Kathrein benutzt einen RC6-Mode, der nicht oder nur spärlich..
>
> http://www.sbprojects.com/knowledge/ir/rc6.htm
>
>> Ich habe beim Bau einer FB diesen Code enträtselt.....
>

Ich fand im Web Infos über den RC-6 Mode 6A 20:

[[http://www.guiott.com/wrc/RC6-6.html]]

mit 20 Bit Nutzrate

Die Kathrein nutzt "in etwa" diesen als 32 Bit Version (RC-6 mode 6a 
32), aber nicht nach Norm:

Die FB vom UFS-922 macht folgendes:

Leader Pulse (ok)
Start Bit (ok)
Mode Bits 2,1,0 (H,H,L = Mode 6)
Trailer Bit: Flanke immer L>H (nicht offiziell, soll normal toggeln)

Dann folgen 4 Bytes:

Das erste Byte ist immer 10000000 (von links nach rechts wird gesendet)
Das zweite Byte ist immer 01000110

Das dritte Byte enthält das Toggle-Bit TB und
die Ebene/Adresse falls man mehrere FBs hat

TB AD2 AD1 AD0 0000

also normal bei Adresse 0:

10000000
und abwechselnd
00000000

Eigenlich gehört das Togglebit an eine andere Stelle. Das Trailer Bit 
soll eigentlich toggeln. Aber Kathrein lässt ein Bit togglen. Deshalb 
funtioniert fast keine programmierbare FB mit dem Kathrein.

Und im 4. Byte kommen die Befehe 00-FF

nnnnnnnn

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Wolfgang Dunczewski (midi-rakete) schrieb:

> Die Kathrein nutzt "in etwa" diesen als 32 Bit Version (RC-6 mode 6a
> 32), aber nicht nach Norm:
> [...]

Vielen Dank für die Infos, werde ich mir mal zu Gemüte führen.

Gruß,

Frank

von Joachim B. (jar)


Lesenswert?

Frank M. schrieb:
>> Joachim B. schrieb:
>> sehr interessant:
>> http://ecee.colorado.edu/~mcclurel/vishay_ir_data_formats.pdf
>
> Danke, immerhin steht da drin, dass Kaseikyo mit 36.7kHz moduliert wird.
> Werde ich im IRMP-Artikel anpassen.

> Insgesamt ist Deine Liste nicht so der Renner, trotzdem danke dafür.
> Vielleicht hättest Du Dir vorher mal die Literatur-Hinweise aus dem
> IRMP-Artikel angucken sollen, um entsprechend auszufiltern und nicht
> jeden Google-Treffer einfach hier reinzukopieren ;-)
> Gruß,
> Frank

immerhin hab trotzdem noch was gefunden, sorry das es mir nicht möglich 
war alle Infos mit den vorhandenen abzugleichen, ich hab hier grad Land 
unter und bin deswegen nur sehr begrenzt konzentriert dabei, ich hoffe 
das geht trotzdem i.O.

gruss
jar

von Joachim B. (jar)


Lesenswert?

Frank M. schrieb:
> Vielen Dank für die Infos, werde ich mir mal zu Gemüte führen.
> Gruß,
> Frank

hallo,

wie siehts aus mit KASEIKYO im IRSND ?

würde dann bald ein IRSND Modul aufbauen für

PC -> RS232 -> Atmel IRSND -> IS Sendediode

ich grübel gerade ob der Umweg über Atmel sein muss weil,

kennst du den CT Artikel IRDEO ?
http://www.heise.de/ct/projekte/Fernregie-IRdeo-284185.html
http://irdeo.de/

dort wurde IR Empfang und Senden mit der seriellen Schnitte gemacht, 
funzte so leidlich (sogut win das eben zulässt) mit W2k und XP musste 
der IO (giveio o.ä.) Treiber installiert werden
http://irdeo.de/ntdriver.zip
GIVEIO.SYS (Dale Roberts), LOADDRV (Paula Tomlinson)


senden war übrigens tricky, die IR Modulation 36  38  40 kHz wurde per 
Baudrate / respektive geschickte 1/0 Wahl eingestellt, je nach 1/0 Folge 
und Baudrate ist ja quasi jede IR Modulation machbar, die Start oder 
Stoppbits, wenn sie einzeln erfolgen, scheinen nicht zu stören

leider war es nur eine lernbare FB welche die Codes nur gelernt wieder 
abspielen konnte und mit der Erkennung haperte es leider auch, da ist 
dein Projekt viel weiter und besser, aber ggffs kann man die beiden 
Konzepte zusammenbringen

für mich wäre ja nur IR Sender nötig wenn ich das ohne Atmel am RS232 
Port erreiche spart das Arbeit und Geld (nix gegen die Atnelbastelleien)

freundliche Grüße
jar

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Joachim B. schrieb:

> wie siehts aus mit KASEIKYO im IRSND ?

Wie ich schon schrieb: dafür brauche ich Futter, damit ich sämtliche 
Paritätsbits aus den Daten wieder erzeugen kann. Nur so kann ich die 32 
Bit IRMP-Datenstruktur auf die vollen 48bit-Kaseikyo-Frames aufblasen.

Ich warte daher immer noch auf die Scan-Dateien Deiner 3 
Kaseikyo-Fernbedienungen, die Du mir schon vor ein paar Tagen 
angekündigt hattest.

Ich brauche von jeder dieser 3 FB ca. 10 Tasten, wie ich schon mal 
schrieb.

Du hattest hier mal für die Panasonic VCR FB Scans reingestellt, wo aber 
noch erhebliche Störungen drin waren. Du hattest den Grund wohl gefunden 
und wolltest den Scan wiederholen. Bisher hab ich da aber nix neues von 
Dir gesehen.

> kennst du den CT Artikel IRDEO ?

Ja, habe ich mal vor Jahren überflogen.

> für mich wäre ja nur IR Sender nötig wenn ich das ohne Atmel am RS232
> Port erreiche spart das Arbeit und Geld (nix gegen die Atnelbastelleien)

Sorry, wüsste ich jetzt nicht, wie. Du kannst natürlich den IRSND-Code 
auf eine andere Plattform portieren.

Gruß,

Frank

von Joachim B. (jar)


Lesenswert?

Frank M. schrieb:
> Joachim B. schrieb:
>> wie siehts aus mit KASEIKYO im IRSND ?

> Wie ich schon schrieb: dafür brauche ich Futter, damit ich sämtliche
> Paritätsbits aus den Daten wieder erzeugen kann. Nur so kann ich die 32
> Bit IRMP-Datenstruktur auf die vollen 48bit-Kaseikyo-Frames aufblasen.
>
> Ich warte daher immer noch auf die Scan-Dateien Deiner 3
> Kaseikyo-Fernbedienungen, die Du mir schon vor ein paar Tagen
> angekündigt hattest.
>
> Ich brauche von jeder dieser 3 FB ca. 10 Tasten, wie ich schon mal
> schrieb.
>
> Du hattest hier mal für die Panasonic VCR FB Scans reingestellt, wo aber
> noch erhebliche Störungen drin waren. Du hattest den Grund wohl gefunden
> und wolltest den Scan wiederholen. Bisher hab ich da aber nix neues von
> Dir gesehen.
> Gruß,
> Frank


war wohl ein Missverständniss

auf die VCR FB hab ich nun kein Zugriff mehr, ich hab noch im Ohr, sind 
zwar Störungen drin aber brauchbar

Frank M. schrieb:
> Joachim B. schrieb:
>> hier die KASEIKYO Panasonic VCR FB
>
> Danke, habe ich mir angeschaut, leider sind nur 161 von 216 Scans okay.
> 55 Scans weisen einen abweichenden Herstellercode auf, welcher für
> Panasonic 0x2002 ist. Ist die Datei auch schon mit dem MAX-Kurzschluss
> erstellt worden?
>
> Macht nix, der Rest ist echt brauchbar.
> Dank und Gruß,
> Frank

die 161 scans reichen nicht von der VCR ?

Ich kann also nur noch
Panasonic TV liefern und Panasonic HDrec/DVD

muss mal sehen ob ich den VCR noch mal bekomme

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Joachim B. schrieb:
> die 161 scans reichen nicht von der VCR ?

Wenn es diese FB ist, welche Du über IRSND auch emulieren willst - ja, 
dann reicht es.

> Ich kann also nur noch
> Panasonic TV liefern und Panasonic HDrec/DVD

Wenn Du die für IRSND nicht brauchst, dann nicht. Wäre aber trotzdem 
nett, wenn Du davon jedoch auch noch je 10 Scans machen könntest, dann 
kann ich das allgemeiner in IRSND machen.

Sag mir bitte auch, welche FB Du mit IRSND emulieren möchtest.

Gruß,

Frank

von Joachim B. (jar)


Lesenswert?

Frank M. schrieb:
> Sag mir bitte auch, welche FB Du mit IRSND emulieren möchtest.
> Gruß,
> Frank

eigendlich genau diese

Panasonic HDrec/DVD

und die sollst du noch mal bekommen

zur Fernprogrammierung über PC


TV hat ja aus der Ferne irgendie keinen Sinn, da könnte ich gleich winTV 
im Rechner starten

ich hab den IRMP so schön auf 4x MiMh Akku laufen, damit wäre mobiles 
logging auch für den VCR möglich, aber seit der MAX dranhängt läuft der 
TSOP nicht mehr, der MAX braucht 1W sind 200mA und zieht offensichtlich 
den Pegel runter, ohne externe Versorgung geht da leider nix

ich grübel gerade ob ich den MAX rausschmeisse und einfach mit 2 Trasis, 
simple RS232 Konverter baue
http://picprojects.org.uk/projects/simpleSIO/ssio.htm

1W ist schon heftig
alternativ ginge ja die RS232 anzuzapfen, einige Dioden nach P5 sollte 
wieder mehr Strom liefern, DTR und RTS kann man ja setzen, nur auf + 
setzen , sollten ja ungefähr je 20mA liefern können

so ähnlich hatte ich auch meine PONY Elektronik aus der parallelen 
gespeist, einfach 15 BAT42 an jede signalführende Leitung auf einen 
Pufferkondi, reicht für CMOS Logik und Signal LED 3mA

von Joachim B. (jar)


Angehängte Dateien:

Lesenswert?

Halbzeit

versucht alle Tasten je 2x zu scannen, Tastendruck so kurz wie möglich

musste leider im logging CR LF einfügen, ich hoffe das stört nicht

morgen verm. den Rest

freundliche Grüße
jar

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Joachim B. schrieb:

> versucht alle Tasten je 2x zu scannen, Tastendruck so kurz wie möglich

Sehr sauberer Scan: keine Störungen, keine Erkennungsfehler. Bei der 
Gelegenheit habe ich erkannt, dass bei Kaseikyo auch bei kurzen 
Tastendrücken immer mindestens zwei Frames verschickt werden. Bei 
längeren Tastendrücken werden drei Frames und mehr gesandt. Ich hatte 
das bisher zwar schon immer vermutet, hatte aber da noch nie geeignete 
Kaseikyo-Scans.

Ich muss da im IRMP bzgl. Kaseikyo noch nacharbeiten: die erste 
Wiederholung des Frames muss unterdrückt werden. Erst alle weiteren 
Wiederholungsframes sind als langer Tastendruck auszuwerten. Sonst 
bekommt man immer einen langen Tastendruck zurück - auch wenn man die 
Taste nur kurz gedrückt hat.

> musste leider im logging CR LF einfügen, ich hoffe das stört nicht

Passt perfekt.

Wann ich das Enkodieren in den IRSND einbaue, kann ich Dir noch nicht 
genau sagen. Habe im Moment viel um die Ohren.

Gruß,

Frank

von Joachim B. (jar)


Angehängte Dateien:

Lesenswert?

so der 2te Teil

viel Erfolg mit den CRC

gruss
jar

von Joachim B. (jar)


Angehängte Dateien:

Lesenswert?

Frank M. schrieb:
> Ich muss da im IRMP bzgl. Kaseikyo noch nacharbeiten: die erste
> Wiederholung des Frames muss unterdrückt werden. Erst alle weiteren
> Wiederholungsframes sind als langer Tastendruck auszuwerten. Sonst
> bekommt man immer einen langen Tastendruck zurück - auch wenn man die
> Taste nur kurz gedrückt hat.

gibt es da keine Toggel Bits wie in RC5 ? dort klappt das hervorragend 
mit der Toggelbitauswertung, habe meinen Timer ja mit

Peters RC5 gebaut
Beitrag "Fernbedien RC5 Empfänger"

da klappt das einfach mit toogle Bit auswerten, muss ja nicht erkennen 
ob lang oder kurz

> Wann ich das Enkodieren in den IRSND einbaue, kann ich Dir noch nicht
> genau sagen. Habe im Moment viel um die Ohren.
> Gruß,
> Frank

OK danke erst Mal, ich bekomm ja Bescheid wenn du hier weiterbist und 
postest

viel um die Ohren, wer nicht ;-) (wenn du wüsstest)

gruss
jar

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Joachim B. schrieb:

> gibt es da keine Toggel Bits wie in RC5 ?

Nein, gibt es nur in RC5, RC6 und RECS80. In den anderen 17 Protokollen, 
die IRMP "versteht", gibt es kein Toggle-Bit. Dort gibt es u.a. 
alternative Mechanismen wie zum Beispiel Repetition-Frames (NEC). 
Kaseikyo hat hier nichts, hier arbeite ich mit Timeouts, um längere 
Tastendrücke von X-maligen Tastendrücken zu unterscheiden.

>> Wann ich das Enkodieren in den IRSND einbaue, kann ich Dir noch nicht
>> genau sagen. Habe im Moment viel um die Ohren.
> OK danke erst Mal, ich bekomm ja Bescheid wenn du hier weiterbist und
> postest

Bin doch schon fertig damit. Ich lade hier gleich den Test-Source hoch.

Gruß,

Frank

von Frank M. (ukw) (Moderator) Benutzerseite


Angehängte Dateien:

Lesenswert?

Anbei die geänderten Sources (gegenüber der Download-Version) mit 
verbesserter Unterstützung des Kaseikyo-Protokolls als Test-Version.

Änderungen IRMP
---------------

- Kaseikyo-Protokoll:
  Unterschiedliche Behandlung des 1. Wiederholungsframes (kein langer
  Tastendruck) von nachfolgenden Wiederholungsframes (langer
  Tastendruck).

- Kaseikyo-Protokoll:
  Auswertung der 4 + 8 = 12 "Parity-Bits", um Empfangsfehler zu
  erkennen.

Änderungen IRSND
----------------

- Unterstütrung des Kaseikyo-Protokolls inkl. Parity- und Genre1-Bits.
- Keine Unterstützung der Genre2-Bits beim Kaseikyo-Protokoll

Schwächen
---------

Das Kaseikyo-Protokoll enthält von den 48 Bit insgesamt 36 
Nutzdatenbits. Da die IRMP-Datenstruktur nur 32 Bits (16 Adresse, 16 
Kommando) davon speichern kann, gehen leider 4 Bits verloren. Dabei 
handelt es sich um die sog. Genre2-Bits, die aber meist 0000 sind.

Relevant kann diese Schwäche beim Senden per IRSND werden, da dann die 
Codes einiger bestimmter Tasten (wie MENÜ und OK bei Panasonic) nicht 
gesandt werden können.

Abhilfe könnte hier die Erweiterung der IRMP-Datenstruktur um ein neues 
Byte namens "product" bringen. Muss ich nochmal nachdenken, ob ich das 
einbaue. Wahrscheinlich wird es im nächsten Release enthalten sein.

Gruß,

Frank

von Dirk W. (dirkw)


Angehängte Dateien:

Lesenswert?

Hallo,

Ist IRMP eigentlich mit der neuen Apple Remote (Unibody) kompatibel?

Hab mir gestern eine gekauft und wollte sie in meinem aktuellen Projekt 
verwenden; funktionierte aber leider nicht. Keinerlei Reaktion von IRMP.

Einen Debug Trace der Apple Remote habe ich mal angehängt (Trace enthält 
noch eine Taste einer anderen FB zum Vergleich), sowie einen 
aufbereiteten Oszilloskop-Mitschnitt.

CU Dirk

von Klaus L. (kllei)


Lesenswert?

Hallo Dirk,

diese Seite: http://en.wikipedia.org/wiki/Apple_remote
lässt darauf schliessen das beide gleich sind.
Laut Apple Seite ist die Unibody Remote mit allen Produkten nach 2005 
eingeführt wurden kompatibel, was nicht das gleiche ist...

Ich hatte die alte (Plastik) FB mit dem iPod 5 Generation getestet, der 
im Oktober 2005 vorgestellt wurde, hatte funktioniert. Diese scans waren 
auch die "Referenz" für Frank. (falls nicht jemand neue scans geliefet 
hat).

Ich glaube dem Wiki Artikel und bin sicher das beide Remote das gleiche 
Protokoll haben.

HTH,
Klaus

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Dirk W. schrieb:

> Hab mir gestern eine gekauft und wollte sie in meinem aktuellen Projekt
> verwenden; funktionierte aber leider nicht. Keinerlei Reaktion von IRMP.

Ich habe mir gerade den Scan angeschaut. Das Timing ist NEC- und 
APPLE-kompatibel, allerdings verwendet Deine APPLE-FB eine andere ID als 
die APPLE-FB von Klaus - nämlich genau da, wo NEC eigentlich die Bits 
nochmal invertiert ausgibt.

Das ist ein Klacks, die neue ID in den IRMP einzubauen. Mache ich am 
Wochenende.

Gruß,

Frank

von Dirk W. (dirkw)


Lesenswert?

Hi,

Danke Frank :-).


Hab gerade mal ein bisschen gesucht und beim LIRC Projekt folgendes
gefunden:

http://lirc.sourceforge.net/remotes/apple/A1294

> pre_data        0x77E1
> UP                       0x50
> DOWN                     0x30
> LEFT                     0x90
> RIGHT                    0x60
> PLAY                     0xFA
> MENU                     0xC0
> OK                       0x3A


Das würde dem von mir ausgelesenen Protokoll entsprechen.
Scheinbar hat Apple wohl verschiedene Codes in seinen Produkten
hinterlegt.

Wünsche ein schönes WE...


CU Dirk

von Klaus L. (kllei)


Lesenswert?

Frank M. schrieb:
> APPLE-kompatibel, allerdings verwendet Deine APPLE-FB eine andere ID als
> die APPLE-FB von Klaus - nämlich genau da, wo NEC eigentlich die Bits
> nochmal invertiert ausgibt.

Laut der lirc Seite sind die Adressen von alter und neuer FB gleich, nur 
die Kommandos der Tasten unterscheiden sich:
http://lirc.sourceforge.net/remotes/apple/A1156
http://lirc.sourceforge.net/remotes/apple/A1294

Allerdings stimmen die "Lirc" Werte der alten FB mit der Wiki Seite 
überein, wenn man LSB berücksichtigt.

Ich habe noch mal meine Aufzeichnungen gecheckt, die alte FB wurde von 
IRMP ebenfalls mit Adresse 0x77E1 erkannt,
0x87EE (von der Wiki Seite) in LSB gelesen ergibt 0x77E1

Ach ja, die "alte" FB gibt es wohl auch erst seit Oktober 2005, das 
hatte ich überlesen.
Mal wieder raffiniert gemacht von A**le...

Grüße,
Klaus

von eku (Gast)


Lesenswert?

Hallo!

Hat schon jemand IRMP und IRSND in ethersex eingebaut?

von Graf-von-Socke (Gast)


Lesenswert?

Hallo und supper Arbeit.

So weit leuft alles bei mir mit dem einlesen der codes. Aber die 
Ferbedinung von der XBOX 360 macht schwierwigkeiten.Egal welche Taste 
ich drücke kommt immer der Code

irmp_data.protoco =9
irmp_data.address =0
irmp_data.command =31

Vieleicht kann mir von euch Jemand helfen

danke

Graf-von-Socke

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Frank M. schrieb:

> Das ist ein Klacks, die neue ID in den IRMP einzubauen. Mache ich am
> Wochenende.

Habe gerade mal IRMP an den APPLE-Scan angepasst.

@Dirk:

Ersetze bitte die Zeile:
1
    else if ((irmp_command & 0xFF00) == 0xD100)

durch
1
    else if ((irmp_command & 0xFF00) == 0xD100 || (irmp_command & 0xFF00) == 0x4600)

in irmp.c. Dann sollte die FB erkannt werden.

Ich werde das aber anders im nächsten IRMP-Release implementieren. Das 
Problem ist nämlich, dass beide FBs dieselbe NEC-Adresse (0x87ee) haben, 
aber eine unterschiedliche ID verwenden. Damit dann später auch IRSND 
APPLE-Frames versenden kann, welche beide (und auch weitere!) APPLE-FBs 
unterstützt, werde ich zukünftig die bisher von IRMP zurückgegebene 
Adresse 0x87ee ersetzen durch die ID. Das wäre dann bei der FB von Klaus 
die 0xD100 und bei Dirk die 0x4600. Nur so kann eine IRMP-Anwendung auch 
beide APPLE-FBs auseinanderhalten. Daher bitte den obigen Patch erstmal 
als Test/Notlösung sehen...

Die korrekte Fassung kommt dann am Sonntag.

Gruß,

Frank

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Graf-von-Socke schrieb:

> So weit leuft alles bei mir mit dem einlesen der codes. Aber die
> Ferbedinung von der XBOX 360 macht schwierwigkeiten.Egal welche Taste
> ich drücke kommt immer der Code
>
> irmp_data.protoco =9
> irmp_data.address =0
> irmp_data.command =31

IRMP glaubt da anhand des Timings einen RC6-Code zu empfangen. Ich 
glaube aber nicht, dass Microsoft tatsächlich einen von Philips 
entwickelten Code verwendet, sondern (wie so oft) sich etwas eigenes 
ausgedacht hat.

> Vieleicht kann mir von euch Jemand helfen

Da helfen nur Scans. Wie Du diese erstellen kannst, steht im 
IRMP-Artikel:

  http://www.mikrocontroller.net/articles/IRMP

Gruß,

Frank

von Graf-von-Socke (Gast)


Angehängte Dateien:

Lesenswert?

Hallo hier ist nein Scan ergbis fielicht finden sie etwas


gruß

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Graf-von-Socke schrieb:
> Hallo hier ist nein Scan ergbis fielicht finden sie etwas

Danke, scheint ein simpler 32-Bit-Code zu sein. Zwei Tasten reichen da 
aber nicht, ich bräuchte schon so um die 10 Tasten-Scans, um da auch 
eine Struktur zu erkennen. Dann kann ich das in den IRMP integrieren.

Noch als Tipp:
Bitte vor und hinter jedem Kommentar eine neue Zeile beginnen und den 
Kommentar selbst mit dem #-Zeichen einleiten, also:

# Die X Taste
000000000000000000000000000000000000000000000000001111...
# Die Play Taste
000000000000000000000000000000000000000000000000001111...

Ist der Scan mit 10kHz aufgenommen worden?

Gruß,

Frank

von Graf-von-Socke (Gast)


Lesenswert?

Ok werde ich morgen abend nochmal durchführen
habe was nettes im Internet gefunden fielicht hilft das weiter


........................................................................ 
..
lircd.conf für USB-Empfänger (MCEUSB2)

# this config file was automatically generated
# using lirc-0.8.0-CVS(mceusb2) on Tue Jan 17 15:14:11 2006
#
# contributed by Kyle at shadowmage.org
#
# brand: Microsoft
# model no. of remote control: Xbox 360 Universal Media Remote
# devices being controlled by this remote: Xbox 360
#
# This probably works for the normal Xbox 360 remote too.
#
# TV button sends no signal and toggles Xbox 360/TV mode. TV mode can be
# signals for any device the remote supports. Volume Up, Volume Down and
# Mute always use the TV mode while the Xbox live guide button always 
sends
# to the xbox.

begin remote

  name  Microsoft_Xbox360
  bits           16
  flags RC6|CONST_LENGTH
  eps            30
  aeps          100

  header       2676   870
  one           454   429
  zero          454   429
  pre_data_bits   21
  pre_data       0x37FF0
  gap          106291
  min_repeat      1
  toggle_bit      0

  rc6_mask    0x100000000

      begin codes
          OpenClose                0x8BD7
          XboxFancyButton          0x0B9B
          OnOff                    0x8BF3
          Stop                     0x0BE6
          Pause                    0x8BE7
          Rewind                   0x0BEA
          FastForward              0x8BEB
          Prev                     0x0BE4
          Next                     0x8BE5
          Play                     0x0BE9
          Display                  0x8BB0
          Title                    0x0BAE
          DVD_Menu                 0x8BDB
          Back                     0x0BDC
          Info                     0x8BF0
          UpArrow                  0x0BE1
          LeftArrow                0x8BDF
          RightArrow               0x0BDE
          DownArrow                0x8BE0
          OK                       0x0BDD
          Y                        0x8BD9
          X                        0x0B97
          A                        0x8B99
          B                        0x0BDA
          ChUp                     0x8BED
          ChDown                   0x0BEC

          Start                    0x0BF2
          Play                     0x8BE9
          Enter                    0x0BF4
          Record                   0x8BE8
          Clear                    0x0BF5
          1                        0x8BFE
          2                        0x0BFD
          3                        0x8BFC
          4                        0x0BFB
          5                        0x8BFA
          6                        0x0BF9
          7                        0x8BF8
          8                        0x0BF7
          9                        0x8BF6
          100                      0x0BE2
          0                        0x8BFF
          Reload                   0x8BE3
      end codes

end remote
........................................................................ 
..
Quelle

http://www.vdr-wiki.de/wiki/index.php/Fernbedienung_-_Microsoft_XBOX_360_Universal_Media_Remote

von Dirk W. (dirkw)


Angehängte Dateien:

Lesenswert?

Hi,

@Frank:

Danke dir; die Apple-FB klappt jetzt wunderbar :-)

@Frank, Graf-von-Socke

Weiß nicht ob's euch hilft, aber ich hatte vor meiner Apple FB
mit dem Gedanken gespielt die XBOX360 FB zu nehmen.
Hab meinen Trace mal angehängt. Wurde mit 15000 gemacht
und jede Taste 3x aufgezeichnet.

CU Dirk

Zusatz:
Hatte ich ganz vergessen; Im Trace sind noch an einigen Zeilenenden
</n>'s
Bitte vorher ersetzen, falls es den Parser stören sollte ?

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Dirk W. schrieb:

> Danke dir; die Apple-FB klappt jetzt wunderbar :-)

Freut mich. Wie angekündigt, habe ich das mittlerweile allgemeiner 
gelöst: die ID wird nun als Adresse zurückgegeben. So sind Deine 
Fernbedienung und die von Klaus (und auch weitere APPLE-FBs) 
unterscheidbar. Nachteil ist: Die Adresse Deiner FB wird dann eine 
andere sein, nämlich 0x0046. Die von Klaus ist dann 0x00D1.

Update kommt in Kürze als Download im Artikel bzw. über SVN.

> Weiß nicht ob's euch hilft, aber ich hatte vor meiner Apple FB
> mit dem Gedanken gespielt die XBOX360 FB zu nehmen.
> Hab meinen Trace mal angehängt. Wurde mit 15000 gemacht
> und jede Taste 3x aufgezeichnet.

Vielen Dank! Deine Scans sind wunderbar, Graf-von-Socke hat offenbar 
eine ganz andere Scan-Frequenz genutzt, so dass ich mit seinen Scans 
wenig bis gar nichts anfangen konnte, weil IRMP mit 10kHz erst gar nicht 
RC6 erkannt hat.

Die XBOX benutzt tatsächlich RC6-Code, wer hätte das gedacht. Aber ich 
habe hier genau dieselben Probleme wie mit der Kathrein-FB, deren Scans 
hier schon mal gepostet wurden. Das ist leider kein Mode-0-RC6, wie er 
in

  http://www.sbprojects.com/knowledge/ir/rc6.htm

beschrieben ist. Ich werde mich nochmal mit der RC6-Decodierung 
beschäftigen und hoffe damit, die Kathrein-FB und die XBOX erschlagen zu 
können. Im Moment werden nämlich nur Mode-0-FBs mit 7 + 16 Datenbits 
erkannt. Die XBOX und die Kathrein-FB benutzen einen abweichenden Mode 
mit wesentlich mehr Datenbits. Wenn da jemand irgendeine Doku findet, 
wie die Struktur der Datenbits (Länge der Adresse und der Kommandos) 
ist, würde ich mich freuen.

> Hatte ich ganz vergessen; Im Trace sind noch an einigen Zeilenenden
> </n>'s
> Bitte vorher ersetzen, falls es den Parser stören sollte ?

Das war kein Problem :-)

Gruß,

Frank

von Achim (Gast)


Lesenswert?

Ich habe eine Dokumentation zum Mode 6A von RC6 gefunden: 
http://slycontrol.ru/scr/kb/rc6.htm. Ich hoffe die hilft dir weiter.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Achim schrieb:
> Ich habe eine Dokumentation zum Mode 6A von RC6 gefunden:
> http://slycontrol.ru/scr/kb/rc6.htm. Ich hoffe die hilft dir weiter.

Vielen Dank, das ist ja schon mal ein wenig mehr. Habe den URL direkt 
mal im IRMP-Artikel verlinkt. Jetzt muss ich nur schauen, ob ich den 
Mode 6A mit den Scans in Einklang bringen kann...

Gruß,

Frank

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Es gibt eine neue Version 1.7.3 von IRMP.

Download:

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

Änderungen gegenüber 1.7.2:

 - Neues Protokoll: JVC

 - Kaseikyo-Protokoll: Berücksichtigung der Genre-Bits.
   ACHTUNG: dadurch neue Command-Codes!

 - Kaseikyo-Protokoll: Verbesserte Behandlung von Wiederholungs-Frames

 - Verbesserte Unterstützung des APPLE-Protokolls.
   ACHTUNG: dadurch neue Adress-Codes!

Analog dazu gibt es auch eine neue Version 1.7.3 von IRSND.

Download:

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

Änderungen gegenüber 1.7.2:

 - Neues Protokoll: Kaseikyo (Panasonic u.a.)

Viel Spaß,

Frank

von Graf-von-Socke (Gast)


Lesenswert?

Hallo
und danke für den richtigen scan war mein fehler hatte den scan auf 
20000 eingestellt.

Nun wenn es euch intersesiert bastel ich gerade eine schaltung damit ich 
den
mikrocontroller über mein Handy dazu auffoder die geräere (TV usw) zu 
steuern.

bis dann

von Dirk W. (dirkw)


Angehängte Dateien:

Lesenswert?

Hi,

noch interessant ist eventuell folgende Seite:
http://www.picbasic.nl/info_rc6_uk.htm

und folgendes Dokument (Seite: 28)
http://home.hccnet.nl/m.majoor/files/pronto.pdf

Hatte vor kurzem auch mal probiert RC6a per Hand zu dekodieren ..
Hab wohl allerdings einen Fehler gemacht, denn das Ergebnis
das ich zum Vergleich herangezogen hatte war unterschiedlich.

Hab's trotzdem mal angehängt; vielleicht hilft es ??


CU Dirk

von Graf-von-Sokce (Gast)


Lesenswert?

Hallo zusammen

Habe nun ein anders Problem auf meine ATMEGA8 leuft alles supper.
Bin nun wegen platzmagel auf einen ATMGA 168 umgestigen nun leuft nur 
noch ISR aber es werden keine IR-CODES Ausgeben

gruß

Graf-von-Socke

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Dirk W. schrieb:

> noch interessant ist eventuell folgende Seite:
> http://www.picbasic.nl/info_rc6_uk.htm

Super Link! Danke. Damit werde ich RC6/RC6A wohl endlich in den Griff 
bekommen.

> Hatte vor kurzem auch mal probiert RC6a per Hand zu dekodieren ..
> Hab wohl allerdings einen Fehler gemacht, denn das Ergebnis
> das ich zum Vergleich herangezogen hatte war unterschiedlich.
>
> Hab's trotzdem mal angehängt; vielleicht hilft es ??

Danke, werde ich mir anschauen.

Gruß,

Frank

von Joachim B. (jar)


Lesenswert?

hattest du meine Frage per Mail bekommen ?
darf man dich per Mail fragen ?

gruss
jar

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Joachim B. schrieb:
> hattest du meine Frage per Mail bekommen ?
> darf man dich per Mail fragen ?

Habe ich bekommen. Da ich aber erst Freitag aus dem Urlaub gekommen bin 
und eine Antwort auf Deine Mail etwas länger dauert, bin ich noch nicht 
dazu gekommen, Deine Mail zu beantworten.

Gruß,

Frank

von Frank M. (ukw) (Moderator) Benutzerseite


Angehängte Dateien:

Lesenswert?

So, ich habe RC6A als extra Protokoll No. 21 eingebaut. Damit sollte 
nicht nur die XBOX-FB funktionieren, sondern endlich auch die 
Kathrein-FB, an der ich schon längere Zeit rumdoktere.

Anbei die gegenüber der Download-Version geänderten Sources als 
Testversion. Sobald mir jemand sagt, dass es läuft, gibt es ein neues 
Release.

Viel Spaß,

Frank

von Graf-von-Socke (Gast)


Lesenswert?

Suppi
werde es mal gleich ausprobieren ob es geht

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Graf-von-Socke schrieb:
> werde es mal gleich ausprobieren ob es geht

Nimm aber 10kHz, das reicht vollkommen. 20kHz braucht man nur für 
Protokolle, die enorm kurze Pulse nutzen. Ds ist bisher bisher lediglich 
bwi RECS80 der Fall.

15kHz sind auch okay, verbät aber schon mehr CPU-Zeit.

Gruß,

Frank

von Graf-von-Socke (Gast)


Lesenswert?

Nochnal Hallo

habe es gestest und funktioniert supper gemacht.

Und haben Sie schon mal wegen den ATMGA 168 nachgeschaut warum es mit 
dem nicht leüft !

gruß

Graf-von-Socke

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Graf-von-Socke schrieb:
> habe es gestest und funktioniert supper gemacht.

Freut mich :-)

> Und haben Sie schon mal wegen den ATMGA 168 nachgeschaut warum es mit
> dem nicht leüft !

irmp läuft auch auf einem ATMEGA 162 ohne Codeänderung, z.B. im 
WordClock-Projekt. Hast Du denn auch den Prozessor-Typ im WinAVR-Projekt 
ausgewechselt? Man kann i.a. nicht einfach das HEX-File für einen 
ATMEGA8 auf einen 168er laden.

Und unbedingt die Fuses beachten! Siehe 
http://www.engbedded.com/fusecalc/

Gruß,

Frank

von Graf-von-Socke (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Frank

Jo habe habe ich gemach siehe an den 2 Bildern. Habe eine jungfreulichen 
ATMEGA 168 genommen den ich noch hatte wie müssen die  Fuses-bits 
aussehn

gruß

Graf-von-Socke

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Graf-von-Socke schrieb:
> Jo habe habe ich gemach siehe an den 2 Bildern. Habe eine jungfreulichen
> ATMEGA 168 genommen den ich noch hatte wie müssen die  Fuses-bits
> aussehn

Ein jungfräulicher 168er läuft mit 1MHz internem Oszillator. Benutzt Du 
tatsächlich einen 3,686400 MHz Quarz, wie Du das im Projekt angegeben 
hast?

Ich kann Dir erst die Fuses-Einstellung nennen, wenn Du obige Frage 
beantwortet hast.

Gruß,

Frank

von Graf-von-Socke (Gast)


Lesenswert?

Jo da es auf der Testplatine drauf ist. Hatte damit noch keine Probelem 
da ich schon fiel mt UART gemach habe und die frequenz mit UART sehr gut 
leuft

siehe http://www.wormfood.net/avrbaudcalc.php


gruß

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Graf-von-Socke schrieb:
> Jo da es auf der Testplatine drauf ist.

Vorausgesetzt, der µC läuft mit 5V, würde ich wählen:

Low:      0xc7
High:     0xdc
Extended: 0xf9

Achtung: der µC lässt sich dann auch nur noch flashen, wenn der Quarz 
auch wirklich angeschlossen ist.

Du kannst Dir die Werte aber auch selbst ausrechnen lassen, siehe

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

Gruß,

Frank

von Graf-von-Socke (Gast)


Lesenswert?

Danke

nun leuft alles Danke

hatte ein nettes erreignis. Mein Quartz wolte nicht  muste erst mit dem 
Frequenz Generator einen Beipass legen. Muss bestimmt nachlöten


Kennst du eigendlich den X-PORT


gruß
Graf-von-Socke

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Graf-von-Socke schrieb:

> nun leuft alles Danke

Prima.

> hatte ein nettes erreignis. Mein Quartz wolte nicht  muste erst mit dem
> Frequenz Generator einen Beipass legen. Muss bestimmt nachlöten

Deshalb meine obige Warnung :-)

> Kennst du eigendlich den X-PORT

Du meinst den "XPORT Ethernet Wandler Ethernet zu seriell" von 
Lantronix?

Gruß,

Frank

von Graf-von-Socke (Gast)


Lesenswert?

Jo

Den meine ich finde den ganz nett aber er ist halt bischen teuer. Aber 
was man geschenkt bekommt sagt man nicht nein.

Bin nun dabei eine Schalung zu entwickeln damit jeder PC (auch Handy) 
auf den µC zu greifen kann und die Infrarot Befehle absetzen kann.

Der Grund dafür ist meine Frau die findt das die vielen Gräte aus den 
Blickfang verschwinden und daher fand ich deinen Ansatz hier sehr 
hilfreich.


Gruß

Graf-von-Socke

von Dirk W. (dirkw)


Lesenswert?

Hi Frank,

auch hier Bestätigung. Super gemacht; System und Command Byte 
funktionieren.

Bist du dir allerdings bei der Customer ID sicher ?
Ich bekomme hier als Ausgabe 0xffef bin mir aber
ziemlich sicher daß die MS ID 0x800F ist.


CU Dirk

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Dirk W. schrieb:

> auch hier Bestätigung. Super gemacht; System und Command Byte
> funktionieren.

Sehr schön, danke für die Rückmeldung :-)

Achja, das MSB der 14 Bits (das ist das MSB des System-Bytes) ignoriere 
ich: das scheint nämlich zu togglen - ähnlich dem Toggle-Bit "TR" bei 
Mode 0, was dort ziemlich weit vorne direkt hinter den Mode-Bits liegt. 
Das ist mir beim XBOX-Scan als auch bei der Kathrein-FB aufgefallen: 
Beim Mode 6A wechselt das eigentliche Toggle-Bit nicht, dafür aber das 
oberste Bit vom System-Byte.

> Bist du dir allerdings bei der Customer ID sicher ?

Nein, sonst hätte ich ja keine Testversion gemacht ;-)

> Ich bekomme hier als Ausgabe 0xffef bin mir aber
> ziemlich sicher daß die MS ID 0x800F ist.

Okay, ich überprüfe das nochmal. Ich stehe echt auf Kriegsfuß mit der 
Manchester-Deokodierung. Wenn ein Bit falsch ist, kippen alle Bits 
dahinter mit :-(

Die Hölle ist nämlich das "eigentliche" RC6-Toggle-Bit "TR", welches die 
doppelte Länge der anderen Bits hat. Da ich mir immer nur Längen 
zwischen zwei Flankenwechseln anschaue, macht mir diese wechselnde 
Frequenz das Leben schwer, denn es kann da als Länge nicht nur 1-fache 
und 2-fache Länge, sondern auch die 1,5-fache Länge auftreten. Ich 
vermute mal, dass genau da das Bit kippt - und damit auch die 
Custtomer-ID, die danach folgt.

Gruß,

Frank

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Dirk W. schrieb:
> Bist du dir allerdings bei der Customer ID sicher ?

Fehler gefunden und behoben.

Ersetze in irmp.c die Zeilen 2078/2079
1
    irmp_store_bit (0);
2
    last_value = 0;

durch folgendes:
1
    if (irmp_param.complete_len == RC6_COMPLETE_DATA_LEN_LONG) // RC6 mode 6A
2
    {
3
        irmp_store_bit (1);
4
        last_value = 1;
5
    }
6
    else    // RC6 mode 0
7
    {
8
        irmp_store_bit (0);
9
        last_value = 0;
10
    }

Nun kommt als Customer-ID auch 0x800F raus - wie gewünscht ;-)

Gruß,

Frank

von Dirk W. (dirkw)


Lesenswert?

Hi,

jetzt funktioniert es ... ^_^

Ich protokollier dann gerade mal die Tasten, damit
ich meine alte PC FB gegen die XBOX FB tauschen kann ^_^


CU Dirk

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Neue Version 1.8.0 von IRMP verfügbar, Download unter

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

Änderungen gegenüber 1.7.3:

  - Neues Protokoll: RC6A

Damit werden nun die XBOX und auch die Kathrein-FBs unterstützt.

Ebenso ist nun die Version 1.8.0 von IRSND verfügbar, Download unter

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

Änderungen gegenüber 1.7.3:

  - Neues Protokoll: JVC
  - Anpassung des APPLE-Encoders an IRMP-Version 1.7.3.

Im IRSND fehlt jetzt nur noch die Unterstützung des 
RC6-/RC6A-Protokolls, dann sind beide Software-Module wieder 
"symmetrisch". Bin da nun dran.

Die Dokumentation im IRMP-Artikel habe ich angepasst bzw.
erweitert, siehe:

  http://www.mikrocontroller.net/articles/IRMP

Viel Spaß,

Frank

von Joachim B. (jar)


Lesenswert?

wollte nur noch mal danke sagen,

deine Tipps wo ich meinen source anpassen musste waren erfolgreich, 
brauchte wirklich nur noch die irmp.c/.h einbinden und die irmpconfig.h 
anpassen und es funzt sofort, RC6 hab ich noch nicht testen können, aber 
der Rest läuft wie gehabt was ein gutes Zeichen ist......


gruss
jar

von eku (Gast)


Lesenswert?

Frank M. schrieb:
> Neue Version 1.8.0 von IRMP verfügbar,

Ganz toll ,Frank. Nur leider wird irmp_ISR immer länger. Wie steht es 
mit den Optmierungen aus 
Beitrag "Re: IRMP - Infrared Multi Protocol Decoder" ?

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

eku schrieb:
> Ganz toll ,Frank. Nur leider wird irmp_ISR immer länger. Wie steht es
> mit den Optmierungen aus
> Beitrag "Re: IRMP - Infrared Multi Protocol Decoder" ?

Schlecht. Ich hatte mal testweise so eine Version gemacht, wo (nach 
Deiner Idee) in einer Schleife über die Protokolle mittels Timingwerten 
das richtige Protokoll ermittelt werden sollte. Dabei mussten noch 
Pulse-Distance-Protokolle mit Start-Bit von denen ohne Start-Bit (z.B. 
Denon) und auch die Manchester-codierten Protokolle extra abgearbeitet 
werden. Also gab es schon einmal 3 Schleifen...

Ergebnis:

1. Keine Flash-Speicher-Ersparnis, da die Konstruktion der 3 Schleifen
   inkl. zusätzlichen Speicherbedarf der Startbit-Werte für die
   einzelnen Protokolle alles wieder auffraß. Am Ende wurde sogar mehr
   Flash-Speicher benötigt als vorher.

2. Viel Größere Laufzeiten, da die Pulse-/Pause-Werte nicht mehr mit
   Konstanten, sondern mit Variableninhalten abgeglichen werden
   mussten. Der Variablenzugriff war wegen Indirektion über

            startbitstructarray[idx]->value

   nicht gerade effizient.

Kampakter bekommt man den Code wohl nicht, da kann man nur an Feinheiten 
tunen. Ab und zu stolpere ich mal über eine Stelle, die optimiere ich 
dann "on-the-fly", wenn es ohne größeren Aufwand geht.

Ich erwähnte damals zwar, dass man die linearen Vergleiche, die 
unmittelbar nach Eintreffen des Startbits auftreteten, noch optimieren 
könnte. Das würde aber auch keine Verkleinerung des Codes verursachen, 
eher eine (leichte) Vergrößerung. Lediglich die "Suche" nach dem 
richtigen Protokoll ginge dann etwas schneller. Die Arbeit habe ich mir 
aber noch nicht gemacht, da hier der Gewinn bei 20 Protokollen eher 
marginal ist. Bei 1000 Protokollen wäre das was anderes ;-)

Mein Fazit:

Wenn Dir der Code zu groß ist, schalte die nicht benötigten Protokolle 
ab. Dann wirst Du sehen, dass IRMP selbst eigentlich nicht größer ist 
als vorher. Ein neues Protokoll im IRMP verursacht im allgemeinen keine 
Vergrößerung des Codes - solange man es ausgeschaltet(!) lässt ;-)

Wenn jemand ein neu implementiertes Protokoll tatsächlich nutzen will, 
kann er schlecht erwarten, dass der Code gleich groß bleibt.


Gruß,

Frank

von Simon B. (nomis)


Lesenswert?

Frank, vielen Dank für IRMP, das leistet bei mir gerade gute Dienste 
:-)

In irmpconfig.h steht als Maximum für F_INTERRUPTS 15000 - das ist aber 
eher ein veralteter Wert, oder? Oder muss man was spezielles tun, wenn 
man darüber hinausgeht (Manche Protokolle verlangen ja 20kHz)?

Ich habe übrigens beobachtet, dass bei F_INTERRUPTS=16000 eine 
Verringerung der Codegröße eintritt (um ca. 130-135 Bytes). Was passiert 
denn da?

Viele Grüße,
        Simon

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Simon Budig schrieb:
> Frank, vielen Dank für IRMP, das leistet bei mir gerade gute Dienste
> :-)

Freut mich :-)

> In irmpconfig.h steht als Maximum für F_INTERRUPTS 15000 - das ist aber
> eher ein veralteter Wert, oder? Oder muss man was spezielles tun, wenn
> man darüber hinausgeht (Manche Protokolle verlangen ja 20kHz)?

Ja, es sind auch 20kHz möglich, habe ich vergessen, das zu 
aktualisieren. Allerdings wird dann etwas mehr Speicherplatz benötigt, 
da dann einige Variablen vom Typ her automatisch über den Preprocessor 
von uint8_t auf uint16_t wechseln. Auch wird mehr CPU-Zeit verbraten. 
RECS80, das einzige Protokoll, welches 20kHz erfordert, ist auch noch 
nicht in der Praxis getestet worden.

> Ich habe übrigens beobachtet, dass bei F_INTERRUPTS=16000 eine
> Verringerung der Codegröße eintritt (um ca. 130-135 Bytes). Was passiert
> denn da?

Du meinst bei Erhöhung auf 16000? Müsste dann eigentlich größer werden, 
siehe oben.

Gruß,

Frank

von Simon B. (nomis)


Lesenswert?

Frank M. schrieb:
> Simon Budig schrieb:
>> Ich habe übrigens beobachtet, dass bei F_INTERRUPTS=16000 eine
>> Verringerung der Codegröße eintritt (um ca. 130-135 Bytes). Was passiert
>> denn da?
>
> Du meinst bei Erhöhung auf 16000? Müsste dann eigentlich größer werden,
> siehe oben.

Deswegen war ich ja irritiert...

Aber ich beobachte hier das Gegenteil. Ich habe gerade mal eine kleine 
Reihe gemacht:

F_INTERRUPTS  |   text  | data  |  bss  |    dec  |  vgl. zu 16000
--------------+---------+-------+-------+---------+----------------
        6000  |  11108  |  180  |  113  |  11401  |  +118
        7000  |  11124  |  180  |  113  |  11417  |  +134
        8000  |  11112  |  180  |  113  |  11405  |  +122
        9000  |  11126  |  180  |  113  |  11419  |  +136
       10000  |  11126  |  180  |  113  |  11419  |  +136
       11000  |  11130  |  180  |  113  |  11423  |  +140
       12000  |  11130  |  180  |  113  |  11423  |  +140
       13000  |  11130  |  180  |  113  |  11423  |  +140
       14000  |  11126  |  180  |  113  |  11419  |  +136
       15000  |  11130  |  180  |  113  |  11423  |  +140
       16000  |  10990  |  180  |  113  |  11283  |     0
       17000  |  10990  |  180  |  113  |  11283  |     0
       18000  |  10990  |  180  |  113  |  11283  |     0
       19000  |  10988  |  180  |  113  |  11281  |    -2
       20000  |  10988  |  180  |  113  |  11281  |    -2
       21000  |  10982  |  180  |  113  |  11275  |    -8
       22000  |  10982  |  180  |  113  |  11275  |    -8
       23000  |  10982  |  180  |  113  |  11275  |    -8
       24000  |  10982  |  180  |  113  |  11275  |    -8

Mhm. Ich habe mir gerade mal den Assembler angeguckt. Offensichtlich 
verschwindet bei F_INTERRUPTS = 16000 die gesamte if-Abfrage bei Zeile 
2020 (if (irmp_pause_time > IRMP_TIMEOUT_LEN)) in irmp.c, anscheinend 
beschließt der Compiler, dass das nicht eintreffen kann und schmeißt den 
Code weg.

Viele Grüße,
        Simon

PS: Zur Klarstellung: In der Codegröße ist natürlich noch jede Menge 
anderer Kram drin (LUFA, Displayansteuerung). Die Zahlen dürfen nicht 
zur Beurteilung der Größe von IRMP herangezogen werden, interessant sind 
hier nur die relativen Änderungen.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Simon Budig schrieb:
> Mhm. Ich habe mir gerade mal den Assembler angeguckt. Offensichtlich
> verschwindet bei F_INTERRUPTS = 16000 die gesamte if-Abfrage bei Zeile
> 2020 (if (irmp_pause_time > IRMP_TIMEOUT_LEN)) in irmp.c, anscheinend
> beschließt der Compiler, dass das nicht eintreffen kann und schmeißt den
> Code weg.

Das darf nicht sein, eigentlich wird ab ca. 16000 Hz IRMP_TIMEOUT_LEN 
größer als 255 und deshalb auch irmp_pause_time dann vom Typ uint16_t. 
Das scheint aber nicht zu funktionieren. Kein Wunder, dass der Compiler 
dann das if-Statement wegwirft. Ich werde das überprüfen.

Danke für den Tipp und Deine "Messungen" :-)

Gruß,

Frank

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Fehler gefunden, es ist eine Änderung in irmp.c notwendig.

Alt:
1
#include "irmp.h"
2
#ifndef IRMP_USE_AS_LIB
3
#include "irmpconfig.h"
4
#endif

Neu:
1
#ifndef IRMP_USE_AS_LIB
2
#include "irmpconfig.h"
3
#endif
4
#include "irmp.h"

Werde ich noch am Wochenende im Paket ändern.

Gruß,

Frank

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Frank M. schrieb:
> Fehler gefunden, es ist eine Änderung in irmp.c notwendig.
> Werde ich noch am Wochenende im Paket ändern.

[x] Done

Download-Version ist nun 1.8.1.

Gruß,

Frank

von Simon B. (nomis)


Lesenswert?

Sieht besser aus:

  F_INTR |   text  | data  |  bss  |    dec  |  vgl. zu 16000
---------+---------+-------+-------+---------+-----------------
   5000  |  11104  |  180  |  113  |  11397  |  -268
   6000  |  11108  |  180  |  113  |  11401  |  -264
   7000  |  11124  |  180  |  113  |  11417  |  -248
   8000  |  11112  |  180  |  113  |  11405  |  -260
   9000  |  11126  |  180  |  113  |  11419  |  -246
  10000  |  11126  |  180  |  113  |  11419  |  -246
  11000  |  11130  |  180  |  113  |  11423  |  -242
  12000  |  11130  |  180  |  113  |  11423  |  -242
  13000  |  11130  |  180  |  113  |  11423  |  -242
  14000  |  11126  |  180  |  113  |  11419  |  -246
  15000  |  11130  |  180  |  113  |  11423  |  -242
  16000  |  11370  |  180  |  115  |  11665  |     0
  17000  |  11370  |  180  |  115  |  11665  |     0
  18000  |  11372  |  180  |  115  |  11667  |    +2
  19000  |  11372  |  180  |  115  |  11667  |    +2
  20000  |  11376  |  180  |  115  |  11671  |    +6
  21000  |  11370  |  180  |  115  |  11665  |     0
  22000  |  11370  |  180  |  115  |  11665  |     0
  23000  |  11372  |  180  |  115  |  11667  |    +2
  24000  |  11372  |  180  |  115  |  11667  |    +2
  25000  |  11372  |  180  |  115  |  11667  |    +2

Vielen Dank und viele Grüße,
        Simon

von Joachim B. (jar)


Lesenswert?

der Bug bei U2X ist leider immer noch da, habe wie gesagt nur irmp.c/h 
eingebunden, meine main und die irmpconfig geändert sowie logging on und 
defines fürs steckbrett, , muss am verwendeten m644 liegen, ich weiss 
nur nicht wann und warum dieser U2X Fehler im irmp-uart kommt, wenn ich 
das einfach auskommentier gehts ja, aber der code sollte ja so laufen

Fehlermeldung:
../irmp.c:593:26: error: util/setbaud.h: No such file or directory

finde ich auch in meinem winAVR nicht
1
void
2
irmp_uart_init (void)
3
{
4
    UART0_UBRRH = UBRRH_VALUE;                                                                      // set baud rate
5
    UART0_UBRRL = UBRRL_VALUE;
6
/*
7
#if USE_2X
8
    UART0_UCSRA |= (1<<U2X);
9
#else
10
    UART0_UCSRA &= ~(1<<U2X);
11
#endif
12
*/
13
#if USE_2X
14
    UART0_UCSRA |= (1<<U2X0);
15
#else
16
    UART0_UCSRA &= ~(1<<U2X0);
17
#endif
18
19
    UART0_UCSRC = UART0_UCSZ1_BIT_VALUE | UART0_UCSZ0_BIT_VALUE | UART0_URSEL_BIT_VALUE;
20
    UART0_UCSRB |= UART0_TXEN_BIT_VALUE;                                                            // enable UART TX
21
}

so gehts, nur warum

lg
jar

von Joachim B. (jar)


Lesenswert?

als helfende krücke noch

#if IRMP_LOGGING != 0       // 1: log IR signal (scan), 0: do not 
(default)
    uart_init(UART_BAUD_SELECT(9600,F_CPU));
#endif


mit uart.c/h eingebunden Peter Fleury
modified by Patrick Kaplan for ATMega644 usage

und uart_init aufruf statt irmp-uart_init

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Joachim B. schrieb:

> Fehlermeldung:
> ../irmp.c:593:26: error: util/setbaud.h: No such file or directory

Meines liegt unter 
C:\Programme\WinAVR-20100110\avr\include\util\setbaud.h

und ist Bestand der avr-libc.

Wo liegt Dein avr\include-Verzeichnis? Überprüfe mal Deine Version - 
damit meine ich jetzt nicht die WinAVR-Version, sondern Deine 
avr-gcc-Version.

> finde ich auch in meinem winAVR nicht

Dann fehlt da was bei Dir. setbaud.h gibt es schon länger.

> so gehts, nur warum

Weil genau die U2X-Geschichte in setbaud.h definiert wird.

Gruß,

Frank

von Joachim B. (Gast)


Lesenswert?

Frank M. schrieb:
> Meines liegt unter
> C:\Programme\WinAVR-20100110\avr\include\util\setbaud.h
> und ist Bestand der avr-libc.
> Wo liegt Dein avr\include-Verzeichnis? Überprüfe mal Deine Version -
> damit meine ich jetzt nicht die WinAVR-Version, sondern Deine
> avr-gcc-Version.
>> finde ich auch in meinem winAVR nicht
> Dann fehlt da was bei Dir. setbaud.h gibt es schon länger.

setbaud.h fehlt, ergo muss bei meiner letzten Installation was schief 
gelaufen sein
1
 Verzeichnis von C:\Programme\atmel
2
3
10.12.2008  01:11    <DIR>          .
4
10.12.2008  01:11    <DIR>          ..
5
07.01.2010  21:50    <DIR>          AVR Tools
6
17.03.2008  20:32    <DIR>          BASCOM-AVR
7
02.09.2008  14:23           432.040 CodeCompareSetup.exe
8
25.11.2008  01:00    <DIR>          Grafikkonverter
9
07.03.2008  21:01    <DIR>          PonyProg2000
10
04.03.2008  20:25    <DIR>          WinAVR


komisch nur das alle meine anderen Projekte laufen, also habe ich nie 
was vermisst
was muss ich also noch wie einbinden ?

vielen Dank

von Joachim B. (jar)


Lesenswert?

so, setbaud ist wieder da, neuste winAVR installiert

muss noch testen

von Joachim B. (jar)


Lesenswert?

bin leider noch nicht weiter, so siehts aus:
1
Build started 9.9.2010 at 15:33:42
2
3
avr-gcc -I"C:\Programme\atmel\WinAVR\avr\include\util"  -mmcu=atmega644 -Wall -gdwarf-2 -std=gnu99                                                     -DF_CPU=8000000UL -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -MD -MP -MT main.o
4
 -MF dep/main.o.d  -c  ../main.c
5
6
avr-gcc -I"C:\Programme\atmel\WinAVR\avr\include\util"  -mmcu=atmega644 -Wall -gdwarf-2 -std=gnu99                                                     -DF_CPU=8000000UL -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -MD -MP -MT irmp.o
7
8
 -MF dep/irmp.o.d  -c  ../irmp.c
9
10
../irmp.c: In function 'irmp_uart_init':
11
../irmp.c:657: error: 'U2X' undeclared (first use in this function)
12
../irmp.c:657: error: (Each undeclared identifier is reported only once
13
../irmp.c:657: error: for each function it appears in.)
14
make: *** [irmp.o] Error 1
15
Build failed with 3 errors and 0 warnings...

was muss ich noch machen ?

include file search path, hab ich doch in project options ??? grübel
C:\Programme\atmel\WinAVR\avr\include\util\

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Joachim B. schrieb:
> bin leider noch nicht weiter, so siehts aus:

> ../irmp.c: In function 'irmp_uart_init':
> ../irmp.c:657: error: 'U2X' undeclared (first use in this function)

Du hast offenbar nicht die aktuelle IRMP-Version vom 04.09.2010. Da wird 
für bestimmte µCs U2X als U2X0 definiert.

Gruß,

Frank

von Joachim B. (jar)


Lesenswert?

stimmt da war ich unterwegs, habs also nicht mitbekommen

so geladen, eingespielt, aber immer noch Probleme...

ich glaub ich lasse meine Einbindung von P.Fleury UART.C/H damit klappts 
ja

DAANNKEEE

von Fabi S (Gast)


Lesenswert?

Hey,
super geile Sache.
Wollt nur kurz mitteilen das meine LG Fernbedienung vom TV und BluRay 
Player mit dem Samsung(32) Protokoll einwandfrei funktionieren.

von Fabi S (Gast)


Lesenswert?

Ahhh noch was vergessen,
meine beiden Fernbedienungen (sind verschiedene) der Marke Smart 
Electronics (Receiver usw.) funktionieren mit dem NEC Protokoll.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Fabi S schrieb:
> Wollt nur kurz mitteilen das meine LG Fernbedienung vom TV und BluRay
> Player mit dem Samsung(32) Protokoll einwandfrei funktionieren.

Freut mich.

> meine beiden Fernbedienungen (sind verschiedene) der Marke Smart
> Electronics (Receiver usw.) funktionieren mit dem NEC Protokoll.

Aber sie werden unterschiedliche Adressen haben, oder?

Gruß,

Frank

von Fabi S (Gast)


Lesenswert?

uiuiui jetzt fragst mich was :)
ich hab mir nur per debugfunktion die werte ausgeben lassen und alle 
tasten durchgedrückt um zu kucken ob alle erkannt werden, protokoll war 
2 aber die adresse weiss ich nichtmehr.
soll ich nochmal kucken?

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Fabi S schrieb:
> soll ich nochmal kucken?

Nö, brauchst Du nicht.

von Joachim B. (jar)


Angehängte Dateien:

Lesenswert?

kleines Problem (oder eher großes)

dein Code ist doch ähnlich meinem gefundenen für IRSND start stop

meiner funktioniert, getestet mit Oszi 500µs 36kHz on off
meiner:
1
void timer0_init(void)
2
{
3
    OCR0A  = (F_CPU / ( 2 * IR_FREQUENZ )) - 1;               // compare value: 
4
#if !FB_LCD_STECKBRETT
5
  IR_SND_DDR |= (1<<IR_SND);                                  // set DDR to output
6
    IR_SND_PORT &= ~(1<<IR_SND);                                // set pin to low
7
#endif
8
}
9
10
void timer0_start(void)
11
{
12
    TCCR0A  |= (1 << WGM01) | (1 << WGM00) | (1 << COM0A0);   // switch CTC Mode on, set prescaler to 1
13
  TCCR0B   |= (1 << WGM02) | (1<<CS00);
14
    TIMSK0  |= (1 << OCIE0A);                                   // OCIE0A: Interrupt by timer compare
15
}
16
17
void timer0_stop(void)
18
{
19
  TIMSK0  &= ~(1 << OCIE0A);                                   // OCIE0A: Interrupt by timer compare
20
  TCCR0B   &= ~(1 << WGM02) | (1<<CS00);
21
    TCCR0A  &= ~(1 << WGM01) | (1 << WGM00) | (1 << COM0A0);

deiner:
1
static void
2
irsnd_on (void)
3
{
4
    if (! irsnd_is_on)
5
    {
6
#ifndef DEBUG
7
#if defined (__AVR_ATmega32__)
8
        TCCR2 |= (1<<COM20)|(1<<WGM21);                 // = 0x42: toggle OC2A on compare match, clear Timer 2 at compare match OCR2A
9
#else
10
        TCCR2A |= (1<<COM2A0)|(1<<WGM21);               // = 0x42: toggle OC2A on compare match, clear Timer 2 at compare match OCR2A
11
#endif  // __AVR...
12
#endif // DEBUG
13
        irsnd_is_on = TRUE;
14
    }
15
}
16
17
/*---------------------------------------------------------------------------------------------------------------------------------------------------
18
 *  Switch PWM off
19
 *  @details  Switches PWM off
20
 *---------------------------------------------------------------------------------------------------------------------------------------------------
21
 */
22
static void
23
irsnd_off (void)
24
{
25
    if (irsnd_is_on)
26
    {
27
#ifndef DEBUG
28
#if defined (__AVR_ATmega32__)
29
        TCCR2 &= ~(1<<COM20);                                                           // normal port operation, OC2A disconnected.
30
#else
31
        TCCR2A &= ~(1<<COM2A0);                                                         // normal port operation, OC2A disconnected.
32
#endif  // __AVR...
33
        IRSND_PORT  &= ~(1<<IRSND_BIT);                                                 // set IRSND_BIT to low
34
#endif // DEBUG
35
        irsnd_is_on = FALSE;
36
    }
37
}


ergo dachte ich ich ersetzte dein ON/OFF durch meines

aber klappt nicht, irgendwo ist noch der Wurm drin,

nach play +5 sekunden hängt die routine

wenn einer mal schauen mag ?

danke
gruss
jar

von Joachim B. (jar)


Lesenswert?

mit static volatile usw. muss ich noch üben

am irsnd_busy hats gelegen

Routine läuft erst mal, nur das Gerät fühlt sich noch nicht angesprochen

muss erst mal ein 2ten IRMP bauen zum testen

die Pulse sind nun zu kurz um sie mit der digital cam hilfe zu sehen, im 
gegensatz zu vorher 500µs on/off

von Bruno I. (bjnas)


Lesenswert?

Das ist ja ein super Projekt, Gratulation an alle. Das ganze läuft ja 
auch mit B&O Codes. Nun hab ich einen IR Sender-Empfänger aus einem 
alten B&O Fernseher geschraubt.

Die Frage nun, kann man Ihn anstelle eines TSOP-7000 verwenden. Kennt 
jemand die Anschlüsse. Beim Empfänger ist auch ein Lichtsensor.

Kann über die beiden IR-Empfänger (TFK B  PW82) keine Datenblätter 
finden.

Danke für eine kleine Unterstützung.

von Bruno I. (bjnas)


Angehängte Dateien:

Lesenswert?

Hier noch die Platine

von Michael H. (michael_h45)


Lesenswert?


von Bruno I. (bjnas)


Lesenswert?

Man, das ging ja fix. Da war ich wohl schlampig.

von eku (Gast)


Lesenswert?

Hallo Frank,

hast Du Pläne, IRMP_USE_AS_LIB bis zu ende zu implementieren. Im Moment 
ist das nur ein Feigenblatt :-) Ich habe zwar eine Einbindung in 
ethersex laufen, einen Bibliothek würde aber das ganze vereinfachen.

von Peter D. (pdiener) Benutzerseite


Lesenswert?

Hallo Frank,

ich teste IRMP gerade auf einem ATmega324P.
Dieser sollte in der irsndconfig noch eingetragen werden, da auch hier 
die Pins nicht stimmen:
1
#if defined (__AVR_ATmega32__) || defined (__AVR_ATmega644P__) || defined (__AVR_ATmega324P__)
2
// usw.

Vielen Dank für dieses schöne Projekt!!!

Grüße,

Peter

von eku (Gast)


Lesenswert?

Hallo Frank!

Mit dem Nubert-Protokoll gibt es Probleme. Die von IRSND gesendete 
Sequenz wird von IRMP falsch dekodiert. Welche der Komponenten nun den 
Fehler macht, kann ich allerdings nicht sagen. Hier ein Beispiel:

irmp send 13 9 9 0
OK
IRMP: proto NUBERT, address 0000, command 0009, flags 00
IRMP 13:0000:0009:00

irmp send 13 1 1 0
OK
IRMP: proto NUBERT, address 0000, command 0001, flags 00
IRMP 13:0000:0001:00

Zum Vergleich ein Denon-Code:

irmp send 8 1 2 0
OK
IRMP: proto DENON, address 0001, command 0002, flags 00
IRMP 08:0001:0002:00

von Uwe R. (Gast)


Lesenswert?

Pollin-IR-Tastatur FDC-3402: Mausknubbel enträtselt

IR-Daten:
1
8 Adress-Bits
2
8 Mouse-Bits (Bit0=lButtonDown, Bit1=rButtonDown, Bit3=IsMouse, Bit4=IsLeftMove, Bit5=IsDownMove)
3
4 RightMove-Bits
4
4 LeftMove-Bits (wenn IsMouse in Mouse-Bits gesetzt, sonst Press/Release)
5
4 UpMove-Bits   (wenn IsMouse in Mouse-Bits gesetzt, sonst Low-Nibble von Command
6
4 DownMove-Bits (wenn IsMouse in Mouse-Bits gesetzt, sonst High-Nibble von Command
7
8 Invertierte Command-Bits
Mit X=RightMove-LeftMove und Y=UpMove-DownMove
bekommt man dann Werte, mit denen man auch etwas anfangen kann.
Mehr dazu in den nächsten Tagen, bin noch am Testen.

Gruß
Uwe

von djmaster (Gast)


Lesenswert?

Hi, bin mal ganz neu hier. ;) Und habe leider ein Problem wo ich alleine 
absolut nicht mehr weiterkomme. Suche schon seit tagen.^^ Programmieren 
kann ich leider nicht wirklich, ich versuche mich mit gesunden 
Menschenverstand durch die Codes durch zu arbeiten. Beruf: 
Nachrichtentechniker, also eher der Funksektor.

Ich habe ein etherrape mit ethersex im Einsatz und ich versuche gerade 
irmp auf meinem atmega644 zu compilen. Leider kein gutes Ergebnis.
1
hardware/ir/irmp/irmp.c:114: Warnung: #pragma push_macro  wird ignoriert
2
hardware/ir/irmp/irmp.c:118: Warnung: #pragma push_macro  wird ignoriert
3
hardware/ir/irmp/irmp.c:133: Warnung: #pragma pop_macro  wird ignoriert
4
hardware/ir/irmp/irmp.c:134: Warnung: #pragma pop_macro  wird ignoriert
5
hardware/ir/irmp/irmp.c:328: Warnung: »TIMER0_COMP_vect« scheint ein falsch geschriebener Signal-Handler zu sein
6
hardware/ir/irmp/irmp.c: In Funktion »TIMER0_COMP_vect:

Nun hab ich gelesen das dieser Timer0 beim atmega644 TIMER0_COMPA_vect 
heißt.
Ich glaube zumindest das ich am Richtigen weg bin aber, ehrlich gesagt 
keine Ahnung, Habe nun in der irmp.c TIMER0_COMP_vect in 
TIMER0_COMPA_vect geändert aber Ergebnis bleibt das gleiche.. es folgt 
ein Fehler mit __vector_16.
Nun hab ich keine Ahnung mehr wie ich weitermachen soll. Deswegen hab 
ich mir eure Codes hier angesehen aber irgendwie werde ich da auch nicht 
Schlau daraus.

Gehalten hab ich mich an dieses hier: 
http://www.ethersex.de/index.php/IRMP
Meine irmp.c --> http://paste2.org/p/1050578

Vielleicht könnt ihr mir ja weiterhelfen hab schon soooo viel tolle 
Sachen hier erlesen ;)

Grüße aus Wien

von eku (Gast)


Lesenswert?

Hallo,

djmaster schrieb:
> Ich habe ein etherrape mit ethersex im Einsatz und ich versuche gerade
> irmp auf meinem atmega644 zu compilen. Leider kein gutes Ergebnis.

die Portierung nach ethersex ist von mir. Hilfe bekommst Du im IRC 
(Details siehe ethersex WIKI).

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Hi eku,

eku schrieb:
> hast Du Pläne, IRMP_USE_AS_LIB bis zu ende zu implementieren. Im Moment
> ist das nur ein Feigenblatt :-) Ich habe zwar eine Einbindung in
> ethersex laufen, einen Bibliothek würde aber das ganze vereinfachen.

Dieses define ist eher gedacht, irmp als sog. "Include-Lib" zu nutzen. 
Das heisst, man hat irgendwo in seinem Projekt sämtliche Defines, die 
normalerweise in irmpconfig.h stehen, in seinem project-irmp.c und macht 
anschließend einfach ein
1
#include "../irmp/irmp.c"

Ich benutze diese Methode selbst öfters, um bestimmte Sources, welche 
projektunabhängig sind, in mein konkretes Projekt einzubinden. Das hat 
zwar nichts mit "echten" Libs im C-Sinne zu tun, hat aber den Vorteil, 
dass nur das vom Code übernommmen/compiliert wird, was man gerade 
braucht - bei IRMP zum Beispiel nur den NEC-Decoder. Mein Projekt bleibt 
dann unabhängig von den Standard-Werten in irmpconfig.h. Das ist 
sinnvoll bei µCs, wo es auf jedes gesparte Byte ankommt. Hier wird also 
kein Object-File dazugelinkt, sondern der Source selbst mit ins Projekt 
eingebunden. Meinetwegen kannst Du das Includen von C-Files (xxx.c) als 
No-Go ansehen, für mich ist das aber eine durchaus anwendbare Methode.

Eine "klassische" Lib aus IRMP zu machen, die man dazubindet, halte ich 
für einen µC unpraktikabel, da ja dann schon bei Erstellung der Lib klar 
sein muss, welche IR-Decoder ich brauche. Es ist aber bei der 
universellen Konfigurierbarkeit von IRMP gar nicht möglich, dies vorab 
zu entscheiden.

Um auf Deine Frage zurückzukommen: das IRMP_USE_AS_LIB ist für mich kein 
Feigenblatt, sondern für mich soweit bereits anwendbar ;-)

Gruß,

Frank

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Hallo Peter,

Peter Diener schrieb:
> ich teste IRMP gerade auf einem ATmega324P.
> Dieser sollte in der irsndconfig noch eingetragen werden, da auch hier
> die Pins nicht stimmen:
>
1
> #if defined (__AVR_ATmega32__) || defined (__AVR_ATmega644P__) ||
2
> defined (__AVR_ATmega324P__)
3
> // usw.
4
>

Danke, habe ich so übernommen, kommt ins nächste Release.

> Vielen Dank für dieses schöne Projekt!!!

Danke fürs Danke :-)

Gruß,

Frank

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

eku schrieb:

> Mit dem Nubert-Protokoll gibt es Probleme. Die von IRSND gesendete
> Sequenz wird von IRMP falsch dekodiert. Welche der Komponenten nun den
> Fehler macht, kann ich allerdings nicht sagen. Hier ein Beispiel:
>
> irmp send 13 9 9 0
> OK
> IRMP: proto NUBERT, address 0000, command 0009, flags 00
> IRMP 13:0000:0009:00

Habe ich gerade versucht, nachzuvollziehen (unter Linux):

# ./irsnd 13 9 9 0 | ./irmp
0000001001 p = 13, a = 0x0000, c = 0x0009, f = 0x00

Stimmt, die dekodierte Adresse ist immer 0, aber das ist kein Wunder:

Nach

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

gibt es beim Nubert-Protokoll keine Adress-Bits, sondern nur 
Kommando-Bits. Daher ist das Verhalten von IRSND korrekt, es ignoriert 
nämlich Deine angegebene Adresse und IRMP zeigt immer 0 an.

Beachte auch meine Bemerkungen oberhalb der Tabelle im Artikel, Zitat:

| Bitte beachten: Je nach benutztem Protokoll sind die Bit-Breiten der
| Adressen bzw. Kommandos verschieden, siehe obige Tabelle [2].
| Man kann also nicht mit jedem IR-Protokoll komplett 16-Bit breite
| Adressen oder Kommandos transparent übertragen.

Gruß,

Frank

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Uwe R. schrieb:
> Pollin-IR-Tastatur FDC-3402: Mausknubbel enträtselt

Sehr interessant!

> Mehr dazu in den nächsten Tagen, bin noch am Testen.

Ich hoffe, da kommen noch weitere Infos zu.

Gruß,

Frank

von Simon K. (simon) Benutzerseite


Lesenswert?

Hat jemand die URC Zapper (gibts bei Reichelt günstig) mal ausprobiert?

http://www.reichelt.de/?ARTICLE=77492

Dort steht:

----
Geeignet für die Bedienung von infrarotgesteuerten Fernsehgeräten aller 
Marken.
----

Also nehme ich mal an, dass da auf jeden Fall mindestens irgendein 
Protokoll unterstützt wird, richtig?

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Simon K. schrieb:
> Also nehme ich mal an, dass da auf jeden Fall mindestens irgendein
> Protokoll unterstützt wird, richtig?

Davon gehe ich aus.

von eku (Gast)


Lesenswert?

Hallo Frank!

Nochmal zum Nubert Protokoll. IRMP dekodiert von der Original-FB 
Adressbits, die es laut Deines Artikels nich gibt. Erklär diesen 
Widerspruch doch bitte.

Mit dem Siemens-Protokoll habe ich das Problem, dass nicht alle von 
IRSND gesendeten Kommandos von der M740AV akzeptiert werden (im 
Gegensatz zur Original-FB). Die Dekodierung durch IRMP erscheint logisch 
(Anordnung der COdes auf der FB). Scheinbar ist das Timing kritisch beim 
Senden oder IRSND hat danoch einen Fehler. Anmerkung: IRMP dekodiert die 
durch IRSND gesendeten Kommandos fehlerfrei, nur eben der originale 
Empfänger nicht.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

eku schrieb:
> Hallo Frank!
>
> Nochmal zum Nubert Protokoll. IRMP dekodiert von der Original-FB
> Adressbits, die es laut Deines Artikels nich gibt. Erklär diesen
> Widerspruch doch bitte.

Du schriebst weiter oben:

irmp send 13 9 9 0
OK
IRMP: proto NUBERT, address 0000, command 0009, flags 00
IRMP 13:0000:0009:00

irmp send 13 1 1 0
OK
IRMP: proto NUBERT, address 0000, command 0001, flags 00
IRMP 13:0000:0001:00

Hier erkennt IRMP als Adresse den Wert 0. Wo ist da ein Widerspruch?
Bitte gib genauere Infos an, mit "Adressbits, die es laut Deines 
Artikels" kann ich nichts anfangen.

> Mit dem Siemens-Protokoll habe ich das Problem, dass nicht alle von
> IRSND gesendeten Kommandos von der M740AV akzeptiert werden (im
> Gegensatz zur Original-FB). Die Dekodierung durch IRMP erscheint logisch
> (Anordnung der COdes auf der FB). Scheinbar ist das Timing kritisch beim
> Senden oder IRSND hat danoch einen Fehler. Anmerkung: IRMP dekodiert die
> durch IRSND gesendeten Kommandos fehlerfrei, nur eben der originale
> Empfänger nicht.

Benutzt Du einen Quartz am µC zum Senden? IRMP ist beim Timing 
wesentlich toleranter als die Hersteller-Empfänger es sind. Daher kann 
IRMP da durchaus "besser" sein als die Hersteller selbst.

Gruß,

Frank

von eku (Gast)


Lesenswert?

Hallo Frank!

> Benutzt Du einen Quartz am µC zum Senden? IRMP ist beim Timing
> wesentlich toleranter als die Hersteller-Empfänger es sind. Daher kann
> IRMP da durchaus "besser" sein als die Hersteller selbst.

Ich verwende einen m168 mit 16MHz quarzgetaktet. Laut Protkoldetails im 
IRMP-Artikel setzen sich die Daten aus

13 Adress-Bits + 1 Repeat-Bit + 7 Daten-Bits + 1 unbekanntes Bit

zusammen. Könnte es sein, dass es sich bei dem "unbekannten Bit" um die 
Parität handelt? Das würde zumindest erklären, warum nur die von IRSND 
gesendeten Zeichen vom M740AV erkannt werden, bei denen zufällig die 
Parität stimmt. Wie müsste man IRSND ändern, um diese These zu 
verifizieren?


Gruß, eku

von Simon B. (nomis)


Lesenswert?

Haben wir eigentlich eine Vorstellung davon, welche Adressen- und 
Datenwerte eigentlich generell so verwendet werden?

Hintergrund ist, dass ich gerade an einem USB-Empfänger bastele, der ein 
konfigurierbares HID-Keyboard darstellen soll. Wenn ich beliebige 
Fernbedienungen zulassen möchte, habe ich eine Lookup-Tabelle für die 
Keycodes, die 5-Byte-Keys (Protokoll + 16-bit Adresse + 16-bit Kommando) 
auf 1-2 Bytes Keycode abbildet.

Bei einem 512-Byte-EEprom kriege ich also etwa 70-80 Zuordnungen unter, 
was vielleicht reicht, sich aber trotzdem wie Verschwendung anfühlt.

Es wäre also nett, z.B. sagen zu können "das MSB von dem Kommando 
braucht man eh nie" oder "das Protokoll kann man in die Adresse mit 
reinverodern" und trotzdem noch eine gute Erkennung von beliebigen 
Fernbedienungen zu haben.

Leider habe ich keine klare Vorstellung davon, was die häufigste 
Verwendung von Address- und Kommandonummern ist, und welche 
"Zusammenfassung" erfolgversprechend wäre. Habt ihr da Ideen?

Viele Grüße,
        Simon

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

eku schrieb:

> 13 Adress-Bits + 1 Repeat-Bit + 7 Daten-Bits + 1 unbekanntes Bit
>
> zusammen. Könnte es sein, dass es sich bei dem "unbekannten Bit" um die
> Parität handelt?

Das kann durchaus sein. Ich habe mir gerade nochmal die Scans von der 
M740AV angeschaut. Dabei haben ca. 50% der Frames als letztes Bit den 
Wert 0, die anderen haben als letztes Bit den Wert 1.

> Das würde zumindest erklären, warum nur die von IRSND
> gesendeten Zeichen vom M740AV erkannt werden, bei denen zufällig die
> Parität stimmt.

Ja, sehr gut erkannt!

> Wie müsste man IRSND ändern, um diese These zu verifizieren?

Füge die mit +++ gekennzeichneten Zeilen in irsnd.c ein:
1
#if IRSND_SUPPORT_SIEMENS_PROTOCOL == 1
2
        case IRMP_SIEMENS_PROTOCOL:
3
        {
4
            irsnd_buffer[0] = ((irmp_data_p->address & 0x0FFF) >> 5);                                           // SAAAAAAA
5
            irsnd_buffer[1] = ((irmp_data_p->address & 0x1F) << 3) | ((irmp_data_p->command & 0x7F) >> 5);      // AAAAA0CC
6
            irsnd_buffer[2] = (irmp_data_p->command << 3);                                                      // CCCCC0
7
8
            if ((irmp_data_p->command % 2) == 0)         // +++
9
            {                                            // +++
10
                irsnd_buffer[2] |= 0x04;                 // +++
11
            }                                            // +++
12
            irsnd_busy      = TRUE;
13
            break;
14
        }
15
#endif

Hier wird nun zusätzlich geprüft, ob das Kommando gerade oder ungerade 
ist. Zumindest für die M740AV scheint das zu stimmen, wenn ich das 
letzte Bit betrachte. Aber es könnte auch sein, dass beim 
Siemens-Protokoll im letzten Bit tatsächlich die Parität von Adresse + 
Kommando herangezogen wird. Um das zu beurteilen, bräuchte ich den Scan 
von einer anderen Siemens-FB, welche eine andere Adresse verwendet.

Kannst Du mal testen, ob es nun stimmt?

[/c]

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Simon Budig schrieb:

> Es wäre also nett, z.B. sagen zu können "das MSB von dem Kommando
> braucht man eh nie" oder "das Protokoll kann man in die Adresse mit
> reinverodern" und trotzdem noch eine gute Erkennung von beliebigen
> Fernbedienungen zu haben.

Das kann man leider überhaupt nicht sagen, wie man die Daten da noch 
weiter "komprimieren" kann. Du kannst Dir ja mal selbst ein Bild machen 
mit

  ./irmp <IR-Data/xxxx.txt

bzw.

  irmp.exe <IR-Data/xxxx.txt

was da alles so vorkommen kann. Beim Kaseikyo-Protokoll fehlen mir sogar 
noch 2 Bits, die ich in irmp_data.command gar nicht unterbringen kann. 
Glücklicherweise haben diese bei den bisherigen FB-Scans, die mir 
zugesandt wurden, keine relevanten Daten (immer "00").

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Frank M. schrieb:
> Hier wird nun zusätzlich geprüft, ob das Kommando gerade oder ungerade
> ist. Zumindest für die M740AV scheint das zu stimmen, wenn ich das
> letzte Bit betrachte.

Das letzte Bit ist eigentlich kein Paritätsbit, sondern einfach die 
Invertierung des davor zuletzt gesandten Bits, welches das 
niederwertigste Bit des Kommandocodes ist.

Daher ist die folgende Schreibweise als Codekorrektur von IRSND 
plausibler (führt aber zu demselben Ergebnis):
1
#if IRSND_SUPPORT_SIEMENS_PROTOCOL == 1
2
        case IRMP_SIEMENS_PROTOCOL:
3
        {
4
            irsnd_buffer[0] = ((irmp_data_p->address & 0x0FFF) >> 5);                                           // SAAAAAAA
5
            irsnd_buffer[1] = ((irmp_data_p->address & 0x1F) << 3) | ((irmp_data_p->command & 0x7F) >> 5);      // AAAAA0CC
6
            irsnd_buffer[2] = (irmp_data_p->command << 3);                                                      // CCCCC?
7
8
            if (!(irmp_data_p->command & 0x01))   // +++
9
            {                                     // +++
10
                irsnd_buffer[2] |= 0x04;          // +++  // 00000c
11
            }                                     // +++
12
            irsnd_busy      = TRUE;
13
            break;
14
        }
15
#endif

Im IRMP-Artikel habe ich nun folgendes zum SIEMENS-Prtokoll angemerkt:

13 Adress-Bits + 1 Repeat-Bit + 7 Daten-Bits + 1 invertiertes Bit 
(letztes Bit davor nochmal invertiert)

Gruß,

Frank

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Noch kürzer:

Alt:
1
  irsnd_buffer[2] = (irmp_data_p->command << 3);                                                      // CCCCC?

Neu:
1
  irsnd_buffer[2] = (irmp_data_p->command << 3) | ((~irmp_data_p->command & 0x01) << 2);              // CCCCCc

Dann kann der ganze nachfolgende if-Block entfallen. Ich habe das so nun 
im IRSND übernommen. Kommt ins nächste Release.

von Simon K. (simon) Benutzerseite


Lesenswert?

Hast du mal ausprobiert, was weniger Code verbraucht? Ich vermute fast, 
dass die if-Anweisung effizienter ist.

von eku (Gast)


Lesenswert?

Hallo Frank,

Frank M. schrieb:
> Frank M. schrieb:
>> Hier wird nun zusätzlich geprüft, ob das Kommando gerade oder ungerade
>> ist. Zumindest für die M740AV scheint das zu stimmen, wenn ich das
>> letzte Bit betrachte.
>
> Das letzte Bit ist eigentlich kein Paritätsbit, sondern einfach die
> Invertierung des davor zuletzt gesandten Bits, welches das
> niederwertigste Bit des Kommandocodes ist.

das war es nicht. Versuche es nun mit der Parität, d.h. die Einsen 
zählen ( (parity_even_bit aus der avrlibc). Allerdings muss ich noch 
testen, ob die Parität auch über die Adresse gebildet wird.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

eku schrieb:
>> Das letzte Bit ist eigentlich kein Paritätsbit, sondern einfach die
>> Invertierung des davor zuletzt gesandten Bits, welches das
>> niederwertigste Bit des Kommandocodes ist.
>
> das war es nicht. Versuche es nun mit der Parität, d.h. die Einsen
> zählen ( (parity_even_bit aus der avrlibc). Allerdings muss ich noch
> testen, ob die Parität auch über die Adresse gebildet wird.

Komisch, schau Dir mal diesen Output an:
1
 ./irmp-15kHz <IR-Data/Siemens-Gigaset-M740AV-15kHz.txt
2
-------------------------------------------------------------------
3
# Power
4
00011011000100000010110 p = 17, a = 0x06c4, c = 0x000b, f = 0x00
5
-------------------------------------------------------------------
6
# 1
7
00011011000100000000010 p = 17, a = 0x06c4, c = 0x0001, f = 0x00
8
-------------------------------------------------------------------
9
#2
10
00011011000100000000101 p = 17, a = 0x06c4, c = 0x0002, f = 0x00
11
-------------------------------------------------------------------
12
# 3
13
00011011000100000000110 p = 17, a = 0x06c4, c = 0x0003, f = 0x00
14
-------------------------------------------------------------------
15
# 4
16
00011011000100000001001 p = 17, a = 0x06c4, c = 0x0004, f = 0x00
17
-------------------------------------------------------------------
18
# 5
19
00011011000100000001010 p = 17, a = 0x06c4, c = 0x0005, f = 0x00
20
-------------------------------------------------------------------
21
# 6
22
00011011000100000001101 p = 17, a = 0x06c4, c = 0x0006, f = 0x00
23
-------------------------------------------------------------------
24
# 7
25
00011011000100000001110 p = 17, a = 0x06c4, c = 0x0007, f = 0x00
26
-------------------------------------------------------------------
27
# 8
28
00011011000100000010001 p = 17, a = 0x06c4, c = 0x0008, f = 0x00
29
-------------------------------------------------------------------
30
# 9
31
00011011000100000010010 p = 17, a = 0x06c4, c = 0x0009, f = 0x00
32
-------------------------------------------------------------------
33
# 0
34
00011011000100000010101 p = 17, a = 0x06c4, c = 0x000a, f = 0x00
35
-------------------------------------------------------------------
36
# HELP
37
00011011000100000100110 p = 17, a = 0x06c4, c = 0x0013, f = 0x00
38
-------------------------------------------------------------------
39
# Hoch
40
00011011000100000101101 p = 17, a = 0x06c4, c = 0x0016, f = 0x00
41
-------------------------------------------------------------------
42
# Links
43
00011011000100000011001 p = 17, a = 0x06c4, c = 0x000c, f = 0x00
44
-------------------------------------------------------------------
45
# OK
46
00011011000100000011101 p = 17, a = 0x06c4, c = 0x000e, f = 0x00
47
-------------------------------------------------------------------
48
# Rechts
49
00011011000100000011110 p = 17, a = 0x06c4, c = 0x000f, f = 0x00
50
-------------------------------------------------------------------
51
# Runter
52
00011011000100000100001 p = 17, a = 0x06c4, c = 0x0010, f = 0x00
53
-------------------------------------------------------------------
54
# EXIT
55
00011011000100000011010 p = 17, a = 0x06c4, c = 0x000d, f = 0x00
56
-------------------------------------------------------------------
57
# Mute
58
00011011000100000101110 p = 17, a = 0x06c4, c = 0x0017, f = 0x00
59
-------------------------------------------------------------------
60
# Menu
61
00011011000100000110010 p = 17, a = 0x06c4, c = 0x0019, f = 0x00
62
-------------------------------------------------------------------
63
# EPG
64
00011011000100000110110 p = 17, a = 0x06c4, c = 0x001b, f = 0x00
65
-------------------------------------------------------------------
66
# INFO
67
00011011000100000111001 p = 17, a = 0x06c4, c = 0x001c, f = 0x00
68
-------------------------------------------------------------------
69
# REW
70
00011011000100000111010 p = 17, a = 0x06c4, c = 0x001d, f = 0x00
71
-------------------------------------------------------------------
72
# STOP
73
00011011000100000111101 p = 17, a = 0x06c4, c = 0x001e, f = 0x00
74
-------------------------------------------------------------------
75
# FF
76
00011011000100000111110 p = 17, a = 0x06c4, c = 0x001f, f = 0x00
77
-------------------------------------------------------------------
78
# Rot
79
00011011000100001000001 p = 17, a = 0x06c4, c = 0x0020, f = 0x00
80
-------------------------------------------------------------------
81
# Gruen
82
00011011000100001000010 p = 17, a = 0x06c4, c = 0x0021, f = 0x00
83
-------------------------------------------------------------------
84
# Gelb
85
00011011000100001000101 p = 17, a = 0x06c4, c = 0x0022, f = 0x00
86
-------------------------------------------------------------------
87
# Blau
88
00011011000100001000110 p = 17, a = 0x06c4, c = 0x0023, f = 0x00

Hier ist das letzte Bit immer das invertierte des vorletzten. Oder ist 
da noch ein Bug in der Manchester-Codierung des IRMP? Glaube ich 
eigentlich nicht, denn RS5 und RC6 funktionieren ja....

Kannst Du mal sagen, welche Kommando-Codes gerade nicht akzeptiert 
werden?

Gruß,

Frank

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Simon K. schrieb:
> Hast du mal ausprobiert, was weniger Code verbraucht? Ich vermute fast,
> dass die if-Anweisung effizienter ist.

Beide Varianten führen beim ATmega88 zu dem Codezuwachs von je 16 Bytes 
- es kommt also exakt auf dasselbe raus.

von eku (Gast)


Lesenswert?

Hallo Frank,

> Kannst Du mal sagen, welche Kommando-Codes gerade nicht akzeptiert werden?

war mein Fehler. In der Scandatei Siemens-Gigaset-M740AV-15kHz.txt sind 
einige Tasten falsch beschriftet. Werde bei Gelegenheit mal eine neue 
aufzeichnen. In http://www.m740.de/wiki/Lircd wird das besagte Bit dem 
Kommando zugeordnet. Geschmackssache. Bitte aktualisiere IRSND im SVN 
mit Deinem Fix.

Bei Dekodieren mit IRMP gibt es Interferenzen mit anderen Dekodern. Ich 
habe nur noch nicht rausbekommen mit welchem. Siemens alleine dekodiert 
meist zuverlässig. Alle Dekoder aktiviert und die Dekodierung gerät zum 
Glückspiel.
Siehst Du eine Möglichkeit, die Anzahl der zu testenden Kombinationen 
von vorn herein einzuschränken?

Gruß, eku

von eku (Gast)


Lesenswert?

Hallo Frank,

> In http://www.m740.de/wiki/Lircd wird das besagte Bit dem
> Kommando zugeordnet. Geschmackssache. Bitte aktualisiere IRSND im SVN
> mit Deinem Fix.

mittlerweile bin ich der Überzeugung, dass entweder dieses Bit den Daten 
zugeschlagen wird oder aber IRMP dessen Gültigkeit, nach der von Dir 
aufgestellten Regel, prüft. Ich persönlich plädiere für 1.


Gruß, Erik

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

eku schrieb:

> mittlerweile bin ich der Überzeugung, dass entweder dieses Bit den Daten
> zugeschlagen wird oder aber IRMP dessen Gültigkeit, nach der von Dir
> aufgestellten Regel, prüft. Ich persönlich plädiere für 1.

Mir gefällt es eigentlich nicht, wenn es dem Kommando zugeschlagen wird.

Gründe:

1. Das Prüfbit gehört offensichtlich nicht zum Kommando

2. Es stört mein Symmetrie-Empfinden (die Kommando-Codes sind nicht
   mehr fortlaufend)

3. Die LIRCS-Leute haben sich das Leben da sehr einfach gemacht ;-)

Dass IRMP konsequenterweise das letzte Bit prüfen soll, halte ich für 
sinnvoller. Denn genau dafür ist das letzte Bit offenbar da: zur 
Prüfung. Genau das macht IRMP auch teilweise bei anderen Protokollen, 
z.B. NEC, wo sämtliche invertierten Kommandobits gegengecheckt werden.

Wenn ich das Prüfbit dem Kommando zuschlage, dann hat das folgende 
Nachteile:

1. Prüfung auf Gültigkeit nicht mehr sinnvoll
2. Es können irreguläre Codes sowohl empfangen als auch gesendet werden

Daher plädiere ich für 2 ;-)

Ich habe bereits den Check des Prüfbits auf meiner TODO-Liste.

Gruß,

Frank

von eku (Gast)


Lesenswert?

Hallo Frank,

danke für das Update im SVN. Funktioniert soweit, aqllerdings ist das 
Timing bei IRSND kritisch denn die M740AV reagiert nicht zuverlässig. 
Könnten die 200usec Bitlänge falsch sein?

Und noch ein Problem: Ist nur Nokia und nicht Grundig aktiv (die 
Protokolle teilen sich die Timings) wird trotzdem Grundig detektiert. Da 
ist die Logik "Grundig annehmen und später auf Nokia umschalten" falsch. 
Würdest Du das bitte korrigieren.


Gruß, eku

von Frank M. (ukw) (Moderator) Benutzerseite


Angehängte Dateien:

Lesenswert?

eku schrieb:

> danke für das Update im SVN. Funktioniert soweit, aqllerdings ist das
> Timing bei IRSND kritisch denn die M740AV reagiert nicht zuverlässig.
> Könnten die 200usec Bitlänge falsch sein?

Schau Dir bitte die Text-Datei im Anhang an (im Notepad Zeilenumbruch 
aktivieren).

Die erste Zeile enthält Deinen Scan von der Taste "Rechts", die Zeile 
darunter enthält den von IRSND generierten Frame.

Die Zeilen sind fast identisch. An IRSND kann es also nicht liegen, es 
reproduziert das Telegramm perfekt - sogar besser als das Original ;-)
Vielleicht ist Dein damaliger Scan nicht genau genug? Oder stimmt 
vielleicht die Modulationsfrequenz nicht?

Du kannst ja mal die Parameter variieren, vielleicht kannst du das 
Resultat somit optimieren?

> Und noch ein Problem: Ist nur Nokia und nicht Grundig aktiv (die
> Protokolle teilen sich die Timings) wird trotzdem Grundig detektiert.

Habe ich gerade versucht zu reproduzieren: bei mir wird Nokia (protocol 
= 16) erkannt. Nokia und Grundig werden auch im Source absolut 
gleichberechtigt behandelt. Ich sehe da keine Stelle im Code, wo Dein 
beschriebenes Verhalten greifen sollte.

> Da ist die Logik "Grundig annehmen und später auf Nokia umschalten"
> falsch.

Kann ich leider nicht reproduzieren.

Gruß,

Frank

von Müller (Gast)


Lesenswert?

Guten Tag

finde dein Projeckt so weit sehr gut.
Habe da mal ne Frage an euch. Wann wird RC6 in IRSEND eingebaut.

Da ich zum größten teil  meiner Fernbedinungen RC6 sind


mfg

Müller

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Müller schrieb:

> Habe da mal ne Frage an euch. Wann wird RC6 in IRSEND eingebaut.

Einen Prototypen für RC6 habe ich laufen, bei RC6A (FBs von Kathrein & 
Co) habe ich noch ein Problem, da weiss ich leider noch nicht, ob ich 
den Fehler im IRSND oder vielleicht sogar im IRMP habe, da ich den IRSND 
immer mit dem IRMP selbst testen muss.

Ich versuche mal, das Problem in den Griff zu bekommen, dann würde ich 
hier im Laufe der Woche eine Testversion reinstellen, damit Du das 
testen kannst ;-)

Gruß,

Frank

von Müller (Gast)


Lesenswert?

Hallo Frank

Ich danke dir schon mal im voraus. dann bin ich mal gespannt und fiel 
glück das du es hin bekommts

mfg

Müller

von Frank M. (ukw) (Moderator) Benutzerseite


Angehängte Dateien:

Lesenswert?

Anbei eine Testversion von IRSND, welche auch das RC6- und 
RC6A-Protokoll (Protokollnummern 9 u. 21) unterstützt. Im Zip-Archiv 
sind nur die gegenüber der Download-Version geänderten Dateien.

Hier ist auch noch eine Korrektur für IRMP drin, nämlich für das 
RC6A-Protokoll. Hier hatte bisher IRMP immer automatisch das 
höchstwertige Adressbit gesetzt, wenn es sich um RC6A handelte. Das ist 
nun nicht mehr der Fall. Bei der Kathrein-FB wurde bisher als Adresse 
0x8046 ausgegeben, nun ist es 0x0046.

Wäre Klasse, wenn jemand IRSND bzgl. RC6 und RC6 testen könnte. Dieses 
Manchester-Protokoll mit wechselnden Periodenzeiten (im T-Bit) raubt mir 
mal wieder den letzten Nerv...

Gruß,

Frank

von Müller (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Frank

Habe deine neune Datein bei mir ins Projeckt übernommen
nun habe ich ein Problem mein IR-Empfanger geht nicht mehr hast du was 
am eingang geändert ?

Hier ist mein codes

im IRBORD ist das halt mit den normalen programm
im IRBORD2 ist das mit den neune Programmcode von dir


kannst du mal nachschauen ob ich was falsch gemacht habe

von eku (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Frank,

habe hier Probleme mit einem Sharp TV. IRMP meint, dass es sich um 
Denon-Protkoll handelt, der TV reagiert aber nicht auf die von IRSND 
gesendeten Sequenzen.

Was mich an Denon zweifeln lässt, ist die Tatsache, dass IRMP bei 
einigen Tasten einen völlig andere Geräteadresse dekodiert (z.B. MENU).

Anbei ein Scan der wichtigsten Tasten bei 15kHz.

Gruß, eku

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

eku schrieb:
> habe hier Probleme mit einem Sharp TV. IRMP meint, dass es sich um
> Denon-Protkoll handelt, der TV reagiert aber nicht auf die von IRSND
> gesendeten Sequenzen.

Ja, das sieht sehr nach DENON aus, auch die invertierten 
Frame-Wiederholungen sind drin. Allerdings sind viele Scans 
offensichtlich kaputt, da kommen dann sehr oft lange "Dunkelphasen" 
innerhalb der Frames.

Das kann zweierlei Gründe haben:

1. FB war zu weit weg vom IR-Empfänger
2. Modulationsfrequenz der FB passt schlecht zum TSOP.

Denon benutzt da ja 32kHz, das ist schon eine Ecke weg vom TSOP1736 oder 
gar TSOP1738...

> Was mich an Denon zweifeln lässt, ist die Tatsache, dass IRMP bei
> einigen Tasten einen völlig andere Geräteadresse dekodiert (z.B. MENU).

Das findet man öfter bei einigen FBs, da werden dann geräteübergreifende 
Adressen benutzt. Das können zum Beispiel Fernseher sein, die Funktionen 
einzelner Produkte desselben Herstellers in einem Gerät vereinen, z.B. 
Festplatten-Recorder im TV, irgendwelche Spezial-Tuner, Timer oder 
sonstwas...

> Anbei ein Scan der wichtigsten Tasten bei 15kHz.

Das ist eindeutig Denon-Code. Allerdings ist die Aufzeichnungsqualität 
sehr schlecht.

Reagiert das TV auf keines der ausgesandten Kommandos? Vielleicht 
benutzt der Sharp zwar das Denon-Protokoll, aber eine andere 
Modulationsfrequenz? Hast Du ein Oszilloskop, um Dir das näher 
anzuschauen?

Gruß,

Frank

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Müller schrieb:
> Habe deine neune Datein bei mir ins Projeckt übernommen
> nun habe ich ein Problem mein IR-Empfanger geht nicht mehr hast du was
> am eingang geändert ?

Nein, aber Du scheinst den neuen Code nicht an Deine Hardware angepasst 
zu haben:

irmpconfig.h:
1
< #define IRMP_PORT                               PORTC
2
< #define IRMP_DDR                                DDRC
3
< #define IRMP_PIN                                PINC
4
< #define IRMP_BIT                                0       // use PB6 as IR input on AVR
5
---
6
> #define IRMP_PORT                               PORTB
7
> #define IRMP_DDR                                DDRB
8
> #define IRMP_PIN                                PINB
9
> #define IRMP_BIT                                6       // use PB6 as IR input on AVR


irsndconfig.h
1
< #define IRSND_PORT                              PORTB   // port D
2
< #define IRSND_DDR                               DDRB    // ddr D
3
< #define IRSND_BIT                               3       // OC2A
4
---
5
> #define IRSND_PORT                              PORTD   // port D
6
> #define IRSND_DDR                               DDRD    // ddr D
7
> #define IRSND_BIT                               7       // OC2A

Damals hattest Du es wohl angepasst (siehe obige Unterschiede), dieses 
Mal hast Du das offenbar versäumt.

Gruß,

Frank

von eku (Gast)


Lesenswert?

Frank M. schrieb:
> eku schrieb:
>> habe hier Probleme mit einem Sharp TV. IRMP meint, dass es sich um
>> Denon-Protkoll handelt, der TV reagiert aber nicht auf die von IRSND
>> gesendeten Sequenzen.
>
> Ja, das sieht sehr nach DENON aus, auch die invertierten
> Frame-Wiederholungen sind drin. Allerdings sind viele Scans
> offensichtlich kaputt, da kommen dann sehr oft lange "Dunkelphasen"
> innerhalb der Frames.
>
> Das kann zweierlei Gründe haben:
>
> 1. FB war zu weit weg vom IR-Empfänger

War sie nicht.

> 2. Modulationsfrequenz der FB passt schlecht zum TSOP.

Schon möglich.

> Denon benutzt da ja 32kHz, das ist schon eine Ecke weg vom TSOP1736 oder
> gar TSOP1738...

Mit der selben Hardware kann ich eine originale Denon-FB problemlos 
einlesen und auch die Geräte mit IRSND bedienen. Null Probleme.

> Reagiert das TV auf keines der ausgesandten Kommandos? Vielleicht
> benutzt der Sharp zwar das Denon-Protokoll, aber eine andere
> Modulationsfrequenz? Hast Du ein Oszilloskop, um Dir das näher
> anzuschauen?

Auf keines der ausgesandten Kommandos reagiert der TV. Zugriff auf einen 
Oszi habe ich nicht.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

eku schrieb:

>> 2. Modulationsfrequenz der FB passt schlecht zum TSOP.
> Schon möglich.

Welchen IR-Empfänger benutzt Du denn?

Wenn man sich die Scans mit einem Text-Editor anschaut (einer, der auch 
mit langen Zeilen bestens zurechtkommt, also nicht Notepad o.ä.), sieht 
man sehr schön, dass es immer wieder "Aussetzer" gibt, d.h. dass 
IR-Impulse dort, wo sie eigentlich sein sollten, komplett fehlen. Das 
Timing von der FB ist ungeheuer exakt, selbst nach über 2300 Scanpunkten 
passen die empfangenen Impulse noch ziemlich genau übereinander.

Eigentlich werden nur die ersten beiden Tasten (power + radio) Deines 
Scans von IRMP "verstanden", alles andere wird als fehlerhaft verworfen 
- was man auch nachvollziehen kann, wenn man mit dem Editor reinschaut.

Hast Du denn beim IRMP auch derart schlechte Ergebnisse bei der 
Sharp-FB? Oder war das einfach nur ein "Montags-Scan"? Kannst Du den 
Scan wiederholen, damit man eine Aussage über die Qualität der 
Reproduzierung machen kann?

> Mit der selben Hardware kann ich eine originale Denon-FB problemlos
> einlesen und auch die Geräte mit IRSND bedienen. Null Probleme.

Sehr schön :)

> Auf keines der ausgesandten Kommandos reagiert der TV.

Das Timing der Sharp-FB ist zwar exakt, jedoch ermittelt IRMP leicht vom 
DENON-Protokoll abweichende Timingwerte, die aber alle noch in der 
IRMP-Toleranz liegen, für das Sharp-TV aber vielleicht schon zu stark 
abweichen.

Ersetze mal in irmp.h folgende Zeilen
1
#define DENON_PULSE_TIME                        275.0e-6                        //  275 usec pulse
2
#define DENON_1_PAUSE_TIME                      1900.0e-6                       // 1900 usec pause

durch
1
#define DENON_PULSE_TIME                        300.0e-6                        //  300 usec pulse
2
#define DENON_1_PAUSE_TIME                      1800.0e-6                       // 1800 usec pause

und teste IRSND erneut.

> Zugriff auf einen Oszi habe ich nicht.

Das ist schade.

Gruß,

Frank

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

eku schrieb:
> Auf keines der ausgesandten Kommandos reagiert der TV.

Habe da noch eine Idee:

Die Sharp-FB sendet offenbar 3 Frames pro Tastendruck - und nicht nur 
zwei, wie es bei DENON wohl sonst üblich ist. IRSND sendet jedenfalls 
nur zwei Frames, nämlich:

1. Frame: Adresse + Kommando
2. Frame: Adresse + invertiertes Kommando

Die Sharp FB sendet:

1. Frame: Adresse + Kommando
2. Frame: Adresse + invertiertes Kommando
3. Frame: Adresse + Kommando

Dieses Verhalten könnte man mit dem IRSND simulieren, indem man 
irmp_data.flags = 1 setzt, dann wiederholt IRSND nämlich die beiden 
obigen Frames und es käme raus:

1. Frame: Adresse + Kommando
2. Frame: Adresse + invertiertes Kommando
3. Frame: Adresse + Kommando
4. Frame: Adresse + invertiertes Kommando

Das ist zwar dann ein Frame zuviel (der letzte), aber wenn Du Glück 
hast, ist das Sharp-TV nach dem 3. Frame zufrieden und führt das 
Kommando aus.

Gruß,

Frank

von eku (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Frank,

danke für deine Analyse. Der TV lässt sich weder von den geänderten 
Timings noch von der Framewiederholung beindrucken :-(

Anbei ein erneuter Scan, diesmal beo 10KkHz. Auf der FB steht ga323wjsa. 
Man kann sie an allen Ecken des Internets kaufen, aber das Protkoll wird 
nicht beschrieben.

Gruß,
eku

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Hi eku,

eku schrieb:

> danke für deine Analyse. Der TV lässt sich weder von den geänderten
> Timings noch von der Framewiederholung beindrucken :-(

Hm, erstmal habe ich jetzt keine Idee mehr, muss ich nochmal drüber 
nachdenken.

> Anbei ein erneuter Scan, diesmal beo 10KkHz.

Dieses Mal ist der Scan perfekt und läuft ohne Fehler durch den IRMP 
durch.

Hier eine Beispiel-Ausgabe, wo man sehr gut sieht, dass es 3 Frames 
sind.
1
# ./irmp < sharp.log
2
-------------------------------------------------------------------
3
# power
4
100000110100010
5
100001001011101 p =  8, a = 0x0010, c = 0x01a2, f = 0x00
6
100000110100010
7
-------------------------------------------------------------------
8
...

IRMP detektiert also nach dem 2. Frame (in welchem die Kommando-Bits 
negiert sind) bereits die Daten. Es folgt aber nochmal der 
Original-Frame. So geht das bei allen Tasten im Scan.

In meinen Augen kann das eigentlich nur daran liegen. Vielleicht baue 
ich dieses 3-Frame-Telegramm mal als Besonderheit in den IRMP ein - 
vielleicht hilft das weiter. Dabei würde ich dann auch die Pausen 
zwischen dem 2. und dem 3. Frame mal genau umsetzen - nicht mit dem 
Trick der Wiederholung.

Gruß,

Frank

von eku (Gast)


Lesenswert?

Hallo Frank,

passt die Beschreibung von 
http://www.sbprojects.com/knowledge/ir/sharp.htm auf meinen Scan? Ist es 
am Ende doch ein eigenständiges Protokoll und nur ähnlich dem Denon?

von eku (Gast)


Lesenswert?

Hallo Frank,

noch eine Quelle: S.15 in 
http://tinkerish.com/docs/ir%20remote%20control%20details.pdf

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

eku schrieb:
> passt die Beschreibung von
> http://www.sbprojects.com/knowledge/ir/sharp.htm auf meinen Scan? Ist es
> am Ende doch ein eigenständiges Protokoll und nur ähnlich dem Denon?

Diese Beschreibung ist tatsächlich sehr ähnlich zum Denon-Protokoll. Im 
obigen Link wird von

  0 Start-Bits
  5 Adress-Bits
  8 Daten-Bits
  1 Expansion-Bit - immer 1
  0 Check-Bit - immer 0

gesprochen. Das macht zusammen 15 Bits.

Das Denon-Protokoll setzt sich zusammen aus:

  0 Start-Bits
  5 Adress-Bits
 10 Daten-Bits

macht also zusammen auch 15 Bits.

Tatsächlich sind die beiden letzten Bits auch "10" in deinen Scans, das 
passt also auf die Beschreibung des Expansion- und Check-Bits.

Die Timings sind auch sehr ähnlich:

          Denon       Sharp
Pulse     275µs       320µs
Pause 0   775µs       680µs
Pause 1  1900µs       1680µs

Tatsächlich sind diese Timings innerhalb der IRMP-Toleranzen identisch, 
IRMP kann diese also gar nicht auseinanderhalten. Es passt alles: Anzahl 
der Bits und die Timings.

Wenn ich mir die Timings innerhalb Deines Scans anschaue, so liegen sie 
ziemlich zwischen den obigen Werten, ich kann also auch nicht genau 
sagen, ob es eher Denon- oder Sharp-Timings sind.

Aber was gar nicht passt, ist die Modulationsfrequenz, bei Denon ist sie 
32 kHz, bei Sharp ist sie 38 kHz.

Ändere also bitte folgendes zum Testen des IRSND:

1. Modulationsfrequenz von 32 kHz auf 38 kHz:

Alt:
1
   case IRMP_DENON_PROTOCOL:
2
   {
3
       ...
4
       irsnd_set_freq (IRSND_FREQ_32_KHZ);

Neu:
1
   case IRMP_DENON_PROTOCOL:
2
   {
3
       ...
4
       irsnd_set_freq (IRSND_FREQ_38_KHZ);

2. Timings in irmp.h:
1
#define DENON_PULSE_TIME                        320.0e-6                        //  320 usec pulse
2
#define DENON_1_PAUSE_TIME                      1680.0e-6                       // 1680 usec pause
3
#define DENON_0_PAUSE_TIME                       680.0e-6                       //   680 usec pause
4
#define DENON_FRAMES                            2                               // DENON sends each frame 2 times

Probiere das einmal mit irmp_data.flags = 0 und dann, wenn das nichts 
hilft, mit irmp_data.flags = 1.

Gruß,

Frank

von eku (Gast)


Lesenswert?

Hallo Frank,

Frank M. schrieb:
> Ändere also bitte folgendes zum Testen des IRSND:

funktioniert. Es bedarf noch nicht einmal der Framewiederholung.

Die Erweiterung von IRSND stellt sicher kein Problem dar. Wie IRMP Sharp 
von Dennon unterscheiden kann, ist, sieht man mal von den Timings ab, 
unklar. Vielleicht kann IRMP es am Expansion- und Check-Bit oder den 
40ms zwischen ersten und zweitem Frame identifizieren. Du kennst Deinen 
Code besser und findest bestimmt einen Weg.

Gruß, eku

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Hi eku,

eku schrieb:

> funktioniert. Es bedarf noch nicht einmal der Framewiederholung.

Reicht vielleicht die Änderung der Modulationsfrequenz unter Einhaltung 
der Original-Denon-Timings? Wäre klasse, wenn Du das noch separat testen 
würdest.

> Die Erweiterung von IRSND stellt sicher kein Problem dar. Wie IRMP Sharp
> von Dennon unterscheiden kann, ist, sieht man mal von den Timings ab,
> unklar. Vielleicht kann IRMP es am Expansion- und Check-Bit oder den
> 40ms zwischen ersten und zweitem Frame identifizieren. Du kennst Deinen
> Code besser und findest bestimmt einen Weg.

Ja, ich werde da nochmal die genauen Unterschiede untersuchen. Mit 
Codekenntnis hat das weniger zu tun, eher mit meinen (bescheidenen) 
Protokollkenntnissen ;-)

Das Expansion- und Check-Bit sind leider nur ein notwendiges, aber kein 
hinreichendes Kriterium für Sharp. Die "10"-Kombi kann durchaus auch bei 
Denon vorkommen. Bleiben dann noch die Pausen zwischen den Frames. Da 
habe ich noch nicht so genau hingeschaut...

Gruß,

Frank

von eku (Gast)


Lesenswert?

Hallo Frank,

Frank M. schrieb:
> Reicht vielleicht die Änderung der Modulationsfrequenz unter Einhaltung
> der Original-Denon-Timings?

nein. Es bedarf definitiv der Sharp-Timings.

Denon (65ms) und Sharp (40ms) unterscheiden sich in der Pause zwischen 
den Frames. Könnte IRMP zur Unterscheidung heranziehen. Bei 10kHz 
Abtastung kein Problem dies zu unterscheiden, sofern sich die FB auch 
daran halten.

Gruß, eku

von Müller (Gast)


Lesenswert?

Danke Frank

für deine Hilfe nun da kann woll mal wieder alles aufeindander.

Nun leuft es habe meine Hardware angepasst danke.

mfg
Müller

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Müller schrieb:

> Nun leuft es habe meine Hardware angepasst danke.

Prima. Hast Du die RC6- und RC6A-Protokolle im IRSND schon testen 
können?

Gruß,

Frank

von form (Gast)


Lesenswert?

Hallo, nettes Projekt.
Sehe ich das richtig, das sowohl bei IRMP als auch bei IRSND die Pins 
für den Empfänger und die IR-Diode frei wählbar sind?

Keine Interrupt-Pins beim Empfangen nötig?
Keine PWM-Pins beim Senden nötig?

MfG
Stefan

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

form schrieb:

> Sehe ich das richtig, das sowohl bei IRMP als auch bei IRSND die Pins
> für den Empfänger und die IR-Diode frei wählbar sind?

Beim IRMP: ja.
Beim IRSND: jain, s.u.

> Keine Interrupt-Pins beim Empfangen nötig?

Korrekt, es wird gepollt.

> Keine PWM-Pins beim Senden nötig?

Doch, es ist ein PWM-Pin nötig - wegen der Modulationsfrequenz.

Siehe auch den entsprechenden Abschnitt "Modulation" im IRMP-Artikel:

  http://www.mikrocontroller.net/articles/IRMP#Modulation

Gruß,

Frank

von jar (Gast)


Lesenswert?

Frank M. schrieb:
> Doch, es ist ein PWM-Pin nötig - wegen der Modulationsfrequenz.

wenn nötig ginge auch soft PWM - dazu gibts hier Beispiele in der 
Codesammlung

von eku (Gast)


Lesenswert?

Hallo Frank,

hast Du schon Zeit und Muse gehabt, das SHARP Protokoll zu 
implemetieren?

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

eku schrieb:

> Denon (65ms) und Sharp (40ms) unterscheiden sich in der Pause zwischen
> den Frames.

Das kann ich nicht bestätigen. Wenn ich mir IR-Data/denon-15kHz.txt 
anschaue, ist die Pause zwischen dem ersten und dem zweiten Frame 
ziemlich genau 653 Ticks, das macht dann wg. der Scanrate 653/15 = 44ms.

Wenn ich Deine sharp.log dagegenhalte, bekomme ich da ca. 40-43 ms 
heraus, also fast denselben Wert.

> Könnte IRMP zur Unterscheidung heranziehen. Bei 10kHz
> Abtastung kein Problem dies zu unterscheiden, sofern sich die FB auch
> daran halten.

Das ist mir zu eng. 40ms vs. 65ms wären wirklich schön gewesen, aber du 
hast da bei der Denon-FB wohl den Faktor 15 statt 10 wg. der Abtastrate 
vergessen :-)

Oder hast Du da mehr Scans von Denon-FBs?

Gruß,

Frank

von eku (Gast)


Lesenswert?

Hallo Frank,

Frank M. schrieb:
> Das ist mir zu eng. 40ms vs. 65ms wären wirklich schön gewesen, aber du
> hast da bei der Denon-FB wohl den Faktor 15 statt 10 wg. der Abtastrate
> vergessen :-)

das ist gut möglich. Die Standardabtastrate für Denon beträgt doch aber 
10kHz. Eine Implementierung des SHARP-Protokolls in IRSND mit den 
Timings laut Proktollspezifikation würde mir ein Stück weiterhelfen.

> Oder hast Du da mehr Scans von Denon-FBs?

Ich besitze genau eine Denon-FB, die sich per Schiebeschalter auf 
verschiedene Geräte umstellen lässt und genau eine Sharp. Über die 
Feiertage werde ich mal ein paar Scans aufzeihnen.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Hi eku,

eku schrieb:

> Eine Implementierung des SHARP-Protokolls in IRSND mit den
> Timings laut Proktollspezifikation würde mir ein Stück weiterhelfen.

Klar, das kann ich gern machen. Aber wie erkläre ich den Anwendern, dass 
man das Sharp-Protokoll nehmen muss, wenn IRMP zuvor das Denon-Protokoll 
erkannt hat?

> Ich besitze genau eine Denon-FB, die sich per Schiebeschalter auf
> verschiedene Geräte umstellen lässt und genau eine Sharp. Über die
> Feiertage werde ich mal ein paar Scans aufzeihnen.

Das ist gut. Vielleicht kann man das besser an der Anzahl der Frames 
erkennen, die pro Taste geschickt werden. Mein Denon-Scan enthielt da 
immer 2 Frames pro Taste, die Sharp-FB schickte immer 3 Frames, nämlich:

Denon:

1. Frame: Adresse + Kommando
2. Frame: Adresse + invertiertes Kommando

Sharp:

1. Frame: Adresse + Kommando
2. Frame: Adresse + invertiertes Kommando
3. Frame: Adresse + Kommando

Deshalb bitte beim Einscannen drauf achten, die Tasten möglichst kurz zu 
drücken.

Gruß,

Frank

von Stefan P. (form)


Lesenswert?

Ich habe mein auf IRMP & IRSND basierendes Projekt nun auch mal im 
IRMP-Wikiartikel eingefügt:
http://forum.mikrokopter.de/topic-21060.html

Vielen Dank nochmal an Frank für Deine großartigen Routinen.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Stefan P. schrieb:
> Ich habe mein auf IRMP & IRSND basierendes Projekt nun auch mal im
> IRMP-Wikiartikel eingefügt:
> http://forum.mikrokopter.de/topic-21060.html

Schön! Am witzigsten fand ich es übrigens, mit der Servo-Fernbedienung 
den Fernseher lauter/leiser zu drehen...
Das Youtube-Video dazu wäre doch ein prima Link ;-)

von Stefan G. (dreamer83)


Angehängte Dateien:

Lesenswert?

Hallo,

bin derzeit dabei einen Umsetzer von ner Opel Lenkradfernbedienung auf 
mein Sony Autoradio (Infrarot) mit nem AVR-Mega8 zu machen.
Ich habe vorerst nen kleines Prog geschrieben, was die IR-Codes leicht 
zeitverzögert wieder sendet. Getestet wurde dass ganze zuerst mit meinem 
TV der das NEC-Protokoll verwendet, was problemlos funktioniert.
Jedoch jeder Versuch ein erfolgreiches SIRCS Protokoll zu versenden ist 
bisher gescheitert. Das Protokoll wird anscheinend jedoch richtig 
erkannt. So wird mir über den UART bei jedm Tastendruck 1-2 Codes 
ausgegeben die als Command im Bereich von 0x4200 bis 0x4247 liegen.

Leider habe ich kein Speicheroszi um mir die Angelegenheit da mal 
anzusehen.

Wo könnte mein Problem sein?

Gruß Stefan

von Michael H. (michael_h45)


Lesenswert?

Stefan Grimm schrieb:
> Leider habe ich kein Speicheroszi um mir die Angelegenheit da mal
> anzusehen.
Beitrag "Re: IR Signal - Welches Protokoll?"
Soundkarte reicht.

von Stefan G. (dreamer83)


Angehängte Dateien:

Lesenswert?

Danke für den Tip, auch wenn ich mit den Spannungen an der Soundkarte 
vorsichtig sein würde.

Habe mal einen "Scan" der Taste "Hoch +" gemacht. Das vom IR-Empfänger 
registrierte Signal ist in der Datei "RX.wav" gespeichert das vom 
Controler gesendete in "TX.wav". Im Log ist der Pegel vom Senden 
aufgrund meiner Beschaltung noch invertiert.
Der nach Irmp ausgewertete Code soll SIRCS mit Adresse 0 und den 
Commands 0x4233  gefolgt von 0x4245 sein.

Gruß Stefan

von Stefan G. (dreamer83)


Angehängte Dateien:

Lesenswert?

Hier nochmal ne grobe Übersicht über die beiden Logs.

Die Signale stehen zueinander in keinem zeitlichen Verältniss.

Gruß Stefan

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Hallo Stefan,

Stefan Grimm schrieb:

> Habe mal einen "Scan" der Taste "Hoch +" gemacht. Das vom IR-Empfänger
> registrierte Signal ist in der Datei "RX.wav" gespeichert das vom
> Controler gesendete in "TX.wav".

Besser wäre es, wenn Du mal einen Scan per IRMP machst - einmal mit kurz 
und einmal mit lang gedrückten Tasten - mindestens zwei.

Wenn die mit IRSND gesandten Daten vom Radio nicht dekodiert werden 
können, kann das folgende Gründe haben:

1. Schlechtes Timing:

   Quarz am µC verwenden! Die Dekodierer in den industriellen Geräten
   sind nicht so timing-tolerant wie IRMP.

2. Falsche Modulationsfrquenz:

   Eventuell benutzt die Original-FB zum Radio eine abweichende
   Modulationsfrequenz

3. Leichte Abweichungen vom SIRCs-Protokoll

   Zum Beispiel kann dies der Fall sein bei der Anzahl der
   Wiederholungsframes, die gesandt werden müssen, bevor das Gerät
   einen Befehl als gültig erkennt.

4. Bug in IRSND

   Wovon ich aber nicht ausgehe ;-)

Kann denn IRMP das per IRSND gesandte Signal wieder dekodieren?
Welche Interruptfrequenz benutzt Du (sowohl beim IRMP als beim IRSND)?

Wie gesagt: eine per IRMP erstellte Scan-Datei (analog zu IR-Data/*.txt) 
würde hier weiterhelfen.

Gruß,

Frank

von Stefan G. (dreamer83)


Lesenswert?

Ok Danke schon mal für die Tipps.

Ich werde heute Abend mal einen Scan machen.

Ich verwende momentan die Standartvorgaben der aktuellen IRSND & IRMP.

Werde mal ne 2.Version meiner Schaltung zum "Rescan" aufbauen.

Gruß Stefan

von Stefan G. (dreamer83)


Angehängte Dateien:

Lesenswert?

Abend,

hab hier mal den Log aller Tasten der Fernbedienung.

In der IRMP verwende ich 10000 Interrupts, genauso wie in der IRSND.

habe irgendwie das Gefühl, das beim senden durch die recht großen 
Commandos irgendwas schief geht, denn es ist nicht wirklich möglich 
Zahlen wie 0x4247 in 3 Nibble beim senden unterzubringen.
1
case IRMP_SIRCS_PROTOCOL:
2
  { command = bitsrevervse (irmp_data_p->command, SIRCS_MINIMUM_DATA_LEN);
3
    irsnd_buffer[0] = (command & 0x0FF0) >>  4;   // CCCCCCCC
4
    irsnd_buffer[1] = (command & 0x000F) << 4;    // CCCC0000
5
6
    irsnd_busy      = TRUE;
7
    break;
8
  }

wenn in der oberen Zeile die Daten gespielgelt werden müsste die 
Nachricht dann ja 0xEC42 lauten. nur wie sollen die nun in den 
Sendbuffer geschrieben werden?, müsste dann 0xEC in den Buffer[0] und 
der Rest in Buffer[1] ?

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Stefan Grimm schrieb:

> habe irgendwie das Gefühl, das beim senden durch die recht großen
> Commandos irgendwas schief geht, denn es ist nicht wirklich möglich
> Zahlen wie 0x4247 in 3 Nibble beim senden unterzubringen.

Ja, das ist der Knackpunkt. Das SIRCS-Telegramm besteht laut

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

aus mindestens 12 Bits (3 Nibbles), maximal jedoch aus 20 Bits. Die 
Bitlänge ist also variabel. IRSND unterstützt momentan nur die 
12-Bit-Variante.

Ich werde mir Deine Scans mal näher ansehen und muss dann überlegen, wie 
man dem IRSND die Bitlänge beibringt.

Gruß,

Frank

von Stefan G. (dreamer83)


Lesenswert?

Hab hier nen kleinen Erfolg zu verbuchen. Habe es hinbekommen, dass die 
jeweiligen Kommandos zumindest korrekt gesendet werden, auch wenn die 
Anpassung nicht unbedingt schön ist.

In der "irsnd_ISR (void)" habe ich die Mindestanzah an Bits per #define 
variabel erhöht.
1
  complete_data_len = SIRCS_MINIMUM_DATA_LEN+SIRCS_ADDITIONAL_NUM_OF_BITS;

sowie in der "irsnd_send_data"
1
case IRMP_SIRCS_PROTOCOL:
2
{
3
//command = bitsrevervse (irmp_data_p->command, SIRCS_MINIMUM_DATA_LEN);
4
  command = bitsrevervse (irmp_data_p->command, SIRCS_MINIMUM_DATA_LEN+SIRCS_ADDITIONAL_NUM_OF_BITS);
5
6
//  irsnd_buffer[0] = (command & 0x0FF0) >> 4;     // CCCCCCCC
7
//  irsnd_buffer[1] = (command & 0x000F) << 4;     // CCCC0000
8
    irsnd_buffer[0] = (command & 0x7F10) >> 7;     
9
    irsnd_buffer[1] = (command & 0x007f) << 1;     // Anpassung auf 15 Bit
10
    irsnd_busy      = TRUE;
11
    break;
12
}
Somit funktioniert in meinem Fall das Senden von Befehlen. Es sind Codes 
von 0x4200 bis 0x4247 in Verwendung.

Hoffe dennoch das euch die Codes etwas bringen.

Gruß Stefan

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Stefan Grimm schrieb:
> Hab hier nen kleinen Erfolg zu verbuchen.

Freut mich!

> Habe es hinbekommen, dass die
> jeweiligen Kommandos zumindest korrekt gesendet werden, auch wenn die
> Anpassung nicht unbedingt schön ist.

Ich werde es in eine allgemeine Form bringen, Vorschlag dazu siehe 
unten.

> In der "irsnd_ISR (void)" habe ich die Mindestanzah an Bits per #define
> variabel erhöht.
>
1
  complete_data_len =
2
> SIRCS_MINIMUM_DATA_LEN+SIRCS_ADDITIONAL_NUM_OF_BITS;

Ich nehme an, dass bei Dir SIRCS_ADDITIONAL_NUM_OF_BITS den Wert 3 hat?

> sowie in der "irsnd_send_data"
>
1
>     irsnd_buffer[0] = (command & 0x7F10) >> 7;
2
>     irsnd_buffer[1] = (command & 0x007f) << 1;     // Anpassung auf 15
3
>

Okay, das muss ich dann variabel gestalten für 
SIRCS_ADDITIONAL_NUM_OF_BITS von 0 bis 8.

Ich habe mir eine allgemeine Erweiterung folgendermaßen vorgestellt:

1. Erweiterung von IRMP_DATA um: uint8_t additional_bitlen

2. IRMP füllt beim Empfang eines Frames diese Variable mit der Anzahl
   der zusätzlich empfangenen Bits. In der Regel ist der Wert also 0,
   in Stefans Fall dann aber 3.

3. IRSND wertet im Falle von SIRCS diese neue Variable aus, um damit
   die Länge des Frames zu erhöhen.

Meinungen dazu?

Gruß,

Frank

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Mir ist noch eine Alternative dazu eingefallen:

Ich baue die Information der zusätzlichen Bitlänge in irmp_data.address 
mit ein. Dann kann man auf die neue Variable irmp_data.additional_bitlen 
verzichten.

Gruß,

Frank

von Stefan G. (dreamer83)


Lesenswert?

Genau SIRCS_ADDITIONAL_NUM_OF_BITS ist bei mir 3.

Keine schlechte Idee mit dem Adressfeld.

Das mit dem ganzen Schieben variabel zu machen ist nicht unbedingt ganz 
so angenehm, aber lässt sich sichrlich machen.

Gruß Stefan

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Stefan Grimm schrieb:

> Keine schlechte Idee mit dem Adressfeld.

Ja, dieser Weg scheint mir auch vernünftiger zu sein. Ein paar Anwender 
werden dann aber bei SIRCs u.U. plötzlich andere Adresswerte bekommen 
als bisher. Ich habe dazu mal die gesammelten Scans unter 
IR-Data/Sony*.txt angeschaut: Die meisten haben 12, einige 15 und einer 
sogar 20 Bits.

Bei den 12er-Frames wird die Adresse gleich bleiben, bei den anderen 
zukünftig abweichen. Aber das ist hinnehmbar.

> Das mit dem ganzen Schieben variabel zu machen ist nicht unbedingt ganz
> so angenehm, aber lässt sich sichrlich machen.

Ist nicht so schwer.

Gruß,

Frank

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Im SVN ist eine neue Version von IRMP und IRSND.

Die Änderungen betreffen nur das SIRCs-Protokoll:

IRMP speichert nun die Anzahl der zusätzlichen Bits gegenüber einem 
Standard-SIRCs-Frame der Länge 12 im oberen Byte des Adressfeldes. Bei 
Frames mit Standard-Länge bleibt die Adresse 0x0000.

@Stefan Grimm: Damit sollte bei Dir nun die Adresse 0x0300 sein, da bei 
Deiner Fernbedienung 3 zusätzliche Bits gesandt werden.

IRSND wertet nun die Längeninformation im Adressfeld aus und passt 
dadurch Länge und Frame-Daten dynamisch an.

@Stefan Grimm: Kannst Du das mal testen? Bei mir habe ich es lediglich 
unter Linux per Pipe von IRSND-Daten in den IRMP testen können. IRMP 
konnte alle von IRSND generierten Frames mit SIRCs-Frame-Längen (12, 15 
und 20) einwandfrei dekodieren.

Gruß,

Frank

von Sebastian .. (zahlenfreak)


Lesenswert?

Hallo Frank,

erstmal vielen dank für das super Projekt. Hat mir sehr geholfen.

Kannst du (zumindest ungefähre) Angaben zum RAM/Stack-Verbrauch von IRMP 
machen? Bei mir ist der RAM grad sehr knapp und ich hab auch Probleme, 
die auf den Stack hinweisen, aber ich kann in meinem Teil der Software 
nicht wirklich was finden. Und wenns geht wollte ichs vermeiden, IRMP 
selbst analysieren zu müssen ;-)

Gruß, Sebastian

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Sebastian ... schrieb:

> Kannst du (zumindest ungefähre) Angaben zum RAM/Stack-Verbrauch von IRMP
> machen?

An RAM werden ungefähr 60 Bytes verbraten, das sind allesamt static 
Variablen. Der Stack dürfte ähnlich ausfallen, da nur wenige lokale 
Variablen innerhalb der Funktion benötigt werden. Es hängt aber auch 
davon ab, wieviele/welche Protokolle Du freischaltest.

> Bei mir ist der RAM grad sehr knapp und ich hab auch Probleme,
> die auf den Stack hinweisen, aber ich kann in meinem Teil der Software
> nicht wirklich was finden.

Dann poste Deinen Source doch mal. Und gib mal die Größe der 
Data-Section an, die beim Übersetzen ausgegeben werden. Welchen µC 
verwendest Du?

Typische RAM-Probleme bereiten zum Beispiel Arrays oder Strukturen, die 
bereits im Source mit Konstanten gefüllt werden. Diese werden beim Boot 
des µC vom Flash ins RAM kopiert, wenn Du diese Daten nicht über PROGMEM 
deklarierst.

Gruß,

Frank

von Sebastian .. (zahlenfreak)


Lesenswert?

Vielen Dank. 60Byte static plus ca. 60 Byte stack dürfte das ganze schon 
erklären.
Danke für das Hilfsangebot, aber denke damit sollte ichs auch allein 
hinkriegen (ist dann auch ein stück weit Programmiererstolz ;) ). Hab 
ein paar größere Arrays im RAM. Mal schaun, ob ich irgendwo noch bischen 
was einsparen kann. Sonst gibts halt den nächstgrößeren Controller (hab 
grad nen Mega8).

Sebastian

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Sebastian ... schrieb:
> Vielen Dank. 60Byte static plus ca. 60 Byte stack dürfte das ganze schon
> erklären.

Naja, Stack sollte weniger sein.

> Danke für das Hilfsangebot, aber denke damit sollte ichs auch allein
> hinkriegen (ist dann auch ein stück weit Programmiererstolz ;) ). Hab
> ein paar größere Arrays im RAM.

Ändern sich die Werte in den Arrays? Wenn nicht, packe sie ins Flash. 
Wenn doch, aber nur selten, packe sie ins EEPROM.

> Mal schaun, ob ich irgendwo noch bischen
> was einsparen kann. Sonst gibts halt den nächstgrößeren Controller (hab
> grad nen Mega8).

Mega8 ist obsolet, wechsle besser auf den pinkompatiblen Mega88 oder auf 
den Mega168 mit doppelt soviel Speicher. Dann sollten Deine Probleme der 
Vergangenheit angehören.

Gruß,

Frank

von Sebastian .. (zahlenfreak)


Lesenswert?

Der Mega8 lag halt noch rum. Irgendwann müssen die ja auch mal wegkommen 
^^

Ein Teil der Arrays sind nur Kopien ihrer EEPROM-Version und werden fast 
nur gelesen und sehr selten geschrieben. Ich habs auch schon probiert, 
einfach live aus dem EEPROM zu lesen. Wie erwatet waren die Probleme 
weg. Nur hab ich das ganze in der Bedienung unangenehm gemerkt...

Wie gesagt: Wenn mir nichts vernünftiges für die Software einfällt gibts 
den nächst größeren Controller. Ich wollte halt gerne wissen, ob das 
wirklich ein RAM-problem sein könnte, oder ob ich irgendwas anderes auch 
noch falsch gemacht habe.

Gruß, Sebastian

von eku (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Frank,

anbei die versprochenen Aufzeichnungen von Denon und Sharp bei 10kHz 
Abtastrate. Ich hoffe, die unterscheiden sich soweit, dass IRMP die 
Protokolle auseinanderhalten kann.

Gruß, eku

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Hallo eku,

eku schrieb:

> anbei die versprochenen Aufzeichnungen von Denon und Sharp bei 10kHz
> Abtastrate. Ich hoffe, die unterscheiden sich soweit, dass IRMP die
> Protokolle auseinanderhalten kann.

Erstmal danke für die Erstellung der Scans.

denon2_kurz_10khz.txt kann ich leider nicht verwenden, irmp erkennt das 
Zeugs nicht. Da scheint jeder Frame aus nur 3 Bits zu bestehen.

Auswerten konnte ich also nur denon1, denon3 und sharp.

Leider unterscheiden sie sich nur minimal. Damit kann man definitiv 
keine Unterscheidung hinbekommen. Beide senden 3 Frames, wo die Pausen 
dazwischen fast identisch sind. Die Abweichungen liegen im einstelligen 
Prozentbereich. Da könnte man lediglich über statistische Auswertungen 
eine Unterscheidung hinbekommen.

Du hattest ja gesagt, dass das Sharp-Gerät nicht auf die 
Original-Denon-Timings reagiert. Wie sieht es denn umgekehrt aus? Kommt 
das Denon-Gerät mit den Sharp-Timings zurecht?

Es gäbe ja noch die Möglichkeit, im IRSND mit einem Kompromiss im Timing 
zu arbeiten, so dass sowohl Denon als auch Sharp die von IRSND 
ausgesandten Frames verstehen. Idee ist also, die etwas verschiedenen 
Timingwerte durch entsprechende Versuche soweit anzunähern, dass beide 
Geräte damit zurechtkommen.

Könntest Du mal so eine Versuchsreihe starten? Ich kann es leider nicht, 
denn ich habe weder ein Gerät von Denon noch eins von Sharp.

irmp mit der Option -a verrät über die Timings Deiner Scans:

           Sharp       Denon1     Denon3
Puls       320 µs      300 µs     300 µs
Pause0     735 µs      745 µs     745 µs
Pause1    1781 µs     1783 µs    1783 µs

Ich kenne eigentlich nur zwei Quellen über das Denon-Protokoll, nämlich

   http://www.mikrocontroller.com/de/IR-Protokolle.php#DENON
   http://www.mikrocontroller.net/attachment/4246/IR-Protokolle_Diplomarbeit.pdf

Vielleicht sind die dort angegebenen Werte

           Denon
Puls       275 µs
Pause0     775 µs
Pause1    1900 µs

einfach schlichtweg falsch (abgeschrieben) bzw. liegen viel zu weit 
neben der Realität?

Deine Denon-Fernbedienungen liegen jedenfalls viel näher an den 
Sharp-Timings als an den Timings aus der obigen Dokumentation!

Fazit:
======

Wie wäre es, wenn Du in irmp.h einstellst:
1
#define DENON_PULSE_TIME         310.0e-6  //  310 usec pulse
2
#define DENON_1_PAUSE_TIME      1780.0e-6  // 1780 usec pause
3
#define DENON_0_PAUSE_TIME       745.0e-6  //  745 usec pause

und dann nochmal zunächst IRMP testest mit beiden FBs und anschließend 
diese Timings auch für IRSND testest mit Deinem Denon- und Sharp-Gerät?

Ich glaube fest daran, dass beide Geräte die obigen Timings schlucken 
;-)

Wenn ja, werde ich die obigen Werte ab sofort im Source verwenden.

Gruß,

Frank

von eku (Gast)


Lesenswert?

Frank M. schrieb:
> Ich kenne eigentlich nur zwei Quellen über das Denon-Protokoll, nämlich
[...]
> Vielleicht sind die dort angegebenen Werte
>
>            Denon
> Puls       275 µs
> Pause0     775 µs
> Pause1    1900 µs
>
> einfach schlichtweg falsch (abgeschrieben) bzw. liegen viel zu weit
> neben der Realität?

http://lirc.sourceforge.net/remotes/denon/
http://www.hifi-remote.com/johnsfine/DecodeIR.html

> Wie wäre es, wenn Du in irmp.h einstellst:

Probiere ich aus.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

eku schrieb:

> http://lirc.sourceforge.net/remotes/denon/

Zumindest die Werte der ersten 5 FBs in diesem Verzeichnis bekräftigen 
meinen Eindruck, dass in der Realität die Denon-Timings eher denen der 
Sharp-FB entsprechen und nicht den Werten in meinen herangezogenen 
Dokumenten.

> Probiere ich aus.

Bin gespannt.

Gruß,

Franak

von Colt F. (Firma: TUC) (coltfish)


Lesenswert?

Hallo,

möchte nur kurz allen, die Ihre Energie in dieses Projekt gesteckt haben 
(besonders natürlich Frank M.) einen herzlichen Dank aussprechen.
Tolle Arbeit, ich ziehe meine Hut!

Habe mir eben in kürzester Zeit den IR-Decoder für ein Projekt mit 
16Bit-PIC portieren können, die Performance ist super.

Gruß
Daniel

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Colt Fish schrieb:

> möchte nur kurz allen, die Ihre Energie in dieses Projekt gesteckt haben
> (besonders natürlich Frank M.) einen herzlichen Dank aussprechen.
> Tolle Arbeit, ich ziehe meine Hut!

Danke fürs Danke :-)

> Habe mir eben in kürzester Zeit den IR-Decoder für ein Projekt mit
> 16Bit-PIC portieren können, die Performance ist super.

Waren dafür Anpassungen im IRMP-Source nötig, die sich lohnen, in den 
Standard-Source mit einfließen zu lassen?

Gruß,

Frank

von Colt F. (Firma: TUC) (coltfish)


Lesenswert?

Frank M. schrieb:
> Waren dafür Anpassungen im IRMP-Source nötig, die sich lohnen, in den
> Standard-Source mit einfließen zu lassen?

Nicht wirklich. Ich habe nur die Datentypen umbenennen müssen. Der C30 
Compiler von Microchip ist ja ebenfalls ein gcc.
Und natürlich das Setup von Timer und Interrupts muss angepasst werden, 
welches allerdings stark vom verwendeten Chip abhängt.

Gruß
Daniel

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Hi eku,

eku schrieb:

> Probiere ich aus.

Ich habe gerade einen systematischen Bug im IRSND entdeckt: sämtliche 
gesendete Pausen waren bisher 1 Interrupt-Tick zu lang. Ich habe das 
gerade korrigiert und den Source im SVN eingecheckt.

Daher bitte vorher den Source aus dem SVN neu laden. Dort stehen jetzt 
auch die ermittelten Praxiswerte für das Denon-Timing drin.

Gruß,

Frank

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Die letzten Änderungen im SVN seit September 2010 sind nun eingeflossen 
in eine neue IRMP- und IRSND-Version 1.9.0.

Änderungen IRMP seit 1.8.1:

  - Korrekturen für Siemens-Protokoll
  - Neues Protokoll: NIKON
  - Speichern der zusätzlichen Bits (>12) im SIRCS-Protokoll in der
    Adresse
  - Timing-Korrekturen für Denon-Protokoll

Download IRMP:

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

Änderungen IRSND seit 1.8.0:

  - Neues Protokoll: RC6A
  - Neues Protokoll: RC6
  - Neues Protokoll: NIKON
  - Beachten der zusätzlichen Bits (>12) im SIRCS-Protokoll
  - Korrektur der Pausenlängen
  - Timing-Korrekturen für Denon-Protokoll

Download IRSND:

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

Viel Spaß,

Frank

von eku (Gast)


Lesenswert?

Hallo Frank,

> Daher bitte vorher den Source aus dem SVN neu laden. Dort stehen jetzt
> auch die ermittelten Praxiswerte für das Denon-Timing drin.

wir sind auf dem richtigen Weg! Sharp und Denon-Geräte kann ich nun 
beide mit dem Denon-Protokoll steuern. Allerdings liegt die 
Erkennungsrate bei ca. 80%. Einige Codes muss ich mehrfach senden bevor 
sie erkannt werden.

In welche Richtung kann ich das Timing noch verändern? Mehr hin zum 
Sharp oder wieder zu den alten Denon Werten?

Gruß, eku

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Hallo eku,

eku schrieb:
> Hallo Frank,
>
> wir sind auf dem richtigen Weg! Sharp und Denon-Geräte kann ich nun
> beide mit dem Denon-Protokoll steuern. Allerdings liegt die
> Erkennungsrate bei ca. 80%. Einige Codes muss ich mehrfach senden bevor
> sie erkannt werden.

Ist es bei beiden 80%?

> In welche Richtung kann ich das Timing noch verändern? Mehr hin zum
> Sharp oder wieder zu den alten Denon Werten?

Als erstes würde ich mal mit der Modulationsfrequenz spielen. In der 
Denon-Doku las ich immer was von 32kHz. Aber das glaube ich nicht so 
recht. Probiere mal 32kHz, 36kHz und 38kHz.

Wenn das nichts bringt, verschiebe die Timings mal zu den alten 
Denon-Werten.

Gruß,

Frank

von eku (Gast)


Lesenswert?

Hallo Frank,

mit den Timings der Revision 51 und 36kHz Modulationsfrequenz kann ich 
sowohl das Denon als ach das Sharp-Gerät fehlerfrei bedienen. Die 
Reaktion des Denons ist bei 32kHz und 38kHz schlechter. Der Sharp 
reagiert auf 32kHz garnicht und auf 38kHz unzuverlässig.

Ein kleinerSchönheitsfehler ist mir noch aufgefallen:

irmp/irsnd.c: In function 'ir_tx_put':
irmp/irsnd.c:337: warning: unused variable 'toggle_bit_rc6'

Diese Variable sollte nur für RC6 einkompiliert werden.


Nochmals vielen Dank für Deine Unterstützung. Ich werde den aktuellen 
Stand dann noch zu Ethersex portieren.

Gruß, eku

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Hallo eku,

eku schrieb:

> mit den Timings der Revision 51 und 36kHz Modulationsfrequenz kann ich
> sowohl das Denon als ach das Sharp-Gerät fehlerfrei bedienen. Die
> Reaktion des Denons ist bei 32kHz und 38kHz schlechter. Der Sharp
> reagiert auf 32kHz garnicht und auf 38kHz unzuverlässig.

Vielen Dank für die wichtige Info. Ich werde also 36 kHz in irsnd.c 
eintragen und die Timings so lassen, wie sie aktuell sind. Sie 
entsprechen ja auch im Wesentlichen den von Dir gescannten Werten und 
passen auch zur lirc-DB.

> Ein kleinerSchönheitsfehler ist mir noch aufgefallen:
>
> irmp/irsnd.c: In function 'ir_tx_put':
> irmp/irsnd.c:337: warning: unused variable 'toggle_bit_rc6'
>
> Diese Variable sollte nur für RC6 einkompiliert werden.

Danke, das war ein Copy-And-Paste-Fehler, die RC5-Bedingung ist hier an 
dieser Stelle falsch.

Alt:
1
#if IRSND_SUPPORT_RC5_PROTOCOL == 1
2
    static uint8_t  toggle_bit_rc6;
3
#endif

Neu:
1
#if IRSND_SUPPORT_RC6_PROTOCOL == 1 || IRSND_SUPPORT_RC6A_PROTOCOL == 1
2
    static uint8_t  toggle_bit_rc6;
3
#endif

Werde ich ebenfalls korrigieren.

> Nochmals vielen Dank für Deine Unterstützung. Ich werde den aktuellen
> Stand dann noch zu Ethersex portieren.

Auch von mir vielen Dank für Deine wirklich hilfreichen Experimente.

Gruß,

Frank

von eku (Gast)


Lesenswert?

Pollin hat eine neue IR-Tastatur:  711 057

von eku (Gast)


Lesenswert?

eku schrieb:
> Ich werde den aktuellen Stand dann noch zu Ethersex portieren.

Ethersex' IRMP ist nun auch auf dem aktuellen Stand. Viel Spaß damit!

http://www.ethersex.de

von iffi (Gast)


Lesenswert?

Hallo Frank,

genau so etwas wie IRMP habe ich gesucht! :)  Für ein Uni-Projekt will 
ich Infrarot-Signale an einem MSP430 empfangen. Da es so viele 
unterschiedliche Protokolle gibt, stellte sich mir die Frage, welche 
Protokolle ich implementieren soll. Jetzt sehe ich, dass in IRMP schon 
die meisten implementiert und ausgiebig getestet sind.

Jetzt wird es eine Kleinigkeit sein, den Infrarot-Sensor in Gang zu 
bringen. Danke, dass du allen dein Projekt zur Verfügung stellst.

Viele Grüße

von Fred (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

ist ja ein tolles Projekt. Ich habe mir das Ganze mal auf einen ATMEGA8
16MHz angepasst und noch eine Ausgabe für die Serielle eingefügt.

So, dann gleich ein paar FB ausprobiert und es klappt recht gut. Nur 
eine FB mag so gar nicht. Mit der hatte ich aber auch schon früher 
Probleme.
Eine Universal FB konnte sie jedenfalls nicht nachbilden.

Es handelt sich um eine FB für den T-Home X301T Mediareceiver.
Hersteller ist ruwido und es ist bereits die zweite Generation.

Im Anhang ist eine Datei, da hab ich mal mit der Logfunktion alle Tasten 
der Reihenfolge nach betätigt.

Kann man da was erkennen?

Gruß Fred

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Fred schrieb:

> Es handelt sich um eine FB für den T-Home X301T Mediareceiver.
> Hersteller ist ruwido und es ist bereits die zweite Generation.
>
> Im Anhang ist eine Datei, da hab ich mal mit der Logfunktion alle Tasten
> der Reihenfolge nach betätigt.

Das scheint ein Manchester-Code mit RC5-Timings zu sein, aber die Anzahl 
der Bits ist von 13 (Original-RC5) auf 17 Bit aufgebohrt. Leider sind da 
noch ein paar Ungenauigkeiten drin, wo ich nicht weiß, ob das 
Aufzeichnungsfehler sind oder etwas anderes.

Ändere in irmp.h mal testweise:

Alt:
1
#define RC5_ADDRESS_OFFSET                      2                               // skip 2 bits (2nd start + 1 toggle)
2
#define RC5_ADDRESS_LEN                         5                               // read 5 address bits
3
#define RC5_COMMAND_OFFSET                      7                               // skip 5 bits (2nd start + 1 toggle + 5 address)
4
#define RC5_COMMAND_LEN                         6                               // read 6 command bits
5
#define RC5_COMPLETE_DATA_LEN                   13                              // complete length

Neu:
1
#define RC5_ADDRESS_OFFSET                      1                               // skip 1 bit
2
#define RC5_ADDRESS_LEN                         3                               // read 3 address bits
3
#define RC5_COMMAND_OFFSET                      4                               // skip 4 bits
4
#define RC5_COMMAND_LEN                         13                              // read 13 command bits
5
#define RC5_COMPLETE_DATA_LEN                   17                              // complete length

Dann ist die Erkennungsrate bei über 70 Prozent.

Aber wie gesagt: das ist nur ein Test, keine endgültige Lösung. Denn das 
RC5-Protokoll hat tatsächlich nur 13 Bits.

Gruß,

Frank

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

iffi schrieb:

> genau so etwas wie IRMP habe ich gesucht! :)  Für ein Uni-Projekt will
> ich Infrarot-Signale an einem MSP430 empfangen.

Wenn Du IRMP auf MSP430 portiert hast, kannst Du mir gerne die 
Änderungen nennen (z.B. über #ifdef MSP430), damit ich die Anpassungen 
einpflegen kann.

> Jetzt wird es eine Kleinigkeit sein, den Infrarot-Sensor in Gang zu
> bringen. Danke, dass du allen dein Projekt zur Verfügung stellst.

Danke fürs Danke :-)

Gruß,

Frank

von ich (Gast)


Lesenswert?

Frank M. schrieb:
> Das scheint ein Manchester-Code mit RC5-Timings zu sein, aber die Anzahl
> der Bits ist von 13 (Original-RC5) auf 17 Bit aufgebohrt.

Ich habe mal versucht über die FB was rauszufinden. Das Protokoll nennt 
sich r-step und soll 23 bit und Manchestercodierung haben. Im Gegensatz 
zu RC5 jedoch invertiert. Die unter 
http://www.mikrocontroller.net/articles/MOTOROLA_VIP1710#Fernbedienung 
ist recht ähnlich.

Fred

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

ich schrieb:

> Ich habe mal versucht über die FB was rauszufinden. Das Protokoll nennt
> sich r-step und soll 23 bit und Manchestercodierung haben. Im Gegensatz
> zu RC5 jedoch invertiert.

Die Bitlänge ist definitiv 17 und nicht 23.

Wenn ich in irmp.c die Toleranz für RC5 von 10% auf 20% hochsetze:
1
#define RC5_START_BIT_LEN_MIN                   ((uint8_t)(F_INTERRUPTS * RC5_BIT_TIME * MIN_TOLERANCE_20 + 0.5) - 1)
2
#define RC5_START_BIT_LEN_MAX                   ((uint8_t)(F_INTERRUPTS * RC5_BIT_TIME * MAX_TOLERANCE_20 + 0.5) + 1)
3
#define RC5_BIT_LEN_MIN                         ((uint8_t)(F_INTERRUPTS * RC5_BIT_TIME * MIN_TOLERANCE_20 + 0.5) - 1)
4
#define RC5_BIT_LEN_MAX                         ((uint8_t)(F_INTERRUPTS * RC5_BIT_TIME * MAX_TOLERANCE_20 + 0.5) + 1)

habe ich sogar eine Erkennungsrate von 100%. Verwendest Du einen Quarz 
am µC?

Leider hast Du in der Scan-Datei keine Kommentare eingepflegt. Ich habe 
nämlich gesehen, dass von den 44 Tastendrücken, die Du aufgezeichnet 
hast, 14 identisch sind, es tatsächlich also nur 30 verschiedene Tasten 
waren.

Um nun herauszufinden, ob der Code tatsächlich invertiert ist oder 
nicht, bitte ich Dich, zumindest die Tasten 0-9 nochmal aufzuzeichnen 
und mit einer Kommentarzeile vor jeder Scan-Zeile zu versehen, siehe 
dazu auch die anderen Scan-Dateien im Unterverzeichnis IR-Data.

Gruß,

Frank

von Fred (Gast)


Lesenswert?

Frank M. schrieb:
> habe ich sogar eine Erkennungsrate von 100%. Verwendest Du einen Quarz
> am µC?

ja, einen 16MHz.

Die Info mit den 23 Bit stammt nicht von mir. Da bin ich mir aber auch 
nicht sicher, was da mit dazugerechnet wurde.

Den Scan werde ich noch mal durchführen. Es sollten eigentlich 45 
verschiedene Codes in der alten Scandatei sein.

Bewirkt die Invertierung der Manchestercodierung irgendwas?

Mach mich gleich an die Arbeit, wenn ich wieder daheim bin.


Fred

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Fred schrieb:

> ja, einen 16MHz.

Dann ist die Fernbedienung so "wackelig" ;-)

> Den Scan werde ich noch mal durchführen. Es sollten eigentlich 45
> verschiedene Codes in der alten Scandatei sein.

Leider nicht. Die Datei hat 44 Zeilen, aber 14 Codes sind doppelt.

> Bewirkt die Invertierung der Manchestercodierung irgendwas?

Nein, nur dass die Codes invertiert sind und dann "riesengroße" Zahlen 
ergeben. Ich glaube nicht, dass die tatsächlich zu invertieren sind. Das 
wird man aber besser sehen, wenn die Zeilen kommentiert sind, denn meist 
geben die Tasten 0 bis 9 einen fortlaufenden Code ab.

> Mach mich gleich an die Arbeit, wenn ich wieder daheim bin.

Prima.

Gruß,

Frank

von Martin (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

erstmal vielen Dank dafür das es Leute gibt die Ihre Projekte anderen 
zugänglich machen :)

Hab gerade das erste Mal mit IRMP rumgespielt und bin begeistert. Hab 
aber auch eine Fernbedienung gefunden die nicht funktionieren will.

Die Fernbedienung gehört zu einem IMON-Display (für den PC).

Hab mal n Paar tasten gedrückt und das File angehängt :)
Ist das Normal das die einzelnen Befehle sich so stark in der Länge 
unterscheiden?
Kann jemand erkennen was das für n Protokoll is?

Danke :)

von Bastian F. (bastian_f)


Lesenswert?

@Fred: Kannst du mir bitte mal deine portierte Version für den Atmega8 
zukommen lassen?
Danke,
Basti

bastian.felten[ät]gmail[dot]com

von Bastian F. (bastian_f)


Lesenswert?

Schon wieder ich...
Ich habe einen TSOP1838 an PB6 eines mit 8 MHz getakteten Atmega88 
angeschlossen, der in einem STK500 steckt.
RX/TX hängen an PD0/PD1 und in der irmpconfig.h wurde das logging 
aktiviert.
HTerm zeigt mir jedoch bei keiner einzigen Fernbedienung irgendeinen 
Ausgabe.

Muss man sonst noch etwas einstellen, oder was könnte das Problem sein?

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Bastian F. schrieb:
> HTerm zeigt mir jedoch bei keiner einzigen Fernbedienung irgendeinen
> Ausgabe.

Zeig mal Deine irmpconfig.h und deine main-Funktion.

Gruß,

Frank

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Martin schrieb:

> Die Fernbedienung gehört zu einem IMON-Display (für den PC).
>
> Hab mal n Paar tasten gedrückt und das File angehängt :)

Habe das mal durch "irmp -a" gejagt. Scheint tatsächlich ein neues 
Protokoll zu sein, was aber relativ einfach zu decodieren ist.

> Ist das Normal das die einzelnen Befehle sich so stark in der Länge
> unterscheiden?

Sieht so aus, als ob das einfach Schrott ist. Kann es sein, dass da eine 
Neonröhre oder ähnliches in der Nähe leuchtete?

> Kann jemand erkennen was das für n Protokoll is?

Eines, welches IRMP noch nicht beherrscht. Ich baue es ein und melde 
mich danach nochmal mit einer Lösung.

Gruß,

Frank

von Bastian F. (bastian_f)


Lesenswert?

Frank M. schrieb:
> Zeig mal Deine irmpconfig.h und deine main-Funktion.

Ich befürchte, dass ich das ganze noch nicht wirklich verstanden habe.
Die main Funktion habe ich nämlich nicht verändert und wenn ich mir die 
anschaue, wird dort nirgends das Logging bzw die entsprechende Ausgabe 
aufgerufen wird.
Bin davon ausgegangen, dass das einfach durch das Setzen der "1" 
passiert.
Was muss ich denn eintragen, dass ich eine Ausgabe bekomme?

von Stefan G. (dreamer83)


Lesenswert?

Hi,

seh dir einfach mal das Projekt hier ganz oben auf der Seite an. In der 
main.c ist ein funktionierendes Beispiel zur Ausgabe des "normalen" 
Codes.

Gruß Stefan

von Fred (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

hat ne Weile gedauert aber ich kam nicht früher heim :-(

So, im Anhang nun die Scans der Tasten 1-0. Ich habe die Tasten
jeweils mehrmals betätigt und dazu auch immer eine ganze Zeile
erhalten. Ich hoffe, das ist so brauchbar.

Für die Atmega8 Version brauchte ich nicht viel anpassen. Im Projekt
den entsprechenden Controller und Takt einstellen und in der 
irmpconfig.h
noch den entsprechenden Port wählen.

Fred

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Fred schrieb:
> So, im Anhang nun die Scans der Tasten 1-0. Ich habe die Tasten
> jeweils mehrmals betätigt und dazu auch immer eine ganze Zeile
> erhalten. Ich hoffe, das ist so brauchbar.

Ja, der Scan ist sehr gut brauchbar. Was mir auffällt, dass der "Jitter" 
wesentlich geringer ist. Die Puls-/Pause-Zeiten in r-step.txt sind 
wesentlich exakter als die in t-home.txt.

Hast Du da eine andere Fernbedienung oder eine andere Empfängerschaltung 
(z.B. mit/ohne Quartz) verwendet?

Was mir noch auffiel: Kommen hier beim Manchester-Protokoll zwei Pulse 
oder Pausen direkt hintereinander, weichen sie etwas von der doppelten 
Dauer, die man erwarten müsste, ab. Ich musste dafür den 
Manchester-Decoder im IRMP etwas "aufbohren", um so ein asymmetrisches 
Verhalten besser abbilden zu können.

Ausserdem sind die Bits hier tatsächlich "negiert", d.h. bei einer 1 
kommt erst der Puls, dann die Pause. Damit erhöht sich die Anzahl der 
Bits im Frame von 17 auf 18. Das letzte Bit ist ein Parity-Bit, was von 
IRMP nicht ausgewertet wird.

Hier das Ergebnis, gekürzt um die Wiederholungen:

#1 000110010100000010 p = 23, a = 0x0065, c = 0x0001, f = 0x00
#2 000110010100000101 p = 23, a = 0x0065, c = 0x0002, f = 0x00
#3 000110010100000110 p = 23, a = 0x0065, c = 0x0003, f = 0x00
#4 000110010100001001 p = 23, a = 0x0065, c = 0x0004, f = 0x00
#5 000110010100001010 p = 23, a = 0x0065, c = 0x0005, f = 0x00
#6 000110010100001101 p = 23, a = 0x0065, c = 0x0006, f = 0x00
#7 000110010100001110 p = 23, a = 0x0065, c = 0x0007, f = 0x00
#8 000110010100010001 p = 23, a = 0x0065, c = 0x0008, f = 0x00
#9 000110010100010010 p = 23, a = 0x0065, c = 0x0009, f = 0x00
#0 000110010100010101 p = 23, a = 0x0065, c = 0x000a, f = 0x00

Die Adresse ist also 0x65, der Code geht von 0x01 bis 0x0a. Das passt 
sehr gut.

Bevor ich den Code veröffentliche, möchte ich obige erste Frage 
beantwortet haben. Denn der Ruwiodo-Decoder versteht zwar jetzt 
r-step.txt ganz gut, jedoch nicht mehr t-home.txt, welches zu nahe an 
den RC5-Timings ist.

Gruß,

Frank

von Martin (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Frank,

ich hab eben nochmal auf der Fernbedienung rumgedrückt - und siehe da: 
alle Befehle gleich lang.
Keine Ahnung was da gestört hatte. Neonröhre hab ich hier nicht. Alles 
was zu dem Zeitpunkt geleuchtet hatte war mein Display :)

Hab dir die neue Datei nochmal angehängt. Vielleicht erleichtert dir das 
ja dann die Arbeit (kenn mich damit ja nich so aus ;)).

Ach... Nochmals danke für deine Arbeit! :)


Martin

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Hallo Martin,

Martin schrieb:
> Hab dir die neue Datei nochmal angehängt. Vielleicht erleichtert dir das
> ja dann die Arbeit (kenn mich damit ja nich so aus ;)).

Danke. Mittlerweile bin ich mit der imon.txt durch. Es handelt sich um 
kein Fernbedienungsprotokoll im klassischen Sinne. Es ist weder 
Manchester-codiert noch ist ein Pulse-Distance Protokoll. Es ist viel 
einfacher, nämlich einfach bitseriell mit 38 Bits, wenn ich mich nicht 
verzählt habe.

Das kann IRMP nicht. Einfacher wäre es, einen Software-Uart (i.d.R. 8 
Bit) auf 38 Bit umzuschreiben. ;-)

Naja, ich schaue mir nochmal imon2.txt an. Dann entscheide ich, ob ich 
das in IRMP einbaue oder nicht.

Gruß,

Frank

von herby (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Frank M.,

erstmal vielen Dank für Deine tolle Arbeit.
Ich habe hier auch eine imon-Fernbedienung mit dem Namen "Veris RM200".
Sie gehört zu einem PC-Gehäuse von Antec.
Allerding werden hier im Gegensatz zu Martin´s Protokoll je Tastendruck
zwei Pakete gesendet.
Es wäre schön wenn das Protokoll in deine Software integriert werden 
könnte.

Schonmal vielen Dank

von Fred (Gast)


Lesenswert?

Frank M. schrieb:
> Hast Du da eine andere Fernbedienung oder eine andere Empfängerschaltung
> (z.B. mit/ohne Quartz) verwendet?

Hallo,

ich vermute, beim ersten Scan war der Quarz noch nicht aktiv,
Da ich die Fuses erst danach geändert habe.

Zusätzlich liegt die Samplerate jetzt bei 24000.

Soll ich das mal mit weniger oder eben einer anderen Rate noch mal 
scannen?

Vielleicht hat ja noch jemand die FB zum MOTOROLA VIP1710, die sollte ja 
so ähnlich sein.

Fred

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Fred schrieb:

> ich vermute, beim ersten Scan war der Quarz noch nicht aktiv,
> Da ich die Fuses erst danach geändert habe.

Ahja, das erklärt das Verhalten. Da die Timings sehr nahe bei RC5 
liegen, kann ich hier auch nur die Verwendung eines Quarzes empfehlen.

> Zusätzlich liegt die Samplerate jetzt bei 24000.
>
> Soll ich das mal mit weniger oder eben einer anderen Rate noch mal
> scannen?

24000 ist zuviel, da läuft der Log-Buffer im IRMP über. Wenn Du nochmal 
Lust hast, kannst Du das gern mit 15000 wiederholen. Dann bekomme ich 
auf jeden Fall genauere Werte.

Gruß,

Frank

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

@Fred:

Ich habe die Unterstützung der T-Home Mediareceiver-FB (neues Protokoll 
"RUWIDO") ins SVN eingecheckt. Du kannst ja mal testen, ob damit die FB 
sauber erkannt wird. Du musst aber in irmpconfig.h das RUWIDO-Protokoll 
noch freischalten. Standardmäßig ist es abgeschaltet.

Gruß,

Frank

von Klaus L. (kllei)


Lesenswert?

Hallo, melde mich auch mal wieder im IRMP Projekt zurück ;-)

Gibt es schon praktische Erfahrung mit RC6(a) in irsnd? Ich habe das 
gerade in Ethersex probiert, da wackelt der Pin garnicht. Hat es jemand 
schon mal "nativ" probiert? (RC5, NEC, SIRCS und andere funktionieren 
da)

Hab leider meine IRMP Testumgebung vollkommen zerlegt...

Danke für einen Input.

Grüße,
Klaus

von Klaus L. (kllei)


Lesenswert?

So, die Frage hätte ich mir sparen können ;-)
Test war einfacher aufzubauen als gedacht, irsnd schickt alles und irmp 
erkennt den Code. Wie zu erwarten.

Hat jemand Ethersex am laufen mit irsnd und könnte RC6 mal testen?

Grüße,
Klaus

von Klaus L. (kllei)


Lesenswert?

So, in Ethersex fehlt der Teil der RC6 sendet in der Datei irsnd_lib.c
Werde ich dann mal einbauen.
Sorry für das kleine Selbstgespräch ;-)

Klaus

von Bastian F. (bastian_f)


Lesenswert?

Wie genau kann man denn nun loggen?
Wie gesagt, habe ich nur das Logging aktiviert und sonst nichts am 
Programm geändert. Und das scheint ja schonmal falsch zu sein.
Wird wohl nur der Aufruf einer Funktion oä sein, aber ich verstehe es 
leider nicht, bzw kann diese Funktion nicht finden.
Wäre nett, wenn sich jemand erbarmen würde und mir dies erklären könnte.
Im ersten Entwurf "hier ganz oben auf der Seite" habe ich dahingehend 
auch nichts finden können.
Danke!

von Fred (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

ich habe nun die Version aus dem SVN neu gezogen und die beiden 
Logdateien
erzeugt. Ein mal mit Abtastrate 10000 und 15000.

Es ist mit dieser Version nicht mehr möglich auf 20000 zu gehen.
Dies wäre aber mit RC80 usw. nötig.

Leider funktioniert die Erkennung von ruwido noch nicht richtig.

Fred

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Fred schrieb:

> ich habe nun die Version aus dem SVN neu gezogen und die beiden
> Logdateien
> erzeugt. Ein mal mit Abtastrate 10000 und 15000.

Danke, schaue ich mir an.

> Es ist mit dieser Version nicht mehr möglich auf 20000 zu gehen.

Wieso nicht? Compiler-Fehlermeldung oder was anderes, was nicht mehr 
geht?

> Dies wäre aber mit RC80 usw. nötig.

Du meinst RECS80? Hat das mal bei Dir funktioniert? Ich habe bisher von 
niemandem eine Rückmeldung zu RECS80 erhalten, der IRMP-Code dazu war 
bisher absolut ungetestet.

> Leider funktioniert die Erkennung von ruwido noch nicht richtig.

Wie äußert sich das?

Gruß,

Frank

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Fred schrieb:

> ich habe nun die Version aus dem SVN neu gezogen und die beiden
> Logdateien
> erzeugt. Ein mal mit Abtastrate 10000 und 15000.

Ich habe die mal verglichen mit Deiner vorhergehenden r-step.txt. Dort 
sind die Pulse und Pausen ziemlich genau doppelt so lang wie in 
home10k.txt. Kann es sein, dass Du r-step.txt mit 20kHz aufgenommen 
hast? Das hättest Du mir sagen müssen! Jetzt sind die Timingwerte für 
das RUWIDO-Protokoll alle viel zu kurz :-(

Bitte um Aufklärung.

Gruß,

Frank

von Fred (Gast)


Lesenswert?

Hallo,

sorry für die unvollständigen Angaben. Ich hatte wie oben beschrieben
eine Abtastrate von 25000 eingestellt und das r-step.txt erzeugt.
Die beiden anderen mit 15000 und 10000. Ich hätte da noch ein 20000 und
25000 erzeugt, aber das ging ja nicht mehr.

Bei 20000 kommt jetzt "integer overflow in expression" mit 10 warnings.
Das eigendlich nicht mehr wie 20000 gehen sollte, hab ich auch erst 
später gelesen.

Fred

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Fred schrieb:

> sorry für die unvollständigen Angaben. Ich hatte wie oben beschrieben
> eine Abtastrate von 25000 eingestellt und das r-step.txt erzeugt.

Upps, sogar 25000. Ich habe mich schon gewundert, warum ich die 3 
Dateien nicht "übereínander" bekommen habe. Die Angabe der Abtastrate 
ist absolut wichtig.

> Bei 20000 kommt jetzt "integer overflow in expression" mit 10 warnings.
> Das eigendlich nicht mehr wie 20000 gehen sollte, hab ich auch erst
> später gelesen.

Das ist logisch, durch die falschen Timingwerte, die um den Faktor 2,5 
zu groß sind, laufen bei so hohen Abtastraten die Variablen über.

Ich werde sie um den Faktor 2,5 stauchen, dann nochmal alle 3 Dateien 
damit durchchecken und dann, wenn es läuft, ein Update im SVN machen.

Gruß,

Frank

von Fred (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

ich hab mal weiter Scans durchgeführt. Dazu hab ich jetzt erstmal wieder 
die alte Version geflasht und hierbei 20000 als Abtastrate eingestellt, 
da dies für ein paar Protokolle anscheinend nötig ist.

die Datei irc.txt sollte eigentlich das RECS80 Protokoll sein. Es wird 
aber nicht erkannt, könnte auch was anderes sein. Die sagem.txt stammt 
von einer d-box und wird auch nicht erkannt. Bei der kathrein.txt würde 
mich nur interessieren, ob das ein bekanntes Verfahren ist. Zusätzlich 
noch die r-step.txt mit der gleichen Rate.

Ich hoffe da ist was brauchbares für dich dabei.
Wegen den Verwirrungen der Abtastrate, sollte man beim logging eine 
feste Abtastrate vorgeben?

Fred

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Fred schrieb:
> ich hab mal weiter Scans durchgeführt. Dazu hab ich jetzt erstmal wieder
> die alte Version geflasht und hierbei 20000 als Abtastrate eingestellt,
> da dies für ein paar Protokolle anscheinend nötig ist.

15kHz wären optimal. Bei 20kHz reicht der Buffer nicht aus, um 
Framewiederholungen zu speichern.

> die Datei irc.txt sollte eigentlich das RECS80 Protokoll sein. Es wird
> aber nicht erkannt, könnte auch was anderes sein.

Das ist ein Manchester-Protokoll, und zwar ein Mischmasch aus Grundig (9 
Datenbits) und Nokia (16 Datenbits). IRC (was ist das?) hat aber nur 13 
Datenbits. Das kann ich leicht einbauen.

> Die sagem.txt stammt
> von einer d-box und wird auch nicht erkannt.

Ein Pulse-Distance-Protokoll, was leider vom Start-Bit mit dem 
Siemens-Protokoll her kollidiert. Deine T-Home-Scans funktionieren bei 
mir nun alle wunderbar, kollidieren aber nun vom Timing her mit Denon 
und auch dem Siemens-Protokoll. Da bin ich noch etwas am tüfteln, wie 
ich dieses auseinanderhalten könnte.

> Bei der kathrein.txt würde mich nur interessieren, ob das ein bekanntes
> Verfahren ist.

Nein, das ist was komplett neues, Zwischen den Pulsen sind irre lange 
Pausen, die schon nicht mehr als Pausen zwischen Bits, sondern als 
Pausen zwischen Frames verstanden werden.

> Zusätzlich noch die r-step.txt mit der gleichen Rate.

Funktioniert wunderbar, leider habe ich da noch diese Konflikte zu 
SIEMENS und DENON. Deaktiviere ich diese beide Protokolle, läuft alles 
gut.

> Ich hoffe da ist was brauchbares für dich dabei.

Danke, ich werde da das beste draus machen.

> Wegen den Verwirrungen der Abtastrate, sollte man beim logging eine
> feste Abtastrate vorgeben?

Nein, das geht nicht. Bei einigen Protokollen sind die Pulse sehr kurz, 
dann ist 10kHz ungeeignet. 10kHz haben aber den Vorteil, dass man auch 
Frame-Wiederholungen noch sieht. 15kHz ist da ein guter Kompromiss, 
siehe oben. Optimal ist es, die Frquenzrate im Dateinamen zu 
hinterlegen, wie ich es mit den Beispieldateien unter IR-Data gemacht 
habe.

Gruß,

Frank

von Fred (Gast)


Lesenswert?

Hallo,

soll ich die Scans mit 15000 noch mal wiederholen?

das irc ist die FB von Pollin, die bei dem IR-Fernsteuerbausatz 
mitgeliefert wird. Im Artikel [[Quellcode für den Pollin Fernsteuer 
Bausatz]] wurde eben dieses Verfahren erwähnt. So wie es aber aussieht 
ist das aber nicht mehr das was es sein sollte.

Die kathrein scheint wohl so langsam zu sein, da das Gerät dazu nur 
einen 8051 mit 1MHz hat und die FB dazu angepasst ist.

Fred

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Fred schrieb:

> soll ich die Scans mit 15000 noch mal wiederholen?

Wenn Du Spaß daran hast, sehr gern :-)

> das irc ist die FB von Pollin, die bei dem IR-Fernsteuerbausatz
> mitgeliefert wird. Im Artikel [[Quellcode für den Pollin Fernsteuer
> Bausatz]] wurde eben dieses Verfahren erwähnt. So wie es aber aussieht
> ist das aber nicht mehr das was es sein sollte.

Pollin hat da schon 3x die Fernbedienung gewechselt. Das war mal RECS80 
mit dem 3004er Controller in der FB.

> Die kathrein scheint wohl so langsam zu sein, da das Gerät dazu nur
> einen 8051 mit 1MHz hat und die FB dazu angepasst ist.

Normalerweise verwendet Kathrein das Protokoll RC6A, welches von IRMP 
auch unterstützt wird. Aber die scheinen das auch zu wechseln....

Gruß,

Frank

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Bastian F. schrieb:
> Wie genau kann man denn nun loggen?

Ich verstehe leider überhaupt nicht, was Du möchtest. Möchtest Du 
loggen, um eine unbekannte Fernbedienung zu scannen oder willst Du nicht 
erstmal schauen, ob IRMP Deine Fernbedienung vielleicht doch erkennt? In 
mehr als 80% der Fälle sollte die FB erkannt werden. Du musst dann nur 
noch

- Protokoll
- Adresse
- Kommando

auch irgendwo ausgeben, entweder auf dem UART oder auf einem LC-Display.

> Wie gesagt, habe ich nur das Logging aktiviert und sonst nichts am
> Programm geändert. Und das scheint ja schonmal falsch zu sein.

Ja, das Logging ist nur für unbekannte FBs. Erstmal solltest Du schauen, 
ob IRMP die FB nicht doch erkennt.

> Wird wohl nur der Aufruf einer Funktion oä sein, aber ich verstehe es
> leider nicht, bzw kann diese Funktion nicht finden.

Schau Dir die main-Funktion von irmp.c ganz am Ende von main.c an:
1
// This is the main routine if you use GCC Compiler
2
int
3
main (void)
4
{
5
  IRMP_DATA irmp_data;
6
7
  irmp_init();         // initialize rc5
8
  timer_init();        // initialize timer
9
  sei ();              // enable interrupts
10
11
  for (;;)
12
  {
13
    if (irmp_get_data (&irmp_data))
14
    {
15
        // ir signal decoded, do something here...
16
        // irmp_data.protocol is the protocol, see irmp.h
17
        // irmp_data.address is the address/manufacturer code of ir sender
18
        // irmp_data.command is the command code
19
    }
20
  }
21
}

> Wäre nett, wenn sich jemand erbarmen würde und mir dies erklären könnte.

Du musst den Teil nach dem if-Statement schon mit Leben füllen, sonst 
bekommst Du kein Ergebnis. Hier kann sich jeder selbst austoben. Ich 
verstehe IRMP eher als anzuwendendes Tool und nicht als fertiges 
Programm.

Gruß,

Frank

von eku (Gast)


Lesenswert?

Hallo Frank,

versuch doch bitte nur RUWIDO einzukompilieren :-)

error: 'last_value' undeclared

von Fred (Gast)


Lesenswert?

da muss RC5 noch mit rein, dann klappts.


Fred

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

eku schrieb:
> versuch doch bitte nur RUWIDO einzukompilieren :-)
> error: 'last_value' undeclared

Danke für den Hinweis. Hier der Fix in irmp.c (ziemlich am Anfang):

Alt:
1
#if IRMP_SUPPORT_RC5_PROTOCOL == 1 || IRMP_SUPPORT_RC6_PROTOCOL == 1 ....
2
#define IRMP_SUPPORT_MANCHESTER                 1

Neu:
1
#if IRMP_SUPPORT_RC5_PROTOCOL == 1 || IRMP_SUPPORT_RC6_PROTOCOL == 1 || \
2
    IRMP_SUPPORT_GRUNDIG_OR_NOKIA_PROTOCOL == 1 || IRMP_SUPPORT_SIEMENS_PROTOCOL == 1 || \
3
    IRMP_SUPPORT_RUWIDO_PROTOCOL == 1
4
#define IRMP_SUPPORT_MANCHESTER                 1

Gruß,

Frank

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Fred schrieb:
> da muss RC5 noch mit rein, dann klappts.

Es klappt dann zwar, aber RC5 ist kein Muss. Der Fehler lag woanders, 
siehe letzten Beitrag.

Gruß,

Frank

von Fred (Gast)


Lesenswert?

Hallo,

so, nun hab ich mal wieder etwas Zeit gehabt und konnte mal noch ein 
paar Sachen machen.

Ich hab die Kathrein mal mit 10k und 15k protokolliert. Irgendwie, kann 
ich da nicht viel erkennen. Darum hab ich einfach mal die FB aufgemacht 
und mir den Chip angesehen. Auf der Platine steht übrigens auch RUWIDO, 
dürfte aber trotzdem ein anderes Protokoll sein. Der Chip ist mit M709 
bezeichnet.
Datenblatt hab ich mal rausgesucht und angehängt. Nach der Schaltung 
müsste der Carriermode eingestellt sein.

Mist, ich glaub ich kann hier keine Logs mehr anhängen.

Fred

von Fred (Gast)


Lesenswert?

Sorry, ich kann gar keine Dateien mehr anhängen.

Gebe ich einen Dateianhang ein, lässt sich der Beitrag nicht mehr 
senden.

Wie kann ich denn nun dir die Logs etc. zur Verfügung stellen?

Die IRC hat übrigens eine SAB2008 und sollte IR60 sein.

Die Sagem hat einen M34280MK-331FP, dazu konnte ich nichts genaues 
finden.

Fred

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Fred schrieb:

> Wie kann ich denn nun dir die Logs etc. zur Verfügung stellen?

Im IRMP-Source findest Du oben im Kommentar meine E-Mail-Adresse.

Gruß,

Frank

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Im SVN ist eine neue IRMP-Version 1.9.2

Die bisherigen Decoderteile für RUWIDO (T-Home-Mediareceiver) und für 
SIEMENS (Siemens-Gigaset) konnte ich vereinigen, denn tatsächlich konnte 
ich nach den Wirren der unterschiedlichen Scan-Frequenzen nun erkennen, 
dass die Timings innerhalb der Toleranzgrenzen gleich sind. Der 
Unterschied liegt lediglich in der Länge des Frames:

RUWIDO:   9 Adress-Bits + 7  Kommando-Bits + 1 Check-Bit = 17 Bits
SIEMENS: 11 Adress-Bits + 10 Kommando-Bits + 1 Check-Bit = 22 Bits

Der Decoder nimmt nun beim Empfang zunächst das kürzere RUWIDO-Protokoll 
an, wenn das Timing passt, und schaltet dann während des Empfangs auf 
das SIEMENS-Protokoll um, wenn der Frame doch länger ist als 17 Bits.

Beide Protokolle sind erst aktivierbar ab einer Sample-Frequenz von 15 
kHz.

Viel Spaß,

Frank

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Update: Im SVN ist nun die neue IRMP-Version 1.9.4:

Neues Protokoll: IR60

@Fred: Bitte mal mit Deiner IRC-FB testen, danke!

Gruß,

Frank

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Und noch ein Update: Im SVN ist nun die neue IRMP-Version 1.9.5:

Neues Protokoll: KATHREIN

@Fred: Bitte mal mit Deiner IRC-FB testen, danke!

Gruß,

Frank

von eku (Gast)


Lesenswert?

Leider geht SIEMENS nun nicht mehr zu übersetzen:

irmp/irsnd.c:1088: error: 'SIEMENS_BIT_TIME' undeclared (first use in 
this function)
irmp/irsnd.c:1088: error: (Each undeclared identifier is reported only 
once
irmp/irsnd.c:1088: error: for each function it appears in.)
irmp/irsnd.c:1092: error: 'SIEMENS_STOP_BIT' undeclared (first use in 
this function)
irmp/irsnd.c:1096: error: 'SIEMENS_FRAME_REPEAT_PAUSE_TIME' undeclared 
(first use in this function)
irmp/irmp.h:41: error: expected '=', ',', ';', 'asm' or '__attribute__' 
before 'PAUSE_LEN'
irmp/irmp.h:427: error: expected specifier-qualifier-list before 
'uint8_t'
irmp/irmp.h:447: error: expected '=', ',', ';', 'asm' or '__attribute__' 
before 'irmp_get_data'
irmp/irmp.h:456: error: expected '=', ',', ';', 'asm' or '__attribute__' 
before 'irmp_ISR'
irmp/irsnd.h:31: error: expected '=', ',', ';', 'asm' or '__attribute__' 
before 'irsnd_is_busy'
irmp/irsnd.h:39: error: expected '=', ',', ';', 'asm' or '__attribute__' 
before 'irsnd_send_data'
irmp/irsnd.h:45: error: expected '=', ',', ';', 'asm' or '__attribute__' 
before 'irsnd_ISR'

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

eku schrieb:
> Leider geht SIEMENS nun nicht mehr zu übersetzen:

Sorry, hatte vergessen, die neuen SIEMENS-/RUWIDO-Konstanten an IRSND 
anzupassen.

Ist korrigiert.

Gruß,

Frank

von jar (Gast)


Lesenswert?

Frank M. schrieb:
> Und noch ein Update: Im SVN ist nun die neue IRMP-Version 1.9.5:

$Id: irmp.c,v 1.94 2011/02/22 14:24:00 fm Exp $

??? gerade geladen

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

jar schrieb:

> $Id: irmp.c,v 1.94 2011/02/22 14:24:00 fm Exp $

Das ist meine interne CVS-Version, die hat nichts mit der "offiziellen" 
Version des Gesamtpakets zu tun. Dass meine interne Versionsverwaltung 
gerade bei 1.94 angekommen ist, ist reiner Zufall. Das bedeutet 
lediglich, dass ich mittlerweile 94 historische Versionen von irmp.c 
habe. In den anderen Source-Dateien stehen ganz andere Zahlen, je 
nachdem, wie oft ich diese in meine interne Versionsverwaltung (CVS) 
eingecheckt habe.

Die "offizielle" Version des IRMP-Pakets steht in README.txt - und sonst 
nirgendwo ;-)

Gruß,

Frank

von jar (Gast)


Lesenswert?

danke

kennt oder hat jemand Scans oder Codes einer Canon RC1 RC5 RC6 
Fernbedienung für Canon Cams ?

von Fred (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

hatte nun mal wiede Zeit zum Testen. (Manchmal hat ein Steik auch was 
Gutes)

Also die Kathrein und die Ruwido Auswertung funktioniert schon mal 
perfekt.
Die IRC (IR60) funktioniert auch schon fast perfekt, nur bei zwei Tasten 
wird nichts erkannt. Ich habe eine Log für diese beiden Tasten 
angehängt. Vielleicht kann man daran was erkennen.

Die beiden anderen Dateien sind ein Scan mit einer Universal FB. Die 
haut im Scanmodus den Power-Off mit allen möglichen Kodierungen raus.
Die zweite Datei zeigt, was erkannt worden ist. Da kann ich für alle 
Variationen, die die FB kennt auch noch andere Logs liefern.

Ein kleines Problem hab ich noch entdeckt. Mit der Abtastrate 15k kann 
ich z.B. das RECS80 nicht aktivieren. Setze ich 20k, mag der RC5 und 
noch ein paar andere nicht.

Das dürfte wohl kein Problem sein, wenn man nur ein Protokoll braucht.

Mir schwebt aber noch ein Universalprüfgerät vor, das einfach alle Codes 
erkennt und dies auf dem LCD anzeigt. Mit dem IRMP brauchts dazu nur 
noch ein paar Routinen für das LCD.

Momentan haue ich die Daten nur über die Serielle raus. Mal sehen, ob 
das mit den LCD Routinen noch in den ATMEGA 8 reinpasst.

Fileupload geht anscheinend auch wieder.

Fred

von Klaus L. (Gast)


Lesenswert?

Fred schrieb:
> Mir schwebt aber noch ein Universalprüfgerät vor, das einfach alle Codes
> erkennt und dies auf dem LCD anzeigt. Mit dem IRMP brauchts dazu nur
> noch ein paar Routinen für das LCD.

Hallo Fred,

http://www.mikrocontroller-projekte.de/Mikrocontroller/IR-LCD/IR-LCD.html

braucht aber einen M168, dafür wenn gewünscht mit Bootloader.

Einfach die aktuellen irmp Files einbauen, habs bei mir mit Version 1.90 
laufen und werde die Seite demnächst mal mit der aktuellen Version 
updaten.

Grüße,
Klaus

von Klaus L. (Gast)


Lesenswert?

Ach ja, wegen dem Layout und der kompatibilität mit der alten Codevision 
Version geht hier leider kein Quarz. Kann mit einem anderen Layout 
natürlich angepasst werden.
Klaus

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Hallo Fred,

Fred schrieb:

> Also die Kathrein und die Ruwido Auswertung funktioniert schon mal
> perfekt.

Das freut mich, Danke für Deine Tests :-)

> Die IRC (IR60) funktioniert auch schon fast perfekt, nur bei zwei Tasten
> wird nichts erkannt. Ich habe eine Log für diese beiden Tasten
> angehängt. Vielleicht kann man daran was erkennen.

Ja, diese 2 Tasten senden einen kürzeren IR60-Frame (5 statt 7 bit) aus. 
Kannst Du damit leben, auf diese beiden Tasten zu verzichten? Sonst 
müsste ich da noch eine etwas kompliziertere Sonderbehandlung 
einbauen...

> Die zweite Datei zeigt, was erkannt worden ist. Da kann ich für alle
> Variationen, die die FB kennt auch noch andere Logs liefern.

Wow, nicht schlecht. 211 der 335 erkannten Scans sind NEC-Frames. Womit 
ich ja ganz gut mit meiner Meinung liege, dass NEC mittlerweile das am 
häufigsten eingesetzte Protokoll ist.

> Ein kleines Problem hab ich noch entdeckt. Mit der Abtastrate 15k kann
> ich z.B. das RECS80 nicht aktivieren. Setze ich 20k, mag der RC5 und
> noch ein paar andere nicht.

Die einzelnen Protokolle arbeiten mit derart verschiedenen Timings, dass 
es schwierig ist, sie alle unter einen Hut zu bekommen. Aus 
Speicherplatzgründen verwende ich für die Timing-Messvariablen uint8_t. 
Diese können bei 20kHz durchaus überlaufen. Daher ist 15kHz ein guter 
Kompromiss. RECS80 bzw. RECS80EXT könnte mit 15kHz vielleicht auch 
gerade noch laufen. Ich habe es selbst noch nicht getestet und habe bis 
heute von niemandem(!) ein positives Feedback zu RECS80 erhalten.

Nimm am Ende von irmpconfig.h die entsprechenden Passagen, welche RECS80 
und RECS80EXT bei unter 20kHz abschalten, einfach raus und teste das mit 
15kHz. Wenns geht, werde ich die untere Schranke für RECS80 auf 15kHz 
herabsetzen.

> Mir schwebt aber noch ein Universalprüfgerät vor, das einfach alle Codes
> erkennt und dies auf dem LCD anzeigt. Mit dem IRMP brauchts dazu nur
> noch ein paar Routinen für das LCD.

Wie Klaus Leidinger schon schrieb: so etwas gibt es bereits. Klaus hat 
seinen IR-Tester auch im IRMP-Artikel unter "IRMP-Projekte" eingetragen. 
Vielleicht tut Ihr Euch zusammen?

> Momentan haue ich die Daten nur über die Serielle raus. Mal sehen, ob
> das mit den LCD Routinen noch in den ATMEGA 8 reinpasst.

ATMega8 ist obsolet, nimm den Nachfolger ATMega88 oder - noch besser - 
den kompatiblen ATMega168. Damit kannst Du IRMP und IRSND zusammen in 
einem µC unterbringen und musst Dir keine Sorge um den Speicher machen.

Gruß,

Frank

von Fred (Gast)


Lesenswert?

Frank M. schrieb:
> Ja, diese 2 Tasten senden einen kürzeren IR60-Frame (5 statt 7 bit) aus.
> Kannst Du damit leben, auf diese beiden Tasten zu verzichten? Sonst
> müsste ich da noch eine etwas kompliziertere Sonderbehandlung
> einbauen...

Hallo,

wer macht denn sowas? Steht da auch im Datenblatt was von dieser 
komischen Art und Weise einfach kürzere Frames zu senden? Wegen mir wäre 
eine Sonderbehandlung nicht nötig. Ich hab halt nur die eine FB die IR60 
verwendet, deshalb kann ich nicht sagen, wie das bei anderen FB mit IR60 
aussieht. Vielleicht hat ja noch jemand eine (Universal)FB mit IR60 und 
könnte das mal testen.

Auch mit 20k und aktivierten RECS80 konnte ich meiner Universal FB da 
nichts entlocken. Das ist das billige Teil vom Aldi MD6461.

Beim Scan mit der Universal FB sind aber noch ein paar Codes nicht 
erkannt worden. Hast du da schon mal einen Blick darauf geworfen? Wenn 
du da noch was brauchst, kann ich da noch ein paar Scans machen und ggf. 
den Hersteller der den Code verwendet rausfinden.

Ich nehme eine ATMEGA8 her, weil ich da noch welche habe. :-)
Alternativ hätte ich noch ATMEGA48 (Speicher zu klein) oder dann die
16/32/644 noch.

Für ein einzelnes Protokoll müsste es doch auf einen ATTiny2313 zu 
kriegen sein. Da wären aber einigen Anpassungen nötig, ob das dann sich 
rentiert.

Fred

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Fred schrieb:

> wer macht denn sowas? Steht da auch im Datenblatt was von dieser
> komischen Art und Weise einfach kürzere Frames zu senden?

Keine Ahnung, kann man aber schön sehen, wenn man sich eine Zeile aus 
Deiner missing-Datei in den Editor lädt und dann noch irgendeine aus 
Deiner irc15k.txt reinholt. Die missing-Zeilen sind kürzer als alle aus 
der irc15k.txt.

> Auch mit 20k und aktivierten RECS80 konnte ich meiner Universal FB da
> nichts entlocken. Das ist das billige Teil vom Aldi MD6461.

Ich habe mir die Scans aus der universal-Datei angeschaut. Insgesamt 
9mal erkennt IRMP zunächst RECS80 am Startbit, scheitert dann aber an 
der Framelänge. Diese sind 6, 7 oder meist 9 Bit lang. IRMP erwartet 
aber immer eine Länge von 11 Bits.

Entweder ist die Doku unter

  http://www.sbprojects.com/knowledge/ir/recs80.htm

(nach der ich vorgegangen bin) falsch oder es gibt weitere 
RECS80-Abarten. Jedenfalls passen die Timings der Startbits und auch der 
Datenbits perfekt - es scheitert aber immer an der Framelänge.

> Beim Scan mit der Universal FB sind aber noch ein paar Codes nicht
> erkannt worden. Hast du da schon mal einen Blick darauf geworfen?

Ja, siehe oben. Ich werde sie mir auch noch detaillierter anschauen. 
IRMP nimmt auch oft RUWIDO an, weil die Startbits passen, scheitert dann 
aber später an den Längen der Datenbits, die zu RUWIDO überhaupt nicht 
passen. Was das genau ist, kann ich jetzt noch nicht sagen.

> Wenn
> du da noch was brauchst, kann ich da noch ein paar Scans machen und ggf.
> den Hersteller der den Code verwendet rausfinden.

Ja, darauf komme ich gern nochmal zurück.

> Ich nehme eine ATMEGA8 her, weil ich da noch welche habe. :-)

Okay.

> Für ein einzelnes Protokoll müsste es doch auf einen ATTiny2313 zu
> kriegen sein.

Das wird zu knapp - jedenfalls in Verbindung mit einem LCD. Und nur ein 
IR-Protokoll ist langweilig ;-)

Gruß,

Frank

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Frank M. schrieb:

> Ich habe mir die Scans aus der universal-Datei angeschaut. Insgesamt
> 9mal erkennt IRMP zunächst RECS80 am Startbit, scheitert dann aber an
> der Framelänge. Diese sind 6, 7 oder meist 9 Bit lang. IRMP erwartet
> aber immer eine Länge von 11 Bits.

Das Problem habe ich klären können. Ich habe mich damals, als ich das 
RECS80-Protokoll in den IRMP eingebaut habe, verzählt. RECS80 hat nur 1 
Start-Bit, nicht 2. Das gibt es nur beim RECS80EXT-Protokoll.

Ich habe das im IRMP korrigiert und schon konnte IRMP die RECS80-Frames 
von der Universal-Fernbedienung auch lesen. Dass es im Scan von Fred 
auch kürzere RECS80-Frames gab, lag einfach daran, dass nach 3 Frames 
innerhalb einer Textzeile der Log-Buffer voll war.

Damit sollte das immerwährende Rätsel, ob IRMP überhaupt RECS80 
versteht, endlich gelöst sein:

Es geht erst ab Version 1.9.6, habe ich ins SVN eingecheckt :-)

Ausserdem klappt es bestens bei 15kHz, ich habe daher die untere 
Scanfrequenz für RECS80 auf 15kHz (statt 20kHz) korrigiert.

Damit sollten nun alle von IRMP unterstützten IR-Protokolle bei 15kHz 
prima gelesen werden.

Gruß,

Frank

von Bastian F. (bastian_f)


Lesenswert?

Sorry, dass ich schon wieder nerven muss.
Ich habe jetzt, hier aus dem Thread übernommen, folgendes in main:
1
   if (irmp_get_data (&irmp_data))
2
    {
3
        itoa(irmp_data.protocol, protocol, 10);
4
        itoa(irmp_data.address, address, 16);
5
        itoa(irmp_data.command, command, 16);
6
7
        lcd_string(protocol);
8
        lcd_string(address);
9
        lcd_string(command);
10
     }

Nur leider kommt auf dem LCD nichts an (die Ansteuerung des LCD 
funktioniert, daran liegt es nicht).
Am "Outpin" des IR Receivers kann ich mit meinem Multimeter 
unterschiedliche Frequenzen messen, wenn ich Knöpfe einer FB drücke, 
aber wie gesagt, es kommt nichts an oder wird nichts ausgegeben.
Atmega88, Fuses (direct hex values) low: E2, high: DC, ext.: 01
Int. RC Osc. 8MHz; Start-up time PWRDWN/RESET : 6 CK/14 CK + 65 ms
PB6 ist der "Eingangspin".

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Bastian F. schrieb:

> Ich habe jetzt, hier aus dem Thread übernommen, folgendes in main:
1
>     if (irmp_get_data (&irmp_data))
2
>     {
3
>         itoa(irmp_data.protocol, protocol, 10);
4
>         itoa(irmp_data.address, address, 16);
5
>         itoa(irmp_data.command, command, 16);
6
> 
7
>         lcd_string(protocol);
8
>         lcd_string(address);
9
>         lcd_string(command);
10
>      }

Wie ist bei Dir protocol, address und command definiert? Bitte zeige die 
ganze main-Funktion.

> Nur leider kommt auf dem LCD nichts an (die Ansteuerung des LCD
> funktioniert, daran liegt es nicht).

Wenn Du in den if-Block ein

  lcd_string("Hallo");

einbaust, erscheint das dann auf dem LCD, wenn Du eine FB-Taste drückst?

Welche FBs hast Du ausprobiert?

> Atmega88, Fuses (direct hex values) low: E2, high: DC, ext.: 01
> Int. RC Osc. 8MHz; Start-up time PWRDWN/RESET : 6 CK/14 CK + 65 ms

Sieht okay aus.

> PB6 ist der "Eingangspin".

Zeige bitte die entsprechende Stelle in irmpconfig.h. Am besten hängst 
Du diese hier mal an, damit man sieht, was Du alles so eingestellt hast.

Gruß,

Frank

von Bastian F. (bastian_f)


Angehängte Dateien:

Lesenswert?

Frank M. schrieb:
> Wie ist bei Dir protocol, address und command definiert? Bitte zeige die
> ganze main-Funktion.
1
main (void)
2
{
3
  char protocol[10];
4
  char address[10];
5
  char command[10];
6
7
  IRMP_DATA irmp_data;
8
  lcd_init();
9
  irmp_init();                                                              // initialize rc5
10
  timer_init();                                                             // initialize timer
11
  sei ();                                                                   // enable interrupts
12
13
  for (;;)
14
  {
15
16
    if (irmp_get_data (&irmp_data))
17
    {
18
      itoa(irmp_data.protocol, protocol, 10);
19
        itoa(irmp_data.address, address, 16);
20
        itoa(irmp_data.command, command, 16);
21
22
        lcd_string(protocol);
23
        lcd_string(address);
24
        lcd_string(command);
25
    }
26
  }
27
}
>
>> Nur leider kommt auf dem LCD nichts an (die Ansteuerung des LCD
>> funktioniert, daran liegt es nicht).
>
> Wenn Du in den if-Block ein
>
>   lcd_string("Hallo");
>
> einbaust, erscheint das dann auf dem LCD, wenn Du eine FB-Taste drückst?

Nein, hatte ich auch schon getestet, nur vergessen zu erwähnen.
Sieht nach falscher Verkabelung aus, oder?

> Welche FBs hast Du ausprobiert?

Kathrein, Samsung, Grundig, Pioneer, Philips

>> Atmega88, Fuses (direct hex values) low: E2, high: DC, ext.: 01
>> Int. RC Osc. 8MHz; Start-up time PWRDWN/RESET : 6 CK/14 CK + 65 ms
>
> Sieht okay aus.

Wenigstens etwas ;)

>> PB6 ist der "Eingangspin".
>
> Zeige bitte die entsprechende Stelle in irmpconfig.h. Am besten hängst
> Du diese hier mal an, damit man sieht, was Du alles so eingestellt hast.

s.o.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Bastian F. schrieb:
> Nein, hatte ich auch schon getestet, nur vergessen zu erwähnen.
> Sieht nach falscher Verkabelung aus, oder?

Kann man so nicht sagen, wenn IRMP nichts erkennt, wird auch das "Hallo" 
nicht ausgegeben. Du könntest natürlich, um sicher zu gehen, ein 
lcd_print ("Start"); mal vor die while-Schleife setzen. Wenn das 
kommt, ist das LCD schon mal kein Problem.

Bleibt dann IRMP...

>> Welche FBs hast Du ausprobiert?
> Kathrein, Samsung, Grundig, Pioneer, Philips

Komisch... Zumindest die Samsung sollte mit den Standard-Einstellungen 
gehen. Hast Du sonst nix japanisches dabei? ;-)

Aktiviere bitte zusätzlich in irmpconfig.h:

IRMP_SUPPORT_RC6_PROTOCOL             (wegen deiner Kathrein FB)
IRMP_SUPPORT_RUWIDO_PROTOCOL          (nur mal so)
IRMP_SUPPORT_GRUNDIG_PROTOCOL         (wegen Grundig)
IRMP_SUPPORT_NOKIA_PROTOCOL           (auch wegen Grundig)

Keine Ahnung, was Pioneer so benutzt.

Sonst sieht die irmpconfig.h ganz gut aus.

EDIT: Welche IRMP-Version benutzt Du?

Gruß,

Frank

von Bastian F. (bastian_f)



Lesenswert?

Wie gesagt, das LCD bzw dessen Ansteuerung funktioniert.
Ich meinte auch eher den IR Receiver, obwohl man da ja eigentlich nicht 
vie falsch machen kann. Zumal ich ich ja auch was am Ausgang messen 
kann.
(Aber sicherheitshalber mal die Belegung (TSOP1838, Datenblatt im 
Anhang. Vcc/Gnd ist wie vorgeschrieben mit Widerstand und Kondensator 
beschaltet):
Von vorne gesehen:
Links: Out
Mitte: Gnd
Rechts: Vcc)
Ne, komischerweise nichts japanisches im Haushalt vorhanden.

Habe die von dir erwähnten Protokolle aktiviert, aber keine Änderung.

Ich weiß nicht welche ich vorher hatte, jedenfalls funktioniert es mit 
der aktuellsten auch nicht - grade getestet.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Bastian F. schrieb:

> Habe die von dir erwähnten Protokolle aktiviert, aber keine Änderung.

Ich habe keine Idee mehr, Du benutzt das AVR-Studio und F_CPU steht auf 
8 MHz?

Gruß,

Frank

von Bastian F. (bastian_f)


Lesenswert?

Sehr seltsam.
Habe mal auf PB4 gewechselt und siehe da, es funktioniert...
Was aber zudem sehr komisch ist, dass wenn ich DDRC mit dem LED Port 
verbinde leuchten die LED je nach Tastendruck unterschiedlich aus, 
obwohl nichts davon im Code steht.
Wie kann man dies erklären?
Wie irgendwann oben erwähnt, läuft das ganze auf/mit einem STK500.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Bastian F. schrieb:

> Habe mal auf PB4 gewechselt und siehe da, es funktioniert...

Gratuliere! :-)

Ich kenne das STK500 nicht, aber kannn es sein, dass an PB6 ein Quarz 
hängt?

> Was aber zudem sehr komisch ist, dass wenn ich DDRC mit dem LED Port
> verbinde leuchten die LED je nach Tastendruck unterschiedlich aus,
> obwohl nichts davon im Code steht.

Was ist DDRC?

> Wie kann man dies erklären?

Keine Ahnung, was da auf dem STK500 verdrahtet ist.

Werden nun alle FBs erkannt?

Gruß,

Frank

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Version 1.9.8 ist nun im SVN, zwei neue Protokolle zum Testen sind 
hinzugekommen:

1. NETBOX: Infrarot-Tastatur für die Netbox, erhältlich bei Pollin unter
   der Bestellnr. 711 009 für 1 EUR :-)
   Die Netbox-Tastatur wird momentan aber nur erkannt, wenn man das
   RC6-Protokoll in IRMP abschaltet. Da muss ich noch was dran tun...

2. NEC16: Eine Abart des Standard-NEC-Protokolls (32 bit), welches nur
   16 Bit sendet. Dieses habe ich aus den Universal-FB-Scans von Fred
   extrahiert und in den IRMP eingebaut.

Sobald die Netbox-Tastatur rundläuft, werde ich auch ein neues Release 
im Download-Bereich des IRMP-Artikels zur Verfügung stellen.

Gruß,

Frank

von Fred (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

ich hab nun gleich die neuen Version geholt. Die LCD Routinen sind nun 
auch
eingebunden und die Ausgabe funktioniert. Der Flash in nun zu 90% 
gefüllt, mal sehen, was da noch für Protokolle reingehen :-)

Im Anhang der Scan wieder mit meiner Universal FB. Es werden schon 
einige
mehr erkannt.

Fred

von Bastian F. (bastian_f)


Lesenswert?

Frank M. schrieb:
> Bastian F. schrieb:
>
>> Habe mal auf PB4 gewechselt und siehe da, es funktioniert...
>
> Gratuliere! :-)

Danke, nur verstehen tue ich es nicht.
Egal, läuft ja erstmal ;-)

> Ich kenne das STK500 nicht, aber kannn es sein, dass an PB6 ein Quarz
> hängt?
>
>> Was aber zudem sehr komisch ist, dass wenn ich DDRC mit dem LED Port
>> verbinde leuchten die LED je nach Tastendruck unterschiedlich aus,
>> obwohl nichts davon im Code steht.
>
> Was ist DDRC?

Die "PCx Reihe".

>> Wie kann man dies erklären?
>
> Keine Ahnung, was da auf dem STK500 verdrahtet ist.

Erst nachdenken, dann doofe Fragen stellen...
An PORTC hängt auch das Display :-|

> Werden nun alle FBs erkannt?

Alle bis auf die Pioneer.
Da reagiert alles sehr "träge" und es werden nicht alles Tastendrücke 
erkannt.

von eku (Gast)


Lesenswert?

Hallo Uwe,

neue Probleme mit den letzten Änderungen im SVN:

irmp.c: In function 'irmp_rx_process':
hardware/ir/irmp/irmp_lib.c:2712: warning: conversion to 'uint8_t' from 
'int' may alter its value
irmp.c:2727: warning: conversion to 'PAUSE_LEN' from 'int' may alter its 
value
irmp.c:2911: error: 'irmp_tmp_id' undeclared (first use in this 
function)
irmp.c:2911: error: (Each undeclared identifier is reported only once
irmp.c:2911: error: for each function it appears in.)

Die Zeilennummer können abweichen, da ich für ethersex noch ein paar 
Anpassungen einfügen musste.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Hi eku,

eku schrieb:
> Hallo Uwe,

Wer ist Uwe? ;-)

> irmp.c: In function 'irmp_rx_process':
> hardware/ir/irmp/irmp_lib.c:2712: warning: conversion to 'uint8_t' from
> 'int' may alter its value

irmp_rx_process() kenne ich nicht - nicht von mir ;-)

> irmp.c:2727: warning: conversion to 'PAUSE_LEN' from 'int' may alter its
> value
> irmp.c:2911: error: 'irmp_tmp_id' undeclared (first use in this
> function)
> irmp.c:2911: error: (Each undeclared identifier is reported only once
> irmp.c:2911: error: for each function it appears in.)
>
> Die Zeilennummer können abweichen, da ich für ethersex noch ein paar
> Anpassungen einfügen musste.

Da müsstest Du mir dann schon die Stellen im Source zeigen... und auch 
die dazugehörige irmpconfig.h. Bei mir compiliert das einwandfrei durch.

Gruß,

Frank

von eku (Gast)


Lesenswert?

Hallo Frank,

die Variable irmp_tmp_id ist nur für Samsung deklariert, wird aber auch 
von Kathrein benutzt.

von eku (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Frank,

ich habe Probleme mit dem RC5-Code von IRSND. Eine DVD-Player-FB sendet 
nachweislich RC5, die von IRMP auch erkannt wird (rc5_org). Ich habe 
eine Universal-FB damit angelernt (rc5_uni). Mit beiden kann ich den 
DVD-Player steuern. Nutze ich allerdings IRSND gibt es sowohl beim 
Anlernen durch die Universal-FB (statt zu lernen wird ein Fehler 
gemeldet) als auch bei der Bedienung des DVD-Players Probleme nicht 
erkannter Codes.

Kann es an Toleranzen des Timings liegen oder ist der RC5-Code in IRSND 
fehlerhaft? Was kann ich tun um Dir die nötigen Diagnosedaten zu 
liefern?

Gruß, eku

von eku (Gast)


Lesenswert?

Hallo Frank,

Variable irmp_bit in irmp.c wird zweimal deklariert.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

eku schrieb:

> die Variable irmp_tmp_id ist nur für Samsung deklariert, wird aber auch
> von Kathrein benutzt.

Schmeiss sie einfach im Kathrein-Code raus. Sie wird dort gesetzt, aber 
nicht weiter genutzt. Korrektur werde ich demnächst einchecken.

Gruß,

Frank

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

eku schrieb:
> Variable irmp_bit in irmp.c wird zweimal deklariert.

Danke, habe ich auch korrigiert.

Gruß,

Frank

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

eku schrieb:
> Kann es an Toleranzen des Timings liegen oder ist der RC5-Code in IRSND
> fehlerhaft? Was kann ich tun um Dir die nötigen Diagnosedaten zu
> liefern?

IRSND erzeugt unter Linux auf stdout IRMP-Scans. Ich habe mal dieselben 
Codes vom IRSND erzeugen lassen. Dann habe ich die Zeichenfolgen von 
rc5_org und die von IRSND erzeugten im Editor zeilenweise untereinander 
betrachtet. Die Puls-/Pausenfolgen sind identisch - wenn man mal von dem 
Toggle-Bit absieht, was man bei IRSND unter Linux nicht testen kann, 
weil man da nur einen Frame pro Kommando-Aufruf "senden" kann.

Die von IRSND erzeugten Pulse sind etwas kürzer als die von rs5_org. Die 
Puls-/Pausenzeiten sind bei rc5_org ca. 950 µs, die vom IRSND erzeugten 
liegen bei 866µs, was etwas näher am dokumentieren Ideal von 889µs 
liegt.

Gruß,

Frank

von Fred (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

ich hab mal den Scan mit der Universal FB mit den Ausgaben zu verbinden.

Leider klappt das nicht ganz so gut. Wäre das nicht mal noch ne Idee, 
das in die Logfunktion zu integrieren? Es würde ja der erkannte 
Hersteller genügen.
Also in der Richtung:

#0x11   (wenn z.B. der Siemens Code erkannt wurde)
111100000111110011110000111

#       (wenn nicht)
000011111111100000000111111

So wirds vielleicht lesbarer und die anderen Tools dürften damit kein 
Problem haben.


Fred

von Chan (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

Ich benutze irmp unter CodeVision aber ich bekomme gleich am Anfang 
einige Fehlermeldungen vom Compiler...

was muss ich machen ?

lg

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Fred schrieb:

> Leider klappt das nicht ganz so gut. Wäre das nicht mal noch ne Idee,
> das in die Logfunktion zu integrieren? Es würde ja der erkannte
> Hersteller genügen.

Das wird schwierig. Die Log-Funktion arbeitet aus dem Interrupt heraus. 
Wann diese ihren Buffer flusht, ist nicht vorhersagbar, läuft daher 
asynchron zur Frame-Erkennung. Die Erkennung vor(!) der Ausgabe der 
Einsen/Nullen rauszublasen, ist dann fast unmöglich.

Ich schau mal, was ich machen kann.

Gruß,

Frank

von Telekom (Gast)


Lesenswert?

Hallo,

war nur mal so eine Idee.

Ich hab mal meine main.c so umgebaut, das "Zeitmarken" in die Log
geschrieben werden. Wenn ich nun den Scan der Universal-FB laufen lasse,
sehe ich anhand der Marken, welche Codes erkannt wurden und welche 
nicht. Hast du noch ein paar Codes entdeckt, die sich lohnen würden 
näher zu betrachten?

Mal noch so eine nette Idee: Da ich die beiden Pollinboards verwende und 
sich darauf ein NF-Verstärker befindet, hab ich mal einen Lautsprecher 
angeschlossen und den Eingang mit dem TSOP verbunden. Ich kann jetzt 
schon ein paar Codes am Klang erkennen :-)

Fred

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Hi Fred,

Telekom schrieb:

> Ich hab mal meine main.c so umgebaut, das "Zeitmarken" in die Log
> geschrieben werden. Wenn ich nun den Scan der Universal-FB laufen lasse,
> sehe ich anhand der Marken, welche Codes erkannt wurden und welche
> nicht.

Interessant, die Änderungen kannst Du mir ja mal zeigen.

> Hast du noch ein paar Codes entdeckt, die sich lohnen würden
> näher zu betrachten?

Ja, soviel "anderes" als das, was IRMP nicht schon kennt, ist da gar 
nicht mehr drin. Ich hab das mal statistisch analysiert. IRMP erkennt 
über 80 Prozent. Neben dem NEC16-Protokoll, was ich ja noch eingebaut 
habe, kommen da sehr oft Frames vor, die dem NEC-Timing entsprechen, 
aber 40 statt 32 Bit haben. Wenn ich das auch einbauen würde, wären wir 
bei über 90 Prozent. Aber bisher hat mir noch keiner sowas mal gezeigt, 
daher weiß ich nicht, ob der Aufwand sich lohnt, ein NEC40-Protokoll in 
den IRMP zu integrieren... Ausserdem müsste ich da überlegen, wie ich 
die 40 Bit in eine 16-Bit-Adresse und ein 16-Bit-Kommando zerlege. 
Vermutlich wird Redundanz drin sein, die man rausoptimieren kann, um das 
in 16+16 Bit reinzuquetschen. Aber ob die paar NEC40-Frames ausreichen? 
Da bräuchte ich schon systematische Scans der Tasten 0-9, besser noch 
mehr. Alternativ wäre natürlich ein Link auf eine passende Doku 
hilfreich.

> Mal noch so eine nette Idee: Da ich die beiden Pollinboards verwende und
> sich darauf ein NF-Verstärker befindet, hab ich mal einen Lautsprecher
> angeschlossen und den Eingang mit dem TSOP verbunden. Ich kann jetzt
> schon ein paar Codes am Klang erkennen :-)

lach Sehr nette Idee! :-)

Gruß,

Frank

von Jan B. (berge)


Angehängte Dateien:

Lesenswert?

Hallöchen zusammen,

da ich ARM MCUs einsetze, musste ich ein wenig am IRMP drehen, damit er 
anwendbar wird. Meine Änderungen sind nicht gravierend und sicher nicht 
optimal, aber funktionieren. Da sie auch für andere interessant sein 
könnten, poste ich sie hier.

Im Wesentlichen habe ich das define IRMP_FLEXIBLE_VERSION hinzugefuegt 
und die Funktion für die ISR so angepasst, dass sie nun einen 
übergebenen Wert verarbeitet. Somit ist man von der Zielarchitektur 
relativ unabhängig und übergibt lediglich den Pinstatus.

Vielen Dank an alle Entwickler des IRMP!

Liebe Grüße,

Jan

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Jan Berg schrieb:

> da ich ARM MCUs einsetze, musste ich ein wenig am IRMP drehen, damit er
> anwendbar wird. Meine Änderungen sind nicht gravierend und sicher nicht
> optimal, aber funktionieren. Da sie auch für andere interessant sein
> könnten, poste ich sie hier.

Erstmal danke für die Änderungsvorschläge. Ich werde sie in ähnlicher 
Form übernehmen. Die Namensgebung IRMP_FLEXIBLE_VERSION finde ich etwas 
unglücklich gewählt. Eine Alternative wäre IRMP_GENERIC_INTERFACE oder 
etwas ähnliches in der Art. Ich muss mal drüber nachdenken.

Gruß,

Frank

von jar (Gast)


Lesenswert?

ich würde gerne den Timer1 zu Timer 0 tauschen, sehe ich das richtig das 
im Prinzip nur um die 15000 Interrupts nötig sind ? deswegen einen 16 
Bit Timer nehmen müsste nicht sein ?

wenn ich das soweit überblicke könnte ich auch meine HW mit dani code 
ersetzen, Timer0 -> 8 MHz CPU Vorteiler 256 -> Timer compare auf -2 gibt 
overflow nach 512 Takte = 64 µs das sind genau 15625 Interrupts pro 
Sekunde und damit in die IRMP-ISR, dann müsste der Timer 1 wieder völlig 
frei sein, oder hab ich was übersehen ?

danke

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

jar schrieb:
> ich würde gerne den Timer1 zu Timer 0 tauschen, sehe ich das richtig das
> im Prinzip nur um die 15000 Interrupts nötig sind ?

Richtig. Es müssen auch nicht exakt 15000 Interrupts/sec sein. Aber Du 
solltest den exakten Wert für F_INTERRUPTS angeben.

> deswegen einen 16 Bit Timer nehmen müsste nicht sein ?

Nein, muss nicht sein.

> wenn ich das soweit überblicke könnte ich auch meine HW mit dani code
> ersetzen, Timer0 -> 8 MHz CPU Vorteiler 256 -> Timer compare auf -2 gibt
> overflow nach 512 Takte = 64 µs das sind genau 15625 Interrupts pro
> Sekunde und damit in die IRMP-ISR, dann müsste der Timer 1 wieder völlig
> frei sein, oder hab ich was übersehen ?

Sollte gehen. Wenns läuft, schick mir bitte Deine Code-Änderungen. Dann 
baue ich das als Alternative zum 16-Bit-Timer ein.

Gruß,

Frank

von jar (Gast)


Lesenswert?

Frank M. schrieb:
> Sollte gehen. Wenns läuft, schick mir bitte Deine Code-Änderungen. Dann
>
> baue ich das als Alternative zum 16-Bit-Timer ein.

OK ich versuchs mal, danke spart mir ne Menge reverse engeniering
mit Dani Code meinte ich:
Beitrag "Fernbedien RC5 Empfänger"

von eku (Gast)


Lesenswert?

Hallo Frank,

Frank M. schrieb:
> Die Namensgebung IRMP_FLEXIBLE_VERSION finde ich etwas
> unglücklich gewählt. Eine Alternative wäre IRMP_GENERIC_INTERFACE oder
> etwas ähnliches in der Art. Ich muss mal drüber nachdenken.

Da gibt doch schon was im Code: IRMP_USE_AS_LIB

Im IRMP-Port nach ethersex habe ich die Port- und Timerprogrammierung 
herausgezogen: 
https://github.com/ethersex/ethersex/tree/master/hardware/ir/irmp

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Hi eku,

eku schrieb:

>> Die Namensgebung IRMP_FLEXIBLE_VERSION finde ich etwas
>> unglücklich gewählt. Eine Alternative wäre IRMP_GENERIC_INTERFACE oder
>> etwas ähnliches in der Art. Ich muss mal drüber nachdenken.
>
> Da gibt doch schon was im Code: IRMP_USE_AS_LIB

Das ist was ganz anderes! Hier geht es darum, den Source per Include zu 
laden, um ihn in ein eigenes Projekt einzubinden. Aber nicht zum Linken, 
sondern At-Compile-Time. Vielleicht werde ich das Vorgehen dazu mal im 
IRMP-Artikel dokumentieren. Bis dato nutze nur ich selbst dieses 
Feature.

> Im IRMP-Port nach ethersex habe ich die Port- und Timerprogrammierung
> herausgezogen:
> https://github.com/ethersex/ethersex/tree/master/hardware/ir/irmp

Danke, schaue ich mir an.

Sicherlich kann man den IRMP-Source allgemeiner halten und das 
µC-spezifische komplett raushalten. Für Linux und Windows wird das ja 
schon gemacht. Den Zustand des IR-Empfängers als Argument an das 
IRMP-Working-Horse zu übergeben ist ja keine schlechte Idee von Jan 
Berg. Nur kostet so eine Argumentübergabe etwas Zeit (Parameterübergabe 
über Stack) und die wollte ich vermeiden. Das hört sich zwar wegen der 
ziemlich großen Codelänge der ISR jetzt paradox an, ist aber angesichts 
der sehr geringen Durchlaufzeit der Interrupt-Routine als State-Machine 
trotzdem sinnvoll. Die ISR verbrät eigentlich nur in dem (kurzen) Moment 
Zeit, wenn sie das zugehörige Protokoll zum erkannten Startbit sucht.

Ich muss mal drüber nachdenken.

Gruß,

Frank

von jar (Gast)


Lesenswert?

Frank M. schrieb:
> Sollte gehen. Wenns läuft, schick mir bitte Deine Code-Änderungen. Dann
> baue ich das als Alternative zum 16-Bit-Timer ein.

so nun läufts endlich,
1
// wo auch immer
2
void timer0_init(void)
3
{
4
  TCCR0B = 1<<CS02;      //divide by 256
5
  TCNT0 = -2;          // 2 * 256 = 512 cycle bei 8 MHz
6
  TIMSK0 = 1<<TOIE0;    //enable timer interrupt
7
}
8
9
// in IRMP.C 
10
SIGNAL (SIG_OVERFLOW0)
11
{
12
  TCNT0 = -2;
13
  irmp_ISR ();
14
}
15
16
//---------------- ab hier nur kalk-hilfe
17
18
19
20
21
/* kleine kalk-Hilfe in qbasic, wer mag kanns auch in C umschreiben
22
CLS
23
OPEN "timer0.h" FOR OUTPUT AS #1
24
j = 1
25
26
PRINT #1, "//", "TCCR0B"
27
PRINT #1, "//", "CS02  CS01  CS00  Description"
28
PRINT #1, "//", "0     0     0     No clock source (Timer/Counter stopped)"
29
PRINT #1, "//", "0     0     1     clkI/O/(No prescaling)"
30
PRINT #1, "//", "0     1     0     clkI/O/8 (From prescaler)"
31
PRINT #1, "//", "0     1     1     clkI/O/64 (From prescaler)"
32
PRINT #1, "//", "1     0     0     clkI/O/256 (From prescaler)"
33
PRINT #1, "//", "1     0     1     clkI/O/1024 (From prescaler)"
34
35
36
PRINT #1, "//", "F_CPU / MHz", "Interrupts", "TCCR0B", "TCNT0"
37
38
FOR f1 = 1 TO 20 STEP 1
39
f = f1
40
nochmal:
41
FOR d = 1 TO 30
42
FOR e = 0 TO 6 STEP 3
43
REM 2^0 2^3 2^6 2^8 2^10
44
IF (f * 1000000 / (2 ^ e)) / d >= 10000 AND (f * 1000000 / (2 ^ e)) / d <= 21000 THEN
45
   PRINT #1, "//", f, INT((f * 1000000 / (2 ^ e)) / d), 2 ^ e, -d;
46
   IF (2 ^ e) = 8 THEN PRINT #1, "-> "; CHR$(9); "TCCR0B=(CS01);"; CHR$(9); "TCNT0 = "; -d; ";"
47
   IF (2 ^ e) = 64 THEN PRINT #1, "-> "; CHR$(9); "TCCR0B=(CS01 | CS00);"; CHR$(9); "TCNT0 = "; -d; ";"
48
   IF (2 ^ e) = 256 THEN PRINT #1, "-> "; CHR$(9); "TCCR0B = (CS02); "; CHR$(9); "TCNT0 = "; -d; ";"
49
   IF (2 ^ e) = 1024 THEN PRINT #1, "-> "; CHR$(9); "TCCR0B=(CS02| CS00);"; CHR$(9); "TCNT0 = "; -d; ";"
50
51
   j = j + 1
52
END IF
53
NEXT e
54
NEXT d
55
FOR d = 1 TO 30
56
FOR e = 8 TO 10 STEP 2
57
IF (f * 1000000 / (2 ^ e)) / d >= 10000 AND (f * 1000000 / (2 ^ e)) / d <= 21000 THEN
58
   PRINT #1, "//", f, INT((f * 1000000 / (2 ^ e)) / d), 2 ^ e, -d;
59
   IF (2 ^ e) = 8 THEN PRINT #1, "-> "; CHR$(9); "TCCR0B=(CS01);"; CHR$(9); "TCNT0 = "; -d; ";"
60
   IF (2 ^ e) = 64 THEN PRINT #1, "-> "; CHR$(9); "TCCR0B=(CS01 | CS00);"; CHR$(9); "TCNT0 = "; -d; ";"
61
   IF (2 ^ e) = 256 THEN PRINT #1, "-> "; CHR$(9); "TCCR0B = (CS02); "; CHR$(9); "TCNT0 = "; -d; ";"
62
   IF (2 ^ e) = 1024 THEN PRINT #1, "-> "; CHR$(9); "TCCR0B=(CS02| CS00);"; CHR$(9); "TCNT0 = "; -d; ";"
63
  
64
   j = j + 1
65
END IF
66
NEXT e
67
NEXT d
68
IF f = 7 THEN
69
   f = 7.373
70
   GOTO nochmal
71
END IF
72
IF f = 14 THEN
73
   f = 14.318
74
   GOTO nochmal
75
END IF
76
NEXT f1
77
78
*/
79
80
81
82
83
84
//            TCCR0B
85
//            CS02  CS01  CS00  Description
86
//            0     0     0     No clock source (Timer/Counter stopped)
87
//            0     0     1     clkI/O/(No prescaling)
88
//            0     1     0     clkI/O/8 (From prescaler)
89
//            0     1     1     clkI/O/64 (From prescaler)
90
//            1     0     0     clkI/O/256 (From prescaler)
91
//            1     0     1     clkI/O/1024 (From prescaler)
92
//            F_CPU / MHz   Interrupts    TCCR0B        TCNT0
93
//             1             15625         64           -1 ->   TCCR0B=(CS01 | CS00);  TCNT0 = -1 ;
94
//             1             20833         8            -6 ->   TCCR0B=(CS01);  TCNT0 = -6 ;
95
//             1             17857         8            -7 ->   TCCR0B=(CS01);  TCNT0 = -7 ;
96
//             1             15625         8            -8 ->   TCCR0B=(CS01);  TCNT0 = -8 ;
97
//             1             13888         8            -9 ->   TCCR0B=(CS01);  TCNT0 = -9 ;
98
//             1             12500         8            -10 ->   TCCR0B=(CS01);  TCNT0 = -10 ;
99
//             1             11363         8            -11 ->   TCCR0B=(CS01);  TCNT0 = -11 ;
100
//             1             10416         8            -12 ->   TCCR0B=(CS01);  TCNT0 = -12 ;
101
//             2             15625         64           -2 ->   TCCR0B=(CS01 | CS00);  TCNT0 = -2 ;
102
//             2             10416         64           -3 ->   TCCR0B=(CS01 | CS00);  TCNT0 = -3 ;
103
//             2             20833         8            -12 ->   TCCR0B=(CS01);  TCNT0 = -12 ;
104
//             2             19230         8            -13 ->   TCCR0B=(CS01);  TCNT0 = -13 ;
105
//             2             17857         8            -14 ->   TCCR0B=(CS01);  TCNT0 = -14 ;
106
//             2             16666         8            -15 ->   TCCR0B=(CS01);  TCNT0 = -15 ;
107
//             2             15625         8            -16 ->   TCCR0B=(CS01);  TCNT0 = -16 ;
108
//             2             14705         8            -17 ->   TCCR0B=(CS01);  TCNT0 = -17 ;
109
//             2             13888         8            -18 ->   TCCR0B=(CS01);  TCNT0 = -18 ;
110
//             2             13157         8            -19 ->   TCCR0B=(CS01);  TCNT0 = -19 ;
111
//             2             12500         8            -20 ->   TCCR0B=(CS01);  TCNT0 = -20 ;
112
//             2             11904         8            -21 ->   TCCR0B=(CS01);  TCNT0 = -21 ;
113
//             2             11363         8            -22 ->   TCCR0B=(CS01);  TCNT0 = -22 ;
114
//             2             10869         8            -23 ->   TCCR0B=(CS01);  TCNT0 = -23 ;
115
//             2             10416         8            -24 ->   TCCR0B=(CS01);  TCNT0 = -24 ;
116
//             2             10000         8            -25 ->   TCCR0B=(CS01);  TCNT0 = -25 ;
117
//             3             15625         64           -3 ->   TCCR0B=(CS01 | CS00);  TCNT0 = -3 ;
118
//             3             11718         64           -4 ->   TCCR0B=(CS01 | CS00);  TCNT0 = -4 ;
119
//             3             20833         8            -18 ->   TCCR0B=(CS01);  TCNT0 = -18 ;
120
//             3             19736         8            -19 ->   TCCR0B=(CS01);  TCNT0 = -19 ;
121
//             3             18750         8            -20 ->   TCCR0B=(CS01);  TCNT0 = -20 ;
122
//             3             17857         8            -21 ->   TCCR0B=(CS01);  TCNT0 = -21 ;
123
//             3             17045         8            -22 ->   TCCR0B=(CS01);  TCNT0 = -22 ;
124
//             3             16304         8            -23 ->   TCCR0B=(CS01);  TCNT0 = -23 ;
125
//             3             15625         8            -24 ->   TCCR0B=(CS01);  TCNT0 = -24 ;
126
//             3             15000         8            -25 ->   TCCR0B=(CS01);  TCNT0 = -25 ;
127
//             3             14423         8            -26 ->   TCCR0B=(CS01);  TCNT0 = -26 ;
128
//             3             13888         8            -27 ->   TCCR0B=(CS01);  TCNT0 = -27 ;
129
//             3             13392         8            -28 ->   TCCR0B=(CS01);  TCNT0 = -28 ;
130
//             3             12931         8            -29 ->   TCCR0B=(CS01);  TCNT0 = -29 ;
131
//             3             12500         8            -30 ->   TCCR0B=(CS01);  TCNT0 = -30 ;
132
//             3             11718         256          -1 ->   TCCR0B = (CS02);   TCNT0 = -1 ;
133
//             4             20833         64           -3 ->   TCCR0B=(CS01 | CS00);  TCNT0 = -3 ;
134
//             4             15625         64           -4 ->   TCCR0B=(CS01 | CS00);  TCNT0 = -4 ;
135
//             4             12500         64           -5 ->   TCCR0B=(CS01 | CS00);  TCNT0 = -5 ;
136
//             4             10416         64           -6 ->   TCCR0B=(CS01 | CS00);  TCNT0 = -6 ;
137
//             4             20833         8            -24 ->   TCCR0B=(CS01);  TCNT0 = -24 ;
138
//             4             20000         8            -25 ->   TCCR0B=(CS01);  TCNT0 = -25 ;
139
//             4             19230         8            -26 ->   TCCR0B=(CS01);  TCNT0 = -26 ;
140
//             4             18518         8            -27 ->   TCCR0B=(CS01);  TCNT0 = -27 ;
141
//             4             17857         8            -28 ->   TCCR0B=(CS01);  TCNT0 = -28 ;
142
//             4             17241         8            -29 ->   TCCR0B=(CS01);  TCNT0 = -29 ;
143
//             4             16666         8            -30 ->   TCCR0B=(CS01);  TCNT0 = -30 ;
144
//             4             15625         256          -1 ->   TCCR0B = (CS02);   TCNT0 = -1 ;
145
//             5             19531         64           -4 ->   TCCR0B=(CS01 | CS00);  TCNT0 = -4 ;
146
//             5             15625         64           -5 ->   TCCR0B=(CS01 | CS00);  TCNT0 = -5 ;
147
//             5             13020         64           -6 ->   TCCR0B=(CS01 | CS00);  TCNT0 = -6 ;
148
//             5             11160         64           -7 ->   TCCR0B=(CS01 | CS00);  TCNT0 = -7 ;
149
//             5             20833         8            -30 ->   TCCR0B=(CS01);  TCNT0 = -30 ;
150
//             5             19531         256          -1 ->   TCCR0B = (CS02);   TCNT0 = -1 ;
151
//             6             18750         64           -5 ->   TCCR0B=(CS01 | CS00);  TCNT0 = -5 ;
152
//             6             15625         64           -6 ->   TCCR0B=(CS01 | CS00);  TCNT0 = -6 ;
153
//             6             13392         64           -7 ->   TCCR0B=(CS01 | CS00);  TCNT0 = -7 ;
154
//             6             11718         64           -8 ->   TCCR0B=(CS01 | CS00);  TCNT0 = -8 ;
155
//             6             10416         64           -9 ->   TCCR0B=(CS01 | CS00);  TCNT0 = -9 ;
156
//             6             11718         256          -2 ->   TCCR0B = (CS02);   TCNT0 = -2 ;
157
//             7             18229         64           -6 ->   TCCR0B=(CS01 | CS00);  TCNT0 = -6 ;
158
//             7             15625         64           -7 ->   TCCR0B=(CS01 | CS00);  TCNT0 = -7 ;
159
//             7             13671         64           -8 ->   TCCR0B=(CS01 | CS00);  TCNT0 = -8 ;
160
//             7             12152         64           -9 ->   TCCR0B=(CS01 | CS00);  TCNT0 = -9 ;
161
//             7             10937         64           -10 ->   TCCR0B=(CS01 | CS00);  TCNT0 = -10 ;
162
//             7             13671         256          -2 ->   TCCR0B = (CS02);   TCNT0 = -2 ;
163
//             7.373         19200         64           -6 ->   TCCR0B=(CS01 | CS00);  TCNT0 = -6 ;
164
//             7.373         16457         64           -7 ->   TCCR0B=(CS01 | CS00);  TCNT0 = -7 ;
165
//             7.373         14400         64           -8 ->   TCCR0B=(CS01 | CS00);  TCNT0 = -8 ;
166
//             7.373         12800         64           -9 ->   TCCR0B=(CS01 | CS00);  TCNT0 = -9 ;
167
//             7.373         11520         64           -10 ->   TCCR0B=(CS01 | CS00);  TCNT0 = -10 ;
168
//             7.373         10473         64           -11 ->   TCCR0B=(CS01 | CS00);  TCNT0 = -11 ;
169
//             7.373         14400         256          -2 ->   TCCR0B = (CS02);   TCNT0 = -2 ;
170
//             8             20833         64           -6 ->   TCCR0B=(CS01 | CS00);  TCNT0 = -6 ;
171
//             8             17857         64           -7 ->   TCCR0B=(CS01 | CS00);  TCNT0 = -7 ;
172
//             8             15625         64           -8 ->   TCCR0B=(CS01 | CS00);  TCNT0 = -8 ;
173
//             8             13888         64           -9 ->   TCCR0B=(CS01 | CS00);  TCNT0 = -9 ;
174
//             8             12500         64           -10 ->   TCCR0B=(CS01 | CS00);  TCNT0 = -10 ;
175
//             8             11363         64           -11 ->   TCCR0B=(CS01 | CS00);  TCNT0 = -11 ;
176
//             8             10416         64           -12 ->   TCCR0B=(CS01 | CS00);  TCNT0 = -12 ;
177
//             8             15625         256          -2 ->   TCCR0B = (CS02);   TCNT0 = -2 ;
178
//             8             10416         256          -3 ->   TCCR0B = (CS02);   TCNT0 = -3 ;
179
//             9             20089         64           -7 ->   TCCR0B=(CS01 | CS00);  TCNT0 = -7 ;
180
//             9             17578         64           -8 ->   TCCR0B=(CS01 | CS00);  TCNT0 = -8 ;
181
//             9             15625         64           -9 ->   TCCR0B=(CS01 | CS00);  TCNT0 = -9 ;
182
//             9             14062         64           -10 ->   TCCR0B=(CS01 | CS00);  TCNT0 = -10 ;
183
//             9             12784         64           -11 ->   TCCR0B=(CS01 | CS00);  TCNT0 = -11 ;
184
//             9             11718         64           -12 ->   TCCR0B=(CS01 | CS00);  TCNT0 = -12 ;
185
//             9             10817         64           -13 ->   TCCR0B=(CS01 | CS00);  TCNT0 = -13 ;
186
//             9             10044         64           -14 ->   TCCR0B=(CS01 | CS00);  TCNT0 = -14 ;
187
//             9             17578         256          -2 ->   TCCR0B = (CS02);   TCNT0 = -2 ;
188
//             9             11718         256          -3 ->   TCCR0B = (CS02);   TCNT0 = -3 ;
189
//             10            19531         64           -8 ->   TCCR0B=(CS01 | CS00);  TCNT0 = -8 ;
190
//             10            17361         64           -9 ->   TCCR0B=(CS01 | CS00);  TCNT0 = -9 ;
191
//             10            15625         64           -10 ->   TCCR0B=(CS01 | CS00);  TCNT0 = -10 ;
192
//             10            14204         64           -11 ->   TCCR0B=(CS01 | CS00);  TCNT0 = -11 ;
193
//             10            13020         64           -12 ->   TCCR0B=(CS01 | CS00);  TCNT0 = -12 ;
194
//             10            12019         64           -13 ->   TCCR0B=(CS01 | CS00);  TCNT0 = -13 ;
195
//             10            11160         64           -14 ->   TCCR0B=(CS01 | CS00);  TCNT0 = -14 ;
196
//             10            10416         64           -15 ->   TCCR0B=(CS01 | CS00);  TCNT0 = -15 ;
197
//             10            19531         256          -2 ->   TCCR0B = (CS02);   TCNT0 = -2 ;
198
//             10            13020         256          -3 ->   TCCR0B = (CS02);   TCNT0 = -3 ;
199
//             11            19097         64           -9 ->   TCCR0B=(CS01 | CS00);  TCNT0 = -9 ;
200
//             11            17187         64           -10 ->   TCCR0B=(CS01 | CS00);  TCNT0 = -10 ;
201
//             11            15625         64           -11 ->   TCCR0B=(CS01 | CS00);  TCNT0 = -11 ;
202
//             11            14322         64           -12 ->   TCCR0B=(CS01 | CS00);  TCNT0 = -12 ;
203
//             11            13221         64           -13 ->   TCCR0B=(CS01 | CS00);  TCNT0 = -13 ;
204
//             11            12276         64           -14 ->   TCCR0B=(CS01 | CS00);  TCNT0 = -14 ;
205
//             11            11458         64           -15 ->   TCCR0B=(CS01 | CS00);  TCNT0 = -15 ;
206
//             11            10742         64           -16 ->   TCCR0B=(CS01 | CS00);  TCNT0 = -16 ;
207
//             11            10110         64           -17 ->   TCCR0B=(CS01 | CS00);  TCNT0 = -17 ;
208
//             11            10742         1024         -1 ->   TCCR0B=(CS02| CS00);  TCNT0 = -1 ;
209
//             11            14322         256          -3 ->   TCCR0B = (CS02);   TCNT0 = -3 ;
210
//             11            10742         256          -4 ->   TCCR0B = (CS02);   TCNT0 = -4 ;
211
//             12            20833         64           -9 ->   TCCR0B=(CS01 | CS00);  TCNT0 = -9 ;
212
//             12            18750         64           -10 ->   TCCR0B=(CS01 | CS00);  TCNT0 = -10 ;
213
//             12            17045         64           -11 ->   TCCR0B=(CS01 | CS00);  TCNT0 = -11 ;
214
//             12            15625         64           -12 ->   TCCR0B=(CS01 | CS00);  TCNT0 = -12 ;
215
//             12            14423         64           -13 ->   TCCR0B=(CS01 | CS00);  TCNT0 = -13 ;
216
//             12            13392         64           -14 ->   TCCR0B=(CS01 | CS00);  TCNT0 = -14 ;
217
//             12            12500         64           -15 ->   TCCR0B=(CS01 | CS00);  TCNT0 = -15 ;
218
//             12            11718         64           -16 ->   TCCR0B=(CS01 | CS00);  TCNT0 = -16 ;
219
//             12            11029         64           -17 ->   TCCR0B=(CS01 | CS00);  TCNT0 = -17 ;
220
//             12            10416         64           -18 ->   TCCR0B=(CS01 | CS00);  TCNT0 = -18 ;
221
//             12            11718         1024         -1 ->   TCCR0B=(CS02| CS00);  TCNT0 = -1 ;
222
//             12            15625         256          -3 ->   TCCR0B = (CS02);   TCNT0 = -3 ;
223
//             12            11718         256          -4 ->   TCCR0B = (CS02);   TCNT0 = -4 ;
224
//             13            20312         64           -10 ->   TCCR0B=(CS01 | CS00);  TCNT0 = -10 ;
225
//             13            18465         64           -11 ->   TCCR0B=(CS01 | CS00);  TCNT0 = -11 ;
226
//             13            16927         64           -12 ->   TCCR0B=(CS01 | CS00);  TCNT0 = -12 ;
227
//             13            15625         64           -13 ->   TCCR0B=(CS01 | CS00);  TCNT0 = -13 ;
228
//             13            14508         64           -14 ->   TCCR0B=(CS01 | CS00);  TCNT0 = -14 ;
229
//             13            13541         64           -15 ->   TCCR0B=(CS01 | CS00);  TCNT0 = -15 ;
230
//             13            12695         64           -16 ->   TCCR0B=(CS01 | CS00);  TCNT0 = -16 ;
231
//             13            11948         64           -17 ->   TCCR0B=(CS01 | CS00);  TCNT0 = -17 ;
232
//             13            11284         64           -18 ->   TCCR0B=(CS01 | CS00);  TCNT0 = -18 ;
233
//             13            10690         64           -19 ->   TCCR0B=(CS01 | CS00);  TCNT0 = -19 ;
234
//             13            10156         64           -20 ->   TCCR0B=(CS01 | CS00);  TCNT0 = -20 ;
235
//             13            12695         1024         -1 ->   TCCR0B=(CS02| CS00);  TCNT0 = -1 ;
236
//             13            16927         256          -3 ->   TCCR0B = (CS02);   TCNT0 = -3 ;
237
//             13            12695         256          -4 ->   TCCR0B = (CS02);   TCNT0 = -4 ;
238
//             13            10156         256          -5 ->   TCCR0B = (CS02);   TCNT0 = -5 ;
239
//             14            19886         64           -11 ->   TCCR0B=(CS01 | CS00);  TCNT0 = -11 ;
240
//             14            18229         64           -12 ->   TCCR0B=(CS01 | CS00);  TCNT0 = -12 ;
241
//             14            16826         64           -13 ->   TCCR0B=(CS01 | CS00);  TCNT0 = -13 ;
242
//             14            15625         64           -14 ->   TCCR0B=(CS01 | CS00);  TCNT0 = -14 ;
243
//             14            14583         64           -15 ->   TCCR0B=(CS01 | CS00);  TCNT0 = -15 ;
244
//             14            13671         64           -16 ->   TCCR0B=(CS01 | CS00);  TCNT0 = -16 ;
245
//             14            12867         64           -17 ->   TCCR0B=(CS01 | CS00);  TCNT0 = -17 ;
246
//             14            12152         64           -18 ->   TCCR0B=(CS01 | CS00);  TCNT0 = -18 ;
247
//             14            11513         64           -19 ->   TCCR0B=(CS01 | CS00);  TCNT0 = -19 ;
248
//             14            10937         64           -20 ->   TCCR0B=(CS01 | CS00);  TCNT0 = -20 ;
249
//             14            10416         64           -21 ->   TCCR0B=(CS01 | CS00);  TCNT0 = -21 ;
250
//             14            13671         1024         -1 ->   TCCR0B=(CS02| CS00);  TCNT0 = -1 ;
251
//             14            18229         256          -3 ->   TCCR0B = (CS02);   TCNT0 = -3 ;
252
//             14            13671         256          -4 ->   TCCR0B = (CS02);   TCNT0 = -4 ;
253
//             14            10937         256          -5 ->   TCCR0B = (CS02);   TCNT0 = -5 ;
254
//             14.318        20338         64           -11 ->   TCCR0B=(CS01 | CS00);  TCNT0 = -11 ;
255
//             14.318        18643         64           -12 ->   TCCR0B=(CS01 | CS00);  TCNT0 = -12 ;
256
//             14.318        17209         64           -13 ->   TCCR0B=(CS01 | CS00);  TCNT0 = -13 ;
257
//             14.318        15979         64           -14 ->   TCCR0B=(CS01 | CS00);  TCNT0 = -14 ;
258
//             14.318        14914         64           -15 ->   TCCR0B=(CS01 | CS00);  TCNT0 = -15 ;
259
//             14.318        13982         64           -16 ->   TCCR0B=(CS01 | CS00);  TCNT0 = -16 ;
260
//             14.318        13159         64           -17 ->   TCCR0B=(CS01 | CS00);  TCNT0 = -17 ;
261
//             14.318        12428         64           -18 ->   TCCR0B=(CS01 | CS00);  TCNT0 = -18 ;
262
//             14.318        11774         64           -19 ->   TCCR0B=(CS01 | CS00);  TCNT0 = -19 ;
263
//             14.318        11185         64           -20 ->   TCCR0B=(CS01 | CS00);  TCNT0 = -20 ;
264
//             14.318        10653         64           -21 ->   TCCR0B=(CS01 | CS00);  TCNT0 = -21 ;
265
//             14.318        10169         64           -22 ->   TCCR0B=(CS01 | CS00);  TCNT0 = -22 ;
266
//             14.318        13982         1024         -1 ->   TCCR0B=(CS02| CS00);  TCNT0 = -1 ;
267
//             14.318        18643         256          -3 ->   TCCR0B = (CS02);   TCNT0 = -3 ;
268
//             14.318        13982         256          -4 ->   TCCR0B = (CS02);   TCNT0 = -4 ;
269
//             14.318        11185         256          -5 ->   TCCR0B = (CS02);   TCNT0 = -5 ;
270
//             15            19531         64           -12 ->   TCCR0B=(CS01 | CS00);  TCNT0 = -12 ;
271
//             15            18028         64           -13 ->   TCCR0B=(CS01 | CS00);  TCNT0 = -13 ;
272
//             15            16741         64           -14 ->   TCCR0B=(CS01 | CS00);  TCNT0 = -14 ;
273
//             15            15625         64           -15 ->   TCCR0B=(CS01 | CS00);  TCNT0 = -15 ;
274
//             15            14648         64           -16 ->   TCCR0B=(CS01 | CS00);  TCNT0 = -16 ;
275
//             15            13786         64           -17 ->   TCCR0B=(CS01 | CS00);  TCNT0 = -17 ;
276
//             15            13020         64           -18 ->   TCCR0B=(CS01 | CS00);  TCNT0 = -18 ;
277
//             15            12335         64           -19 ->   TCCR0B=(CS01 | CS00);  TCNT0 = -19 ;
278
//             15            11718         64           -20 ->   TCCR0B=(CS01 | CS00);  TCNT0 = -20 ;
279
//             15            11160         64           -21 ->   TCCR0B=(CS01 | CS00);  TCNT0 = -21 ;
280
//             15            10653         64           -22 ->   TCCR0B=(CS01 | CS00);  TCNT0 = -22 ;
281
//             15            10190         64           -23 ->   TCCR0B=(CS01 | CS00);  TCNT0 = -23 ;
282
//             15            14648         1024         -1 ->   TCCR0B=(CS02| CS00);  TCNT0 = -1 ;
283
//             15            19531         256          -3 ->   TCCR0B = (CS02);   TCNT0 = -3 ;
284
//             15            14648         256          -4 ->   TCCR0B = (CS02);   TCNT0 = -4 ;
285
//             15            11718         256          -5 ->   TCCR0B = (CS02);   TCNT0 = -5 ;
286
//             16            20833         64           -12 ->   TCCR0B=(CS01 | CS00);  TCNT0 = -12 ;
287
//             16            19230         64           -13 ->   TCCR0B=(CS01 | CS00);  TCNT0 = -13 ;
288
//             16            17857         64           -14 ->   TCCR0B=(CS01 | CS00);  TCNT0 = -14 ;
289
//             16            16666         64           -15 ->   TCCR0B=(CS01 | CS00);  TCNT0 = -15 ;
290
//             16            15625         64           -16 ->   TCCR0B=(CS01 | CS00);  TCNT0 = -16 ;
291
//             16            14705         64           -17 ->   TCCR0B=(CS01 | CS00);  TCNT0 = -17 ;
292
//             16            13888         64           -18 ->   TCCR0B=(CS01 | CS00);  TCNT0 = -18 ;
293
//             16            13157         64           -19 ->   TCCR0B=(CS01 | CS00);  TCNT0 = -19 ;
294
//             16            12500         64           -20 ->   TCCR0B=(CS01 | CS00);  TCNT0 = -20 ;
295
//             16            11904         64           -21 ->   TCCR0B=(CS01 | CS00);  TCNT0 = -21 ;
296
//             16            11363         64           -22 ->   TCCR0B=(CS01 | CS00);  TCNT0 = -22 ;
297
//             16            10869         64           -23 ->   TCCR0B=(CS01 | CS00);  TCNT0 = -23 ;
298
//             16            10416         64           -24 ->   TCCR0B=(CS01 | CS00);  TCNT0 = -24 ;
299
//             16            10000         64           -25 ->   TCCR0B=(CS01 | CS00);  TCNT0 = -25 ;
300
//             16            15625         1024         -1 ->   TCCR0B=(CS02| CS00);  TCNT0 = -1 ;
301
//             16            20833         256          -3 ->   TCCR0B = (CS02);   TCNT0 = -3 ;
302
//             16            15625         256          -4 ->   TCCR0B = (CS02);   TCNT0 = -4 ;
303
//             16            12500         256          -5 ->   TCCR0B = (CS02);   TCNT0 = -5 ;
304
//             16            10416         256          -6 ->   TCCR0B = (CS02);   TCNT0 = -6 ;
305
//             17            20432         64           -13 ->   TCCR0B=(CS01 | CS00);  TCNT0 = -13 ;
306
//             17            18973         64           -14 ->   TCCR0B=(CS01 | CS00);  TCNT0 = -14 ;
307
//             17            17708         64           -15 ->   TCCR0B=(CS01 | CS00);  TCNT0 = -15 ;
308
//             17            16601         64           -16 ->   TCCR0B=(CS01 | CS00);  TCNT0 = -16 ;
309
//             17            15625         64           -17 ->   TCCR0B=(CS01 | CS00);  TCNT0 = -17 ;
310
//             17            14756         64           -18 ->   TCCR0B=(CS01 | CS00);  TCNT0 = -18 ;
311
//             17            13980         64           -19 ->   TCCR0B=(CS01 | CS00);  TCNT0 = -19 ;
312
//             17            13281         64           -20 ->   TCCR0B=(CS01 | CS00);  TCNT0 = -20 ;
313
//             17            12648         64           -21 ->   TCCR0B=(CS01 | CS00);  TCNT0 = -21 ;
314
//             17            12073         64           -22 ->   TCCR0B=(CS01 | CS00);  TCNT0 = -22 ;
315
//             17            11548         64           -23 ->   TCCR0B=(CS01 | CS00);  TCNT0 = -23 ;
316
//             17            11067         64           -24 ->   TCCR0B=(CS01 | CS00);  TCNT0 = -24 ;
317
//             17            10625         64           -25 ->   TCCR0B=(CS01 | CS00);  TCNT0 = -25 ;
318
//             17            10216         64           -26 ->   TCCR0B=(CS01 | CS00);  TCNT0 = -26 ;
319
//             17            16601         1024         -1 ->   TCCR0B=(CS02| CS00);  TCNT0 = -1 ;
320
//             17            16601         256          -4 ->   TCCR0B = (CS02);   TCNT0 = -4 ;
321
//             17            13281         256          -5 ->   TCCR0B = (CS02);   TCNT0 = -5 ;
322
//             17            11067         256          -6 ->   TCCR0B = (CS02);   TCNT0 = -6 ;
323
//             18            20089         64           -14 ->   TCCR0B=(CS01 | CS00);  TCNT0 = -14 ;
324
//             18            18750         64           -15 ->   TCCR0B=(CS01 | CS00);  TCNT0 = -15 ;
325
//             18            17578         64           -16 ->   TCCR0B=(CS01 | CS00);  TCNT0 = -16 ;
326
//             18            16544         64           -17 ->   TCCR0B=(CS01 | CS00);  TCNT0 = -17 ;
327
//             18            15625         64           -18 ->   TCCR0B=(CS01 | CS00);  TCNT0 = -18 ;
328
//             18            14802         64           -19 ->   TCCR0B=(CS01 | CS00);  TCNT0 = -19 ;
329
//             18            14062         64           -20 ->   TCCR0B=(CS01 | CS00);  TCNT0 = -20 ;
330
//             18            13392         64           -21 ->   TCCR0B=(CS01 | CS00);  TCNT0 = -21 ;
331
//             18            12784         64           -22 ->   TCCR0B=(CS01 | CS00);  TCNT0 = -22 ;
332
//             18            12228         64           -23 ->   TCCR0B=(CS01 | CS00);  TCNT0 = -23 ;
333
//             18            11718         64           -24 ->   TCCR0B=(CS01 | CS00);  TCNT0 = -24 ;
334
//             18            11250         64           -25 ->   TCCR0B=(CS01 | CS00);  TCNT0 = -25 ;
335
//             18            10817         64           -26 ->   TCCR0B=(CS01 | CS00);  TCNT0 = -26 ;
336
//             18            10416         64           -27 ->   TCCR0B=(CS01 | CS00);  TCNT0 = -27 ;
337
//             18            10044         64           -28 ->   TCCR0B=(CS01 | CS00);  TCNT0 = -28 ;
338
//             18            17578         1024         -1 ->   TCCR0B=(CS02| CS00);  TCNT0 = -1 ;
339
//             18            17578         256          -4 ->   TCCR0B = (CS02);   TCNT0 = -4 ;
340
//             18            14062         256          -5 ->   TCCR0B = (CS02);   TCNT0 = -5 ;
341
//             18            11718         256          -6 ->   TCCR0B = (CS02);   TCNT0 = -6 ;
342
//             18            10044         256          -7 ->   TCCR0B = (CS02);   TCNT0 = -7 ;
343
//             19            19791         64           -15 ->   TCCR0B=(CS01 | CS00);  TCNT0 = -15 ;
344
//             19            18554         64           -16 ->   TCCR0B=(CS01 | CS00);  TCNT0 = -16 ;
345
//             19            17463         64           -17 ->   TCCR0B=(CS01 | CS00);  TCNT0 = -17 ;
346
//             19            16493         64           -18 ->   TCCR0B=(CS01 | CS00);  TCNT0 = -18 ;
347
//             19            15625         64           -19 ->   TCCR0B=(CS01 | CS00);  TCNT0 = -19 ;
348
//             19            14843         64           -20 ->   TCCR0B=(CS01 | CS00);  TCNT0 = -20 ;
349
//             19            14136         64           -21 ->   TCCR0B=(CS01 | CS00);  TCNT0 = -21 ;
350
//             19            13494         64           -22 ->   TCCR0B=(CS01 | CS00);  TCNT0 = -22 ;
351
//             19            12907         64           -23 ->   TCCR0B=(CS01 | CS00);  TCNT0 = -23 ;
352
//             19            12369         64           -24 ->   TCCR0B=(CS01 | CS00);  TCNT0 = -24 ;
353
//             19            11875         64           -25 ->   TCCR0B=(CS01 | CS00);  TCNT0 = -25 ;
354
//             19            11418         64           -26 ->   TCCR0B=(CS01 | CS00);  TCNT0 = -26 ;
355
//             19            10995         64           -27 ->   TCCR0B=(CS01 | CS00);  TCNT0 = -27 ;
356
//             19            10602         64           -28 ->   TCCR0B=(CS01 | CS00);  TCNT0 = -28 ;
357
//             19            10237         64           -29 ->   TCCR0B=(CS01 | CS00);  TCNT0 = -29 ;
358
//             19            18554         1024         -1 ->   TCCR0B=(CS02| CS00);  TCNT0 = -1 ;
359
//             19            18554         256          -4 ->   TCCR0B = (CS02);   TCNT0 = -4 ;
360
//             19            14843         256          -5 ->   TCCR0B = (CS02);   TCNT0 = -5 ;
361
//             19            12369         256          -6 ->   TCCR0B = (CS02);   TCNT0 = -6 ;
362
//             19            10602         256          -7 ->   TCCR0B = (CS02);   TCNT0 = -7 ;
363
//             20            20833         64           -15 ->   TCCR0B=(CS01 | CS00);  TCNT0 = -15 ;
364
//             20            19531         64           -16 ->   TCCR0B=(CS01 | CS00);  TCNT0 = -16 ;
365
//             20            18382         64           -17 ->   TCCR0B=(CS01 | CS00);  TCNT0 = -17 ;
366
//             20            17361         64           -18 ->   TCCR0B=(CS01 | CS00);  TCNT0 = -18 ;
367
//             20            16447         64           -19 ->   TCCR0B=(CS01 | CS00);  TCNT0 = -19 ;
368
//             20            15625         64           -20 ->   TCCR0B=(CS01 | CS00);  TCNT0 = -20 ;
369
//             20            14880         64           -21 ->   TCCR0B=(CS01 | CS00);  TCNT0 = -21 ;
370
//             20            14204         64           -22 ->   TCCR0B=(CS01 | CS00);  TCNT0 = -22 ;
371
//             20            13586         64           -23 ->   TCCR0B=(CS01 | CS00);  TCNT0 = -23 ;
372
//             20            13020         64           -24 ->   TCCR0B=(CS01 | CS00);  TCNT0 = -24 ;
373
//             20            12500         64           -25 ->   TCCR0B=(CS01 | CS00);  TCNT0 = -25 ;
374
//             20            12019         64           -26 ->   TCCR0B=(CS01 | CS00);  TCNT0 = -26 ;
375
//             20            11574         64           -27 ->   TCCR0B=(CS01 | CS00);  TCNT0 = -27 ;
376
//             20            11160         64           -28 ->   TCCR0B=(CS01 | CS00);  TCNT0 = -28 ;
377
//             20            10775         64           -29 ->   TCCR0B=(CS01 | CS00);  TCNT0 = -29 ;
378
//             20            10416         64           -30 ->   TCCR0B=(CS01 | CS00);  TCNT0 = -30 ;
379
//             20            19531         1024         -1 ->   TCCR0B=(CS02| CS00);  TCNT0 = -1 ;
380
//             20            19531         256          -4 ->   TCCR0B = (CS02);   TCNT0 = -4 ;
381
//             20            15625         256          -5 ->   TCCR0B = (CS02);   TCNT0 = -5 ;
382
//             20            13020         256          -6 ->   TCCR0B = (CS02);   TCNT0 = -6 ;
383
//             20            11160         256          -7 ->   TCCR0B = (CS02);   TCNT0 = -7 ;

von jar (Gast)


Lesenswert?

jar schrieb:
> so nun läufts endlich,

das sollte nicht fehlen

#define F_INTERRUPTS                            15625 // passend 
einsetzen

von jar (Gast)


Lesenswert?

kleines Problem, soweit klappt alles
1
//TCCR0B=(1<<CS01 | 1<<CS00);  TCNT0 = -7 ;  
2
//divide by 64; TCNT0 = -7; // 7 * 64 = 448 cycle
3
gibt F_INTERRUPTS  17857
4
oder
5
TCCR0B=(1<<CS02); TCNT0 = -2 ;  //TCCR0B = 1<<CS02;  //divide by 256; TCNT0 = -2;  // 2 * 256 = 512 cycle
6
gibt F_INTERRUPTS  15625
7
TIMSK0 = 1<<TOIE0;    //enable timer interrupt
8
9
SIGNAL (SIG_OVERFLOW0)
10
{
11
  TCNT0 = -2 ;  // 2*256=512 cycle mit F_CPU 8000000 alle 64µs->F_INT.15625
12
13
oder auch 
14
15
  TCNT0 = -7 ;  // 7*64=448 cycle mit F_CPU 8000000 alle 64µs->F_INT. 17857
16
  irmp_ISR ();
17
}

soweit so gut, wenn ich aber auf 71428 Interrupts möchte um auf F_SND 
36kHz zu kommen, mit
1
init_teil 
2
TCCR0B=(1<<CS01);  TCNT0 = -14 ; // divide 8 -> 8x14 = 112 cycle
3
TIMSK0 = 1<<TOIE0;    //enable timer interrupt
4
isr_cnt =4;
5
6
ISR
7
SIGNAL (SIG_OVERFLOW0)
8
{
9
  TCNT0 = -14 ;  // 14*8=112 cycle mit F_CPU 8000000 alle 4x->F_INT. 17857
10
  IR_ERKANNT_PORT ^= (1<<IR_ERKANNT); // sollte 36kHz haben (Messtoggel)
11
12
  if (!isr_cnt--)
13
  {  
14
    irmp_ISR (); // die IRMP_ISR wird nur jeden 4ten Interrupt aufgerufen
15
    isr_cnt =4;
16
  }
17
}

klappts nicht, kommt maximal 26 kHz raus
die IR Erkennung geht auch nicht

von Torsten K. (nobby)


Lesenswert?

Hallo,

hat schonmal jemand die Pollin Infrarot-Tastatur RUWIDO MERLIN mit 
Nummer  711 057 zum Laufen bekommen ?
Bislang habe ich hier nur die BestNr. gesehen, sonst aber noch nichts.
Das ist eine sehr schöne kleine Tastatur !!

Mit der Version 1.9.0 aus der SVN wird jedenfalls nichts erkannt. Ich 
könnte mal die Tasten Scannen, wenn das bisher noch keiner versucht hat 
?!

Gruß
Torsten

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Torsten Kalbe schrieb:

> hat schonmal jemand die Pollin Infrarot-Tastatur RUWIDO MERLIN mit
> Nummer  711 057 zum Laufen bekommen ?

Witzig, die habe ich mir vor 2 Wochen bestellt. Habe ich mittlerweile 
auch hier, bisher hatte ich aber noch keine Zeit gehabt, IRMP daran 
anzupassen.

Werde ich in den nächsten Tagen mal testen, denn das ist wirklich eine 
schöne kleine Tastatur.

Wenn IRMP damit funktioniert, melde ich mich wieder.

von Dominique G. (dgoersch)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,

bin gerade erst auf diese IR-Lib gestossen, echt tolle arbeit! Werde sie 
sicher in dem ein oder anderen Projekt verwenden.

Hab auch gleich einen Wunsch: Das Protokoll der LEGO Powerfunctions. 
Lego hat sogar ein Dokument dazu veröffentlicht (hängt an).

Wäre es möglich dieses Protokoll hinzuzufügen?

Danke und Gruß
Dominique Görsch

von Dominique G. (dgoersch)


Lesenswert?

Nachtrag:

Hab gerade gesehen, dass es eine neuere Version des Dokuments gibt: 
http://storage.technicbricks.com/Media/2010/TBs_20100304_1/LEGO%20Power%20Functions%20RC%20v120.pdf

Dort sind zB auch die increment/decrement-Kommandos drin, die der 
LEGO-Zug meines Sohnes nutzt.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Dominique Görsch schrieb:

> Hab auch gleich einen Wunsch: Das Protokoll der LEGO Powerfunctions.
> Lego hat sogar ein Dokument dazu veröffentlicht (hängt an).
>
> Wäre es möglich dieses Protokoll hinzuzufügen?

Das Protokoll ist offenbar ein Pulse-Distance-Protokoll mit 16 Bit, 
wobei nur 12 Bit Nutzdaten vorhanden sind.

Es sieht ganz einfach aus. Willst Du das nur decodieren oder auch 
senden?
Die eigentlichen Inhalte wird IRMP nicht weiter interpretieren, sondern 
Dir einfach die 12 Bit liefern.

Ich bau das mal in den nächsten Tagen ein.

Gruß,

Frank

von Dominique G. (dgoersch)


Lesenswert?

Sowohl als auch wäre genial. Ich plane zum einen eigene Receiver die 
dann mit der LEGO Fernbedienung steuerbar sind, zum anderen aber auch 
das automatische Steuern zB von Zügen.

Super, dass du es gleich implementieren willst. Reichen dir die Infos 
aus dem Paper oder kann ich dir noch anderweitig (zB mit Scans) helfen?

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Dominique Görsch schrieb:
> Super, dass du es gleich implementieren willst. Reichen dir die Infos
> aus dem Paper oder kann ich dir noch anderweitig (zB mit Scans) helfen?

Es wäre natürlich nett, wenn Du auch ein paar Scans machen könntest. 
Graue Theorie ist die eine Geschichte, Praxis oft eine andere :-)

Gruß,

Frank

von Dominique G. (dgoersch)


Lesenswert?

Kein Problem, werde ich machen. Muss deinen Code dafür nur etwas 
umstricken weil ich in meiner Firmware sowieso UART mit 250kBaud (USB) 
drin hab. Wird heute aber wohl eher nixmehr...

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Dominique Görsch schrieb:
> Sowohl als auch wäre genial. Ich plane zum einen eigene Receiver die
> dann mit der LEGO Fernbedienung steuerbar sind, zum anderen aber auch
> das automatische Steuern zB von Zügen.

Im SVN ist nun ein IRMP/IRSND mit dem LEGO-Protokoll zu finden. 
Maßgeblich sind in irmp_data.command die unteren 12 Bits, die je nach 
Inhalt von der Anwendung zu prüfen sind - anlehnend an die 
LEGO-Dokumentation. irmp_data.address ist immer 0.

IRMP liest die 16 Bits des LEGO-Telegramm ein und checkt das letzte 
Nibble im XOR-Verfahren gegen die anderen 3 Nibbles. Kommt der richtige 
Wert raus, gibt IRMP die 12 Bit an Nutzdaten zurück.

Umgekehrt kann man die 12 Bits an IRSND in irmp_data.command übergeben. 
IRSND "konstruiert" daraus das fehlende letzte Nibble und schickt 
anschließend den kompletten Frame mit 16 Bit raus.

Als letzte Info: Man braucht eine Interrupt-Frequenz von 20kHz, da die 
Pulse ziemlich kurz sind. Wenn Du noch Scans machen möchtest, dann bitte 
mit 20kHz.

Ich hoffe, ich habe keinen Fehler gemacht, bitte testen.

Gruß,

Frank

von Torsten K. (nobby)


Lesenswert?

Hy Frank,

wie ist es denn mit der Unterstützung für die kleine Pollin Tasttatur 
"Merlin" ?
Hast Du da schon was erreichen können ?

Gruß
Torsten

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Torsten K. schrieb:
> wie ist es denn mit der Unterstützung für die kleine Pollin Tasttatur
> "Merlin" ?
> Hast Du da schon was erreichen können ?

Nein, noch nicht. Da werde ich wohl vor dem nächsten Wochenende nicht zu 
kommen. Wenn Du mir helfen willst, kannst Du gern vorabe schon mal ein 
paar Scans mit IRMP machen. Das würde mir eine Menge Arbeit abnehmen.

Gruß,

Frank

von Torsten K. (nobby)


Lesenswert?

Hi,

ja, werde mal sehen, wie ich die Tage dazu komme, sollte aber möglich 
sein.

Bis dann
Torsten

von Joachim B. (Gast)


Lesenswert?

Frank M. schrieb:
> Sollte gehen. Wenns läuft, schick mir bitte Deine Code-Änderungen. Dann
> baue ich das als Alternative zum 16-Bit-Timer ein.
>
> Gruß,
>
> Frank

läuft prima, erstzt nun den dani code und mein Timer kann immer mehr, 
nicht nur timen, sondern auch FB testen :-)
1
/* ======================================================================
2
3
C Source File -- Created with SAPIEN Technologies Primalscript(TM)
4
5
NAME: <filename>
6
7
AUTHOR: jar , test
8
DATE  : 12.04.2011
9
10
COMMENT: <comment>
11
12
====================================================================== */
13
#define F_INTERRUPTS F_CPU/512   // Timer0 RC5 dannegger 64µs bei 8 MHz oder anders gesprochen F_CPU/512 = 15625
14
//#define F_INTERRUPTS F_CPU/448   // Timer0 F_CPU/448 = 17857
15
16
void timer0_init(void)
17
{  TCCR0B = 1<<CS02;      //divide by 256
18
  //TCCR0B = (CS01 | CS00);    //divide by 64 
19
  TIMSK0 |= (1<<TOIE0);    //enable timer interrupt
20
}
21
22
SIGNAL (SIG_OVERFLOW0)
23
{  
24
  uint tmp = rc5_tmp;      // for faster access
25
26
  TCNT0 = -2;          // gibt mit divide by 256 genau 512 Takte zum Interrrupt
27
  //TCNT0 = -7;          // gibt mit divide by 64 genau 448 Takte zum Interrrupt
28
  irmp_ISR();
29
}
30
31
// die würden sich auch bei 8 MHz anbieten
32
//            TCCR0B
33
//            CS02  CS01  CS00  Description
34
//            0     0     0     No clock source (Timer/Counter stopped)
35
//            0     0     1     clkI/O/(No prescaling)
36
//            0     1     0     clkI/O/8 (From prescaler)
37
//            0     1     1     clkI/O/64 (From prescaler)
38
//            1     0     0     clkI/O/256 (From prescaler)
39
//            1     0     1     clkI/O/1024 (From prescaler)
40
//            F_CPU / MHz   Interrupts    TCCR0B        TCNT0
41
//             8             20833         64           -6 ->   #define F_INTERRUPTS  20833   ;TCCR0B = (CS01 | CS00);  TCNT0 = -6 ;
42
//             8             17857         64           -7 ->   #define F_INTERRUPTS  17857   ;TCCR0B = (CS01 | CS00);  TCNT0 = -7 ;
43
//             8             13888         64           -9 ->   #define F_INTERRUPTS  13888   ;TCCR0B = (CS01 | CS00);  TCNT0 = -9 ;
44
//             8             12500         64           -10 ->   #define F_INTERRUPTS  12500   ;TCCR0B = (CS01 | CS00);  TCNT0 = -10 ;
45
//             8             15625         256          -2 ->   #define F_INTERRUPTS  15625   ;TCCR0B = (CS02);      TCNT0 = -2 ;
46
//             8             11363         64           -11 ->   #define F_INTERRUPTS  11363   ;TCCR0B = (CS01 | CS00);  TCNT0 = -11 ;
47
//             8             10416         256          -3 ->   #define F_INTERRUPTS  10416   ;TCCR0B = (CS02);      TCNT0 = -3 ;

von Dominique G. (dgoersch)


Lesenswert?

Sorry, ich komme im Moment leider nicht zum Testen, trotzdem schonmal 
ein Danke für die schnelle Implementation.

von Joachim B. (Gast)


Angehängte Dateien:

Lesenswert?

an Frank (ukw)

habe eine FB die IRMP nicht erkennt

daewoo Videorecorder V-737

die FB ist defekt, nur noch 3/4 ? Tasten funktionieren IR Led leuchtet
output_2011-04-15_09-02-22.log

Tasten PROG, <- , -INDEX

habe eine Nachbau FB bestellt
1 90 11 54 22 daewoo 97p1r2taa0 DAEWOO 97P1RA1AA0

die sendet auf den Tasten (PROG Taste nicht gefunden)
Tasten <- , -INDEX
output_2011-04-15_09-05-56.log

kannst du den Code erkennen ?

kannst du die "gleichen" Codes ? vergleichen ?

und evt. sagen um was für einen Code es sich handelt ?

#define F_INTERRUPTS                            17857
#define F_CPU                            8000000


wenn nötig, mehr Codes aus der Ersatz FB

von Joachim B. (Gast)


Lesenswert?

Joachim B. schrieb:
> an Frank (ukw)
>
> habe eine FB die IRMP nicht erkennt

kann die Nachbau FB nicht vorher testen weil der VCR im Ausland steht

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Hi Joachim,

Joachim B. schrieb:
> an Frank (ukw)
>
> habe eine FB die IRMP nicht erkennt

Doch, wird erkannt. Das ist das NEC16-Protokoll (eine verkürzte Variante 
des 32-Bit-NEC-Protokolls, dafür aber mit Sync-Bit nach den 8 
Adressbits).

Protokoll: 27
Adresse: 0x0015

Habe ich erst vor ein paar Wochen eingebaut, findest Du im Download des 
SVN.

Gruß,

Frank

von Joachim B. (Gast)


Lesenswert?

Frank M. schrieb:
> Habe ich erst vor ein paar Wochen eingebaut, findest Du im Download des
> SVN.
>
> Gruß,
>
> Frank

hast du ne Idee warum ich bei F_INTERRUPTS 17857 -> 25 warnings bekomme 
?

manche Codes brauchen doch sogar 20000 ! OK mit 15500 gehts aber wenn 
20000 geht sollte 17857 nicht meckern

../irmp.c:1106: warning: integer overflow in expression
../irmp.c:1107: warning: integer overflow in expression
../irmp.c:1108: warning: integer overflow in expression
../irmp.c:1109: warning: integer overflow in expression
../irmp.c:1157: warning: integer overflow in expression
../irmp.c:1158: warning: integer overflow in expression
../irmp.c:1159: warning: integer overflow in expression
../irmp.c:1160: warning: integer overflow in expression
../irmp.c:1260: warning: integer overflow in expression
../irmp.c:1261: warning: integer overflow in expression
../irmp.c:1262: warning: integer overflow in expression
../irmp.c:1263: warning: integer overflow in expression
../irmp.c: In function 'irmp_ISR':
../irmp.c:2033: warning: integer overflow in expression
../irmp.c:2033: warning: integer overflow in expression
../irmp.c:2035: warning: integer overflow in expression
../irmp.c:2035: warning: integer overflow in expression
../irmp.c:2079: warning: integer overflow in expression
../irmp.c:2080: warning: integer overflow in expression
../irmp.c:2184: warning: integer overflow in expression
../irmp.c:2184: warning: integer overflow in expression
../irmp.c:2186: warning: integer overflow in expression
../irmp.c:2186: warning: integer overflow in expression

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Joachim B. schrieb:

> hast du ne Idee warum ich bei F_INTERRUPTS 17857 -> 25 warnings bekomme
> ?

Habs mir gerade angeschaut, das hat was mit einer kürzlich von mir 
geänderten Behandlung der 2-fachen Längen von Pulsen/Pausen im 
Manchester-Decoder zu tun. Ich wollte da Code einsparen, hab aber nicht 
bedacht, dass da Variablen "platzen" könnten. Ich repariere das am 
Wochenende. Entweder Du gehst auf 15kHz runter oder Du verzichtest 
erstmal auf RC5 und Co.

Gruß,

Frank

von Joachim B. (Gast)


Lesenswert?

Frank M. schrieb:
> Ich repariere das am
> Wochenende.

fein, gib dann mal Bescheid, dann lade ich die reparierte

hast du schon die 8-bit Timer0 Variante eingebaut ?

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Joachim B. schrieb:
> hast du schon die 8-bit Timer0 Variante eingebaut ?

Nein, habe ich noch nicht. Bei der 16-Bit-Timer-Variante werden die 
Werte für die Timer-Register über eine Formel, die lediglich von F_CPU 
und F_INTERRUPTS abhängig sind, automatisch initialisiert. Da muss man 
nichts anpassen.

Bei Deiner Timer0-Variante muss man eine Tabelle heranziehen und dann 
die Werte abtippen und damit den eigentlichen Code ändern. Das ist nicht 
so schön, geht aber wohl nicht anders. Deshalb überlege ich noch hin und 
her, wie ich das am besten allgemeingültig in den Code einbaue.

von Joachim B. (Gast)


Lesenswert?

Frank M. schrieb:
> Bei Deiner Timer0-Variante muss man eine Tabelle heranziehen und dann
> die Werte abtippen und damit den eigentlichen Code ändern. Das ist nicht
> so schön, geht aber wohl nicht anders. Deshalb überlege ich noch hin und
> her, wie ich das am besten allgemeingültig in den Code einbaue.

ich weiss

lauter #if F_CPU == && F_INTRRUPTS ==

ist auch keine Lösung

schade das der Precompiler nicht rechnen kann

die Teilerstufen sind auch nicht linear 2^n

wegen 0 8 64 256 1024 gibt 2^0 2^3 2^6 2^8 2^10

kleiner 6 step 3
else step 2

eine Tabelle einfügen ?

von eku (Gast)


Lesenswert?

Hallo,

in ethersex verwendet IRMP wahlweise Timer 0 oder 2. Der Vorteiler wird
in abhängigkeit von F_CPU und Abtastrate zur Compilezeit berechnet, ganz 
ohne Tabelle.

https://github.com/ethersex/ethersex/blob/12710c72d560ec0e60382bd1778912702a63c3d7/hardware/ir/irmp/irmp.c

von Cajus H. (cajush)


Angehängte Dateien:

Lesenswert?

Hallo Frank,

erst mal ein großes Lob, Dein IRMP ist große Klasse!

Ich spiele mit dem Gedanken mir eine programmierbare Fernbedienung zu 
basteln, die mit einem 5" Touch etwa so viel kann wie die Philips 
Pronto.
Leider hat Philips die Herstellung dieser genialen Fernbedienungen 
eingestellt und es gibt keinen Hersteller, der etwas vergleichbares 
anbieten kann, zumindest nicht unter 1400€.

Ich habe also alle 20 Originalfernbedienungen aus dem Keller geholt und 
IRMP mit allen Protokollen (ausser Lego) auf meinem ATmega32 zum Laufen 
gebracht.

Dabei bin ich auf eine Fernbedienung gestossen, die scheinbar von IRMP 
nicht erkannt wird. Es handelt sich um eine Fernbedienung für einen 
älteren Thomson TV, die Fernbedienung nennt sich "mb100". Die 
Modulationsfrequenz ist ca. 33kHz (mit dem Oszi nachgemessen), der 
Empfänger ist ein TSOP1738 (38kHz), also passt nicht ganz zur 
Modulationsfrequenz, sollte aber trotzdem noch gehen.

Könntest Du mal schauen, ob Du mit den Scans etwas anfangen kannst?
Es wäre schön, wenn man das Protokoll noch implementieren könnte.

Gruß
Cajus

Hoppla, irgendwie ist mein Dateianhang doppelt vorhanden!?
Weis jemand wie man Dateianhänge wieder löschen kann?

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Cajus H. schrieb:

> erst mal ein großes Lob, Dein IRMP ist große Klasse!

Danke :-)

> Ich spiele mit dem Gedanken mir eine programmierbare Fernbedienung zu
> basteln, die mit einem 5" Touch etwa so viel kann wie die Philips
> Pronto.

Das sagt mir jetzt nichts, aber ich vermute, dass es sich um eine 
programmierbare FB handelt, bei dem das Tastenlayout auf dem Display 
frei wählbar ist?

Vielleicht schaust Du Dir dazu mal

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

an. Diese kann die Codes lernen und im EEPROM abespeichern. Ich weiß, 
hier gibt es zwar nur 5 Tasten, aber vielleicht kannst Du da was von 
übernehmen oder zumindest die eine oder andere Anregung erhalten :-)

> Ich habe also alle 20 Originalfernbedienungen aus dem Keller geholt und
> IRMP mit allen Protokollen (ausser Lego) auf meinem ATmega32 zum Laufen
> gebracht.

Super!

> Dabei bin ich auf eine Fernbedienung gestossen, die scheinbar von IRMP
> nicht erkannt wird. Es handelt sich um eine Fernbedienung für einen
> älteren Thomson TV, die Fernbedienung nennt sich "mb100". Die
> Modulationsfrequenz ist ca. 33kHz (mit dem Oszi nachgemessen), der
> Empfänger ist ein TSOP1738 (38kHz), also passt nicht ganz zur
> Modulationsfrequenz, sollte aber trotzdem noch gehen.
>
> Könntest Du mal schauen, ob Du mit den Scans etwas anfangen kannst?
> Es wäre schön, wenn man das Protokoll noch implementieren könnte.

Habs mir gerade mal kurz mit "irmp-15kHz -a" unter Linux angeschaut. Das 
Protokoll ist sehr einfach gehalten:

- Jeder Frame wird 2 mal wiederholt (also insgesamt 3 Frames)
- Kein Startbit
- Framelänge 12 Bit
- Pulslänge: 550 µs
- Pausen: 1990 µs oder 4523µs

Ich schaue mal, ob ich das morgen früh mal einbaue, sollte nicht 
schwierig sein. Dank der Fülle Deiner Scans sollte ich auch noch 
herausbekommen, wieviele Bits zur Adresse und wieviele zum Kommando 
gehören.

Eine Frage hätte ich noch: Hast Du die Tasten kurz gedrückt oder länger? 
Die 2 Wiederholungen eines jeden Frames sind etwas untypisch. Eventuell 
müsstest Du das nochmal testen, sobald IRMP das Thomson-Protokoll 
"versteht". Nicht dass zumindest der 3. Frame eine Wiederholung ist, die 
durch langes Drücken einer Taste zustandekam...

Gruß,

Frank

von Frank M. (ukw) (Moderator) Benutzerseite


Angehängte Dateien:

Lesenswert?

Mich hat es doch in den Fingern gejuckt und ich habe gerade mal das 
Thomson-Protokoll in den IRMP eingebaut. Da es so einfach ist, hat es 
gerade mal 20 Minuten gebraucht :-)

Neue Erkenntnisse:

- Der Frame setzt sich aus einer 4-Bit-Adresse und 8-Bit Daten zusammen
- MSB oder LSB first ist noch unbekannt, lässt sich leider nicht aus den
  Tasten 0 bis 9 erkennen
- Frame-Wiederholungen werden im Moment noch als Tasten-Wiederholungen
  (flag = 0x01) erkannt. Das muss noch angepasst werden, sobald klar
  ist, wieviele Frames bei kurzem! Tastendruck erzeugt werden

@Cajus H. (cajush):

Teste das bitte mal. Gemeinsam sollten wir das dann hinbekommen.

Im Anhang findest Du die gegenüber dem SVN geänderten Sources.

Achja: Da kommt im Moment noch eine Compiler-Warnung, die Du ignorieren 
kannst... ist halt noch ein Prototyp.

Gruß,

Frank

von Cajus H. (cajush)


Angehängte Dateien:

Lesenswert?

Hallo Frank,

>> Philips Pronto...
> Das sagt mir jetzt nichts, aber ich vermute, dass es sich um eine
> programmierbare FB handelt, bei dem das Tastenlayout auf dem Display
> frei wählbar ist?

Ja genau und zwar WIRKLICH frei wählbar mit Tastenform, Tastengröße, 
Anordnung der Tasten, beliebige Macros und vielem mehr. Es gab eine 
Variante mit Graustufen-Touch und eine Variante mit Farb-Touch, ich habe 
eine ältere Graustufen-Variante mit relativ kleinem Touch. Im Anhang 
sind ein paar Seiten meiner Pronto.
Als Basis für eine Touch-FB habe ich dieses Modul im Auge 
http://shop.embedded-projects.net/index.php?module=artikel&action=artikel&id=459 
, erweitert um einen ATmega mit IRSND.

> Thomson Protokoll...
Ich habe eine Scan-Datei in den Anhang gepackt, bei der ich kurze und 
lange Tastendrücke dokumentiert habe. Der kurze Tastendruck ist SEHR 
kurz, normalerweise kommen zwei Ausgaben mit Code,Address und Command.
Man kann ausserdem erkennen, dass das letzte Bit ein Toggle-Bit (analog 
zum RC5 von Philips) ist. Das Bit togglet bei jedem Tastendruck, egal ob 
kurz oder lang. Es togglet auch beim Drücken von unterschiedlichen 
Tasten.

Ich habe Dir außerdem mal meine Source-Dateien angehängt.
Darin sind ein paar kleine Änderungen:
- Versionsnummer aktualisiert (sollte man eigentlich besser in einer 
Header-Datei festlegen als in der printf-Ausgabe, ich war aber zu faul 
;-)
- printf-Unterstützung auch für gcc (war nur für CODEVISION drin)
- Namen der Protokolle erweitert

Gibt es eigentlich irgendwo eine Sammlung mit Scancodes?
Ich habe mal angefangen die Codes meiner FBs in eine Tabelle zu packen, 
aber vielleicht gibt es schon eine vergleichbare Sammlung. Ich habe den 
aktuellen Stand der Liste auch mal angehängt, es fehlen noch einige FBs. 
Eigentlich eine Anwendung für eine Datenbank...

Gruß
Cajus

von Cajus H. (cajush)


Angehängte Dateien:

Lesenswert?

Hallo Frank,

hier noch einmal meine modifizierten IRMP Sourcen, bei den obigen hatte 
sich ein Fehler eingeschlichen, der das Übersetzen mit IRMP_LOGGING = 0 
verhinderte. Das resultierte daher, weil ich Deine Uart-Initialisierung 
nach main() kopiert hatte, die Definition der Register aber nur bei 
IRMP_LOGGING = 1 gemacht wird. Daher habe ich diese Definitionen nach 
irmp.h verlegt.

Ich habe die Version nach irmp.h verschoben und gebe bei printf nur noch 
%s aus.


In Deinem Code war auch noch ein kleiner Fehler, den ich allerdings auch 
schon in der letzten Version meiner Sourcen behoben hatte: irmp.c

vor
static PROGMEM IRMP_PARAMETER thomson_param =
steht
#if IRMP_SUPPORT_DENON_PROTOCOL == 1
das sollte vermutlich
#if IRMP_SUPPORT_THOMSON_PROTOCOL == 1
heissen, oder?

Gruß
Cajus

von Torsten K. (nobby)


Angehängte Dateien:

Lesenswert?

Hallo Frank,

hier sind ein paar Scans der Pollin Merlin Tastatur, hat etwas länger 
gedauert.
Gemacht mit  F_INTERRUPTS 20000.
Wenn Du noch mehr brauchst, oder bei Fragen, sag bescheid.

Gruß
Torsten

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Cajus H. schrieb:
>> Thomson Protokoll...
> Ich habe eine Scan-Datei in den Anhang gepackt, bei der ich kurze und
> lange Tastendrücke dokumentiert habe. Der kurze Tastendruck ist SEHR
> kurz, normalerweise kommen zwei Ausgaben mit Code,Address und Command.
> Man kann ausserdem erkennen, dass das letzte Bit ein Toggle-Bit (analog
> zum RC5 von Philips) ist. Das Bit togglet bei jedem Tastendruck, egal ob
> kurz oder lang. Es togglet auch beim Drücken von unterschiedlichen
> Tasten.

Sehr gut. Bei kurzen Tastendrücken gibt es nur einen einzigen Frame. Das 
macht die Sache leichter. Danke für den Tipp mit dem Toggle-Bit. IRMP 
blendet das nun aus. Damit konnte ich dann sehen, dass die 
Bit-Reihenfolge MSB-First ist, denn die untereinander liegenden Tasten 
0,4,7 / 2,5,8 / 3,6,9 haben damit eine aufsteigende Reihenfolge. Das 
ergibt folgende Codeänderungen:
1
#define THOMSON_COMMAND_OFFSET                  5                               // skip 4 address bits + 1 toggle bit
2
#define THOMSON_COMMAND_LEN                     7                               // read 7 command bits
3
#define THOMSON_LSB                             0                               // MSB...LSB

> Ich habe Dir außerdem mal meine Source-Dateien angehängt.
> Darin sind ein paar kleine Änderungen:
> - Versionsnummer aktualisiert (sollte man eigentlich besser in einer
> Header-Datei festlegen als in der printf-Ausgabe, ich war aber zu faul
> ;-)

Die Versionsnummer, die im Codevision-Teil steht, habe ich nie gepflegt. 
Ich überlege mittlerweile auch, die Codevision-Unterstützung komplett 
rauszuwerfen, da ich diese mangels Codevision-Compiler sowieso nicht 
unterstützen kann. Das würde den Code etwas übersichtlicher machen - 
zumindest in main.c.

> - printf-Unterstützung auch für gcc (war nur für CODEVISION drin)

Schaue ich mir mal an. Eigentlich hat das aber nichts im IRMP zu suchen. 
Die main.c ist eigentlich nur ein Beispiel-Code und nicht wirklich 
Bestandteil des IRMP.

> - Namen der Protokolle erweitert

Ja, eben, das wurde nicht gepflegt. Eigentlich will ich das auch gar 
nicht ;-)

> Gibt es eigentlich irgendwo eine Sammlung mit Scancodes?

Es gibt das LIRC-Projekt. Ob es sinnvoll ist, für IRMP auch so etwas zu 
machen, weiß ich nicht.

Cajus H. schrieb:

> In Deinem Code war auch noch ein kleiner Fehler, den ich allerdings auch
> schon in der letzten Version meiner Sourcen behoben hatte: irmp.c
>
> vor
> static PROGMEM IRMP_PARAMETER thomson_param =
> steht
> #if IRMP_SUPPORT_DENON_PROTOCOL == 1
> das sollte vermutlich
> #if IRMP_SUPPORT_THOMSON_PROTOCOL == 1
> heissen, oder?

Ja, danke, das war ein Copy&Paste-Fehler.

Ich werde meine Änderungen bzgl. Thomson-Protkoll morgen mal ins SVN 
einchecken.

Gruß,

Frank

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Torsten K. schrieb:
> hier sind ein paar Scans der Pollin Merlin Tastatur, hat etwas länger
> gedauert.

Vielen Dank. Auf den ersten Blick ist das ein Bitserielles Protokoll - 
analog zur Netbox. Also weder Manchester noch Pulse-Distance, wie es bei 
Fernbedienungen üblich ist. Ich schaue mal, dass ich da einen ersten 
Prototyp im Laufe der kommenden Woche baue.

> Wenn Du noch mehr brauchst, oder bei Fragen, sag bescheid.

Danke, ich melde mich dann :-)

Gruß,

Frank

von Joachim B. (Gast)


Lesenswert?

Frank M. schrieb:
>> Gibt es eigentlich irgendwo eine Sammlung mit Scancodes?
>
> Es gibt das LIRC-Projekt. Ob es sinnvoll ist, für IRMP auch so etwas zu
> machen, weiß ich nicht.

fände ich sinnvoll, wenn z.B. eine FB kaputt geht kann man nix machen, 
würde man die Codes finden könnte man eine FB nachprogrammieren und sei 
es wenn man IRSND nur dazu benutzt eine lernfähige anzulernen, ich 
musste für Vaters VCR FB die teure Nachbau FB bestellen, hätte ich die 
Codes gefunden, genügte IRSND + eine billige Lern FB

von Joachim B. (Gast)


Lesenswert?

@frank (ukw)

gibt es die Möglichkeit das RC5 toogle Bit wieder einzufügen ?

ich hatte ja vorher den dani RC5 Code drin und nun auf IRMP umgestellt, 
Address und Data konnte ich kompatibel erstellen, aber mir fehlt zu 
einfachen Auswertung das toogle Bit für gleiche Taste oder neue Taste

irgendwie schaffe ich es nicht nur 1 Tastendruck auszuwerten, egal wie 
ich drücke entweder wird nix erkannt, zu kurz, oder zu lang und ich 
bekomme 2 steps zum einstellen, mit toogle bit wärs leichter

danke

gruss
jar

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Joachim B. schrieb:

> gibt es die Möglichkeit das RC5 toogle Bit wieder einzufügen ?

Ich sehe dafür eigentlich keine Notwendigkeit. IRMP ignoriert das 
Toggle-Bit, weil es meines Erachtens überflüssig ist. Zum "Entprellen" 
der Tastatur stellt IRMP andere (kompatible) Methoden zur Verfügung, 
s.u.

> ich hatte ja vorher den dani RC5 Code drin und nun auf IRMP umgestellt,
> Address und Data konnte ich kompatibel erstellen, aber mir fehlt zu
> einfachen Auswertung das toogle Bit für gleiche Taste oder neue Taste

Das ist einfach: IRMP setzt in flags das BIT IRMP_FLAG_REPETITION, wenn 
eine Wiederholung durch langen Tastendruck entsteht, siehe auch 
IRMP-Artikel.

Einfache Abfrage:
1
    if (irmp_data.flags & IRMP_FLAG_REPETITION)
2
    {
3
      // Benutzer hält die Taste länger runter
4
      // entweder:
5
      //   ich ignoriere die (Wiederholungs-)Taste
6
      // oder:
7
      //   ich benutze diese Info, um einen Repeat-Effekt zu nutzen
8
    }
9
    else
10
    {
11
      // Es handelt sich um eine neue Taste
12
    }

So ist das für alle von IRMP unterstützten Protokolle kompatibel gelöst 
- egal, ob das Protokoll ein Toggle-Bit bereitstellt oder nicht.

> irgendwie schaffe ich es nicht nur 1 Tastendruck auszuwerten, egal wie
> ich drücke entweder wird nix erkannt, zu kurz, oder zu lang und ich
> bekomme 2 steps zum einstellen, mit toogle bit wärs leichter

Ignoriere einfach alle Frames, wo das Bit IRMP_FLAG_REPETITION gesetzt 
ist.

Also in Deinem Fall:
1
    if (! (irmp_data.flags & IRMP_FLAG_REPETITION))
2
    {
3
      // Es handelt sich um eine neue Taste
4
      // ACTION!
5
    }

Und schon hast Du Deine FB-Tasten "entprellt" ;-)

Gruß,

Frank

von Joachim B. (Gast)


Lesenswert?

Frank M. schrieb:
> Also in Deinem Fall:
>     if (! (irmp_data.flags & IRMP_FLAG_REPETITION))
>     {
>       // Es handelt sich um eine neue Taste
>       // ACTION!
>     }
>
> Und schon hast Du Deine FB-Tasten "entprellt" ;-)
>
> Gruß,
>
> Frank

funzt, nur natürlich kein repeat mehr.....

ich muss mal sehen evt. muss ich aus diesen Infos das toogle Bit 
nachbauen

oder ich blicke noch nicht durch wie ich kurz und lang auswerten kann 
ohne delay !

ich weiss die Lösung hast du schon beschrieben, nur muss ich das in 
meinen Code pressen, oder meinen code neu schreiben, mal sehen

danke
jar

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Joachim B. schrieb:

> funzt, nur natürlich kein repeat mehr.....

Wie hast Du denn mit dem Toggle-Bit das Repeat gemacht? Wenn das 
Toggle-Bit sich nicht(!) ändert, dann Repeat wegen langem Tastendruck? 
Das entspricht doch dem Fall, dass das IRMP-Flag gesetzt ist.

Brauchst Du für jede Taste ein Repeat? Oder nur für bestimmte?

> ich weiss die Lösung hast du schon beschrieben, nur muss ich das in
> meinen Code pressen, oder meinen code neu schreiben, mal sehen

Vielleicht zeigst Du mal einen Auszug aus Deinem Code?

Gruß,

Frank

von Joachim B. (Gast)


Lesenswert?

so ungefähr, muss mich nach 3 Jahren selber wieder einfummeln, bin halt 
kein begnadeter progger, nur für den Hausgebrauch :-)

// Auszug
1
L_Com=(irmp_data.address*100)+irmp_data.command;
2
3
switch( L_Com&0x7fff )
4
// kein repeat
5
case PINN_PLAY:  // programm ausführen pinnacle taste "||>"
6
case 3053:  // programm ausführen hauppauge taste ">"
7
 if(Old_L_Com != L_Com)
8
  res_key=(1<<KEY6);
9
break;
10
11
// repeat möglich
12
case PINN_PLUS:  // kon up pinnacle taste "VOL up"
13
case 3016:  // kon up hauppauge taste "VOL up"
14
k_plus();
15
break;
16
17
aus dani code
18
void fb(void)
19
{  if( i_ )
20
  {  //_toggelbit = ( i_ >> 11 & 1);
21
    L_Com  =  (i_ >> 6 & 0x1F)*100;
22
      L_Com  +=  (i_ & 0x3F) | (~i_ >> 7 & 0x40);

von Cajus H. (cajush)


Lesenswert?

Hallo Frank,

>> Thomson Protokoll...
> Ich werde meine Änderungen bzgl. Thomson-Protkoll morgen mal ins SVN
> einchecken.
Kann es sein, dass Du noch nicht dazu gekommen bist? ;-)

Nachdem ich die Fernbedienungen aller z.Zt. in Gebrauch befindlichen 
Geräte mit IRMP einlesen konnte stehe ich nun vor der Aufgabe IRSND in 
Betrieb zu nehmen. Der aktuelle Code aus dem SVN funktionierte auf 
Anhieb, zumindest kam ein IR-Signal im 1 sec. Rythmus. Wie ich oben 
schon erwähnt habe, möchte ich eine Programmierbare FB mit Touch-Screen 
bauen. Die Touch-Software erkennt einen Tastendruck und sendet einen 
"Taste Gedrückt" Event an IRSND, zusammen mit dem Wert für Protokoll, 
Adresse und Komando. Wird der Finger vom Touch genommen kommt der "Taste 
Losgelassen" Event. In der Zwischenzeit sollte IRSND das entsprechende 
Kommando senden.

Frage: Wie lässt sich das mit IRSND realisieren?

Ein einfaches Wiederholen des Komandos bis zum Taste Losgelassen Event 
dürfte nicht funktionieren. Ich habe Funktionen, die unterschiedlich auf 
lange und kurze Tastendrücke reagieren. Beispiel Licht Schalten/Dimmen: 
Ein kurzer Tastendruck schaltet das Licht ein/aus, ein langer 
Tastendruck dimmt heller/dunkler. Hier wird RC5 Code verwendet, d.h. 
neben der "gedrückt-Zeit" das Togglebit wird mit ausgewertet. Wird der 
gleiche Code mit anderem Toggle-Bit empfangen, so wertet das der Dimmer 
als neuen Tastendruck. Würde ich also den Befehl "Licht ein/heller" so 
lange wiederholen, bis der Taste Losgelassen Event eintrifft, dann würde 
jede Wiederholung mit invertiertem Toggle Bit ausgesendet. Dies würde 
vom Dimmer aber als neuer Tastendruck gewertet, wodurch bei einem langem 
Tastendruck nicht die Funktion Dimmen, sondern nur 
ein-aus-ein-aus-ein-aus erkannt wird.

Berücksichtigt IRSND eigentlich das Toggle-Bit bei Codes, die das 
unterstützen?

Ich habe gesehen, IRSND hat den Parameter flags, mit dem man die Anzahl 
der Wiederholungen vorgeben kann. Das Problem dabei ist, in dem Moment, 
in dem die Taste gedrückt wird, weis ich noch nicht wie lange sie unten 
bleibt! Man bräuchte daher ein flag "sende bis auf Widerruf".

Und noch eine Bitte: Könntest Du das neue Thomson Protokoll in IRSND 
einbauen?

Gruß
Cajus

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Hallo Cajus,

Cajus H. schrieb:

>> Ich werde meine Änderungen bzgl. Thomson-Protkoll morgen mal ins SVN
>> einchecken.
> Kann es sein, dass Du noch nicht dazu gekommen bist? ;-)

Upps, habe ich das tatäschlich vergessen? Naja, bis auf die 3 defines 
habe ich da nichts großartiges geändert. Okay, werde ich nachholen.

> [...] Wird der Finger vom Touch genommen kommt der "Taste
> Losgelassen" Event. In der Zwischenzeit sollte IRSND das entsprechende
> Kommando senden.
>
> Frage: Wie lässt sich das mit IRSND realisieren?

Gute Frage. Ich würde auf den ersten Blick sagen, dass Du, bis das 
Loslassen-Event kommt, immer wieder irsnd_send_data() aufrufst.

> Ein einfaches Wiederholen des Komandos bis zum Taste Losgelassen Event
> dürfte nicht funktionieren.

Warum nicht? Wenn das Problem lediglich das Toggle-Bit ist, werden wir 
das auch lösen können. Ich habe da auch schon eine Idee, siehe weiter 
unten.

> Ich habe Funktionen, die unterschiedlich auf
> lange und kurze Tastendrücke reagieren. Beispiel Licht Schalten/Dimmen:
> Ein kurzer Tastendruck schaltet das Licht ein/aus, ein langer
> Tastendruck dimmt heller/dunkler. Hier wird RC5 Code verwendet, d.h.
> neben der "gedrückt-Zeit" das Togglebit wird mit ausgewertet. Wird der
> gleiche Code mit anderem Toggle-Bit empfangen, so wertet das der Dimmer
> als neuen Tastendruck.

Wenn ich es recht in Erinnerung habe, toggelt IRSND das Toggle-Bit nicht 
in Wiederholungen, die durch den flags-Wert angegeben ist, sondern nur 
bei erneutem Aufruf von irsnd_send_data(). So sollte es jedenfalls 
sein... und so brauchst Du das ja prinzipiell auch.

> Würde ich also den Befehl "Licht ein/heller" so
> lange wiederholen, bis der Taste Losgelassen Event eintrifft, dann würde
> jede Wiederholung mit invertiertem Toggle Bit ausgesendet.

Korrekt.

> Dies würde
> vom Dimmer aber als neuer Tastendruck gewertet, wodurch bei einem langem
> Tastendruck nicht die Funktion Dimmen, sondern nur
> ein-aus-ein-aus-ein-aus erkannt wird.

Okay, habe ich verstanden. Ist das Dein eigens entwickelter Dimmer? 
Sowas am Toggle-Bit festzumachen, ist eine höchst inkompatible 
Geschichte, wenn man an andere IR-Protokolle denkt ;-)

> Berücksichtigt IRSND eigentlich das Toggle-Bit bei Codes, die das
> unterstützen?

Ja, sollte IRSND berücksichtigen. Bei jedem erneuten Aufruf von 
irsnd_send_data() wird getogglet, innerhalb der flags-Wiederholungen 
nicht.

> Ich habe gesehen, IRSND hat den Parameter flags, mit dem man die Anzahl
> der Wiederholungen vorgeben kann. Das Problem dabei ist, in dem Moment,
> in dem die Taste gedrückt wird, weis ich noch nicht wie lange sie unten
> bleibt! Man bräuchte daher ein flag "sende bis auf Widerruf".

Ja, genau DAS ist das Problem, was ich bei meiner lernfähigen FB, die 
mein Sohn und ich im gesonderten Artikel vorgestellt hatten, auch hatte.

Deshalb rufe ich irsnd_send_data() in einer Schleife mit flags = 0 auf, 
wenn ich Wiederholungen senden möchte (Code dazu s. ganz unten). Da wird 
aber das Toggle-Bit immer wieder geändert... nicht schön.

Ich hätte folgenden Vorschlag zur Änderung der Software:

1. Die Anzahl der Wiederholungen werden im unteren Nibble von
   flags abgelegt, es sind dann nur noch Werte von 0 bis 15 möglich.
   Mehr als 15 Wiederholungen (in einem Satz) braucht keiner, außer...
   siehe Punkt 2.

   Damit gewinne ich 4 Bit, die ich zukünftig als flags gebrauchen kann.

2. Der Wert flags = 15 führt dazu, dass IRSND die Frames endlos
   wiederholt, also bis in alle Ewigkeit sendet. Hier würde dann
   natürlich ein Toggle-Bit nicht geändert werden - wie jetzt auch.

3. Es gibt eine neue Funktion irsnd_stop(), welche das weitere Senden
   von Wiederholungen nach Abschluss des aktuell gesendeten Frames
   unterbindet. Damit kann man dann das endlose Senden dann wieder
   stoppen.

Fürs API würde ich folgende 4 Konstanten vorsehen:

#define IRSND_NO_REPETITIONS       0    // no repetitions
#define IRSND_MAX_REPETITIONS     14    // max # of repetitions
#define IRSND_ENDLESS_REPETITION  15    // endless repetions
#define IRSND_REPETITION_MASK     0x0F  // lower nibble of flags

Du könntest dann beim "Taste Gedrückt" Event die Funktion 
irsnd_send_data() mit flags = IRSND_ENDLESS_REPETITION aufrufen. Sobald 
Deine Software das "Taste Losgelassen" Event schickt, rufst Du 
irsnd_stop() auf.

Wäre Dir damit geholfen?

> Und noch eine Bitte: Könntest Du das neue Thomson Protokoll in IRSND
> einbauen?

Ja, kann ich machen. Ich komme zu all diesen Änderungen aber frühestens 
am Sontagabend (spät!).

Gruß,

Frank

P.S.
IRSND hat im Moment auch noch einen unschönen Bug, den ich dabei auch 
noch loswerden möchte: Nach Aussenden des gewünschten Frames wird die 
Pause-Zeit zum nächsten Frame nicht eingehalten, wenn man 
irsnd_send_data() direkt wieder aufruft. Innerhalb von flags > 0 wird 
das korrekt eingehalten, aber nach dem letzten gesendeten Frame kann man 
direkt wieder mittels irsnd_send_data() "feuern". Das ist unschön.

Ich habe das in der DIY-FB erstmal als Hack folgendermaßen gelöst:
1
        while (cnt > 0)                                             // send cnt frames
2
        {
3
            irsnd_send_data (&(irmp_data[k]), TRUE);                // send IR code now
4
5
            while (irsnd_is_busy ())                                // HACK: wait until IRSND is ready
6
            {
7
                ;
8
            }
9
10
            _delay_ms (50);                                         // wait 50 msec to force a pause between frames
11
            cnt--;
12
        };

Ich weiß, das ist unschön. Deshalb werde ich den Bug in IRSND 
schnellstmöglich fixen.

von Cajus H. (cajush)


Lesenswert?

Hallo Frank,

> Ist das Dein eigens entwickelter Dimmer?
Ja
> Sowas am Toggle-Bit festzumachen, ist eine höchst inkompatible
> Geschichte, wenn man an andere IR-Protokolle denkt ;-)
Dem will ich nicht widersprechen, aber die Abhängigkeit vom Toggle-Bit 
ist nicht auf meinem Mist gewachsen. Ich habe bei diversen alten Philips 
TV Geräten und anderen mit RC5 arbeitenden FBs eine ähnliches Verhalten 
festgestellt: Lautstärke + gedrückt halten hat nur funktioniert, wenn 
sich das Toggle Bit NICHT geändert hat.

> 1. Die Anzahl der Wiederholungen werden im unteren Nibble von
>   flags abgelegt, es sind dann nur noch Werte von 0 bis 15 möglich.
>   Mehr als 15 Wiederholungen (in einem Satz) braucht keiner, außer...
>   siehe Punkt 2.
>
>   Damit gewinne ich 4 Bit, die ich zukünftig als flags gebrauchen kann.

OK. Ich hoffe es schreit dann keiner "Ich brauche aber 20 
Wiederholungen!"

> 2. Der Wert flags = 15 führt dazu, dass IRSND die Frames endlos
>   wiederholt, also bis in alle Ewigkeit sendet. Hier würde dann
>   natürlich ein Toggle-Bit nicht geändert werden - wie jetzt auch.

Gut. Vielleicht sollte man eine "Notabschaltung" nach einigen Sekunden 
vorsehen (per #define sollte reichen), sonst ist bei batteriebetriebenen 
Geräten und einem verloren gegangenen Loslass-Event jedes mal die 
Batterie alle ;-). So etwas kann man auch in main() realisieren, dann 
bläht das nicht die Interrupt Routine auf.

> 3. Es gibt eine neue Funktion irsnd_stop(), welche das weitere Senden
>   von Wiederholungen nach Abschluss des aktuell gesendeten Frames
>   unterbindet. Damit kann man dann das endlose Senden dann wieder
>   stoppen.

Perfekt!

> Wäre Dir damit geholfen?

Sehr!

>> Und noch eine Bitte: Könntest Du das neue Thomson Protokoll in IRSND
>> einbauen?
> Ja, kann ich machen.

Danke!
Bitte im Thomson Protokoll auch das Toggle-Bit berücksichtigen!

> IRSND hat im Moment auch noch einen unschönen Bug...
> Nach Aussenden des gewünschten Frames wird die Pause-Zeit zum
> nächsten Frame nicht eingehalten...

Danke für den Hinweis. Ich sehe das aber nicht als so schlimm an, das 
kann ruhig in main() erledigt werden. Schreib doch einfach den Hinweis 
und den Code in irsndmain.c. Ich halte das für völlig ausreichend.

Gruß
Cajus

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Frank M. schrieb:

> Ich hätte folgenden Vorschlag zur Änderung der Software:
>
> 1. Die Anzahl der Wiederholungen werden im unteren Nibble von
>    flags abgelegt, es sind dann nur noch Werte von 0 bis 15 möglich.
>    Mehr als 15 Wiederholungen (in einem Satz) braucht keiner, außer...
>    siehe Punkt 2.
>
>    Damit gewinne ich 4 Bit, die ich zukünftig als flags gebrauchen kann.

Die Änderung ist nun im SVN.

> 2. Der Wert flags = 15 führt dazu, dass IRSND die Frames endlos
>    wiederholt, also bis in alle Ewigkeit sendet. Hier würde dann
>    natürlich ein Toggle-Bit nicht geändert werden - wie jetzt auch.

Bei flags == IRSND_ENDLESS_REPETITION wird der erzeugte Frame endlos 
geschickt. Nein, stimmt nicht ganz: Nach max. 256 Frames wird aufgehört, 
um die Batterie nicht komplett leerzulutschen :-)

Auch diese Änderung ist im SVN.

> 3. Es gibt eine neue Funktion irsnd_stop(), welche das weitere Senden
>    von Wiederholungen nach Abschluss des aktuell gesendeten Frames
>    unterbindet. Damit kann man dann das endlose Senden dann wieder
>    stoppen.

Ist nun auch im SVN.

> Fürs API würde ich folgende 4 Konstanten vorsehen:
>
> #define IRSND_NO_REPETITIONS       0    // no repetitions
> #define IRSND_MAX_REPETITIONS     14    // max # of repetitions
> #define IRSND_ENDLESS_REPETITION  15    // endless repetions
> #define IRSND_REPETITION_MASK     0x0F  // lower nibble of flags

Ist ebenso umgesetzt.

> IRSND hat im Moment auch noch einen unschönen Bug, den ich dabei auch
> noch loswerden möchte: Nach Aussenden des gewünschten Frames wird die
> Pause-Zeit zum nächsten Frame nicht eingehalten, wenn man
> irsnd_send_data() direkt wieder aufruft. Innerhalb von flags > 0 wird
> das korrekt eingehalten, aber nach dem letzten gesendeten Frame kann man
> direkt wieder mittels irsnd_send_data() "feuern". Das ist unschön.

Diesen Bug habe ich nun auch gefixt. Ist zwar noch nicht optimal, aber 
ich bin erstmal damit zufrieden. Die Pause wird nämlich erst dann 
eingefügt, wenn auch tatsächlich ein 2. Frame auf die Reise geschickt 
wird.

Desweiteren habe ich das THOMSON-Protokoll in den IRSND eingebaut.

Cajus H. (cajush):

Kannst Du das bitte testen und berichten?

Gruß,

Frank

von Torsten K. (nobby)


Lesenswert?

Hy Frank,

gibts schon was neues zur Pollin Merlin Tastatur, oder hab ich das hier 
überlesen ??

Gruß
Torsten

von Cajus H. (cajush)


Lesenswert?

Hallo Frank,

Frank M. schrieb:
> Cajus H. (cajush):
>
> Kannst Du das bitte testen und berichten?

Da ist ein Copy&Paste Fehler in irmp.c
nach
#if IRMP_SUPPORT_MERLIN_PROTOCOL == 1

static PROGMEM IRMP_PARAMETER netbox_param =
sollte vermutlich
static PROGMEM IRMP_PARAMETER merlin_param =
heissen...

Danach arbeitet IRMP gut und liefert sinnvolle Werte für das Thomson 
Protokoll.

IRSND - mein main() sieht so aus:

int main (void)
{
  IRMP_DATA irmp_data;

  irsnd_init(); // initialize irsnd
  timer_init(); // initialize timer
  sei();        // enable interrupts

  for (;;)
  {
    irmp_data.protocol = IRMP_THOMSON_PROTOCOL;
    irmp_data.address  = 0x03;
    irmp_data.command  = 0x1d;
    irmp_data.flags    = 15;

    irsnd_send_data (&irmp_data, TRUE);
    _delay_ms (10000);
    irsnd_stop ();
    _delay_ms (3000);

  }
}
Es sollte also 10 Sekunden das Kommando 0x1d senden, dann 3 Sekunde 
Pause und wieder von vorne. Es passiert aber folgendes:
- 10 Sekunden Senden
- 3 Sekunden Pause
- Senden bis die Batterie alle ist.
Scheinbar funktioniert das irsnd_stop(); nur einmal ?!
Wenn ich
irmp_data.flags = 14;
setze, dann funktioniert es. (auch mit dem irsnd_stop(), vermutlich weil 
das Senden von 14 Wiederholungen keine 10 Sekunden dauert...)
Das Beenden des Sendens nach 256 Wiederholungen funktioniert, außer im 
Fall oben, da hört IRSND mit dem Senden nicht mehr auf,

Gruß
Cajus

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Hallo Cajus,

Cajus H. schrieb:

> Da ist ein Copy&Paste Fehler in irmp.c

Danke, ist korrigiert.

> Es sollte also 10 Sekunden das Kommando 0x1d senden, dann 3 Sekunde
> Pause und wieder von vorne. Es passiert aber folgendes:
> - 10 Sekunden Senden
> - 3 Sekunden Pause
> - Senden bis die Batterie alle ist.

Danke für den Test, ich habe den Fehler gefunden und korrigiert. 
irsnd_stop() sollte nun tun, was es soll.

Klappt das denn nun auch mit dem Toggle-Bit, so wie Du es mir 
beschrieben hat? Kann Dein Dimmer nun lange Tastendrücke von mehrfachen 
Tastendrücken per Toggle-Bit unterscheiden?

> Scheinbar funktioniert das irsnd_stop(); nur einmal ?!

Nein, es funktionierte keinmal. irsnd_stop() hatte die falsche Variable 
zurückgesetzt. Das hatte schlicht und ergreifend "Null Effekt".

Korrektur ist im SVN eingecheckt.

Gruß,

Frank

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Hallo Torsten,

Torsten K. schrieb:

> gibts schon was neues zur Pollin Merlin Tastatur, oder hab ich das hier
> überlesen ??

Sorry, habs noch nicht geschafft, die Merlin-Tastatur komplett auf alle 
Tastendrücke durchzuchecken. Ich hoffe, ich schaffe es im Laufe der 
Woche.

Gruß,

Frank

von Joachim B. (Gast)


Lesenswert?

Frank M. schrieb:
> och, wird erkannt. Das ist das NEC16-Protokoll

hmm, guten abend

habe gerade mal das aktuelle aus dem SVN installiert

NEC16 flattert nun über alle möglichen Erkennungen NEC16 MERLIN RUWIDO 
kommt alles mögliche bei repeat (also wenn ich den Finger auf der Taste 
lasse)

SAMSUNG32 ist stabil

KASEIKYO flattert wenig aber ich sehe dabei auch gel. MERLIN und SIEMENS

IRMP - Infrared Multi Protocol Decoder
--------------------------------------
Version IRMP:  2.0.0-pre4 20.05.2010
Version IRSND: 1.9.4      22.05.2010

??? wunder einige Sourcen waren vom 22.5. also aktuell

irgendwas ist instabil

evt. schaust mal ?

gruss
jar

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Joachim B. schrieb:

> NEC16 flattert nun über alle möglichen Erkennungen NEC16 MERLIN RUWIDO
> kommt alles mögliche bei repeat (also wenn ich den Finger auf der Taste
> lasse)

Was meinst Du damit? Dass bei einer NEC16-FB zwischendurch auch mal 
MERLIN oder RUWIDO erkannt wird? Welche Protokolle hast Du alle 
eingeschaltet?

> KASEIKYO flattert wenig aber ich sehe dabei auch gel. MERLIN und SIEMENS

Hier also KASEIKYO-FB, wo ab und zu MERLIN bzw. SIEMENS ausgegeben wird?

> irgendwas ist instabil

Ich bräuchte Deine irmpconfig.h, um das nachzustellen. Quarz ist 
angeschlossen und aktiv?

Gruß,

Frank

von Joachim B. (Gast)


Angehängte Dateien:

Lesenswert?

Frank M. schrieb:
> as meinst Du damit? Dass bei einer NEC16-FB zwischendurch auch mal
> MERLIN oder RUWIDO erkannt wird? Welche Protokolle hast Du alle
> eingeschaltet?

genau bleibe ich auf der Taste werden reium alle mal erkannt

alle ausser on >15000 Hz und Prototyp Protokoll 99

> Hier also KASEIKYO-FB, wo ab und zu MERLIN bzw. SIEMENS ausgegeben wird?
> Ich bräuchte Deine irmpconfig.h, um das nachzustellen. Quarz ist
> angeschlossen und aktiv?

ohne Quarz, war aber vorher stabiler

von Joachim B. (Gast)


Lesenswert?

PS könnte man proto String nicht integrieren ?

muss den immer nachfummeln bei jedem Update
1
static char *Proto[]={ \
2
"SIRCS","NEC","SAMSUNG","MATSUSH","KASEIKYO","RECS80","RC5(x)","DENON","RC6","SAMSG32",\
3
"APPLE","RECS80x","NUBERT","BANG_OLUF","GRUNDIG","NOKIA","SIEMENS","FDC","RCCAR","JVC",\
4
"RC6A","NIKON", "RUWIDO","IR60","KATHREIN","NETBOX","NEC16","NEC42","LEGO","THOMSON", \
5
"MERLIN"};

von Joachim B. (Gast)


Lesenswert?

noch ein kleines Problem:

wird nach
irmp_get_data(&irmp_data)

das irmp_get_data FLAG nicht gelöscht ?

ich kann nur zwischen den Drücken unterscheiden wenn ich zwischendurch 
eine andere Taste drücke

drücke ich die Taste 1x und halte fest, lasse los und drück die selbe 
toogelt das Repeat Bit nicht, erst wenn ci zwischendurch ne andere 
drücke, dabei sollte z.B. TASTE 1 toggeln, wenn losgelassen und wieder 
gedrückt wird ..
1
    if (irmp_get_data(&irmp_data))
2
     {  
3
      merke_fb=(irmp_data.address*100)+irmp_data.command;
4
      L_Com=merke_fb;
5
      merke_rc5=merke_fb;
6
7
      if (irmp_data.flags & IRMP_FLAG_REPETITION)
8
       {   // Benutzer hält die Taste länger runter
9
          // entweder:
10
          //   ich ignoriere die (Wiederholungs-)Taste
11
          // oder:
12
          //   ich benutze diese Info, um einen Repeat-Effekt zu nutzen
13
        merke_fb  |= (1<<15);
14
        merke_rc5       |= (1<<15);
15
        L_Com    |= (1<<15);
16
                                // simmuliere TOGGELbit
17
        }
18
       else // if (irmp_data.flags & IRMP_FLAG_REPETITION)
19
       {   // Es handelt sich um eine neue Taste
20
        show_irmp=5;
21
        merke_fb    &= ~(1<<15);
22
        merke_rc5  &= ~(1<<15);
23
        L_Com      &= ~(1<<15);
24
                                // simmuliere TOGGELbit

von Joachim B. (Gast)


Lesenswert?

keine Antwort ? liegts an mir (weil ich mich unwissend anstelle?)

ich versuchs mal anders zu erklären

DU kennst doch typische Puls- Pausenlängen

ergo müsste es doch in IRMP auffallen wenn zwischen 2 Tastendrücken der 
selbe Code kommt oder innerhalb der Repeatframezeit der selbe Code 
einläuft und das Repeatflag entsprechend gesetzt wird.

Ich blick immer noch nicht durch wielange IRMP das Flag "Code erkannt" 
vorrätig hält, für mein Geschmack wäre es richtig bis man es ausgelesen 
hat, man guckt ja als Controller nicht ständig :-)

bei meiner KEY Abfrage mache ich es so, lese KEY, werte Key aus, lösche 
den gelesen KEY und wenn nix zu tun ist und KEY leer ist, dann hole dir 
wieder einen KEY wenn vorhanden

und da ich KEY und IR benutze wäre es schön wenn man das zusammen 
bekommt

nur muss ich ja die IR Flags befragen und wenn da ewig welche abzuholen 
sind kann ich nicht erkennen ob ich den schon mal geholt habe, bzw. kann 
ja ein neuer KEY , ähhh, IR Code sein der durchaus identisch mit dem 
Vorcode ist, trotzem ist er neu und es sollte toggeln....

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Joachim B. schrieb:
> keine Antwort ? liegts an mir (weil ich mich unwissend anstelle?)

Ich habe Dir bisher nicht antworten können, weil ich noch ein 
Privatleben ohne µC und Elektronik habe ;-)

> ich versuchs mal anders zu erklären
> [...]

Da ich an den Timingparametern nichts geändert habe, kann ich mir im 
Moment gar nicht vorstellen, wo Deine Probleme herrühren. Im Moment kann 
ich mir da nur den fehlenden Quarz vorstellen. Sonst helfen mir da nur 
intensive Tests weiter.

Am Donnerstagabend habe ich vielleicht Zeit, Dein Szenario 
durchzuspielen. Dann kann ich Dir auch antworten. Vorher schaffe ich es 
leider nicht, sorry.

> nur muss ich ja die IR Flags befragen und wenn da ewig welche abzuholen
> sind kann ich nicht erkennen ob ich den schon mal geholt habe, bzw. kann
> ja ein neuer KEY , ähhh, IR Code sein der durchaus identisch mit dem
> Vorcode ist, trotzem ist er neu und es sollte toggeln....

Wenn der nächste IR-Frame innerhalb IRMP_KEY_REPETITION_LEN (150 msec) 
reinkommt, dann geht IRMP davon aus, dass die FB automatisch repetiert. 
Dann wird das Repetition-Flag gesetzt. Das funktioniert sehr gut. Wenn 
Du selber mit dem Finger repetierst, wirst Du das nicht so schnell 
schaffen und IRMP setzt dann auch nicht(!) das Repetition-Flag. Also 
vergiss das mit dem Toggle, das geht nur bei RC5, RC6 und Thomson. Bei 
den 27 anderen FB-Protokollen, die IRMP unterstützt, gibt es gar kein 
Toggle-Bit. Daher kann ich das auch gar nicht auswerten.

EDIT: Wenn Du das Toggle-Bit simulieren musst, weil Du anderen Code 
verwendest, der nicht auf das RC5-Toggle-Bit verzichten kann, dann mach 
einfach folgendes:

 - Repetition-Flag gesetzt: dann nicht togglen
 - Repetition-Flag nicht gesetzt: dann togglen

Dann sollte auch RC5-Legacy-Code zusammen mit IRMP funktionieren ;-)

Gruß,

Frank

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Joachim B. schrieb:

> bei meiner KEY Abfrage mache ich es so, lese KEY, werte Key aus, lösche
> den gelesen KEY und wenn nix zu tun ist und KEY leer ist, dann hole dir
> wieder einen KEY wenn vorhanden

Wenn was zu tun ist: Wie lange brauchst Du, um den Key abzuarbeiten?

Bitte möglichst in msec angeben :-)

Sobald IRMP einen Frame eingelesen hat, sperrt er den Empfang weiterer 
IR-Signale solange, bis Du den Code auch abholst.

Ich kann mir ein Szenario vorstellen, wo das in die Hose geht.

1. Du hältst den Finger auf eine FB-Taste
2. IRMP empfängt 1. Frame
3. Du holtst ihn ab und verarbeitest den Key...
4. Währenddessen empfängt IRMP den 2. Frame und speichert die Daten
5. Du verarbeitest aber immer noch den 1. Key -> IRMP sperrt den Empfang
6. Es kommt der 3. Frame, aber IRMP empfängt nicht
7. Du bist mit der Verarbeitung fertig - mitten im Frame 3
8. Du holst den 2. Frame ab, IRMP gibt den Empfang wieder frei
9. Ein Restfragment vom 3. Frame wird von IRMP aufgezeichnet und
   fälschlicherweise als irgendein Protokoll erkannt, vorzugsweise eines
   ohne ausgezeichnetes Start-Bit.

Wenn dem so ist, kann ich das nur lösen, indem IRMP den Empfang nicht 
sperrt, aber das Ergebnis anschließend verwirft, solange Du den Frame 
davor nicht abgeholt hast.

Gruß,

Frank

von Joachim B. (Gast)


Lesenswert?

natürlich darfst du ein Privatleben haben, ich hab momentan keines und 
bin deswegen so ungeduldig ?

Frank M. schrieb:
> Ich kann mir ein Szenario vorstellen, wo das in die Hose geht.
>
> 1. Du hältst den Finger auf eine FB-Taste

logisch, ich weiss ja nicht wann der Code vollständig empfangen wurde 
bis das gewünschte passiert, vermutlich auch das Problem das der Buffer 
meiner lernfähigen FB nie reicht für 4-8 Fernbedienungen (wie der 
Aufdruck und die Werbung behaupten), immer sagt die lern FB : Buffer 
voll obwohl nur 2 halbe FBs (Kaseikyo) gelernt wurden.

Kann aber auch sein die Befehle wurden immer länger und der Speicher der 
FB (alte >5 Jahre  und NEUE !!! grad gekauft ) ist zu knapp

> 2. IRMP empfängt 1. Frame
> 3. Du holtst ihn ab und verarbeitest den Key...
> 4. Währenddessen empfängt IRMP den 2. Frame und speichert die Daten
> 5. Du verarbeitest aber immer noch den 1. Key -> IRMP sperrt den Empfang
> 6. Es kommt der 3. Frame, aber IRMP empfängt nicht

das könnte genau so laufen

> 7. Du bist mit der Verarbeitung fertig - mitten im Frame 3
> 8. Du holst den 2. Frame ab, IRMP gibt den Empfang wieder frei
> 9. Ein Restfragment vom 3. Frame wird von IRMP aufgezeichnet und
>    fälschlicherweise als irgendein Protokoll erkannt, vorzugsweise eines
>    ohne ausgezeichnetes Start-Bit.
>
> Wenn dem so ist, kann ich das nur lösen, indem IRMP den Empfang nicht
> sperrt, aber das Ergebnis anschließend verwirft, solange Du den Frame
> davor nicht abgeholt hast.

wielange KEY dauert ? oder die Abarbeitung nach KEY ? das letztere werde 
ich nie rausfinden, es gibt nur 6 Tasten die in jedem Menue und 
Untermenue je nach Bedingung verschiedenes tun, also die 
Verarbeitungsdauer nach KEY lesen ist unbestimmt

ein Riesendanke für deine Bemühungen

von Joachim B. (Gast)


Lesenswert?

ich hatte mir was überlegt, aber das scheint auch nicht zu klappen

ich dachte wenn ich ein Bit selber toggeln lasse, in der Art,

...

klappt aber auch nicht, evt. kannst du ein Flag einbauen welches immer 
toggelt wenn eine neue Taste kommt oder wenn eine FramePause erkannt 
wurde also die FB Taste mal nicht gedrückt war
1
void fb(void)
2
{  
3
  if (irmp_get_data(&irmp_data) && !strcmp((char *)Proto[irmp_data.protocol-1], "RC5(x)") )
4
  {  
5
    L_Com&=0x8000; // loesche L_Com aber behalte das alte toggleBIT
6
    L_Com|=(((irmp_data.address*100)+irmp_data.command)&0x7fff); // addiere neues L_Com aber behalte das alte toggleBIT
7
    merke_rc5=L_Com;
8
9
    if (irmp_data.flags & IRMP_FLAG_REPETITION)
10
     {   // Benutzer hält die Taste länger runter
11
        // entweder:
12
        //   ich ignoriere die (Wiederholungs-)Taste
13
        // oder:
14
        //   ich benutze diese Info, um einen Repeat-Effekt zu nutzen
15
      // toggleBIT aendert nicht
16
      }
17
     else // if (irmp_data.flags & IRMP_FLAG_REPETITION)
18
     {   // Es handelt sich um eine neue Taste
19
      show_irmp=5;
20
      //_merke_toggleBIT^=(1<<15);
21
      L_Com  ^= (1<<15);       // toggleBIT aendert sich
22
      merke_rc5=L_Com;
23
    }
24
        // ....
25
        // ab hier mache ich weiter wie frueher
26
        // ....
27
        // ....
28
        // ....
29
        // ....
30
        // ....
31
        // ....
32
        
33
        
34
   } // if(irmp_get_data(&irmp_data) && !strcmp((char *)Proto[irmp_data.protocol-1], "RC5(x)") )
35
  else
36
  {
37
      L_Com  ^= (1<<15);
38
    // toggleBIT aendert sich
39
  }
40
}

von Joachim B. (Gast)


Lesenswert?

warum ist das toggleBIT eigendlich nicht im IRMP erkannten RC5 Code 
vorhanden ?

dann könnte man sich diese Quälerei sparen, im RC5 wird es ja 
mitgeliefert und ich brauche nicht zu tricksen

wenn der Umbau aber klappt mit toggle selber erzeugen -

(nach meinem Vorschlag: evt. kannst du ein Flag einbauen welches immer
toggelt wenn eine neue Taste kommt oder wenn eine FramePause erkannt
wurde also die FB Taste mal nicht gedrückt war )

- für alle Codes waere das auch fein

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Joachim B. schrieb:
> warum ist das toggleBIT eigendlich nicht im IRMP erkannten RC5 Code
> vorhanden ?

Weil Du dann für ein- und dieselbe Taste zwei unterschiedliche Codes 
bekommen würdest.

> dann könnte man sich diese Quälerei sparen, im RC5 wird es ja
> mitgeliefert und ich brauche nicht zu tricksen

Die "Quälerei" hast Du nur deshalb, weil Du Code benutzt, der Original 
RC5 sehen will. IRMP wandelt die Daten aber in ein portables Format, was 
für alle Protokolle einheitlich ist.

> wenn der Umbau aber klappt mit toggle selber erzeugen -
>
> (nach meinem Vorschlag: evt. kannst du ein Flag einbauen welches immer
> toggelt wenn eine neue Taste kommt oder wenn eine FramePause erkannt
> wurde also die FB Taste mal nicht gedrückt war )

Ich habe doch schon geschrieben: Wenn Repetition-Flag nicht gesetzt, 
dann togglen, wenn Flag gesetzt, dann nicht togglen. Hast Du das 
überlesen?

> - für alle Codes waere das auch fein

Warum sollte ich ein Toggle-Bit künstlich einbauen? Die anderen 
Protokolle kennen doch gar kein Toggle-Bit. Dafür gibt es doch das 
Repetition-Flag in IRMP. Das ist doch viel einfacher zu handhaben als so 
ein Toggle-Bit.

Gruß,

Frank

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Joachim B. schrieb:
> ich hatte mir was überlegt, aber das scheint auch nicht zu klappen
1
> void fb(void)
2
> {
3
>   if (irmp_get_data(&irmp_data) && !strcmp((char
4
> *)Proto[irmp_data.protocol-1], "RC5(x)") )
5
>   {
6
>     L_Com&=0x8000; // loesche L_Com aber behalte das alte toggleBIT

Wie kommst Du auf die Idee, dass das Toggle-Bit an der 16. Stelle sitzt?
1
>       L_Com  ^= (1<<15);

Auch hier:

Wie kommst Du auf die Idee, dass das Toggle-Bit an der 16. Stelle sitzt?

Schau Dir bitte http://www.sbprojects.com/knowledge/ir/rc5.htm an.

merke_rc5 wird bei Dir gesetzt aber nie benutzt?

Machs doch einfach so:
1
void fb(void)
2
{
3
    static uint16_t toggle_bit;
4
    ...
5
6
    toggle_bit ^= (1<<11);    // Togglen
7
    L_Com|= toggle_bit;
8
    ...
9
}

Und noch etwas:

Dein

   if (... !strcmp((char *)Proto[irmp_data.protocol-1], "RC5(x)"))

ist suboptimal und kostet viel CPU-ZEIT. Warum nicht einfach:

   if (... irmp_data.protocol == IRMP_RC5_PROTOCOL)

Das ist nur ein int16-Vergleich und geht wesentlich schneller als Dein 
Zeichenkettenvergleich. Warum machst Du so etwas?

Gruß,

Frank

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Deine fb-Funktion ist absoluter Murks, der else-Block ganz am Ende 
gehört da auch nicht hin.

Ich schreibe das mal neu:
1
void fb(void)
2
{  
3
  static uint16_t toggle_bit;
4
5
  if (irmp_get_data(&irmp_data) && irmp_data.protocol == IRMP_RC5_PROTOCOL)
6
  {  
7
    L_Com = (((irmp_data.address*100) + irmp_data.command) & 0x7fff); // L_Com aus Adresse und Kommando zusammenbauen
8
9
    if (! (irmp_data.flags & IRMP_FLAG_REPETITION))
10
    {
11
      toggle_bit ^= (1<<11);    // Togglen
12
      L_Com |= toggle_bit;
13
    }
14
15
16
    // ....
17
    // ab hier mache ich weiter wie frueher
18
    // ....
19
20
  }
21
22
  // KEIN ELSE!!!!
23
}

So einfach ist das. :-)

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Zusatz:

Was soll der Ausdruck ((irmp_data.address*100) + irmp_data.command) & 
0x7fff)

Adresse mal hundert + Kommando? Verstehe ich nicht. Damit baust Du 
jedenfalls nicht den Original-Frame zusammen, sondern irgendeine 
Zufallszahl.

von Joachim B. (Gast)


Lesenswert?

Frank M. schrieb:
> Warum sollte ich ein Toggle-Bit künstlich einbauen? Die anderen
> Protokolle kennen doch gar kein Toggle-Bit. Dafür gibt es doch das
> Repetition-Flag in IRMP. Das ist doch viel einfacher zu handhaben als so
> ein Toggle-Bit.
> Gruß,
> Frank

also im RC5 Code wäre es nicht künstlich eingebaut, da wird das 
mitgeliefert und damit lief mein altes Programm genau wie geplant, ich 
verstehe halt nicht warum IRMP das nicht durchreichen kann ?

Frank M. schrieb:
> Dein
>
>    if (... !strcmp((char *)Proto[irmp_data.protocol-1], "RC5(x)"))
>
> ist suboptimal und kostet viel CPU-ZEIT. Warum nicht einfach:
>
>    if (... irmp_data.protocol == IRMP_RC5_PROTOCOL)
>
> Das ist nur ein int16-Vergleich und geht wesentlich schneller als Dein
> Zeichenkettenvergleich.

ja klar

> Warum machst Du so etwas?

weil das für mich der schnellste Weg war ohne IRMP vollständig zu 
erkunden ?
ich wusste RC5 wird per String ausgegeben wenn erkannt, also war das 
mein Unterscheidungsmerkmal, natürlich suboptimal und kann man ja 
korrigieren, zur Codeoptimierung kann ich ja später vordringen wenns 
erst mal läuft, wenn natürlich schon vorher gute Ideen einfliessen warum 
nicht zur Laufzeit der Prog.Entwicklung einfliessen lassen, mach ich nun

Frank M. schrieb:
> Deine fb-Funktion ist absoluter Murks, der else-Block ganz am Ende
> gehört da auch nicht hin.
>
> Ich schreibe das mal neu:
> ...
> So einfach ist das. :-)


ich probiere es ;-)))

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Joachim B. schrieb:
> also im RC5 Code wäre es nicht künstlich eingebaut, da wird das
> mitgeliefert und damit lief mein altes Programm genau wie geplant, ich
> verstehe halt nicht warum IRMP das nicht durchreichen kann ?

Habe ich doch geschrieben: Dann würdest Du im IRMP für ein- und dieselbe 
Taste 2 verschiedene Codes bekommen.

> weil das für mich der schnellste Weg war ohne IRMP vollständig zu
> erkunden ?

Die Konstante steht in irmp.h und im IRMP-Artikel steht ein 
Anwendungsbeispiel:

   http://www.mikrocontroller.net/articles/IRMP#Anwendung_von_IRMP

Zitat:
1
      if (irmp_data.protocol == IRMP_NEC_PROTOCOL &&     // NEC-Protokoll
2
          irmp_data.address == 0x1234)                   // Adresse 0x1234

> ich wusste RC5 wird per String ausgegeben wenn erkannt, also war das
> mein Unterscheidungsmerkmal, natürlich suboptimal und kann man ja
> korrigieren, zur Codeoptimierung kann ich ja später vordringen wenns
> erst mal läuft, wenn natürlich schon vorher gute Ideen einfliessen warum
> nicht zur Laufzeit der Prog.Entwicklung einfliessen lassen, mach ich nun

Jetzt verstehe ich auch, warum Du wolltest, dass ich die Texte in main.c 
vervollständige... :-)

> ich probiere es ;-)))

Viel Glück! :-)

von Joachim B. (Gast)


Lesenswert?

funktioniert nicht :-(

Codes werden mehrfach erkannt und sofort ohne Zwischenstop falsch 
abgearbeitet

also Menue -> ENTER -> Untermenue und da warten bis andere Taste oder 
ENTER wieder neu ! gedrückt wird

wird in einem Rutsch abgearbeitet, keine Chance im Untermenue noch 
Optionen zu wählen

wenn ich also auf der FB Taste gedrückt bleibe ! werden die Aktionen im 
ca. 10s ? Takt durchgeführt, z.B. Licht an/aus
obwohl ich ja die Taste nie losgelassen hatte

wenn ich kurz drücke, passiert entweder nix ! oder Licht geht an und 
gleich wieder aus, einen statischen ON/OFF Zustand kann ich so nicht 
erreichen

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Joachim B. schrieb:
> funktioniert nicht :-(

Du hattest auch meine Frage bzgl. der Position des Toggle-Bits nicht 
beantwortet. Wo muss das stecken? An der 16. Stelle? Oder wie im 
Original an der 12. Stelle?

Zeig doch mal den Rest Deines RC5-Programms, damit man sieht, wo das 
Toggle-Bit stecken muss.

von Joachim B. (Gast)


Lesenswert?

Frank M. schrieb:
> Habe ich doch geschrieben: Dann würdest Du im IRMP für ein- und dieselbe
> Taste 2 verschiedene Codes bekommen.

ja und ? das war schon immer so, der einzige Unterschied wäre das 
originale RC5 ToogleBIT welches ausmaskiert werden kann wenn das 
jemanden stört !

ich hab das ToggleBIT von (1<<11) nur nach (1<<15) verschoben um unten 
Platz zu behalten

ich habe Adresse mit 100 multipliziert weil mir Adresse 30 als 3000 und 
7 als 700 sympatisch war und ich bei RC5 nie mehr als 100 Commands sah 
und weil ich hauptberuflich kein Infomatiker bin

deswegen kämpfe ich ja an allen Fronten gleichzeitig

eagle nervt fast mit wöchenlichen Updates und jedesmal muss ich an allen 
Stellen die LIBs importieren die wires beim Start neu intialisieren, das 
nervt und wehe man vergisst an einem Rechner irgendeine Einstellung....

eine zeitlang waren meine avr_gcc und ASTUDIO nicht auf allen Rechnern 
auf den gleichen Stand aber alles lief, dann hatte ich auf einem Rechner 
ein update gemacht und nix lief mehr, dann habe ich alles gelöscht die 
REG geputzt und noch mal von vorne und nix ging (irgendwas in der REG 
übersehen?), also noch mal von vorne und damit das nicht wieder passiert 
habe ich den win_avr PATH geändert um sicherzugehen, seit dem nervt mich 
MAKE wenn ich an dem einen oder anderen Rechner arbeite das er die LIBs 
nicht findet, gleichwohl ich weiss nicht wie das passiert, werden die 
FILENAMEN nun manchmal in UPPER Case importiert, was den Linker wieder 
ärgert C++ ist nicht in gnu99c enthalten, dabei benutze ich kein C++

wenn ich dann manuell im DIR die Filenamen wieder zu lower Case mache 
ist es wieder OK, jedenfalls temporär

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Frank M. schrieb:
> Zeig doch mal den Rest Deines RC5-Programms, damit man sieht, wo das
> Toggle-Bit stecken muss.

Habs gerade selber gefunden in

   Beitrag "Re: IRMP - Infrared Multi Protocol Decoder"

Da steht:
1
aus dani code
2
void fb(void)
3
{  if( i_ )
4
  {  //_toggelbit = ( i_ >> 11 & 1);
5
    L_Com  =  (i_ >> 6 & 0x1F)*100;
6
      L_Com  +=  (i_ & 0x3F) | (~i_ >> 7 & 0x40);

Ein RC5x-Frame sieht folgendermaßen aus:

C6 T A4 A3 A2 A1 A0 C5 C4 C3 C2 C1 C0

Die Zeile
1
    L_Com  =  (i_ >> 6 & 0x1F)*100;

Speichert in L_Com das Hundertfache von der Adresse: A4 A3 A2 A1 A0.
Dabei werden die Kommando-Bits und auch das Toggle-Bit weggeschnitten.

Die Zeile
1
      L_Com  +=  (i_ & 0x3F) | (~i_ >> 7 & 0x40);

sollte wohl C6 C5 C4 C3 C2 C1 C0 speichern, wobei C6 invertiert ist nach 
dem RC5x-Protokoll.

Aber das scheint ein Programmierfehler zu sein: Wenn ich richtig zähle, 
stimmt aber die Bitposition für das C6 nicht.

@Joachim B.

Das Toggle-Bit an 12. Stelle wird hier jedenfalls komplett ignoriert. 
Ich brauche den alten RC5-Code, sonst kann ich Dir nicht helfen.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Joachim B. schrieb:
> ja und ? das war schon immer so, der einzige Unterschied wäre das
> originale RC5 ToogleBIT welches ausmaskiert werden kann wenn das
> jemanden stört !

Sorry, Du hast den Sinn und Zweck von IRMP nicht verstanden. IRMP 
speichert den Frame in einem kompatiblen Format ab und nicht im 
RC5-Format. Ein IRMP-Anwender braucht gar nicht zu wissen, was RC5 ist 
und dass da ein Toggle-Bit ist, was ausmaskiert werden muss!

Der Vorteil von IRMP ist doch gerade die Protokoll-Unabhängigkeit. Soll 
der jetzt da reinschreiben: "Wenn protokoll gleich RC5, schmeiß dass 
Toggle-Bit weg"?

Nein, die Einführung eines eines allgemeinen Toggle-Bits in IRMP für den 
Spezialfall, dass Dein alter Code wieder läuft, ist für mich nicht 
akzeptabel. Ich helfe Dir gern. Aber ich brauch dafür den alten Source 
von Dir, sonst wird das nix.

von Joachim B. (Gast)


Angehängte Dateien:

Lesenswert?

Frank M. schrieb:
> Zeig doch mal den Rest Deines RC5-Programms, damit man sieht, wo das
> Toggle-Bit stecken muss.

etwas mehr Code als IRMP noch nicht integriert war

von Joachim B. (Gast)


Lesenswert?

Frank M. schrieb:
> Nein, die Einführung eines eines allgemeinen Toggle-Bits in IRMP für den
> Spezialfall, dass Dein alter Code wieder läuft, ist für mich nicht
> akzeptabel. Ich helfe Dir gern. Aber ich brauch dafür den alten Source
> von Dir, sonst wird das nix.

ich verstehe das ja, nur wie soll man das lösen das das so gewünschte 
programmtechnisch läuft ?

alle Lösungsversuche liefen bis jetzt schief, es scheint als wenn das 
nicht funktioniert

warum geht mein Licht an und aus wenn ich auf der Taste power bleibe ? 
der State hat ja nie gewechselt, ergo dürfte
1
  if( !(irmp_data.flags & IRMP_FLAG_REPETITION) )
2
      {
3
     toggle_bit ^= (1<<15);    // Togglen
4
           L_Com |= toggle_bit;
5
      }

nie das toggleBIT ändern, mit L_Com ist gleicher Befehl und das 
togglebit unverändert und __p == HAUPTMENU
1
        case PINN_GROSSER_KULLER:  // light 
2
        case PINN_6:  // p6 pinnacle taste "6"
3
        case 3006:  // light hauppauge taste "6"
4
        case 3015:  // light hauppauge taste "mute" MUTE
5
          if(__p==_STATUS || __p==_IRMP)
6
          {  if(count> 10)  {  p_old=86; __p=_LICHT; count=0;  }  }
7
          else
8
            if(Old_L_Com != L_Com)
9
              speedLED(TOGGLE);
10
          break;

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Joachim B. schrieb:
> warum geht mein Licht an und aus wenn ich auf der Taste power bleibe ?
> der State hat ja nie gewechselt, ergo dürfte

Jetzt zeige bitte den neuen Source, welcher IRMP nutzt, damit ich das 
vergleichen kann.

Gruß,

Frank

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Joachim B. schrieb:

> warum geht mein Licht an und aus wenn ich auf der Taste power bleibe ?
> der State hat ja nie gewechselt, ergo dürfte
>
>
1
>   if( !(irmp_data.flags & IRMP_FLAG_REPETITION) )
2
>       {
3
>      toggle_bit ^= (1<<15);    // Togglen
4
>            L_Com |= toggle_bit;
5
>       }
6
>
>
> nie das toggleBIT ändern, mit L_Com ist gleicher Befehl und das
> togglebit unverändert und __p == HAUPTMENU

Wenn Du diesen Block weglässt, passiert dann das gewünschte bei langem 
Tastendruck?

von Joachim B. (Gast)


Angehängte Dateien:

Lesenswert?

Frank M. schrieb:
> Wenn Du diesen Block weglässt, passiert dann das gewünschte bei langem
> Tastendruck?

wie schon mal

langer Tastendruck z.B. Licht an/aus lässt eine NEUE Taste genau einmal 
reagieren, ob ich draufbleibe oder loslasse und nochmal drücke ändert 
nix, nie wieder reagiert die Routine auf die gewünschte Taste bis ich 
eine andere drücke erst dann wird wieder z.B. Licht geschaltet

evt. geht das Licht auch so schnell an und aus das ich es nicht merke

denn up und downscrollen funktioniert ja

aber wenn ich im Untermenue mehrfach die TAB-Taste drücke, springt die 
nur 1x wie beim Licht, ich muss zwischendurch eine andere Taste drücken 
damit TAB wieder einmal reagiert

neuer Code anbei

von Joachim B. (Gast)


Lesenswert?

die Idee warum ich dafür IRMP nutzen möchte

wie du schon sagtes RC5 stirbt aus und mein Timer sollte (lernfähig) mit 
allen FB arbeiten, gleichwohl ist die "Funktion" alle FB erkennen toll 
und hilfreich als Tester in ein Gehäuse gepresst und kann quasi nebenbei 
von meinem Timer erledigt werden, alle Codes erkenne ich ja, nur kann 
ich so die IR Fähigkeit der Bedienung vergessen, es sei denn wir finden 
ne Lösung

die Möglichkeit nur zur Bedienung auf RC5 Decoder auszuweichen und zum 
Test IRMP zu nutzen gäbs ja auch noch, aber damit verbaue ich mir die 
Lernfähigkeit der Timerbedienung für alle FB
1
#include "cpu.h"
2
#include <avr/io.h>
3
4
#ifndef TYPES_H
5
  #include "types_.h"
6
#endif
7
8
/************************************************************************/
9
/*                                                                      */
10
/*                      RC5 Remote Receiver                             */
11
/*                                                                      */
12
/*              Author: Peter Dannegger                                 */
13
/*                      danni@specs.de                                  */
14
/*                                                                      */
15
/************************************************************************/
16
#include <avr/interrupt.h>
17
//#include <avr/signal.h>
18
#include <stdlib.h>

von Joachim B. (Gast)


Angehängte Dateien:

Lesenswert?

hi frank,

ich hab nun den RC5 Aufruf in die ISR hinter dem IRMP Aufruf gesetzt und 
bei RC5 erkannt werte ich dieses nur aus, ergo mein Hauptcode 
funktioniert wieder wie gewünscht,

kein repeat da wo er nicht sein darf,
aber repeat da wo gewünscht

ich kann repeaten bei scroll up/down und nie repeaten bei Licht an/aus 
oder ENTER

ich leg das mal in den Zip

vielleicht fällt dir noch was ein (ich würde sehr gerne für alle FB IRMP 
nutzen)

eines ist mir aufgefallen

ich hole pro main loop genau 1x den RC5 Code ab und der wird von mir 
gleich danach gelöscht
1
 for (;;)
2
{
3
  cli(); //Global Interrupt Disable
4
     i_ = rc5_data;      // read two bytes from interrupt !
5
     rc5_data = 0;
6
     sei(); //Global Interrupt Enable
7
8
// der ganze Rest vom main loop 
9
10
}

evt. muss ich das auch bei IRMP ?

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Joachim B. schrieb:
> vielleicht fällt dir noch was ein (ich würde sehr gerne für alle FB IRMP
> nutzen)

Ich weiß nicht, ob ich es schaffe, mir das in den nächsten Tagen 
anzuschauen.

Wenn Du gern alle FBs mit IRMP für Dein Programm nutzen möchtest, dann 
musst Du Dich gedanklich vom Toggle-Bit lösen. Du vergleichst immer den 
letzten mit dem vorletzten Befehl, um herauszufinden, obs togglet oder 
nicht. Das ist alles viel zu umständlich. Dein Source würde sich 
vereinfachen, wenn Du einfach das Flag konsequent abfragst. Es bringt 
nichts, die IRMP-Werte an Dein Programm anzupassen. Besser wäre die 
Anpassung Deines Sources an IRMP.

Leider ist Dein Source nicht soooo übersichtlich, dass ich mir das in 5 
Minuten zu Gemüte führen kann, da ist schon etwas Detektivarbeit 
gefragt, um da durchzusteigen. Ich machs irgendwann in den nächsten 
Tagen, bin aber viel unterwegs. Kann also etwas dauern.

Gruß,

Frank

von Joachim B. (Gast)


Lesenswert?

Frank M. schrieb:
> Ich weiß nicht, ob ich es schaffe, mir das in den nächsten Tagen
> anzuschauen.
>
> Wenn Du gern alle FBs mit IRMP für Dein Programm nutzen möchtest, dann
> musst Du Dich gedanklich vom Toggle-Bit lösen. Du vergleichst immer den
> letzten mit dem vorletzten Befehl, um herauszufinden, obs togglet oder
> nicht. Das ist alles viel zu umständlich. Dein Source würde sich
> vereinfachen, wenn Du einfach das Flag konsequent abfragst.

das hatten wir doch versucht ? ohne Erfolg :-(

> Es bringt
> nichts, die IRMP-Werte an Dein Programm anzupassen. Besser wäre die
> Anpassung Deines Sources an IRMP.

klar ich bin sehr dafür !

> Leider ist Dein Source nicht soooo übersichtlich, dass ich mir das in 5
> Minuten zu Gemüte führen kann, da ist schon etwas Detektivarbeit
> gefragt, um da durchzusteigen.

genau deswegen wird er ja so pö a pö neugeschrieben, war eben ne top 
down Entwicklung (erwähnte ich das ich kein Softi bin :D)
PS. brauchst du noch den umfangreichen Rest ?

> Ich machs irgendwann in den nächsten
> Tagen, bin aber viel unterwegs. Kann also etwas dauern.

alles klar, danke, ich werde mich nun mal um die Straffung und 
Bereinigung kümmern, einiges gefällt mir selber nicht mehr, z.B. mein 
"Multitask" viel zu umständlich (ich hasse delays, jede Menge Timercode 
den man so im Netz findet lässt die CPU ewig in delay-Schleifen unnütz 
warten, dabei kann man in der Zeit auch was anderes tun, die ADC 
befragen, das LCD updaten, die Uhr weiterlaufen lassen, die DCF77 Bits 
befragen die Tastatur abholen und natürlich auf Events reagieren wie LED 
zurücksetzen

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Joachim B. schrieb:

> das hatten wir doch versucht ? ohne Erfolg :-(

Wir? Nein! Bis heute kannte ich Deinen Source doch überhaupt nicht. Und 
mich beschleicht das Gefühl, dass Du Deinen Source auch nicht (mehr) so 
gut kennst :-)

Folgende Maßnahmen sind notwendig, um vom RC5-Protokoll wegzukommen:

 - Das toggle-Bit muss komplett raus.
 - Der Vergleich alter <--> neuer Frame muss raus, ist überflüssig
 - Das Multiplizieren/Addieren der Adresse mit dem Kommando muss raus
   (das funktioniert nur mit RC5 so, bei NEC geht das schon voll in die
    Hose)

> klar ich bin sehr dafür !

Ich schlage vor, dass ich dafür ein Grundgerüst schreibe, dass Du dann 
mit Leben füllst (reinschreiben konkreter numerischer Werte + Test). 
Dann sollte das machbar sein.

> genau deswegen wird er ja so pö a pö neugeschrieben, war eben ne top
> down Entwicklung (erwähnte ich das ich kein Softi bin :D)
> PS. brauchst du noch den umfangreichen Rest ?

Dieses "pö a pö" ist der falsche Weg, das macht alles nur 
unübersichtlicher. Besser ist es, die Funktion fb() komplett neu zu 
schreiben. Schreib doch mal auf, was die Funktion bei welcher Taste 
machen soll, z.B.

TAB kurz:    nächster Menüpunkt Funktion: menu_down()
TAB lang:    Untermenüaufruf, Funktion: sub_menu()

So in der Richtung...

Aber ich bin in der nächsten Woche komplett ausgelastet, ich komme da 
erst übernächste Woche zu.

von Joachim B. (Gast)


Lesenswert?

Frank M. schrieb:
> Wir? Nein! Bis heute kannte ich Deinen Source doch überhaupt nicht. Und
> mich beschleicht das Gefühl, dass Du Deinen Source auch nicht (mehr) so
> gut kennst :-)

hmm du hattest gesagt wie und ich habs eingetippt, mit der Folge,

Versuch 1
das bei "ewigem" Tastendruck die LED trotzdem an und aus ging, also die 
Einmalabfrage nicht klappte
Versuch 2
die einmal Abfrage zwar klappte, aber nur einmal, Taste loslassen hatte 
danach keinerlei Wirkung mehr, erst der Tastenwechsel und zurück lies 
die Taste wieder erkennen

> Folgende Maßnahmen sind notwendig, um vom RC5-Protokoll wegzukommen:
>  - Das toggle-Bit muss komplett raus.
>  - Der Vergleich alter <--> neuer Frame muss raus, ist überflüssig
>  - Das Multiplizieren/Addieren der Adresse mit dem Kommando muss raus
>    (das funktioniert nur mit RC5 so, bei NEC geht das schon voll in die
>     Hose)

OK

> Ich schlage vor, dass ich dafür ein Grundgerüst schreibe, dass Du dann
> mit Leben füllst (reinschreiben konkreter numerischer Werte + Test).
> Dann sollte das machbar sein.

noch mehr OK

> Dieses "pö a pö" ist der falsche Weg, das macht alles nur
> unübersichtlicher. Besser ist es, die Funktion fb() komplett neu zu
> schreiben. Schreib doch mal auf, was die Funktion bei welcher Taste
> machen soll, z.B.
>
> TAB kurz:    nächster Menüpunkt Funktion: menu_down()
> TAB lang:    Untermenüaufruf, Funktion: sub_menu()
>
> So in der Richtung...

da grübel ich ja gerade, IR und Tastatur sind gleichberechtigt
entweder ich lese die Taste und weise dem einen IR Code zu und erledige 
die Aufgaben da, oder ich lese den IR Code und setze KEY und erledige 
die Aufgaben da ????

natürlich muss ich dann KEY Test und IR Test irgendwie sonderbehandeln

> Aber ich bin in der nächsten Woche komplett ausgelastet, ich komme da
> erst übernächste Woche zu.

no Problem, mache ich erst mal den Rumpf weiter (Display ist größer 
geworden, von 20 x 4 alphanumerisch auf 21 x 8 Z -aber grafisch- )

Ich muss eh die Screens neu definieren, den RAM Verbrauch eindämmen, 
Grafik ohne Lesemöglichkeit kostet, und Strings gleich aus dem flash zu 
lesen, oder ins EEPROM schieben um da ändern zu können

also ich bin beschäftigt solange du noch nicht kannst

Danke und viel Erfolg

von Michael K. (Gast)


Lesenswert?

Weiter oben wurde mal wegen Stromsparmechanismen diskutiert. Hat sich 
mal jemand weiter damit auseinandergesetzt und/oder Erfahrungen damit 
gesammelt, zwecks Realisierbarkeit? Die neueren TSOPs (z.B. TSOP34838) 
kommen ja mit weniger als 1mA aus - da würde sich das IMO schon lohnen.

von Joachim B. (jar)


Lesenswert?

Michael K. schrieb:
> Weiter oben wurde mal wegen Stromsparmechanismen diskutiert. Hat sich
> mal jemand weiter damit auseinandergesetzt und/oder Erfahrungen damit
> gesammelt, zwecks Realisierbarkeit? Die neueren TSOPs (z.B. TSOP34838)
> kommen ja mit weniger als 1mA aus - da würde sich das IMO schon lohnen.

hmm, bedingt, was meinst du damit ? als Sender oder Empfänger ?

im Prinzip einfach, an einer TastenMatrix für IRSND den pin-change 
wakeup und senden, als Empfänger dito pinchange belauscht den TSOP

ich habe es in meinem Timer1 gemacht, luca in einem Cam Trigger, da 
werden sogar die Puls/Pausenzeiten per sleep realisiert, also jedes 
delay schickt die CPU schlafen bis die Zeit um ist

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Michael K. schrieb:
> Weiter oben wurde mal wegen Stromsparmechanismen diskutiert. Hat sich
> mal jemand weiter damit auseinandergesetzt und/oder Erfahrungen damit
> gesammelt, zwecks Realisierbarkeit?

Das ist eigentlich nicht Sache des IRMP - als Bibliothek betrachtet.

> Die neueren TSOPs (z.B. TSOP34838) kommen ja mit weniger als 1mA
> aus - da würde sich das IMO schon lohnen.

Es geht auch mit den älteren TSOPs, wenn man die Stromversorgung des 
TSOPs über einen ATMega-Pin steuert. Ich habe das so in der Lernfähigen 
Fernbedienung so umgesetzt, die auch IRMP nutzt:

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

Dafür muss dann aber das Programm "wissen", wann es den TSOP einschalten 
muss, damit etwas empfangen werden kann. Der Stromverbrauch bei diesem 
Mini-Projekt liegt bei weit unter 1µA.

Gruß,

Frank

von Michael K. (Gast)


Lesenswert?

Ich meinte als Empfänger, der allzeit bereit sein soll.

von jar (Gast)


Lesenswert?

Frank M. schrieb:
> Es geht auch mit den älteren TSOPs, wenn man die Stromversorgung des
> TSOPs über einen ATMega-Pin steuert.

dann geht das folgende aber nicht, der TSOP muss ja Vcc haben damit er 
ein output an pin change AVR senden kann

Michael K. schrieb:
> Ich meinte als Empfänger, der allzeit bereit sein soll.

klaro, schick die CPU schlafen der TSOP bleibt auch on an Vcc und weckt 
mit Signal out an einen PIN Change den AVR, das AVR delay dürfte 
vernachlässigbar sein ? irgendwas um 65 CLK also bei 20 MHz AVR 3µs,
Frank wird das eher wissen ob das delay die Auswertung stört

@frank, mal zu meinem "Problem" geschaut ?

von Dirk W. (glotzi)


Lesenswert?

Hallo zusammen,

ich verwende IRMP zusammen mit dem IR-Receiver in Hugo Portisch. Da der 
IR-Receiver einen älteren Stand aus dem letzen Jahr enthält, habe ich 
ein Upgrade auf IRMP-SVN-Head gemacht. Das funktioniert soweit auch gut, 
bis auf folgendes:

1. ich kann keine Frequenzen > 10000 benutzen, dann wird nichts mehr 
erkannt. Das könnte auch ein IR-Receiver spezifisches Problem sein. Im 
Thread dort habe ich schon nachgefragt aber keine Antwort bekommen. BTW 
der ältere Stand aus dem letzen Jahr hat das gleiche Problem.

2. Die Ruwido Merlin funktioniert bei mir nicht, es wird nur Müll 
erkannt. Wie ist denn der genaue Status der Merlin Implementierung? 
Sollte das funktionieren?

Folgende Protokolle funktionieren bei mir: RC6A, Samsung32, FDC 
Keyboard.

von Michael K. (Gast)


Lesenswert?

Dirk W. schrieb:
> Im Thread dort habe ich schon nachgefragt aber keine Antwort bekommen.
Ich habe dir doch dort geantwortet 
(Beitrag "Re: USB IR Remote Receiver (V-USB + IRMP)").

Mit IRMP hat das Problem nichts zu tun. Derzeit gibt es keine Lösung, 
daher sollte der Regler IMO in ruhe gelassen werden. Anders sieht es mit 
dem Makro F_INTERRUPTS aus: das kann geändert werden und die Firmware 
sollte nach der Neukompilierung laufen (ich habe es nicht getestet).

Um das zu beheben müsste für jedes Makro in irmp.c, Zeile 385 bis 599, 
eine Variable her, deren Inhalt bei einer Änderung neu berechnet werden 
müsste. Das hätte einen Speicherverbrauch zur Folge der den Rahmen eines 
AVR sprengt.

von Dirk W. (glotzi)


Lesenswert?

Michael K. schrieb:
> Mit IRMP hat das Problem nichts zu tun. Derzeit gibt es keine Lösung,
> daher sollte der Regler IMO in ruhe gelassen werden. Anders sieht es mit
> dem Makro F_INTERRUPTS aus: das kann geändert werden und die Firmware
> sollte nach der Neukompilierung laufen (ich habe es nicht getestet).

Ich habe natürlich F_INTERRUPTS in der IRMP Source geändert und nicht 
über die Windows-DLL. Es funktionert (bei mir) nicht.

von KLez (Gast)


Lesenswert?

Hallo,

Mal eine frage: Wäre es möglich, dass IRMP auch das Ausgangssignal des 
Funkempfängers von z.B. der Logitech Harmony 900 dekodieren kann? Dessen 
Ausgang ist eigentlich dazu da einen extra IR Sender anzuschließen. Da 
dieser Sender aber nur IR-Dioden enthält, gehe ich davon aus, dass das 
Signal bereits mit der Trägerfrequenz versehen ist, usw.

IRMP müsste also zuerst noch die Trägerfrequenz rausrechnen um an das 
Nutzsignal zu kommen... Ist es möglich das einzubauen oder funktioniert 
das ohne extra Hardware allgemein nicht?

P.S.: Die Frage habe ich auch schon im USB IR Empfänger Thread gestellt, 
aber eventuell bin ich hier "richtiger".

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

KLez schrieb:
> IRMP müsste also zuerst noch die Trägerfrequenz rausrechnen um an das
> Nutzsignal zu kommen... Ist es möglich das einzubauen oder funktioniert
> das ohne extra Hardware allgemein nicht?

Ja, das sollte möglich sein.

Gruß,

Frank

von Dirk W. (glotzi)


Lesenswert?

@Frank M.

Darf ich deine Aufmerksamkeit auf diesen Beitrag 
Beitrag "Re: IRMP - Infrared Multi Protocol Decoder"

lenken. Vorallem Punkt 2 würde mich interessieren.
Danke.

von KLez (Gast)


Lesenswert?

Frank M. schrieb:
> Ja, das sollte möglich sein.

Hallo Frank,

Ich habe gerade nochmal geschaut und glaube ehrlichgesagt nicht, dass es 
so einfach möglich ist. Wie ich lesen konnte pollst Du den Eingang mit 
10KHz... Das ist nach meinem Verständnis also um das 3,8 fache zu wenig 
um eine 38Khz Trägerfreuqenz raus zu rechnen, oder habe ich gerade einen 
Denkfehler?

Wie würdest Du das ganze implementieren?

Viele Grüße

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

KLez schrieb:
> Ich habe gerade nochmal geschaut und glaube ehrlichgesagt nicht, dass es
> so einfach möglich ist. Wie ich lesen konnte pollst Du den Eingang mit
> 10KHz... Das ist nach meinem Verständnis also um das 3,8 fache zu wenig
> um eine 38Khz Trägerfreuqenz raus zu rechnen, oder habe ich gerade einen
> Denkfehler?

Eine 38kHz Trägerfrequenz hat eine Periodenlänge von ca. 26 µsec. Du 
musst die Pulse von ca. 13 µsec softwaremäßig auf mehr als 26 µsec 
verlängern, damit IRMP ein durchgängiges Signal "sieht".

> Wie würdest Du das ganze implementieren?

Ich würde mir einen PCINT-Interrupt auf das Eingangssignal setzen. Dort 
setze ich ein globales Flag namens ir_signal, z.B. so:
1
#define IR_OFF    1             // no IR signal
2
#define IR_ACTIVE 0             // IR signal active
3
4
volatile uint8_t ir_signal = IR_OFF;
5
6
ISR(PCINT1_vect)
7
{
8
    ir_signal = IR_ACTIVE;      // IR is active
9
}

In der normalen Timer_ISR, die Du ja sowieso für den Aufruf der IRMP-ISR 
brauchst, würde ich nach(!) dem Aufruf von irmp_ISR() dieses Flag wieder 
zurücksetzen, also:
1
ISR(TIMER1_COMPA_vect)
2
{
3
  (void) irmp_ISR();
4
  ir_signal = IR_OFF;
5
}

In irmpconfig.h setzt Du:
1
#define input(x)        ir_signal


Der Trick ist, dass Du damit jeden Puls des Trägersignals solange 
softwaremäßig verlängerst, dass die IRMP-ISR ihn mindestens einmal 
"sieht". Da der PCINT bei aktivem IR-Signal viel öfter kommt als die 
IRMP-ISR ausgelöst wird, sollte das so klappen.

Gruß,

Frank

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Dirk W. schrieb:
> Darf ich deine Aufmerksamkeit auf diesen Beitrag
> Beitrag "Re: IRMP - Infrared Multi Protocol Decoder"
> lenken. Vorallem Punkt 2 würde mich interessieren.

Sorry, zum Punkt 1 kann ich nichts beitragen, ich habe mich bisher nicht 
so tief in Hugos V-USB Port reingehängt.

Zum Punkt 2: Muss ich zu Hause nachschauen, wie weit ich da bin, habe 
zwischwendurch viele andere interessante Sachen gemacht. ;-)

Ich melde mich dazu nochmal.

Gruß,

Frank

von Dirk W. (glotzi)


Lesenswert?

Frank M. schrieb:
> Zum Punkt 2: Muss ich zu Hause nachschauen, wie weit ich da bin, habe
> zwischwendurch viele andere interessante Sachen gemacht. ;-)
>
> Ich melde mich dazu nochmal.

Danke fürs Feedback. Ich habe inzwischen noch eine Netbox Tastatur hier 
und die funktioniert auch nicht. Es wird nur gelegentlich RC6A erkannt. 
Evtl. hängt das mit den Merlin Problem zusammen.

Bei der FDC Tastatur ist mir aufgefallen, dass wenn ich längere Zeit 
eine Taste festhalte nicht auschliesslich Events mit Protokoll FDC 
geschickt werden, sondern auch welche mit Protokoll Merlin. Das kann 
aber auch Zufall sein, dass irgendwas überläuft und ausgerechnet Merlin 
Codes geschickt werden. Die Codes sehen auch ziemlich seltsam aus.

von KLez (Gast)


Lesenswert?

Hallo Frank M,

Vielen Dank für Deine Ausführung! Ich werde mal damit ein wenig 
experimentieren. Trotzdem noch eine Frage: Wäre es nicht einfacher einen 
seperaten Eingang dafür zu nehmen und das Signal direkt auf den 
Interrupt des AVR zu legen? Dann müsste dieser doch nur noch die Flanken 
zählen und das Ergebnis an irmp übergeben.

von Fred (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

ich hatte mal wieder Zeit etwas zu basteln. Dazu hab ich natürlich die 
aktuelle Version vom svn gezogen und mal mit allen FB durchprobiert.
Funktioniert fast perfekt, nur mit dieser Sagem FB für die d-box klappt 
es nicht so richtig. Es wird als Merlin erkannt und zeigt aber 
verschiedene Adressen und Codes an. Scheint nicht ganz das gleiche zu 
sein.

Da ich das Ganze mal sauber aufgebaut haben wollte und nicht nur auf dem 
Experimentierboard, hsb ich die Pollin RS232-Bas Platine verwendet.
Mit minimalen Änderungen kann man die dazu verwenden und muß sich keine 
eigen Platine ätzen.

Angefügt hab ich mal meine main.c die momentan nur zum Testen der FB 
dient.

Wenn ich mal wieder dazukommen werden ich noch eine Anpassung der FDC 
Tastatur schreiben, damit sie an einen PC angebunden werden kann.

Fred

von eku (Gast)


Lesenswert?

Hallo Frank,

um IRMP mit dem aktuellen GCC 4.6.1 zu übersetzen sind alle PROGMEM
Variablen als const zu markieren, was auch nur logisch ist. Könntest Du 
den SVN Quellcode diesbezüglich bitte aktualisieren.

Danke.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

eku schrieb:
> um IRMP mit dem aktuellen GCC 4.6.1 zu übersetzen sind alle PROGMEM
> Variablen als const zu markieren, was auch nur logisch ist. Könntest Du
> den SVN Quellcode diesbezüglich bitte aktualisieren.

Ist erledigt.

Gruß,

Frank

von Daniel S. (daniel_s38)


Lesenswert?

Hallo!

Nachdem ich die Frage hier

Beitrag "USB IR Remote Receiver (V-USB + IRMP)"

schonmal gestellt habe und dabei auf dieses Forum verwiesen wurde 
versuch ichs nun hier:

Ich habe diesen Empfänger:

http://www.mikrocontroller.net/articles/USB_IR_Remote_Receiver

laut Anleitung aufgebaut, funktioniert tadellos.
Allerdings habe ich ein kleines Problem:

Die (Noname) Fernbedienung, welche ich mit dem Empfänger verwenden
möchte, hat einige Tasten, die nicht erkannt werden ("8", "Mute" und
einige weitere).
Diese Tasten funktionieren jedoch über den IgorPlug problemlos.
Alle anderen werden einwandfrei erkannt.

Hat jemand eine Idee, woran das liegen könnte?
Der einzige Unterschied in meinem Aufbau ist, daß ich einen TSOP 1136
verwende.....kann es daran liegen?

Muß dazu sagen daß ich ein absoluter Laie bin was das Thema 
programmieren o.ä. angeht....

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Daniel S. schrieb:
> Nachdem ich die Frage hier
>
> Beitrag "USB IR Remote Receiver (V-USB + IRMP)"
>
> schonmal gestellt habe [...]

... habe ich dir dort geantwortet:

  Beitrag "Re: USB IR Remote Receiver (V-USB + IRMP)"

Die Antwort gilt natürlich hier auch :-)

Gruß,

Frank

von eku (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Frank,

würdest Du bitte den Mitschnitt im Anhang analysieren. Mir ist es nicht 
gelungen, die Fernbedienung eines SAT-Receivers von Medion mit 
irgendeinem Protokoll zu dekodieren. Manchmal sprang der RC5-Algorithmus 
an, lieferte aber unabhängig von der gedrückten Taste den selben Code.

Danke.

von Dirk W. (glotzi)


Lesenswert?

Frank M. schrieb:
> Zum Punkt 2: Muss ich zu Hause nachschauen, wie weit ich da bin, habe
> zwischwendurch viele andere interessante Sachen gemacht. ;-)
>
> Ich melde mich dazu nochmal.

Hmm, darf ich nach 4 Wochen mal vorsichtig fragen wie denn der Status zu 
meiner Anfrage bzgl. Merlin Tastatur ist?

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Hallo eku,

eku schrieb:

> würdest Du bitte den Mitschnitt im Anhang analysieren.

Habs mir gerade mal im Editor und mit "irmp -a" angeschaut. Das 
Protokoll ist einfach, aber ziemlich blöde für irmp.

Eigenschaften:

1. Bitserielles Protokoll mit Datenrate von 600Bd
2. 1 Startbit ohne Pause, 8 Datenbits, 1 Stopbit
3. Jeder Frame wird 2x gesendet.

Blöd für IRMP ist der Punkt 2: Ohne Pause nach dem Startbit kann das 
Protokoll nicht eindeutig erkannt werden, weil schon der erste Puls 
1-fache bis 9-fache Länge haben kann.

Ich kann das Protokoll zwar einbauen in IRMP, aber man müsste sämtliche 
anderen Protokolle deaktivieren, damit dieses eindeutig erkannt wird. 
Die Geschichte ist also für einen Multiprotoll-Decoder ziemlich 
unsinnig.

Einfacher wäre es, den TSOP direkt an den UART zu hängen und den UART 
auf 600 Bd einzustellen. Dann kann man die Bytes direkt mit jeder 
üblichen UART-Lib auslesen. Im IRMP wäre es sowieso nichts anderes als 
ein Software-Uart.

Gruß,

Frank

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Dirk W. schrieb:
> Hmm, darf ich nach 4 Wochen mal vorsichtig fragen wie denn der Status zu
> meiner Anfrage bzgl. Merlin Tastatur ist?

Sorry, Dirk. Ich hatte dazu wenig Lust in der letzten Zeit, muss ich 
zugeben. Ich versuche, mich in der kommenden Woche mal dazu aufzuraffen.

Gruß,

Frank

von Dirk W. (glotzi)


Lesenswert?

Frank M. schrieb:
> Sorry, Dirk. Ich hatte dazu wenig Lust in der letzten Zeit, muss ich
> zugeben.
Dafür habe ich vollstes Verständnis, daher frage ich auch jetzt erst 
nach, ist ja alles deine Freizeit.

> Ich versuche, mich in der kommenden Woche mal dazu aufzuraffen.
Wäre schön. Wie gesagt, mir geht es nur darum: funzt die Merlin mit dem 
Head-Stand oder nicht. Also ein reiner Funktionstest.

von narkus (Gast)


Lesenswert?

Toll das!! :))
Großes Lob, Frank!

Ich habe das in einen AT90USB "eingebaut", der zugleich sich als HID 
Keyboard ausgibt. So kann ich die empfangenen RC5-Signale als 
Tastendruck ans Media Center übergeben! :)

Als HID USB nutze ich LUFA. Bei mir funktioniert alles soweit. Mein Code 
für die FB-Auswertung sieht im Groben wie folgt aus:
1
if (irmp_get_data (&irmp_data))
2
{    
3
  if (irmp_data.address == 19)
4
  {      
5
    if (!(irmp_data.flags & IRMP_FLAG_REPETITION))
6
    {  switch(irmp_data.command)
7
      {  case ir_hoch:  Taste = t_hoch;    break;
8
        case ir_runter:  Taste = t_runter;  break;
9
        case ir_links:  Taste = t_links;  break;
10
        case ir_rechts:  Taste = t_rechts;  break;
11
        case ir_enter:  Taste = t_enter;  break;
12
        default:  break;
13
      }
14
    }
15
  }
16
}
17
else
18
{  
19
  Taste = 0;
20
}

Wenn ich nun die Abfrage nach dem IRMP_FLAG_REPETITION weglasse, 
reagiert alles rattenschnell. Allerdings läuft LUFA öfter durch als IRMP 
mir Werte liefern kann. Was zur Folge hat, dass meine Variable "Taste" 
zwischendurch Null gesetzt wird, obwohl ich die FB-Taste gedrückt halte, 
und LUFA das als schnelle hintereinanderfolgende Tastendrücke 
interpretiert. Sprich, ich drücke nur kurz für ein Zeichen, aber bekomme 
mein Zeichen auf dem Bildschirm mehrmals ausgegeben.

Dafür ist ja IRMP_FLAG_REPETITION da (siehe Codeschnipsel). Allerdings 
habe ich so umgekehrt das Problem, wenn ich gerade mal eine Taste 
mehrmals schnell hintereinander drücken will (für track skippen oder 
Ähnliches), scheinen Telegramme verloren zu gehen, nicht jeder 
Tastendruck wird erkannt. Woran kann das liegen?

Ich habe versucht, das mit einem Zähler aufzufangen, der abschätzt, ob 
das nächste Telegramm länger als 117ms gebraucht hat, was ich dann als 
neuen Tastendruck interpretiere. Erst nach Ablauf des Zählers setze ich 
meine Variable "Taste" zu Null. Das hat aber zur Folge, dass LUFA nach 
losgelassener Taste merklich länger das Zeichen ausgibt, bevor es die 
Ausgabe stoppt. Das spricht einerseits dafür, dass mein Zähler deutlich 
länger als 117ms braucht - sonst würde ich es nicht merken können -, 
aber wenn ich den Zählerwert nur leicht heruntersetze, habe ich das 
Problem mit ohne IRMP_FLAG_REPETITION-Abfrage wieder. (?)

Ich denke idealer Weise an folgende Lösung: Kannst Du denn deinem 
Programm nicht ähnlich der Pollin IR-Tastatur beibringen, nach 
losgelassener Taste dem Kommando das 8. Bit hinzuzufügen (oder 
beliebiger fester Wert >0x80, mich interessiert nicht unbedingt welche 
Taste losgelassen wurde, sondern dass eine losgelassen wurde)? Das 
wäre nämlich schneller und sicherer als mein Zähler! Ich hatte versucht, 
selber Hand anzulegen, aber ich habe Deinen Code leider doch nicht voll 
und ganz verstanden.

Danke und Gruß

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

narkus schrieb:
> Toll das!! :))
> Großes Lob, Frank!

Danke :-)

>   if (irmp_data.address == 19)

Besser:

>   if (irmp.protocol == IRMP_RC5_PROTOCOL && irmp_data.address == 19)

So kann Dir keine andere FB, die auch die Adresse 19 (aber ein anderes 
Protokoll) hat, dazwischenfunken.

> Dafür ist ja IRMP_FLAG_REPETITION da (siehe Codeschnipsel). Allerdings
> habe ich so umgekehrt das Problem, wenn ich gerade mal eine Taste
> mehrmals schnell hintereinander drücken will (für track skippen oder
> Ähnliches), scheinen Telegramme verloren zu gehen, nicht jeder
> Tastendruck wird erkannt. Woran kann das liegen?

IRMP unterscheidet über die Konstante

  IRMP_KEY_REPETITION_LEN

in irmp.c, ob es sich um eine schnell gedrückte Wiederholungstaste 
handelt oder ob die FB selbst "repetiert" - durch langen Tastendruck. 
Offenbar schaffst Du es, innerhalb von 150msec die Taste mehr als einmal 
zu drücken... Du bist da ganz schön schnell :-)

Verkleinere den Wert einfach mal - z.B. von 150.0 auf 120.0 oder 100.0.

> Ich denke idealer Weise an folgende Lösung: Kannst Du denn deinem
> Programm nicht ähnlich der Pollin IR-Tastatur beibringen, nach
> losgelassener Taste dem Kommando das 8. Bit hinzuzufügen (oder
> beliebiger fester Wert >0x80, mich interessiert nicht unbedingt *welche*
> Taste losgelassen wurde, sondern dass eine losgelassen wurde)?

Das würde ich ungern machen wollen. Es gibt nämlich durchaus FBs, die 
16-Bit-Kommandos rausschicken, da bräuchte ich dann ein 17. Bit.

Was ich besser fände: Bei RC5 und RC6 gibt es das sog. Toggle-Bit im 
IR-Frame. Dieses könnte ich im IRMP auswerten, ob eine Taste lang 
gedrückt wurde oder ob der Anwender diese kurz gedrückt hatte und 
entsprechend das Repetition-Flag setzen. Ändert sich das Toggle-Bit 
nicht und bleibt der Code derselbe, würde ich dann das Repetition-Flag 
setzen - unabhängig von IRMP_KEY_REPETITION_LEN (was ich für die anderen 
Protokolle aber weiterhin benötige!). Im Moment ignoriert IRMP das 
Toggle-Bit.

Ich schaue mal, dass ich das am Wochenende so einbaue. Du könntest 
parallel dazu aber mal den Wert der Konstanten IRMP_KEY_REPETITION_LEN 
testweise herabsetzen und hier berichten.

Gruß,

Frank

P.S.
Hast Du ein Schaltbild zu Deiner Lösung? Ich habe mit den 
AT90USB-Dingern noch nie was gemacht. Vielleicht wäre das ja eine 
Erwähnung im IRMP-Artikel wert....

von jar (Gast)


Lesenswert?

Frank M. schrieb:
> Was ich besser fände: Bei RC5 und RC6 gibt es das sog. Toggle-Bit im
> IR-Frame. Dieses könnte ich im IRMP auswerten, ob eine Taste lang
> gedrückt wurde oder ob der Anwender diese kurz gedrückt hatte und
> entsprechend das Repetition-Flag setzen. Ändert sich das Toggle-Bit
> nicht und bleibt der Code derselbe, würde ich dann das Repetition-Flag
> setzen - unabhängig von IRMP_KEY_REPETITION_LEN (was ich für die anderen
> Protokolle aber weiterhin benötige!). Im Moment ignoriert IRMP das
> Toggle-Bit.

das sieht nach meinem "alten" Problem aus, hatte ich ja auch schon mal 
gewünscht, evt. kommts doch noch in IRMP, dann kann ich endlich die RC5 
ISR rauswerfen :-)

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

jar schrieb:

> das sieht nach meinem "alten" Problem aus,

Nicht ganz: Du hast dir immer gewünscht, dass Dir IRMP das Toggle-Bit 
liefert, damit Du den Code nicht umschreiben musst. ;-)

Sorry, das werde ich nicht machen. Ich brauche eine Lösung für alle 
von IRMP unterstützten Protokolle. Ich kann für RC5/RC6 das Toggle-Bit 
auswerten, um das Repetition-Flag korrekt zu setzen... aber mehr nicht.

von jar (Gast)


Lesenswert?

Frank M. schrieb:
> Ich kann für RC5/RC6 das Toggle-Bit
> auswerten, um das Repetition-Flag korrekt zu setzen... aber mehr nicht.

das würde ja reichen :-)

aber wie der letzte User das beschreibt erinnert mich genau ! an mein 
Problem mit der Auswertung, hab ich ja deutlich genug beschrieben, wir 
dokterten ja auch gemeinsam mit allen möglichen Ideen rum, nur nix half

es ist doch so das entweder noch Repeatcodes im Buffer liegen und 
nachgeliefert werden auch wenn die eigendliche Aktion schon gelaufen ist 
oder wie auch immer, mit 1x drücken bekomme ich entweder kein Licht an 
oder gleich wieder aus weil mir das toogle Bit fehlt, nur deswegen 
bedine ich meinen Timer ja mit RC5 und werte die Bedienung mit RC5 aus, 
an dieser Stelle ist IRMP nur gut um Codes zu liefern (hört sich jetzt 
härter an als es gemeint ist !

ne wirklich, finde IRMP gut nutze es auch gerne, nur du wolltest vor 
Monaten mal meine Code durchgucken warum ich mit IRMP nicht bedienen 
kann, der mit RC5 prima läuft.....

von master control (Gast)


Lesenswert?

Eine Frage: welche Pegel gibt IRSND auf der Konsole aus? Ist es 
invertiert?

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

master control schrieb:
> Eine Frage: welche Pegel gibt IRSND auf der Konsole aus? Ist es
> invertiert?

Da das Signal mit 32, 36, 38 oder 40kHz moduliert ist, ist der Pegel 
vollkommen unerheblich ;-)

Wenn Du Dir den Minischaltplan unter

  http://www.mikrocontroller.net/articles/IRMP#IRSND_-_Infrarot-Multiprotokoll-Encoder

ansiehst, erkennst Du, dass die Pausen Low-Pegel haben.

Gruß,

Frank

von narkus (Gast)


Angehängte Dateien:

Lesenswert?

>Besser:
>
>>   if (irmp.protocol == IRMP_RC5_PROTOCOL && irmp_data.address == 19)

Stimmt!! :))

Ich bin tatsächlich ein schneller Drücker! Ich habe 
IRMP_KEY_REPETITION_LEN auf 100.0 gesetzt, und habe mit schnellen 
Tastendrücken kaum noch ein Problem. Interessanter Weise wird das 
IRMP_FLAG_REPETITION noch richtig gesetzt, obwohl dieser Werte unterhalb 
der 117,zerquetschte ms liegt. Vielleicht hält aber auch mein Sender den 
RC5 nicht zu 100% ein, müsste ich mal mitm Oszi kontrollieren. Ich nehme 
das jetzt mal so hin.

Toggle Bit ist zwar nett, aber einerseits brauche ich es nicht, wenn das 
repetition flag funktioniert. Andererseits hilft es mir nicht bei der 
Aussage, wie lange eine Taste gedrückt gehalten wurde repektive wann sie 
losgelassen wurde.

Das Problem liegt darin, dass die Funktion irmp_get_data() Nullwerte 
ausgibt, owohl sie eigentlich gerade dabei ist, einen möglichen langen 
Tastendruck auszuwerten. Wenn ich jedoch Null erhalte, setze ich auch 
meine Variable "Taste" auf Null. Mein Programm kann somit nicht ohne 
selbst mitlaufendem Timer erkennen, ob eine Taste nicht mehr gedrückt 
wird. Und dieser Timer erzeugt ei mir die eingangs schon erwähnte 
merkliche Latenz beim Loslassen.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

narkus schrieb:
> Ich bin tatsächlich ein schneller Drücker! Ich habe
> IRMP_KEY_REPETITION_LEN auf 100.0 gesetzt, und habe mit schnellen
> Tastendrücken kaum noch ein Problem.

Ich habe nun ins SVN eine neuere Version von IRMP eingecheckt, die das 
RC5-Toggle-Bit als zusätzliches Kriterium heranzieht, ob eine Taste lang 
oder kurz gedrückt wurde.

Bitte teste das nochmal mit dem alten Wert von IRMP_KEY_REPETITION_LEN = 
150. Es sollte nun für RC5 auch mit dem 150er Wert zuverlässig 
funktionieren. Die 150msec brauche ich nämlich für diverse andere 
Protokolle, ich kann es also nicht pauschal auf 100 setzen.

> Interessanter Weise wird das
> IRMP_FLAG_REPETITION noch richtig gesetzt, obwohl dieser Werte unterhalb
> der 117,zerquetschte ms liegt.

Die 150msec beschreiben den Abstand zwischen 2 Frames - exkl. dem 1. 
Frame. Bei der RC5-Repetition-Time von ca. 115msec, die man in diversen 
Quellen findet, ist mir nicht ganz klar, ob der 1. Frame mitgestoppt 
wird, z.B. hier:

   http://users.telenet.be/davshomepage/rc5.htm

> Vielleicht hält aber auch mein Sender den RC5 nicht zu 100% ein,
> müsste ich mal mitm Oszi kontrollieren.

Könnte auch sein. Wäre prima, wenn Du das mal nachmessen würdest.

> Toggle Bit ist zwar nett, aber einerseits brauche ich es nicht, wenn das
> repetition flag funktioniert.

Das Toggle-Bit bekommst Du auch nicht zu sehen. IRMP zieht es nun aber 
als zusätzliches Kriterium hinzu, um zu entscheiden, ob eine Taste lang 
oder mehrfach kurz gedrückt wurde.

> Das Problem liegt darin, dass die Funktion irmp_get_data() Nullwerte
> ausgibt, owohl sie eigentlich gerade dabei ist, einen möglichen langen
> Tastendruck auszuwerten.

Was sollte sie dann machen? Hängen und warten, bis der Frame komplett 
angekommen ist?

Ich könnte eine Funktion

     irmp_busy ()

bereitstellen, die TRUE zurückliefert, wenn gerade ein neuer Frame 
eingelesen wird.

Ein irmp_get_data(), welches blockiert, bis der Frame komplett ist, 
halte ich für nicht notwendig. Dies kann man einfach mit:
1
   while (! irmp_get_data (..))
2
   {
3
       ;  // wait, do nothing
4
   }
5
   ....   // action!

erledigen.

von jar (Gast)


Lesenswert?

Frank M. schrieb:
> Ich könnte eine Funktion
>
>      irmp_busy ()
>
> bereitstellen, die TRUE zurückliefert, wenn gerade ein neuer Frame
> eingelesen wird.

wäre auch toll

oder gibt es eine Möglichkeit den Buffer zu leeren wenn eine Taste 
erkannt wurde ? damit wenn ich die Taste auswerte und interagiere nicht 
ein neuer Tastendruck im Buffer lauert ?

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

jar schrieb:
> oder gibt es eine Möglichkeit den Buffer zu leeren wenn eine Taste
> erkannt wurde ? damit wenn ich die Taste auswerte und interagiere nicht
> ein neuer Tastendruck im Buffer lauert ?

Könnte man natürlich auch einbauen. Die meisten Frames dauern ca. 30 - 
40 msec. Das ist doch eine halbe Ewigkeit, ich frage mich da, was Du da 
alles in der Zwischenzeit machen willst? ;-)

von jar (Gast)


Lesenswert?

Frank M. schrieb:
> Das ist doch eine halbe Ewigkeit, ich frage mich da, was Du da
> alles in der Zwischenzeit machen willst? ;-)

nun ja ich will nur das mein Programm funktioniert, mit jeder FB nicht 
nur mit RC5

eigendlich ganz einfach, man drückt doch solange die Taste bis das 
gewünschte eintritt, z.B. Licht an dann lässt man los, will aber nicht 
das dann das Licht wieder ausgeht weil noch was nachkommt, kürzer 
drücken geht nur wenn man weiss das der Code ankommt, aber die 
Rückmeldung ist doch Licht an, ich hoffe du verstehst warum das toogle 
Bit recht nützlich ist im RC5, das macht es einem leichter, alternativ, 
nach Erkennung Buffer leeren bis zur nächsten Abfrage.....

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

jar schrieb:
> eigendlich ganz einfach, man drückt doch solange die Taste bis das
> gewünschte eintritt, z.B. Licht an dann lässt man los, will aber nicht
> das dann das Licht wieder ausgeht weil noch was nachkommt,

Das ist doch einfach: Du ignorierst einfach alle Frames mit gesetztem 
Repetition-Flag - fertig.

> ich hoffe du verstehst warum das toogle
> Bit recht nützlich ist im RC5, das macht es einem leichter, alternativ,
> nach Erkennung Buffer leeren bis zur nächsten Abfrage.....

Naja, um das Toggle-Bit auszuwerten, brauchst Du immer den letzten und 
den aktuellen Zustand des Toggle-Bits, um diese dann beide zu 
vergleichen. Mit dem Repetition-Flag von IRMP ist es noch einfacher: 
Wenn gesetzt, handelt es sich um einen langen Tastendruck -> wegwerfen, 
fertig. Dass IRMP intern(!) genau das Toggle-Bit (bei RC5) dafür 
auswertet, um das Repetition-Flag zu setzen, muss Dich als IRMP-Anwender 
nicht kümmern.

von jar (Gast)


Lesenswert?

Frank M. schrieb:
> Das ist doch einfach: Du ignorierst einfach alle Frames mit gesetztem
> Repetition-Flag - fertig.

sagst du, aber das hatten wir doch alles schon durch und es lief nicht 
(wie gewünscht)

ich weiss ehrlich nicht warum du das immer wieder widerholst, entweder

IRMP liefert das richtige Tooglebit was im RC5 ja vorhanden ist 
transparent durch oder man muss dafür eben wie ich es nun mache in der 
ISR RC5 und IRMP laufen lassen......

klar verstehe ich deinen Wunsch IRMP für alle gleich zu behandeln, aber 
nur deswegen ein geliefertes Toogle Bit  zu repaet frames zu übersetzen 
und das toogle Bit zu unterschlagen kann auch nicht so richtig sein, du 
hast da einen ganz schönen Dickkopf

ich möchte doch nix exotisches, im RC5 steckt das toogle Bit, reiche es 
doch einfach durch und/oder gib uns ne leere_buffer Routine die auf 
Wunsch alles cleart

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

jar schrieb:

> sagst du, aber das hatten wir doch alles schon durch und es lief nicht
> (wie gewünscht)

Das läuft bei Dir nur deshalb nicht, weil Du Deinen Source nicht 
umschreibst und stattdessen versuchst, aus den IRMP-Daten (die nicht 
mehr protokollspezifisch sind) wieder RC5-Daten zu konstruieren - und 
das auch noch unzureichend.

> ich weiss ehrlich nicht warum du das immer wieder widerholst, [...]

Ich wiederhole mich immer wieder, weil Du Dich immer wiederholst. IRMP 
arbeitet korrekt, Du wendest aber IRMP nicht korrekt an! Solange Du 
immer wieder und wieder auf dem Toggle-Bit rumreitest, werde ich wieder 
und wieder das Repetition-Flag hervorkramen - ganz einfach :-)

Denk einfach daran: die Mehrheit aller anderen IR-Protokolle hat 
überhaupt kein Toggle-Bit. Und trotzdem funktioniert es.

> klar verstehe ich deinen Wunsch IRMP für alle gleich zu behandeln, aber
> nur deswegen ein geliefertes Toogle Bit  zu repaet frames zu übersetzen
> und das toogle Bit zu unterschlagen kann auch nicht so richtig sein, du
> hast da einen ganz schönen Dickkopf

Das Toggle-Bit gehört nicht in die IRMP-Daten. Soll ich mir das dann für 
die anderen 30 IR-Protokolle aus den Rippen schneiden?!?

Du hast den Dickkopf: Du reitest auf dem Toggle-Bit herum, weil Du zu 
faul bist, Deinen Code, der RC5-Spezifika nutzt, portabel umzuschreiben. 
Was willst Du denn in 5 Jahren machen, wenn es keine RC5-FB mehr gibt?

> ich möchte doch nix exotisches, im RC5 steckt das toogle Bit, reiche es
> doch einfach durch [...]

Nein, wenn ich es durchreiche, würde ja jeder zweite identische 
Tastendruck unterschiedliche IRMP-Daten liefern.

> und/oder gib uns ne leere_buffer Routine die auf Wunsch alles cleart

Hier hast Du sie:
1
void
2
irmp_clear (void)
3
{
4
   IRMP_DATA dummy;
5
6
   while (irmp_get_data (&dummy))
7
   {
8
        ;
9
   }
10
}

War das jetzt so schwierig?

Gruß,

Frank

von jar (Gast)


Lesenswert?

Frank M. schrieb:
> Hier hast Du sie:
> void
> irmp_clear (void)

> War das jetzt so schwierig?
> Frank

danke probiere ich ;-)

von PimmingerA (Gast)


Lesenswert?

abc

von PimmingerA (Gast)


Lesenswert?

Sieht wer eine Möglichkeit genau die Funktion des Senders & Empfängers 
auf einen PC zu Implementieren und die Bitmuster über USB-IR 
Sender/Empfänger zu senden/empfangen
Würde gerne verschiedene Fernseher über einen zentralen Server steuern 
und hierzu einen USB-IR Sender verwenden welche ich direkt bei der 
IR-Empfangsfenster beim Fernseher anbringe.

von jar (Gast)


Lesenswert?

PimmingerA schrieb:
> Sieht wer eine Möglichkeit genau die Funktion des Senders & Empfängers
> auf einen PC zu Implementieren und die Bitmuster über USB-IR

will ich auch hier gibt es irgenwo einen Thread IRMP mit USB

wenn ich mich richtig erinnere so als USB RS232 Umsetzer

Atmel mit USB Clientfunktion zu RS232 Umsetzer gibts ja schon, die 
Treiber für win gibts auch, braucht man nur RS232 Codes an die virtuelle 
COM zu schicken, bzw gleich IRMP im Atmel zu integrieren und zu senden

vom PC schickt man nur das Byte Protkoll, Adress, Command

nur mir fehlte bis jetzt noch die Zeit mich da einzulesen unbd das zu 
bauen

evt. schaust du mal und meldest rück ?

von jar (Gast)


Lesenswert?


von jar (Gast)


Lesenswert?

ist leider nur Receiver ?

wir brauchen ja IRSND

IRMP + IRSND in einem Atmel zu bringen geht ja
USB zu RS232 Umsetzer auch
beides zusammen sollte auch gehen, vom PC angesprochen als virtuelle COM 
nur das wir im Atmel nix mehr an die serrielle Schnitte RX + TX ausgeben 
und empfangen, stattdessen IRMP und IRSND nutzen

Idee im Kopf fertig, nur noch nicht in echt

ggffs könnte man Fertigmodule umbauen RS232 Pegelwandler auslöten, IR 
Sende Diode und TSOP einbauen, müsste halt nur Atmel basierend sein und 
genügend Codeplatz und ISP Schnitte haben

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Robert (mein Sohn) und ich hatten mal für die DIY-Fernbedienung 
(basierend auf IRMP/IRSND)

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

testweise ein Kommando-Interface geschrieben, was über die UART lief - 
aber nicht veröffentlicht.

Das Schaltbild könnte man dann vereinfachen auf:

1. TSOP an ATMEGA zum Empfang der Codes über IRMP
2. Transistor + IR-Sendediode an ATmega für IRSND

Eine kleine EXE, die dann das Protokoll, Adresse und Kommando über UART 
an den ATmega schickte, hatten wir damals auch schon programmiert.

Wir hatten das nur noch nicht veröffentlicht, weil wir eigentlich für 
den PC noch eine GUI schreiben wollten, damit man sich selbst eine 
persönliche Fernbedienung unter Windows "zusammenklicken" kann. Dazu war 
aber noch keine Zeit bisher.

Ich kann das heute abend mal raussuchen und hier einstellen. Die 
aktuelle EXE will einfach Protokoll-Nummer, Adresse, Kommando und 
Wiederholungsfaktor als Argument.

Gruß,

Frank

von PimmingerA (Gast)


Lesenswert?

Wenn ich Euch richtig verstanden habe, dann wollt ihr über die 
USB-Schnittstelle des PCs nur die Daten runterschicken auf einen MC und 
dort dann das Timing im MC erzeugen und über einen Pin auf die 
IR-Endstufe ausgeben?

Ich wollte mir die Elektronik ersparen und einen USB-IR-Converter den es 
um 10-20 Euro gibt an den PC anschließen und das Timing im PC-Programm 
machen und runterschicken - funktioniert dies auch oder hat da wer eine 
Ahnung?

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

PimmingerA schrieb:
> Wenn ich Euch richtig verstanden habe, dann wollt ihr über die
> USB-Schnittstelle des PCs nur die Daten runterschicken auf einen MC und
> dort dann das Timing im MC erzeugen und über einen Pin auf die
> IR-Endstufe ausgeben?

Jepp.

> Ich wollte mir die Elektronik ersparen und einen USB-IR-Converter den es
> um 10-20 Euro gibt an den PC anschließen und das Timing im PC-Programm
> machen und runterschicken - funktioniert dies auch oder hat da wer eine
> Ahnung?

Hast Du mal einen Link oder Schaltplan von diesem "USB-IR-Converter", 
dass man das mal nachlesen kann? Kann funktionieren, kann auch nicht. Ob 
Du unter Windows hinreichend genaue Timings hinbekommst, kann ich nicht 
sagen.

Für die PC -> µC Lösung braucht man:

1. ATmega88 oder ATmega168
2. Transistor + IR-Diode
3. TSOP
4. Ein paar Kondensatoren + Widerstände

Alles in allem macht das ungefähr einen Preis von ca. 5 Euro - ohne das 
Stückchen Lochrasterplatine ;-)

Achja, man braucht noch einen USB->UART-Wandler, z.B. diesen hier:

  http://shop.myavr.de/Bauelemente%20und%20Controller/myUSBtoUART.htm?sp=article.sp.php&artID=200024

von PimmingerA (Gast)


Lesenswert?

Ich wollte einen Standsender oder Empfänger von HAMA hernehmen ... da 
gibt es vom Hersteller natürlich keine Schaltpläne ;O)
Aber ich werde es nun eh über ein kleines MC-Interface lösen, da mein 
Gefühl mir sagt, dass ich da das Timing besser im Griff habe.
Ich werde einen ATMEGA8 PDIP verwenden - hier ist die USB-Schnittstelle 
mit ein paar BauteilenWorkAround schon dabei - dann brauche ich den 
USB/UART Umsetzer nicht oder?
Dann werde ich 2 Pins brauchen für Sender und Empfänger - so wie von Dir 
beschrieben.
Den Source Deines Exe-files wäre toll - bzw. die Tabellen der ganzen 
Codec-Daten ;O)

von jar (Gast)


Lesenswert?

IRMP braucht für alle Protokolle ca 4k IRSND dito wenn ich das richtig 
überschlagen habe

auf Platine bauen hab ich keinen Lust, deswegen denke ich an Pollin 
RS232 BAS Wandler 10 €

anstelle der RS232 Buchse und Wandlerchip USB mit Schutzdioden und R

anstelle das BAS Ausgang TSOP Trasi und IR Sendediode

nur wird das Modul nur mit mega8 geliefert, kein Platz mehr für den 
V-USB, evt. Chip größer wählen, oder AVR Net I/O 20 € dann könnte man 
die Codes auch über Router schicken ohne PC oder eben USB Stecker und 
Beschaltung nachfrickeln, da ist ein mega32 drauf Platz genug

was benötigt v-usb an SW Platz ?

von narkus (Gast)


Lesenswert?

Hey Frank!

So, war länger nicht dabei. Also, ich habe jetzt den aktuellen Code 
getestet und das mitm RC5 läuft jetzt mitm 150er Wert so wie es soll! 
Super!! :)

So ein busy wäre sehr sinnvoll. Sonst kann ich keinen lang anhaltenden 
Tastendruck erkennen, ohne dass ich parallel einen Timer des letzten 
erkannten Empfangs mitlaufen lasse. Gerne auch als Flag.

Solange IRMP was tut, sollte irmp_get_data() weiterhin TRUE zurückgeben, 
so kann ich dann gesichert meine variablen zurücksetzen, wenn 
tatsächlich kein Empfang mehr stattfindet, sprich keine Taste egal ob 
kurz oder lang gedrückt wurde. Mein Code könnte dann so aussehen:
1
  if (irmp_get_data (&irmp_data))
2
  {    
3
    if (!irmp_data.busy && (irmp_data.protocol == IRMP_RC5_PROTOCOL) && (irmp_data.address == 19))      // << Hier mitprüfen, ob busy
4
    {  if (!(irmp_data.flags & IRMP_FLAG_REPETITION))
5
      {  rc5_pressed = 1;
6
        rc5_do = 1;
7
      }
8
      else
9
      {  if (rc5_pressed < 5000) rc5_pressed++;       // Wiederholverzögerung
10
        else rc5_do = 1;
11
      }
12
      
13
      irmp_data.flags = 0;                    // reset flags!
14
    }
15
  }
16
  else
17
  {  rc5_pressed = 0;
18
    Taste = 0;
19
  }

von jar (Gast)


Lesenswert?

Frank M. schrieb:
> Ich habe nun ins SVN eine neuere Version von IRMP eingecheckt

ich hab auch mal wieder geschaut, komme am IRMP grad nicht weiter, macht 
aber nix

doofe Frage,
wäre es nicht möglich den proto_str in die IRMP.C einzubinden, dann muss 
man im quelltext nie ändern

eine weitere Funktion im IRMP.C
char *get_irmp_prot_str(protokoll)

könnte das dann immer liefern

warum diese Version ? c erlaubt doch
sei();

???

#asm("sei");

was bringt der ASM als Vorteil ?

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

jar schrieb:

> wäre es nicht möglich den proto_str in die IRMP.C einzubinden, dann muss
> man im quelltext nie ändern

Nein, ganz im Gegenteil: Da er nur im Codevision-Teil des 
IRMP-Demo(!)programms main.c steht, fliegt er demnächst komplett raus. 
Der Protokoll-Name als String ist nicht Bestandteil der IRMP-LIB.

Vergleiche macht man mittels:
1
  if (irmp_data.protocol == IRMP_NEC_PROTOCOL)
2
  {
3
     ...
4
  }

und nicht mittels strcmp() auf einen Protokollnamen! Aber das habe ich 
Dir vor Monaten schon mal gesteckt ;-)

Frage: Benutzt Du den Codevision-Compiler?

> eine weitere Funktion im IRMP.C
> char *get_irmp_prot_str(protokoll)

Nein, kostet nur jede Menge Flash, die unsinnig verbraten werden. Die 
Protokoll-Strings sind nur sinnvoll für die Ausgabe auf einem LCD. Da 
aber die LCD-Routinen auch nicht Bestandteil der IRMP-Lib sind, sehe ich 
auch nicht ein, die Strings zum Bestandteil der Lib zu machen.

> warum diese Version ? c erlaubt doch
> sei();

Ja, klar, wird auch so genutzt, siehe AVR-GCC-Teil von main.c.

> #asm("sei");

Du bist im Codevision-Teil von main.c. Der stammt nicht von mir, sondern 
von Klaus Leidinger, der damals mal das main.c auf Codevision-C portiert 
hat. Offenbar kennt der Codevision-Compiler kein sei().

> was bringt der ASM als Vorteil ?

Dass er auch für Codevision funktioniert.

Aber warum machst Du da dauernd im Codevision-Teil rum? Die 
Codevision-Unterstützung werfe ich sowieso demnächst raus, da ich keinen 
Codevision-Compiler habe.

Gruß,

Frank

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

narkus schrieb:

> So, war länger nicht dabei. Also, ich habe jetzt den aktuellen Code
> getestet und das mitm RC5 läuft jetzt mitm 150er Wert so wie es soll!
> Super!! :)

Freut mich.

> So ein busy wäre sehr sinnvoll. Sonst kann ich keinen lang anhaltenden
> Tastendruck erkennen, ohne dass ich parallel einen Timer des letzten
> erkannten Empfangs mitlaufen lasse. Gerne auch als Flag.

Was soll IRMP zwischen 2 Frames zurückliefern? Jede FB macht auch bei 
lang anhaltender Taste Pausen zwischen den Frames.

Stell Dir folgende Situation vor:

A1. FB sendet ersten Frame
A2. IRMP liest ersten Frame ein
A3. Applikation holt ersten Frame ab
A4. FB macht eine Pause von ca. 40 msec
A5. FB sendet zweiten Frame
A6. IRMP liest ersten Frame ein
A7. Applikation holt zweiten Frame ab, Repetition-Flag ist gesetzt.

Wenn ich nun ein busy-Flag einbaue, passiert folgendes:

B1. FB sendet ersten Frame
B2. IRMP setzt Busy-Flag
B3. IRMP liest ersten Frame ein
B4. IRMP setzt Busy-Flag zurück
B5. Applikation holt ersten Frame ab
B6. FB macht eine Pause von ca. 40 msec
B7. FB sendet zweiten Frame
B8. IRMP setzt Busy-Flag
B9. IRMP liest ersten Frame ein
B10. IRMP setzt Busy-Flag zurück
B11. Applikation holt zweiten Frame ab, Repetition-Flag ist gesetzt.

Problem ist die Zeit zwischen B5 und B7, da ist das Busy-Flag nicht 
gesetzt! Hilft Dir das weiter?

> Solange IRMP was tut, sollte irmp_get_data() weiterhin TRUE zurückgeben,

Sorry, das geht nicht, denn damit würde irmp_get_data() 
aufruf-inkompatibel zu bisherigen Versionen werden. Bisherige Programme, 
die IRMP verwenden, müssten alle in ihrer Logik umgeschrieben werden.

Ich kann Dir höchstens eine Funktion irmp_is_busy() anbieten, die TRUE 
oder FALSE zurückliefert. Aber erst müssten wir klären, in welchem State 
diese Funktion was zurückliefert.

Gruß,

Frank

von jar (Gast)


Lesenswert?

Frank M. schrieb:
> und nicht mittels strcmp() auf einen Protokollnamen! Aber das habe ich
> Dir vor Monaten schon mal gesteckt ;-)

das mache ich doch nicht (mehr) aber als IR Tester gebe ich natürlich 
den Protokollnamen aufs LCDaus !

> Frage: Benutzt Du den Codevision-Compiler?
nö !

>> eine weitere Funktion im IRMP.C
>> char *get_irmp_prot_str(protokoll)
> Nein, kostet nur jede Menge Flash, die unsinnig verbraten werden.

OK muss ! ich akzeptieren

> Protokoll-Strings sind nur sinnvoll für die Ausgabe auf einem LCD. Da
> aber die LCD-Routinen auch nicht Bestandteil der IRMP-Lib sind, sehe ich
> auch nicht ein, die Strings zum Bestandteil der Lib zu machen.

na ja, kann man auch anders sehen, als IR Tester ist für mich der 
Protokollname Bestandteil der IRMP, könnte man mit #if define LCD_H 
einbinden

> Du bist im Codevision-Teil von main.c. Der stammt nicht von mir, sondern
> von Klaus Leidinger, der damals mal das main.c auf Codevision-C portiert

da bin ich grad wieder irrtümlich reingerutscht zwischen 2 Tätigkeiten, 
ich finde es gut wenn die coderversion endlich rausfliegt, dann 
entfallen derlei Irrtümer

danke jar

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Neue Version IRMP und IRSND im SVN:

1. Unterstützung von ATtiny85 (bisher nur ATmegas)
2. Codevision-Unterstützung gelöscht
3. Array von IRMP-Protokollnamen zur Verfügung gestellt
4. Kleinere Bugfixes

@jar:

Um auf die Protokollnamen zugreifen zu können, muss
1
/*---------------------------------------------------------------------------------------------------------------------------------------------------
2
 * Set IRMP_PROTOCOL_NAMES to 1 if want to access protocol names (for logging etc), costs ~300 bytes RAM!
3
 *---------------------------------------------------------------------------------------------------------------------------------------------------
4
 */
5
#define IRMP_PROTOCOL_NAMES                     0       // 1: access protocol names, 0: do not (default),

auf 1 gesetzt werden. Dies verbraucht im Moment noch ca. 300 Bytes RAM, 
da die Strings noch nicht als PROGMEM gespeichert werden.

Man kann dann mit irmp_protocol_names[irmp_data.protocol] auf den 
Protokollnamen zugreifen. Die Protokollnamen wurden so gekürzt, dass sie 
die Länge von 8 nicht überschreiten.

Gruß,

Frank

von Sebastian W. (dl3yc)


Lesenswert?

Frank M. schrieb:
> Neue Version IRMP und IRSND im SVN:
>
> 1. Unterstützung von ATtiny85 (bisher nur ATmegas)

Hallo Frank, hast du auch ein funktionierendes Projekt für einen 
ATtiny85?
Ich habe momentan mit dem aktuellen Projekt aus dem SVN und einen Tiny45 
nur den Pin von PB6 auf PB4 geändert und eine LED an PB0, die an gehen 
soll, wenn etwas erkannt wird. Am Oszi kann ich sehen, dass der TSOP 
funktioniert, aber die LED geht nie an :(
Fuses habe ich auf interne 8MHz (Divider/8 aus).

meine main:
1
int
2
main (void)
3
{
4
    IRMP_DATA irmp_data;
5
6
    irmp_init();                                                            // initialize irmp
7
    DDRB |= (1<<PB0);
8
  timer1_init();                                                          // initialize timer 1
9
    sei ();                                                                 // enable interrupts
10
11
    for (;;)
12
    {
13
        if (irmp_get_data (&irmp_data))
14
        {
15
      PORTB |= (1<<PB0);
16
            // ir signal decoded, do something here...
17
            // irmp_data.protocol is the protocol, see irmp.h
18
            // irmp_data.address is the address/manufacturer code of ir sender
19
            // irmp_data.command is the command code
20
            // irmp_protocol_names[irmp_data.protocol] is the protocol name (if enabled, see irmpconfig.h)
21
        }
22
    }
23
}

Hast du eine Idee an was es liegen kann? Habe alle Protokolle und mit 3 
verschd. FB ausprobiert.

Danke im Vorraus!

73 DL3YC

von Sebastian W. (dl3yc)


Lesenswert?

Fehler gefunden: es fehlt die ISR in der main!

Einfach
ISR(TIMER1_COMPA_vect)
{
  irmp_ISR();
}
hinzufügen und es funktioniert :)

73 DL3YC

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Hallo Sebastian,

Sebastian Weiß schrieb:
> Fehler gefunden: es fehlt die ISR in der main!

Sorry, die ISR hatte ich beim Rauswerfen der Codevision-Unterstützung 
tatsächlich "wegoptimiert" - sprich versehentlich gelöscht. Ist nun 
wieder drin.

Trotzdem wundert es mich, dass es bei Dir nun auf dem ATtiny 
funktioniert, denn meines Erachtens war da noch ein 
Copy-and-Paste-Fehler meinerseits beim Setzen von TCCR1. Man benötigt 
hier einen Prescaler von 4 und nicht von 2.

Kannst Du mal Deine timer1_init()-Funktion zeigen? Ich habe jetzt 
folgende im SVN eingecheckt:
1
void
2
timer1_init (void)
3
{
4
#if defined (__AVR_ATtiny85__)                                              // ATtiny85:
5
    OCR1A   =  (F_CPU / F_INTERRUPTS / 4) - 1;                              // compare value: 1/15000 of CPU frequency, presc = 4
6
    TCCR1   = (1 << CTC1) | (1 << CS11) | (1 << CS10);                      // switch CTC Mode on, set prescaler to 4
7
#else                                                                       // ATmegaXX:
8
    OCR1A   =  (F_CPU / F_INTERRUPTS) - 1;                                  // compare value: 1/15000 of CPU frequency
9
    TCCR1B  = (1 << WGM12) | (1 << CS10);                                   // switch CTC Mode on, set prescaler to 1
10
#endif
11
12
#ifdef TIMSK1
13
    TIMSK1  = 1 << OCIE1A;                                                  // OCIE1A: Interrupt by timer compare
14
#else
15
    TIMSK   = 1 << OCIE1A;                                                  // OCIE1A: Interrupt by timer compare
16
#endif
17
}

Wichtig sind hier die beiden Zeilen für den ATTiny85: Neben dem Bit CS11 
wird auch noch CS10 im TCCR1-Register gesetzt, um den Prescaler auf 4 zu 
bekommen. Eigentlich müsstest Du das auch so korrigiert haben, um das 
zum Laufen zu bekommen. Kannst Du das so bestätigen?

Gruß,

Frank

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Neue Versionen von IRMP und IRSND im SVN:

IRMP:

1. Unterstützung für ATtiny84 (zusätzlich zu ATTiny85) hinzugefügt.
2. Fehlende ISR in main.c wieder eingefügt
3. Div. Fehler in timer1_init korrigiert (für ATmega & ATTtiny)

IRSND:

1. Unterstützung für ATTiny84 und ATTiny85 hinzugefügt
2. Unterstützung der IR-Protokolle NEC16 und NEC24

Gruß,

Frank

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Dirk W. schrieb:
> Hmm, darf ich nach 4 Wochen mal vorsichtig fragen wie denn der Status zu
> meiner Anfrage bzgl. Merlin Tastatur ist?

Ich habe am Wochenende einige Tests mit der Merlin gemacht. Wie ich über 
IR_LOGGING per IRMP fesstellen konnte, gibt es einige Tasten, die exakt 
den gleichen IR-Frame senden. Das war bei mir zum Beispiel bei den 
Tasten "t" und "n" der Fall. Entweder habe ich da ein defektes Exemplar 
erwischt oder es handelt sich um einen Serienfehler. Letzteres würde 
erklären, warum Pollin diese Tastaturen zum Schleuderpreis anbietet.

Ich kann da also nichts weiter machen. Da das Merlin-Protokoll vom 
Startbit-Timing ähnlich zu anderen IR-Protokollen ist und daher immer 
mal bei der Erkennung "dazwischenfunkt", wenn es aktiviert ist, habe ich 
mich entschlossen, die Unterstützung für die Merlin-Tastatur komplett 
aus dem IRMP herauszuwerfen. Vom Timing her arbeitet die Tastatur auch 
nicht gerade sehr exakt, so dass ab und zu auch verschiedene Codes für 
ein- und dieselbe Taste decodiert werden.

Fazit: Merlin fliegt raus.

Sorry,

Frank

von Dirk W. (glotzi)


Lesenswert?

Frank M. schrieb:
> Ich habe am Wochenende einige Tests mit der Merlin gemacht.
Danke fürs Feedback, hatte schon gar nicht mehr damit gerechnet.

> ... Entweder habe ich da ein defektes Exemplar
> erwischt oder es handelt sich um einen Serienfehler. Letzteres würde
> erklären, warum Pollin diese Tastaturen zum Schleuderpreis anbietet.

Hmm, seltsam. Ich und andere User auch, können die Merlin via lirc im 
Rawmode ohne Probleme benutzen. Ich werde nochmal nachfragen.

> Fazit: Merlin fliegt raus.
Sehr schade.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Dirk W. schrieb:
> Hmm, seltsam. Ich und andere User auch, können die Merlin via lirc im
> Rawmode ohne Probleme benutzen. Ich werde nochmal nachfragen.

Vielleicht ist wirklich nur meine Tastatur defekt. Ich meine, ich habe 
irgendwo im Keller noch ein zweites Exemplar davon vergraben. Ich werde 
das heute abend mal rauswühlen und damit nochmal testen.

> Sehr schade.

Okay, wenn es mit der Tastatur im Keller doch geht, dann baue ich es 
wieder ein. Hast mich überredet, denn eigentlich ist das wirklich eine 
niedliche Tastatur ;-)

von Dirk W. (glotzi)


Lesenswert?

Frank M. schrieb:
> Ich habe am Wochenende einige Tests mit der Merlin gemacht. Wie ich über
> IR_LOGGING per IRMP fesstellen konnte, gibt es einige Tasten, die exakt
> den gleichen IR-Frame senden. Das war bei mir zum Beispiel bei den
> Tasten "t" und "n" der Fall. Entweder habe ich da ein defektes Exemplar
> erwischt oder es handelt sich um einen Serienfehler. Letzteres würde
> erklären, warum Pollin diese Tastaturen zum Schleuderpreis anbietet.

Ich muss nochmal nachfragen: wurde keine Taste erkannt oder nur manche 
nicht? Bei mir ist es so, dass noch nicht mal das Merlin Protokoll 
erkannt wurde.

von Sebastian W. (dl3yc)


Lesenswert?

Hallo Frank,

Frank M. schrieb:
> Trotzdem wundert es mich, dass es bei Dir nun auf dem ATtiny
> funktioniert, denn meines Erachtens war da noch ein
> Copy-and-Paste-Fehler meinerseits beim Setzen von TCCR1. Man benötigt
> hier einen Prescaler von 4 und nicht von 2.
> [...]
> Wichtig sind hier die beiden Zeilen für den ATTiny85: Neben dem Bit CS11
> wird auch noch CS10 im TCCR1-Register gesetzt, um den Prescaler auf 4 zu
> bekommen. Eigentlich müsstest Du das auch so korrigiert haben, um das
> zum Laufen zu bekommen. Kannst Du das so bestätigen?
Nein, ich habe sie unverändert übernommen, auch die F_INTERRUPTS sind 
noch bei 15k.

Der Grund warum hier eine Veränderung benötigt wird ist doch, dass beim 
Tiny Timer1 ein 8bit-Timer statt eines 16bit-Timers wie bei den Megas 
ist.
Mein Wert mit Prescaler 2 ist mit OCR1A   =  (F_CPU / (2 * F_INTERRUPTS) 
/ 2) - 1 rund 132 und passt somit in die 8bit Variable - warum sollte 
das anders sein?

Gruß Sebastian

Nachtrag:

meine Timer1_init():
1
void
2
timer1_init (void)
3
{
4
#if defined (__AVR_ATtiny45__)                                      // ATtiny85:
5
    OCR1A   =  (F_CPU / (2 * F_INTERRUPTS) / 2) - 1;                // compare value: 1/28800 of CPU frequency, presc = 2
6
    TCCR1   = (1 << CTC1) | (1 << CS11);                            // switch CTC Mode on, set prescaler to 2
7
#else                                                               // ATmegaXX:
8
    OCR1A   =  (F_CPU / (2 * F_INTERRUPTS)) - 1;                    // compare value: 1/28800 of CPU frequency
9
    TCCR1B  = (1 << WGM12) | (1 << CS10);                           // switch CTC Mode on, set prescaler to 1
10
#endif
11
12
#ifdef TIMSK1
13
    TIMSK1  = 1 << OCIE1A;                                          // OCIE1A: Interrupt by timer compare
14
#else
15
    TIMSK   = 1 << OCIE1A;                                          // OCIE1A: Interrupt by timer compare
16
#endif
17
}

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Hallo Sebastian,

Sebastian Weiß schrieb:

> Der Grund warum hier eine Veränderung benötigt wird ist doch, dass beim
> Tiny Timer1 ein 8bit-Timer statt eines 16bit-Timers wie bei den Megas
> ist.

Richtig.

> Mein Wert mit Prescaler 2 ist mit OCR1A   =  (F_CPU / (2 * F_INTERRUPTS)
> / 2) - 1 rund 132 und passt somit in die 8bit Variable - warum sollte
> das anders sein?

Ja. Aber wenn Du Dir die Zuweisung einmal genauer anschaust, steckt der 
Faktor 2 zweimal drin. Also hat man faktisch einen Divisor mit dem Wert 
4. Die obige Zuweisung ist also identisch mit:
1
 OCR1A   =  (F_CPU / F_INTERRUPTS / 4) - 1;

Und damit müsste der Prescaler auch auf 4 gestellt werden, also:
1
 TCCR1   = (1 << CTC1) | (1 << CS11) | (1 << CS10);

statt
1
 TCCR1   = (1 << CTC1) | (1 << CS11);

damit auch der Prescaler von 4 rauskommt.

Oder habe ich da jetzt einen Denkfehler?

Gruß,

Frank

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Dirk W. schrieb:
> Ich muss nochmal nachfragen: wurde keine Taste erkannt oder nur manche
> nicht?

Es werden bei mir eigentlich alle Tasten erkannt, auf jeden Fall immer 
das Merlin-Protokoll.

Aber was auffiel:

1. Bei längerem Herunterdrücken einer Taste kippte ab und zu ein bit,
   d.h. man erhielt dann bei den Wiederholungen einen anderen Code.

2. Manche Tasten sendeten denselben IR-Frame. Das führe ich mal auf
   einen Defekt meiner Tastatur zurück, z.B. Kurzschluss in der
   Tastatur-Matrix oder ähnliches.

> Bei mir ist es so, dass noch nicht mal das Merlin Protokoll erkannt wurde.

Doch, bei mir schon. Allerdings habe ich alle anderen exotischen 
Protokolle abgeschaltet, also nur die Standard-Protokolle von SIRCS bis 
DENON eingeschaltet und zusätzlich nur noch Merlin. Du kannst das ja 
auch mal mit dieser Konstruktion testen. Ich kann mir durchaus 
vorstellen, dass die anderen Exoten wie Ruwido und andere mit ähnlichem 
Startbit-Timing stören könnten.

von Dirk W. (glotzi)


Lesenswert?

Frank M. schrieb:
> Dirk W. schrieb:
>> Ich muss nochmal nachfragen: wurde keine Taste erkannt oder nur manche
>> nicht?
>
> Es werden bei mir eigentlich alle Tasten erkannt, auf jeden Fall immer
> das Merlin-Protokoll.

Ok, danke für die Info.

Dann habe ich mit meinem V-USB Receiver wohl noch ein ganz anderes 
Problem. Bei mir funktionieren auch keine Frequenzen > 10000, egal 
welche Remote ich benutze. Ich frage mich jetzt doch, ob das ein 
prinzipielles Problem des Portisch-Receivers ist.

von Sebastian W. (dl3yc)


Lesenswert?

Hallo Frank,

was du beschreibst ist logisch, aber trotzdem falsch.
Ich habe die neueste SVN-Version gezogen und probiert - es funktioniert 
nicht.

Meine main():
1
int
2
main (void)
3
{
4
    IRMP_DATA irmp_data;
5
6
    irmp_init();                                                            // initialize irmp
7
  DDRB |= (1<<PB0);                            // initialize LED
8
    timer1_init();                                                          // initialize timer 1
9
    sei ();                                                                 // enable interrupts
10
11
    for (;;)
12
    {
13
        if (irmp_get_data (&irmp_data))
14
        {
15
      // toggle LED
16
      if (PORTB & (1<<PB0))
17
      PORTB &= ~(1<<PB0);
18
      else
19
      PORTB |= (1<<PB0);
20
            // ir signal decoded, do something here...
21
            // irmp_data.protocol is the protocol, see irmp.h
22
            // irmp_data.address is the address/manufacturer code of ir sender
23
            // irmp_data.command is the command code
24
            // irmp_protocol_names[irmp_data.protocol] is the protocol name (if enabled, see irmpconfig.h)
25
        }
26
    }
27
}

Ändere ich aber den Prescaler wieder zurück zu 2, also lösche CS10, dann 
funktioniert alles soweit.
Kannst du dir das erklären?

Nun möchte ich dazu auch IRSND benutzen, aber das hat dann wohl 
Probleme, weil es auf der falschen Zeitbasis aufsetzt?

Nebenbei:
Ich habe NEC, SAMSUNG und RC5 aktiviert, also ich teste mit 3 verschd. 
FB.
NEC und RC5 funktioniert(meine LED togglet). Aber SAMSUNG wird nicht 
erkannt. Auf einem 2. Board mit einem ATMega8 und Anzeige von Protokoll, 
Addresse und Befehl per UART funktioniert die Erkennung dort.

Mit F_INTERRUPTS = 20000 geht dann auch RC5 nicht und mit F_INTERRUPTS = 
10000 geht SAMSUNG, aber NEC nicht mehr.

Ich probiere es weiter.

Gruß DL3YC

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Hallo Sebastian,

Sebastian Weiß schrieb:
> Ändere ich aber den Prescaler wieder zurück zu 2, also lösche CS10, dann
> funktioniert alles soweit.
> Kannst du dir das erklären?

Nein, das kann ich mir momentan überhaupt nicht erklären. Da mir aber 
die ATTtiny85 ausgegangen sind, habe ich mir gestern neue bestellt, um 
das selbst zu testen. Es muss ja eine Erklärung dafür geben. 
Wahrscheinlich habe ich nur an der falschen Stelle im Datenblatt 
geschaut.

> Nun möchte ich dazu auch IRSND benutzen, aber das hat dann wohl
> Probleme, weil es auf der falschen Zeitbasis aufsetzt?

Nein, das sollte gehen. Du willst IRMP & IRSND verwenden? Dann muss die 
ISR dafür so aussehen (s.a. IRMP-Artikel):
1
ISR(TIMER1_COMPA_vect)
2
{
3
  if (! irsnd_ISR())          // call irsnd ISR
4
  {                           // if not busy...
5
      irmp_ISR();             // call irmp ISR
6
  }
7
  // call other timer interrupt routines...
8
}

Wenn dann noch die Konstanten F_INTERRUPTS in irmpconfig.h und 
irsndconfig.h denselben Wert haben, ist alles perfekt.

> Ich habe NEC, SAMSUNG und RC5 aktiviert, also ich teste mit 3 verschd.
> FB.
> NEC und RC5 funktioniert(meine LED togglet). Aber SAMSUNG wird nicht
> erkannt.

Hast Du mal SAMSUNG32 als alternatives Protokoll ausgewählt? Sonst 
schalte soviele Protokolle an, wie mit Deinem ATmega8 möglich sind. Wenn 
es dann auch nicht geht, schalte IRMP_LOGGING an und schicke mir ein 
paar Scans.

> Mit F_INTERRUPTS = 20000 geht dann auch RC5 nicht und mit F_INTERRUPTS =
> 10000 geht SAMSUNG, aber NEC nicht mehr.

In der Regel sind F_INTERRUPTS = 15000 die richtige Wahl.

Gruß,

Frank

von jar (Gast)


Lesenswert?

Frank M. schrieb:
> Sonst
> schalte soviele Protokolle an, wie mit Deinem ATmega8 möglich sind.

PS ich hatte mal überschlagen, alle <= 15000 F_Interrupt Protokolle 
brauchen ca 4k und für IRSND auch, reicht der ATmega8 oder braucht man 
schon den 16 ?

hat einer einen Link für einen Adapter von ISP 6 auf ISP 10, meine Kabel 
sind alle auf 10pol aber der letzte gekaufte hat 6pol mag keine neuen 
Kabel bauen lieber einen Adapter Stecker ISP6 auf Kupplung ISP10

von Sebastian W. (dl3yc)


Lesenswert?

Nocheinmal Rückmeldung von mir:
Bei mir funktioniert jetzt alles wie gewollt (IRMP + IRSND) auf dem 
ATtiny45. Einzige Änderung der Prescaler s.o. und meine IR-Sendediode 
habe ich gegen eine 950nm-IR-LED getauscht.

Vielen Dank für das tolle Projekt und den guten Support!

73! DL3YC

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Sebastian Weiß schrieb:
> Bei mir funktioniert jetzt alles wie gewollt (IRMP + IRSND) auf dem
> ATtiny45. Einzige Änderung der Prescaler s.o. und meine IR-Sendediode
> habe ich gegen eine 950nm-IR-LED getauscht.

Freut mich, dass es funktioniert. Aber ich muss da nochmal nachhaken:

Mit welcher Frequenz läuft Dein ATtiny? Was ist bei Dir als F_CPU im 
Projekt eingetragen?

Gruß,

Frank

von Sebastian W. (dl3yc)


Lesenswert?

Frank M. schrieb:
> Mit welcher Frequenz läuft Dein ATtiny? Was ist bei Dir als F_CPU im
> Projekt eingetragen?

Beides 8 MHz. Ich kann es mir auch noch nicht erklären. Deswegen habe 
ich gerade einen Test gemacht mit:

Per Fuse den Takt ausgegeben und gemessen - 8,74MHz.
In der Timer-ISR Pin togglen lassen und gemessen - 8,275kHz.
Pintogglen halbiert die Frequenz also sind es ~16,5kHz
Reale CPU-Frequenz / Timerwert(OCR1A) / Prescaler müsste 16,5kHz 
ergeben.
8740000/133/2=32857 -> da stimmt was nicht!
Somit gibt es trotz einem Prescaler von 2 einen 15kHz Interrupt.

Gruß Sebastian

von gera (Gast)


Lesenswert?

Hallo,

Gibt es auch ein Code für den C18 Compiler.
Den CCS Code habe ich gefunden, habe leider keine
Ahnung wie man von CSS nach C18 portiert.

Gruß

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Sebastian Weiß schrieb:
> Beides 8 MHz. Ich kann es mir auch noch nicht erklären.

Ich habe den Fehler gefunden. Fälschlicherweise habe ich das 
OCR1A-Register auch beim ATtiny85 genommen, obwohl es hier das 
OCR1C-Register sein muss. Bei Dir hat es nur deshalb funktioniert, weil 
der errechnete Wert mit dem Prescaler 2 statt 4 ungefähr einen Wert von 
256 (in Wirklichkeit 266) ergibt. Da das OCR1C-Register mit 0 vorbelegt 
ist, hat der Timer immer bis 256 durchgezählt. Dadurch hattest Du dann 
mit einer Abweichung von ca. 5 Prozent die "richtige" Abtastrate. Da 
IRMP mit Toleranzen von bis zu 40% klarkommt, funktionierte das dann bei 
Dir.

Hier der korrekte Code von timer1_init() für ATtiny85:
1
#if defined (__AVR_ATtiny45__) || defined (__AVR_ATtiny85__)                // ATtiny45 / ATtiny85:
2
    OCR1C   =  (F_CPU / F_INTERRUPTS / 4) - 1;                              // compare value: 1/15000 of CPU frequency, presc = 4
3
    TCCR1   = (1 << CTC1) | (1 << CS11) | (1 << CS10);                      // switch CTC Mode on, set prescaler to 4
4
    ....

Und jetzt passt das auch wieder zusammen mit dem Prescaler von 4.

Den Code im SVN habe ich korrigiert.

Gruß,

Frank

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

gera schrieb:

> Gibt es auch ein Code für den C18 Compiler.

Bisher nicht. Der hardware-abhängige Teil beschränkt sich auf die Angabe 
des input-Makros (s. irmpconfig.h) und der Definition des Timers.

Bekommst Du das hin? Wäre nett, wennn Du mir dann die Änderungen für den 
PIC-C18-Compiler zur Verfügung stellen könntest.

Gruß,

Frank

von gera (Gast)


Lesenswert?

Hallo,

Habe mal versucht den Code zu übersetzen.
Zwei Probleme:
1. Wie übersetze ich diese Zeile (input gibt es bei C18 nicht)
    irmp_input = input(IRMP_PIN);

  Mein Versuch ?
    irmp_input = IRMP_PIN;

2. Die Input Pin
   #define IRMP_PIN   PIN_B4  // use PB4 as IR input on PIC

 Mein Versuch:

   #define IRMP_PIN   LATBbits.LATB4  // use PB4 as IR input on PIC

 oder evtl das hier ?

   #define IRMP_PIN   PORTBbits.RB4   // use PB4 as IR input on PIC

Was ist die richtige Übersetzung ?

So läuft schon mal bis jetzt der Compiler durch.
Zum Testen bin ich noch nicht gekommen.

Den Timer0 habe ich auf 10000 Hz gestellt und eine INT Routine 
eingebaut.
Passt das so ?
Benutze einen 18F2550 mit 20MHz Quarz.

Gruß

von gera (Gast)


Lesenswert?

Hallo,

Compilieren kann ich es jetzt ohne Probleme.
Leider wird nichts erkannt.

Den Timer0 hab ich auf 10000Hz eingestellt, Timer0 Int funktioniert 
soweit.
Muss ich irgendwo noch was eintragen ? CPU-Frequenz, ... ?
Oder kann man es einfach so benutzen.
Benutze Version 1.90
HW: 18F2550, Quarz 20Mhz, Takt 40Mhz

Gruß
gera

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

gera schrieb:

> Den Timer0 habe ich auf 10000 Hz gestellt und eine INT Routine
> eingebaut.
> Passt das so ?

Hast Du auch F_INTERRUPTS in irmpconfig.h angepasst? Dort ist in der 
SVN-Version standardmäßig 15000 als Wert eingetragen.

Gruß,

Frank

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Im IRMP-Artikel

   http://www.mikrocontroller.net/articles/IRMP

steht nun die Version 2.0.1 sowohl für IRMP als auch für IRSND zum 
Download bereit. Diese Version entspricht der letzten SVN-Version. Somit 
sind nun die Download-Dateien wieder zum SVN synchron.

Hier die Änderungen gegenüber der letzten Download-Version vom Januar:

IRMP:

    - Neues Protokoll: KATHREIN
    - Neues Protokoll: RUWIDO
    - Neues Protokoll: THOMSON
    - Neues Protokoll: IR60
    - Neues Protokoll: LEGO
    - Neues Protokoll: NEC16
    - Neues Protokoll: NEC42
    - Neues Protokoll: NETBOX (Prototyp)
    - Portierung auf ATtiny84 und ATtiny85
    - Verbesserung von Tastenwiederholungen bei RC5
    - Verbessertes Decodieren von Bi-Phase-Protokollen
    - Korrekturen am RECS80-Decoder
    - Korrekturen beim Erkennen von zusätzlichen Bits im SIRCS-Protocol

IRSND:

    - Neues Protokoll: THOMSON
    - Neues Protokoll: LEGO
    - Neues Protokoll: NEC16
    - Neues Protokoll: NEC42
    - Portierung auf ATtiny84 und ATtiny85
    - Korrektur von Pausenlängen
    - Korrekturen von irsnd_stop()
    - Korrektur des SIEMENS-Timings
    - Umstellung auf 36kHz Modulationsfrequenz für DENON-Protokoll
    - Korrektur Behandlung zusätzlicher Bits im SIRCS Protokoll

Viel Spaß,

Frank

von gera (Gast)


Lesenswert?

Hallo,

Nach langer Suche habe den Fehler gefunden.
War ein blöder Schreibfehler in einer define-Anweisung.

Funktioniert soweit mit Microchip C18 !

Vielen Dank für die Library !

Ich hab mir mal die 2.01 runtergeladen und werde die Änderungen in diese 
Version einarbeiten.
Wo soll ich es dann schicken ?

Gruß

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

gera schrieb:
> Nach langer Suche habe den Fehler gefunden.

Prima!

> Funktioniert soweit mit Microchip C18 !

Ich werde Deine Änderungen in den IRMP-Source übernehmen, vielen Dank.

> Wo soll ich es dann schicken ?

Da mich Deine Mail schon erreicht hat, hast Du meine Adresse offenbar 
gefunden. Ich antworte Dir dort zu Deinem RC6-Problem.

von Tom S. (year2525)


Lesenswert?

vielen Dank erstmal für dieses Projekt, eine super Arbeit. Es hat auf 
Anhieb funktioniert, eine Creative Fernbed. RM-1500 geht einwandfrei.

2 Fragen habe ich jedoch:

1. Ich habe eine JVC RM-SV511UE remote, von der ich gern das Steuerkreuz 
nutzen möchte. Nur geht die right-Taste irgendwie überhaupt nicht, die 
up/down/left/enter Tasten gehen einwandfrei:

down
irmp_data.protocol: 20
irmp_data.address : 15
irmp_data.command : 3358
irmp_data.flags   : 0

up
irmp_data.protocol: 20
irmp_data.address : 15
irmp_data.command : 3342
irmp_data.flags   : 0

left
irmp_data.protocol: 20
irmp_data.address : 15
irmp_data.command : 3374
irmp_data.flags   : 0

enter
irmp_data.protocol: 20
irmp_data.address : 15
irmp_data.command : 3406
irmp_data.flags   : 0

right
nichts

Die Taste selbst sendet def. ein IR-Signal. Ist das ein bekannter bug? 
Ansonsten kann ich gerne das Logging aktivieren falls das weiterhilft.

2. Ich möchte das ganze in ein RTOS integrieren und dazu den IRMP 
interrupt erst einschalten wenn was am pin passiert, z.B. über einen pin 
change interrupt, und nach ein paar Sek. Pause den IRMP interrupt wieder 
ausschalten. Ist das prinzipiell mit dem vorliegenden code machbar, oder 
wird es Probleme geben weil z.B. counter hochgezählt werden müssen, die 
state machine damit nicht klarkommt etc.

Vielen Dank für das tolle Projekt.

Gruß

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Tom S. schrieb:
> vielen Dank erstmal für dieses Projekt, eine super Arbeit.

Danke fürs Danke :-)
> Die Taste selbst sendet def. ein IR-Signal. Ist das ein bekannter bug?
> Ansonsten kann ich gerne das Logging aktivieren falls das weiterhilft.

Ja, da bräuchte ich Logging-Daten. Am besten von allen 4 Richtungen des 
Steuerkreuzes.

> 2. Ich möchte das ganze in ein RTOS integrieren und dazu den IRMP
> interrupt erst einschalten wenn was am pin passiert, z.B. über einen pin
> change interrupt, und nach ein paar Sek. Pause den IRMP interrupt wieder
> ausschalten. Ist das prinzipiell mit dem vorliegenden code machbar, oder
> wird es Probleme geben weil z.B. counter hochgezählt werden müssen, die
> state machine damit nicht klarkommt etc.

Das müsste machbar sein. Schalte den Timer-Interrupt einfach beim ersten 
Toggle ein und nach einer bestimmten Zeit wieder ab.

Gruß,

Frank

von Tom S. (year2525)


Angehängte Dateien:

Lesenswert?

Hallo,

anbei der log für die JVC für alle 5 Tasten des Steuerkreuzes. Wie 
gesagt, nur die Taste right liefert bei irmp_get_data() null zurück. 
IRMP timer irq ist 14400 Hz.

Das Enablen des IRMP Interrupts nur bei Infrarot-Aktivität werde ich 
dann also demnächst mal probieren.

Danke und Grüße

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Hallo Tom,

Tom S. schrieb:
> anbei der log für die JVC für alle 5 Tasten des Steuerkreuzes. Wie
> gesagt, nur die Taste right liefert bei irmp_get_data() null zurück.

Ich habe mir den Log eben angeschaut: Die Taste right sendet 17 statt 16 
Bits. Da das JVC-Timing exakt dem NEC-Timing entspricht, startet IRMP 
erstmal mit dem Protokoll NEC bei der Startbit-Erkennung. Kommt nach dem 
16. Bit dann eine Pause (weil es eben JVC und nicht NEC ist), schaltet 
IRMP auf JVC um. Das passiert aber leider nicht, wenn da statt der Pause 
noch ein 17. Bit hinterhergeschickt wird.

Da muss ich mir etwas einfallen lassen, habe da auch schon eine Idee...

> IRMP timer irq ist 14400 Hz.

Wie kommt diese "komische" Zahl zustande? Benutzt Du vielleicht einen 
Soft-UART mit einer Abtastrate von 28800, was einer Baudrate von 9600 
entspricht? ;-)

> Das Enablen des IRMP Interrupts nur bei Infrarot-Aktivität werde ich
> dann also demnächst mal probieren.

Ja, finde ich spannend. Sollte meiner Meinung auch problemlos 
funktionieren. Du könntest den Timer-Interrupt eigentlich auch sofort 
abstellen, sobald IRMP den Frame erkannt hat und nicht erst nach einer 
"gewissen" Zeit. Dazu müsstest Du aber in den IRMP-Source eingreifen.

Gruß,

Frank

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Tom S. schrieb:
> anbei der log für die JVC für alle 5 Tasten des Steuerkreuzes. Wie
> gesagt, nur die Taste right liefert bei irmp_get_data() null zurück.

Im SVN ist nun eine neue Version, mit der jetzt auch die Taste "right" 
erkannt wird. War doch etwas mehr Arbeit als ich dachte. Läuft aber 
jetzt :-)

P.S.
Wenn Du Adresse und Code in Hex schreibst, wird die Systematik der 
Tastencodes besser ersichtlich:

# up    p=20 addr=0x000F cmd=0x0d0e
# down  p=20 addr=0x000F cmd=0x0d1e
# left  p=20 addr=0x000F cmd=0x0d2e
# right p=20 addr=0x000F cmd=0x0d3e
# enter p=20 addr=0x000F cmd=0x0d4e

von narkus (Gast)


Lesenswert?

Frank M. schrieb:
> B1. FB sendet ersten Frame
> B2. IRMP setzt Busy-Flag
> B3. IRMP liest ersten Frame ein
> B4. IRMP setzt Busy-Flag zurück
> B5. Applikation holt ersten Frame ab
> B6. FB macht eine Pause von ca. 40 msec
> B7. FB sendet zweiten Frame
> B8. IRMP setzt Busy-Flag
> B9. IRMP liest ersten Frame ein
> B10. IRMP setzt Busy-Flag zurück
> B11. Applikation holt zweiten Frame ab, Repetition-Flag ist gesetzt.

Hmm, B4 (Busy-Flag zurücksetzen) ist eigentlich falsch. IRMP sollte busy 
sein, solange ein wiederholter Tastendruck erkannt werden kann. Und das 
ist frühestens nach 114 ms der Fall!

Wird auf der FB eine Taste gedrückt gehalten, so sollte eine RC5 FB alle 
114 ms das Paket erneut senden. D.h. innerhalb dieser Zeit muss ich 
davon ausgehen, dass die Taste noch gedrückt ist!

Somit darf das Busy-Flag frühestens nach 114 ms (geben wir paar Sekunden 
Puffer drauf, für FBs, die sich nicht ganz daran halten) zurückgesetzt 
werden!

Zur Sicherheit kann man das Toggle-Bit vergleichen, falls es jemand doch 
schaffen sollte, innerhalb dieser Zeit diese Taste oder eine neue 
gedrückt zu haben. ;)

Was meinst Du dazu?
Grüße

von Tom S. (year2525)


Lesenswert?

Hallo Frank,

danke für prompte Änderungen. Ich kann bestätigen das jetzt auch die 
right Taste geht (und mit hex siehst besser aus). Ich hoffe das Deine 
Änderung der IRMP_TIMEOUT_TIME nicht andere remotes, die bis jetzt 
gingen, negativ beeinflussen werden :)
Da es eine Original JVC remote ist und der bisherige JVC Teil in IRMP 
wahrscheinlich gut getestet ist, gibt es wohl zumindest 2 Varianten des 
Protokolls im Hause JVC.

>Wie kommt diese "komische" Zahl zustande? Benutzt Du vielleicht einen
>Soft-UART mit einer Abtastrate von 28800, was einer Baudrate von 9600
>entspricht? ;-)

Nein, hat nichts mit einer UART zu tun. Ich habe einen 14.7456 MHz Quarz 
und wollte eine "glatte" interrupt Frequenz haben, also habe ich clk/8 
verwendet und OCR0A auf 127 gesetzt :)

Enablen des IRMP Interrupts nur bei Infrarot-Aktivität werde ich am WE 
probieren.

Danke und Grüße

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Tom S. schrieb:
> danke für prompte Änderungen. Ich kann bestätigen das jetzt auch die
> right Taste geht (und mit hex siehst besser aus). Ich hoffe das Deine
> Änderung der IRMP_TIMEOUT_TIME nicht andere remotes, die bis jetzt
> gingen, negativ beeinflussen werden :)

Ich checke nach Source-Änderungen einen Großteil der Scans im Ordner 
IR-Data unter Linux komplett durch, siehe IR-Data/test-suite.sh. Erst, 
wenn alle Scans ohne Fehler erkannt werden, gebe ich die Software raus.

> Da es eine Original JVC remote ist und der bisherige JVC Teil in IRMP
> wahrscheinlich gut getestet ist, gibt es wohl zumindest 2 Varianten des
> Protokolls im Hause JVC.

JVC ist relativ spät dazugekommen, gibt es erst seit ein paar Monaten. 
Also soooo gut getestet war es bisher nicht. Aber es sind tatsächlich 
Differenzen im Protokoll-Verhalten zwischen den beiden 
JVC-Fernbedienungen, deren Scans ich bisher erhalten habe. Das konnte 
ich aber erst anhand Deiner Right-Taste erkennen.

Gruß,

Frank

von jar (Gast)


Lesenswert?

Frank M. schrieb:
> irmp_protocol_names[irmp_data.protocol]

Frank M. schrieb:
> @jar:
>
> Um auf die Protokollnamen zugreifen zu können, muss

hallo, bin grad wieder bei

muss nun mein code anpassen

kannst du evt. in irmp.h ein

#ifndef TRUE vor line 486 setzen ?

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


oder liegt der Fehler bei mir
../irmp.h:486:1: warning: "TRUE" redefined

von Cajus H. (cajush)


Lesenswert?

Hallo Frank,

meine programmierbare Fernbedienung mit 5" Touch-Screen ist fast fertig 
und ich feile an den letzten Kleinigkeiten.
Das aktuelle Problemkind sind zwei verschieden-alte Samsung LCD-TV, die 
beide das SAMSUNG32 Protokoll verwenden.
Problem 1: Das von IRSND generierte Signal wird vom TV nur erkannt, wenn 
meine FB in geringem Abstand vor dem TV mit Zielfernrohr auf das TV 
Gerät gerichtet wird. Außerdem muss man jede Taste ziemlich lange 
drücken, bis diese vom TV aktzeptiert wird.
Problem 2: Beim hintereinander-senden von mehreren Befehlen (z.B. "2", 
"4", "Enter" für die Anwahl des Programmes 24) wird nur der erste Befehl 
vom TV aktzeptiert.

zu Problem 1: Ich habe die Signale von IRSND und den Original-FB's am 
Ozszilloskop verglichen.
Mir sind folgende Unterschiede aufgefallen:
a) IRSND sendet immer zwei Frames, die Fernbedienungen senden auch 
einzelne Frames, wenn man die Taste kurz genug drückt.
b) die Pause-Zeit für den Bitwert "1" von IRSND ist zu kurz. 
IRSND=1450us, die Original-FB's haben 1680us und 1710us
c) die Pause-Zeit für den Bitwert "0" von IRSND ist zu kurz. 
IRSND=450us, die Original-FB's haben 550us und 580us
Die übrigen Zeiten aus den Definitionen in irmp.h (_START_BIT_xx und 
_PULSE_TIME) stimmen aber exakt!
Ich habe also folgende Änderungen in irmp.h vorgenommen:
#define SAMSUNG_1_PAUSE_TIME  1700.0e-6    // 1700 usec pause
#define SAMSUNG_0_PAUSE_TIME   550.0e-6    //  550 usec pause
#define SAMSUNG32_FRAMES      1            // SAMSUNG32 sends each frame 
1 time
Danach funktionierte meine FB wesentlich besser!

zu Problem 2: Ich konnte das Problem beheben, indem ich zwischen die 
Sendebefehle eine 50ms Pause eingefügt habe.
In Deinem Beitrag vom 20.05.2011 11:43 hattest Du dieses Problem als 
fixed gepostet:

>> IRSND hat im Moment auch noch einen unschönen Bug, den ich dabei auch
>> noch loswerden möchte: Nach Aussenden des gewünschten Frames wird die
>> Pause-Zeit zum nächsten Frame nicht eingehalten, wenn man
>> irsnd_send_data() direkt wieder aufruft. Innerhalb von flags > 0 wird
>> das korrekt eingehalten, aber nach dem letzten gesendeten Frame kann man
>> direkt wieder mittels irsnd_send_data() "feuern". Das ist unschön.

> Diesen Bug habe ich nun auch gefixt. Ist zwar noch nicht optimal, aber
> ich bin erstmal damit zufrieden. Die Pause wird nämlich erst dann
> eingefügt, wenn auch tatsächlich ein 2. Frame auf die Reise geschickt
> wird.

Kann es sein, dass noch nicht ganz funktioniert?

Viele Grüße
Cajus

von Joachim B. (jar)


Lesenswert?

frage zu IRSND

wo muss ich die CPU definieren ?
../irsnd.c:197:2: error: #error mikrocontroller not defined, please fill 
in definitions here.

holt IRSND sich das nicht aus astudio win-gcc den projekt options ? da 
hab ich doch die CPU gewählt

und wenn ich schon definieren muss, wie bitte ? für atmega1284p

   || defined (_AVR_ATmega1284P_)                      // 
ATmega164|324|644|644P|1284 uses OC2A = PD7 or OC2B = PD6 or OC0A = PB3 
or OC0B = PB4

es fehlte der Prozessor 1284p

noch eine kleine Anmerkung, sollte mit der Nennung OC2A und der CPU 
Definition der Port PD7 bekannt sein ? warum muss man den noch extra 
eingeben ?

noch ne doofe Frage, in astudio und im Arbeitsdir, wechseln manchmal die 
Dateinamen zu Uppercase Letter, das provoziert den c++ Fehler, ich weiss 
nicht wieso alle meine Dateinamen manchmal groß werden, auch wenn sie 
noch klein sind öffnet AStudio diese in Großbuchstaben und manchmal wird 
es auch so im Dir angezeigt

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Joachim B. schrieb:

> und wenn ich schon definieren muss, wie bitte ? für atmega1284p
>
>    || defined (_AVR_ATmega1284P_)                      //
> ATmega164|324|644|644P|1284 uses OC2A = PD7 or OC2B = PD6 or OC0A = PB3
> or OC0B = PB4
>
> es fehlte der Prozessor 1284p

Ja, den habe ich einfach vergessen. Eintragen und fertig:
1
#elif defined (__AVR_ATmega164__)   \
2
   || defined (__AVR_ATmega324__)   \
3
   || defined (__AVR_ATmega644__)   \
4
   || defined (__AVR_ATmega644P__)  \
5
   || defined (__AVR_ATmega1284__)  \
6
   || defined (__AVR_ATmega1284P__)                     // ATmega164|324|644|644P|1284 uses OC2A = PD7 or OC2B = PD6 or OC0A = PB3 or OC0B = PB4


> noch eine kleine Anmerkung, sollte mit der Nennung OC2A und der CPU
> Definition der Port PD7 bekannt sein ? warum muss man den noch extra
> eingeben ?

Musst Du ja eben nicht. In irsndconfig einfach OC2A auswählen und 
fertig. Über das obige #if in irsnd.c "weiß" dann der Compiler, welcher 
Portpin verwendet wird.

> noch ne doofe Frage, in astudio und im Arbeitsdir, wechseln manchmal die
> Dateinamen zu Uppercase Letter, das provoziert den c++ Fehler, ich weiss
> nicht wieso alle meine Dateinamen manchmal groß werden, auch wenn sie
> noch klein sind öffnet AStudio diese in Großbuchstaben und manchmal wird
> es auch so im Dir angezeigt

Ich habe alle IRMP-/IRSND-Sources mit Kleinbuchstaben angelegt, gerade 
um solche Probleme zu vermeiden.

Gruß,

Frank

von Joachim B. (jar)


Lesenswert?

Frank M. schrieb:
> Ich habe alle IRMP-/IRSND-Sources mit Kleinbuchstaben angelegt, gerade
> um solche Probleme zu vermeiden.

das habe ich auch, nur mein Problem ist ja das die urplötzlich groß 
werden

ich vermute aber das passiert durch primalscript wenn ich ausserhalb vom 
astudio mal eine *.c öffne

also wenns nicht astudio macht, dann wer anderes, ich wollte nur mal 
hören ob den Fehler jemand kennt

von Klaus K. (klkl)


Angehängte Dateien:

Lesenswert?

Hallo zusammen

Ich habe das irmp Projekt erfolgreich auf einem ARM SAM7x unter ethernut 
ans laufen bekommen. Die minimalen Änderungen schicke Ich hier mit.
Ein wirklich schönes Projekt....

Mein Vorschlag wäre es die Hardwareabhängigkeiten weitgehend aus irmp.c 
zu entfernen und insbesondere die input-Funktion ohne Parameter als 
extern zu deklarieren. Dann muss auf jeder Platform nur noch eine 
entsprechende Funktion generiert werden, und man muss weniger an irmp 
ändern.

Dann ist mir noch aufgefallen, das die IRQ-Routine für mein Gefühl recht 
viel Zeit beansprucht. 5-7us, damit verbraucht die IR-Erkennung bei 
15000 IRQs/s etwa 10% der Rechenleistung des SAM7. Bei einem AVR sieht 
das bestimmt noch schlechter aus(?)

Die Ethernut-Anbindung kann Ich auch an Interessiert weitergeben. Unter 
www.klkl.de werde Ich in den nächsten Tagen eine Seite dazu schreiben.

Vielen Dank, irmp hat mich schnell an mein Ziel gebracht
Gruß Klaus

von Joachim B. (jar)


Lesenswert?

hallo Frank,

so langsam komme ich voran, kann offensichtlich genau einmal IRSND 
aufrufen, danach hängt der Atmel, muss ich noch suchen (grrrr)

in deiner Projektseite hier :
http://www.mikrocontroller.net/articles/IRMP#IRSND_-_Infrarot-Multiprotokoll-Encoder
ist der Aufruf noch beschrieben als :
1
irsnd_send_data (&irmp_data);

ergibt aber:
Build error weil :
1
(void) irsnd_send_data (&irmp_data, TRUE);

eine Idee warum der genau nach einmal Aufruf abstürzt ? hab ich was beim 
Einbinden übersehen ?
1
      if(res_key & ( 1<<KEY_ENTER ))
2
      {  res_key=0;
3
        if(__p==_IRSND)
4
        {  
5
           irmp_data.protocol = IRMP_SAMSUNG32_PROTOCOL;   // sende im NEC-Protokoll
6
           irmp_data.address  = 0x0707;              // verwende Adresse 0x00FF
7
           irmp_data.command  = 0xed12;              // sende Kommando 0001
8
           irmp_data.flags    = 5;                   // keine Wiederholung!
9
10
          lcd_gotoxy(0,1); lcd_puts("R: Code: "); lcd_puts(trimm_string(' ', irmp_protocol_names[irmp_data.protocol], 8));
11
          lcd_gotoxy(0,2); lcd_puts("A: "); 
12
          strcpy(s2, "0x"); strcat(s2, utoa(irmp_data.address,s,16)); lcd_puts(trimm_string(' ', s2, 6)); 
13
          strcpy(s2, "("); strcat(s2, utoa(irmp_data.address,s,10)); strcat(s2, "d)");
14
          lcd_gotoxy(11,2); lcd_puts(trimm_string(' ', s2, 8));
15
          
16
          lcd_gotoxy(0,3); lcd_puts("C: ");
17
          strcpy(s2, "0x"); strcat(s2, utoa(irmp_data.command,s,16));  lcd_puts(trimm_string(' ', s2, 6)); 
18
          strcpy(s2, "("); strcat(s2, utoa(irmp_data.command,s,10)); strcat(s2, "d)");
19
          lcd_gotoxy(11,3); lcd_puts(trimm_string(' ', s2, 8));
20
            irsnd_send_data (&irmp_data, TRUE);
21
        }
22
}

danke jar

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Hallo Joachim,

Joachim B. schrieb:
> Build error weil :
> (void) irsnd_send_data (&irmp_data, TRUE);

Stimmt, da habe ich vergessen, den Artikel anzupassen. Werde ich 
nachholen.

> eine Idee warum der genau nach einmal Aufruf abstürzt ? hab ich was beim
> Einbinden übersehen ?

Kann ich erstmal nicht sehen. Schickt er denn tatsächlich 1+5 Frames 
raus, so wie du mit

> irmp_data.flags = 5;   // keine Wiederholung!

eingestellt hast?

Am leichtesten siehst Du das, wenn Du Dir die IR-LED mit einer 
Digitalkamera anschaust. Bei 6 Frames müsste es schon mehr als eine 
halbe Sekunde flackern.

Da ich nicht weiß, was das Programm nach Ausführen von irsnd_send_data() 
macht, kann ich Dir auch nicht sagen, wo es danach abstürzt ;-)

Gruß,

Frank

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Hallo Klaus,

Klaus Kloos schrieb:

> Ich habe das irmp Projekt erfolgreich auf einem ARM SAM7x unter ethernut
> ans laufen bekommen. Die minimalen Änderungen schicke Ich hier mit.

Vielen Dank für die Änderungen, werde ich in den IRMP-Source einbauen. 
Leider hast Du Deine eigene Input-Funktion weggelassen, hätte mich schon 
interessiert.

> Mein Vorschlag wäre es die Hardwareabhängigkeiten weitgehend aus irmp.c
> zu entfernen und insbesondere die input-Funktion ohne Parameter als
> extern zu deklarieren. Dann muss auf jeder Platform nur noch eine
> entsprechende Funktion generiert werden, und man muss weniger an irmp
> ändern.

Ich wollte eigentlich aus "Zeitgründen" vermeiden, eine externe Funktion 
in der ISR dafür aufzufrufen. Ließe sich Deine input-Funktion nicht auch 
als Makro in irmpconfig.h realisieren?

Gruß,

Frank

von Joachim B. (jar)


Lesenswert?

Frank M. schrieb:
> Da ich nicht weiß, was das Programm nach Ausführen von irsnd_send_data()
> macht, kann ich Dir auch nicht sagen, wo es danach abstürzt ;-)
> Gruß,
> Frank

bin einen Schritt weiter, kann mehrfach das Kommando mit KEY_ENTER 
auslösen

mir fehlt im Moment noch ein 2ter IRMP Empfänger, deine Idee mit der LED 
hatte ich schon umgesetzt, parallel zur IR ist eine UH rt LED zum 
gucken, einmal hab ich die IR mit der Cam im Handy gecheckt, öfter tut 
erst mal nicht Not

habe die Pollin RS232 zu FBAS bekommen, werde den ATmega 8 zu 168 
tauschen und den TSOP und IR Dioden bestücken, RS232 zu USB nehme ich 
die billigen 9,95 Teile, die aber nur 0 und +V liefern, doof mal sehen 
ob RTS und DTR genug Strom liefern zum betreiben vons ganze, deswegen 
wollte ich ja v-usb, da wäre der Strom gleich mitgekommen, aber den USB 
Adapter aufbohren mag ich nicht

muss man eigendlich den Buffer leeren ? mit
1
while(irmp_get_data(&irmp_data));

kannst du für IRSND noch die Codes für Sony Panasonic Canon Nikon DSLR 
Cams nachrüsten ?

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Hallo Cajus,

Cajus H. schrieb:

> Das aktuelle Problemkind sind zwei verschieden-alte Samsung LCD-TV, die
> beide das SAMSUNG32 Protokoll verwenden.
> Problem 1: Das von IRSND generierte Signal wird vom TV nur erkannt, wenn
> meine FB in geringem Abstand vor dem TV mit Zielfernrohr auf das TV
> Gerät gerichtet wird. Außerdem muss man jede Taste ziemlich lange
> drücken, bis diese vom TV aktzeptiert wird.

Könnte das eine falsche Modulationsfrequenz sein? Die schlechte 
Reichweite spricht jedenfalls dafür. Kannst Du Modulationsfrequenz bei 
den Original-Fernbedienungen mit einem Scope (o.ä.) messen? Die 38kHz 
sind beim Samsung32-Protokoll nur "geraten", da ich darüber keine Daten 
im Internet finden konnte.

> zu Problem 1: Ich habe die Signale von IRSND und den Original-FB's am
> Ozszilloskop verglichen.
> Mir sind folgende Unterschiede aufgefallen:
> a) IRSND sendet immer zwei Frames, die Fernbedienungen senden auch
> einzelne Frames, wenn man die Taste kurz genug drückt.

Upps! Danke für die Info! Ich hatte bisher nur Samsung32-Scans bekommen, 
wo immer 2 Frames hintereinander kamen. Die Leute drücken leider beim 
Scannen meist länger die Taste, damit es auch "garantiert" ankommt. Hat 
den Nachteil, dass ich dann falsche Schlussfolgerungen ziehe. ;-)

Also ist für SAMSUNG32 in

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

der Eintrag

  Wiederholung     einmalig nach 45ms

falsch und es muss heißen:

  Wiederholung     keine.

> b) die Pause-Zeit für den Bitwert "1" von IRSND ist zu kurz.
> IRSND=1450us, die Original-FB's haben 1680us und 1710us
> c) die Pause-Zeit für den Bitwert "0" von IRSND ist zu kurz.
> IRSND=450us, die Original-FB's haben 550us und 580us

Danke auch dafür, ich werde das mit den mir vorliegenden Scans 
gegenprüfen. Ich habe da dieselben Werte wie für das SAMSUNG-Protokoll 
angenommen, da es im Rahmen der Messungenauigkeiten war und sich 
ansonsten das SAMSUNG- und das SAMSUNG32-Protokoll doch sehr ähneln.

> Die übrigen Zeiten aus den Definitionen in irmp.h (_START_BIT_xx und
> _PULSE_TIME) stimmen aber exakt!

Und das ohne Dokumentation :-) Ich habe mir das Samsung32-Protokoll 
nämlich lediglich anhand von Scans zusammengereimt.

> Ich habe also folgende Änderungen in irmp.h vorgenommen:
> #define SAMSUNG_1_PAUSE_TIME  1700.0e-6    // 1700 usec pause
> #define SAMSUNG_0_PAUSE_TIME   550.0e-6    //  550 usec pause
> #define SAMSUNG32_FRAMES      1            // SAMSUNG32 sends each frame
> 1 time
> Danach funktionierte meine FB wesentlich besser!

Danke, ist aber die falsche Stelle, da sich damit auch die Timings für 
das SAMSUNG-Protokoll (ohne 32) ändern. Tatsächlich muss ich da wohl 
SAMSUNG und SAMSUNG32 vom Timing her trennen.

> In Deinem Beitrag vom 20.05.2011 11:43 hattest Du dieses Problem als
> fixed gepostet:

Ja, das stimmt, hatte ich eigentlich gefixed... dachte ich jedenfalls 
:-)
Werde ich aber nochmal überprüfen.

Viele Grüße,

Frank

von Klaus K. (klkl)


Lesenswert?

Hallo Frank

Hier die wichtigsten Teile zu input-Funktion.
Für den Zeitbedarf ist es eigentlich unerheblich, ob eine externe oder 
eine Funktion aus der gleichen Code-Datei aufgerufen wird. Der Linker 
packt diese ja später zusammen, egal woher die Funktionen kommen. Der 
Optimierer hat nur etwas schlechtere Chancen überflüssiges zu entsorgen.

Wenn man die input-Funktion als 'wie ist denn der Stand auf dem 
IR-Eingang' versteht, dann kann dort der übergebene Parameter weg.

Ich betrachte irmp als autarkes Modul. Die Hardware-Abhaengigkeiten sind 
bei mir im aufrufenden Thread. Um die Funktion in irmpconfig() mit 
meiner input-Funktion ans compilieren zu bekommen müsste Ich dort wieder 
Dateien für den SAM7 einbinden.
Vielleicht kann man ein define vorsehen, womit dann die input-Funktion 
extern erwartet wird?

/*!
 * \def IO_PIO_PDS_REG
 * \brief Pin data status register of the button interface.
*/
#define IO_PIO_PDS_REG PIOB_PDSR

/*!
 * \def IO_IR_BIT
 * \brief used PIO bit. */
#define IO_IR_BIT      29

bei der Thread-Initialisierung
    /* Initialize GPIO lines for IR-Read. */
    outr(IO_PIO_PE_REG, IO_IR);
    outr(IO_PIO_OD_REG, IO_IR);
    outr(IO_PIO_PUE_REG, IO_IR);

/*!
 * \brief hier die Funktion fuer irmp um den Status des IO-Pins zu 
ermitteln
 */
uint8_t input(uint8_t test)
{
  return ( (~inr(IO_PIO_PDS_REG) & IO_IR) == 0);
}

Gruß Klaus

von Joachim B. (jar)


Lesenswert?

@frank, hattest du das gelesen ?

Joachim B. schrieb:
> muss man eigendlich den Buffer leeren ? mit
>
1
> while(irmp_get_data(&irmp_data));
2
>
>
> kannst du für IRSND noch die Codes für Sony Panasonic Canon Nikon DSLR
> Cams nachrüsten ?

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Joachim B. schrieb:
> @frank, hattest du das gelesen ?

Ja, habe ich eben gelesen.

> muss man eigendlich den Buffer leeren ? mit
>
1
> while(irmp_get_data(&irmp_data));
2
>

Sollte man machen, wenn man dem User (z.B. fürs Anlernen) sagen will:

           "Drücke JETZT Taste auf FB".

Dann sollte man irgendwelche Frames, die man sich DAVOR "eingefangen" 
hat (z.B. weil die Freundin vorher ferngesehen hat) wegwerfen. Wenn Du 
aber sowieso permanent in einer Endlosschleife irmp_get_data() aufrufst, 
wäre oben genannte Zeile sinnfrei.

>> kannst du für IRSND noch die Codes für Sony Panasonic Canon Nikon DSLR
>> Cams nachrüsten ?

Steht natürlich auf meiner TODO-Liste. Jedes Protokoll, welches ich in 
den IRMP einbaue, will ich später dann auch in den IRSND einbauen. Aber 
nicht immer sind dafür Zeit und Lust vorhanden ;-)

Gruß,

Frank

von Joachim B. (jar)


Lesenswert?

Frank M. schrieb:
>>> kannst du für IRSND noch die Codes für Sony Panasonic Canon Nikon DSLR
>>> Cams nachrüsten ?
>
> Steht natürlich auf meiner TODO-Liste. Jedes Protokoll, welches ich in
> den IRMP einbaue, will ich später dann auch in den IRSND einbauen. Aber
> nicht immer sind dafür Zeit und Lust vorhanden ;-)
>
> Gruß,
>
> Frank

ja ist klar, meine todo ist auch länger als meine Zeit, brauchst du die 
Parameter für die Cams ? ich hab im Moment nur Q&D Code erzeugt der 
funktioniert, würde den gerne rauswerfen wenn IRSND eh schon drin 
ist....

mangels aller IR Sender kann ich die logisch nicht in IRMP scannen

von Joachim B. (jar)


Lesenswert?

@ Frank

Frage zu IRSND irmp_data.flags steht ja für Wiederholungen, 
offensichtlich bedeutet 0 eine Aussendung, also müsste 5 Wiederholungen 
6 Aussendungen bedeuten, mein TV Samsung32 hat aber jeweils nur 5 Prg 
weitergeschaltet,
(immerhin wenn man 99 wiederholungen proggt kann man so schnell als 
möglich zappen)
deswegen war ich in dem Glauben 5 bedeutet 5x aussenden und 0 eben 
keinmal, aber eben getestet, 0 bedeutet 1 Sendung aber 5 hat nur 5 PRG+ 
geschaltet und nicht 6

bin leicht verwirrt davon

der Absturz in meiner HW kann nur an der Dauer gelegen haben, bei 5 
repeat wird mein(e) Interrupt(s) zu lange unterbrochen, da kommt alles 
durcheinander

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Joachim B. schrieb:

> Frage zu IRSND irmp_data.flags steht ja für Wiederholungen,
> offensichtlich bedeutet 0 eine Aussendung, also müsste 5 Wiederholungen
> 6 Aussendungen bedeuten, [...]

Ja.

> mein TV Samsung32 hat aber jeweils nur 5 Prg weitergeschaltet,
> (immerhin wenn man 99 wiederholungen proggt kann man so schnell als
> möglich zappen)
> deswegen war ich in dem Glauben 5 bedeutet 5x aussenden und 0 eben
> keinmal, aber eben getestet, 0 bedeutet 1 Sendung aber 5 hat nur 5 PRG+
> geschaltet und nicht 6

Wie schon Cajus in

Beitrag "Re: IRMP - Infrared Multi Protocol Decoder"

andeutete, muss da wohl jeweils eine Zwangspause gemacht werden. Diese 
wird zwar gemacht, wenn man irsnd_send_data() mit flags = 5 aufruft, 
aber nicht, wenn man 6x hintereinander irsnd_send_data() mit flags = 0 
aufruft. Die von Cajus gemachten Verbesserungsvorschläge für SAMSUNG32 
werde ich in den Source einarbeiten, Du kannst dies ja auch schonmal 
parallel bei Dir machen.

Gruß,

Frank

von Joachim B. (jar)


Lesenswert?

Frank M. schrieb:
> muss da wohl jeweils eine Zwangspause gemacht werden. Diese
> wird zwar gemacht, wenn man irsnd_send_data() mit flags = 5 aufruft,
> aber nicht, wenn man 6x hintereinander irsnd_send_data() mit flags = 0
> aufruft.

da muss ein Verständnisproblem vorliegen

du schreibst die Zwangspause wird benötigt und gemacht für
"irsnd_send_data() mit flags = 5"

wenns so wäre warum dann nur 5 Weiterschaltungen und nicht 6 ?

also 1 +5 Wiederholungen

"6x hintereinander irsnd_send_data() mit flags = 0"
hab ich nicht versucht, also kann deine Erklärung nicht passen ???

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Joachim B. schrieb:

> wenns so wäre warum dann nur 5 Weiterschaltungen und nicht 6 ?

Das weiß ich nicht. Vielleicht akzeptiert das Gerät nicht mehr als 5 
Wiederholungen in so kurzer Zeit?

Gruß,

Frank

von Joachim B. (jar)


Lesenswert?

Frank M. schrieb:
> Vielleicht akzeptiert das Gerät nicht mehr als 5
> Wiederholungen in so kurzer Zeit?

das wäre ja leicht zu testen :-) mach ich am WE

mit FLAGS 1, FLAGS 2, FLAGS 3, FLAGS 4, FLAGS 5, FLAGS 6,

müsste ja 2, 3, 4, 5, 6, 7 Weiterschaltungen geben :-)

von Cajus H. (cajush)


Lesenswert?

Hallo Frank,

>> ...Samsung LCD-TV, die beide das SAMSUNG32 Protokoll verwenden.
>> Das von IRSND generierte Signal wird vom TV nur erkannt, wenn
>> meine FB in geringem Abstand vor dem TV mit Zielfernrohr auf das TV
>> Gerät gerichtet wird. Außerdem muss man jede Taste ziemlich lange
>> drücken, bis diese vom TV aktzeptiert wird.

> Könnte das eine falsche Modulationsfrequenz sein? Die schlechte
> Reichweite spricht jedenfalls dafür. Kannst Du Modulationsfrequenz bei
> den Original-Fernbedienungen mit einem Scope (o.ä.) messen? Die 38kHz
> sind beim Samsung32-Protokoll nur "geraten", da ich darüber keine Daten
> im Internet finden konnte.

nein, ich habe die Frequenzen überprüft. 37.3 und 37.5 kHz. Das scheint 
mir innerhalb der Toleranz zu sein. Außerdem ist das Problem nach der 
Timing-Änderung wesentlich besser was ebenfalls gegen eine falsche 
Modulationsfrequenz spricht.
Ich habe übrigens auch die Wellenlängen der IR-LEDs der original-FBs mit 
der von mir verwendeten LED verglichen. Diese sind ebenfalls identisch.

Die vorgeschlagenen Änderungen werde ich vermutlich in Kürze im 
SVN-Repository wiederfinden, dann werden sie auch den Weg in meine 
Sourcen finden.

Hast Du noch vor die Zwangspause bei Befehlen gleichen Typs einzubauen? 
(bei flags=0). Wäre ganz schick, insbesondere bei Macros für 
Sendernummern ("2","3","Enter")

Viele Grüße
Cajus

von DK3SB (Gast)


Lesenswert?

Hallo zusammen,

ich versuche hier gerade ein kleines Heimproblem zu beheben: Bisher 
musste ich TV und Reciever hier immer mit 2 Fernbedienungen einschalten, 
die Fernbedienung für den Reciever brauchte ich danach aber nie wieder, 
also ging es mir auf den Geist immer 2 FBs rumliegen zu haben. Also 
dachte ich mir: Wäre es nicht prima, das durch eine unauffällige Kiste 
zu ersetzen, die auf das Power-On via Infrarot von der TV-Remote wartet 
und daraufhin das Power-On für den Reciever sendet.

Also genau das mit IRMP und IRSND realisiert, auf einen Formfaktor 
verkleinert, in dem es bequem in ein kleines Digitalthermometer passt, 
was nun in der Linie Sofa -> TV steht. Geht prima. Nach jetzt ca. 6 
Wochen kam mir das Problem der zu geringen Batterielaufzeit in den Sinn 
- ich musste jetzt das zweite mal die 2 x AAA-Zellen wechseln.
Der AtTiny45 den ich benutze ist bereits auf einen SleepMode 
eingestellt, den er immer betritt, wenn nix zu tun ist (was etwa 90% der 
Zeit der Fall ist schätze ich), aufwachen tut er durch die ISR vom 
Timer, in dem dann IRSND und IRMP aufgerufen werden. Das ging auch 
super, es verbleibt aber die Dauerhafte Stromaufnahme des TSOP, der an 
Vcc hängt. Also wollte ich diesen nun über einen Portpin schaltbar 
machen. Also vor der IRMP-ISR das Ding anschalten, danach wieder aus, 
keine Magie.

Nun wird allerdings nichts mehr deokdiert, das Umschalten des Portpins 
kann ich mit dem Oszi nachvollziehen, geht, ist etwa 10% der Zeit an, 
den Rest aus. Ich habe den Vcc-Pin des TSOP einfach an den µC gelötet 
und schalte so, wenn er an sein soll, den Pin Hi.

Am Data-Ausgang ist nun aber nix zu messen - könnt ihr mir das erklären? 
Brauch der TSOP eine Art "Einschwingzeit", ist mein Vorgehen komplett 
unangebracht? Was gibts für ne bessere Idee, das Ding auf Stromsparen zu 
optimieren?

mfg,
Stefan

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

DK3SB schrieb:
> Am Data-Ausgang ist nun aber nix zu messen - könnt ihr mir das erklären?
> Brauch der TSOP eine Art "Einschwingzeit", [...]

Ja, so wird es wohl sein. Der TSOP empfängt dann ja auch keine 
vollständigen Bits mehr, wenn er nur für einen Bruchteil der Zeit, die 
ein Bit braucht, eingeschaltet ist.

> Was gibts für ne bessere Idee, das Ding auf Stromsparen zu optimieren?

Welchen TSOP benutzt Du? Die neueren TSOP312xx (3mA?) sollen etwas 
sparsamer sein als die TSOP17xx (5mA).

Alternative wäre eine Selbstbau-FB, die mit IRMP/IRSND arbeitet, siehe 
z.B.

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

Das Ding kommt mit einigen µA aus. Wahrscheinlich reichen Dir die aber 
die 5 Tasten nicht, hier könnte man evtl. eine Tastatur-Matrix 
verwenden.

Gruß,

Frank

von Joachim B. (jar)


Lesenswert?

DK3SB schrieb:
> Der AtTiny45 den ich benutze ist bereits auf einen SleepMode
> eingestellt, den er immer betritt, wenn nix zu tun ist (was etwa 90% der
> Zeit der Fall ist schätze ich), aufwachen tut er durch die ISR vom
> Timer, in dem dann IRSND und IRMP aufgerufen werden. Das ging auch
> super, es verbleibt aber die Dauerhafte Stromaufnahme des TSOP

ich persönlich würde den TINY nicht per Timer aufwachen lassen sondern 
vom Pegelwechsel des TSOP, die Zeit für das Tinyaufwachen dürfte noch 
reichen um den Befehl auszuwerten, das senkt schon mal den 
Stromverbrauch, aber jeder IR Befehl weckt natürlich ! den Tiny ! also 
um dickere Akkus und Wechsel wirst du nicht rumkommen ! ich staune nur 
das der neue mit 3mA weniger verbrauchen soll, meine alten TSOP 17 haben 
nur um 1mA gebraucht

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Joachim B. schrieb:ich staune nur
> das der neue mit 3mA weniger verbrauchen soll, meine alten TSOP 17 haben
> nur um 1mA gebraucht

Meine TSOP auch, aber im Datenblatt stehen halt die 5mA bzw. 3mA - warum 
auch immer.

von Joachim B. (jar)


Lesenswert?

Frank M. schrieb:
> Das Ding kommt mit einigen µA aus. Wahrscheinlich reichen Dir die aber
> die 5 Tasten nicht, hier könnte man evtl. eine Tastatur-Matrix
> verwenden.

genau ! ich grübel gerade, irgendwo hatte ich eine Tastenmatrix gesehen 
die mit einem ! Pinchange Interrupt geweckt wird, da darf dann auch der 
TSOP abgeschaltet sein ! und trotzdem ist eine Tastenmatrix mit viel 
mehr ! Tasten möglich, zum Anlernen weckt man den auf kann bei IR 
Empfang in anlernen gehen, sonst nach aufwecken nur senden ! da braucht 
der TSOP dann keinen Strom saugen, trotzdem scheint mir dazu auch der 
168 von den Port unterdimensioniert wenn ich mal durchzähle 48-60 Tasten 
keine Seltenheit, heisst 8x8 Matrix und so viele Ports + LEDs sind 
selten frei, sieht eher nach mega32 bis 1284(p)aus, dafür auch im DIL40 
zu bekommen

PS. Senden 18mA ? (für Reichweite sollte man die 100mA mindestens 
ausnutzen, für schwache Batterien eher etwas drüber, damit das auch noch 
geht wenn der Batteriepegel sinkt) ich hab den Rv für die IR Sende Diode 
auf 22 Ohm verkleinert und für bessere Winkel lieber 2 IR Dioden in 
Reihe gelegt, meine 3mm Dioden finde ich recht schmal im Abstrahlwinkel, 
kann aber am Steckbrettaufbau liegen, nach unten ist das Brett der 
Begrenzer, optimal sitzen ja Dioden so das sie vorne über die Kante 
stehen und in keine Richtug eingeschränkt werden, aber mehr als 50° 
Dioden fand ich nicht in 3mm, als 5mm geht mehr, will aber optisch zu 
den LED (3mm) kompatibel bleiben

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Joachim B. schrieb:

> genau ! ich grübel gerade, irgendwo hatte ich eine Tastenmatrix gesehen
> die mit einem ! Pinchange Interrupt geweckt wird, da darf dann auch der
> TSOP abgeschaltet sein !

Klar.

> PS. Senden 18mA ?

Ja, aber es sind 18mA im Mittel. Der max. Strom durch die Sendediode ist 
natürlich höher, nämlich fast 100mA. Dies liegt zum einen an der 
Modulation mit einem Puls-Pausen-Verhältnis 50:50, andererseits an den 
Pausen des jeweiligen IR-Protokolls. Der mittlere Strom von 18mA ist 
genau das, was die IR-Sendediode (im Mittel) verkraftet - bei max. 
Sendeleistung. Das passt also ganz gut so.

von Stefan Biereigel (Gast)


Lesenswert?

Danke für eure Anregungen, ein paar kleine Kommentare dazu:

1. Die 5mA Verbrauch für TSOP 1738 sind quatsch, im Datenblatt steht 
dieser Wert in der Tabelle der "Absolute Maxmium Ratings", bei den 
"Normal Conditions" stehen da ~1mA, und das ist auch der reelle 
Verbrauch.

2. Eine Neue lernfähige Fernbedienung zu bauen wäre für meine Anwendung 
quatsch. Ich möchte meine Samsung-Remote benutzen, sie hat alle 
Funktionen und sieht dazu noch gut aus. Das war der Grund, eine solche 
"Verlängerung" für die zweite Fernbedienung zu bauen, und was anderes 
möchte ich auch garnicht. Das Thermometer sieht dekorativ aus, nur war 
halt das Batteriewechseln aller 2-3 Wochen mir nun aufgefallen.
Darum suche ich auch nach Stromsparmaßnahmen für den TSOP - gibt es 
eventuell einen speziell auf Stromverbrauchsminimierung ausgelegten 
Ersatz?

Abschalten kann man ihn wohl nicht, ich sehe in der kurzen On-Zeit kein 
Logisch-Hi am DATA-Out, wo es ja eigentlich sein müsste, das kommt erst 
später.

Aber nunja:

3. Ein Aufwachen auf die Pegelwechsel funktioniert hier nicht, da IRMP 
in festen Zeitintervallen aufgerufen werden will. Was man machen könnte, 
nach einer Art "Timeout" den Interrupt zu deaktivieren und auf externe 
Pegelwechsel zu triggern, wodurch er wieder aktiviert wird. Aber wie 
schon gesagt ist der AtTiny nicht mein Hauptstromverbrauch im Moment, er 
schläft etwa 90% der Zeit. Der TSOP der aber nicht abgeschalten wird 
braucht seine 1-2mA Dauerstrom und zieht die Batterie leer, dagegen kann 
ich nix machen, denke ich mittlerweile.

Danke trotzdem euch allen für eure Vorschläge, falls noch jemand was 
hat: Bin ich immer offen für!

von Joachim B. (jar)


Lesenswert?

Stefan Biereigel schrieb:
> 2. Eine Neue lernfähige Fernbedienung zu bauen wäre für meine Anwendung
> quatsch. Ich möchte meine Samsung-Remote benutzen

also Quatsch finde ich zu hart, why not ?
für mich wäre Selbstbau einer neuen in dem Grund begründet da alle meine 
lerndenden zu wenig Bittiefe haben und ich eine mit 433 Mhz will, habe 
eina alte die nach 1/4 Funktionen programiert voll meldet ! kaufe eine 
Neue (10 Jahre später) in der Hoffnung das die mehr Speicher hat und ich 
hab noch nicht mal alle Tasten 2er ! FB drin meldet die neue auch voll !
ich glaub da muss man selber bauen (*grummel grummel, gibt nix 
vernüftiges zu kaufen mit anlernen Bittiefe und Funk und Reichweite !)

> Der TSOP der aber nicht abgeschalten wird
> braucht seine 1-2mA Dauerstrom und zieht die Batterie leer, dagegen kann
> ich nix machen, denke ich mittlerweile.

sag ich doch, also doch richtige FB selber bauen

von Stefan Biereigel (Gast)


Lesenswert?

Gut, da gehen wohl unsere Vorstellungen etwas auseinander, schätze ich. 
Ich möchte gern die bestehende FB weiternutzen, sie hat ja echt nur EINE 
Taste nicht, auch schon dran gedacht habe ich, meinen µC einfach in die 
FB einzubauen, so könnte ich auf Taste reagieren (Ext. Int) und müsste 
keinen Strom verbrauchen wenn ich nix machen will ... Aber das ist alles 
eher unpraktikabel. Zur großen Not muss ich halt mit dem Batteriewechsel 
leben, aber zuerstmal versuche ich noch den Attiny45-20 gegen den 
AtTiny45-10 zu tauschen, der soll in der Spannung variabler sein (und 
weiter runter gehen) - mal sehen wie es damit aussieht.

Zum Thema Universal-FBs, auch wenn hier etwas OT:

Wenn man da Geld reinsteckt und nicht das 5€-Modell von [hier Discounter 
einsetzen] kauft, kann man für etwas mehr schon nen gutes Teil haben. 
Meine Chamäleon(s) die ich in der Vergangenheit nutzte konnten alle mehr 
lernen als ich lernen wollte, damals gabs noch: VCR, DVD, SAT, TV, 
Radio, PC

Jetzt hat sich das gesamte Geraffel auf TV + Reciever gekürzt, da wollt 
ich eigentlich dass eine FB reicht.

von Joachim B. (jar)


Lesenswert?

Stefan Biereigel schrieb:
> auch schon dran gedacht habe ich, meinen µC einfach in die
> FB einzubauen, so könnte ich auf Taste reagieren (Ext. Int) und müsste
> keinen Strom verbrauchen wenn ich nix machen will

das würde ich in deinem Fall für am sinnvollsten halten, weil ein immer 
an TSOP einfach unsinnig ist und  immer wieder den Tiny per Timer 
aufwachen lassen genauso, also kleiner Tiny mit Int an Taste und eigener 
IR Sendediode

> Zur großen Not muss ich halt mit dem Batteriewechsel
> leben, aber zuerstmal versuche ich noch den Attiny45-20 gegen den
> AtTiny45-10 zu tauschen, der soll in der Spannung variabler sein (und
> weiter runter gehen) - mal sehen wie es damit aussieht.

oder so !

> Zum Thema Universal-FBs, auch wenn hier etwas OT:
> Wenn man da Geld reinsteckt und nicht das 5€-Modell von [hier Discounter
> einsetzen] kauft, kann man für etwas mehr schon nen gutes Teil haben.

nein und immer wieder nein, ich hab alle universell von 100-400 € 
ausprobiert, die letzte Logitech Harmony ? 350€ so ein Sche*ss

anlernen ? ist nicht -> Codes nur über Logi Server download und wenn der 
mal abgeschaltet wird hat man 350 € Elektronikschrott !
Reichweite, kaum das ich das Wohnzimmer verlassen hatte war Ende mit 
Funk, das konnte und kann die 10 Jahre alte viel besser, Anlernen und 
Reichweite !
am grausamsten war die Programmierung, man muss erst mal alle Geräte und 
FBs vorstellen, dann darf man, muss man Macros programmieren, wer nur 
mal testeise eine programmiert kann später nicht mehr nachrüsten, alles 
auf Reset und dann alle Geräte und Macros neu anlernen, ja so eine 
Schrottprogrammierung und Menüs gibt es wirklich für 350 €

kein Wunder das mein Modell auch schon eine Rückgabe war, ich habs auch 
wieder zurückgegeben, für das Geld erwarte ich mehr, mehr Reichweite, 
mehr Funktionalität und mehr Komfort

von jar (Gast)


Lesenswert?

Frank M. schrieb:
> Klar

Frage an den Autor,

bin grad dabei die IR SND einer größeren Funktionalität zuzuführen

würde also gerne irmp_data erweitern mit Tasten-Name und Geräte-Name

2 Möglichkeiten

1 die schlechtere, ich erweitere das Feld, inkompatibel !
2 die bessere ? und da bin ich als nicht gelernter Progger unsicher

ich baue ein neues Array wo irmp_data drin steckt + G-Name und T-Name

hast du dazu ne Idee ?

oder noch besser einen Vorschlag ?

von jar (Gast)


Lesenswert?

und das möglichst platzsparend ?

also Idee
1.
STRUCT {
   g-name char[8];
   t-name char[8];
   IRMP_DATA;
}uni;


ist schon mal doof, verschwendet Platz

Idee
2.
STRUCT {
   t-name char[8];
   IRMP_DATA;
}g-name;

spart Platz, nur wie greife ich von aussen auf G-Name zu ?

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

jar schrieb:

> 1.
> STRUCT {
>    g-name char[8];
>    t-name char[8];
>    IRMP_DATA;
> }uni;

Das ist die einzig vernünftige Möglichkeit, jedoch sind in den obigen 
Zeilen einige syntaktische Fehler drin :-)

Wenn schon, dann so:
1
#define MAXDEVICENAMELEN    8
2
#define MAXKEYNAMELEN       8
3
4
typedef struct
5
{
6
   char      devicename[MAXDEVICENAMELEN + 1];
7
   char      keyname[MAXKEYNAMELEN + 1];
8
   IRMP_DATA irmp_data;
9
} EXT_IRMP_DATA;

Dann kann man zum Beispiel folgendermaßen drauf zugreifen:
1
  EXT_IRMP_DATA  ext;
2
  ...
3
  strcpy (ext.devicename, "TV");
4
  strcpy (ext.keyname, "Volume+");
5
  ext.irmp_data.protcol = IRMP_SAMSUNG_PROTOCOL;
6
  ext.irmp_data.address = 0x0012;
7
  ext.irmp_data.command = 0x0034;
8
  ext.irmp_data.flags   = 0;


Das Erweitern auf ein Array (Du willst bestimmt mehr als eine Taste) 
überlasse ich Dir :-)

Gruß,

Frank

von jar (Gast)


Lesenswert?

danke, aber da muss ich noch mal drüber schlafen

ich weigere mich für jedes Gerät mehrfach den Namensplatz zu 
verschwenden, so üppig ist EEPROM Platz nicht im Atmel, da hat man ja 
mehr Platz im flash :-)

evt. nehme ich statt NAME 8+1 x-mal f. jede Taste und jedes Gerät (sieht 
irgendwie nach linearen 2-dimensionalen Array aus)

n-Tasten * m-Geräte egal ob Gerät x die Menge an Tasten von Gerät y hat

ein u_int8 für 256 Geräte und weise den Namen in einer table zu

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

von jar (Gast)


Lesenswert?

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

hier setzt du das Portbit gezielt auf Ausgang und lässt alle anderen 
unberührt |=

> PORTB=(1<<PB3);  //PB3 auf 1
hier setzt du das Portbit gezielt auf high und setzt alle anderen zurück 
=
mit |= würden die anderen nicht zurückgesetzt

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

hier setzt du das Portbit gezielt auf low und lässt alle anderen 
unberührt &= ~

von martin (Gast)


Lesenswert?

Danke für den Hinweis bei der ersten Codezeile.

Wenn man nur den einen PortPin betrachtet, müsste das ganze aber doch 
funktionieren? Oder ist noch was falsch?

eventuell passen meine Fuses noch nicht so ganz, ich habe aber - wie es 
in der irsndmain.c steht - diese auf :Fuses: lfuse: 0xE2 hfuse: 0xDC

ich werd mal morgen mit dem oszi rangehen.

von Sebastian .. (zahlenfreak)


Angehängte Dateien:

Lesenswert?

Hallo Frank,

ich hab leider schon wieder ein Problem mit dem DENON Protokoll.

Auf den ersten Blick funktionieren die Timeouts, die du damals eingebaut 
hast.
Problem ist, dass, wenn man eine Taste lange drückt, IRMP nach einiger 
Zeit doch wieder auf den falschen Code springt. Ursache dafür ist, dass 
die Pause zwischen original-Frame und repetition-Frame genauso groß ist, 
wie zwischen zwei dieser Blöcke. Dein Code nimmt hier ja an, dass eine 
Pause größer ist als die andere. Auch auf der IRMP wiki Seite sind 
unterschiedlich lange Pausen dokumentiert.

Hab hier eine original DENON FB, die überall gleich lange Pausen hat und 
eine Universal FB, die beim DENON-Protokoll das gleiche Verhalten zeigt.

Von der DENON FB hab ich mal ein log-file mit etwas längeren 
Tastendrücken angehängt. Auf dem Oszi kann man das Verhalten noch 
schöner beobachten.

Gibts vielleicht noch eine Andere Möglichkeit, original und repetition 
zu unterscheiden? Irgendwie müssen das die DENON Geräte ja auch machen.


Und eine andere Frage noch:
Wäre es möglich, irmp noch einen counter zu verpassen, der mitzählt, wie 
lange eine Taste schon gedrückt ist? Sobald man loslässt sollte der 
Timer dann natürlich zurückgesetzt werden. Hab leider zu wenig Ahnung 
von den Sourcen um das zu beantworten.

Viele Grüße,

Sebastian

von Joachim B. (jar)


Lesenswert?

hallo Frank,

ich blicke gerade nicht durch, brauche nur auf OC2 ein symetrisches PWM 
Signal 36kHz für den m1284p

PortD 7 ist klar, output für DDRD

wenn ich (F_CPU=20MHz : 36000 : 2 ) - 1 rechne komme ich auf 277 das ist 
mehr als ein 8-Bit Register aufnehmen kann (ich erinnere mich aber das 
es auch 16 Bit Register gibt m32 OCR1A OCR1B ?)

ist IRSND in F_CPU begrenzt ? also kleiner 20 MHz ?

muss ich dann deswegen den Vorteiler setzen, ist ein Vorteiler noch 
nicht im IRSND vorgesehen ?

wäre nett wenn du helfen könntest, ich verliere mich gerade in fast PWM 
Phase correct PWM, blicke gerade nicht mehr durch

brauche eigentlich nur ein symetrisches 36kHz Signal welches on und off 
geschaltet wird (rot Diode an TSOP31736 für eine Abtastung), on off 
möchte ich am TSOP sehen

also für 20MHz und minimal setup wäre willkommen, die ganze IRSND 
einbauen wäre oversized, genau wie den ganzen Quellcode zu durchforsten 
und dann zu verstehen......

vielen Dank
jar

von Joachim B. (jar)


Lesenswert?

OK, gelöst

mit Vorteiler 8 passt auch 20 MHz

TCCR2A |= (1<<COM2A0)|(1<<WGM21);  // toggle OC2A on compare match, 
clear Timer 2 at compare match OCR2A

TCCR2B = (1<<CS21);  // 0x01, start Timer 2, no prescaling
OCR2A = 35;

also IRSND arbeitet nur bis F_CPU 18.432 MHz !!!!

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Joachim B. schrieb:
> mit Vorteiler 8 passt auch 20 MHz

Danke für den Tipp, werde ich in IRSND einbauen.

Gruß,

Frank

von Joachim B. (jar)


Lesenswert?

Frank M. schrieb:
> Danke für den Tipp, werde ich in IRSND einbauen.

immer wieder gerne, wenn alle zusammenhalten, sich ergänzen, kann das 
Ergebnis nur besser werden

gruss
jar

von Ulli -. (ulli2k)


Lesenswert?

Konrad S. schrieb:
> @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 $

Hallo Frank,

ich versuche gerade IRMP und IRSND auf meinem Arduino Board (JeeNode) 
zum laufen zu bekommen.
Leider sehe ich kein Land....
Kannst du mir ein simples Beispiel Projekt inkl. deiner lauffägigen 
IRMP/IRSND Library für Arduino zukommen lassen?

Das würde mir sehr helfen.

Grüße,
  Ulli

von Ulli -. (ulli2k)


Lesenswert?

Sorry für den Doppelpost.

Ich habe gerade die aktuelle svn getestet und damit funktioniert IRMP 
mit Arduino. Leider aber kein IRSND.

Ich habe IRSND eingebunden und sende eine Nachricht. Mit meiner Kamera 
sehe ich auch das die Diode blickt.
Nur Ist die Nachricht scheinbar nicht korrekt, da mein Radio nicht 
reagiert.

Kann mir jemand dabei helfen?

@Frank: hast du IRSND am laufen?

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Ulli -- schrieb:

> Ich habe gerade die aktuelle svn getestet und damit funktioniert IRMP
> mit Arduino. Leider aber kein IRSND.

Wenn die SVN-Version es auf einem Arduino tut, dann sollte auch die 
Release-Version damit arbeiten. Achnee, da gibt es ja noch das Problem 
der Namensgebung der xor-Variablen... in der SVN-Version ist dieses 
Problem gelöst.

> Ich habe IRSND eingebunden und sende eine Nachricht. Mit meiner Kamera
> sehe ich auch das die Diode blickt.

Das ist schonmal gut.

> Nur Ist die Nachricht scheinbar nicht korrekt, da mein Radio nicht
> reagiert.

Protokoll? Adresse? Kommando? Flags?

Bekommst Du vielleicht beim Übersetzen eine Warnung, dass F_CPU nicht 
gesetzt ist? Oder andere Warnungen?

> @Frank: hast du IRSND am laufen?

Natürlich. Und viele andere auch. Aber ich habe keinen Arduino, so dass 
ich Dein Problem leider nicht direkt nachvollziehen kann.

Zeige bitte mal irsndconfig.h (und vielleicht zum Vergleich auch 
irmpconfig.h) und dann noch den Aufruf von irsnd nebst Inhalte der 
IRMP_DATA-Struct.

Gruß,

Frank

von Ulli -. (ulli2k)


Angehängte Dateien:

Lesenswert?

> Protokoll? Adresse? Kommando? Flags?

Ich habe erst mit IRMP die Daten aufgezeichnet und dann mit IRSND wieder 
weiter versendet. --> Keine Reaktion des z.B. Radios
1
  if (irmp_get_data (&irmp_data)) {
2
    Serial.print(irmp_data.protocol);
3
    Serial.print(" A:");
4
    Serial.print(irmp_data.address, HEX);
5
    Serial.print(" C:");
6
    Serial.print(irmp_data.command, HEX);
7
    Serial.print(" ");
8
    Serial.print(irmp_data.flags, HEX);
9
    Serial.println("");
10
11
    delay(1500);
12
    int result;
13
    result = irsnd_send_data(&irmp_data, TRUE);
14
    if (result != 1) Serial.println("ERROR");
15
    if (result == 1) Serial.println("Sent");
16
  }

auch mit folgendem Ansatz hat es nicht funktioniert.
1
   irmp_data.protocol = IRMP_NEC_PROTOCOL; // sende im NEC-Protokoll
2
   irmp_data.address = 0x857A; 
3
   irmp_data.command = 0x1F; 
4
   irmp_data.flags = 0; 
5
   
6
   int result;
7
   result = irsnd_send_data(&irmp_data, TRUE);
8
   if (result != 1) Serial.println("ERROR");
9
   if (result == 1) Serial.println("Sent");

>Bekommst Du vielleicht beim Übersetzen eine Warnung, dass F_CPU nicht
gesetzt ist? Oder andere Warnungen?

Nein ich bekomme beim Compiler weder Warnungen noch Fehler.

irsndconfig.h, irmpconfig.h und die Hauptanwendung.c ist anbei.

Ich hoffe du kannst mir dabei weiter helfen....

Ich benutze einen ATmega328P microcontroller mit 16 MHz ceramic 
resonator.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Ulli -- schrieb:
> Ich habe erst mit IRMP die Daten aufgezeichnet und dann mit IRSND wieder
> weiter versendet. --> Keine Reaktion des z.B. Radios

Der Source sieht soweit in Ordnung aus. Was mir auffällt:
1
#define US (1000000 / F_INTERRUPTS)
2
...
3
Timer1.initialize(US);

Da die initialize-Methode glatte Mikrosekunden erwartet, ergibt sich für 
US der abgerundete Wert 66 statt 66,67. Das macht eine Abweichung von 10 
Prozent. Es kann sein, dass Dein Radio da zu empfindlich ist und nicht 
mehr reagiert.

Wähle daher bitte einen Wert für F_INTERRUPTS, bei welchem die Division 
möglichst nahe an einer Ganzzahl ist. Da für NEC 10.0000 Calls/sec 
ausreichen, setze mal

#define F_INTERRUPTS 10000

sowohl in irmpconfig.h als auch irsndconfig.h und teste erneut.

Alternative für richtiges Runden:

#define US (long) ((1000000.0 / F_INTERRUPTS) + 0.5)

Das müsste dann für US den Wert 67 ergeben - schon besser.


Gruß,

Frank

von Ulli (Gast)


Lesenswert?

Ich werde das heute Abend gleich mal versuchen....

Kann ich evtl. noch einen Debug Modus oder etwas ähnliches aktivieren, 
falls es damit nicht funktioniert?

Leider habe ich auch schon ein RC6 Gerät versucht, welches auch nicht 
funktioniert hat.

Danke für deine Unterstützung.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Ulli schrieb:
> Ich werde das heute Abend gleich mal versuchen....

Ich kenne mich überhaupt nicht mit Arduino aus. Funktioniert das 
überhaupt mit der Modulation des Senders, so wie das in irmp.c gemacht 
wird, auf einem Arduino?

Einerseits benutzt Du Arduino-Methoden, um einen Timer zu 
initialisieren, andererseits greift irsnd.c "direkt" auf die 
Timer-Register des µCs zu, um per PWM das Signal zu modulieren. Ist das 
auf einem Arduino so überhaupt legitim? Oder kann das zu Konflikten 
führen?

von Ulli -. (ulli2k)


Lesenswert?

Gute Nachrichten so weit. So ich bin einen Schritt weiter!

Ich habe den IRSND Pin getauscht auf Timer0 und damit in
irsndconfig.h folgendes konfiguriert.
#  define IRSND_OCx                             IRSND_OC0A

Dann habe ich in irsnd.c einen Fehler gefunden
Für einen ATmega328P und der OC0A Konfiguration muss es der Pin PD6 sein 
nicht PB6!!! Bitte korrigiere das Frank!

Danach konnte ich mit F_INTERRUPTS = 10000, 15000 und 20000 NEC_Protocol 
Kommandos versenden, welche mein Radio verstanden hat!!

ABER!!
Leider funktioniert das Senden des Protokolls RC6 nicht. Empfangen 
funktioniert wieder wunderbar. Aber beim Senden wird es von meinem 
Philips TV nicht angenommen.
An was könnte das nun liegen? Ich habe F_INTERRUPTS 10000, 15000 und 
20000 getestet.

Irgendwelche Hinweise?
Wäre sehr dankbar dafür!

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Ulli -- schrieb:

> Dann habe ich in irsnd.c einen Fehler gefunden
> Für einen ATmega328P und der OC0A Konfiguration muss es der Pin PD6 sein
> nicht PB6!!! Bitte korrigiere das Frank!

Upps, stimmt. Blöder Fehler. Ich korrigiere das. Aber warum klappte es 
nicht mit OC2A/OC2B - also mit dem Timer2? Ist der vielleicht beim 
Arduino nicht ohne weiteres frei nutzbar?

> Danach konnte ich mit F_INTERRUPTS = 10000, 15000 und 20000 NEC_Protocol
> Kommandos versenden, welche mein Radio verstanden hat!!

Freut mich :-)

> Leider funktioniert das Senden des Protokolls RC6 nicht. Empfangen
> funktioniert wieder wunderbar. Aber beim Senden wird es von meinem
> Philips TV nicht angenommen.

Gib mal bitte die Adresse und ein Beispiel für ein Kommando. Ich habe 
selbst kein RC6-Gerät und konnte das nur testen indem ich unter Linux 
den IRSND-Output in den IRMP schiebe. Eben noch getestet... klappt 
wunderbar.

> Irgendwelche Hinweise?

Leider nein. Eventuell helfen ein paar Scan-Dateien weiter, siehe

  http://www.mikrocontroller.net/articles/IRMP#Scannen_von_unbekannten_Protokollen

Gruß,

Frank

von Ulli -. (ulli2k)


Lesenswert?

Hier ein Log des Empfängers:
000000000000000000000000000000000000000000111111111110000000011111111111 
100000000111110000000011111100000000000000000000011111111111111111100000 
000011111000000001111100000000111111000000011111100000000111110000000011 
111100000000111110000000011111000000000111110000000011111000000000000000 
111111111111000000001111100000000011111000000000000000111111111111111111 
11

Ist es auch möglich so einen Log vom Ausgang zu bekommen, um diesen 
vergleichen zu können?

Ich bekomm es einfach nicht hin....warum geht nur RC6 nicht aber NEC....

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Ulli -- schrieb:
> Hier ein Log des Empfängers:

Danke, das entspricht Adresse 0x00 und Kommando 0x11

> Ist es auch möglich so einen Log vom Ausgang zu bekommen, um diesen
> vergleichen zu können?

Ich habe gerade mal denselben Code mittels IRSND erzeugt:
1
00000000000000000000000000000000000000000011111111111000000001111111111110000000011111000000001111110000000000000000000001111111111111111110000000001111100000000111110000000011111100000001111110000000011111000000001111110000000011111000000001111100000000011111000000001111100000000000000011111111111100000000111110000000001111100000000000000011111111111111111111
2
00000000000000000000000000000000000000001111111111110000000111111111111110000000111111100000001111111000000000000000000000111111111111111111111000000011111110000000111111100000001111111000000011111110000000111111100000001111111000000011111110000000111111100000001111111000000011111110000000000000011111111111111000000011111110000000111111100000000000000111111111111

Die obere Zeile ist Deine, die untere ist der IRSND-Output. Ich sehe da 
keinen signifikanten Unterschied, außer, dass Deine FB etwas längere 
Pulse, aber dafür kürzere Pausen erzeugt. Der Output ist also leicht 
asymetrisch. Beides wird von IRMP mit Adresse 0 und Kommando 0x11 
erkannt. Ist Dein RC6-Empfänger so empfindlich beim Timing? Blödes 
Problem.
Du könntest noch mit der Modulationsfrequenz spielen, also 36kHz vs. 
38kHz.

> Ich bekomm es einfach nicht hin....warum geht nur RC6 nicht aber NEC....

von Ulli -. (ulli2k)


Lesenswert?

Hi Frank,

ich habe das Problem gefunden.
Es liegt nicht an deinem Package sondern an der Arduino konfiguration.
Scheinbar konfiguriert Arduino die Timer vor.

Ein
TCCR0A = 0x0;
TCCR0B= 0x0;
für Timer 0

oder ein
  TCCR2B = 0x0;
  TCCR2A = 0x0;
für Timer 2

Vor Aufruf deiner Init Funktionen löst alle Probleme.

Ich glaub ich spine....

Vielen Dank nochmal für deinen Support und dein tolles IRMP und IRSND!!

von Ulli -. (ulli2k)


Lesenswert?

genauer gesagt setzt Arduino vorab folgende Bits bei Timer0:
  sbi(TCCR0A, WGM01);
  sbi(TCCR0A, WGM00);
  sbi(TCCR0B, CS01);
  sbi(TCCR0B, CS00);

d.h. folgende zu viel im Vergleich zu IRSND:
  sbi(TCCR0A,WGM00); // Fast PWM statt CTC
  sbi(TCCR0B,CS00); // Prescaler

Lässt sich IRSND umkonfigurieren so das es mit "Fast PWM" anstatt CTC 
läuft?
Ich fürchte Quereinflüsse durch das umkonfigurieren von Arduino.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Ulli -- schrieb:
> Ein
> TCCR0A = 0x0;
> TCCR0B= 0x0;
> für Timer 0
>
> oder ein
>   TCCR2B = 0x0;
>   TCCR2A = 0x0;
> für Timer 2
>
> Vor Aufruf deiner Init Funktionen löst alle Probleme.

Danke für den Tipp, ich werde das in den IRMP einbauen. Dann sollte das 
Arduino-Problem beseitigt sein.

> Ich glaub ich spine....

Ja. Fragt sich nur, wofür die "Arduino-Timer" verwendet werden. Gibt es 
dazu eine Dokumentation?

> Vielen Dank nochmal für deinen Support und dein tolles IRMP und IRSND!!

Danke fürs Danke :-)

Ulli -- schrieb:

> Lässt sich IRSND umkonfigurieren so das es mit "Fast PWM" anstatt CTC
> läuft?

Könnte klappen. Probiere es doch einfach mal aus.

> Ich fürchte Quereinflüsse durch das umkonfigurieren von Arduino.

Um das zu beurteilen, müsste man erstmal wissen, wofür die vom Arduino 
vorbelegten Timer überhaupt gut sind.

Viel Spaß mit IRMP,

Frank

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Ulli -- schrieb:
> ich habe das Problem gefunden.

Ich habe die Timerinitialisierung korrigiert und die Änderung ins SVN 
eingecheckt. Kannst Du das aktuelle irsnd.c aus dem SVN mal kurz 
gegentesten?

Dank und Gruß,

Frank

von Ulli -. (ulli2k)


Angehängte Dateien:

Lesenswert?

sorry für die späte Antwort!

Yep, jetzt funktionieren die SVN Quellen "Out of the Box"! Super!

Ich habe anbei die Quelle der timer0 Funktionalität von Arduino 
angehängt.
Leider ist nach der Timer0 umkonfiguration die wichtige
Funktion delay und millis nicht mehr brauchbar....

Siehst du eine Möglichkeit das zu verhindern?
Ich habe es schon versucht mit der Manipulation von 
"MICROSECONDS_PER_TIMER0_OVERFLOW"....funktiert aber nicht.....

von Sebastian .. (zahlenfreak)


Lesenswert?

Hallo Frank,

hast du mal über meinen Post im 
Beitrag "Re: IRMP - Infrared Multi Protocol Decoder" 
nachgedacht? Siehst du eine möglichkeit, das DENON protokoll auch bei 
langen Tastendrücken zuverlässig zu erkennen, oder sollte ich mich nach 
einer anderen Fernbedienung umschauen?

Viele Grüße,

Sebastian

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Sebastian ... schrieb:

> hast du mal über meinen Post im
> 
Beitrag "Re: IRMP - Infrared Multi Protocol Decoder"
> nachgedacht?

Sorry, irgendwie muss ich Dein Posting überlesen haben.

Ich habe mir das dort angehängte Log mal angeschaut. Leider ist das 
komplett unbrauchbar. Denn dort kommen merkwürdigerweise nicht nur 
Pausenlängen von ca. 732µs, sondern auch 1810µs, 2133µs, 2883µs, 3800µs 
und 5000µs vor - und das schon nach 1 oder 2 Bits im Frame.

> Siehst du eine möglichkeit, das DENON protokoll auch bei
> langen Tastendrücken zuverlässig zu erkennen,

Wenn ich einen brauchbaren Scan zur Verfügung habe.... ;-)

> oder sollte ich mich nach einer anderen Fernbedienung umschauen?

Wenn Du auch eine andere für Deine Anwendung nehmen kannst, ist das 
vielleicht die einfachere Lösung.

Nichtsdestotrotz bin ich natürlich daran interessiert, diese 
Wiederholungsproblematik auch für Denon in den Griff zu bekommen.

Gruß,

Frank

von Sebastian .. (zahlenfreak)


Angehängte Dateien:

Lesenswert?

Frank M. schrieb:
> Sorry, irgendwie muss ich Dein Posting überlesen haben.

Kein Problem, kommt vor.

> Ich habe mir das dort angehängte Log mal angeschaut. Leider ist das
> komplett unbrauchbar. Denn dort kommen merkwürdigerweise nicht nur
> Pausenlängen von ca. 732µs, sondern auch 1810µs, 2133µs, 2883µs, 3800µs
> und 5000µs vor - und das schon nach 1 oder 2 Bits im Frame.

Ich hab dir mal noch ein log erstellt und angehängt. Wenn du noch was 
anderes brauchst gib einfach bescheid. Wenn jetzt wieder was komisches 
drin steht kommt wohl das Logging nicht mit langen Tastendrücken klar. 
Mein Verstärker und ein anderer IRMP empfänger haben während dem logging 
super reagiert. Fernbedienung wahr natürlich auf den Logger gerichtet.


> Wenn Du auch eine andere für Deine Anwendung nehmen kannst, ist das
> vielleicht die einfachere Lösung.
>
> Nichtsdestotrotz bin ich natürlich daran interessiert, diese
> Wiederholungsproblematik auch für Denon in den Griff zu bekommen.

Ich könnte schon eine andere nehmen, wäre aber schade. Die Denon ist 
sozusagen meine Lieblingsfernbedienung ;)  Ich finde es aber super, dass 
du so hinter der Qualität von IRMP her bist!
Ich hab mitlerweile auch mal versucht, den Code zu verstehen. Leider ist 
das ganze ziemlich unübersichtlich. Vorallem dadurch, dass die irmp.c so 
lang ist. Vielleicht könntest du das mal etwas aufteilen? Das würde es 
schon deutlich leichter machen, auch selbst mal direkt am Code zu 
arbeiten.


Viele Grüße,

Sebastian

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Sebastian ... schrieb:
> Ich hab dir mal noch ein log erstellt und angehängt.

Die Scan-Datei ist perfekt. Hier der erste Output, bevor wir ins Detail 
gehen:
1
./irmp-15kHz < Denon_RC-176_mit_Widerholungen_-_versuch_2.txt
2
#Cassette Deck A/B
3
001001100101000
4
001000011010111 p =  8, a = 0x0004, c = 0x0328, f = 0x00
5
001001100101000
6
001000011010111 p =  8, a = 0x0004, c = 0x0328, f = 0x01
7
001001100101000
8
-------------------------------------------------------------------
9
#Cassettte Deck Rec
10
001001111101000
11
001000000010111 p =  8, a = 0x0004, c = 0x03e8, f = 0x00
12
001001111101000
13
001000000010111 p =  8, a = 0x0004, c = 0x03e8, f = 0x01
14
001001111101000
15
-------------------------------------------------------------------
16
#Cassette Deck Pause
17
001001011101000
18
001000100010111 p =  8, a = 0x0004, c = 0x02e8, f = 0x00
19
001001011101000
20
001000100010111 p =  8, a = 0x0004, c = 0x02e8, f = 0x01
21
001001011101000
22
-------------------------------------------------------------------
23
#Amp Volume Up
24
010001011000100
25
010000100111011 p =  8, a = 0x0008, c = 0x02c4, f = 0x00
26
010001011000100
27
010000100111011 p =  8, a = 0x0008, c = 0x02c4, f = 0x01
28
010001011000100
29
-------------------------------------------------------------------
30
#Amp Volume Down
31
010000011000100
32
010001100111011 p =  8, a = 0x0008, c = 0x00c4, f = 0x00
33
010000011000100
34
010001100111011 p =  8, a = 0x0008, c = 0x00c4, f = 0x01
35
010000011000100
36
-------------------------------------------------------------------
37
#Amp Mute
38
010001101000100
39
010000010111011 p =  8, a = 0x0008, c = 0x0344, f = 0x00
40
010001101000100
41
010000010111011 p =  8, a = 0x0008, c = 0x0344, f = 0x01
42
010001101000100

Es wird immer ein normaler und ein invertierter Frame (Kommando-Bits 
invertiert) erkannt. Du siehst hier also zunächst 2 Frames, dann gibt 
IRMP die decodierten Daten aus. Anschließend kommen die nächsten 2 
Frames, welche durch den langen Tastendruck erzeugt werden. Auch diese 
werden korrekt erkannt und das Flag auf 0x01 gesetzt.

Dann kommt noch ein 5. Frame, wo aber der dazugehörende invertierte 
Frame fehlt. Das liegt einfach an der beschränkten Länge des 
Log-Buffers. Das Logging bricht einfach ab, wenn der Log-Buffer voll 
ist.

Dies wird auch von IRMP erkannt, wenn wir uns die Details (hier die 
erste Taste) anschauen:
1
./irmp-15kHz -v < Denon_RC-176_mit_Widerholungen_-_versuch_2.txt
2
#Cassette Deck A/B
3
   0.133ms [starting pulse]
4
   1.200ms [start-bit: pulse =  6, pause = 10]
5
protocol = DENON, start bit timings: pulse:   3 -   7, pause:  23 -  30 or   9 -  13
6
pulse_1:   3 -   7
7
pause_1:  23 -  30
8
pulse_0:   3 -   7
9
pause_0:   9 -  13
10
command_offset:  5
11
command_len:     10
12
complete_len:    15
13
stop_bit:         1
14
   1.200ms [bit  0: pulse =   6, pause =  10] 0
15
   2.267ms [bit  1: pulse =   6, pause =  10] 0
16
   4.400ms [bit  2: pulse =   5, pause =  27] 1
17
   5.467ms [bit  3: pulse =   5, pause =  11] 0
18
   6.533ms [bit  4: pulse =   6, pause =  10] 0
19
   8.667ms [bit  5: pulse =   6, pause =  26] 1
20
  10.800ms [bit  6: pulse =   5, pause =  27] 1
21
  11.867ms [bit  7: pulse =   4, pause =  12] 0
22
  12.933ms [bit  8: pulse =   5, pause =  11] 0
23
  15.067ms [bit  9: pulse =   4, pause =  28] 1
24
  16.067ms [bit 10: pulse =   5, pause =  10] 0
25
  18.200ms [bit 11: pulse =   6, pause =  26] 1
26
  19.267ms [bit 12: pulse =   6, pause =  10] 0
27
  20.333ms [bit 13: pulse =   6, pause =  10] 0
28
  21.400ms [bit 14: pulse =   6, pause =  10] 0
29
stop bit detected
30
  21.800ms code detected, length = 15
31
  21.800ms waiting for inverted command repetition
32
  67.800ms [starting pulse]
33
  68.867ms [start-bit: pulse =  6, pause = 10]
34
protocol = DENON, start bit timings: pulse:   3 -   7, pause:  23 -  30 or   9 -  13
35
pulse_1:   3 -   7
36
pause_1:  23 -  30
37
pulse_0:   3 -   7
38
pause_0:   9 -  13
39
command_offset:  5
40
command_len:     10
41
complete_len:    15
42
stop_bit:         1
43
  68.867ms [bit  0: pulse =   6, pause =  10] 0
44
  69.933ms [bit  1: pulse =   6, pause =  10] 0
45
  72.067ms [bit  2: pulse =   6, pause =  26] 1
46
  73.133ms [bit  3: pulse =   5, pause =  11] 0
47
  74.133ms [bit  4: pulse =   4, pause =  11] 0
48
  75.200ms [bit  5: pulse =   6, pause =  10] 0
49
  76.267ms [bit  6: pulse =   6, pause =  10] 0
50
  78.400ms [bit  7: pulse =   5, pause =  27] 1
51
  80.533ms [bit  8: pulse =   6, pause =  26] 1
52
  81.600ms [bit  9: pulse =   6, pause =  10] 0
53
  83.733ms [bit 10: pulse =   5, pause =  27] 1
54
  84.800ms [bit 11: pulse =   6, pause =  10] 0
55
  86.933ms [bit 12: pulse =   5, pause =  27] 1
56
  89.067ms [bit 13: pulse =   5, pause =  27] 1
57
  91.200ms [bit 14: pulse =   6, pause =  26] 1
58
stop bit detected
59
  91.600ms code detected, length = 15
60
  91.600ms p =  8, a = 0x0004, c = 0x0328, f = 0x00
61
 135.467ms [starting pulse]
62
 136.533ms [start-bit: pulse =  5, pause = 11]
63
protocol = DENON, start bit timings: pulse:   3 -   7, pause:  23 -  30 or   9 -  13
64
pulse_1:   3 -   7
65
pause_1:  23 -  30
66
pulse_0:   3 -   7
67
pause_0:   9 -  13
68
command_offset:  5
69
command_len:     10
70
complete_len:    15
71
stop_bit:         1
72
 136.533ms [bit  0: pulse =   5, pause =  11] 0
73
 137.600ms [bit  1: pulse =   5, pause =  11] 0
74
 139.733ms [bit  2: pulse =   4, pause =  28] 1
75
 140.800ms [bit  3: pulse =   5, pause =  11] 0
76
 141.867ms [bit  4: pulse =   5, pause =  11] 0
77
 144.000ms [bit  5: pulse =   5, pause =  27] 1
78
 146.133ms [bit  6: pulse =   5, pause =  27] 1
79
 147.200ms [bit  7: pulse =   5, pause =  11] 0
80
 148.200ms [bit  8: pulse =   4, pause =  11] 0
81
 150.333ms [bit  9: pulse =   5, pause =  27] 1
82
 151.400ms [bit 10: pulse =   6, pause =  10] 0
83
 153.533ms [bit 11: pulse =   6, pause =  26] 1
84
 154.600ms [bit 12: pulse =   7, pause =   9] 0
85
 155.667ms [bit 13: pulse =   5, pause =  11] 0
86
 156.733ms [bit 14: pulse =   6, pause =  10] 0
87
stop bit detected
88
 157.200ms code detected, length = 15
89
 157.200ms waiting for inverted command repetition
90
 203.133ms [starting pulse]
91
 204.200ms [start-bit: pulse =  5, pause = 11]
92
protocol = DENON, start bit timings: pulse:   3 -   7, pause:  23 -  30 or   9 -  13
93
pulse_1:   3 -   7
94
pause_1:  23 -  30
95
pulse_0:   3 -   7
96
pause_0:   9 -  13
97
command_offset:  5
98
command_len:     10
99
complete_len:    15
100
stop_bit:         1
101
 204.200ms [bit  0: pulse =   5, pause =  11] 0
102
 205.267ms [bit  1: pulse =   5, pause =  11] 0
103
 207.400ms [bit  2: pulse =   5, pause =  27] 1
104
 208.467ms [bit  3: pulse =   5, pause =  11] 0
105
 209.467ms [bit  4: pulse =   4, pause =  11] 0
106
 210.533ms [bit  5: pulse =   5, pause =  11] 0
107
 211.600ms [bit  6: pulse =   6, pause =  10] 0
108
 213.733ms [bit  7: pulse =   5, pause =  27] 1
109
 215.867ms [bit  8: pulse =   5, pause =  27] 1
110
 216.933ms [bit  9: pulse =   6, pause =  10] 0
111
 219.067ms [bit 10: pulse =   6, pause =  26] 1
112
 220.133ms [bit 11: pulse =   5, pause =  11] 0
113
 222.267ms [bit 12: pulse =   4, pause =  28] 1
114
 224.400ms [bit 13: pulse =   6, pause =  26] 1
115
 226.533ms [bit 14: pulse =   6, pause =  26] 1
116
stop bit detected
117
 226.867ms code detected, length = 15
118
 226.867ms p =  8, a = 0x0004, c = 0x0328, f = 0x01
119
 270.800ms [starting pulse]
120
 271.867ms [start-bit: pulse =  5, pause = 11]
121
protocol = DENON, start bit timings: pulse:   3 -   7, pause:  23 -  30 or   9 -  13
122
pulse_1:   3 -   7
123
pause_1:  23 -  30
124
pulse_0:   3 -   7
125
pause_0:   9 -  13
126
command_offset:  5
127
command_len:     10
128
complete_len:    15
129
stop_bit:         1
130
 271.867ms [bit  0: pulse =   5, pause =  11] 0
131
 272.933ms [bit  1: pulse =   5, pause =  11] 0
132
 275.067ms [bit  2: pulse =   5, pause =  27] 1
133
 276.133ms [bit  3: pulse =   5, pause =  11] 0
134
 277.133ms [bit  4: pulse =   5, pause =  10] 0
135
 279.333ms [bit  5: pulse =   6, pause =  27] 1
136
 281.467ms [bit  6: pulse =   5, pause =  27] 1
137
 282.533ms [bit  7: pulse =   5, pause =  11] 0
138
 283.533ms [bit  8: pulse =   5, pause =  10] 0
139
 285.667ms [bit  9: pulse =   6, pause =  26] 1
140
 286.733ms [bit 10: pulse =   7, pause =   9] 0
141
 288.867ms [bit 11: pulse =   6, pause =  26] 1
142
 289.933ms [bit 12: pulse =   6, pause =  10] 0
143
 291.000ms [bit 13: pulse =   6, pause =  10] 0
144
 292.067ms [bit 14: pulse =   5, pause =  11] 0
145
stop bit detected
146
 292.467ms code detected, length = 15
147
 292.467ms waiting for inverted command repetition
148
  56.067ms error 6: did not receive inverted command repetition

Wie man an der letzten Zeile (error 6) sieht, klappt das mit dem 
Erkennen des fehlenden invertierten Frames. IRMP setzt seine 
Statemachine zurück und erkennt die nächste folgende Taste.

Jetzt zu den Timings:
1
./irmp-15kHz -v < Denon_RC-176_mit_Widerholungen_-_versuch_2.txt | grep start-bit
2
   1.200ms [start-bit: pulse =  6, pause = 10]    1. Frame
3
  68.867ms [start-bit: pulse =  6, pause = 10]    2. Frame
4
 136.533ms [start-bit: pulse =  5, pause = 11]    3. Frame
5
 204.200ms [start-bit: pulse =  5, pause = 11]    4. Frame
6
 271.867ms [start-bit: pulse =  5, pause = 11]    5. Frame

Der invertierte Frame hat einen Abstand von 67.667ms zum ersten.
Der Wiederholungsframe (Nr. 3) hat einen Abstand von 67.666ms zum 2. 
Frame. Die Abstände sind also absolut identisch.

Welche Frames zusammengehören (normaler und invertierter), erkennt IRMP 
nur daran, dass die Bits im Kommando gekippt sind. Nun könnte es 
passieren, dass IRMP sich (aus Zeitnot?) mal verhaspelt und den normalen 
Frame nicht erkennt, dafür aber den invertierten und diesen dann als 
normalen Frame erkennt. Aber dann sollte sich die Statemachine 
zurücksetzen, weil ja der erwartete "invertierte" Frame nicht mehr 
kommt, sondern stattdessen wieder ein normaler.

Ich könnte mir vorstellen, dass das Zurücksetzen der Statemachine in 
diesem Fall (DENON) nicht richtig funktioniert. Ich werde das durch 
Manipulation Deiner Scan-Dateien mit dem Editor mal provozieren und das 
dann testen.

> Ich hab mitlerweile auch mal versucht, den Code zu verstehen. Leider ist
> das ganze ziemlich unübersichtlich. Vorallem dadurch, dass die irmp.c so
> lang ist. Vielleicht könntest du das mal etwas aufteilen? Das würde es
> schon deutlich leichter machen, auch selbst mal direkt am Code zu
> arbeiten.

Es ist schwierig, das weiter aufzuteilen, da die Funktion irmp_ISR() so 
lang ist. Externe Funktionsaufrufe möchte ich vermeiden, da diese in 
einer ISR suboptimal sind. Inlinen kann nicht jeder Compiler - ich denke 
da an die PIC-Portierungen.

Unübersichtlich ist der Code eigentlich eher wegen den vielen 
eingestreuten Preprocessor-Statements. Aber leider lässt sich das nicht 
vermeiden.

Ich werde mal drüber nachdenken, was man da machen kann.

Gruß,

Frank

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Frank M. schrieb:
> Welche Frames zusammengehören (normaler und invertierter), erkennt IRMP
> nur daran, dass die Bits im Kommando gekippt sind. Nun könnte es
> passieren, dass IRMP sich (aus Zeitnot?) mal verhaspelt und den normalen
> Frame nicht erkennt, dafür aber den invertierten und diesen dann als
> normalen Frame erkennt. Aber dann sollte sich die Statemachine
> zurücksetzen, weil ja der erwartete "invertierte" Frame nicht mehr
> kommt, sondern stattdessen wieder ein normaler.

Wo ich mir mein Geschreibsel nochmal durchlese: Da die 
Tasten-Wiederholungs-Frames denselben Abstand haben wie beiden Frames, 
die zusammengehören, kann man tatsächlich nicht unterscheiden, was 
normaler und was invertierter Frame ist. Wird ein normaler Frame 
verschluckt, wird IRMP den darauf folgenden invertierten Frame als 
normalen ansehen und anschließend den darauf folgenden normalen als 
invertierten - jedenfalls wenn dieser durch langen Tastendruck 
entstanden ist. (Bei Loslassen kommt ein Timeout. Das wäre also kein 
Problem).

Der Abstand der Frames kann also kein Kriterium sein. Aber was mir 
aufgefallen ist: Das letzte Bit im normalen Frame ist bei meinen mir 
vorliegenden Scan-Dateien (3 verschiedene Geräte) immer 0, d.h. der 
Kommando-Code ist immer gerade. Könnte man das als Kriterium nehmen?

@Sebastian: Kannst Du das mal bei Deinem Gerät überprüfen?

Gruß,

Frank

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Nochmal Selbstgespräch:

Frank M. schrieb:
> Aber was mir aufgefallen ist: Das letzte Bit im normalen Frame ist
> bei meinen mir vorliegenden Scan-Dateien (3 verschiedene Geräte) immer
> 0, d.h. der Kommando-Code ist immer gerade.

Ich habe gerade mit etwas Recherche eine interessante DENON-eigene 
Dokumentation gefunden:

  http://www.manualowl.com/m/Denon/AVR-3803/Manual/170243

Demnach ist nicht nur das letzte, sondern sind sogar immer die letzten 
beiden Bits gleich 0. Ich habe das mit meinen Scan-Dateien verifiziert: 
es stimmt.

Ich werde dieses als Kriterium zur Unterscheidung des normalen und des 
invertierten Frames für das Denon-Protokoll einbauen. Dann sollte 
Sebastians Problem behoben sein.

von Sebastian .. (zahlenfreak)


Lesenswert?

Hallo Frank,

du bist genial!

Frank M. schrieb:
> Wird ein normaler Frame
> verschluckt, wird IRMP den darauf folgenden invertierten Frame als
> normalen ansehen und anschließend den darauf folgenden normalen als
> invertierten - jedenfalls wenn dieser durch langen Tastendruck
> entstanden ist. (Bei Loslassen kommt ein Timeout. Das wäre also kein
> Problem).

Genau das tritt bei mir ständig auf. Ich habe auch den Eindruck, dass es 
besser ist, wenn nur IRMP auf dem Controller läuft, aber auch dann tritt 
das Problem auf.

Das mit den geraden Kommandos klingt super. Jetzt wo du es erwähnst 
würde ich es so aus der Erinnerung auch bestätigen. Heute abend schau 
ich mal meine Fernbedienung durch.

Schonmal vielen Dank für die schnelle Hilfe!

Viele Grüße,
Sebastian

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Sebastian ... schrieb:
> Genau das tritt bei mir ständig auf.

Ich habe es eben mit Deiner Scan-Datei reproduzieren können, nachdem ich 
sie mit einem Editor manipuliert habe. Es war dann leicht, das in irmp.c 
zu beheben.

Ich habe die nötige Korrektur gerade ins SVN eingecheckt.

Viel Spaß,

Frank

von Sebastian .. (zahlenfreak)


Lesenswert?

Hallo Frank,

ich hab jetzt mal die Codes meiner DENON Fernbedienungen angeschaut. 
Habe keine Taste gefunden, bei der die letzten zwei bits des commandos 
gesetzt sind. Schaut also gut aus.

Die neuen Sourcen hab ich auch schon getestet. Bisher läufts 
einwandfrei.

Nochmal vielen Dank für die schnelle Hilfe!

Grüße, Sebastian

von Ulli (Gast)


Lesenswert?

Hallo Frank,

jetzt habe ich mal eine ganz andere Frage. Ich möchte parallel mit dem 
selben Controller IR Signale und OOK 433MHz Signale auswerten.
Genauer gesagt sieht das 433MHz Signal wie unter folgenden Link 
beschrieben aus.
<http://www.firefly-power.de/ARM/RFM12.html>;

Lässt sich irmp so konfigurieren das auch diese Signale zuverlässig 
interpretiert werden?

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Ulli schrieb:
> jetzt habe ich mal eine ganz andere Frage. Ich möchte parallel mit dem
> selben Controller IR Signale und OOK 433MHz Signale auswerten.
> Genauer gesagt sieht das 433MHz Signal wie unter folgenden Link
> beschrieben aus.
> <http://www.firefly-power.de/ARM/RFM12.html>;

Habs mir gerade mal angeschaut. Auf der Seite steht:

       "Die Codierung ähnelt der Manchestercodierung."

Das ist aber Quatsch, denn es handelt sich hier ganz klar um ein 
Pulse-Distance Protokoll.

> Lässt sich irmp so konfigurieren das auch diese Signale zuverlässig
> interpretiert werden?

Ja, um ein neues Pulse-Distance-Protokoll einzubauen, brauche ich ca. 10 
bis 15 Minuten... und nochmal 10 Minuten für einen ersten Test.

von Ulli -. (ulli2k)


Lesenswert?

Das hört sich ja spitze an.
Ich habe gerade im irmpconfig.h den Pin angepasst und das Logging über 
IRMP_LOGGING = 1 aktiviert.
Aber ich bekomme keinen Output auf der Uart.
Liegt das an der fehlenden Implementierung?

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Ulli -- schrieb:
> Aber ich bekomme keinen Output auf der Uart.

Welchen µC benutzt Du?

Zeige bitte mal Deine irmpconfig.h

Gruß,

Frank

von Thomas (Gast)


Lesenswert?

Hallo,

Ich versuche jetzt schon seit ein paar tagen dem IRMP zum laufen zu 
bekommen aber es will einfach nicht... Langsam gehen mir die Ideen und 
die Motivation aus :(
Was bei mir Funktionieren soll: Wenn ich z.B. die 1 drücke soll z.B. 
Port PD0 gesetzt werden (will damit später Beleuchtung und Steckdosen 
steuern).

Was nicht funktioniert: Momentan versuche ich einfach sobald ein IR 
Signal erkannt wird das eine LED an einem Port leuchtet. Anscheinend 
wird einfach kein IR Signal erkannt, weil wenn ich einen Port ausserhalb 
von "if (irmp_get_data (&irmp_data))" setze leuchtet die LED.
Hier mal mein Code aus main.c an dem ich am rumprobieren bin:
1
main (void)
2
{
3
    IRMP_DATA irmp_data;
4
5
    irmp_init();                                                            // initialize irmp
6
    timer1_init();                                                          // initialize timer 1
7
    sei ();                                                                 // enable interrupts
8
9
  
10
      PORTD = 0xff;  
11
      DDRD = 0xff; 
12
13
    for (;;)
14
    {
15
  PORTD =~(1<<PD1);
16
        if (irmp_get_data (&irmp_data))
17
        {
18
      switch ((unsigned char) irmp_data.command)
19
      {
20
      case 3: PORTD =~(1<<PD3); ;break;
21
      }
22
      PORTD =~(0<<PD1);
23
      PORTD =~(1<<PD2);
24
      // ir signal decoded, do something here...
25
            // irmp_data.protocol is the protocol, see irmp.h
26
            // irmp_data.address is the address/manufacturer code of ir sender
27
            // irmp_data.command is the command code
28
            // irmp_protocol_names[irmp_data.protocol] is the protocol name (if enabled, see irmpconfig.h)
29
        }
30
    }
31
}

Ich habe zusätzlich zu den standarmäßig aktivierten Protokolle sämtliche 
Protokolle die von Phillips verwendet werden da ich hier ne Phillips 
Fernbedienung rumliegen habe. Habs allerdings auch schon mit einer 
Technisat und Denon versucht. Mit dem Interrupt habe ich auch schon hoch 
und runter probiert. Eingangsport ist standart PB 6. Mein 
Mikrocontroller steckt auf einem STK500 und der IR Sensor ist an die 
Stiftleisten angeschlossen. Der IR Sensor ist ein TSOP 31236 der aber 
der direkte nachfolger vom 1736 sein soll.
Ich verwende ein Atmega88A mit internem Oszilator eingestellt auf 8MHz.

Ich hoffe mir kann jemand helfen!

Viele Grüße

Thomas

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Thomas schrieb:

> Hier mal mein Code aus main.c an dem ich am rumprobieren bin:

Zeig bitte erstmal irmpconfig.h, am besten hier als Anhang.

>   PORTD =~(1<<PD1);

Das müsste eigentlich

    PORTD &= ~(1<<PD1);

heißen, denn Du willst doch nur ein einzelnes Bit löschen, oder?

>       case 3: PORTD =~(1<<PD3); ;break;

Dito:

        case 3: PORTD &= ~(1<<PD3); ;break;

Hier auch:

>       PORTD =~(0<<PD1);
>       PORTD =~(1<<PD2);

Überall hast Du das & vergessen.

Wie ist Deine LED beschaltet? Gegen GND oder gegen Vcc?

von Thomas (Gast)


Angehängte Dateien:

Lesenswert?

Danke für deine schnelle Antwort :)

Ja ich bin noch nicht ganz vertraut mit dem Syntax hab das alles in C51 
auf der Technikerschule gelernt und mit sbits die ausgänge beschaltet. 
Hab wohl zu einfach gedacht.

Anbei die Beschaltung der LEDs und die irmpconfig.h

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Thomas schrieb:
> Anbei die Beschaltung der LEDs und die irmpconfig.h

Die LED leuchtet nur, wenn ein High-Signal vom ATmega erzeugt wird, 
also:

  PORTD |= (1<<PD3);

wenn die LED an PD3 angeschlossen ist. Leider sagst Du nicht, an welchem 
Anschluss des ATmega die LED angeschlossen ist.

Ändere Dein Programm mal folgendermaßen:
1
main (void)
2
{
3
    IRMP_DATA irmp_data;
4
5
    irmp_init();                    // initialize irmp
6
    timer1_init();                  // initialize timer 1
7
    sei ();                         // enable interrupts
8
  
9
    PORTD = 0xff;  
10
    DDRD = 0xff; 
11
12
    for (;;)
13
    {
14
        if (irmp_get_data (&irmp_data))
15
        {
16
            PORTD | = (1<<PD3);
17
        }
18
    }
19
}

Falls die LED woanders angeschlossen ist, ändere PD3 in den 
entsprechenden Wert.

von Thomas (Gast)


Lesenswert?

Es hängt an jedem Anschluss von Port D eine LED
Bei PORTD &=(1<<PD3); brennen alle LEDs ausser die an Port 3
Bei PORTD |= (1<<PD3); bleibt alles dunkel
beides ausserhalb der "if (irmp_get_data (&irmp_data))" getestet

Ich glaube nicht das des bei mir momentan an der Port Beschaltung liegt, 
da ich ja ausserhalb des "if (irmp_get_data (&irmp_data))" mir alles 
erklären und nachvollziehen kann. Sobald etwas in dem if passieren soll 
geht nichts.

Was ich mich solangsam frage ist ob da was beim Programmieren schief 
geht? Habe im AVR STudio 4 den internen Osc auf 8MHz stehn und die fuses 
sind nach datenblatt eingestellt... aber das Programm kommt ja auf den 
Controller da ausserhalb von der if ja alles soweit ausgeführt wird. 
Oder das STK 500 macht etwas was es nicht soll... langsam hab ich so en 
Schädel von Datenblätter und Dokumentationen hoch und runter zu lesen :(

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Thomas schrieb:
> Bei PORTD &=(1<<PD3); brennen alle LEDs ausser die an Port 3

Da fehlt doch ein '~' ?

> Bei PORTD |= (1<<PD3); bleibt alles dunkel

Bitte schreibe erstmal ein Programm, womit Du jede gewünschte LED ein- 
und ausschalten kannst. Wie schaltest Du die LED an PD3 ein?

> Was ich mich solangsam frage ist ob da was beim Programmieren schief
> geht? Habe im AVR STudio 4 den internen Osc auf 8MHz stehn und die fuses
> sind nach datenblatt eingestellt...

Bei den Standard-Einstellungen sind die Fuses so eingestellt, dass der 
interne 8MHz-Takt durch 8 geteilt wird. Der µC rennt dann nur mit 1MHz.

Das kann dann nicht gehen.

Schreibe ein Programm, welches die LED an PD3 im Sekundenrhytmus blinken 
lässt. Ändert die LED nur alle 8 Sekunden den Zustand, sind die Fuses 
falsch.

von Thomas (Gast)


Lesenswert?

Oh man... also mit PORTD &=~(1<<PD3); schalte ich die LED ein und mit 
PORTD |=(1<<PD3); wieder aus bei _delay_ms(1000); macht er das jetzt 
auch brav nach einer ~sekunde und nichtmehr nach 8. Das mit der CKDIV8 
fuse habe ich bis jetzt erfolgreich überlesen -.- sorry dafür.
Auf IR Signale gibt es immer noch keine reaktion.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Thomas schrieb:
> Oh man... also mit PORTD &=~(1<<PD3); schalte ich die LED ein

Gut.

> und mit PORTD |=(1<<PD3); wieder aus

Prima.

> bei _delay_ms(1000); macht er das jetzt auch brav nach einer ~sekunde
> und nichtmehr nach 8. Das mit der CKDIV8 fuse habe ich bis jetzt
> erfolgreich überlesen -.- sorry dafür.

Immerhin haben wir jetzt schon mal einen Fehler eliminiert.

> Auf IR Signale gibt es immer noch keine reaktion.

Hast Du im Projekt F_CPU korrekt auf 8 MHz gesetzt? Gibt es beim 
Übersetzen irgendwelche Warnungen?

Wie sieht Dein C-Programm aus?

Hier mein Vorschlag. Das Einschalten der LED habe ich abgeändert, damit 
sie dann auch wirklich an geht ;-)
1
main (void)
2
{
3
    IRMP_DATA irmp_data;
4
5
    irmp_init();                    // initialize irmp
6
    timer1_init();                  // initialize timer 1
7
    sei ();                         // enable interrupts
8
  
9
    PORTD = 0xff;  
10
    DDRD = 0xff; 
11
12
    for (;;)
13
    {
14
        if (irmp_get_data (&irmp_data))
15
        {
16
            PORTD &= ~(1<<PD3);     // LED einschalten
17
            _delay_ms (1000);       // 1 Sekunde warten
18
        }
19
        PORTD |= (1<<PD3);          // LED wieder ausschalten
20
    }
21
}

von Thomas (Gast)


Angehängte Dateien:

Lesenswert?

Ja die Frequenz ist richtig eingestellt die Fusebits Extendet, High und 
Low stimmen jetzt auch mit der in der Überschrift von main.c überein. 
Alternativ habe ich es auch mal mit einem 8MHz Quarz getestet (mit LED 
blinken überprüft obs richtig taktet) aber auch kein ergebnis.
Warnung beim Compilieren gibt es auch keine.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Thomas schrieb:
> Ja die Frequenz ist richtig eingestellt die Fusebits Extendet, High und
> Low stimmen jetzt auch mit der in der Überschrift von main.c überein.

Gut. Was ist mit der IR-Empfängerschaltung? An welchem ATmega-Pin hängt 
sie und wie sieht die Schaltung aus?

Du hast das LED-Leuchten von 1000ms (1 sek) auf 100ms (1/10 sek) 
gekürzt, das ist Dir bewusst? Naja, sollte man trotzdem sehen...

von Thomas (Gast)


Lesenswert?

Frank M. schrieb:
> An welchem ATmega-Pin hängt
> sie und wie sieht die Schaltung aus?

So aufgebaut wie ganz oben im IRMP Artikel nur mit einem TSOP31236. 
Stimmt auch mit dem Datenblatt vom TSOP überein. Out hängt an B6 
Spannung kommt üer das STK500. hab auch schon andere Pins getestet.

Frank M. schrieb:
> Du hast das LED-Leuchten von 1000ms (1 sek) auf 100ms (1/10 sek)
> gekürzt, das ist Dir bewusst? Naja, sollte man trotzdem sehen...

Hatte ich geändert weil ich etwas rumprobiert habe.

von jar (Gast)


Lesenswert?

häng in die +Leitung Vcc zum TSOP einen 100 Ohm und an dem TSOP zwischen 
Vcc und GND einen Kondi 220nF bis 1µ (10µ)

von Thomas (Gast)


Lesenswert?

So vorne weg... es geht! :)

Widerstand und Kondensator war vorher schon drin (habe trotzdem mehrere 
Kondensatoren dann durchgetestet). Dann hab ich es wieder auf den 4,7µF 
Kondensator umgebaut.

Woran es letztendlich lag kann ich nicht sagen... völlig gefrustet das 
wieder nix geht habe ich mir eine einfache Schaltung auf eine 
Lochrasterplatine gelötet und den µController drauf gesteckt und über 
den ISP vom STK 500 verbunden. Habe dann die Einstellungen aus dem neuen 
µController ausgelesen und und die fuses angepasst. Dann das Programm 
draufgespielt und es ging! Komisch ist nur das ich das schon davor 
mehrere male gemacht hab. Erste vermutung war das die leitung vom TSOP 
zum µController zu lang ist. also alles wieder auf STK 500 umgebaut und 
getestet... geht wieder nicht. Nach versuchen mit nem Draht direkt auf 
den µController pin zu gehen ging es. Wieder normal angeschlossen und es 
ging! Also die µController funktionieren jetzt beide.. Ich glaube in dem 
STK 500 wohnen Geister.

Vielen vilen Dank für deine Hilfe!!! :)

Eine kleine frage hätte ich noch.. Ich hab jetzt in meiner Harmony One 
den Videorekorder Toshiba VT-728G aus der Tabelle hinzugefügt und mal 
versucht mit
1
if (irmp_data.protocol == IRMP_NEC_PROTOCOL &&     // NEC-Protokoll
2
          irmp_data.address == 23364)                   // Adresse
das Protokoll heraus zu filtern was nicht geklappt hat. Das NEC filtert 
er noch nur mit der Adresse passiert nichts. Mit 23364 0x23364 und 
0x5b44 getestet. Denke ich falsch :?

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Thomas schrieb:
> So vorne weg... es geht! :)

Prima.

> Ich glaube in dem STK 500 wohnen Geister.

Wahrscheinlich wird der Pin im STK500 noch für andere Zwecke genutzt. 
Schau Dir mal das Schaltbild zum STK500 an.

> Eine kleine frage hätte ich noch.. Ich hab jetzt in meiner Harmony One
> den Videorekorder Toshiba VT-728G aus der Tabelle hinzugefügt und mal
> versucht mit
1
if (irmp_data.protocol == IRMP_NEC_PROTOCOL &&     //
2
> NEC-Protokoll
3
>           irmp_data.address == 23364)                   // Adresse
> das Protokoll heraus zu filtern was nicht geklappt hat. Das NEC filtert
> er noch nur mit der Adresse passiert nichts. Mit 23364 0x23364 und
> 0x5b44 getestet. Denke ich falsch :?

Ich vermute, das hat historische Gründe. Früher (ziemlich am Anfang der 
Entwicklung) wurde im IRMP nicht berücksichtigt, dass beim NEC-Protokoll 
das LSB zuerst gesandt wird. Die Werte im Artikel könnten also 
"Bit-gespiegelt" sein.

dez     binär             hex
23364 = 101101101000100 = 0x5B44

Probiere mal:

dez     binär             hex
 4461 = 001000101101101 = 0x116D

Ich würde da also nicht so viel drauf geben. Am besten, ich lösche diese 
Tabelle, denn viel bringt sie sowieso nicht.

Hast Du keine Möglichkeit, Protokoll, Adresse und Kommando über den UART 
zu senden oder auf einem Display auszugeben?

Ich weiß ja nicht, was Du vorhast, aber das eleganteste ist, die FB 
anzulernen: Einmal Taste drücken, Protokoll, Adresse und Kommando im 
EEPROM speichern. Dann kannst Du später jederzeit diese Taste wieder 
identifizieren.

von Thomas (Gast)


Angehängte Dateien:

Lesenswert?

Ich hab das Gerät aus der Tabelle ausgesucht weil ich es mir einfach 
machen wollte und mir sowieso ein Gerät ausdenken muss welches ich in 
der Harmony One einprogrammiere. Mit 4461 ud 0x116D klappt es auch 
nicht.

Frank M. schrieb:
> Hast Du keine Möglichkeit, Protokoll, Adresse und Kommando über den UART
> zu senden oder auf einem Display auszugeben?

Ja, ich hoffe nur das das auch richtig ist was ich gemacht habe... hab 
den scan aus HTerm mal angehängt. Wenn ich das dann auswerte kommt 
eigentlich nicht viel sinnvolles (für mich) raus hauptsächlich steht 
dann da protocol = UNKNOWN. Was allerdings auch mit sämtlichen scans aus 
dem IR-Data Ordner passiert.

Das ganze soll mal eine Licht- und Steckdosensteuerung werden und 
hauptsächlich meine Funksteckdosen ersetzten das ich wirklich nurnoch 
die Harmony One als Fernbedienung rumliegen habe.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Thomas schrieb:
> Ja, ich hoffe nur das das auch richtig ist was ich gemacht habe...

Hm, das soll ein Scan sein? Kann nicht sein, da steht nur Mist drin, 
nämlich 00110000 bzw. 00110001. Und die Blanks dazwischen können auch 
kein Scan-Output sein. Wie hast Du das gemacht?

Aber wenn IRMP sowieso die FB erkennt, dann brauchst Du doch gar nicht 
zu scannen, er reicht doch dann einfach,

  irmp_data.protocol
  irmp_data.address
  irmp_data.command

auf dem UART auszugeben.

Beispiel:
1
  char buf[20];
2
  ...
3
  uart_init ();
4
  ....
5
6
  if (irmp_get_data (&irmp_data))
7
  {
8
    itoa (irmp_data.protocol, buf, 10);   // protocol in decimal
9
    uart_puts (buf);
10
    uart_putc (' ');
11
    itoa (irmp_data.address, buf, 16);   // address in hex
12
    uart_puts (buf);
13
    uart_putc (' ');
14
    itoa (irmp_data.command, buf, 16);   // command in hex
15
    uart_puts (buf);
16
    uart_putc ('\r');
17
    uart_putc ('\n');
18
  }

Jetzt brauchst Du nur noch 3 Funktionen:

uart_init ();
uart_puts ();
uart_putc ();

Entweder holst Du Dir die UART-Fleury-Lib oder kopierst die 
entsprechenden Funktionen irmp_uart_init() usw. aus irmp.c raus, steckst 
sie in Dein main.c und benennst sie um, indem Du das Prefex "irmp_" aus 
den Funktionsnamen rauslöschst. Vielleicht hast Du ja auch eigene 
UART-Routinen?

von Thomas (Gast)


Lesenswert?

Frank M. schrieb:
> Hm, das soll ein Scan sein? Kann nicht sein, da steht nur Mist drin,
> nämlich 00110000 bzw. 00110001. Und die Blanks dazwischen können auch
> kein Scan-Output sein. Wie hast Du das gemacht?

Wenn ich das wüsste.. war schon glücklich das HTerm überhaupt was 
ausgespuckt hat :D hab zuvor noch nie mitm UART was gemacht.

Puh! da muss ich mich erstmal einarbeiten. So ganz nachvollziehbar ist 
das mit dem UART noch nicht für mich, scheint etwas komplizierter zu 
werden. Im zweifelsfall geht es erstmal auch so da erstaunlicherweise 
ich kein Gerät habe das das NEC Protokoll verwendet.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Thomas schrieb:
> Puh! da muss ich mich erstmal einarbeiten.

Sorry, IRMP ist kein fertiges Programm, eher eine Programmbibliothek. 
Wenn Du etwas mit IRMP anstellen möchtest, musst Du das "Drumherum" 
(sprich: Deine Anwendung) schon selbst auf die Beine stellen. Da sind 
UART-Routinen auch für Deine Anwendung - zumindest fürs Debugging - 
sinnvoll.

von Daniel C. (cecky)


Lesenswert?

Hi,

wollte an dieser Stelle einfach mal bedanken!!
Hab IRMP heute zum ersten mal getestet, und es hat nicht mal 30 Minuten 
gedauert (inkl. Hardwareaufbau), und alle 6 Fernbedienungen die ich hier 
zur Hand habe wurden einwandfrei erkannt. Cooles Projekt und meine 
Hochachtung!

Gruß Cecky

von Thomas (Gast)


Lesenswert?

Das ist mir klar wollte nur sagen das ich dafür wohl ne weile brauch bis 
ich da durch steig. Und ohne Herausforderungen wäre es ja auch 
langweilig! Trotzdem habe ich die letzten tage sehr viel gerlernt.
Aufjedenfall danke für die Hilfe und das tolle Programm!

Gruß Thomas

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Daniel C. schrieb:
> Hab IRMP heute zum ersten mal getestet, und es hat nicht mal 30 Minuten
> gedauert (inkl. Hardwareaufbau), und alle 6 Fernbedienungen die ich hier
> zur Hand habe wurden einwandfrei erkannt. Cooles Projekt und meine
> Hochachtung!

Danke fürs Danke. Viel Spaß noch mit IRMP :-)

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Thomas schrieb:
> Das ist mir klar wollte nur sagen das ich dafür wohl ne weile brauch bis
> ich da durch steig.

Da muss man sich halt durchbeissen. Aber wenns dabei auch noch Spaß 
macht, wird es Dir bestimmt gelingen :-)

> Und ohne Herausforderungen wäre es ja auch langweilig!

Eben. Drücke Dir die Daumen. Es ist noch kein Meister vom Himmel 
gefallen.

> Trotzdem habe ich die letzten tage sehr viel gerlernt.
> Aufjedenfall danke für die Hilfe und das tolle Programm!

Danke und Gruß,

Frank

von Thorsten (Gast)


Lesenswert?

Hallo zusammen,

auch von mir erstmal ein herzliches Danke für die tolle Bibliothek. Ich 
habe IRMP inzwischen auf einem PIC24F und einem PIC32 laufen und bin 
absolut begeistert.

Alle Fernbedienungen, welche ich hier so rumliegen habe funktionieren - 
bis auf eine: Eine Fernbedienung von einer alten Sky Digibox für SKY UK.

Daher meine Frage: Hat jemand so eine Fernbedienung schon zum laufen 
gebracht ?

Gruß
Thorsten

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Thorsten schrieb:

> auch von mir erstmal ein herzliches Danke für die tolle Bibliothek.

Danke :-)

> Alle Fernbedienungen, welche ich hier so rumliegen habe funktionieren -
> bis auf eine: Eine Fernbedienung von einer alten Sky Digibox für SKY UK.

Du könntest ein paar Scans erstellen, dann kann ich Dir mehr sagen. Das 
Logging über IRMP_LOGGING ist aber nur für AVRs realisiert. Für PICs 
gibt es noch IRMP_EXT_LOGGING, welches den Quellcode in irmpextlog.c 
aktiviert. Dafür ist aber eine USB-Schnittstelle erforderlich. 
Vielleicht kannst Du damit was anfangen?

von eku (Gast)


Lesenswert?

Hallo Frank,

ist zwar schon wieder ein halbes Jahr her, aber das Thema ist noch 
aktuell.
Du testest mit den im IR-Data Verzeichnis gespeicherten Scans. Und genau 
die Sharp-Scans passieren des Test nicht:

got unexpected inverted command, ignoring it

Es wird kein Code dekodiert. Einkompiliert auschließlich Denon!

Wenn es Deine Zeit erlaubt, nimm Dich bitte des Themas an. Wie ich im 
April schrieb, wird das Sharp Protokoll seit meinem Umstieg von Rev 71 
auf eine neuere Version nicht länger erkannt. Freilich könnte ich auf 
Rev 71 zurückgehen, verliere dann aber die für mich wichtigen 
Korrekturen im Denon Dekoder.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Hallo eku,

eku schrieb:
> Du testest mit den im IR-Data Verzeichnis gespeicherten Scans. Und genau
> die Sharp-Scans passieren des Test nicht:
>
> got unexpected inverted command, ignoring it

Kann ich nachvollziehen mit

   irmp-10kHz -v < sharp-denon.txt
bzw.
   irmp-10kHz -v < sharp-denon2.txt

Schaue ich mir dieses Wochenende an.

Gruß,

Frank

von Shottky (Gast)


Lesenswert?

Hallo Leute!

Ich bin gerade dabei das IRMP auf nem 8-Bitter (PIC16F1823) zu
portieren. Der Compiler ist CCS C Compiler.

Habe aus meiner Sicht alles beachtet was laut dem Artikel von Frank
M. (http://www.mikrocontroller.net/articles/IRMP#F_INTERRUPTS) für die 
Portierung notwendig ist.

Der Timerinterrupt ist auf 15625 interrupts pro Sec. eingestellt und der 
richtige Port für den Sensor habe ich auch ausgewählt. Die 
main()-Routine kann ich gerne bei bedarf posten.

Jedoch habe ich Probleme mit allen (!) Funktionen, die in der irmp.h 
stehen:
1
extern void                             irmp_init (void);
2
extern uint8_t                          irmp_get_data (IRMP_DATA *);
3
extern uint8_t                          irmp_is_busy (void);
4
extern uint8_t                          irmp_ISR (void);

Mein Compiler zeigt dabei für jede oben genannte Funktion die 
Fehlermeldung, das die Funktion genutzt, aber nicht definiert ist.

Hier der Ausschnitt für das Fehlen von irmp_get_data():
"Error 112 "main.c" Line 35(1,1): Function used but not defined:  ... 
irmp_get_data SCR=1896"

Kann mir jemand hier weiterhelfen, irgendein Tip?
Hatte jemand schon mal das selbe Problem?
Ich komme hier nicht mehr weiter...

Schonmal vielen Dank!
Shottky

von jar (Gast)


Lesenswert?

Shottky schrieb:
> Hier der Ausschnitt für das Fehlen von irmp_get_data():
> "Error 112 "main.c" Line 35(1,1): Function used but not defined:  ...
> irmp_get_data SCR=1896"

fehlt das #include ?



WICHTIG
    Im Applikations-Source sollte nur irmp.h per include eingefügt 
werden, also lediglich:

#include "irmp.h"

Alle anderen Include-Dateien werden automatisch über irmp.h "eingefügt". 
Siehe dazu auch die Beispieldatei main.c.

Desweiteren muss die Preprocessor-Konstante F_CPU im Projekt bzw. 
Makefile gesetzt werden. Diese sollte mindestens den Wert 8000000UL 
haben, der Prozessor sollte also zumindest mit 8 MHz laufen.

von Shottky (Gast)


Lesenswert?

jar schrieb:
> fehlt das #include ?

Ja, ich habe das Include-File eingefügt.


> Desweiteren muss die Preprocessor-Konstante F_CPU im Projekt bzw.
> Makefile gesetzt werden.

Das habe ich als global #define in den Built Options von MPLAB 
definiert.

Ich hab hier mal mein main.c-File:
1
#include <16F1823.h>
2
#include <stdio.h>
3
4
#fuses NOMCLR,NOPROTECT,NOWDT
5
#use delay(clock = 32000000)  // Quarz 32 MHz
6
7
8
#include "irmp.h"
9
10
#ifndef F_CPU
11
#error F_CPU unkown
12
#endif
13
14
#INT_TIMER0
15
void testfunc_for_timer(){
16
    
17
  irmp_ISR();
18
    //delay_ms(2000);
19
    output_high(PIN_C0); // LED ON
20
    //delay_ms(1000);
21
    //output_low(PIN_C0); //LED OFF 
22
  
23
}
24
    
25
void main(){
26
   
27
  IRMP_DATA irmp_data;  
28
  irmp_init();
29
30
  setup_oscillator(OSC_16MHZ);
31
 
32
  // set port c as an output
33
    set_tris_c(0b0000000);
34
    
35
    setup_timer_0 (RTCC_INTERNAL|RTCC_DIV_1|RTCC_8_BIT); //(16Mhz/4)/RTCC_DIV_1=15625 interrupts per second
36
    enable_interrupts(INT_TIMER0); 
37
    enable_interrupts(GLOBAL);
38
  set_timer0(0); //
39
40
    while(true)
41
  {
42
  //set_timer0(120); //
43
  output_low(PIN_C0); // LED OFF
44
  if (irmp_get_data(&irmp_data))
45
  {
46
    if (irmp_data.protocol < 50)                   // Adresse 0x1234
47
    {
48
    }
49
  }
50
51
52
  }// end while
53
}// end main()

von jar (Gast)


Lesenswert?

gibt es bei dir uint8_t nicht ?

von Shottky (Gast)


Lesenswert?

Hallo jar!

jar schrieb:
> gibt es bei dir uint8_t nicht ?

Das sollte ja eigentlich mittels typedef in der irmpsystem.h definiert 
werden:
1
#if defined(PIC_CCS) || defined(PIC_C18) || defined(ARM_STM32)
2
typedef unsigned char                   uint8_t;
3
typedef unsigned short                  uint16_t;
4
#endif

Gruß Shottky

von jar (Gast)


Lesenswert?

also du hast #include "irmp.h"
 drin und trotzdem kennt er nicht for Prototypen ? ist da ein 
Pfadproblem ?

von jar (Gast)


Lesenswert?

streiche for ersetze die

von Shottky (Gast)


Lesenswert?

jar schrieb:
> also du hast #include "irmp.h"
>  drin und trotzdem kennt er nicht for Prototypen ?

Ja genau

>  ist da ein Pfadproblem ?

Die Files: irmp.c, irmpprotocols.h, irmpsystem.h, irmp.h und 
irmpconfig.h habe ich allesamt im selben Verzeichnis wie das 
main.c-File. Dadurch sollte  eig. kein Pfadproblemauftreten, oder?

Kann es sein, dass ich zusätzlich im Project-File von MPLAB was 
ändern/einstellen muss?

Gruß Shottky

von jar (Gast)


Lesenswert?

Shottky schrieb:
> dass ich zusätzlich im Project-File von MPLAB was
> ändern/einstellen muss?

wie wäre es mit irmp.c einbinden ?

von Shottky (Gast)


Lesenswert?

jar schrieb:
> wie wäre es mit irmp.c einbinden ?

Auch das hat leider nichts bewirkt :-(
kA was ich jetzt noch austesten könnte.

von jar (Gast)


Lesenswert?

Shottky schrieb:
> kA

ich auch nicht, kenne die PIC Umgebung nicht

von Shottky (Gast)


Lesenswert?

jar schrieb:
> ich auch nicht, kenne die PIC Umgebung nicht

IRMP wurde doch schon auf nem PIC portiert.
Vlt. kann mir jemand, der das schon gemacht hat, weiterhelfen?
Oder sagen mit welcher Entwicklungsumgebung IRMP erfolgreich portiert 
wurde?


Gruß Shottky

von Sebastian .. (zahlenfreak)


Lesenswert?

Hallo Frank,

ich habe gerade zwei Abende damit Verbracht, IRSND auf einem Tiny44 zum 
laufen zu bringen. Jetzt läuft es zum glück - wie bei IRMP ist das super 
Software!

Das Problem war schlussendlich, dass der Timer1 Compare interrupt aus 
deinem Beispiel-main file vom Compiler nicht in der Interrupttabelle 
angelegt wurde. Sobald ich als Vektor nicht TIMER1_COMPA_vect sondern 
TIM1_COMPA_vect angegeben habe gings.

Mir ist klar, dass das nicht mehr so ganz zum Projekt gehört, aber 
vielleicht kennst du ja die Hintergründe dazu? Der Compiler meckert bei 
beiden Namen nicht. Nur dass halt bei TIMER1_COMPA_vect kein 
Interruptvektor angelegt wird.

Viele Grüße,

Sebastian

von jar (Gast)


Lesenswert?

Sebastian ... schrieb:
> Das Problem war schlussendlich, dass der Timer1 Compare interrupt aus
> deinem Beispiel-main file vom Compiler nicht in der Interrupttabelle
> angelegt wurde. Sobald ich als Vektor nicht TIMER1_COMPA_vect sondern
> TIM1_COMPA_vect angegeben habe gings.
>
> Mir ist klar, dass das nicht mehr so ganz zum Projekt gehört, aber
> vielleicht kennst du ja die Hintergründe dazu? Der Compiler meckert bei
> beiden Namen nicht. Nur dass halt bei TIMER1_COMPA_vect kein
> Interruptvektor angelegt wird.

die Hintergründe kenne ich nicht, aber das kein Vector angelegt wird ist 
klar weil in

"C:\PROGRAMME\ATMEL\WinAVR-20100110\avr\include\avr\iotn44a.h"(554) 
#define TIM1_COMPA_vect_num  6
"C:\PROGRAMME\ATMEL\WinAVR-20100110\avr\include\avr\iotn44a.h"(555) 
#define TIM1_COMPA_vect      _VECTOR(6)  /* Timer/Counter1 Compare Match 
A */
"C:\PROGRAMME\ATMEL\WinAVR-20100110\avr\include\avr\iotnx4.h"(410) 
#define TIM1_COMPA_vect      _VECTOR(6)

das #define nun mal so ist wie du festgestellt hast, Abhilfe

neues #define einfügen (würde ich machen, denn das es fehlerhafte Header 
gibt ist ja nicht auszuschliessen)

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Sebastian ... schrieb:
> Das Problem war schlussendlich, dass der Timer1 Compare interrupt aus
> deinem Beispiel-main file vom Compiler nicht in der Interrupttabelle
> angelegt wurde. Sobald ich als Vektor nicht TIMER1_COMPA_vect sondern
> TIM1_COMPA_vect angegeben habe gings.

Komisch, in der aktuellen irsndmain.c steht drin:
1
#ifdef TIM1_COMPA_vect                                                      // ATtiny84
2
#define COMPA_VECT  TIM1_COMPA_vect
3
#else
4
#define COMPA_VECT  TIMER1_COMPA_vect                                       // ATmega
5
#endif
6
7
/*---------------------------------------------------------------------------------------------------------------------------------------------------
8
 * timer 1 compare handler, called every 1/10000 sec
9
 *---------------------------------------------------------------------------------------------------------------------------------------------------
10
 */
11
ISR(COMPA_VECT)                                                             // Timer1 output compare A interrupt service routine, called every 1/15000 sec
12
{
13
    (void) irsnd_ISR();                                                     // call irsnd ISR
14
    // call other timer interrupt routines here...
15
}

Hier wird also der TIM1_COMPA_vect verwendet.

Ohne diesen speziellen define oben schmeisst mein avr-gcc aus:

../irsndmain.c:49:1: warning: 'TIMER1_COMPA_vect' appears to be a 
misspelled signal handler [enabled by default]

Welche IRMP-Version verwendest Du?

von Sebastian .. (zahlenfreak)


Lesenswert?

Habe die Version 2.3.1 die im wiki-Artikel verlinkt ist verwendet. Da 
gibts die Defines zur Interruptbezeichnung noch nicht. Im SVN hab ich 
die defines jetzt auch grade gesehen. Da sollte man vielleicht noch den 
Link im wiki updaten.


Übrigens sind die Pinbelegungen auf dem Tiny44 und dem Tiny24 genau 
gleich wie auf dem 84er. Die könnte man also auch sehr einfach noch 
dazufügen. Zumindest im Tiny44 passt IRSND (mit optimierung) auch ganz 
gut rein.

Viele Grüße,

Sebastian

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Sebastian ... schrieb:
> Habe die Version 2.3.1 die im wiki-Artikel verlinkt ist verwendet. Da
> gibts die Defines zur Interruptbezeichnung noch nicht. Im SVN hab ich
> die defines jetzt auch grade gesehen. Da sollte man vielleicht noch den
> Link im wiki updaten.

Du hast recht. Werde ich aktualisieren.

> Übrigens sind die Pinbelegungen auf dem Tiny44 und dem Tiny24 genau
> gleich wie auf dem 84er. Die könnte man also auch sehr einfach noch
> dazufügen. Zumindest im Tiny44 passt IRSND (mit optimierung) auch ganz
> gut rein.

Ja, ist mir eben auch aufgefallen, als ich mir die entsprechenden 
Stellen im Source ansah. Deshalb habe ich den Quelltext eben um den 
Tiny44 erweitert. Der Tiny24 macht da wohl weniger Sinn.

Heute abend mache ich ein Update.

Vielen Dank,

Frank

von eku (Gast)


Lesenswert?

Hallo Frank,

Frank M. schrieb:
> Kann ich nachvollziehen mit
>
>    irmp-10kHz -v < sharp-denon.txt
> bzw.
>    irmp-10kHz -v < sharp-denon2.txt
>
> Schaue ich mir dieses Wochenende an.

schon die Ursache gefunden?

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Hallo eku,

eku schrieb:
> schon die Ursache gefunden?

Mittlerweile ja. Ich hattezuletzt irgendwann eine "verbesserte" 
Erkennung von nicht-invertierenden und invertierenden Denon-Frames 
eingebaut. Kriterium waren dafür die letzten beiden Bits im Frame: Diese 
waren entweder 00 oder 11.

Nun scheint Sharp bei Verwendung des Denon-Protokolls zu tricksen: Sie 
verwenden die beiden letzten Bits als normale Daten-Bits, nämlich die 
Werte 01 und 10, die es im "korrekten" Denon-Protokoll ja gar nicht 
gibt. Dafür lassen sie dann aber auch den invertierten 
Wiederholungsframe weg, der eigentlich zusätzliche Datensicherheit geben 
soll.

Ich habe das im IRMP nun so gelöst:

Sind die beiden letzten Bits...

  00 Standard-Denon, dann warte auf invertierten Wiederholungsframe
  11 Standard-Denon, dann ist dies der invertierte Wiederholungsframe
  10 kein Standard, dann gibt es keinen invertierten Wiederholungsframe
  01 dito

Gruß,

Frank

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Die Version 2.3.6 von IRMP und IRSND ist nun als Download verfügbar:

IRMP:

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

  Software-Änderungen seit 2.3.1:

  - Korrekturen Frame-Erkennung beim DENON-Protokoll
  - Neues Protokoll: A1TVBOX
  - Verbesserte Erkennung von DENON-Wiederholungsframes
  - Portierung auf Stellaris LM4F120 Launchpad von TI (ARM Cortex M4)

IRSND:

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

  Software-Änderungen seit 2.3.1:

  - Support für ATtiny44 hinzugefügt
  - Neues Protokoll: A1TVBOX
  - Korrektur Timing beim NIKON-Protokoll

Viel Spaß mit IRMP!

Frank

von Ulli (Gast)


Lesenswert?

Hi Frank,

ich habe gerade das Problem das ich den Timer 0 meines Atmega32 auf den 
prescaler 64 stellen muss. Mithilfe des Timer0 erzeuge ich aber das 
Sendesignal des IRSND.

Sehst du eine Chance das irsnd auch mit dem prescaler funktioniert?

von Ulli (Gast)


Angehängte Dateien:

Lesenswert?

oder noch besser.

Hast du eine Idee wie ich die wiring.c Datei auf die timer0 
Einstellungen von irsnd resultierend anpassen kann?

habe IRSND auf folgende konfiguration
#  define F_INTERRUPTS                           14925

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Ulli schrieb:
> ich habe gerade das Problem das ich den Timer 0 meines Atmega32 auf den
> prescaler 64 stellen muss. Mithilfe des Timer0 erzeuge ich aber das
> Sendesignal des IRSND.

Es geht um Arduino, nicht wahr? Das Problem ist, dass die 
Arduino-Runtime-Lib die Timer selbst benutzt. Das kann dann zu größeren 
Problemen an anderen Stellen führen, wenn man daran rumschraubt.

Habe es gerade mal eben durchgerechnet:

Bei einem Prescaler von 64 gehen ist die maximal mögliche Frequenz 
38kHz, wobei die Abweichung dabei ca. 10% beträgt. Statt 38kHz kommen 
dann ca. 35 und ein paar zerquetschte kHz raus. Das kann gutgehen, kann 
aber auch nicht. Auf jeden Fall wird die Reichweite stark eingeschränkt.

Musst Du das unbedingt mit einem Arduino machen? Alternative wäre ein 
ATTiny45, an den Du die IR-Diode nebst Transistor anschließt und den 
ATTiny über Software-UART mit Deinem Arduino-System verbindest.

Gruß,

Frank

von Ulli (Gast)


Lesenswert?

Ja ich möchte alles in den Arduino packen.
Es läuft auch alles sehr gut, solange ich es getrennt laufen lasse.

Das Problem ist das meine andere Funktion die Funktion micros() nutzt. 
Diese berechnet jetzt aber nach Anpassung der Timer0 Einstellung von 
irsnd nicht mehr richtig.

Ich schaffe es aber leider nicht die micros funktion auf die neuen 
einstellungen durch IRSND anzupassen.
Theoretich müsste ich ja nur den neuen Takt in die micros berechnung mit 
einbeziehen....

von Ulli (Gast)


Angehängte Dateien:

Lesenswert?

Habe die Lösung gefunden.
Die timing Funktionen welche auf Timer0 basieren auf der Arduino 
Plattform habe ich jetzt umgeschrieben.
Somit läuft IRSND & IRMP & mircos()..... einwandfrei auf einem Board.

Alle die das selbe Problem haben. Anbei die neuen timing funktionen :)

Trotzdem nochmal danke an Frank für die Spitzen IR Anwendung!!!

von eku (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Frank,

Frank M. schrieb:
> Ich habe das im IRMP nun so gelöst:

IRMP erkennt nun wieder die Codes meiner FB, aber liefert mir für jeden 
Code drei Ergebnisse der Art:

D: RX 08 0010 0142 00 (DENON) <- korrekt
D: RX 08 0010 02BD 00 (DENON) <- Müll
D: RX 08 0010 0142 00 (DENON) <- korrekt

Rev. 71 von IRMP dekodiert hingegen korrekt.

Ich habe einenen neuen Scan der Tasten 0-9 sowie die Resultate von IRMP 
angehangen.

von Ulli (Gast)


Lesenswert?

Hallo Frank,

jetzt habe ich noch eine HW Frage. Meine derzeitige IR-Diode 
funktioniert leider nur wenn ich Sie direkt auf das Zielgerät richte.
Kannst du eine Diode empfehlen, die dafür besser geeignet ist?
Großer Öffnungswinkel und Leuchtstärke?

Die Verschaltung ist entsprechend deinem Vorschlag. 4.7kOhm, BC337 und 
33Ohm.

Danke.

von jar (Gast)


Lesenswert?

welche Diode hast du, es gibt halt von 880nm bis 950nm viele Dioden die 
als IR zählen.

zuerst sollte man 950nm Dioden wählen
der Rv mit 33 Ohm sieht gut aus, der Transistor Rv 4,7k Ohm erscheint 
mir zu hoch, setzt ja eine Stromverstärkung von mindestens 150 voraus, 
ich guck nun nicht das ß vom Trasi aus, würde erst mal auf 2,2k gehen um 
den Tasi in die Sättigung zu fahren, den Rv auf 22 Ohm verringern, im 
Impulsbetrieb können die IR Dioden ruhig bis 1A fahren.

Dioden mit breiterem Winkel, ich finde 15-50° sind halt schwächer, 
eventuell ist deine IR Frequenz falsch, die Empfänger erwarten ja 
zwischen 30-40 kHz üblicherweise, die im IRMP gewählte Empfangsfrequenz 
ist oft auf 36 kHz genommen weil damit der Bereich 30-40 gut abgedeckt 
ist, für Reichweite sollte aber die genaue genommen werden.

Also probiere deine IR Diode zuerst mit Frequenzen von 30-40 kHz für 
Reichweite ! dann kannst du mit verschiedenen Dioden den Winkel 
ermitteln der dir passt, später noch die IR Frequenz von 880nm - 950 nm 
varieren

dummerweise gibt es im freien Handel nicht alle Dioden von 880nm-950nm 
in allen Winkeln von 15-50°

also hilft nur probieren, Dioden nm, IR Frequenz, Winkel, die beste 
Diode noch trimmen in "Überstrom bis 1A"

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Hallo eku,

eku schrieb:

> IRMP erkennt nun wieder die Codes meiner FB, aber liefert mir für jeden
> Code drei Ergebnisse der Art:

Das liegt an meiner letzten Änderung, die ich aufgrund Deines Hinweises 
bzgl. sharp-denon.txt und sharp-denon2.txt gemacht habe.

> D: RX 08 0010 0142 00 (DENON) <- korrekt
> D: RX 08 0010 02BD 00 (DENON) <- Müll
> D: RX 08 0010 0142 00 (DENON) <- korrekt

Ich habe IRMP nun dermaßen angepasst, dass nur noch das letzte Bit 
darauf geprüft wird, ob ein Denon-Wiederholungsframe vorliegt oder 
nicht. Die Änderung ist im SVN eingecheckt. Damit sollte es nun gehen.

Allerdings habe ich nun sharp-denon.txt und sharp-denon2.txt aus 
test-suite.sh rausgeworfen. Da diese Scans uralt sind und dort die 
nötigen Denon-Wiederholungsframes fehlen, sind sie nicht mehr für die 
Beurteilung der IRMP-Erkennungsqualität relevant. Stattdessen habe ich 
nun in die Test-Suite neu übernommen:

sharp_15khz.txt
sharp_kurz_10khz.txt
sharp_lang_10khz.txt

Damit haben wir nun Scans, wo der initiale Frame mit der Bitfolge 00 
(nicht invertiert) beginnt bzw. mit der Folge 10.

> Ich habe einenen neuen Scan der Tasten 0-9 sowie die Resultate von IRMP
> angehangen.

Danke, hat mir weitergeholfen.

Gruß,

Frank

P.S.
Die Erkennung der unterschiedlichsten Form der Denon-Frames bringt mich 
noch um den letzten Nerv. Meines Erachtens hat dieses Protokoll 
grundlegende Designfehler.

von jar (Gast)


Lesenswert?

Frank M. schrieb:
> Die Änderung ist im SVN eingecheckt. Damit sollte es nun gehen.

ist svn und tarball immer synchron ?

ich hab die letzte Version (vor heute) in mein Projekt eingepflegt aber 
nix funktioniert.

auffällig war das ich nun nicht mehr irmpconfig.h einbinden muss.

ich hatte mehrfach die Einbindung, alten Code neuen Code versucht um 
Fehlbedienungen meinerseits auszuschliessen, aber mit dem vorletzten 
Code bekomme ich kein Ergebnis, muss ich noch mal die Variablen prüfen ? 
hast du da was geändert, oder an den Laufzeiten ?

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Hallo Ulli,

Ulli schrieb:
> jetzt habe ich noch eine HW Frage. Meine derzeitige IR-Diode
> funktioniert leider nur wenn ich Sie direkt auf das Zielgerät richte.
> [...]
> Die Verschaltung ist entsprechend deinem Vorschlag. 4.7kOhm, BC337 und
> 33Ohm.

Ändere mal den Vorwiderstand von 4.7kOhm auf 1kOhm, so wie es im Artikel 
unterhalb des Schaltbildes in der Bemerkung steht.

Gruß,

Frank

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

jar schrieb:
> ist svn und tarball immer synchron ?

Der tarball des SVNs wird ja aus dem SVN erzeugt.

Oder meinst Du den Download-Link der zip-Datei? Im Zweifel ist das SVN 
immer aktueller als der Download-Link der zip-Datei im Artikel. 
Letzteren habe ich aber gerade auch noch aktualisiert, so dass nun die 
aktuelle (SVN) und die Release-Version (irmp.zip im Artikel) identisch 
sind.

> auffällig war das ich nun nicht mehr irmpconfig.h einbinden muss.

Schon lange nicht mehr! Siehe roten Kasten unter:

  http://www.mikrocontroller.net/articles/IRMP#Source-Code

> ich hatte mehrfach die Einbindung, alten Code neuen Code versucht um
> Fehlbedienungen meinerseits auszuschliessen, aber mit dem vorletzten
> Code bekomme ich kein Ergebnis, muss ich noch mal die Variablen prüfen ?

Zeig einfach mal Deinen Code.

> hast du da was geändert, oder an den Laufzeiten ?

Nein, nichts grundlegendes.

Gruß,

Frank

von jar (Gast)


Lesenswert?

Frank M. schrieb:
> Zeig einfach mal Deinen Code.

die ISR
1
//---------------------------------------------------------------------------------------------------------------------------------------------------
2
// timer 0 compare handler, called every F_CPU/512 = 512/8000000 = 64µsec
3
//---------------------------------------------------------------------------------------------------------------------------------------------------
4
//
5
ISR(TIMER0_OVF_vect)
6
{  extern volatile UWORD count__;
7
  cli();
8
  count__++;
9
  TCNT0 = -2;          // 2 * 256 = 512 cycle      // preload for 250µs RC5
10
  if (! irsnd_ISR())         // call irsnd ISR
11
  {                          // if not busy...
12
    (void) irmp_ISR();      // call irmp 3-16µs
13
    (void) rc5_ISR();      // call rc5 8-10µs
14
  }
15
  sei();
16
}

das Menü / IRMP zeigen
1
void _Irmp(void)
2
{  // "16.IRMP"
3
  __p=_IRMP;
4
  lcd_set(); 
5
  lcd_gotoxy(0,0); lcd_puts_p(menus[__p]); 
6
  lcd_gotoxy(0,1); lcd_puts("R: Code:            ");
7
  lcd_gotoxy(0,2); lcd_puts("A:                  ");
8
  lcd_gotoxy(0,3); lcd_puts("C:                  ");
9
  irPOWER(ON);
10
}

irmpconfig.h (Ausschnitt)
1
#ifndef F_INTERRUPTS
2
#define F_INTERRUPTS                            F_CPU/512 // mit 8000000 int RC und Teiler 256 TCNT0=-2
3
//#define F_INTERRUPTS                            15000   // interrupts per second, min: 10000, max: 20000, typ: 15000
4
#endif
5
6
#if defined (PIC_C18)                                                   // Microchip C18 Compiler
7
#include <p18cxxx.h>                                                    // main PIC18 h file
8
9
#define IRMP_PIN                                PORTBbits.RB4           // use RB4 as IR input on PIC
10
#define input(x)                                (x)
11
#elif defined (PIC_CCS_COMPILER)                                        // PIC CCS Compiler:
12
#define IRMP_PIN                                PIN_B4                  // use PB4 as IR input on PIC
13
#else                                                                   // AVR:
14
#define IRMP_PORT                               PORTD
15
#define IRMP_DDR                                DDRD
16
#define IRMP_PIN                                PIND
17
#define IRMP_BIT                                6                       // use PB6 as IR input on AVR
18
#define input(x)                                ((x) & (1 << IRMP_BIT))
19
#endif

ich nutze einen m1284p (übrigens den 1284 scheint es nicht mehr käuflich 
zu geben, die p sind neuer aber gleich) du hast aber irgendwo defines 
für m644 und m664p drin, aber nur m1284 ohne p

im main loop:
1
    if(__p==_IRMP)
2
    {  if (irmp_get_data(&irmp_data))
3
       {
4
        sek10=0;
5
        wait_sec=20;
6
        if(irmp_data.protocol == IRMP_KASEIKYO_PROTOCOL)
7
          gelbLED(100);
8
        else
9
          gruenLED(100);
10
11
        lcd_gotoxy(0,1); lcd_puts("R: Code: "); lcd_puts(trimm_string(' ', irmp_protocol_names[irmp_data.protocol], 8));
12
        lcd_gotoxy(0,2); lcd_puts("A: "); 
13
        strcpy(s2, "0x"); strcat(s2, utoa(irmp_data.address,s,16)); lcd_puts(trimm_string(' ', s2, 6)); 
14
        strcpy(s2, "("); strcat(s2, utoa(irmp_data.address,s,10)); strcat(s2, "d)");
15
        lcd_gotoxy(11,2); lcd_puts(trimm_string(' ', s2, 8));
16
        lcd_gotoxy(0,3); lcd_puts("C: ");
17
        strcpy(s2, "0x"); strcat(s2, utoa(irmp_data.command,s,16));  lcd_puts(trimm_string(' ', s2, 6)); 
18
        strcpy(s2, "("); strcat(s2, utoa(irmp_data.command,s,10)); strcat(s2, "d)");
19
        lcd_gotoxy(11,3); lcd_puts(trimm_string(' ', s2, 8));
20
        lcd_gotoxy(12,4); 
21
        if(irmp_data.protocol==IRMP_RC5_PROTOCOL)
22
        {  lcd_puts("("); lcd_puts(utoa((irmp_data.address*100+irmp_data.command),s,10)); lcd_puts(")");
23
        }
24
        else
25
          lcd_puts("          ");
26
        #if IRMP_LOGGING != 0       // 1: log IR signal (scan), 0: do not (default)
27
          strcpy(temp2,"# Code: "); strcat(temp2,trimm_string(' ', irmp_protocol_names[irmp_data.protocol], 8));
28
          strcat(temp2,", A: ");  strcat(temp2,utoa(irmp_data.address,s,16)); 
29
          strcat(temp2,", C: ");  strcat(temp2,utoa(irmp_data.command,s,16)); 
30
          strcat(temp2,"\r\n");
31
          if(strlen(temp2_bak)==0)
32
          uart_puts(temp2);
33
          if (strcmp(temp2, temp2_bak)!=0)
34
          {  strcpy(temp2_bak, temp2);
35
            uart_puts(temp2);
36
                }
37
        #endif
38
        while(irmp_get_data(&irmp_data));
39
      } // if (irmp_get_data(&irmp_data))
40
      if (wait_sec)
41
      {  lcd_gotoxy(16,0); lcd_puts(trimm_string(' ', itoa(wait_sec,s,10), 3));}
42
      else
43
      {  lcd_gotoxy(0,1); lcd_puts("R: Code:             ");
44
        lcd_gotoxy(0,2); lcd_puts("A:                   "); 
45
        lcd_gotoxy(0,3); lcd_puts("C:                   ");
46
        lcd_gotoxy(0,4); lcd_puts("                     ");
47
        lcd_gotoxy(16,0); lcd_puts(trimm_string(' ', itoa(0,s,10), 3));
48
        sek10=0;
49
      }
50
    } // if(__p==_IRMP)

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

jar schrieb:
>
1
> ISR(TIMER0_OVF_vect)
2
> {  extern volatile UWORD count__;
3
>   cli();
4
>   count__++;
5
>   TCNT0 = -2;          // 2 * 256 = 512 cycle      // preload for 250µs
6
> RC5
7
>   if (! irsnd_ISR())         // call irsnd ISR
8
>   {                          // if not busy...
9
>     (void) irmp_ISR();      // call irmp 3-16µs
10
>     (void) rc5_ISR();      // call rc5 8-10µs
11
>   }
12
>   sei();
13
> }
14
>

cli() und sei() haben in einer ISR nichts zu suchen. Das macht das 
Runtime-System sowieso schon. Warum dekrementierst Du TCNT0? Wieso 
benutzt Du Timer0 und nicht Timer1? Wo ist die Timer-Initialisierung? 
Hast Du das mal ohne rc5_ISR() probiert? Funktioniert die rc5_ISR() denn 
noch? Warum benutzt Du Variablen mit fürhrendem Underscore, die in C 
prinzipiell der Runtime-Lib vorbehalten sind?

> #define IRMP_PORT                               PORTD
> #define IRMP_DDR                                DDRD
> #define IRMP_PIN                                PIND
> #define IRMP_BIT                                6

Gibt es schon lange nicht mehr! Welche Version benutzt Du da? Kann es 
sein, dass Du versuchst, eine uralte irmpconfig.h mit dem neuesten IRMP 
zum laufen zu bringen? Das geht nicht! Benutze bitte immer die 
irmpconfig.h, die auch im Source enthalten ist.

Gruß,

Frank

von jar (Gast)


Lesenswert?

Frank M. schrieb:
> cli() und sei() haben in einer ISR nichts zu suchen. Das macht das
> Runtime-System sowieso schon.

OK, bis jetzt hats auch nicht geschadet, ist historisch gewachsen

> Warum dekrementierst Du TCNT0? Wieso
> benutzt Du Timer0 und nicht Timer1?

Timer 1 ist belegt

> Wo ist die Timer-Initialisierung?
1
void timer0_init(void)      // timer use by IR Interrupts 512 ticks bei 8 MHz = 15625/s
2
{  TCCR0B = 1<<CS02;        // divide by 256
3
  TCNT0 = -2;
4
  TIMSK0 |= (1<<TOIE0);    //enable timer interrupt
5
} // void timer0_init(void)

> Hast Du das mal ohne rc5_ISR() probiert? Funktioniert die rc5_ISR() denn
> noch? Warum benutzt Du Variablen mit fürhrendem Underscore, die in C
> prinzipiell der Runtime-Lib vorbehalten sind?

hab ich irgendwann mal bei Änderungen zur besseren Auffindbarkeit 
eingeführt

>> #define IRMP_PORT                               PORTD
>> #define IRMP_DDR                                DDRD
>> #define IRMP_PIN                                PIND
>> #define IRMP_BIT                                6
>
> Gibt es schon lange nicht mehr! Welche Version benutzt Du da?

mit der funktioniert es doch, uralt ? ich weiss ja nicht
1
/*---------------------------------------------------------------------------------------------------------------------------------------------------
2
 * irmp.c - infrared multi-protocol decoder, supports several remote control protocols
3
 *
4
 * Copyright (c) 2009-2011 Frank Meyer - frank(at)fli4l.de
5
 *
6
 * $Id: irmp.c,v 1.116 2012/02/24 11:40:41 fm Exp $

> Kann es
> sein, dass Du versuchst, eine uralte irmpconfig.h mit dem neuesten IRMP
> zum laufen zu bringen? Das geht nicht! Benutze bitte immer die
> irmpconfig.h, die auch im Source enthalten ist.

logisch nutze ich die neuste(n)

irmp.c mit irmp.h
irsnd.c mit irsnd.h
irmpconfig.h

und da ich es ins unterDIR IRMP habe finden sich dort auch
irmpprotocols.h
irmpsystem.h
irmpextlog.h

die ich aber nicht weiter beachtet habe, muss ich da noch rein ?

die Pfade in der APS habe ich natürlich in der neuen Version angepasst, 
aus
#include "irmp.h" alt wurde #include "irmp\irmp.h" neu

um jedes Missverständnis seitens des Compilers zu vermeiden habe ich 
alle alten

irmp*.* zu irmp*_.* umbenannt damit sich alt und neu nicht ins Gehege 
kommen und ich notfalls Fehlermeldungen bekomme.

von Dominic A. (neo123)


Lesenswert?

Hallo zusammen,

Erst einmal vielen Dank für dieses tolle Projekt.
Doch leider ist soweit ich weiss der C18 Compiler für PIC veraltet.
Neu ist der XC8. Hat irgendjemand den Code schon für diesen Compiler 
portiert?

Wäre sehr Dankbar.

Grüsse
Neo

von eku (Gast)


Lesenswert?

Hallo Frank,

Frank M. schrieb:
> Ich habe IRMP nun dermaßen angepasst, dass nur noch das letzte Bit
> darauf geprüft wird, ob ein Denon-Wiederholungsframe vorliegt oder
> nicht. Die Änderung ist im SVN eingecheckt. Damit sollte es nun gehen.

r114 enthält nur die Testdateien aber keine Änderungen in IRMP selbst.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Hallo eku,

eku schrieb:

> r114 enthält nur die Testdateien aber keine Änderungen in IRMP selbst.

Tasächlich, habe README.txt und irmp.c beim Checkin vergessen. Habe ich 
nun nachgeholt.

Gruß und Dank,

Frank

von AnthonyVH (Gast)


Lesenswert?

First of all, excuse me for my use of English, but my German is really 
bad, especially writing.

I'm trying to get IRMP working on a TI Stellaris Launchpad (Cortex-M4 
chip), but for some reason I can't get it to recognize a signal. The IR 
receiver I'm using is a TSOP38238. My processor is running at 40 MHz.

Logging (added non-blocking UART TX code in extlog file) and callbacks 
(to toggle a LED) both work, so I know the infrared signal is being 
received. Also, when I feed the 0s & 1s string from the log into the 
irmp-15khz program, it correctly decodes the signal.

The firmware I have running right now has nothing in it except for the 
IRMP code and a very simple HD44780 LCD driver, which is not interfering 
in any way (I've tested without it as well).

Does anyone have an idea of what might be wrong?

von eku (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Frank,

Frank M. schrieb:
> Ich habe IRMP nun dermaßen angepasst, dass nur noch das letzte Bit
> darauf geprüft wird, ob ein Denon-Wiederholungsframe vorliegt oder
> nicht. Die Änderung ist im SVN eingecheckt. Damit sollte es nun gehen.

wir kommen dem Ziel näher ;) Bei drei Tasten (siehe Scan) wird ein 
falscher Gerätecode (richtig 0x10) erkannt. Ansonsten sieht es gut aus.

Gruß, eku

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Hi eku,

eku schrieb:

> wir kommen dem Ziel näher ;) Bei drei Tasten (siehe Scan) wird ein
> falscher Gerätecode (richtig 0x10) erkannt. Ansonsten sieht es gut aus.

./irmp-15kHz < sharp_15khz_probs.log

gibt aus:

-------------------------------------------------------------------
# ??? D: RX 08 000F 03E6 00 (DENON)
011111111100110
011110000011001 p= 8 (DENON), a=0x000f, c=0x03e6, f=0x00
011111111100110
-------------------------------------------------------------------
# ??? D: RX 08 000F 02CE 00 (DENON)
011111011001110
011110100110001 p= 8 (DENON), a=0x000f, c=0x02ce, f=0x00
011111011001110
-------------------------------------------------------------------
# MENU D: RX 08 0011 018E 00 (DENON)
100010110001110
100011001110001 p= 8 (DENON), a=0x0011, c=0x018e, f=0x00

Ich sehe da erstmal überhaupt keinen Fehler. Hier die Ausgabe des ersten 
Frames im Verbose-Modus:

./irmp-15kHz -v < sharp_15khz_probs.log

# ??? D: RX 08 000F 03E6 00 (DENON)
   0.133ms [starting pulse]
   1.200ms [start-bit: pulse =  5, pause = 11]
protocol = DENON, start bit timings: pulse:   3 -   7, pause:  23 -  30 
or   9 -  13
pulse_1:   3 -   7
pause_1:  23 -  30
pulse_0:   3 -   7
pause_0:   9 -  13
command_offset:  5
command_len:     10
complete_len:    15
stop_bit:         1
   1.200ms [bit  0: pulse =   5, pause =  11] 0
   3.333ms [bit  1: pulse =   5, pause =  27] 1
   5.400ms [bit  2: pulse =   4, pause =  27] 1
   7.533ms [bit  3: pulse =   5, pause =  27] 1
   9.600ms [bit  4: pulse =   5, pause =  26] 1
  11.733ms [bit  5: pulse =   6, pause =  26] 1
  13.867ms [bit  6: pulse =   5, pause =  27] 1
  15.933ms [bit  7: pulse =   4, pause =  27] 1
  18.067ms [bit  8: pulse =   5, pause =  27] 1
  20.133ms [bit  9: pulse =   4, pause =  27] 1
  21.200ms [bit 10: pulse =   5, pause =  11] 0
  22.267ms [bit 11: pulse =   5, pause =  11] 0
  24.333ms [bit 12: pulse =   5, pause =  26] 1
  26.467ms [bit 13: pulse =   5, pause =  27] 1
  27.533ms [bit 14: pulse =   5, pause =  11] 0
stop bit detected
  27.933ms code detected, length = 15
  27.933ms info Denon: waiting for inverted command repetition

Die Timings für Puls/Pause sind eindeutig, die Adresse wird korrekt 
berechnet.

Was sind das denn für ???-Tasten? Es ist durchaus üblich, dass bestimmte 
Multifunktionstasten, welche gleichzeitig für einen evtl. vorhandenen 
Receiver, DVD- oder CD-Player gültig sein sollen, eine abweichende 
Adresse verwenden. Kenne ich zum Beispiel von der FB meines 
Toshiba-Fernsehers, wo eine Fast-Forward-/Backward-Taste bei einem 
normalen Fernseher (ohne eingebauten Festplatten-Receiver) nicht 
wirklich Sinn macht, aber trotzdem vorhanden ist.

Beim Sony-Protokoll wird sogar extensiv davon Gebrauch gemacht, so dass 
ich mich damals irgendwann entschlossen habe, den kompletten 
SIRCS-Adressbereich mit ins Kommando irmp_data.command rüberzunehmen, 
weil es die Anwender total verwirrt hat, dass ein- und dieselbe FB mit 
unterschiedlichen Adressen arbeitet.

Gruß,

Frank

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

AnthonyVH schrieb:

> Logging (added non-blocking UART TX code in extlog file) and callbacks
> (to toggle a LED) both work, so I know the infrared signal is being
> received.

Perfect :-)

> Also, when I feed the 0s & 1s string from the log into the
> irmp-15khz program, it correctly decodes the signal.

Could you please append here a text file with your log? It would be nice 
if you append your UART TX code in extlog file code, too. Perhaps I can 
release it for future versions of IRMP.

> Does anyone have an idea of what might be wrong?

Did you change something in the original IRMP code? If yes, please show 
me the changes.

You could also insert some debug messages into the IRMP code. If you are 
interested, I will show you the locations where they are reasonable. But 
before you should append the logs here so that I can determine protocol, 
address & command codes.

Regards,

Frank

von eku (Gast)


Lesenswert?

Hallo Frank,

Frank M. schrieb:
> Ich sehe da erstmal überhaupt keinen Fehler.

ich würde Deine kostbare Zeit bestimnmt nicht in Anspruch nehmen, wenn 
IRMP es nicht schon einmal als 0x10 dekodiert hätte. Verwende ich die 
Gerätecodes 0x0f und 0x11 in IRSND reagiert der Sharp-TV nicht, mit 0x10 
hingegen schon.

Gruß, eku

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Hi eku,

eku schrieb:
> ich würde Deine kostbare Zeit bestimnmt nicht in Anspruch nehmen, wenn
> IRMP es nicht schon einmal als 0x10 dekodiert hätte.

Hier die IRMP-Auswertung der Taste "0" von Deiner FB:

1
10000 0101000010
2
10000 1010111101 p= 8 (DENON), a=0x0010, c=0x0142, f=0x00 checked!

Ich habe mal zwischen dem Adressteil und dem Kommandoteil ein 
Leerzeichen eingefügt. Wie man schön sehen kann, wird die Adresse im 
Wiederholungsframe nicht invertiert, das Kommando jedoch schon.

1
     10000  ergibt Adresse  0x0010
2
0101000010  ergibt Kommando 0x0142

Jetzt Deine Taste mit der Bezeichnung "???" in Deinem Scan (1. Zeile):

1
01111 1111100110
2
01111 0000011001 p= 8 (DENON), a=0x000f, c=0x03e6, f=0x00
3
4
     01111  ergibt Adresse  0x000F
5
1111100110  ergibt Kommando 0x03E6

Den Unterschied sieht man auch deutlich, wenn man im Text-Editor den 
Scan der Tasten 9 & 0 mit dem Scan der Taste "???" vergleicht (hier nur 
die ersten 5 Bits, welche die Adresse ausmachen):

1
# 9 [ 8 (DENON) 0x0010 0x0242]
2
00000111111111111111111111111110000011111111111000001111111111100000111111111110000011111111111
3
# 0 [ 8 (DENON) 0x0010 0x0142]
4
0000011111111111111111111111111000001111111111100000111111111110000011111111111000011111111111
5
# ??? D: RX 08 000F 03E6 00 (DENON)
6
0000011111111111000001111111111111111111111111110000111111111111111111111111111000001111111111111111111111111110000011111111111111111111111111

Der Adressteil für die Tasten 9 & 0 sind annähernd identisch, der Teil 
für die Taste '???' aber passt da gar nicht rein:

1
Taste 9: Pausenfolge: lang kurz kurz kurz kurz -> 1 0 0 0 0 -> Adr 0x10
2
Taste 0: Pausenfolge: lang kurz kurz kurz kurz -> 1 0 0 0 0 -> Adr 0x10
3
Taste ?: Pausenfolge: kurz lang lang lang lang -> 0 1 1 1 1 -> Adr 0x0F

Also nach Deinem Scan ergibt sich da eine ganz andere Adresse. Dazu 
braucht man noch nichtmals IRMP, das kann man schon im Text-Editor sehen 
und im Kopf dekodieren. Was mir da aber auffällt: 10000 und 01111 sind 
zueinander genau invertiert.

Die Frage ist also: Warum macht das die FB bei der Taste '???'. Bitte 
sag doch mal, was Deine Taste '???' in Wirklichkeit ist.

> Verwende ich die
> Gerätecodes 0x0f und 0x11 in IRSND reagiert der Sharp-TV nicht, mit 0x10
> hingegen schon.

Frage: Was machst Du da? Du setzt beim Senden die Adresse auf 0x10 statt 
0x0F und das Kommando auf 0x03E6 und Dein Sharp-Gerät reagiert genau so, 
als hättest Du die Taste '???' Deiner FB gedrückt?

Gruß,

Frank

von AnthonyVH (Gast)


Angehängte Dateien:

Lesenswert?

Frank M. schrieb:
> Could you please append here a text file with your log? It would be nice
> if you append your UART TX code in extlog file code, too. Perhaps I can
> release it for future versions of IRMP.

I've almost tracked down the problem, I'll explain below. But first I'll 
answer your questions.

I've attached a log with a few button presses from 2 remotes, 1 from my 
TV (SAMSUNG32 code), the other from a Western Digital Live (NEC code).

Below is the code I've added for the Stellaris Launchpad:

Replace initextlog with:
1
void initextlog (void)
2
{
3
  // Stellaris Launchpad UART setup
4
  unsigned long const baudrate = 115200;
5
6
  MAP_SysCtlPeripheralEnable (SYSCTL_PERIPH_UART0);
7
  MAP_SysCtlPeripheralEnable (SYSCTL_PERIPH_GPIOA);
8
  MAP_GPIOPinConfigure(GPIO_PA0_U0RX);
9
  MAP_GPIOPinConfigure(GPIO_PA1_U0TX);
10
  MAP_GPIOPinTypeUART (GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1);
11
  MAP_UARTConfigSetExpClk (UART0_BASE, (MAP_SysCtlClockGet ()), baudrate, (UART_CONFIG_WLEN_8 | UART_CONFIG_STOP_ONE | UART_CONFIG_PAR_NONE));
12
}

Replace sentextlog with:
1
void sendextlog (unsigned char data)
2
{
3
  // Prefer to transmit non-blocking if possible
4
  if (!MAP_UARTCharPutNonBlocking(UART0_BASE, data))
5
    MAP_UARTCharPut(UART0_BASE, data);
6
}

The MAP_ functions get compiled to inherent (ROM_) functions if 
possible, thus requiring no linking of the StellarisWare library (the 
Stellaris Launchpad chips have the complete StellarisWare library stored 
in flash). If not possible, they get replaced with links to the 
StellarisWare library and it will get linked in (at the expensense of a 
larger executable). In order to have this work correctly, you have to 
add this to your source code:
1
#include "driverlib/rom_map.h"

By the way, I believe there is a mistake in irmpsystem.h, 
TARGET_IS_BLIZZARD_RA2 should be TARGET_IS_BLIZZARD_RA1 as far as I 
know.

> Did you change something in the original IRMP code? If yes, please show
> me the changes.

I made no changes. In fact, to make sure I had no modifications 
anywhere, I removed all IRMP files, redownloaded the latest version from 
the SVN and setup the config files (and logging functions) again.

My busy loop in main is:
1
for (;;)
2
{
3
  if (irmp_get_data(&irmp_data))
4
  {
5
    MAP_UARTCharPut(UART0_BASE, 'Y');
6
    LCDWritePos('Y', 1, 2);
7
  }
8
}

> You could also insert some debug messages into the IRMP code. If you are
> interested, I will show you the locations where they are reasonable. But
> before you should append the logs here so that I can determine protocol,
> address & command codes.

That might come in handy, not sure, because I've almost tracked down the 
problem I believe. When I commented out the LCD related functions, 
suddenly IRMP started working. So, I've been doing some debugging and it 
turns out that any use of the FPU outside of IRMP will break the IRMP 
code.

The strange thing is that this shouldn't happen, because 
FPUEnableStacking() is called, which handles saving/restoring the FPU 
registers when an interrupt occurs. I'll do some more research and post 
a solution here if I find it.

Thanks for your help!

von AnthonyVH (Gast)


Lesenswert?

I've put the problem/question up on electronics.stackexchange.com as 
well. The link is: 
http://electronics.stackexchange.com/questions/57329/cortex-m4f-fpu-problems.

The past few hours of Googling haven't really helped at all. I 
discovered that compiling with -O0 breaks the decoding as well, O1 and 
higher work fine (if I remove all floating point arithmetic outside of 
the timer ISR and functions called from it).

von AnthonyVH (Gast)


Lesenswert?

Fixed! The problem turned out to be related to the stack handling. 
Changing to a different linked & startup script (found here: 
https://github.com/eehusky/Stellaris-GCC/tree/master/proj0) fixed my 
problem. So happy after 10+ hours of looking for the problem/solution 
:)!

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

AnthonyVH schrieb:
> Fixed!

Congratulations! Could you send me your changes of the complete project 
per e-mail? You will find my mail address in the header of the sources.

Thank you,

Frank

von Ulli (Gast)


Lesenswert?

Hallo,

wie wird in irmp eigentlich sicher gestellt das die empfangenen Daten 
auch nicht durch einen folgenden Empfang überschrieben werden?

Verbirgt sich hinter irmp_get_data ein Ringspeicher?

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Ulli schrieb:
> wie wird in irmp eigentlich sicher gestellt das die empfangenen Daten
> auch nicht durch einen folgenden Empfang überschrieben werden?

IRMP empfängt kein weiteres Signal, bis die Anwendung mittels 
irmp_get_data() die letzten Daten "abgeholt" hat.

Das ist im Normalfall auch gar kein Problem, da zwischen den Frames 
meist Pausen von ca. 50msec sind. Die Anwendung hat daher fast eine 
"Ewigkeit" Zeit, die Daten zu übernehmen. Man könnte natürlich leicht 
auf Anwendungsebene einen Ringbuffer implementieren, aber ich sehe dafür 
keinen Anlass.

von Dschingis (Gast)


Lesenswert?

Hallo erstmal,

ich versuche nun seit einigen Tagen IRMP für ein STM32-Discovery Board, 
lauffähig zu bekommen habe aber bisher leider keinen Erfog gehabt.

Wäre es möglich die main.c für STM32 zu erweitern?

Ich bin noch Einsteiger und habe noch so meine Probleme mit den Unmengen 
an Einstellungsmöglichkeiten.

Gruß Dschingis

von Karol B. (johnpatcher)


Lesenswert?

Dschingis schrieb:
> Wäre es möglich die main.c für STM32 zu erweitern?

Nicht, dass ich es schon probiert hätte, aber die aktuelle Codebasis 
unterstützt das STM32 doch schon. Aber zumindest laut [1] wird das STM32 
unterstützt.

Insofern gehe ich fast davon aus, dass du etwas falsch machst. Das lässt 
sich bei deiner Beschreibung ("leider keinen Erfog") natürlich nicht 
genauer sagen.

[1]: 
Beitrag "Re: IRMP - Infrared Multi Protocol Decoder"

von Dschingis (Gast)


Lesenswert?

Aktuell sind in der Beispieldatei main.c Implementierungen für AVR und 
Stellaris_ARM_Cortex_M4 enthalten.

Hier werden jeweils die Timer- und einige andere Einstellungen 
vorgenommen.

Das fehlt aber leider für die STM32 Reihe.

Außerdem verstehe ich noch nicht ganz ob ich die F_CPU einfach per 
#define setzten kann oder ob ich eine Einstellungsmöglichkeit des 
Softwarepaketes übersehen habe.

Aber prinzipiell vielen Dank für die viele Arbeit, ich bin begeistert...

von Dschingis (Gast)


Angehängte Dateien:

Lesenswert?

So, nach einiger Zeit des Testens und Fluchens...
habe ich eine lauffähige main.c für STM32 Chips erstellen können.(siehe 
Anhang)

Ich benutze das STM32VLDISCOVERY, hierbei sollte man beachten, dass man 
bei Implementierung der IRSND die Nummer des Timers auf 3 stellen muss 
(bei Out-Pin PA6).

Ich hoffe ich konnte helfen ...

Gruß Dschingis

von Conny G. (conny_g)


Lesenswert?

Hallo Frank,

ich habe vermutlich beim RECS80 einen Fehler gefunden:

es wurde vor der Adresse 1 Bit zuviel gesendet, d.h. Startbit + "1" + 
Toggle usw.
Ich habe das zusätzliche "1" entfernt (0x80) und jetzt geht es, meine 
Änderung siehe unten.

Auch das Erkennen des RECS80 funktioniert nicht, da habe ich mich aber 
noch nicht drangemacht, vermute es ist derselbe Effekt?

VG,
Konrad

1
#if IRSND_SUPPORT_RECS80_PROTOCOL == 1
2
  case IRMP_RECS80_PROTOCOL:
3
  {
4
//      toggle_bit_recs80 = toggle_bit_recs80 ? 0x00 : 0x40;
5
6
//      irsnd_buffer[0] = 0x80 | toggle_bit_recs80 | ((irmp_data_p->address & 0x0007) << 3) |
7
//            ((irmp_data_p->command & 0x0038) >> 3);                                           // STAAACCC
8
//      irsnd_buffer[1] = (irmp_data_p->command & 0x07) << 5;                                               // CCC00000
9
/**********************/
10
      toggle_bit_recs80 = toggle_bit_recs80 ? 0x00 : 0x80;
11
12
      irsnd_buffer[0] = toggle_bit_recs80 | ((irmp_data_p->address & 0x0007) << 4) |
13
            ((irmp_data_p->command & 0x003C) >> 2);                                           // TAAACCCC
14
      irsnd_buffer[1] = (irmp_data_p->command & 0x03) << 6;                                               // CC000000
15
/**********************/
16
      irsnd_busy      = TRUE;
17
      break;
18
  }
19
#endif

von Mike Sevignani (Gast)


Lesenswert?

Heute kommt einfach mal nur ein DANKE an "Frank M." von mir!
Tolles Projekt, das ich perfekt auf diversen ATmega32 umsetzen konnte.

Gruß, Mike

PS: habs noch nicht geschafft, irmp & irsend zusammen auf einen ATmega8 
zu portieren (hab hier noch einige 8er rumliegen), falls jemand etwas 
Code oder einen Link dazu hätte, wäre cool...

von jar (Gast)


Lesenswert?

Mike Sevignani schrieb:
> PS: habs noch nicht geschafft, irmp & irsend zusammen auf einen ATmega8
> zu portieren (hab hier noch einige 8er rumliegen), falls jemand etwas
> Code oder einen Link dazu hätte, wäre cool...

muss ich suchen, aber das hatte ich schon mal gemacht (kann sein mit den 
Nachfolgern m88 oder m168), woran liegts ?

ist doch selbiger source code ?

von Conny G. (conny_g)


Lesenswert?

@Mike:
ich hab's beides auf einem Atmega8 am Laufen. Ist zwar etwas eng mit 
Speicher, er ist fast voll mit wenigen Protokollen und für Logging muss 
ich immer tunen, damit der Speicher reicht, aber es geht.
Was meinst Du genau mit "nicht geschafft", wo hakt es?

von Conny G. (conny_g)


Lesenswert?

@Frank:
Es scheint am Erkennen des Bit Timing zu liegen, tappe allerdings gerade 
noch im Dunkeln an was genau, bisschen Log siehe unten.

Ansonsten auch von mir mal ein großes Kompliment für das aufwändige 
Projekt, sehr respektabel!!
1
RECS80
2
error3: timing not correct: data bit 0,  pulse: 3, pause: 23
3
error 3: timing not correct: data bit 0,  pulse: 4, pause: 17
4
RECS80
5
RECS80
6
error 3: timing not correct: data bit 0,  pulse: 4, pause: 20
7
error 3: timing not correct: data bit 0,  pulse: 3, pause: 1
8
RECS80
9
error 3: timing not correct: data bit 0,  pulse: 4, pause: 
10
RECS80
11
error 3: timing not correct: data bit 0,  pulse: 22, pause: 82
12
RECS80
13
error 3: timing not correct: data bit 0,  pulse: 3, pause: 1
14
RECS80
15
error 3: timing not correct: data bit 0,  pulse: 3, pause: 
16
RECS80
17
<1>error 3: timing not correct: data bit 1,  pulse: 5, pause: 99
18
RECS80
19
<1><0><1><0><0>error 3: timing not correct: data bit 5,  pulse: 5, pause: 100

Der letzte "Versuch" sieht ganz gut aus, aber warum es dann abbricht...?

von Conny G. (conny_g)


Lesenswert?

Vielleicht einfach Störstrahlung? Ich habe gerade die Hand darüber 
gehalten und es wurde bei ein paar Versuchen jetzt 1x ein Kommando 
erkannt....
1
RECS80
2
<1><0><1><0><0><0><1><0><0><1>Protocol: 6, Address: 2, Command: 9, Flags: 00

von Conny G. (conny_g)


Angehängte Dateien:

Lesenswert?

Tatsächlich! Wenn ich mit dem Oszi ansehe, was nach dem IR Receiver 
ankommt (TSOP 4838), dann ist das tlw. kaputt und zwar umso mehr mit 
Tageslichteinstrahlung...
Ist der TSOP 4838 dann nicht für SAA3004 geeignet??

Anbei Oszi Screenshot mit Abschirmung des Tageslichts.

von Conny G. (conny_g)


Lesenswert?

Also es scheint ein Takt von 20kHz verursachte den Fehler, mit 15 kHz 
funktioniert es jetzt.
Keine Ahnung weshalb mein Oszi diese Fehler gemessen hat, ich hatte aber 
noch etwas bei der Timerkonfiguration fehlerhaft.

Also gute News für Frank:
RECS80 interpretieren funktioniert (mit 15Khz) und mit meinem Fix von 
oben funktioniert das Senden ebenfalls.

von Conny G. (conny_g)


Lesenswert?

Allerdings ist IRSND mit 15 kHz nicht zufrieden.
Die Toleranzen auf 20% geändert, dann klappt es (s.u.).
Allerdings kann ich nicht überblicken, ob es bzgl. der 
Protokollerkennung Auswirkungen hat.
1
irmp.c
2
3
#define RECS80_START_BIT_PULSE_LEN_MIN          ((uint8_t)(F_INTERRUPTS * RECS80_START_BIT_PULSE_TIME * MIN_TOLERANCE_20 + 0.5) - 1)
4
#define RECS80_START_BIT_PULSE_LEN_MAX          ((uint8_t)(F_INTERRUPTS * RECS80_START_BIT_PULSE_TIME * MAX_TOLERANCE_20 + 0.5) + 1)
5
#define RECS80_START_BIT_PAUSE_LEN_MIN          ((uint8_t)(F_INTERRUPTS * RECS80_START_BIT_PAUSE_TIME * MIN_TOLERANCE_20 + 0.5) - 1)
6
#define RECS80_START_BIT_PAUSE_LEN_MAX          ((uint8_t)(F_INTERRUPTS * RECS80_START_BIT_PAUSE_TIME * MAX_TOLERANCE_20 + 0.5) + 1)
7
#define RECS80_PULSE_LEN_MIN                    ((uint8_t)(F_INTERRUPTS * RECS80_PULSE_TIME * MIN_TOLERANCE_20 + 0.5) - 1)
8
#define RECS80_PULSE_LEN_MAX                    ((uint8_t)(F_INTERRUPTS * RECS80_PULSE_TIME * MAX_TOLERANCE_20 + 0.5) + 1)
9
#define RECS80_1_PAUSE_LEN_MIN                  ((uint8_t)(F_INTERRUPTS * RECS80_1_PAUSE_TIME * MIN_TOLERANCE_20 + 0.5) - 1)
10
#define RECS80_1_PAUSE_LEN_MAX                  ((uint8_t)(F_INTERRUPTS * RECS80_1_PAUSE_TIME * MAX_TOLERANCE_20 + 0.5) + 1)
11
#define RECS80_0_PAUSE_LEN_MIN                  ((uint8_t)(F_INTERRUPTS * RECS80_0_PAUSE_TIME * MIN_TOLERANCE_20 + 0.5) - 1)
12
#define RECS80_0_PAUSE_LEN_MAX                  ((uint8_t)(F_INTERRUPTS * RECS80_0_PAUSE_TIME * MAX_TOLERANCE_20 + 0.5) + 1)

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Konrad G. schrieb:
> Allerdings ist IRSND mit 15 kHz nicht zufrieden.

Erstmal danke für die aufwändigen Tests. RECS80 konnte ich nie testen - 
mangels geeigneter Fernbedienung. Ich habe das Protokoll einfach mittels 
Infos aus dem Internet implementiert.

> Die Toleranzen auf 20% geändert, dann klappt es (s.u.).

Die Toleranzen sind aber nur für IRMP, nicht für IRSND. IRSND arbeitet 
mit den Idealwerten. Oder meinst Du, dass IRMP nun auch bei 20kHz das 
RECS80-Protokoll erkennt?

Es wäre große klasse, wenn Du mir Logfiles zuschicken könntest. Dann 
kann ich Deine Software-Änderungen nachvollziehen und das ganze auch 
noch weiter optimieren.

> Allerdings kann ich nicht überblicken, ob es bzgl. der
> Protokollerkennung Auswirkungen hat.

Das kann ich leicht testen, für Linux gibt es eine Test-Suite für IRMP, 
welche alle Log-Dateien, die mir vorliegen, durchcheckt und Konflikte 
bei Toleranzerhöhungen mit anderen Protokollen sofort aufdeckt.

Gruß und Dank,

Frank

von Conny G. (conny_g)


Lesenswert?

Hallo Frank,

freut mich, wenn es hilfreich ist ;-)
Ja, das meinte ich: um dieselbe Interrupt-Frequenz für beide haben zu 
können habe ich die Toleranzen für IRMP erhöht.
Logfiles: ich zeichne später das Signal auf und schicke es Dir.
D.h. LOGGING auf 1 setzen und die UART-Ausgabe Copy& Paste in eine 
Textdatei und hier als Anhang übermitteln?
Mit welcher Frequenz möchtest Du es gesampelt haben, 15 kHz, 20 kHz oder 
beides?

Übrigens handelt es sich hier um die Fernbedienung einer Schrankwand, 
die 2 Lichtkreise, 1 elektrische Schiebetür und eine Fernseher-Plattform 
(die rein und rausfährt) steuert. In der Fernbedienung ist ein SAA3004 
von Philipps.
Die Befehle sind  1T 010 001011 für die Schiebetür, 1T 010 001010 für 
die Fernseher-Plattform, 1T 010 001001 für das Licht am/im TV-Schrank 
und 1T 010 001000 für das restliche Licht.

Auf welcher Plattform empfiehlst Du IRMP/IRSND gemeinsam zu betreiben?
Ich verwende gerade ATMega8 und der ist zu klein, ich kann nur 5 
Protokolle einschalten... was nimmst Du?

VG,
Konrad

von jar (Gast)


Lesenswert?

Konrad G. schrieb:
> Ich verwende gerade ATMega8 und der ist zu klein,

du kannst doch pinkompatibel zum m168 wechseln, oder nach oben keine 
Grenzen, m1284p z.B.

von Conny G. (conny_g)


Angehängte Dateien:

Lesenswert?

Frank,

anbei die Scans in 15 und 20 kHz.

Das sind die erkannten Codes:
Protocol: 6, Address: 2, Command: 8, Flags: 00
Protocol: 6, Address: 2, Command: 9, Flags: 00

VG,
Konrad

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Konrad G. schrieb:
> anbei die Scans in 15 und 20 kHz.

Erstmal Danke.

Deine Scans sind alle 4 mit 20 kHz aufgenommen, da musst Du was falsch 
gemacht haben. Erkennt man schon daran, wenn man die Scans in den Editor 
lädt und die 15er mit den 20er von den Längen der 0en und 1en 
vergleicht. Die sind annähernd identisch.

Es reicht dann, die Toleranzen für die Pulse anzupassen, nämlich:
1
#define RECS80_START_BIT_PULSE_LEN_MIN          ((uint8_t)(F_INTERRUPTS * RECS80_START_BIT_PULSE_TIME * MIN_TOLERANCE_20 + 0.5) - 1)
2
#define RECS80_START_BIT_PULSE_LEN_MAX          ((uint8_t)(F_INTERRUPTS * RECS80_START_BIT_PULSE_TIME * MAX_TOLERANCE_20 + 0.5) + 1)
3
...
4
#define RECS80_PULSE_LEN_MIN                    ((uint8_t)(F_INTERRUPTS * RECS80_PULSE_TIME * MIN_TOLERANCE_20 + 0.5) - 1)
5
#define RECS80_PULSE_LEN_MAX                    ((uint8_t)(F_INTERRUPTS * RECS80_PULSE_TIME * MAX_TOLERANCE_20 + 0.5) + 1)

Bei den ultralangen Pausen reicht die Toleranz von 10% vollkommen aus. 
Da bedarf es keiner Anpassung.

Ich werde diese Änderung demnächst ins SVN einchecken.

In den 20er-Dateien ist ein wenig Schrott mit drin, da hast Du offenbar 
die Tasten länger gedrückt und der ScanBuffer lief zwischendurch über... 
aber kein Problem. IRMP fängt sich da wieder beim Lesen der 
Scan-Dateien.

> Das sind die erkannten Codes:
> Protocol: 6, Address: 2, Command: 8, Flags: 00
> Protocol: 6, Address: 2, Command: 9, Flags: 00

Ja, kann ich bestätigen:
1
# IR-Data/tmpsrc/irmp-20kHz < saa3004_15khz_1.txt
2
0010001000 p= 6 (RECS80), a=0x0002, c=0x0008, f=0x00
3
# IR-Data/tmpsrc/irmp-20kHz < saa3004_15khz_2.txt
4
1010001001 p= 6 (RECS80), a=0x0002, c=0x0009, f=0x00

Ich werde die 15kHz-Dateien mal künstlich erzeugen, indem ich die Längen 
in Deinen Scans um das Verhältnis 15/20 kürze. Dann teste ich nochmal 
die 15kHz-Version von IRMP.

Der IRSND kommt dann als nächstes dran. Da melde ich mich nochmal.

Zu Deiner Frage zum ATmega8:

Der ATmega8 ist veraltet und wurde von ATMEL durch den (annähernd) 
pinkompatiblen ATmega88 ersetzt. Diesen gibt es auch mit doppelter und 
vierfachem Speicher: ATmega168 und ATmega328. Meist sind die 328er sogar 
billiger als die 168er.

Vergiss den ATmega8 und ersetze ihn durch einen ATmega168 oder 
ATmega328. Diese haben auch viel mehr Möglichkeiten, was Timer und 
Interrupts betrifft.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Konrad G. schrieb:
> Allerdings ist IRSND mit 15 kHz nicht zufrieden.

Das liegt einfach daran, dass ich bisher das RECS80-Protokoll im IRSND 
für 15kHz mit der Compiler-Warnung

1
#  warning F_INTERRUPTS too low, RECS80 protocol disabled (should be at least 20000)

abgeschaltet habe. Diese Warnung hattest Du offenbar überlesen ;-)

Ich habe das nun geändert. 15kHz sind jetzt auch erlaubt.

Die korrigierte Fassung V2.3.8 ist nun im SVN eingecheckt. Kannst Du das 
bitte mal für 15kHz und 20kHz (Senden und Empfangen) testen?

Deine Fernbedienung sendet Pulse von ca. 240µs statt 158µs. Das ist 
schon eine starke Abweichung von der Norm. IRSND sendet also kürzere 
Pulse als Deine FB. Sollte Dein Gerät aber auch schlucken.

Gruß,

Frank

von Redhead (Gast)


Lesenswert?

Erstmals vielen Dank für das Projekt, es hat mir sehr weitergeholfen und 
Zeit erspart.

Ich versuche das Projekt mit STM32VLDiscovery zu realisieren. Das main.c 
von Dschingis vom 27.02.2013 funktioniert einwandfrei (ich kann 
verschiedenste Fernbedienungen erkennen).

Leider weiß ich noch nicht welche Taste ich gedrückt habe. Dafür muss 
ich wsl die IRMP_LOGGING im irmpconfig.h auf 1 setzen.

Dadurch bekomme ich im irmp.c eine Fehlermeldung da #include 
<util/setbaud.h> nicht erkannt wird.

Wenn ich die Zeile auskommentiere bekomme ich beim irmp_usart_init 
einige Fehler. Ich bin zwar ein Anfänger, glaube aber, dass diese 
usart_init nicht für den STM32 funktionieren würde, wenn ich setbaud.h 
hinzufüge. Leider weiß ich aber nicht wie ich das File irmp.c 
umschreiben muss, damit das Projekt am STM32 läuft.

Vielen Dank
Redhead

von jar (Gast)


Lesenswert?

Redhead schrieb:
> Dadurch bekomme ich im irmp.c eine Fehlermeldung da #include
> <util/setbaud.h> nicht erkannt wird.

ist ja auch nur für AVR ?

du wirst wohl nicht umhin kommen diech mit deinem STM32 und der UART 
Ausgabe zu beschäftigen

Bisher gibt es sieben STM32-Familien
http://www.mikrocontroller.net/articles/STM32

Beitrag "USART mit STM32 Discovery"

http://www.micromouseonline.com/2009/12/31/stm32-usart-basics/#axzz2NQTalW7a

von Redhead (Gast)


Lesenswert?

jar schrieb:
> du wirst wohl nicht umhin kommen diech mit deinem STM32 und der UART
> Ausgabe zu beschäftigen

ok, danke.

D.h. ich muss auch das irmp_usart_getc umschreiben. Soweit ich 
verstanden habe, wandelt irmp_usart_getc die entsprechende Taste in den 
zugehürogen Wert um (also die einser Taste in  1).

von jar (Gast)


Lesenswert?

Redhead schrieb:
> D.h. ich muss auch das irmp_usart_getc umschreiben. Soweit ich
> verstanden habe, wandelt irmp_usart_getc die entsprechende Taste in den
> zugehürogen Wert um (also die einser Taste in  1).

niemals ! welcher Code die 1 bei dir ist kann IRMP nicht wissen

für eine Taste kommt immer nur Protokoll, Address und Data Code raus

welche Taste sich dahinter verbirgt musst du notieren

Zettel , drücke Taste 1 ergibt
Protokoll, Address und Data Code

usw.

willst du das senden musst du IRSND wieder übergeben Protokoll, Address 
und Data Code

von Redhead (Gast)


Lesenswert?

jar schrieb:
> welche Taste sich dahinter verbirgt musst du notieren

ok, jetzt versteh ich es :) werde das machen

Vielen Dank

von jar (Gast)


Lesenswert?

Redhead schrieb:
> D.h. ich muss auch das irmp_usart_getc umschreiben

wieso get ? wäre doch nur für IRSND ?

IRMP schickt alles seriell raus, also irmp_usart_putc

irmp_usart_getc wäre doch für IRSND ?

also er bekommt Protokoll Address und Code an der seriellen und schickt 
es als IR raus, oder durchblicke ich gerade was nicht ?

wo hast du überhaupt
irmp_usart_getc gefunden ? ich finde das nicht, weder in irmp noch in 
irsnd ?

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

jar schrieb:
> IRMP schickt alles seriell raus, also irmp_usart_putc

irmp_usart* sind für LOGGING. Das braucht Redhead doch überhaupt gar 
nicht. Sein IRMP erkennt ja bereits Protokoll, Adresse und Kommando. Er 
braucht daher kein LOGGING der Frames.

Er muss halt seine mit IRMP ermittelten Werte irgendwo ablesen. Das kann 
ein Display sein oder eine Terminal-Emulation via RS232 - egal wie. Aber 
er soll die Finger von irmp_usart* lassen ;-)

Ich weiß ja nicht, was Redhead will. Wenn er lediglich ein paar Tasten 
seiner FB auswerten will, gibt es für ihn 2 Möglichkeiten:

1. Er sendet die nötigen Befehle über seine FB, gibt Protokoll, Adresse
   und Kommando irgendwohin aus (Display, UART oder Morsecode), schreibt
   sie auf einen Zettel und programmiert sie dann fest in sein Programm.

2. Er baut in seine Anwendung eine kleine Anlernroutine, welche
   Protokoll, Adresse und Kommando ins EEPROM schreibt. Seine
   eigentliche Anwendung liest das EEPROM dann wieder aus und checkt
   dann diese Angaben gegen die zukünftig von IRMP gelesenen Werte.

Ich halte Weg 2 für sinnvoller. Erstens ist man dann nicht auf eine 
feste Fernbedienung angewiesen und zweitens spart man sich das Display 
und den Zettel ;-)

Gruß,

Frank

von jar (Gast)


Lesenswert?

Frank M. schrieb:
> irmp_usart* sind für LOGGING.

stimmt ja LOGGING (schon wieder vergessen), geben eh nur einsen und 
nullen aus

wobei ich natürlich über die UART den Empfang von Protokoll Address und 
Code ausgebe und natürlich nicht die IRMP_UART verwende

von Redhead (Gast)


Lesenswert?

jar schrieb:
> wo hast du überhaupt
>
> irmp_usart_getc gefunden ? ich finde das nicht, weder in irmp noch in
>
> irsnd ?

Ich habe eh putc gemeint :)

Frank M. schrieb:
> irmp_usart* sind für LOGGING. Das braucht Redhead doch überhaupt gar
>
> nicht. Sein IRMP erkennt ja bereits Protokoll, Adresse und Kommando. Er
>
> braucht daher kein LOGGING der Frames.

Ahhh, ist ja eigentlich ganz simpel. Jetzt verstehe ich es auch.

Vielen Dank nochmals, dass ihr mir weitergeholfen habt

von Stefan Z. (stefan_z)


Lesenswert?

Ich habe hier grad eine Telefunken 1560 liegen und irgendwie werde ich 
nicht ganz schlau draus...
Sie wird als SIEMENS erkannt, wirft aber bei jeder Taste den selben Code 
aus.
Vermutlich erkennt er das Protokoll falsch.
Ich verwende die aktuellste Arduino-Version (die ich gefunden habe):
https://gitorious.org/arduino-addons/irmp-arduino
Protokolle habe ich alle aktiviert.

Ist die Arduino-Portierung veraltet oder ist das Protokoll einfach so 
exotisch?

Hier mal zwei unterschiedliche Tasten als Debugging-Beispiel:
IRMP test sketch
US: 50
SIEMENS Proto:17 A:2AA C:150A 0
000000000000011111111111111111111111111111100000000000111111111111111111 
111111111111100000000000011111111100000000000011111111100000000000011111 
111111111111111111111111100000000000011111111100000000000111111111111111 
111111111111111100000000000011111111110000000000011111111100000000000011 
111111111111111111111111111110000000000011111111111111111111111111111110 
000000000011111111110000000000001111111110000000000011111111110000000000 
0011111111100000000000111111111100000000000111111111111111
SIEMENS Proto:17 A:2AA C:150A 0
000000000001111111111111111111111111111111000000000001111111111111111111 
111111111111100000000000111111111000000000000011111111000000000000111111 
111111111111111111111111100000000000111111111000000000000111111111111111 
111111111111111100000000000011111111000000000000111111111111111111111111 
111111100000000000011111111000000000000111111111111111111111111111111000 
000000000111111111100000000000011111111111111111111111111111110000000000 
111111111100000000000011111111110000000000111111111110000000000011111111 
1111111111

Viele Grüße
Stefan

von Fred (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Frank,

nun habe ich das Projekt schon längere Zeit nicht mehr verfolgt aber ein
Kollege hat mich vor eine Aufgabe gestellt, die förmlich nach diesem
schreit. :-)

Er hat für seinen HTPC eine IR Fernbedienung von hama mit IR-USB 
Empfänger.
Damit lassen sich alle Funktionen des HTPC steuern. Nur wenn das Gerät
ausgeschaltet ist (ich glaub S4) kann man es mit diesem Teil nicht
einschalten.
Also hätte ich jetzt mit IRMP einen kleinen 2. Empfänger aufgebaut und
nur den Einschaltbefehl ausgewertet und den Startknopf gebrückt.

Ein Testaufbau mit einer RC6 Fernbedienung hat hier einwandfrei 
funktioniert.
Nun habe ich die hama in die Hände bekommen und scheitere am Protokoll.

Die hama hat die Nr. 00052451 und scheint ein OEM zur VRC-1100 von ORtek
zu sein.

Kennst du das Teil zufällig oder kannst mir mit dem Protokoll auf die
Sprünge helfen?

In der Hardcopy sind die ersten drei Telegramme vom Powerbefehl. Die
4. Zeile ist der OK Befehl.

Das erste Telegramm (1. Zeile) unterscheidet sich von den 
Folge-telegrammen (2. und 3. Zeile).

Eine Logdatei mit 10k hab ich auch erzeugt und angehängt.

Gruß Fred

von Stefan Z. (stefan_z)


Lesenswert?

Fred schrieb:
> Die hama hat die Nr. 00052451 und scheint ein OEM zur VRC-1100 von ORtek
> zu sein.

Alternative Idee zur IR-Umleitung:
Der Hama-Empfänger meldet sich ja als HID-Gerät beim Host an.
Ggfs. kann der Kollege ja wake-on-keyboard oder sowas am PC selber übers 
Bios einschalten. Bei mir am Mac sendet die Powertaste zumindest den 
passenden HID-Code.
Und an meinem ollen PC habe ich das erstmal explizit ausschalten müssen.

von Stefan Z. (stefan_z)


Angehängte Dateien:

Lesenswert?

Bei der Telefunken 1560 ist mir jetzt grad noch was interessantes 
aufgefallen:
Der Bedienteil unten links für allgemeine TV-Einstellungen (laut-leise, 
Farbe, etc.) wird vom TSOP nicht erkannt.
Also mal die Kamera draufgehalten und siehe da:
Er sendet, aber viel "dunkler" als bei den anderen Tasten.

Der Logic-Analyzer bringt die Lösung:
Anscheinend wird hier mit einem 400kHz Signal moduliert und eine sehr 
kurze An-Zeit genutzt (um Batterie zu sparen vermutlich.)

Anbei mal der Ausschnitt von Logic - oben das ganze Paket (um die 90 ms) 
und die Vergrößerung des 1. Bits (um die 20 µs).

Kennt das jemand, oder weiß mehr?

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Stefan Z. schrieb:
> Ich habe hier grad eine Telefunken 1560 liegen und irgendwie werde ich
> nicht ganz schlau draus...
> Sie wird als SIEMENS erkannt, wirft aber bei jeder Taste den selben Code
> aus.

Siemens ist definitiv falsch. Das Start-Bit hat nur dasselbe Timing wie 
das Siemens-Protokoll. Daher kommt IRMP vollkommen auf die falsche Spur.

> Vermutlich erkennt er das Protokoll falsch.

Ja.

> Ist die Arduino-Portierung veraltet oder ist das Protokoll einfach so
> exotisch?

Definitiv das Protokoll.

> Hier mal zwei unterschiedliche Tasten als Debugging-Beispiel:

Danke, das nächste Mal bitte als txt-Datei im Anhang, dann muss ich die 
Umbrüche nicht korrigieren.

Das Protokoll, was da benutzt wird, ist kein Bi-Phase 
(Manchester)-Protokoll (wie z.B. das Siemens-Protokoll), sondern ein 
Pulse-Distance-Protokoll.

Start-Bit: ca. 770 µs Puls, ca. 2000 µs Pause
14 Datenbits: ca. 770 µs Puls, ca. 2000 µs Pause oder ca. 620 Pause

Das Start-Bit könnte auch schon ein Datenbit sein, da es kein von den 
Datenbits abweichendes Timing hat.

Fakt ist: das Protokoll ist dem IRMP unbekannt. Ich könnte das Protokoll 
einbauen, wenn Dir die Sache mit der (sehr sehr alten?) 
Telefunken-Fernbedienung wichtig ist. Dazu brauche ich aber Deine 
Mitarbeit, nämlich eine Log-Datei mit möglichst vielen Tasten, darunter 
auch die Tasten 0-9.

Zu den "Sondertasten", die eine abweichende Modulationsfrequenz von 
400kHz verwenden:

Das hört sich ultra-exotisch an. Vermutlich wird da nicht nur eine 
andere Frequenz, sondern auch ein anderes Protokoll benutzt. Offenbar 
hast Du eine Gruppe von Tasten auf der FB, die für mehrere 
Telefunken-Geräte gelten sollen und eine weitere Gruppe, die nur für den 
Fernseher vorgesehen sind.

Wenn Du beide Gruppen auswerten willst, brauchst Du ja schon 2 
verschiedene TSOPs als IR-Empfänger - wegen den unterschiedlichen 
Modulationsfrequenzen. Das macht das Ganze dann nicht einfacher ;-)

Gruß,

Frank

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Fred schrieb:
> Die hama hat die Nr. 00052451 und scheint ein OEM zur VRC-1100 von ORtek
> zu sein.

Ich werde mal danach suchen.

> Eine Logdatei mit 10k hab ich auch erzeugt und angehängt.

Eine erste Analyse mit IRMP unter Linux zeigt:

  - Protokoll ist bisher unbekannt.
  - Es handelt sich um ein Bi-Phase (Manchester) Protokoll.
  - 1 Start-Bit, 18 Datenbits, kein Stop-Bit.

Kann ich in IRMP integrieren, wenn es unbedingt diese FB sein soll ;-)

Gruß,

Frank

von Stefan Z. (stefan_z)


Lesenswert?

Hey, danke für das flotte Feedback.

Ja die Telefunken ist exotisch - aber auch der feuchte Traum aller 
90er-Jahre Video-Enthusiasten :-)
Doku hab ich keine gefunden, aber anscheinend war die 1560 dazu da zwei 
Videorecorder zu steuern plus halt eine Glotze. Man kann Code A/B 
wählen, dann werden wirklich alle 38kHz Codes umgestellt und es gibt 
auch ein paar Zusatz-Funktionen wo Makros abgeschickt werden. Das Ganze 
wird garniert mit Uhr auf dem Display, Timerfunktionen und natürlich den 
fetten ALPS-Jogshuttle mit Feder-Ring und Drehknopf :-)
Attraktiv halt, wenn man damit seine µC-Bauten steuern möchte.

Und da Ihr ja wirklich alles an Protokollen integriert habt was zu 
finden ist, passt das doch ganz gut, oder? ;-)

Die Codes werde ich gleich mal alle aufzeichnen und ein nettes ZIP draus 
machen.

Zu den 400kHz Tasten:
Jau, das finde ich auch sehr komisch - vor allem weil ja die Fernseher 
das auch beherrscht haben müssen. Entweder konnten die Telefunken das 
zusätzlich zu den bekannten Fernbedienungen (die haben ja anscheinend in 
verschiedenen Phasen verschiedenen Protokolle genutzt), oder es gab ganz 
besondere Modelle für den Einsatz mit dieser FB. Müsste man mal in einem 
TV-Forum nachfragen...
Um das Signal zu empfangen müsste man den TSOP halt durch einen 
generischen IR-Empfänger ersetzen, der dann halt auf die 400kHz lauscht.
In der Tat ein unattraktiver Gedanke... Aber wer will heute auch schon 
noch dauernd Farbsättigung und Kontrast verstellen? :-)

Ich mach mal ne Codetabelle und Fotos...

Die Ortek-FB sollte im XBMC-Projekt komplett erfasst sein - die Hama 
tuts auf jeden Fall direkt am USB vom Raspberry mit XBMC.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Stefan Z. schrieb:
> Die Codes werde ich gleich mal alle aufzeichnen und ein nettes ZIP draus
> machen.

Es reichte eine Textdatei - garniert mit Kommentaren über jeder 
Scanzeile. Schau Dir einfach mal die Beispiel-Scan-Dateien im 
Unterverzeichnis IR-Data des IRMP-Projekts an:

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

Drücke bitte die Tasten immer nur ganz kurz, damit ich etwaige 
automatisch generierte Wiederholungsframes erkennen kann.

Als Schmankerl kannst Du dann am Schluß noch 1 oder 2 Tasten, die Du 
bereits mit kurzem Tastendruck gescannt hast, auch mal länger drücken 
und zusätzlich (mit entsprechendem Kommentar) anhängen. Dann erkenne ich 
das Timing von Wiederholungsframes besser, die durch längeres Drücken 
entstanden sind.

Gruß,

Frank

von jar (Gast)


Lesenswert?

Stefan Z. schrieb:
> Zu den 400kHz Tasten:
> Jau, das finde ich auch sehr komisch - vor allem weil ja die Fernseher
> das auch beherrscht haben müssen.

es gibt durchaus mehr Geräte die 400kHz verwenden, nur fällt mir auch 
nicht ein wie man die leicht ohne TSOP 30-40 KHz Chips verarbeiten kann

von Stefan Z. (stefan_z)



Lesenswert?

So das wären mal die wichtigsten Codes der Telefunken 1560.
Alle im Modus 50us aufgenommen.
Die Zahlentasten liefern leider keine erkennbaren 38kHz Codes - 
vermutlich wird hier auch 400kHz genutzt. Zumindest blinkt die "Senden" 
Anzeige an der FB.

Das Jog Shuttle hat eine recht Komplexe Belegung - habe ich hier erstmal 
nur im "digitalen" PROGR.-Modus reingepackt. Im JOG-Modus hat der 
Federring außen sechs Positionen pro Richtung und wirft auch noch ein 
Signal bei Rückstellung aus. Und das auch getrennt nach von links oder 
rechts Rückstellen. Schon recht pfiffig gemacht.

Das JOG-Rad sendet pro Schritt drei mal die selbe Nachricht wenn ich das 
recht erkenne.

Modus A und B unterscheiden sich auf den ersten Blick nur durch 
geänderte Start-Codes.
Für die ersten zwei tasten hab ich das mal mit reingepackt.
1-0-1-0-1-1-1-1-1 ist A und
1-0-1-0-1-1-1-0-1-1 ist B
Die Gesamt-Nachricht verlängert sich dabei um ein Bit!

Die Pausen bei Tasten-Wiederholung sind die selben wie in den bei den 
Dreier-Nachrichten.

Was mir noch aufgefallen ist:
Ab und zu sendet er eine kurze Nachricht:
000011111111111111 (IRMP 50us Modus)
Ob das so eine Art toter Mann Schalter ist?

Wenn man die Uhr stellt scheint er auch was zu senden, vermutlich auch 
in 400kHz.

Für den 400kHz-Empfang könnte man doch so einen hier nehmen, oder?
http://dx.com/p/high-sensitivity-ir-receiver-photosensitive-diode-light-sensor-for-arduino-152264
Und dann halt "zu Fuß" mit dem Arduino erkennen. (kein sonderlich 
attraktiver Gedanke)

Ansonsten ist die Fernbedienung mal ein geiles Beispiel für gute, 
deutsche Wertarbeit im goldenen Zeitalter der Unterhaltungselektronik.
Wie man am Platinenbild sehen kann wurden sogar die Vias alle 
abgedichtet.
Das Jog ist von ALPS, zum benutzten µC gibt es ein Datenblatt und auch 
sonst ist das Teil wirklich sauber verschraubt und alles.

von jar (Gast)


Lesenswert?

Stefan Z. schrieb:
> Für den 400kHz-Empfang könnte man doch so einen hier nehmen, oder?
> http://dx.com/p/high-sensitivity-ir-receiver-photo...
> Und dann halt "zu Fuß" mit dem Arduino erkennen. (kein sonderlich
> attraktiver Gedanke)

schaut so aus, wenn das IC wirklich ein LM393 ist also Komperator, dann 
ist Verstärkung schon mal gesichert, nur noch eine FFT nachschalten und 
um 400kHz und an/aus erkennen

von Stefan Z. (stefan_z)


Lesenswert?

jar schrieb:
> schaut so aus, wenn das IC wirklich ein LM393 ist also Komperator, dann
> ist Verstärkung schon mal gesichert, nur noch eine FFT nachschalten und
> um 400kHz und an/aus erkennen

Wenn man nur einen "Ausschnitt" der FFT braucht wäre das ein 
RC-Filterglied, oder?
Also 400khZ isolieren - das was der TSOP mit seiner Center-Frequenz 
macht.
Die Auswertung im µC wird dann aber nervig, weil die Pausen des Signals 
grad mal noch 375ns sind.
Wobei ich grad sehe, dass es immer die selben 8 Bits sind in einer 
400kHz Frequenz, die das "übergeordnete" Bit setzen. Die Gesamtlänge ist 
immer um die 20µS und die des Gesamt-Befehlt 90ms (was ja wiederum recht 
lang ist im Vergleich zu den Sendeimpulsen).
Man könnte also nur die Summe der Impulse als 1 werten.

Schauen wir mal....

von Timo S. (kaffeetas)


Lesenswert?

Stefan Z. schrieb:
> Wenn man die Uhr stellt scheint er auch was zu senden, vermutlich auch
> in 400kHz.

Ich habe mal kurz das Datenblatt des µC[1] mit deinem Bild 
verglichen....

Da ist als Taktquelle nur ein Uhrenquarz dran, da der Chip keinen 
internen Taktgenerator hat kann er auch nicht auf 400kHz senden.

Ist die Oberseite bestückt?

Grüße
 Timo

[1] 
http://pdf1.alldatasheet.com/datasheet-pdf/view/6889/NEC/UPD17201A.html

von Stefan Z. (stefan_z)



Lesenswert?

Timo S. schrieb:
> Da ist als Taktquelle nur ein Uhrenquarz dran, da der Chip keinen
> internen Taktgenerator hat kann er auch nicht auf 400kHz senden.
Gute Frage, ja.
Der Quarz scheint auch etwas gelitten zu haben, die Uhr geht locker um 1 
Minute pro Tag nach :-)
Werde ich mal neu bestücken müssen.
Steht nix drauf außer: KO1H

> Ist die Oberseite bestückt?
Nur mit passiven teilen wie Jog und Schaltern/Tastern und Hühnerfutter.
Siehe Bilder anbei, hab sie nochmal auseinandergenommen.

Ggfs. sind ja die 400kHz nur eine Begleiterscheinung.
Aber sie sind eindeutig real, denn die Pausen werden ja zuverlässig 
erkannt im Logic und haben auch immer die gleiche Dauer.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Stefan Z. schrieb:
> So das wären mal die wichtigsten Codes der Telefunken 1560.

Danke, XLS-Datei ist zwar suboptimal, da die Linux-/Windows-Version von 
IRMP nur TXT-Dateien frisst, aber ich habe die Daten dann selbst in eine 
TXT-Datei rüberkopiert. Beim nächsten Mal musst Du das selber machen ;-)

> Alle im Modus 50us aufgenommen.

Ähem... Du meinst mit F_INTERRUPTS = 20000? Ich hatte es vor ein paar 
Tagen so verstanden, dass die zwei Beispiel-Scans von Dir mit 
F_INTERRUPTS = 15000 aufgezeichnet wurden:

  Beitrag "Re: IRMP - Infrared Multi Protocol Decoder"

Da konnte ich auch die Kollision mit dem SIEMENS-Protokoll direkt 
nachvollziehen.

Ich habe nun anhand Deines Scans das Telefunken-Protokoll in IRMP 
eingebaut - funktioniert soweit, wenn SIEMENS im IRMP abgeschaltet ist.

Um jetzt eine Test-Version rauszugeben, brauche ich von Dir aber jetzt 
noch die Angabe des F_INTERRUPTS-Wertes.

Gruß,

Frank

von Stefan Z. (stefan_z)


Lesenswert?

Frank M. schrieb:
> Stefan Z. schrieb:
>> So das wären mal die wichtigsten Codes der Telefunken 1560.
>
> Danke, XLS-Datei ist zwar suboptimal, da die Linux-/Windows-Version von
> IRMP nur TXT-Dateien frisst, aber ich habe die Daten dann selbst in eine
> TXT-Datei rüberkopiert. Beim nächsten Mal musst Du das selber machen ;-)
>
>> Alle im Modus 50us aufgenommen.
>
> Ähem... Du meinst mit F_INTERRUPTS = 20000? Ich hatte es vor ein paar
> Tagen so verstanden, dass die zwei Beispiel-Scans von Dir mit
> F_INTERRUPTS = 15000 aufgezeichnet wurden:
Hmm nee habe das schon auf 20000 geändert. Da steht es auch jetzt noch 
bei mir.

> Da konnte ich auch die Kollision mit dem SIEMENS-Protokoll direkt
> nachvollziehen.
> Ich habe nun anhand Deines Scans das Telefunken-Protokoll in IRMP
> eingebaut - funktioniert soweit, wenn SIEMENS im IRMP abgeschaltet ist.
sweet!

> Um jetzt eine Test-Version rauszugeben, brauche ich von Dir aber jetzt
> noch die Angabe des F_INTERRUPTS-Wertes.
wie gesagt: 20000 hier in meiner config.

von Stefan Z. (stefan_z)


Angehängte Dateien:

Lesenswert?

Hier noch mal die ersten 10 Tasten als 66us Scan.
Also mit F_INTERRUPTS = 15000

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Es gibt nun im SVN eine neue IRMP-Version 2.3.9

Änderungen:

   - Neues Protokoll ORTEK (Hama)
   - Neues Protokoll TELEFUNKEN

Stefan Z. schrieb:
> Hier noch mal die ersten 10 Tasten als 66us Scan.
> Also mit F_INTERRUPTS = 15000

Danke, wird von IRMP nun einwandfrei erkannt.

Du findest im SVN im Ordner IR-Data die Datei telefunken-1560-20kHz.txt, 
in welcher alle Deine Scans aus der XLS-Datei enthalten sind. Diese 
werden von IRMP allesamt korrekt erkannt.

Bitte teste mal die neue Version.

@Fred:

Deine Hama-FB sollte nun auch erkannt werden, wenn Du das 
ORTEK-Protokoll aktivierst. Im Moment ist da noch ein kleiner Haken: 
Jeder Tastendruck erzeugt offenbar 3 Frames. Deshalb gibt IRMP im Moment 
noch alles dreifach zurück, einmal mit flags = 0x00 und zweimal mit 
flags = 0x01 (Wiederholung). Das liegt daran, dass ich von 3 speziellen 
Bits im ORTEK-Frame bisher nur 2 entschlüsselt habe. Die Funktion des 3. 
Bits ist mir im Moment noch unklar. Da muss ich also noch nachbessern.

Dafür brauche ich aber Deine Hilfe: Zeichne bitte nochmal eine beliebige 
Taste (am besten die 0) auf, indem Du diese Taste so kurz wie möglich 
drückst. Ich will mir mit den minimal 3 Frames sicher sein.

Vielen Dank und Gruß,

Frank

von Stefan Z. (stefan_z)


Lesenswert?

Frank M. schrieb:
> Du findest im SVN im Ordner IR-Data die Datei telefunken-1560-20kHz.txt,
> in welcher alle Deine Scans aus der XLS-Datei enthalten sind. Diese
> werden von IRMP allesamt korrekt erkannt.
>
> Bitte teste mal die neue Version.

Habs mal schnell in die Arduino-Lib eingebastelt und es läuft!
Super Sache, vielen Dank!

Bleibt nur noch die Frage, ob das wirklich ein eigenes 
Telefunken-Protokoll ist oder von was anderem abstammt. Oder ob es nur 
für diese Videorecorder gedacht war.

von Fred (Gast)


Lesenswert?

Frank M. schrieb:
> Eine erste Analyse mit IRMP unter Linux zeigt:
>
>   - Protokoll ist bisher unbekannt.
>   - Es handelt sich um ein Bi-Phase (Manchester) Protokoll.
>   - 1 Start-Bit, 18 Datenbits, kein Stop-Bit.
>
> Kann ich in IRMP integrieren, wenn es unbedingt diese FB sein soll ;-)

Hallo,

das wäre natürlich ganz toll. :-)

Aber wie ich gerade sehe, ist das schon im SVN enthalten?!?
Wie geht denn das? Hattest du schon eine FB greifbar?

An eine Art Manchestercodierung hatte ich auch gedacht, nur
habe ich da die Logik dahinter nicht erkannt.

Wenn ich es nun genauer ansehe, scheint es doch klar zu sein.
Mich haben die unterschiedlichen Pulse und Pausen verwirrt.

Kann ich doch noch mit Scans o.ä. behilflich sein?

Gruß Fred

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Fred schrieb:

> Aber wie ich gerade sehe, ist das schon im SVN enthalten?!?

Ja, hatte ich hier doch gestern geschrieben:

  Beitrag "Re: IRMP - Infrared Multi Protocol Decoder"

Bitte testen, bzw. die dort an Dich gerichtete Bitte ausführen ;-)

> Wie geht denn das? Hattest du schon eine FB greifbar?

Nein, aber Deine Logs, siehe hier:

  Beitrag "Re: IRMP - Infrared Multi Protocol Decoder"

> Kann ich doch noch mit Scans o.ä. behilflich sein?

Ja, siehe mein Posting von gestern, da steht:

@Fred:

Deine Hama-FB sollte nun auch erkannt werden, wenn Du das
ORTEK-Protokoll aktivierst. Im Moment ist da noch ein kleiner Haken:
Jeder Tastendruck erzeugt offenbar 3 Frames. Deshalb gibt IRMP im Moment
noch alles dreifach zurück, einmal mit flags = 0x00 und zweimal mit
flags = 0x01 (Wiederholung). Das liegt daran, dass ich von 3 speziellen
Bits im ORTEK-Frame bisher nur 2 entschlüsselt habe. Die Funktion des 3.
Bits ist mir im Moment noch unklar. Da muss ich also noch nachbessern.

Dafür brauche ich aber Deine Hilfe: Zeichne bitte nochmal eine beliebige
Taste (am besten die 0) auf, indem Du diese Taste so kurz wie möglich
drückst. Ich will mir mit den minimal 3 Frames sicher sein.

Gruß,

Frank

von Fred (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Frank,

das hab ich doch glatt überlesen :-)

Ich habe nun etwas experimentiert, die kürzeste Sequenz besteht immer
aus drei Frames. Weniger geht einfach nicht.
Wie man aber auch im Bild sieht gibt es eine Startframe(1) dann 1-x
Wiederholungsframes(2) und einen Stopframe(3).
So hat es sich bei allen Tastendrücken mit einer Taste verhalten.

Im Anhang hab ich nun einen 10k Log mit alle Tasten der Fernbedienung
durchgeführt. Es sollten immer nur drei Frames sein.

Vielleicht kann man nun die Logik anhand aller Tasten erkennen-


Gruß Fred

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Hallo Fred,

Fred schrieb:

> Ich habe nun etwas experimentiert, die kürzeste Sequenz besteht immer
> aus drei Frames. Weniger geht einfach nicht.

Okay, das hilft mir schon mal weiter.

> Wie man aber auch im Bild sieht gibt es eine Startframe(1) dann 1-x
> Wiederholungsframes(2) und einen Stopframe(3).

Ja, genau so habe ich das auch verstanden. Ob es ein Start-, 
Wiederholungs- oder Stop-Frame ist, erkennt man an zwei Bits. Bleibt 
noch das dritte unbekannte. Ich vermute, dass es ein CRC-Bit ist.

> Im Anhang hab ich nun einen 10k Log mit alle Tasten der Fernbedienung
> durchgeführt. Es sollten immer nur drei Frames sein.

Super, vielen Dank. Wenn es ein CRC-Bit ist, dann bekomme ich es raus. 
Wenn nicht, wird IRMP es einfach ignorieren. Dann habe ich aber leider 
keine (oder nur eine geringe) Chance, per IRSND den Frame beim Senden 
wieder vollständig zu rekonstruieren...

Ich melde mich, sobald ich die Bedeutung des Bits verstanden habe.

Viele Grüße,

Frank

von Fred (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Frank,

bist du schon etwas weitergekommen?

Ich habe mal versucht die Logdatei in eine lesbarere Form zu bringen.
Wenn mir da jetzt kein Fehler unterlaufen ist, sind die Frames für
die Maus ein Bit kürzer.

Nach der Startsequenz kommt 0 für Tasten und 1 für die Maus,
danach fix die 1010 und danach die 2 Bit für die Frameart.

Nun scheinen 6 Bit für den Code zu kommen und dann noch 4 Bit,
die sich nur zwischen Start und den anderen beiden Frames unterscheidet.
Also kann es eigentlich keine CRC o.ä. sein.

Anderes ist es bei der Maus, da sind es nur 5 Bit und dann diese 4 Bit.
Hier unterscheiden sie sich aber wieder zwischen Wiederholung und Ende.
Es gibt aber auch keinen Startframe.

Irgendwie verwirrt mich das Ganze. Oder habe ich einen Fehler in der 
Umsetzung?

Gruß Fred

von jar (Gast)


Lesenswert?

hallo Frank,

sollte der Test im SVN nicht mal geändert werden ?

"Auch die japanischen Hersteller haben versucht, einen eigenen Standard 
zu etablieren, nämlich das sog. Kaseikyo- (oder auch "Japan-") 
Protokoll. Dieses ist mit einer Bitlänge von 48 sehr universell und 
allgemein verwendbar. Richtig durchgesetzt hat es sich aber bis heute 
nicht. Ich selbst habe persönlich noch keine einzige Fernbedienung 
gesehen, die das Kaseikyo-Protokoll nutzt."

bei mir alle Panasonic Festplattenrecorder DMR-EX79 und DMR-EX93

sorry das ich noch mal nerve, warum gibst du das toogle bit bei RC5 
nicht aus ?, ich weiss du hast mehrere Methoden genannt wie man 
Wiederholung oder Neudrücken erkennen kann, aber warum soll das der 
Anwender machen wenn das toogle bit schon in der FB erzeugt wird ?

Es muss doch einen Grund geben warum du das toogle bit nicht ausgibst, 
für Address und Data ist es zwar nicht nötig, aber deswegen nicht 
ausgeben ? ich sehe den Grund dafür nicht, das toogle bit kann auch vom 
Anwender bei Bedarf ignoriert werden wenn nötig, es schon im IRMP zu 
unterschlagen sehe ich nicht als zwingend an.....

LG jar

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

jar schrieb:
> sollte der Test im SVN nicht mal geändert werden ?

Ja, mach ich - auch wenn ich bis heute immer noch keine FB in den Händen 
hatte, die das Kaseikyo-Protokoll verwendet.

> sorry das ich noch mal nerve, warum gibst du das toogle bit bei RC5
> nicht aus ?, ich weiss du hast mehrere Methoden genannt wie man
> Wiederholung oder Neudrücken erkennen kann, aber warum soll das der
> Anwender machen wenn das toogle bit schon in der FB erzeugt wird ?

Ganz einfach:

Weil bis auf 2 weitere Protokolle alle anderen von den über 30 
Protokollen, die IRMP unterstützt, überhaupt kein Toggle-Bit haben.

Warum soll IRMP bei 3 Protokollen die Toggle-Bits ausgeben und bei den 
anderen Protokollen den User im Regen stehen lassen?

> Es muss doch einen Grund geben warum du das toogle bit nicht ausgibst,
> für Address und Data ist es zwar nicht nötig, aber deswegen nicht
> ausgeben ? ich sehe den Grund dafür nicht, das toogle bit kann auch vom
> Anwender bei Bedarf ignoriert werden wenn nötig, es schon im IRMP zu
> unterschlagen sehe ich nicht als zwingend an.....

Dann müsste der Anwender die 3 Protokolle, die ein Toggle-Bit haben, 
anders handhaben als die anderen 29 Protokolle. Das ist doch Unsinn. 
Wenn ich eine X-beliebige FB anlernen will und die Werte Protokoll, 
Adresse und Kommando im EEPROM speichere, reicht das doch! Warum soll 
ich als Anwender jetzt noch RC5, RC6 und RECS80 anders abwickeln 
müssen als die anderen Protokolle?

IRMP hat ein einheitliches Konzept für alle unterstützten Protokolle, 
wie man lang gedrückte Tasten erkennt. Du persönlich hast leider das 
Problem, dass Du es nicht schaffst, dieses Konzept in Deinen alten 
RC5-Decoder, den Du noch verwendest, reinzubauen. Du hängst Dich viel zu 
stark an Dein altes Programm. Komm weg vom Toggle-Bit! Irgendwann ist 
Deine RC5-FB kaputt und dann nimmst Du eine NEC-FB und jammerst, dass Du 
dann gar kein Toggle-Bit mehr hast....

Also: schreib Dein Programm um, statt es zu vergewaltigen.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Fred schrieb:
> bist du schon etwas weitergekommen?

Sorry, habe am Wochenende keine Zeit dafür gefunden.

> Ich habe mal versucht die Logdatei in eine lesbarere Form zu bringen.
> Wenn mir da jetzt kein Fehler unterlaufen ist, sind die Frames für
> die Maus ein Bit kürzer.

Hast Du das manuell im Kopf gemacht?

> Irgendwie verwirrt mich das Ganze. Oder habe ich einen Fehler in der
> Umsetzung?

Kann ich Dir noch nicht sagen. Hier der Output vom IRMP, wenn ich ihn 
auf Deine Logs loslasse:
1
# Power
2
001010110011111110 p=33 (ORTEK), a=0x000a, c=0x000f, f=0x00
3
001010010011110110 p=33 (ORTEK), a=0x000a, c=0x000f, f=0x01
4
001010100011110110 p=33 (ORTEK), a=0x000a, c=0x000f, f=0x01
5
-------------------------------------------------------------------
6
# Power lang
7
001010110011111110 p=33 (ORTEK), a=0x000a, c=0x000f, f=0x00
8
001010010011110110 p=33 (ORTEK), a=0x000a, c=0x000f, f=0x01
9
001010010011110110 p=33 (ORTEK), a=0x000a, c=0x000f, f=0x01
10
001010010011110110 p=33 (ORTEK), a=0x000a, c=0x000f, f=0x01
11
001010010011110110 p=33 (ORTEK), a=0x000a, c=0x000f, f=0x01
12
001010010011110110 p=33 (ORTEK), a=0x000a, c=0x000f, f=0x01
13
001010010011110110 p=33 (ORTEK), a=0x000a, c=0x000f, f=0x01
14
001010010011110110 p=33 (ORTEK), a=0x000a, c=0x000f, f=0x01
15
001010010011110110 p=33 (ORTEK), a=0x000a, c=0x000f, f=0x01
16
001010010011110110 p=33 (ORTEK), a=0x000a, c=0x000f, f=0x01
17
001010010011110110 p=33 (ORTEK), a=0x000a, c=0x000f, f=0x01
18
001010010011110110 p=33 (ORTEK), a=0x000a, c=0x000f, f=0x01
19
001010010011110110 p=33 (ORTEK), a=0x000a, c=0x000f, f=0x01
20
001010010011110110 p=33 (ORTEK), a=0x000a, c=0x000f, f=0x01
21
001010010011110110 p=33 (ORTEK), a=0x000a, c=0x000f, f=0x01
22
001010010011110110 p=33 (ORTEK), a=0x000a, c=0x000f, f=0x01
23
001010010011110110 p=33 (ORTEK), a=0x000a, c=0x000f, f=0x01
24
001010100011110110 p=33 (ORTEK), a=0x000a, c=0x000f, f=0x01
25
-------------------------------------------------------------------
26
# ok
27
001010111011101110 p=33 (ORTEK), a=0x000a, c=0x002e, f=0x00
28
001010011011100110 p=33 (ORTEK), a=0x000a, c=0x002e, f=0x01
29
001010101011100110 p=33 (ORTEK), a=0x000a, c=0x002e, f=0x01
30
-------------------------------------------------------------------
31
# ok lang
32
001010111011101110 p=33 (ORTEK), a=0x000a, c=0x002e, f=0x00
33
001010011011100110 p=33 (ORTEK), a=0x000a, c=0x002e, f=0x01
34
001010011011100110 p=33 (ORTEK), a=0x000a, c=0x002e, f=0x01
35
001010011011100110 p=33 (ORTEK), a=0x000a, c=0x002e, f=0x01
36
001010011011100110 p=33 (ORTEK), a=0x000a, c=0x002e, f=0x01
37
001010011011100110 p=33 (ORTEK), a=0x000a, c=0x002e, f=0x01
38
001010011011100110 p=33 (ORTEK), a=0x000a, c=0x002e, f=0x01
39
001010011011100110 p=33 (ORTEK), a=0x000a, c=0x002e, f=0x01
40
001010101011100110 p=33 (ORTEK), a=0x000a, c=0x002e, f=0x01
41
-------------------------------------------------------------------
42
# 0
43
001010111010100110 p=33 (ORTEK), a=0x000a, c=0x002a, f=0x00
44
001010011010101010 p=33 (ORTEK), a=0x000a, c=0x002a, f=0x01
45
001010101010101010 p=33 (ORTEK), a=0x000a, c=0x002a, f=0x01
46
-------------------------------------------------------------------
47
# 1
48
001010111101000110 p=33 (ORTEK), a=0x000a, c=0x0034, f=0x00
49
001010011101001010 p=33 (ORTEK), a=0x000a, c=0x0034, f=0x01
50
001010101101001010 p=33 (ORTEK), a=0x000a, c=0x0034, f=0x01
51
-------------------------------------------------------------------
52
# 2
53
001010111101101110 p=33 (ORTEK), a=0x000a, c=0x0036, f=0x00
54
001010011101100110 p=33 (ORTEK), a=0x000a, c=0x0036, f=0x01
55
001010101101100110 p=33 (ORTEK), a=0x000a, c=0x0036, f=0x01
56
-------------------------------------------------------------------
57
# 3
58
001010110000010010 p=33 (ORTEK), a=0x000a, c=0x0001, f=0x00
59
001010010000011100 p=33 (ORTEK), a=0x000a, c=0x0001, f=0x01
60
001010100000011100 p=33 (ORTEK), a=0x000a, c=0x0001, f=0x01
61
-------------------------------------------------------------------
62
# 4
63
001010110101001010 p=33 (ORTEK), a=0x000a, c=0x0014, f=0x00
64
001010010101000010 p=33 (ORTEK), a=0x000a, c=0x0014, f=0x01
65
001010100101000010 p=33 (ORTEK), a=0x000a, c=0x0014, f=0x01
66
-------------------------------------------------------------------
67
# 5
68
001010110011100110 p=33 (ORTEK), a=0x000a, c=0x000e, f=0x00
69
001010010011101010 p=33 (ORTEK), a=0x000a, c=0x000e, f=0x01
70
001010100011101010 p=33 (ORTEK), a=0x000a, c=0x000e, f=0x01
71
-------------------------------------------------------------------
72
# 6
73
001010111000011010 p=33 (ORTEK), a=0x000a, c=0x0021, f=0x00
74
001010011000010010 p=33 (ORTEK), a=0x000a, c=0x0021, f=0x01
75
001010101000010010 p=33 (ORTEK), a=0x000a, c=0x0021, f=0x01
76
-------------------------------------------------------------------
77
# 7
78
001010110100101010 p=33 (ORTEK), a=0x000a, c=0x0012, f=0x00
79
001010010100100010 p=33 (ORTEK), a=0x000a, c=0x0012, f=0x01
80
001010100100100010 p=33 (ORTEK), a=0x000a, c=0x0012, f=0x01
81
-------------------------------------------------------------------
82
# 8
83
001010110101100110 p=33 (ORTEK), a=0x000a, c=0x0016, f=0x00
84
001010010101101010 p=33 (ORTEK), a=0x000a, c=0x0016, f=0x01
85
001010100101101010 p=33 (ORTEK), a=0x000a, c=0x0016, f=0x01
86
-------------------------------------------------------------------
87
# 9
88
001010111001100110 p=33 (ORTEK), a=0x000a, c=0x0026, f=0x00
89
001010011001101010 p=33 (ORTEK), a=0x000a, c=0x0026, f=0x01
90
001010101001101010 p=33 (ORTEK), a=0x000a, c=0x0026, f=0x01

Das 7. und 8. Bit ist zuständig für die Kennzeichnung des Frames:

11: Start-Frame
01: Ist n'ter Wiederholungsframe, n >= 1
10: Stop-Frame

Das letzte Bit scheint immer 0 zu sein. Das vorletzte Bit ist immer 1. 
Aber das drittletzte Bit ist mal 0, mal 1 im Start-Frame, dann 
invertiert im Wiederholungs- und Stop-Frame. Das sieht mir nach einem 
Parity-Bit aus. CRC war auch die falsche Formulierung dafür ;-)

Letzte Frage: Spuckt IRMP denn jetzt Protokoll, Adresse und Kommando bei 
Deiner HAMA-FB aus? Bitte aktiviere erstmal nur die 6 
Standard-Protokolle und ORTEK. Wenn man nämlich noch FDC aktiviert, gibt 
es einen Konflikt bei der Erkennung, den ich erst noch beseitigen muss.

Gruß,

Frank

von jar (Gast)


Lesenswert?

Frank M. schrieb:
> Warum soll IRMP bei 3 Protokollen die Toggle-Bits ausgeben und bei den
> anderen Protokollen den User im Regen stehen lassen?

verstehe ich ja, aber wenn vorhanden warum nicht ausgeben ?

dein Konzept von IRMP ist toll, IRMP absolut genial, aber ECHTE 
GELIEFERTE Daten von 3 Protokollen nur deswegen zu unterdrücken weil 
andere sie nicht liefern kanns doch auch nicht sein ?

ich verstehe ja was du schreibst aber verstehen tue ich deswegen 
trotzdem die Datenmanipulation nicht (was anderes ist es ja nicht wenn 
du Daten aus dem Datenstrom nicht weiterleitest)

von jar (Gast)


Lesenswert?

wenn du wenigstens das toogle bit als MSB im Data ausgeben würdest, das 
würde andere die es nicht brauche nicht stören, MSB einfach ignorieren 
oder als &7F FF maskieren

von jar (Gast)


Lesenswert?

ach ne, ich weiss zu wenig, damit würden ja codes um F0 00 rausfallen

ich glaube ich verstehe langsam warum du nicht ausgeben möchtest, das 
Data Code Paket ist zu klein ?

von jar (Gast)


Lesenswert?

übrigens Panasonic

Kaseikyo

die Daten von Recorder 1 und Recorder 2 unterscheiden sich im LSB ist 
ein Kommando c0 10 im einem ist es im anderen c0 11 immer LSB +1

von jar (Gast)


Lesenswert?

genauer gesagt nicht LSB sondern nibble
+0
+1
+2
+3

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

jar schrieb:
> dein Konzept von IRMP ist toll, IRMP absolut genial, aber ECHTE
> GELIEFERTE Daten von 3 Protokollen nur deswegen zu unterdrücken weil
> andere sie nicht liefern kanns doch auch nicht sein ?

Doch. Der Anwender muss sich um eventuell vorhandene Toggle-Bits nicht 
kümmern. Er wertet einfach die Flags aus. Ist im flag das Bit 
IRMP_FLAG_REPETITION gesetzt, dann handelt es sich um einen langen 
Tastendruck. Einfacher gehts nicht.

> ich verstehe ja was du schreibst aber verstehen tue ich deswegen
> trotzdem die Datenmanipulation nicht (was anderes ist es ja nicht wenn
> du Daten aus dem Datenstrom nicht weiterleitest)

Ich manipuliere keine Daten. Das Toggle-Bit von RC5 gehört weder zur 
Adresse noch zum Kommando. Und genau diese gibt IRMP zurück. Wenn ein 
Anwender ein- und dieselbe Taste mehrfach oder lang drückt, bekommt er 
IMMER dasselbe Kommando zurück.

Merkst Du eigentlich nicht, dass Du der einzige Anwender bist, der damit 
ein Problem hat? Ich weiß auch, warum: Du hast ein uraltes Programm, was 
mühsam das Toggle-Bit auswertet, um damit lange und kurze Tasten 
auszuwerten. Und Du schaffst es einfach nicht, das Programm 
umzuschreiben und einfach flags auf IRMP_FLAG_REPETITION zu testen.

von jar (Gast)


Lesenswert?

Frank M. schrieb:
> Ich manipuliere keine Daten.

ich mag nicht streiten, aber

> Das Toggle-Bit von RC5 gehört weder zur
> Adresse noch zum Kommando.

OK weiß ich und akzeptiere ich, aber ich hoffe wir sind einig das es im 
gesendeten IR Strom ist und nicht ausgegeben wird ?

wenn Infos wo ankommen aber nicht weitergeleitet werden, ist das nicht 
Zensur ? (oder darf man das nicht Datenmanipulation nennen ?)

> Merkst Du eigentlich nicht, dass Du der einzige Anwender bist, der damit
> ein Problem hat?

das weiß ich nicht !

> ...Du schaffst es einfach nicht, das Programm
> umzuschreiben und einfach flags auf IRMP_FLAG_REPETITION zu testen.

das bestreite ich nicht, ich merkte nur an das was gesendet wird nicht 
als volle Info aus IRMP kommt ;-)

von jar (Gast)


Lesenswert?

lieber oder verehrter Frank,

ich denke du bist sauer, das tut mir leid, anders kann ich mir diesen 
Satz nicht erklären:

"Auch die japanischen Hersteller haben versucht, einen eigenen Standard 
zu etablieren, nämlich das sog. Kaseikyo- (oder auch "Japan-") 
Protokoll. Dieses ist mit einer Bitlänge von 48 sehr universell und 
allgemein verwendbar. Richtig durchgesetzt hat es sich aber bis heute 
nicht - auch wenn man es hie und da im heimischen Haushalt vorfindet."

wenn ich die Popularität bei Idealo schaue
http://www.idealo.de/preisvergleich/AlleTestProdukte/4654.html?param.resultlist.sortKey=clicks

dann liegen auf Seite 1 von 15 Festplattenrecordern 10x Panasonic
un die verwenden ?

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

jar schrieb:

> OK weiß ich und akzeptiere ich, aber ich hoffe wir sind einig das es im
> gesendeten IR Strom ist und nicht ausgegeben wird ?

Es werden vom IRMP viele Bits nicht ausgegeben. Man denke nur an die 48 
Bits vom Kaseikyo-Protokoll. Da passen schon technisch gesehen nur 16 
(Adresse) + 16 (Kommando) + 4 (oberes Nibble von flags) = 36 Bits in die 
IRMP-Struct. Damit "unterdrücke" ich insg. 48 - 36 = 12 Bits!

Aber: Diese 12 Bits sind redundant, d.h. es sind CRCs und Checksums. 
IRSND kann sie beim Senden spielend aus den 36 IRMP-Bits rekonstruieren. 
Deshalb gehören sie auch nicht in die IRMP-Struct.

Genauso ist es bei Deinem popeligen Toggle-Bit. Es gehört da nicht rein! 
Auch IRSND produziert ein korrektes Toggle-Bit aus der IRMP-Struct.

> wenn Infos wo ankommen aber nicht weitergeleitet werden, ist das nicht
> Zensur ? (oder darf man das nicht Datenmanipulation nennen ?)

Zensur? Ich darf sogar ein Programm schreiben, was Dir nur ein einziges 
Bit von Deiner RC5-FB ausspuckt.

IRMP unterliegt der GPL. Du darfst es nach Herzenslust für Deine 
Bedürfnisse anpasssen. Ich verstehe nicht, warum ich mir da Arbeit 
machen soll, damit Du Dir Arbeit sparst. Du bist allein mit Deinem 
Toggle-Bit-Problem, weil Du Deine Anwendung nicht an IRMP anpasst. 
Stattdessen erwartest Du, dass ich IRMP an Deine Anwendung anpasse. So 
geht das nicht!

>> Merkst Du eigentlich nicht, dass Du der einzige Anwender bist, der damit
>> ein Problem hat?
> das weiß ich nicht !

Ich aber. Keiner der IRMP-Anwender hat bisher den Wunsch nach einem 
Toggle-Bit geäußert. Warum auch? Dafür gibt es irmp_data.flags. Das ist 
viel einfacher.

> das bestreite ich nicht, ich merkte nur an das was gesendet wird nicht
> als volle Info aus IRMP kommt ;-)

Doch, die Info Protokoll, Adresse, Kommando und langer Tastendruck ist 
da. IRMP ist kein Programm, was einen RAW-Datenstrom ausgibt. Den 
erwartest Du aber. Dann ist IRMP nicht das richtige Programm für Dich.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

jar schrieb:
> dann liegen auf Seite 1 von 15 Festplattenrecordern 10x Panasonic
> un die verwenden ?

Wahrscheinlich Kaseikyo. Ja und? Wieviel Prozent der Haushalte haben 
einen Festplattenrecorder? Frag mal lieber, wieviel Prozent einen 
Fernseher, einen CD/DVD-Player oder ein Kombigerät haben. Meine benutzen 
da alle das NEC-Protokoll.

Aber wir können ja mal eine Umfrage machen.... wer hat was zu Hause im 
realen Einsatz?

Ich lege mal vor:

Frank: 6 x NEC, 1 x Dreambox (von IRMP nicht unterstützt... seufz)

von jar (Gast)


Lesenswert?

Frank M. schrieb:
> Frank: 6 x NEC, 1 x Dreambox (von IRMP nicht unterstützt... seufz)

Jar: 3x Samsung32, 3x  Kaseikyo, 3x RC5, 1x NEC. (vom JVC TV weiss ich 
grad nicht)

von Sebastian .. (zahlenfreak)


Lesenswert?

Sebastian: 2x NEC, 2x DENON


Davon abgesehen muss ich jetzt doch mal eine Lanze für Frank brechen.

Jar, es ist absolut in Ordnung, dass du dir das Toggle-Bit für RC5 
wünschst. Ich verstehe sogar, dass es dir momentan die Arbeit leichter 
machen würde. Aber du musst auch verstehen, dass du hier jemand bittest 
Arbeit kostenlos für dich zu machen. Und das nachdem er von sich aus 
schon sehr viel Arbeit in diese Software gesteckt hat. Das ist in 
Ordnung, aber du musst verstehen, dass Frank dann selbst entscheidet, 
was er umsetzt und was nicht. Und selbst wenn er einfach keine Lust 
hätte (was meiner Ansicht nach nicht der Fall ist) müsstest du das 
Akzeptieren.
Frank hat dir sogar mehrmals erläutert, warum das Toggle-bit aus 
technischer Sicht nicht zu IRMP passt. Irgendwann sollte man 
akzeptieren, dass es nicht umgesetzt wird.
Und im Übrigen kann ich mich an keinen Fall erinnern, in dem Frank einen 
Wunsch aus dem Forum ausgeschlagen hätte, wenn er technisch sinnvoll 
unsetzbar war. Im gegenteil: Oft war die Lösung schon nach wenigen Tagen 
voll funktionsfähig in IRMP integriert. Ich selbst hatte auch schon 
Änderungswünsche. Meist hab ich dann länger gebraucht die Änderungen zu 
testen als Frank gebraucht hat, sie zu implementieren. Im Forum gibt es 
nicht viele, die ein Projekt so engagiert betreuen wie Frank. Da ist es 
absolut legitim, wenn er dann doch mal was nicht umsetzt.

Viele Grüße,

Sebastian

von Stefan Z. (stefan_z)


Lesenswert?

Sebastian ... schrieb:
> Oft war die Lösung schon nach wenigen Tagen
> voll funktionsfähig in IRMP integriert.

Da schließe ich mich an - siehe das Telefunken-Protokoll von letzter 
Woche...
Das Toggle-Bit ist einfach redundant - und fertig.
Entweder du erweiterst den Code um eine Option (bzw. Compiler-Weiche um 
den Code nicht aufzublähen), oder du passt eben deinen Code an.

von Fred (Gast)


Lesenswert?

Hallo Frank,

nun bin ich mal wieder dazugekommen etwas mit der ORTEK zu testen.
Ich habe die aktuelle Version von heute verwendet und alle Protokolle
aktiviert. Hier gibt es tatsächlich Erkennungprobleme. Also
Siemens, FDC und Netbox deaktiviert und dann klappt es.

Es wird Protokoll 0x21 und Addresse 0x000A erkannt.
Nur die Maustasten und -kreuz geben nichts zurück.

Gruß Fred

von Joachim B. (jar)


Lesenswert?

Sebastian ... schrieb:
> Sebastian: 2x NEC, 2x DENON
> Davon abgesehen muss ich jetzt doch mal eine Lanze für Frank brechen.

brauchst du nicht, ich bin ja seit IRMP durchaus ein Fan und kein 
"Gegner"

> Jar, es ist absolut in Ordnung, dass du dir das Toggle-Bit für RC5
> wünschst. Ich verstehe sogar, dass es dir momentan die Arbeit leichter
> machen würde.
> Aber du musst auch verstehen,

ne muss (oder will?) ich nicht

> du musst verstehen, dass Frank dann selbst entscheidet,
> was er umsetzt und was nicht.

das wiederum verstehe ich

> Und selbst wenn er einfach keine Lust
> hätte (was meiner Ansicht nach nicht der Fall ist)
> müsstest du das verstehen
> Frank hat dir sogar mehrmals erläutert, warum das Toggle-bit aus
> technischer Sicht nicht zu IRMP passt.

OK ich gestehe das ich kein so guter Progger bin, das ich es eben nicht 
verstehe und selbst wenn das toggle bit nur Redundanz ist, was ist 
schlecht an Redundanz ?

> Irgendwann sollte man
> akzeptieren, dass es nicht umgesetzt wird.

werde ich wohl müssen

> Und im Übrigen kann ich mich an keinen Fall erinnern, in dem Frank einen
> Wunsch aus dem Forum ausgeschlagen hätte, wenn er technisch sinnvoll
> unsetzbar war. Im gegenteil: Oft war die Lösung schon nach wenigen Tagen
> voll funktionsfähig in IRMP integriert. Ich selbst hatte auch schon
> Änderungswünsche. Meist hab ich dann länger gebraucht die Änderungen zu
> testen als Frank gebraucht hat, sie zu implementieren. Im Forum gibt es
> nicht viele, die ein Projekt so engagiert betreuen wie Frank. Da ist es
> absolut legitim, wenn er dann doch mal was nicht umsetzt.

eben weil Frank so intensiv und schnell viele Wünsche umsetzt hatte ich 
ein klein wenig Hoffnung das er evt. über meinen Wunsch noch mal 
nachdenkt und einen Weg findet es zu integrieren, klar gehen ihm die 
Bits aus, aber ich erinnere mich an eine Speziallösung wo er benötigte 
Daten in ein Nibble auslagerte, obwohl es eigentlich nicht in seine 
Datenstruktur passte.

von Jemand (Gast)


Lesenswert?

Hallo zusammen,

zuerst: IRMP ist super! Damit habe sogar ich es geschafft mit wenig 
zeitaufwand eine IR Fernbedienung in mein kleines LED Projekt 
einzubauen.

Und ndatürlich habe ich auch eine kleine Frage:
Mir scheint es also ob ein zweiter timer (hier Timer 0 bei einem Mega16) 
den Empfang stört.
1
void timer0_init (void)
2
{
3
  TCCR0 = (1<<WGM01)|(1<<CS02)|(1<<CS00);                             //CTC Modus
4
//  TCCR0 |=(1<<CS02); //Presclaer = 256
5
  OCR0=255;      //Compare Wert
6
  TIMSK=(1<<OCIE0);  //Timer starten
7
}

Wenn jedenfalls der zweite Timer läuft, klappt der Empfang nicht mehr. 
Oder liegt mein Fehler woanders?

Gruß
Joachim

von Karol B. (johnpatcher)


Lesenswert?

Jemand schrieb:
> Oder liegt mein Fehler woanders?

Ja.

Was machst du denn in der entsprechenden OC ISR? Vielleicht dauert die 
zu lange und der AVR "verschluckt" Interrupts?

Übrigens:
1
  TIMSK=(1<<OCIE0);  //Timer starten
Der Kommentar ist hier ein wenig irreführend. "Starten" tust du den 
Timer/Counter durch das Setzen eines entsprechenden Prescalers. Das 
Register TIMSK ist dafür verantwortlich, dass du verschiedene Interrupts 
in Bezug auf die Timer ein bzw. ausschalten kannst.

In deinem Fall kann es durchaus sein, dass du den Timer/Counter, welcher 
für IRMP zuständig ist, wieder deaktivierst, weil du TIMSK mit "=" und 
nicht mit "|=" beschreibst und damit eventuell vorher getätigte 
Einstellungen überschreibst.

von Jemand (Gast)


Lesenswert?

Hallo!
@Karol: 100 Punkte! :-)
Genau daran lag es. Ich habe TIMSK komplett überschrieben. Und danke für 
den Hinweis!

Gruß
Joachim

von Conny G. (conny_g)


Lesenswert?

Hallo Frank,
vielen Dank für Deine Tests und Modifikationen beim RECS80.

Ich hatte nun 2 Wochen keine Möglichkeit weiter zu machen und habe jetzt 
erstmal meine Hardware ein Stück weiter gebracht - den Prototypen meines 
mit 868 Mhz Funk angesteuerten IR-Satelliten fertig stellen.

(Ganz nebenbei, falls Dich mal interessiert, was man so mit IRMP/IRSND 
anstellt:
Zielsetzung: meine sich entwickelnde Mini-Home Automation Zentrale - 
Raspberry Pi und angeschlossene AVR-Schaltungen - soll auch IR in allen 
Räumen / für alle Geräte können, u.a. über SiriProxy, z.B. per 
Sprachkommando IR-Serien auslösen, z.B. TV/Audio auf Apple TV 
umschalten, Apple TV einschalten.
Mit Siri Funksteckdosen schalten und eine eigene 
bissle-intelligenter-als-Funksteckdose-Relaissatelliten schalten geht 
schon: "Espressomaschine ausschalten!" oder "Espressomaschine Status?" 
-> "Die Espressomaschine ist aus.", großer Spass ).

Gestern/heute habe ich die neue Version (gerade gelesen es ist schon 
nicht mehr die neueste) eingebaut und zumindest geht gerade das Senden 
des RECS80 nicht mehr, es kommt kein Signal aus dem Atmel.
Beim Durchsehen des Code habe ich die Ursache gerade aber nicht finden 
können. Ansonsten fehlte noch meine Modifikation bzgl. des doppelten 
Startbits in der neuen Version, übersehen oder Absicht?

Gerade zum Doppelcheck nochmal die meine alte Version verwendet, da 
geht's.
Wie kann ich helfen das Problem zu finden?

von Markus (Gast)


Lesenswert?

Guten Abend

Ich habe mal eine kurze Frage. Es gibt ja ein paar Protokolle die von 
IRMP und IRSND noch nicht unterstützt werden und somit auch nicht 
verarbeitet und gesendet werden können. Jetzt würde ich aber gerne so 
ein nicht unterstüzten Protokoll per IRSND senden um mein Gerät im 
Schrank zu bedienen. Meine Frage ist jetzt kann ich das irgendwie 
Software mäßig realiesieren? Ich würde gerne einfach das Signal was per 
IRMP empfangen wurde 1:1 per IRSND senden. Aber dafür muss ich es ja 
manual auf eine Trägerfrequenz z.B 36khz modellieren. Oder kann ich das 
über die Callback Funktion machen?

Gruß
Markus

von Conny G. (conny_g)


Lesenswert?

Hallo Markus,

was Du machen möchtest ist ein Repeater, wie dieser hier:
http://www.ocinside.de/go_d.html?http://www.ocinside.de/html/modding/ir_repeater/ir_repeater_d.html

diese Schaltung hab ich auch schon mal nachgebaut und funktioniert so:
der TSOP demoduliert das Signal (von den 36 od. 38 kHz) und gibt Dir die 
zugrundeliegenden 0/1.
Dahinter hat die Schaltung einen "Schwingkreis" der 38 kHz moduliert und 
dieser wird vom Signal des TSOP über einen Transistor 
ein-/ausgeschaltet.
Schliesslich verstärkt ein weiterer Transistor das Signal des 
Schwingkreises für die IR-LEDs.

Das könnte man auch über einen AVR machen:
das TSOP-Signal wird mit dem AVR empfangen und das Timing protokolliert.
Und dann entweder per Hand oder PWM die 36/38 kHz moduliert und diese 
gemäß dem aufgezeichneten Timing ein-/ausgeschaltet.

Das wäre ein Weg der ganz auf IRMP/IRSND verzichtet und wo Du das 
Protokoll etc. nicht kennen musst.

VG,
Konrad

von Conny G. (conny_g)


Lesenswert?

... vergass vorab noch zu sagen: IRMP/IRSND gehen grundsätzlich von dem 
Ansatz aus das Protokoll zu erkennen, d.h. IRSND kann nicht senden ohne 
ein implementiertes Protokoll und IRMP muss das Protokoll ebenfalls 
erkennen um die Daten aufzuzeichnen.

von Markus (Gast)


Lesenswert?

Danke Konrad

das habe ich mir fast gedacht. An einen Repeater habe ich auch schon 
gedacht. Habe nur gedacht da man ja mit IRMP auch unbekannte Protokolle 
scannen kann, man diese evtl. auch einfach wieder auf einen Träger 
modelieren und wieder senden kann. Da ich IRMP und IRSND auf jedenfall 
benötige, wollte ich versuchen auf zusätzliche Hardware zu verzichten. 
Ein weiterer Vorteil wäre gewesen das die unbekannten Signale nur dann 
gesendet würden wenn IRMP sie nicht kennt, der Repeater würde ja alle 
Signale weiterleiten.

Gruß
Markus

von Conny G. (conny_g)


Lesenswert?

Ach so... man kann mit IRMP auch unbekannte Protokolle scannen? Das ist 
mir jetzt neu, bist sicher?

von Markus (Gast)


Lesenswert?


von Karol B. (johnpatcher)


Lesenswert?

Sorry Markus, aber du scheinst hier einiges durcheinander zu bringen. 
Der "Scanner" gibt einfach nur die Hell bzw. Dunkelphasen via UART aus. 
Das ist in erster Linie eine Hilfestellung, um das Protokoll dann in 
IRMP einzupflegen. Mit dem "Kern" von IRMP bzw. IRSND hat das nichts zu 
tun.

Mir persönlich scheinst du dir selbst nicht ganz klar zu sein, was du da 
eigentlich willst. Der Ansatz von IRMP setzt - wie schon gesagt - 
voraus, dass das Protokoll erkannt bzw. unterstützt wird.

von Sebastian .. (zahlenfreak)


Lesenswert?

Was ist das denn für eine exotische Fernbedienung/Gerät?
Erstelle doch einfach mal einen Scan deiner Fernbedienung und stelle es 
hier in den Thread. Wie das geht steht im Artikel und an mehreren 
Stellen im Thread.
Frank kann sich dann das Log anschauen. In den meisten Fällen hat er 
solche Protokolle dann auch implementiert.
Ohne solch einen Scan wird IRMP/IRSND deine Fernbedienung nicht 
untersützen.

Sebastian

von Conny G. (conny_g)


Lesenswert?

Markus,
Nachtrag noch zur Repeaterschaltung oben: die Schaltung, die ich 
verlinkt habe, hat m.E. Ein paar Problemchen, ich habe sie deshalb 
modifiziert:
- der NE555 Schwingkreis ist dort ein bisschen ungewöhnlich verschaltet 
(gegenüber der NE555 Standardschaltung) und hat bei mir auch nicht 
korrekt auf 38 kHz geschwungen, hab ich als Standardschaltung 
implementiert
- die LED Verstärkerstufe verhielt sich komisch, das Signal nach dem 
Transistor war "verschmiert". Inzwischen ist mir klar, dass das daran 
liegen könnte, dass der Transistor zur sehr gesättigt wird und zu 
langsam abschaltet. Das müsste man nochmal sauber berechnen, aber 
jedenfalls war's mit einem BC337 schon mal besser als mit dem BC139.

von Markus (Gast)


Lesenswert?

Das ganze ist wegen einer Dreambox Fernbedienung die ja momentan noch 
nicht unterstützt wird. Der Grund für meine Idee ist der: Ich steuere 
einen DVD-Player und Verstärker die verdeckt stehen mit einer 
Fremdfernbedienung, mithilfe von IRMP und IRSND wandele ich die Signale 
der Fremdfernbedienung wieder um und steure damit den DVD-Player und 
Verstärker. Das alles funktioniert auch wunderbar, nur leider kann ich 
damit meine Dreambox die auch verdeckt steht nicht steuern. Meine Idee 
war deshalb, wenn IRMP das Signal nicht kennt soll es einfach 1:1 
weitergeleitet werden damit ich auch die Dreambox steuern kann. Wenn das 
ohne weiteres nicht geht werde ich einfach wie Konrad vorgeschlagen hat 
einen Repeater in meine Schaltung einbauen, die einfach alle Signale 1:1 
weiterleitet.

Ich hoffe das es jetzt ein wenig verständlicher ist.

von Stefan Z. (stefan_z)


Lesenswert?

Markus schrieb:
> Das ganze ist wegen einer Dreambox Fernbedienung die ja momentan noch
> nicht unterstützt wird. Der Grund für meine Idee ist der: Ich steuere
> einen DVD-Player und Verstärker die verdeckt stehen...

Dafür gibts aber ganz einfache und billige Fertiglösungen.
Habe sogar noch eine unbenutzt hier rumliegen. Wurde obsolet als ich 
feststellte wie toll HDMI CEC mit dem Raspberry ist :-)
http://www.amazon.de/Infrarot-Verlängerung-IRV-200-für-HiFi--Heimkino-Geräte/dp/B006806UFA/ref=sr_1_1?s=ce-de&ie=UTF8&qid=1365439805&sr=1-1&keywords=Infrarot-Verlängerung+IRV-200+für+bis+zu+3+HiFi-%2FHeimkino-Geräte

von Moritz Kerner (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Frank,
erstmal herzlichen Dank für diese tolle Programmierarbeit! Und speziell, 
dass du diese Software unentgeltlich weitergibst :-). Spende kommt 
garantiert!
Ich habe mit Hilfe deiner Software einen IR-Wandler (B&O > div. IR) 
mittels ATmega32 programmiert und funktioniert grundsätzlich auch. Nur 
so +/- jedes 20. Mal wird ein empfangener Code nicht umgesetzt? Ich habe 
vieles getestet (Toleranzen, , verschiedene Fernbedienungen, F 15kHz, F 
20kHz = etwas besser, ...) aber keine 100%ige Lösung gefunden :-/.

Deshalb übermittle ich dir hiermit einen Scan meiner B&O Fernbedienung, 
vielleicht hast du ja mal Zeit darüberzuschauen.

Vielen vielen Dank, Moritz

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Hallo Moritz,

Moritz Kerner schrieb:

> Ich habe mit Hilfe deiner Software einen IR-Wandler (B&O > div. IR)
> mittels ATmega32 programmiert und funktioniert grundsätzlich auch.

Das heisst, Du setzt Befehle einer B&O-FB auf andere Protokolle um?

> Nur so +/- jedes 20. Mal wird ein empfangener Code nicht umgesetzt?

Ich habe mir mal Deine Scans angeschaut. Nachdem ich die ganzen 
Zeilenumbrüche wieder entfernt hatte, konnte ich sie auch verwenden ;-)

15kHz ist okay, das reicht. Die Timings sind sehr gut, sie stimmen 
ziemlich genau mit den theoretischen Werten überein. Die Toleranzen 
brauchst Du da auch nicht anzupassen, die gewählten reichen. Die FB ist 
vom Timing her auch sehr genau.

Hier ein Output vom Linux-IRMP:
1
-------------------------------------------------------------------------------
2
START PULSES:
3
  3 oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo 8
4
pulse avg:  3.0= 200.0 us, min:  3= 200.0 us, max:  3= 200.0 us, tol:  0.0%
5
-------------------------------------------------------------------------------
6
START PAUSES:
7
 44 oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo 7
8
 45 oooooooo 1
9
pause avg: 44.1=2941.7 us, min: 44=2933.3 us, max: 45=3000.0 us, tol:  2.0%
10
-------------------------------------------------------------------------------
11
PULSES:
12
  3 oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo 160
13
  4 ooo 8
14
pulse avg:  3.0= 203.2 us, min:  3= 200.0 us, max:  4= 266.7 us, tol: 31.3%
15
-------------------------------------------------------------------------------
16
PAUSES:
17
 44 oooooooooooooooooooooo 25
18
 45 oo 3
19
pause avg: 44.1=2940.5 us, min: 44=2933.3 us, max: 45=3000.0 us, tol:  2.0%
20
 91 oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo 66
21
 92 ooooooooooooooooooooooooooooooo 35
22
pause avg: 91.3=6089.8 us, min: 91=6066.7 us, max: 92=6133.3 us, tol:  0.7%
23
-------------------------------------------------------------------------------

Dass da ab und zu etwas nicht erkannt wird, muss an etwas anderem 
liegen. Ich hatte jedenfalls bei Deinen Scans eine Erkennungsrate von 
100%.

Kannst Du mal Deine irmpconfig.h, irsndconfig.h und Deine ISR zeigen? 
Vielleicht auch noch die main-Funktion...

Gruß,

Frank

von Conny G. (conny_g)


Lesenswert?

Hallo Frank,
meinen Post vom 3.4. schon gesehen?
Vg,
Konrad

von eku (Gast)


Lesenswert?

Hallo Frank,

ich inkludiere die IRMP Sourcen in ein Hauptprogramm, damit der Compiler 
besser optieren kann. Seit der Implementierung des ROOMBA Protokolls 
erhalte ich folgende Warnungen:

irsnd.c:366:0: warning: "ROOMBA_1_PAUSE_LEN" redefined [enabled by 
default]
 #define ROOMBA_1_PAUSE_LEN                      (uint8_t)(F_INTERRUPTS 
* ROOMBA_1_PAUSE_TIME + 0.5)
 ^
irmp.c:412:0: note: this is the location of the previous definition
 #define ROOMBA_1_PAUSE_LEN                      ((uint8_t)(F_INTERRUPTS 
* ROOMBA_1_PAUSE_TIME))
 ^
irsnd.c:367:0: warning: "ROOMBA_0_PAUSE_LEN" redefined [enabled by 
default]
 #define ROOMBA_0_PAUSE_LEN                      (uint8_t)(F_INTERRUPTS 
* ROOMBA_0_PAUSE_TIME + 0.5)
 ^
irmp.c:417:0: note: this is the location of the previous definition
 #define ROOMBA_0_PAUSE_LEN                      ((uint8_t)(F_INTERRUPTS 
* ROOMBA_0_PAUSE_TIME))
 ^

Diese Redefinitions treten nur beim ROOMBA Protokoll auf. Warum befinden 
sich diese nicht in irmpprotocols.h? Kannst Du die 
Namensüberschneidungen bitte lösen.


Gruß, eku

von Moritz Kerner (Gast)


Lesenswert?

Danke vorerst Frank,

>Kannst Du mal Deine irmpconfig.h, irsndconfig.h und Deine ISR
>zeigen? Vielleicht auch noch die main-Funktion...

werde ich dann gerne machen, vorher ändere ich mein Programm aber 
nochmal auf die Ausgabe mittels simpler Toggle-LED, damit ich Störungen 
in der Senderoutine ausschließen kann! Wird aber inkl. der Test's etwas 
dauern, läuft ja nichts davon...

Melde mich wieder & besten Dank, Moritz K.

von Conny G. (conny_g)


Lesenswert?

Hallo Frank,

ich habe folgende Frage zum SIRCS Protokoll - Sony arbeitet doch damit, 
richtig?

Es geht da um einen Sony Home Theater Receiver, den DAV-DZ260. Der hat 
wie viele Geräte keine absolute Lautstärkeneinstellung (wenn's das doch 
gibt als Discretes -her damit!) und so muss ich zum klarstellen des 
Lautstärkelevels auf Null fahren und wieder hoch auf X.
Dazu muss ich also die "Vol Down" Sequenz ca. 35x senden und dann zB 12x 
"Vol Up".

Das habe ich über die IRSND Flags versucht, also data.flags = 4 für 4 
Wiederholungen.
Und seitens des Receivers wird das aber als 1x oder maximal 2x Drücken 
verstanden, ich vermute da ist noch eine Entprell-Logik am Werk.
Mit der Fernbedienung funktioniert das aber wunderbar.

Ohne es noch weiter mit Oszi etc. untersucht zu haben, hast Du da einen 
Tipp wie es geht oder an was es liegt oder ob die einzelnen Geräte sich 
hier verschieden verhalten?

Da gibt's doch die Sache mit dem Toggle-Bit und im Code fand ich 
Hinweise, dass bei SIRCS Repeat erst ab 4 Wiederholungen erkannt wird. 
Muss ich dann für x Wiederholungen ein Repeat von 3+x einstellen? (Hab 
ich auch ausprobiert, hat auch nicht funktioniert). Oder 4 * x?
Aber eigentlich dürfte ich mich ausserhalb von IRSND nicht um das 
kümmern müssen, das sollte gekapselt sein, damit ich ausserhalb das 
Protokoll nicht verstehen muss.

Ich habe mir einstweilen damit beholfen, dass mein uC-basierter Sender 
halt dann eine Schleife mit Wartezeit 200ms durchläuft, das geht ok, ist 
m.E. aber ein Hack.
Einerseits dauert es etwas länger als mit der Fernbedienung die Taste 
gehalten, andererseits riecht es danach, dass andere Geräte sich hier 
anders verhalten könnten.
Deshalb würde ich schon gerne die richtige Lösung finden.

Danke & Grüße,
Konrad

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Hallo Konrad,

Konrad G. schrieb:

> ich habe folgende Frage zum SIRCS Protokoll - Sony arbeitet doch damit,
> richtig?

Ja.

> Es geht da um einen Sony Home Theater Receiver, den DAV-DZ260. Der hat
> wie viele Geräte keine absolute Lautstärkeneinstellung (wenn's das doch
> gibt als Discretes -her damit!) und so muss ich zum klarstellen des
> Lautstärkelevels auf Null fahren und wieder hoch auf X.
> Dazu muss ich also die "Vol Down" Sequenz ca. 35x senden und dann zB 12x
> "Vol Up".

Beachte bitte, dass beim Senden nur die unteren 4 Bits von flags für den 
Wiederholungsfaktor genutzt werden. Der maximale Wiederholungsfaktor ist 
also 15. Damit können maximal lediglich 1 + 15 = 16 gleiche Befehle mit 
einem irsnd_send() gesendet werden.

Bei SIRCS speziell ist, dass mindestens 3 Frames gesandt werden, d.h. 
der erste Frame (und nur der erste!) wird automatisch 2x wiederholt - 
eben deshalb, weil SIRCS nichts kürzeres als 3 Frames kennt.

Damit sind es also 1 + 2 + 15 = 19 Frames, die tatsächlich rausgehen, 
wenn Du flags auf 15 setzt.

flags = 0:   3 Frames -> 1 Lautstärkestufe
flags = 1:   4 Frames -> 2 Lautstärkestufen
...
flags = 15: 19 Frames -> 16 Lautstärkestufen

Bei Flags = 15 sollte also die Lautstärke 16 mal höher/niedriger sein 
als vorher. IRSND bildet das damit transparent ab. Die Tatsache, dass 
auch bei kürzestem Tastendruck auf der FB 3 Frames rausgesandt werden, 
was lediglich eine Lautstärkenänderung von 1 Stufe bewirken sollte, ist 
rein intern und muss den Anwender eigentlich nicht kümmern.

> Das habe ich über die IRSND Flags versucht, also data.flags = 4 für 4
> Wiederholungen.

Damit hast Du lediglich eine Änderung von 1 + 4 = 5 Lautstärkestufen.

> Und seitens des Receivers wird das aber als 1x oder maximal 2x Drücken
> verstanden, ich vermute da ist noch eine Entprell-Logik am Werk.
> Mit der Fernbedienung funktioniert das aber wunderbar.

Ich kann mir das nur erklären, dass die Pausen zwischen den Frames beim 
Senden zu kurz sind. Ich habe da mangels SIRCS-FB keine genauen Daten.

Hilfreich wäre daher ein Scan mit IRMP Deiner Fernbedienung:

  - Vol+: Einmal kurz gedrückt (so kurz wie möglich!)
  - Vol+: Einmal lang gedrückt
  - Vol-: Einmal kurz gedrückt (so kurz wie möglich!)
  - Vol-: Einmal lang gedrückt

> Da gibt's doch die Sache mit dem Toggle-Bit und im Code fand ich
> Hinweise, dass bei SIRCS Repeat erst ab 4 Wiederholungen erkannt wird.

SIRCS kennt kein Toggle-Bit. Die Anzahl der Wiederhoungen bei kurz 
gedrückter Taste wurden aus diversen Scans empirisch ermittelt, da die 
Internet-Quellen hier widersprüchlich sind.

> Muss ich dann für x Wiederholungen ein Repeat von 3+x einstellen? (Hab
> ich auch ausprobiert, hat auch nicht funktioniert).

Nein, IRSND sollte den Frame bei flags = 0 insgesamt 3 mal rausschicken, 
wobei die Pause zwischen den Frames ca. 25ms betragen. Bei flags = N 
sollten 3 + N Frames rausgeschickt werden.

Ich habe das unter Linux gerade mal getestet und festgestellt, dass das 
Senden für flags > 1 bei SIRCS fehlerhaft ist. IRSND vergisst dann ab 
dem 3+Nten Frame, eine Pause einzulegen. Die Daten "überstürzen" sich 
also. Das würde auch erklären, warum Dein Gerät nur 1 bis max. 2 
Wiederholungen erkennt.

Ich schaue, dass ich den Fehler kurzfristig behebe und melde mich dann 
nochmal.

Trotzdem wäre ein Scan von Deiner Seite aus ganz hilfreich für mich.

Viele Grüße,

Frank

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Konrad G. schrieb:

> Ohne es noch weiter mit Oszi etc. untersucht zu haben, hast Du da einen
> Tipp wie es geht oder an was es liegt oder ob die einzelnen Geräte sich
> hier verschieden verhalten?

Hier ein kurzer Bugfix:

Ersetze bitte in irsnd.c
1
   else if (packet_repeat_pause_counter < repeat_frame_pause_len)

durch
1
   if (auto_repetition_counter == 0 && packet_repeat_pause_counter < repeat_frame_pause_len)  // NOT else!

und berichte dann, ob bei Setzen von flags = N genau N+1 
Lautstärkestufen durchlaufen werden.

Gruß,

Frank

von Conny G. (conny_g)


Lesenswert?

Frank,
vielen Dank! Probier ich gg. Ende der Woche!
Vg,
Konrad

von Uwe B. (derexponent)


Lesenswert?

Hi Frank,

erstmal großes LOB von meiner Seite für IRMP und IRSND
...funktioniert super

ich habe beide am STM32F4 Discovery Board am laufen
und da ist mir aufgefallen das im File "irsndconfig.h"
(wenn der Define auf ARM_STM32 gesetzt ist)

der Timer-10 Channel-1 benutzt wird
und als Port-Pin der PA6

beim STM32F4 liegt aber der Timer-10 CH-1 an PB8
somit funktioniert das ganze also nicht
(nach abändern der Defines auf PB8 geht alles wunderbar)

allerdings bin ich nicht sicher ob das jetzt nur beim F4 so ist
und beim F3 (oder F2) event. der PA6 stimmt

nur als "Hinweis" falls da jemand Fehler sucht

Gruss Uwe

von Michael K. (Gast)


Lesenswert?

@ Uwe B.
Ich hatte den Code für einen STM32L1xx angepasst und bei dieser 
Gelegenheit gleich für STM32F1xx und STM32F4xx vorbereitet, allerdings 
ohne ihn auf diesen beiden zu testen. Beim STM32L1xx liegt Timer 10 Ch. 
1 eben an PA6.

Musstest du sonst noch etwas anpassen, oder lief es dann auf Anhieb?

von Uwe B. (derexponent)


Lesenswert?

>Musstest du sonst noch etwas anpassen, oder lief es dann auf Anhieb?

bei IRMP habe ich die UART-Ausgabe für den STM32F4 noch aktiviert
falls "IRMP_LOGGING" enabled wird

ich habe allerdings nicht das File "irmpextlog" dazu benutzt
sondern die UART-Funktionen direkt in "irmp.c" geschrieben

da gibt es ja schon "irmp_uart_init" und "irmp_uart_putc"

ich hab dazu einfach einen Define
dazugeschrieben, das war für mich am einfachsten
1
#if defined(ARM_STM32F4XX)



ansonsten läuft alles wunderbar

Gruss

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Hallo Uwe,

Uwe B. schrieb:

> erstmal großes LOB von meiner Seite für IRMP und IRSND
> ...funktioniert super

Danke, freut mich.

> ich habe beide am STM32F4 Discovery Board am laufen
> und da ist mir aufgefallen das im File "irsndconfig.h"
> (wenn der Define auf ARM_STM32 gesetzt ist)
>
> der Timer-10 Channel-1 benutzt wird
> und als Port-Pin der PA6
>
> beim STM32F4 liegt aber der Timer-10 CH-1 an PB8
> somit funktioniert das ganze also nicht
> (nach abändern der Defines auf PB8 geht alles wunderbar)

Okay, dann muss man das für den F4 wohl ändern, wenn ich da jetzt 
Michaels Antwort richtig verstanden habe. Gibt es da eine 
Preprocessor-Konstante, um den F4 vom L1 zu unterscheiden, die man 
abfragen könnte?

Die UART-Anpassung wäre natürlich auch noch interessant für andere 
Anwender. Könntest Du mir Deine Änderungen zuschicken? Meine 
eMail-Adresse findest Du jeweils im Header der Source-Files.

Viele Grüße,

Frank

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Uwe B. schrieb:

> ich hab dazu einfach einen Define
> dazugeschrieben, das war für mich am einfachsten
>
1
> #if defined(ARM_STM32F4XX)
2
>

D.h. ARM_STM32F4XX ist bei Dir bereits automatisch gesetzt? Und beim F2 
wäre das dann ARM_STM32F2XX und beim L1 dann ARM_STM32L1XX?

Wenn ja, wäre das ja optimal, um die Varianten zu unterscheiden.

Gruß,

Frank

von Uwe B. (derexponent)


Lesenswert?

Hi Frank,

>D.h. ARM_STM32F4XX ist bei Dir bereits automatisch gesetzt?

Ja, die ist gesetzt

die anderen für F1, F2, L1 kann ich nicht verifizieren
(ich vermute aber die funktionieren auch)

den Quellcode für die UART kann ich dir
heut abend zusenden der wäre dann aber auch nur für den F4
weil ich nicht genau weis ob die anderen STM32 an den
gleichen Pins hängen

von Michael K. (Gast)


Lesenswert?

Frank M. schrieb:
> Gibt es da eine Preprocessor-Konstante, um den F4 vom L1 zu
> unterscheiden, die man abfragen könnte?

Siehe irmpsystem.h Zeile 29, 36 und 40.

Ist ein bisschen mit der Kirche ums Dorf: erst auf die zig anderen 
Symbole zu überprüfen (z.B. Zeile 30-33) und dann auch noch ein weiteres 
zu generieren (z.B. ARM_STM32F10X), aber sonst müsste man im Code selber 
immer auf die ganzen Derivate hin überprüfen.

Falls das nicht gefällt, kann es ja entsprechend geändert werden, dann 
fallen die zusätzlichen Symbole weg.

Lässt sich sicher drüber streiten was aus welchen Gründen besser ist.

von m-joy (Gast)


Lesenswert?

Guten Tag,

ich würde den IRMP gerne mit einem PIC32MX795 @ 80Mhz benutzen. Ist dies 
möglich? Welchen Pin sollte ich dafür vorsehen?

Viele Grüße

von m-joy (Gast)


Lesenswert?

Kein PIC experte unterwegs? xD

von Moritz Kerner (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Frank,

jetzt sind zwar schon ~4 Monate vergangen, ich hoffe du erinnerst dich 
noch. Es ging um die Umwandlung der B&O-Befehle auf andere Formate 
(Samsung32, RC5).

>Kannst Du mal Deine irmpconfig.h, irsndconfig.h und Deine ISR
>zeigen? Vielleicht auch noch die main-Funktion...

Ich hab mal in der MAIN unnötige Zeilen entfernt (im Prinzip nur einen 
Sendebefehl stehen lassen) und alles als ZIP angehängt.

Ich habe inzwischen durch Versuche rausgefunden, es liegt NICHT am 
Empfang der B&O-Befehle, sondern mit dem Senden hakt es so jedes ~20. 
mal :-/.

Sollte dir im Code etwas auffallen, dann wäre dies genial! Wiederum: 
eilt nicht...

Besten Dank, Moritz K.

von Jing J. (jingjok)


Lesenswert?

IRMP auf PIC und MikroC Pro

Hallo und erstmal vielen Dank an Frank fuer diese grossartige Library.

Ich habe IRMP 2.3.8 (nur den Empfaenger) auf einem PIC 16F1825 zum 
laufen gebracht und habe einige Kommentare / Fragen...

Zuerst zum PIC - ein anderer Forumsbesucher fragte danach – IRMP 
funktioniert bei mir gut mit dem oben genannten PIC, dieser ist wohl der 
kleinte (i.e billigste) PIC auf dem man IRMP zum laufen bekommen kann 
(wenn man weniger Protokolle braucht kann man sogar den 4K PIC 16F1824 
benutzen). Ich habe verschiedene Taktraten ausprobiert und 
herausgefunden, das der PIC mit 32 Mhz betrieben werden muss, sonst 
kommt der neue Interrupt bevor die ISR fertig abgearbeitet ist. Man 
sollte den PIC Timer2 benutzen, da dieser nicht jedes Mal in der ISR neu 
geladen werden muss. Damit ist das Timing einfacher in den Griff zu 
bekommen.

Ich benutzte Mikroe MikroC Pro for PIC Compiler, falls jemand 
interessiert ist hier die notwendigen Aenderungen im IRMP Code fuer 
MikroC :

- Am Anfang von irmp.h habe ich die folgende Zeile zugefuegt, dies setzt 
den Compiler auf CCS, welcher zu MikroC am aehnlichsten ist.
#define _PCH_  // force the CCS compiler

- MikroC kommt mit der folgenden Zeile nicht zurecht :
IRMP_PARAMETER *irmp_param_p = (IRMP_PARAMETER *) 0;
Nach dem Aufsplitten in 2 Zeilen funktioniert es :
IRMP_PARAMETER *irmp_param_p;
irmp_param_p = (IRMP_PARAMETER *) 0;

- MikroC versucht eine Variable heraus zu optimieren, welche 
offensichtlich benoetigt wird, ich habe den Optimisation Level auf 0 
gesetzt, um dies zu vermeiden.

- Die Port definition unter der Zeile
#elif defined (PIC_CCS)
in irmpconfig.h muss auf
#define IRMP_PIN PORTA.B0
(oder irgendeienen anderen Port) geaendert warden

- Die Zeile #include <string.h> in irmpsystem.h muss auskommentiert 
werden, weil string Funktionen automatisch eingebunden werden, dazu 
muessen die Library C_String (und C_Stdlib, C_Type) im Library Manager 
angewaehlt sein.

- Im gleichen File muss die 3. Zeile in dem Block
#if defined(PIC_CCS) || defined(PIC_C18) || defined(ARM_STM32) || 
defined(STELLARIS_ARM_CORTEX_M4)
typedef unsigned char                   uint8_t;
typedef unsigned short                  uint16_t;
#endif
Geandert werden auf :
...
typedef unsigned int                  uint16_t;
...

Frank, wenn Interesse besteht kann ich auch den neuen Code in den 
Original Code mit einer neuen Konstante fuer den MikroC Compiler 
einbauen.

Ich habe noch ein Paar Fragen...
- Wofuer ist die Konstante F_CPU da ? Sie scheint nirgends benutzt zu 
werden.

- Wenn irmp_get_data das allererste Mal aufgerufen wird nach einem 
Reset, gibt es bei mir TRUE zurueck und die Parameter enthalten Garbage. 
Wo koennte das Problem liegen ?

- Ich habe alle meine Fernbedienungen ausprobiert und die meisten 
funtionieren einwandfrei, bis auf meine Samsung Set-Top Box HD-5200C. 
IRMP reagiert ueberhaupt nicht darauf. Kann mir jemand bestaetigen, das 
diese nicht unterstuetzt wird oder ob diese funtionieren sollte und 
meine Codeaenderungen fuer MikroC noch Probleme haben ?

    Vielen Dank !

von jar (Gast)


Lesenswert?

Jing Jok schrieb:
> Ich habe noch ein Paar Fragen...
> - Wofuer ist die Konstante F_CPU da ? Sie scheint nirgends benutzt zu
> werden.

überall im Timer init in Uart usw.

Frank rechnet ja alles auf die Interrupts

in IR_send
#define IRSND_FREQ_32_KHZ                       (uint8_t) ((F_CPU / 
32000 / 2) - 1)
#define IRSND_FREQ_36_KHZ                       (uint8_t) ((F_CPU / 
36000 / 2) - 1)
#define IRSND_FREQ_38_KHZ                       (uint8_t) ((F_CPU / 
38000 / 2) - 1)
#define IRSND_FREQ_40_KHZ                       (uint8_t) ((F_CPU / 
40000 / 2) - 1)
#define IRSND_FREQ_56_KHZ                       (uint8_t) ((F_CPU / 
56000 / 2) - 1)
#define IRSND_FREQ_455_KHZ                      (uint8_t) ((F_CPU / 
455000 / 2) - 1)

in irmpsystem.h
#elif defined(TARGET_IS_BLIZZARD_RA2) 
// TI Stellaris (tested on Stellaris Launchpad with Code Composer 
Studio)
#  define STELLARIS_ARM_CORTEX_M4
#  define F_CPU (SysCtlClockGet())

in irsndmaim.c
#if defined (_AVR_ATtiny45_) || defined (_AVR_ATtiny85_) 
// ATtiny45 / ATtiny85:
    OCR1C   =  (F_CPU  F_INTERRUPTS  4) - 1; 
// compare value: 1/15000 of CPU frequency, presc = 4
    TCCR1   = (1 << CTC1) | (1 << CS11) | (1 << CS10); 
// switch CTC Mode on, set prescaler to 4

von Achill (Gast)


Angehängte Dateien:

Lesenswert?

Ich verwende diese lib mit Atmel Software Framework auf dem evalbord 
xmega-a1 Xplained. Mit Atmel Studio 6.1

Empfang funktioniert gut, mit dem Senden hatte ich aber Probleme.
Wenn jemand das im svn einbauen will, nur zu.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Hallo Moritz,

Moritz Kerner schrieb:

> jetzt sind zwar schon ~4 Monate vergangen, ich hoffe du erinnerst dich
> noch. Es ging um die Umwandlung der B&O-Befehle auf andere Formate
> (Samsung32, RC5).

Ja, ich erinnere mich dunkel :-)

> Ich habe inzwischen durch Versuche rausgefunden, es liegt NICHT am
> Empfang der B&O-Befehle, sondern mit dem Senden hakt es so jedes ~20.
> mal :-/.

Jedes 20. Mal? Das ist blöd, denn dann auch schwer nachvollziehbar.

> Sollte dir im Code etwas auffallen, dann wäre dies genial! Wiederum:
> eilt nicht...

Ich schaue es mir mal an und melde mich, sollte ich etwas finden.

Gruß,

Frank

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Jing Jok schrieb:

> Hallo und erstmal vielen Dank an Frank fuer diese grossartige Library.

Danke fürs Danke :-)

> Frank, wenn Interesse besteht kann ich auch den neuen Code in den
> Original Code mit einer neuen Konstante fuer den MikroC Compiler
> einbauen.

Sehr gerne, denn das wäre optimal. Ich werde dann Deine Änderungen 
wieder zur Verfügung stellen.

> Ich habe noch ein Paar Fragen...
> - Wofuer ist die Konstante F_CPU da ? Sie scheint nirgends benutzt zu
> werden.

Das ist die Taktfrequenz der CPU. Wird (zumindest bei den AVRs) dazu 
benutzt, alle notwendigen Zeitkonstanten (z.B. für den Timer) vom 
Preprocessor ausrechnen zu lassen.

> - Wenn irmp_get_data das allererste Mal aufgerufen wird nach einem
> Reset, gibt es bei mir TRUE zurueck und die Parameter enthalten Garbage.
> Wo koennte das Problem liegen ?

Das hört sich nach nicht initialisierten globalen Variablen an. Ein 
Standard-C-Compiler initialisiert sie alle mit 0. Aber offenbar gibt es 
da einige C-Compiler für µCs, die sich nicht an den Standard halten. 
Daher initialisiere ich sie alle selber.... Habe ich da vielleicht eine 
vergessen?

> - Ich habe alle meine Fernbedienungen ausprobiert und die meisten
> funtionieren einwandfrei, bis auf meine Samsung Set-Top Box HD-5200C.
> IRMP reagiert ueberhaupt nicht darauf. Kann mir jemand bestaetigen, das
> diese nicht unterstuetzt wird oder ob diese funtionieren sollte und
> meine Codeaenderungen fuer MikroC noch Probleme haben ?

Kann ich Dir nicht sagen. Ich bräuchte dafür eine Logging-Datei, schau 
Dir bitte das entsprechende Kapitel im IRMP-Artikel an.

Gruß,

Frank

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Achill schrieb:
> Ich verwende diese lib mit Atmel Software Framework auf dem evalbord
> xmega-a1 Xplained. Mit Atmel Studio 6.1
>
> Empfang funktioniert gut, mit dem Senden hatte ich aber Probleme.

Hast Du die Probleme lösen können?

> Wenn jemand das im svn einbauen will, nur zu.

Ich schaue es mir gerne an und baue es dann in den IRMP-Source ein. 
Danke sehr!

Gruß,

Frank

von Achill (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Frank,
die Probleme mit dem Senden haben aufgehört als ich wider mit
IRMP_LOGGING                          0
getestet habe.

Auch habe ich hier noch deine lib noch um irthru.h/.c erweitert. Damit 
kann mann ohne Protokollerkennung auf die Sendediode umleiten. Dabei 
wird vor allem Code aus deinen Sourcen verwendet. Auch wird die gleiche 
irmp und irsnd configuration verwendet.
Der Vorteil dabei man spart Code und übertägt auch alle repeats 
automatisch richtig. Die verzögerung des signals wird auch verkleinert.

Bei irmp -> irsnd werden immer die repeats geschluckt, da nach dem 
empfang des ersten telegramm der Empfänger abstellt bis der Sender das 
telegramm ausgegeben hat. (könnte man vieleicht mit zwei alternierenden 
IRMP_DATA verbessern, die verzögerung bleibt aber weiterhin eine 
telegramm länge.)

Wäre schön, wenn noch andere atmel bord Bestizer mit AtmelStudio und der 
kleinen Sende und Empfangs schaltung von meiner ersten Post es mal 
versuchen. Die Versorgungsspannung kann man über USB beziehen der 
Ausgang des tsop modul wird mit einem widerstand auf 3.3V gebracht.

Die neuen Sourcen basiern auf dem letzten svn stand mit meinen 
änderungen,
schau dir die an. (src_with_irthru.zip ist ein update des vorangegagenen 
irmp.zip, auspacken im irmp/src Verzeichniss)

in der datei teminal_output.txt werden zwei FB getestet.

ciao Achill

von Günter X. (kolle)


Lesenswert?

Ich möchte auch meinen Dank für dieses coole Projekt aussprechen.

Als Betreiber eines T+A Verstärker mit Fernbedienung (F2000, ~1995) kam 
der Wunsch auf einen Linux-PC als Tape auch über die RemoteControl 
steuern zu können. (Plan A)

Das Projekt IRMP hat dieses einwandfrei und letzt endlich 'auf Anhieb' 
mit einem ATmega164 gelöst, der LinuxPC hängt seriell am Atmel und als 
Zusatz wird jetzt (Plan B) auch der Kenwood Tuner KT 6050 (~1995) per 
Kabel und XS Systembus gesteuert. (auch hier Danke an für die Infos ;)

Der LinuxPC nimmt die seriellen Codes mit CMD und Counter entgegen und 
steuert damit ein simples script mit einem switch case.
Jedem sinnvollen Befehlsbyte wird ein Programmaufruf zur Steuerung von 
audacious mit Hilfe der audtool gegeben und so läßt sich die 
digitalisierte LP-Sammlung locker vom Sofa steuern :)

Plan C, einen BluRay-Player sammt 8-fach Volumenregler, ist als nächste 
Ausbaustufe in der Mache wobei ich den Player wohl mit echten IR 
versorgen muß, was aber auch kein Thema sein dürfte. (Volumenregler muß, 
IR für BRP kann)

Der ATMega bekommt vom T+A über 3 Klinkenstrippen die IR-Signale für 
TAPE, TUNER oder AUX und steuert abhängig vom Input die serielle, den 
Kenwood XS Bus oder die IRDiode für den Bluray Player und wird die 
notwendigen PGA4311 per SPI bedienen.

Nochmals besten Dank für IRMP

:)


PS:
Ein wichtiger Tip kam aus einer T+A Doku welche darauf verwies das es 
Konflikte mit Grundig-Fernbedienungen geben kann.
IRMP mit GRUNDIG-Protokoll ist T+A

: Bearbeitet durch User
von Stefan V. (vollmars)


Lesenswert?

Hallo,

hat sich hier schon jemand mit der Unterstützung von 
Funksteckdosensender, etc. beschäftigt? Die verwenden ja meistens On-off 
keying, müsste also ohne alzuviel Aufwand unterstützt werden können. Ein 
passender Empfänger wäre der SYN470R, gibts bei ebay als Modul.

Gruß
Stefan

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Stefan V. schrieb:
> hat sich hier schon jemand mit der Unterstützung von
> Funksteckdosensender, etc. beschäftigt?

Nein, ich bisher jedenfalls nicht. Ich benutze selbst keine 
Funktsteckdosen.

> Die verwenden ja meistens On-off keying, müsste also ohne alzuviel
> Aufwand unterstützt werden können.

Ja, was ich bisher hier an Scope-Hardcopies an Funksteckdosensignalen 
gesehen habe, hat mich auch immer an 
Pulse-Distance-Fernbedienungsprotokolle erinnert.

> Ein passender Empfänger wäre der SYN470R, gibts bei ebay als Modul.

Hab mir gerade eins bestellt.

Viele Grüße,

Frank

von Stefan V. (vollmars)


Lesenswert?

Frank M. schrieb:
> Stefan V. schrieb:
>> hat sich hier schon jemand mit der Unterstützung von
>> Funksteckdosensender, etc. beschäftigt?
>
> Nein, ich bisher jedenfalls nicht. Ich benutze selbst keine
> Funktsteckdosen.

Es geht mir auch nicht um die Funksteckdosen, ich denke eher an 
Fernbedienanwendungen in denen IR nicht benutzbar ist.

>> Die verwenden ja meistens On-off keying, müsste also ohne alzuviel
>> Aufwand unterstützt werden können.
>
> Ja, was ich bisher hier an Scope-Hardcopies an Funksteckdosensignalen
> gesehen habe, hat mich auch immer an
> Pulse-Distance-Fernbedienungsprotokolle erinnert.
>
>> Ein passender Empfänger wäre der SYN470R, gibts bei ebay als Modul.
>
> Hab mir gerade eins bestellt.

Super, macht es Sinn wenn ich da auch aktiv werde, ich bin besonders an 
dem Intertechno Protokol interessiert, das ist weit verbreitet und die 
verwenden CR2032 Batterien im Sender, viele andere, z.B. mit 2262 Chip, 
haben so eine exotische 12V Batterie und sind dadurch auch globiger.

Vielen Dank und Grüße
Stefan

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Stefan V. schrieb:
> Super, macht es Sinn wenn ich da auch aktiv werde, ich bin besonders an
> dem Intertechno Protokol interessiert, das ist weit verbreitet und die
> verwenden CR2032 Batterien im Sender, viele andere, z.B. mit 2262 Chip,
> haben so eine exotische 12V Batterie und sind dadurch auch globiger.

Kannst Du das Intertechno-Protokoll mit IRMP-Logging aufzeichnen und mir 
ein paar Scans schicken? Dann kann ich das einbauen.

Ich habe mir bei eBay folgendes bestellt:

  http://www.ebay.com/itm/Wireless-Radio-Superhet-Receiver-Module-433HZ-107dBm-France-IC-SYNOXO-SYN470R-/280909375160

Da ist also auch ein kleiner Sender dabei. Könnte ich dann mit diesem 
per IRSND das Intertechno-Protokoll wieder senden? Sorry für die 
vielleicht dumme Frage, kenne mich mit diesen Funksendern und deren 
Protokollen bisher sehr wenig bis gar nicht aus.

Viele Grüße,

Frank

von Stefan V. (vollmars)


Lesenswert?

Frank M. schrieb:
> Stefan V. schrieb:
>> Super, macht es Sinn wenn ich da auch aktiv werde, ich bin besonders an
>> dem Intertechno Protokol interessiert, das ist weit verbreitet und die
>> verwenden CR2032 Batterien im Sender, viele andere, z.B. mit 2262 Chip,
>> haben so eine exotische 12V Batterie und sind dadurch auch globiger.
>
> Kannst Du das Intertechno-Protokoll mit IRMP-Logging aufzeichnen und mir
> ein paar Scans schicken? Dann kann ich das einbauen.
>
> Ich habe mir bei eBay folgendes bestellt:
>
> 
http://www.ebay.com/itm/Wireless-Radio-Superhet-Receiver-Module-433HZ-107dBm-France-IC-SYNOXO-SYN470R-/280909375160
>
> Da ist also auch ein kleiner Sender dabei. Könnte ich dann mit diesem
> per IRSND das Intertechno-Protokoll wieder senden? Sorry für die
> vielleicht dumme Frage, kenne mich mit diesen Funksendern und deren
> Protokollen bisher sehr wenig bis gar nicht aus.
>
> Viele Grüße,
>
> Frank

Ich bin jetzt auch nicht so bewandert in der Thematik, ich habe eben 
Bedarf an einer Funk Lösung. Das SYN470R Modul habe ich schon hier. Mit 
IRMP habe ich noch keine Erfahrung. Ich mach mich am Wochenende mal 
daran, einen Log zu generieren. Es gibt schon eine Protokollbeschreibung 
hier im Forum:
Beitrag "Re: Intertechno Funksteckdosen per AVR steuern"

Gruß
Stefan

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Stefan V. schrieb:
> Ich mach mich am Wochenende mal daran, einen Log zu generieren.

das wäre prima, siehe dazu auch:

  http://www.mikrocontroller.net/articles/IRMP#Scannen_von_unbekannten_IR-Protokollen

> Es gibt schon eine Protokollbeschreibung hier im Forum:
> Beitrag "Re: Intertechno Funksteckdosen per AVR steuern"

Danke, sehr hilfreich! Neuartig daran ist die Nutzung von Doppelpulsen 
für lediglich 1 Bit gegenüber den Pulse-Distance-Protokollen, die bei 
IR-FBs meist verwendet werden. Aber das ist kein Hindernis, eher eine 
Herausforderung :-)

Ich werde das Protokoll mal parallel zu Deinem Logging in den IRMP 
integrieren. Dann kann ich den Decoder direkt mit Deinen Log-Dateien 
testen. Zusammen bekommen wir das schon hin :-)

von xv (Gast)


Lesenswert?

Hallo,
erstmal vielen Dank für die Entwicklung von IRMP! Ich habe es mal 
ausprobiert und dabei folgendes festgestellt:
Wenn ich Ruwido ausgeschaltet hab, wird meine eine Fernbedienung 
(Technotrend) sauber als RC5 erkannt, eine weitere als NEC (Sherwood) 
und die von meinem Fernseher (Metz) gar nicht.
Wenn ich nun Ruwido einschalte, geht RC5 immer noch problemlos, NEC wird 
in ca. 1/3 der Fälle als Siemens oder Ruwido erkannt, die Metz 
Fernbedienung meistens als Ruwido, aber mit willkürlicher 
Adresse/Kommando.
Da ich auch die Merlin-Tastatur benutzen möchte, brauche ich Ruwido 
(konnte die Tastatur noch nicht testen, da ich kein 56kHz Empfänger 
rumliegen hab).
Der AVR läuft mit Quarz (18,432MHz), ich habe die Intervalle 15000, 
18432 und 20000 ausprobiert, immer das gleiche. Woran liegt das? Ist das 
Ruwido/Siemens Protokoll einfach so beliebig, das Fehlinterpretationen 
nicht zu vermeiden sind, ist die Implementierung in IRMP noch nicht 
ausgereift oder kann ich irgendwas falsch gemacht haben?
Vielen Dank

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

xv schrieb:
> Wenn ich nun Ruwido einschalte, geht RC5 immer noch problemlos, NEC wird
> in ca. 1/3 der Fälle als Siemens oder Ruwido erkannt, die Metz
> Fernbedienung meistens als Ruwido, aber mit willkürlicher
> Adresse/Kommando.

Schicke mir bitte Scans von Deinen nicht sauber erkannten FBs. 1-3 
Tasten pro FB sollten reichen. Dann bitte noch Deine irmpconfig.h.

> Woran liegt das? Ist das
> Ruwido/Siemens Protokoll einfach so beliebig, das Fehlinterpretationen
> nicht zu vermeiden sind, ist die Implementierung in IRMP noch nicht
> ausgereift oder kann ich irgendwas falsch gemacht haben?

Es gibt immer da Probleme, wo sich Protokolle bzgl. des Timings ähneln. 
Da die FBs selber Timing-Abweichungen von bis zu 40% haben, ist IRMP 
ziemlich tolerabel - aber mit dem erkauften Nachteil, dass es die 
Wahrscheinlichkeit von Konflikten bei der Erkennung von Protokollen 
erhöht.

Das Ruwido-Protokoll wird nicht oft verwendet. So habe ich da nur wenige 
empirische Daten. Scans von Deinen FBs würden daher helfen, die 
Toleranzgrenzen von IRMP zu optimieren und damit auch das 
Konfliktpotential zwischen den Protokollen.

Viele Grüße,

Frank

von Klaus L. (Gast)


Lesenswert?

Frank M. schrieb: (Funkprotokoll)
> Danke, sehr hilfreich! Neuartig daran ist die Nutzung von Doppelpulsen
> für lediglich 1 Bit gegenüber den Pulse-Distance-Protokollen, die bei
> IR-FBs meist verwendet werden. Aber das ist kein Hindernis, eher eine
> Herausforderung :-)
>
> Ich werde das Protokoll mal parallel zu Deinem Logging in den IRMP
> integrieren. Dann kann ich den Decoder direkt mit Deinen Log-Dateien
> testen. Zusammen bekommen wir das schon hin :-)

Hallo Frank,

oh, wenn ich geahnt hätte das Du auch Funkprotokolle zulässt ;-)
Ein weiterer Kandidat wäre noch FS20, ist ja gut dokumentiert und auch 
z.B. schon in Ethersex implementiert.

Im Gegensatz zu den IR Protokollen, bei denen Störungen, bzw. die 
Trägerfrequenz ja schon beim TSOP rausgefiltert wird, empfangen die 
Funkreceiver ja dauernd Störimpulse, nur die eigentlichen Signale sind 
einigermassen sauber. Wie sieht es denn bei so was mit der Erkennung 
aus? Könnte das klappen?

LG,
Klaus

von Oliver R. (superberti)


Lesenswert?

Hi,

ich wollte Frank nur mal eben meinen herzlichen Dank für die super 
Arbeit an dem IRMP aussprechen!
Ich habe für die Hardware+Software auf meinem Dev-Board gerade mal eine 
Stunde benötigt und dann lief die Sache (Ausgabe auf dem UART) auf 
anhieb!
Toll, jetzt kann die Wandschrank-LED-Beleuchtung mit der 
Fernseher-Fernbedienung geschaltet und gedimmt werden.

Wenn's doch immer so laufen würde ;-)

Also, noch mal besten Dank und viele Grüße.

Oliver

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Oliver R. schrieb:
> ich wollte Frank nur mal eben meinen herzlichen Dank für die super
> Arbeit an dem IRMP aussprechen!

Danke fürs Danke und viel Spaß!

Frank

von Ulli (Gast)


Lesenswert?

Hallo zusammen,

ich nuzte schon begeistert seit längerer Zeit IRMP. Klasse Sache!

Zusätzlich habe ich meine Funkprotokolle wie die Baumarktfunksteckdosen 
(Intertechno) oder FS20 anderweitig integriert.
Ich bin gerade sehr überrascht das sich dies auch in IRMP einbinden 
lässt und wäre auch daran interessiert und könnte euch helfen dies 
umzusetzen, da es bei mir schon läuft, nur eben nicht über IRMP.
(Hier ein kleiner Beitrag über meinen AVR bzw JeeNode inkl. Sourcen
http://forum.fhem.de/index.php/topic,17697.0.html)

Mir stellt sich aber die Frage ob sich IRMP gleichzeitig an zwei Pins 
betreiben lässt? (Für IR und OOK Funksignale)..

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Ulli schrieb:

> Zusätzlich habe ich meine Funkprotokolle wie die Baumarktfunksteckdosen
> (Intertechno) oder FS20 anderweitig integriert.
> Ich bin gerade sehr überrascht das sich dies auch in IRMP einbinden
> lässt und wäre auch daran interessiert und könnte euch helfen dies
> umzusetzen, da es bei mir schon läuft, nur eben nicht über IRMP.
> (Hier ein kleiner Beitrag über meinen AVR bzw JeeNode inkl. Sourcen
> http://forum.fhem.de/index.php/topic,17697.0.html)

2 Fragen dazu:

Gibt der Funkempfänger ein Active-Low-Signal aus?

Wenn ja, könntest Du einfach das Funkprotokoll mit IRMP scannen (s. 
Artikel: IRMP_LOGGING) und mir die Scan-Dateien schicken (Beispiele 
siehe IR_Data/*.txt).

Wenn nein, müsstest Du das Macro:

define input(x)                              ((x) & (1 << IRMP_BIT))

ändern in:

define input(x)                              !((x) & (1 << IRMP_BIT))

> Mir stellt sich aber die Frage ob sich IRMP gleichzeitig an zwei Pins
> betreiben lässt? (Für IR und OOK Funksignale)..

Ja, das ginge. Solange nicht zur selben Zeit ein IR-Sender und ein 
Funksender senden. Dann wirds komplizierter. Aber ich glaube, den Fall 
einer Signalkollision können wir vernachlässigen....

Gruß,

Frank

von Karol B. (johnpatcher)


Lesenswert?

Hi,

ich will dir natürlich nicht in "deinem" Wiki-Artikel herum editieren, 
Frank, aber so wie es scheint hast du mittlerweile Version 2.3.10 
veröffentlicht. Das ist im Artikel aber noch nicht aktualisiert. Hat das 
einen Grund?

Mit freundlichen Grüßen,
Karol Babioch

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Hi Karol,

Karol Babioch schrieb:
> ich will dir natürlich nicht in "deinem" Wiki-Artikel herum editieren,
> Frank, aber so wie es scheint hast du mittlerweile Version 2.3.10
> veröffentlicht. Das ist im Artikel aber noch nicht aktualisiert. Hat das
> einen Grund?


Ich werde in den nächsten Tagen sowieso ein Update von IRMP rausgeben. 
Dann werde ich den Artikel auch aktualisieren.

Ich hoffe, dass bis dahin Andreas die Kaputt-Formatierung des Artikels 
durch sein neues Website-Layout wieder in Ordnung gebracht hat.

Vielen Dank für den Hinweis,

Frank

von Karol B. (johnpatcher)


Lesenswert?

Hi,

Frank M. schrieb:
> Ich werde in den nächsten Tagen sowieso ein Update von IRMP rausgeben.
> Dann werde ich den Artikel auch aktualisieren.

Ok, vielen Dank für die Antwort.

Darf man dich denn in der Zwischenzeit darauf hinweisen, dass sich die 
jetzige Version mit einer avr-gcc Toolchain nicht ohne Warnung 
kompilieren lässt. Schuld daran ist die Funktion "dummy" in 
"irmpextlog.c", die folgende Warnung auslöst:

> avr-gcc -Wall -Werror -Os -fpack-struct -fshort-enums -ffunction-sections
> -fdata-sections -std=gnu99 -funsigned-char -funsigned-bitfields
> -mmcu=atmega328p -DF_CPU=16000000UL -MMD -MP -MF"src/IRMP/irmpextlog.d"
> -MT"src/IRMP/irmpextlog.d" -c -o "src/IRMP/irmpextlog.o" "../src>
> /IRMP/irmpextlog.c"
> ../src/IRMP/irmpextlog.c:104:1: error: 'dummy' defined but not used
>[-Werror=unused-function]

Damit ist es mir nicht möglich mein Projekt mit -Werror zu kompilieren 
;).

Basierend auf dem Kommentar und der Konditionen aus den anderen Dateien 
schlage ich folgenden Fix vor:
1
#if defined(PIC_C18)
2
static void
3
dummy (void)
4
{
5
  // Only to avoid C18 compiler error
6
}
7
#endif

Das lässt die Warnung bei mir verschwinden, Ob es den gewünschten Effekt 
bei einer C18 Toolchain hat, weiß ich natürlich nicht. Wäre aber schön, 
wenn das in den nächsten Versionen von offizieller Seite aus gefixt 
wird.

Mit freundlichen Grüßen,
Karol Babioch

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


Lesenswert?

Hi Karol,

Karol Babioch schrieb:
> Basierend auf dem Kommentar und der Konditionen aus den anderen Dateien
> schlage ich folgenden Fix vor:
> [...]

Danke, habe ich übernommen. Alternativ dazu hättest Du irmpextlog.c gar 
nicht erst ins AVR-Projekt mit aufnehmen sollen. Bei AVRs ist diese 
Datei nämlich hyperfluid ;-)

Viele Grüße,

Frank

: Bearbeitet durch Moderator
von Dominic A. (neo123)


Lesenswert?

Hallo zusammen,

Ich habe derzeit ein kleines Problem mit der Library. Auf einem dsPIC 
mit dem XC16 Compiler funktioniert alles wunderbar. Grosses Dankeschön 
dafür.

Nun jedoch versuche ich es auf dem XC8 zum laufen zu bringen. Aber ich 
scheitere an den folgenden Makros aus irmp.c Zeile 397:
1
#else
2
#  define ANALYZE_PUTCHAR(a)
3
#  define ANALYZE_ONLY_NORMAL_PUTCHAR(a) 
4
#  define ANALYZE_PRINTF(...) 
5
#  define ANALYZE_ONLY_NORMAL_PRINTF(...) 
6
#  define ANALYZE_NEWLINE()
7
#endif

Ich bekomme immer folgende Fehler Meldung:
1
IRMP/irmp.c:399: error: #define syntax error
2
IRMP/irmp.c:400: error: #define syntax error
3
IRMP/irmp.c:1490: warning: wrong number of preprocessor macro arguments for "ANALYZE_PRINTF" (1 instead of 0)
4
IRMP/irmp.c:1888: warning: wrong number of preprocessor macro arguments for "ANALYZE_PRINTF" (2 instead of 0)
5
...
Das mit den wrong number of preprocessor macro arguments kommt für jede 
Zeile in welcher das Makro gebraucht wird.
Scheinbar funktioniert eine variable Anzahl von Argumenten mit dem XC8 
Compiler nicht.
Hatte dieses Problem auch schon mal jemand?
Ich habe keine andere Methode für den XC8 gefunden um variable Argumente 
zu definieren.

Grüsse

von Karol B. (johnpatcher)


Lesenswert?

Um dir die Suche zu erleichtern: Diese Art von Macros sind als Variadic 
macros bekannt, siehe [1], und fanden erst mit C99 Einzug in den C 
Standard. Der XC8 Compiler, den ich zugegebenermaßen nicht kenne, 
unterstützt dies wohl nicht. Insofern wirst du die Makros in ihrer 
jetzigen Form nicht verwenden können.

Aber, vermutlich willst du das auch gar nicht. Denn die entsprechenden 
Makros werden nur gebraucht, wenn auch das das Makro ANALYZE definiert 
ist. Dieses wiederum wird in "irmpsystem.h" gesetzt - und zwar nur im 
Falle, dass UNIX_OR_WINDOWS gesetzt ist.

Auf deutsch gesagt: Dein Compiler wird von IRMP nicht erkannt und es 
wird davon ausgegangen, dass du die Desktopversion kompilieren möchtest, 
die die entsprechende Analysefunktionalität mitbringt. An dieser bist du 
aber vermutlich nicht interessiert.

Wenn du das Problem "richtig" lösen willst, dann musst du den Compiler 
in der Datei "irmpsystem.h" entsprechend eintragen. Wie sich dieser zu 
erkennen gibt, weiß ich leider nicht, das lässt sich aber i.d.R. im 
Manual finden. Frank würde das sicherlich auch mit Freude übernehmen.

Ansonsten könntest du das natürlich auch noch "Quick-and-dirty" lösen, 
in dem du die Erkennung entfernst bzw. so anpasst, dass keine 
Desktopversion erkannt wird.

Mit freundlichen Grüßen,
Karol Babioch

[1]: https://en.wikipedia.org/wiki/Variadic_macro

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


Lesenswert?

Karol Babioch schrieb:

> Aber, vermutlich willst du das auch gar nicht. Denn die entsprechenden
> Makros werden nur gebraucht, wenn auch das das Makro ANALYZE definiert
> ist. [...]

Deine Vermutung ist leider falsch. Sein Zitat bezieht sich auf den 
#else-Zweig, also wenn kein ANALYZE gesetzt ist. Hier sollen die 
Makros dafür sorgen, dass die entsprechenden ANALYZE_PRINTF-Anweisungen 
im kompletten Code durch "Nichts" ersetzt werden. Der XC8 scheint keine 
Variadic-Macros zu verstehen.

Da gibt es nur zwei Möglichkeiten:

 - Sämtliche ANALYZE-Macros im Source auskommentieren bzw. entfernen
 - Sämtliche ANALYZE-Macros im Source mit #ifdef ANALYZE ... #endif
   "umhüllen".

Blöd, aber ich sehe keine andere Möglichkeit.

Der einfachste Weg ist wohl, mit dem Editor sämtliche Vorkommnisse von

  ANALYZE

durch

  // ANALYZE

zu ersetzen.

: Bearbeitet durch Moderator
von gera (Gast)


Lesenswert?

Hallo,

der XC8 kann im Moment keine Variadic macros.
Den Compiler kann man mit "__XC8" erkennen.
Dann könnte man mit #ifdef um die Analyze Zeilen die dann weglassen.

#ifndef __XC8
...
#endif

Gruß

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

gera schrieb:
> #ifndef __XC8
> ...
> #endif

Dann besser, weil allgemeiner:

#ifdef ANALYZE
...
#endif

Das macht den Source aber leider nicht übersichtlicher, weil das für 
alle Vorkommnisse der ANALYZE-Macros gemacht werden müsste. Deshalb 
werde ich das auch nicht in den Standard-Source übernehmen.

Die einfachste Möglichkeit für Dominic ist es, einfach die Textersetzung

  ANALYZE -> // ANALYZE

im Editor durchzuführen.

von gera (Gast)


Lesenswert?

Hast recht.
Man kann ja noch hoffen, dass der XC8 mal diese Macros kann :-)

von Dominic A. (neo123)


Lesenswert?

Alles klar,
Ich habe nun alle ANALYZE Makros auskommentiert.
Jedoch musst ich doch alle von Hand kommentieren da die meisten 
Mehrzeilig sind und somit nur eine Zeile auskommentiert wird.
Nun funktioniert es jedoch ohne Probleme.

Vielen Dank für eure Hilfe.

Grüsse

von Vilex (Gast)


Lesenswert?

Hallo,

kennt jemand eventuell eine bezugsquelle für eine fernbedienung + 
empfänger und im optimalsten fall noch mit angepassten sourcecode :D

hätte 
http://www.ebay.com/itm/Arduino-Infrared-IR-wireless-remote-control-kit-for-Arduino-PIC-AVR-/130939662157?pt=UK_BOI_Electrical_Components_Supplies_ET&hash=item1e7c9caf4d 
gefunden allerdings kein plan ob und wie ich da anfangen sollte!!!


mfg

von Karol B. (johnpatcher)


Lesenswert?

Hi,

Vilex schrieb:
> kennt jemand eventuell eine bezugsquelle für eine fernbedienung +
> empfänger und im optimalsten fall noch mit angepassten sourcecode :D

Und was soll "angepasster" Sourcecode heißen? Überhaupt erschließt sich 
mir der Sinn eines solchen Aufbaus nicht so ganz, weil ein IR-Empfänger 
ja nur dort Sinn macht, wo etwas gesteuert werden soll. Und da gibt es 
i.d.R. doch schon einen Mikrocontroller. Mehr als einen IR-Empfänger für 
einige Cent und einen freien Pin (einschließlich ein bisschen 
Rechenzeit) braucht man doch nicht.

Mit freundlichen Grüßen,
Karol Babioch

von Vilex (Gast)


Lesenswert?

ok ich habe glaub ich meine frage etwas schlecht gestellt.

also ich würde gerne zu  meiner steuerung diese IRMP auch einbauen damit 
ich mit fernbedinung steuern kann.
allerdings besitze ich keine fernbedienung und keinen IRMP empfänger, 
also wo am besten kaufen?  und noch besser wärs wenns keine allzu 
exotische ferndbedienuung wär slndern was bewährtes was gleich auf 
anhieb funktioniert!

von Karol B. (johnpatcher)


Lesenswert?

Hi,

Vilex schrieb:
> allerdings besitze ich keine fernbedienung und keinen IRMP empfänger,
> also wo am besten kaufen?

Naja, dann solltest du dich zunächst einmal damit auseinander setzen was 
genau IRMP eigentlich ist. Dabei handelt es sich nämlich um eine 
Bibliothek, welche im Prinzip fast alle verbreiteten IR-Protokolle 
dekodieren kann. Und du benötigst keinen "IRMP"-Empfänger, sondern einen 
typischen IR-Empfänger von der Stange, z.B. einen TSOP 31238 [1].

Alle weiteren Details findest du hier [2].

Mit freundlichen Grüßen,
Karol Babioch

[1]: 
https://secure.reichelt.de/Fotodioden-etc-/TSOP-31238/3//index.html?ACTION=3&GROUPID=3045&ARTICLE=107210
[2]: https://www.mikrocontroller.net/articles/IRMP

von jar (Gast)


Lesenswert?

Vilex schrieb:
> allerdings besitze ich keine fernbedienung

wie geht das, ich habe mindestes 15 Fernbedienungen und alle kennt IRMP.

Ich dachte jeder hat mehr als eine Fernbedienung und evt. auch von 
ausgemusterten Geräten, die wären doch ideal.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Es gibt eine neue Version von IRMP & IRSND im SVN bzw. zum Download im 
IRMP-Artikel.

Die wichtigsten Änderungen:

IRMP:

  - Fehlerhafte Decodierung des SIEMENS-Protokolls korrigiert
  - Neue Protokolle: RCMM32, RCMM24 und RCMM12
  - Timing für ROOMBA verbessert

IRSND:

  - Neues Protokoll: RUWIDO

Viel Spaß mit IRMP!

Gruß,

Frank

von Joachim B. (jar)


Lesenswert?

Frank M. schrieb:
> Es gibt eine neue Version von IRMP & IRSND im SVN

Klasse und Danke !

eine (zwei) doofe Frage(n) habe ich noch, ich habe schon gesucht finde 
es aber nicht,

gibt es max und min Grenzen für F_CPU ? ich möchte einen festen IR 
Tester bauen, aber möglichst stromsparen, also F_CPU so gering wie 
möglich.

Aber trotzdem sollen alle Protokolle erkennbar sein, ist es jetzt 
möglich ohne "Fehlinterpretationen" alle Protokolle zu enabeln ? (ich 
erinnere mich an Anfangsschwierigkeiten wo du bemerktest nur die 
einzuschalten die wirklich gebraucht werden)

vielen Dank
LG jar

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Joachim B. schrieb:

> gibt es max und min Grenzen für F_CPU ?

Ab 8MHz bist Du auf der sicheren Seite. Nach oben hin gibt es erstmal 
keine Einschränkung.

Wenn es ein Tester werden soll, kannst Du die CPU ja mit einem Taster 
aufwecken. Anschließend schaltet der µC dann den TSOP ein - der 
verbraucht nämlich am meisten Strom.

Siehe dazu auch:

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

Gruß,

Frank

: Bearbeitet durch Moderator
von jar (Gast)


Lesenswert?

Frank M. schrieb:
> Ab 8MHz bist Du auf der sicheren Seite. Nach oben hin gibt es erstmal
> keine Einschränkung.

OK dachte ich mir, reicht der interne Clock oder besser Quarz ?

> Wenn es ein Tester werden soll, kannst Du die CPU ja mit einem Taster
> aufwecken. Anschließend schaltet der µC dann den TSOP ein - der
> verbraucht nämlich am meisten Strom.

da bin ich platt, der braucht doch nur µA, aber den direkt aus einem 
Port speisen und Abschalten ist ja keine Hürde :-)

danke

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

jar schrieb:
> OK dachte ich mir, reicht der interne Clock oder besser Quarz ?

Für IRMP reicht die interne Clock, bei IRSND wäre ein Quarz ratsam, weil 
einige Hersteller ziemlich "untolerant" beim Timing sind.

> da bin ich platt, der braucht doch nur µA, aber den direkt aus einem
> Port speisen und Abschalten ist ja keine Hürde :-)

Ich hab das auf die alte TSOP17xx-Reihe bezogen, denn da bist Du im 
mA-Bereich. Kann aber durchaus sein, dass neuere TSOPs da genügsamer 
sind.

von Joachim B. (jar)


Lesenswert?

Frank M. schrieb:
> Ich hab das auf die alte TSOP17xx-Reihe bezogen, denn da bist Du im
> mA-Bereich. Kann aber durchaus sein, dass neuere TSOPs da genügsamer
> sind.

OK sind 3 mA ich meine irgendwo mal was anderes gelesen zu haben oder 
das der bei Ineffektivität in den standby geht. Aber man weiss ja nie ob 
er nicht immer von IR aufgeweckt wird oder von Netz-, Funkstörungen.

von Frank M. (ukw) (Moderator) Benutzerseite


Angehängte Dateien:

Lesenswert?

Ich habe in den letzten Wochen ein neues Projekt begonnen:

Anlernbare IR-Fernsteuerung mit einem netzwerkfähigen Android-Handy über 
WLAN.

Dabei wird ein ATmega328, der mit einem W51000 Ethernet-Contoller 
ausgestattet wird, angesteuert. Mittels TSOP-Empfänger am ATmega können 
Codes angelernt werden und direkt einer Taste in der Android-App 
zugewiesen werden. Sendet die App den IRMP-Code wieder an den ATmega, 
kann dieser per IRSND den Code als Infrarot-Signal wieder aussenden.

Die dafür nötigen Tasten sind in der App frei gestaltbar. Dafür bietet 
die App die Möglichkeit, mehrere Bedienerseiten (für mehrere Geräte) 
anzulegen, um dann dort die nötigen Tasten zu definieren.

Man kann die nötigsten Tasten für mehrere Geräte auch auf eine Seite 
legen, sodass man alles Wichtige "auf einen Blick" hat. Ausserdem können 
mehrere ATmega-Satelliten im Netzwerk angesprochen werden. Einer könnte 
zum Beispiel im Wohnzimmer stehen, ein anderer im Kinderzimmer oder 
Hobbyraum.

Geplant ist noch eine Erweiterung im IRMP/IRSND, dass auch 
Funksteckdosen-Signale angelernt und wiedergegeben werden. Somit lässt 
sich dann alles Erdenkliche im Haushalt per Handy steuern.

Wenn Ihr interessiert seid, kann ich das Projekt gerne in einem neuen 
Artikel vorstellen.

Auf Feedback bin ich mal gespannt :-)

Gruß,

Frank

von Konrad S. (maybee)


Lesenswert?

Frank M. schrieb:
> Wenn Ihr interessiert seid

Aber sicher doch!

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Konrad S. schrieb:
> Aber sicher doch!

Jut, ich hab mal mit dem Artikel angefangen: Remote IRMP

Es wird aber noch einige Tage dauern, bis dieser einigermaßen 
vollständig ist ;-)

von Konrad S. (maybee)


Lesenswert?

Frank M. schrieb:
> Jut, ich hab mal mit dem Artikel angefangen: Remote IRMP

Super, danke!

von Michael H. (michael_h45)


Lesenswert?

Frank M. schrieb:
> Wenn Ihr interessiert seid, kann ich das Projekt gerne in einem neuen
> Artikel vorstellen.
>
> Auf Feedback bin ich mal gespannt :-)

Find ich eine super Idee!

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

So, der Artikel Remote IRMP ist nun soweit, dass man schon mal damit 
arbeiten kann.

Ich werde in Zukunft die Seite weiter vervollständigen und pflegen.

Viel Spaß!

von Joachim B. (jar)


Lesenswert?

supi ! danke (ich hoffe das hat nix mit dem heutigen Datum zu tun)

PS ob es auch mal möglich wäre den Code in gcc auf den raspberry PI zu 
bringen ?

eigenen Code hatte ich schon mal portiert, aber da blicke ich ja auch 
durch, bei fremden Code ist mir das aber ein wenig zu hoch

: Bearbeitet durch User
von Conny G. (conny_g)


Lesenswert?

Joachim B. schrieb:
> PS ob es auch mal möglich wäre den Code in gcc auf den raspberry PI zu
> bringen ?

Das ist nicht realistisch, aber nicht, weil es vom Code her nicht geht, 
sondern weil man beim Raspberry Pi keine Kontrolle über das Timing hat.
D.h. Timer wie bei den uCs um die es hier geht gibt es nicht und Linux 
ist kein Realtime-Betriebssystem.
Man kann also niemals sicherstellen, dass man eine genaue Abtast- oder 
Sendefrequenz von 38 oder 40 kHz einhält und damit wird das Ganze ein 
sehr mühsames und zufälliges Geschäft.

von Joachim B. (jar)


Lesenswert?

Conny G. schrieb:
> Das ist nicht realistisch, aber nicht, weil es vom Code her nicht geht,
> sondern weil man beim Raspberry Pi keine Kontrolle über das Timing hat.

ich habe ja nur wenig Ahnung, aber was wird denn bei IRMP gemacht mit 
der Konstante Interrupt ?
#  define F_INTERRUPTS                          15000
ein polling mit oversample und dann werden die Zeiten zwischen high und 
low ermittelt

irmp_pulse_time++;

if (((irmp_pulse_time < NIKON_START_BIT_PULSE_LEN_MIN || irmp_pulse_time 
> NIKON_START_BIT_PULSE_LEN_MAX) && irmp_pause_time > IRMP_TIMEOUT_LEN) 
||


einen interrupt kann ich auch am PI auswerten, ok evtl. nicht so stabil, 
aber ich könnte höhere Interrupt wählen, dann wird es evtl. hinreichend 
genau

oder ich polle eben nicht sondern frage wirklich gezielt high und low 
Flanke interrupt getriggert ab....

so denke ich mir das

aber wie gesagt so die Ahnung habe ich nicht

PS lirc auf dem PI funktioniert, warum sollte IRMP nicht ?

: Bearbeitet durch User
von Torsten C. (torsten_c) Benutzerseite


Lesenswert?

Frank M. schrieb:
> So, der Artikel Remote IRMP ist nun soweit, dass man schon mal damit
> arbeiten kann.

Finde ich sehr spannend.

Macht es Sinn das ganze mit netio von davideickhoff zu kombinieren?

Weil sich im Consumer-Bereich immer die Lösungen duchsetzen, die (bei 
ansonsten vergleichbaren Eigenschaften) um ein paar Cent billiger sind, 
würde ich mein Remote-IRMP gern mit mehreren NRF24L01+ umsetzen.

Aber ich befürchte, dass man dabei wenig aus dem 
Internet-Prtokoll-orientierten Remote IRMP übernehmen kann. Oder wie 
seht Ihr das?

Natürlich wird´s ein Gateway aus dem LAN zu den Mesh-vernetzen NRF24L01+ 
geben. Das kann dan evt. zur o.g. Lösung kompatibel sein.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Joachim B. schrieb:
> PS ob es auch mal möglich wäre den Code in gcc auf den raspberry PI zu
> bringen ?

Sorry, ich vergaß zu erwähnen, dass ich für Remote IRMP einen neuen 
Thread aufgemacht habe.

Ich antworte Dir mal dort: 
Beitrag "Remote IRMP - IR übers Netzwerk"

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Torsten C. schrieb:

> Macht es Sinn das ganze mit netio von davideickhoff zu kombinieren?

Auch auf Deine Fragen antworte ich Dir gern im Nachbar-Thread:

Beitrag "Remote IRMP - IR übers Netzwerk"

von Klaus2 (Gast)


Lesenswert?

Hallo UKW,

vielen Dank für den IRMP - damit bin ich bei meinem eigentlichen Ziel, 
ein altes Radio IR fernbedienbar zu machen innerhalb von nur 20min 
(Downlaod, Config, Breadboardaufbau) ein großes Stück weiter gekommen. 
TOP!

Sieht man auch irgednwo, ob das CMD mehrfach gesendet wurde 
(Dauertastendruck), oder hört da die Bequemlichkeit auf? :)

Danke, Klaus.

von Konrad S. (maybee)


Lesenswert?

Klaus2 schrieb:
> Sieht man auch irgednwo, ob das CMD mehrfach gesendet wurde
> (Dauertastendruck), oder hört da die Bequemlichkeit auf? :)

Alles da:
http://www.mikrocontroller.net/articles/IRMP#.22Entprellen.22_von_Tasten

von Klaus2 (Gast)


Lesenswert?

Hallo zusammen,

das repetition flag bereitet mir Kopfschmerzen.

Also, es wird bereits bei sehr kurzen Tastendrücken ab 100ms (JVC) 
gesetzt, wie soll ich denn "so kurz" die Taste drücken?

Ich muss in shortpress und longpress unterscheiden:

WENN eine Taste gedrückt wurde, warte kurz und entscheide, ob Sie nur 
kurz (dann Operation A) oder länger (dann Operation B) gedrückt wurde.

Operation A darf nicht direkt ausgeführt werden, erst wenn klar ist, was 
vorlag.

Wer kann mir mit Erfahrungswerten helfen?

Klaus.

von Konrad S. (maybee)


Lesenswert?

Das Flag besagt, dass die Fernbedienung den entsprechenden Code als 
Wiederholung gesendet hat, da kann IRMP nichts dafür. Ich habe auch 
mindestens eine Fernbedienung, die sehr schnell mit Wiederholungscodes 
zur Stelle ist.

von Klaus2 (Gast)


Lesenswert?

...ich weiß, das IRMP nichts dafür kann, daher habe ich es selbst 
versucht, aber bis dato noch erfolglos, weil zum Beispiel der Wert in 
command nicht zurückgesetzt wird, obwohl gar keine Taste mehr gedrückt 
ist. Mit meiner üblichen Denke für "echte Tastewn" komme ich grade nicht 
weiter, weil das output struct sich nicht so verhält, wie ich dachte. 
Gut, muss ich noch etwas grübeln - außer mir gibt jmd einen TIP.

Gruß, Klaus.

von Konrad S. (maybee)


Lesenswert?

Klaus2 schrieb:
> command nicht zurückgesetzt

Wovon sprichst du? Im Beispiel
http://www.mikrocontroller.net/articles/IRMP#Anwendung_von_IRMP
wird bei erfolgreichem Aufruf von irmp_get_data() einmalig die 
irmp_data-Struktur ausgewertet. Und das eben in einer Schleife.
1
int main( void )
2
{
3
  IRMP_DATA irmp_data;
4
  ...
5
  while ( 1 ) {
6
    if ( irmp_get_data( &irmp_data ) ) {
7
      if ( irmp_data.protocol == IRMP_NEC_PROTOCOL &&    // NEC-Protokoll
8
          irmp_data.address == 0x1234 )                  // Adresse 0x1234
9
      {
10
         switch ( irmp_data.command ) {
11
            case 0x0001: key1_pressed(); break;          // Taste 1
12
            case 0x0002: key2_pressed(); break;          // Taste 2
13
            ...
14
            case 0x0009: key9_pressed(); break;          // Taste 9
15
         }
16
      }
17
    }
18
  }
19
}

von Klaus2 (Gast)


Lesenswert?

Hallo Konrad,

nicht trivial zu erklären, daher die ganz simple Frage:

Wie würdest du mit der IRMP "API" rasfinden, ob eine Taste kurz (bis 
500ms) oder lang (>500ms) gedrückt wurde.

Kein Code, bitte nur den Gedankenanstoss...

Danke, Klaus.

von Konrad S. (maybee)


Lesenswert?

Ein Timer liefert einen Zeittakt, der etwas langsamer ist als die 
Wiederholrate der Fernbedienung. Am Anfang eines Tastendrucks merkst du 
dir den Zählerstand. Solange der gleiche Tastendruck ankommt, wird 
"Tastendauer"-Zähler hochgezählt. Kommt kein oder ein anderer 
Tastendruck, dann wertest du den "Tastendauer"-Zähler aus, wobei im Fall 
"anderer Tastendruck" dafür die Zeit zu laufen beginnt.

von Conny G. (conny_g)


Lesenswert?

Klaus2 schrieb:
> Wie würdest du mit der IRMP "API" rasfinden, ob eine Taste kurz (bis
> 500ms) oder lang (>500ms) gedrückt wurde.
>
> Kein Code, bitte nur den Gedankenanstoss...

Ungefähr so:

Du merkst Dir immer den letzten erkannten Code in einer Variablen.
Und Du incremetierst in der Interrupt-Routine des Timers einen 
Zeitzähler.

Jedesmal, wenn ein Code erkannt wird:
  Wenn er ungleich dem vorherigen ist:
     Tastegedrückt = 1
     Zeitzähler    = 0
  Wenn er gleich dem vorherigen ist:
     Zeitzähler > 500ms?
        Ja:
           Tastegedrückt = 1
           Zeitzähler = 0
        Nein:
           nichts tun

Einen Fall muss man noch unterbringen:
keine Taste gedrückt setzt ebenfalls den Zeitzähler zurück, der zählt ja 
nur solange ein Code laufend wiederholt erkannt wird.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Klaus2 schrieb:

> das repetition flag bereitet mir Kopfschmerzen.
>
> Also, es wird bereits bei sehr kurzen Tastendrücken ab 100ms (JVC)
> gesetzt, wie soll ich denn "so kurz" die Taste drücken?

Viele der von IRMP unterstützten Protokolle habe ich nicht selber testen 
können, sondern es wurden mir Scan-Dateien zugeschickt, welche ich dann 
benutzt habe, um das entsprechende Protokoll einzubauen.

Leider ist es so, dass die Leute sich dabei keine bis wenig Gedanken 
über kurze/lange Tastendrücke machen. Deshalb habe ich nicht in allen 
Fällen eine Information darüber, ob die gescannte Taste kurz oder lang 
gedrückt wurde.

Bei einigen Protokollen wird ein Telegramm auch bei kurzem Tastendruck 
aus Sicherheitsgründen mehrfach ausgesendet. Das könnte IRMP dann falsch 
verstehen... als langen Tastendruck.

Daher meine Frage: wie oft liefert IRMP einen Code zurück bei kürzester 
Tastenabfrage? In welchen Schritten geht es weiter? Ist es nur ein 
weiterer Code? Dann wäre die Schrittzahl z.B.

2 Frames = kurze Taste
3 Frames = etwas länger gedrückt
4 Frames = noch etwas länger gedrückt

Es könnte aber auch so sein:

2 Frames = kurze Taste
4 Frames = etwas länger gedrückt
6 Frames = noch etwas länger gedrückt

D.h. es würde immer nur eine gerade Zahl von Frames geschickt.

Wenn ich diese Info habe, kann ich den Decoder darauf abstimmen und Du 
bekommst dann nur noch einen Code statt mehrere zurück.

Aber nochmal kurz zu Deinem Problem: Wenn Du wirklich messen willst, ob 
eine Taste "sehr lange" gedrückt wurde, würde ich an Deiner Stelle 
einfach einen Zähler einbauen, der misst, wie oft ein und derselbe Code 
mit Repetition-Flag zurückkam. Ist die Anzahl z.B. größer als 5, handelt 
es sich um einen langen Tastendruck.

Denn bedenke: Die meisten FBs schicken kontinuierlich Frames weg, sobald 
Du eine Taste drückst. IRMP bekommt keine Info darüber, wann eine 
Taste wirklich losgelassen wurde.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Conny G. schrieb:
> Du merkst Dir immer den letzten erkannten Code in einer Variablen.
> Und Du incremetierst in der Interrupt-Routine des Timers einen
> Zeitzähler.

Es geht einfacher: Einfach die Anzahl der hintereinander vorkommenden 
Repetition-Flags mitzählen. Ist sie zum Beispiel größer als 5, handelt 
es sich um einen sehr langen Tastenduck.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Klaus2 schrieb:

> WENN eine Taste gedrückt wurde, warte kurz und entscheide, ob Sie nur
> kurz (dann Operation A) oder länger (dann Operation B) gedrückt wurde.

Sorry, meine Antwort war zu kurz gedacht. Da IRMP keine Infos darüber 
hat, wann die Taste losgelassen wurde, kannst Du Long- und Short-Press 
wirklich nur unterscheiden, indem Du selbst mit einem Timeout arbeitest. 
Mit meiner "Lösung" oben (zählen der Repetition-Flags) kannst Du zwar 
lange Tastendrücke erkennen, aber keine kurzen! ;-)

Deshalb brauchst Du für die kurzen Tastendrücke noch zusätzlich die 
Regel:

Bekommst Du innerhalb einer bestimmten Zeit keinen Frame mehr, handelt 
es sich um einen kurzen Tastendruck. Den Timeout handelst Du Du am 
besten über den Timer ab. Meine Vorredner haben da schon den richtigen 
Weg aufgezeigt.

von Klaus R. (klaus2)


Lesenswert?

Hallo alle zusammen,

GENAU so hatte ich es vor, aber mein Problem - vermutlich habe ich ein 
Brett vor dem Kopf - ist, wie Frage ich ab, ob nichts mehr kommt?

- In command steht ja IMMER etwas, auch wenn NICHTS empfangen wird? 
(Wollte last_command mit command vergleichen, geht aber nicht, da 
gelatcht)
- Flags ist auch IMMER gesetzt, wenn es einmal gesetzt wurde? (Wollte 
testen, ob wenn das RF einmal gesetzt ist, es nach loslassen (500ms 
später) nicht mehr gesetzt ist)
- if ( irmp_get_data( &irmp_data)) wird gelatched, also ist das auch 
immer wahr? (Ist nach 500ms auch wahr, da ja immer mehr als eine Sequenz 
übertragen wird).

Klar ist mir, wie ich erkenne, DASS eine Taste gedrückt wurde, aber 
nicht, wie ich dann nach zB 200ms und 500ms prüfen kann, ob sie JETZT 
nicht mehr gedrückt ist und darauf entscheide, ob short- oder longpress. 
Und das lässt mir einfach keine Ruhe :)

EDIT: Ich schaue mir eure Vorschläge morgen Abend nochmal an, vll. habe 
ich einfach etwas übersehen...vermtulich habe ich die Möglichkeit "if 
(!irmp_get_data( &irmp_data)) -> Taste ist nicht gedrückt" einfach nicht 
ordentlich genutzt...

Klaus.

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


Lesenswert?

Klaus R. schrieb:

> - if ( irmp_get_data( &irmp_data)) wird gelatched, also ist das auch
> immer wahr? (Ist nach 500ms auch wahr, da ja immer mehr als eine Sequenz
> übertragen wird).

Ja, da ist was dran. Aber: Solange Du die Daten per irmp_get_data() 
nicht abholst, kommt da auch nichts neues mehr rein.

Also mal ins unreine geschrieben:

Zeitpunkt 0: irmp_get_data(...) // check, ob Taste gedrückt
Zeitpunkt 1: while (irmp_get_data(..)) { ; }  // IRMP-Buffer leeren
Zeitpunkt 2: if (irmp_get_data(...) AND repetition) lang(); else kurz()

Wären noch die Zeitpunkte zu wählen... ich schlage da als erste 
Versuchswerte vor:

Zeitpunkt 1: 0 + 100ms
Zeitpunkt 2: 0 + 200ms

Dann weisst Du nach 0,2 sec, ob es ein langer oder kurzer Tastendruck 
ist. Das ist meines Erachtens ein Wert, den ein Mensch als Reaktionszeit 
noch tolerieren wird.

Sonst musst Du mit den Werten ein wenig spielen. Die meisten FBs senden 
ca. 10 Frames pro Sekunde.

von Klaus R. (klaus2)


Lesenswert?

Puh, ich bin schonmal froh, dass ich nicht völlig falsch lag mit meinen 
Vermutungen :)

Ich habe gestern ca 200ms gewartet und bei 180ms einmal "geleert" [Btw: 
Leert "irmp_get_data(..)" denn dann auch 100%ig zB den command-wert, 
also setzt diesen auf 0?], aber 100% hat das nicht funktioniert - mag 
aber daran gelegen haben, dass ich über die api zu sehr verunsichert 
war, als ich festgestellt habe, dass da viel gelatched wird. Ganz normal 
ist mein Anwendungsfall aber auch nicht, gebe ich zu - ich wollte per 
kurzem "Power" ein Gerät ausschalten, per langem dann einen Sleeptimer 
hochsetzen (jeweils 30min+). Aber ich hatte dann die Schnauze voll und 
hab eine extra Taste dafür spendiert, klappt nun - natürlich - genau so, 
wie es soll...aber mich lässt das nicht ganz in Ruhe, rein aus 
akademischem Interesse.

Klaus.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Klaus R. schrieb:
> Ich habe gestern ca 200ms gewartet und bei 180ms einmal "geleert" [Btw:
> Leert "irmp_get_data(..)" denn dann auch 100%ig zB den command-wert,
> also setzt diesen auf 0?],

Wenn irmp_get_data mit FALSE zurückkommt, ist die übergebene Struct 
unberührt.... also unverändert. Halte Dich also allein an den 
Return-Wert.

Es wäre auch Quatsch, command auf 0 zu setzen. Es gibt durchaus gültige 
FB-Befehle, bei denen command == 0 ist.

> aber 100% hat das nicht funktioniert - mag
> aber daran gelegen haben, dass ich über die api zu sehr verunsichert
> war, als ich festgestellt habe, dass da viel gelatched wird.

Ja, aber es wird max. nur ein Frame gelatched - nicht mehr.

> Ganz normal
> ist mein Anwendungsfall aber auch nicht, gebe ich zu - ich wollte per
> kurzem "Power" ein Gerät ausschalten, per langem dann einen Sleeptimer
> hochsetzen (jeweils 30min+). Aber ich hatte dann die Schnauze voll und
> hab eine extra Taste dafür spendiert, klappt nun - natürlich - genau so,
> wie es soll...aber mich lässt das nicht ganz in Ruhe, rein aus
> akademischem Interesse.

Das "Entprellen" von Tasten (mit Absicht in Gänsefüßchen) soll nur 
verhindern, dass bei einer Zahleneingabe eine Taste mehrfach 
interpretiert wird. Deshalb das Beispiel im Artikel, wo Frames mit 
gesetztem Flag einfach ignoriert werden - im Gegensatz zu Volume-Tasten 
beim Fernseher.

Dein Anwendungsfall ist da schon etwas komplexer... und untypisch für 
IR-Fernbedienungen. Aber mit dem oben aufgezeigtem Weg Einlesen, Leeren, 
nochmal Einlesen sollte es gehen.

Gruß,

Frank

von Joachim B. (jar)


Lesenswert?

Klaus R. schrieb:
> Ich habe gestern ca 200ms gewartet und bei 180ms einmal "geleert" [Btw:
> Leert "irmp_get_data(..)" denn dann auch 100%ig zB den command-wert,
> also setzt diesen auf 0?], aber 100% hat das nicht funktioniert

die Probleme habe ich ja auch und noch immer keine Lösung, aber kann ja 
noch kommen

> ....dass da viel gelatched wird. Ganz normal
> ist mein Anwendungsfall aber auch nicht, gebe ich zu

bei mir auch, aber der "Erfinder" meint mein Fall ist ungewöhnlich und 
die Lösung nah

> ...aber mich lässt das nicht ganz in Ruhe, rein aus
> akademischem Interesse.
> Klaus.

na mal sehen vielleicht findet sich auch für mich irgendwann ne Lösung

Es war aber einfacher mit dem RC5 toogle Bit (scnr)

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Joachim B. schrieb:
> die Probleme habe ich ja auch und noch immer keine Lösung, aber kann ja
> noch kommen

Auf Deinen Kommentar habe ich schon gewartet ;-)

> na mal sehen vielleicht findet sich auch für mich irgendwann ne Lösung

Genau so machen wie oben aufgezeigt.

> Es war aber einfacher mit dem RC5 toogle Bit (scnr)

Das Toggle-Bit gibt es nicht bei seiner FB. Vergiss das doch mal 
endlich.

von Joachim B. (jar)


Lesenswert?

Frank M. schrieb:
> Das Toggle-Bit gibt es nicht bei seiner FB. Vergiss das doch mal
> endlich.

war doch nicht böse gemeint, ich sagte ja schon mehrfach, dein Code ist 
genial und ich setze ihn gerne ein und danke dafür nochmal.

> Genau so machen wie oben aufgezeigt.

du kannst ja nix dafür das ich so unfähig bin

- nur für meine alte Steuerung hatte ich da halt Probleme, aber die ist 
tot, von daher alles im grünen Bereich ;-) -

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


Lesenswert?

Joachim B. schrieb:
> - nur für meine alte Steuerung hatte ich da halt Probleme, aber die ist
> tot, von daher alles im grünen Bereich ;-) -

Wieder ein Problem ausgesessen ;-)

von Klaus R. (klaus2)


Lesenswert?

...und ich freue mich, dass mein Problem etwas ungewöhnlicher ist und 
nicht so einfach zu lösen. jetzt muss ich mich nur noch selbst davon 
überzuegen, dass das mit einer Taste mehr auch iO ist und ich mich 
lieber auf die letzten 3 Projektschritte stürze, als meine Selbstachtung 
zu retten :)

Klaus.

von Ulli (Gast)


Lesenswert?

Ich baue gerade eine IR TX & RX Schaltung auf die auf 3.3Volt 
Versorgungsspannung basiert.

Was denkt Ihr, kann ich die identische Schaltung für TX und RX einfach 
bei 3.3 Volt betreiben?
Der Basiswiderstand für die IR Diode würde ich mit 1k dimensionieren.
Laut Datenblatt des TSOP1736 sollte dies ebenso kein Problem 
darstellen...

Was denkt ihr?

von Klaus R. (klaus2)


Lesenswert?

Ich denke, schnapp dirn Bollerwagen und feier mal sauber den 1. Mai.

Klaus.

von Michael K. (Gast)


Lesenswert?

Ulli schrieb:
> Was denkt ihr?
Tx ist kein Problem: einfach den Vorwiderstand anpassen. Aber der 
TSOP1736 wird mit 3.3V Versorgungsspannung nicht funktionieren, sondern 
erst ab 4.5V. Aber es gibt andere die das tun, z.B. TSOP34836.

von Ulli (Gast)


Lesenswert?

Mir ist gestern noch aufgefallen das der BC337 ja nur mit einer 
Basisspannug von 5 Volt durchschaltet? Welchen nehm ich da dann am 
besten?
Als Vorwiderstand meinst du die 33 Ohm, Was nehm ich dann da am besten?
Sind 22 Ohm passend?

von Michael K. (Gast)


Lesenswert?

Ulli schrieb:
> Mir ist gestern noch aufgefallen das der BC337 ja nur mit einer
> Basisspannug von 5 Volt durchschaltet?
Nein, das ist ein normaler Transistor - da brauchst du keine 5V. Die 
Schaltung aus dem Artikel kannst du 1:1 verwenden und mit R1 kannst du 
den Strom durch die Diode einstellen (siehe deren Datenblatt). Bau es 
erstmal auf wie im Artikel, vielleicht funktioniert es ja schon 
ausreichend gut. Und wenn die Reichweite zu gering ist, kannst du es 
vielleicht mit R1 hinzudrehen.

von Michael K. (Gast)


Lesenswert?

Bei zu geringer Reichweite kannst du auch R2 noch auf 3.3k verringern.

von eku (Gast)


Lesenswert?

Hallo ukw,

in SVN Rev 121 hast Du zwei Themen vermischt. Würdest Du bitte die 
Commits in Zukunft nach Themen aufteilen. Dadurch erleichterst Du die 
Übernahme der Änderungen in andere Projekte. Im konkreten Fall hätten 
wir nur die Korrektur des Siemens-Protokolls gebraucht. Ein svn diff 
-r120:121 enthält leider auch das RCMM-Protokoll. Schade.

Grüße, eku

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

eku schrieb:
> in SVN Rev 121 hast Du zwei Themen vermischt.

Sorry, werde es versuchen, kann es aber nicht immer versprechen.

von kaihs (Gast)


Lesenswert?

Ich habe in einem Projekt (culfw) das eine ältere Version von IRMP 
nutzte einen Update auf die Version 2.4 gemacht, da das Senden von 
RC6/Philips nicht funktionierte.

Das funktioniert jetzt in der 2.4, dafür funktionierte das Senden von 
Samsung nicht mehr, Samsung32 dagegen immer noch.

Ich habe dann die letzten Änderungen die am Samsung-Timing vorgenommen 
worden sind wieder rückgängig gemacht, d.h.
1
#define SAMSUNG_1_PAUSE_TIME                    1650.0e-6                       // 1650 usec pause
2
#define SAMSUNG_0_PAUSE_TIME                     550.0e-6                       //  550 usec pause

wieder in
1
#define SAMSUNG_1_PAUSE_TIME                    1450.0e-6                       // 1450 usec pause
2
#define SAMSUNG_0_PAUSE_TIME                     450.0e-6                       //  450 usec pause

geändert.
Dann funktioniert das Senden von Samsung wieder, aber das Senden von 
Samsung32 ist unzuverlässiger geworden.

Kann es sein, dass die beiden Samsung Protokolle unterschiedliches 
Timing haben, 1650/550 für Samsung32 und 1450/450 für Samsung?

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

kaihs schrieb:
> Kann es sein, dass die beiden Samsung Protokolle unterschiedliches
> Timing haben, 1650/550 für Samsung32 und 1450/450 für Samsung?

Nein, eigentlich ist das Timing identisch. Leider ist es so, dass das 
Timing je nach Hersteller durchaus mal etwas abweichen kann.

Kannst Du mal die Mittelwerte ausprobieren, um festzustellen, ob dann 
wieder beide Protokolle zuverlässig funktionieren?

Also:
1
#define SAMSUNG_1_PAUSE_TIME                    1550.0e-6 // 1550 usec pause
2
#define SAMSUNG_0_PAUSE_TIME                     500.0e-6 //  500 usec pause

Wenn das so klappt, werde ich das übernehmen.

von kaihs (Gast)


Lesenswert?

In der Annahme, dass auch Samsung Ingenieure 'glatte' Zahlen bevorzugen 
habe ich die Werte mal auf
1
#define SAMSUNG_1_PAUSE_TIME                    1500.0e-6 // 1500 usec pause
2
#define SAMSUNG_0_PAUSE_TIME                     500.0e-6 //  500 usec pause

geändert.

Dann funktionieren beide Codes bei mir.

Wäre schön, wenn du das übernehmen würdest.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

kaihs schrieb:
> In der Annahme, dass auch Samsung Ingenieure 'glatte' Zahlen bevorzugen
> habe ich die Werte mal auf
>
>
1
> #define SAMSUNG_1_PAUSE_TIME                    1500.0e-6 // 1500 usec 
2
> pause
3
> #define SAMSUNG_0_PAUSE_TIME                     500.0e-6 //  500 usec 
4
> pause
5
>
>
> geändert.
>
> Dann funktionieren beide Codes bei mir.

Freut mich! Übernehme ich gern. Kommt mit dem nächsten Update.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Es sind neue Updates im SVN verfügbar:

IRMP: Version 2.5.3:

    05.06.2014: Neues Protokoll: LGAIR
    30.05.2014: Neues Protokoll: SPEAKER
    30.05.2014: Timings für SAMSUNG-Protokolle optimiert

IRSND: Version 2.5.2:

    03.06.2014: Neues Protokoll: TELEFUNKEN
    30.05.2014: Neues Protokoll: SPEAKER
    30.05.2014: Timings für SAMSUNG-Protokolle optimiert

LGAIR ist ein von LG verwendetes Protokoll für Klimaanlagen. Das habe 
ich anhand von Scans von einem IRMP-User aus Ungarn erfolgreich 
entschlüsseln können. Das Senden über IRSND steht noch aus, kommt aber 
in Kürze. Damit kann man seine Klimaanlage nun auch programmgesteuert 
(oder mit Remote IRMP auch übers INTERNET oder Handy) fernsteuern.

SPEAKER ist ein Protokoll zur Fernsteuerung von Lautsprechersystemen 
(ähnlich NUBERT).

: Bearbeitet durch Moderator
von Jörg R. (jrie)


Lesenswert?

IRSND auf STM32F10x

Ich habe IRMP und IRSND auf einen STM32F105 angepasst.
Ich hätte ein paar Verbesserungsvorschläge.
Timer10 gibt es oft nicht, daher schlage ich als Default Timer4 vor. Der 
liegt per Default an B6.
Der Kommentar in Zeile 610 in irsnd.c („TODO: remapping required“) 
klingt für mich so, als ob remapping nötig wäre. Falls man den Default 
Pin benutzt, ist das aber nicht der Fall.
Falls man tatsächlich remappen muss, ist zusätzlich noch die Aktivierung 
von AFIO nötig, sonst geht es nicht.
Man sollte sich unbedingt Kapitel 9.3.7 im Referenzhandbuch (RM0008) und 
im Datenblatt die Tabelle "Pin definitions" ansehen und in 
stm32f10._gpio.c die diversen GPIO_Remap Argumente.

--- IRMP1/irsnd.c       2014-06-23 08:58:42.000000000 +0200
+++ IRMP2/irsnd.c       2014-07-04 16:18:27.891586612 +0200
@@ -590,6 +590,7 @@
         RCC_AHBPeriphClockCmd(IRSND_PORT_RCC, ENABLE);
 #    elif defined (ARM_STM32F10X)
         RCC_APB2PeriphClockCmd(IRSND_PORT_RCC, ENABLE);
+//        RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); // only 
in case of remapping, not necessary for default port-timer mapping
 #    elif defined (ARM_STM32F4XX)
         RCC_AHB1PeriphClockCmd(IRSND_PORT_RCC, ENABLE);
 #    endif
@@ -607,7 +608,7 @@
         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
         GPIO_Init(IRSND_PORT, &GPIO_InitStructure);
-        GPIO_PinRemapConfig(, ENABLE);         // TODO: remapping 
required
+//        GPIO_PinRemapConfig(GPIO_*Remap*_TIM[IRSND_TIMER_NUMBER], 
ENABLE); // only in case of remapping, not necessary for default 
port-timer mapping
 #    endif

         /* TIMx clock enable */
diff -Nru IRMP1/irsndconfig.h IRMP2/irsndconfig.h
--- IRMP1/irsndconfig.h 2014-06-23 08:58:42.000000000 +0200
+++ IRMP2/irsndconfig.h 2014-07-04 16:03:28.815837848 +0200
@@ -113,10 +113,10 @@
  * ARM STM32 section:
  *----------------------------------------------------------------------- 
------------------------------------------------------------------------ 
----
  */
-#elif defined (ARM_STM32) 
// use A6 as IR output on STM32
-#  define IRSND_PORT_LETTER                     A
+#elif defined (ARM_STM32) 
// use B6 as IR output on STM32
+#  define IRSND_PORT_LETTER                     B
 #  define IRSND_BIT_NUMBER                      6
-#  define IRSND_TIMER_NUMBER                    10
+#  define IRSND_TIMER_NUMBER                    4
 #  define IRSND_TIMER_CHANNEL_NUMBER            1 
// only channel 1 can be used at the moment, others won't work

 /*---------------------------------------------------------------------- 
------------------------------------------------------------------------ 
-----

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Hallo Jörg,

Jörg R. schrieb:
> Ich habe IRMP und IRSND auf einen STM32F105 angepasst.

Danke für die Verbesserungsvorschläge. Ich schaue, dass ich die 
Änderungen in die nächste IRMP-Version mit einfließen lasse. Könnstest 
Du dann - wenn es soweit ist - das Resultat nochmal testen, um 
auszuschließen, dass ich etwas übersehen habe?

Könntest Du Deine diffs nochmal eingebettet in
1
[code]
2
...
[/code]

reinstellen? Das lässt sich wegen den Zeilenumbrüchen dann besser lesen.

Viele Grüße,

Frank

: Bearbeitet durch Moderator
von Jörg R. (jrie)


Lesenswert?

Hallo Frank,
ok, und hier nochmal in Code Tags:
1
--- IRMP1/irsnd.c       2014-06-23 08:58:42.000000000 +0200
2
+++ IRMP2/irsnd.c       2014-07-04 16:18:27.891586612 +0200
3
@@ -590,6 +590,7 @@
4
         RCC_AHBPeriphClockCmd(IRSND_PORT_RCC, ENABLE);
5
 #    elif defined (ARM_STM32F10X)
6
         RCC_APB2PeriphClockCmd(IRSND_PORT_RCC, ENABLE);
7
+//        RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); // only in case of remapping, not necessary for default port-timer mapping
8
 #    elif defined (ARM_STM32F4XX)
9
         RCC_AHB1PeriphClockCmd(IRSND_PORT_RCC, ENABLE);
10
 #    endif
11
@@ -607,7 +608,7 @@
12
         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
13
         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
14
         GPIO_Init(IRSND_PORT, &GPIO_InitStructure);
15
-        GPIO_PinRemapConfig(, ENABLE);         // TODO: remapping required
16
+//        GPIO_PinRemapConfig(GPIO_*Remap*_TIM[IRSND_TIMER_NUMBER], ENABLE); // only in case of remapping, not necessary for default port-timer mapping
17
 #    endif
18
19
         /* TIMx clock enable */
20
diff -Nru IRMP1/irsndconfig.h IRMP2/irsndconfig.h
21
--- IRMP1/irsndconfig.h 2014-06-23 08:58:42.000000000 +0200
22
+++ IRMP2/irsndconfig.h 2014-07-04 16:03:28.815837848 +0200
23
@@ -113,10 +113,10 @@
24
  * ARM STM32 section:
25
  *---------------------------------------------------------------------------------------------------------------------------------------------------
26
  */
27
-#elif defined (ARM_STM32)                                               // use A6 as IR output on STM32
28
-#  define IRSND_PORT_LETTER                     A
29
+#elif defined (ARM_STM32)                                               // use B6 as IR output on STM32
30
+#  define IRSND_PORT_LETTER                     B
31
 #  define IRSND_BIT_NUMBER                      6
32
-#  define IRSND_TIMER_NUMBER                    10
33
+#  define IRSND_TIMER_NUMBER                    4
34
 #  define IRSND_TIMER_CHANNEL_NUMBER            1                       // only channel 1 can be used at the moment, others won't work
35
36
 /*---------------------------------------------------------------------------------------------------------------------------------------------------
Viele Grüße,
Jörg

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


Lesenswert?

Jörg R. schrieb:
> ok, und hier nochmal in Code Tags:

Vielen Dank! Ich habe Deine Änderungen als Version 2.6.1 ins SVN 
eingecheckt.

Gruß,

Frank

von Jörg R. (jrie)


Lesenswert?

Hallo Frank,

hier noch zusätzliche Änderungen.

* C13 ist ungeeignet, daher lieber C6.
* includes für STM32F10x
1
diff -Nru I1/irmpconfig.h I2/irmpconfig.h
2
--- I1/irmpconfig.h     2014-07-21 11:05:03.000000000 +0200
3
+++ I2/irmpconfig.h     2014-07-25 16:33:35.819776900 +0200
4
@@ -121,9 +121,9 @@
5
  * Change hardware pin here for ARM STM32
6
  *---------------------------------------------------------------------------------------------------------------------------------------------------
7
  */
8
-#elif defined (ARM_STM32)                                               // use C13 as IR input on STM32
9
+#elif defined (ARM_STM32)                                               // use C6 as IR input on STM32
10
 #  define IRMP_PORT_LETTER                      C
11
-#  define IRMP_BIT_NUMBER                       13
12
+#  define IRMP_BIT_NUMBER                       6
13
14
 /*---------------------------------------------------------------------------------------------------------------------------------------------------
15
  * Change hardware pin here for Stellaris ARM Cortex M4
16
diff -Nru I1/irmpsystem.h I2/irmpsystem.h
17
--- I1/irmpsystem.h     2014-07-21 11:05:03.000000000 +0200
18
+++ I2/irmpsystem.h     2014-07-25 16:49:36.760388800 +0200
19
@@ -95,6 +95,11 @@
20
 #  define PROGMEM volatile
21
 #  define memcpy_P memcpy
22
 #  define APP_SYSTICKS_PER_SEC          32
23
+#elif defined(ARM_STM32F10X)
24
+#  include "stm32f10x_gpio.h"
25
+#  include "stm32f10x_rcc.h"
26
+#  define PROGMEM
27
+#  define memcpy_P                      memcpy
28
 #else
29
 #  define PROGMEM
30
 #  define memcpy_P                      memcpy

Und falls es jemanden interessiert, hier der Link zu meinem Projekt:
http://www.vdr-portal.de/board18-vdr-hardware/board13-fernbedienungen/p1204818-irmp-auf-stm32-ideen-f%C3%BCr-einen-usb-ir-empf%C3%A4nger-sender-einschalter-mit-rtc/

Viele Grüße,
Jörg

von Ulli (Gast)


Lesenswert?

Hallo zusammen,

ich bau gerade eine neue Schaltung auf und habe eine Frage an euch.
Ich möchte einen TSOP4836 über 5Volt versorgen, habe einen Pullup (10K) 
am Ausgang nach 5Volt, 100Ohm in Reihe und 4.7µF parallel. Wie im 
Datenblatt beschrieben.
Der Ausgang des TSOP4836 hängt an einen ADC Eingang eines Atmega 328p, 
welcher 3.3Volt versorgt ist.
Denkt Ihr das ich aufgrund der unterschiedlichen Versorgungsspannungen 
ein Problem bekomme, oder sollte das so funktionerien? ggf. den Pullup 
raus?

Wäre sehr dankebar über Hinweise. Habe die Schaltung nämlich schon beim 
Ätzer.....

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Ulli schrieb:
> ich bau gerade eine neue Schaltung auf und habe eine Frage an euch.
> Ich möchte einen TSOP4836 über 5Volt versorgen, habe einen Pullup (10K)
> am Ausgang nach 5Volt, 100Ohm in Reihe und 4.7µF parallel. Wie im
> Datenblatt beschrieben.

Der TSOP4836 hat intern schon einen 30k Pullup, siehe Blockdiagramm. 
Daher ist ein weiterer Pullup nur optional und nicht unbedingt vonnöten.

> Der Ausgang des TSOP4836 hängt an einen ADC Eingang eines Atmega 328p,
> welcher 3.3Volt versorgt ist.

Warum nimmst Du dann keinen TSOP, der auch mit 3,3V als 
Versorgungsspannung auskommt?

> Denkt Ihr das ich aufgrund der unterschiedlichen Versorgungsspannungen
> ein Problem bekomme, oder sollte das so funktionerien? ggf. den Pullup
> raus?

Ja, nimm den Pullup raus. Ob der ATmega328 Dir das übel nimmt, wenn er 
über 30kOhm 5V sieht, kann ich nicht beurteilen. Aber schön ist anders 
;-)

von Ulli (Gast)


Lesenswert?

Das Problem ist die Schaltung ist schon fix...müsste aus der geätzten 
Platine dann mit dem Dremel die Leitung unterbrechen und fädeln...suche 
gerade eine Lösung für ein schon verbocktes Layout :)

Eigentlich wäre der TSOP34836 auf 3.3V die Lösung richtig?
Den gibt es nur weder bei Conrad noch bei Bürklin....

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Ulli schrieb:
> Eigentlich wäre der TSOP34836 auf 3.3V die Lösung richtig?

Ja, der wäre richtig.

> Den gibt es nur weder bei Conrad noch bei Bürklin....

Alternative wäre TSOP 31238 bzw. TSOP 31236, den gibts bei Reichelt. 
Allerdings hat der ein anderes Pinout.

von Ulli (Gast)


Lesenswert?

Ja stimmt, das Problem sind überall die Versandkosten. Reichelt hat auch 
5.6€. Conrad und Bürklin kann ich abholen :)
Sehe nicht ein Cent Artikel zu bestellen und 6€ Versand dafür zu 
bezahlen.

von Michael K. (Gast)


Lesenswert?

Laut http://www.vishay.com/docs/82459/tsop48.pdf kann doch der TSOP4836 
mit 3.3V betrieben werden, oder sehe ich das falsch?

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Michael K. schrieb:
> Laut http://www.vishay.com/docs/82459/tsop48.pdf kann doch der TSOP4836
> mit 3.3V betrieben werden, oder sehe ich das falsch?

Ja. Hier steht ab 2,5V. Gestern hatte ich über Google ein älteres 
erwischt (1. Link unterhalb der Bilder), das stand noch 4,5-5.V drin. 
Aber auch das Datenblatt, welches bei Conrad verlinkt ist, sagt ab 2,5V.

Passt also wohl.

von Joachim B. (Gast)


Angehängte Dateien:

Lesenswert?

hallo Frank, ich mal wieder....

ich habe immer noch Probleme mit der Entprellung der Tasten

bin ich zu doof spinnt meine Hardware ?

vielleicht schaust du noch mal

autorepeat geht, aber Einzelschritt halt nie, entweder es kommen gleich 
2 Schritte oder keiner was bei PRG++/-- doof ist

von Bruno M. (brumay)


Lesenswert?

Hallo,

Ich weiß nicht, ob meine Frage hier an die richtige Stelle kommt, aber 
ich bekomme den Code im Studio 4 nicht zum Laufen. Leider kenne ich bei 
"C" nur Grundbegriffe, bin schon eher in ASM zu Hause.

Die Fehlermeldung sieht wie folgt aus:

quote
Build started 6.8.2014 at 15:01:36
mmcu=atmega88 -Wall -gdwarf-2 -std=gnu99               -DF_CPU=8000000UL 
-Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -MD 
-MP -MT main.o -MF dep/main.o.d  -c  ../main.c
/usr/bin/sh: -Wall: command not found
make: [main.o] Error 127 (ignored)
mmcu=atmega88 -Wall -gdwarf-2 -std=gnu99               -DF_CPU=8000000UL 
-Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -MD 
-MP -MT irmp.o -MF dep/irmp.o.d  -c  ../irmp.c
/usr/bin/sh: -Wall: command not found
make: [irmp.o] Error 127 (ignored)
mmcu=atmega88 -Wl,-Map=irmp.map main.o irmp.o     -o irmp.elf
/usr/bin/sh: -Wl,-Map=irmp.map: command not found
make: [irmp.elf] Error 127 (ignored)
avr-objcopy -O ihex -R .eeprom -R .fuse -R .lock -R .signature  irmp.elf 
irmp.hex
avr-objcopy: 'irmp.elf': No such file
make: *** [irmp.hex] Error 1
Build failed with 1 errors and 0 warnings...
unquote

Ich habe den Ursprungscode nicht verändert.

Kann mir jemand helfen?

Gruß Bruno

von Joachim B. (Gast)


Lesenswert?

Bruno M. schrieb:
> Ich weiß nicht, ob meine Frage hier an die richtige Stelle kommt, aber
> ich bekomme den Code im Studio 4 nicht zum Laufen.

ist Studio 4 richtig installiert ?

schon einmal eine LED zum blinken bekommen ?

ich habe es gerade versucht

neues Projekt Test eröffnet

Source Code von IRMP eingestellt im Projektordner
MCU gewählt, Takt bekannt gemacht und läuft durch ohne Fehler.....



avr-gcc -mmcu=atmega88 -Wl,-Map=nurso.map nurso.o irmp.o irmpextlog.o 
-o nurso.elf
.....
Program:    2356 bytes (28.8% Full)
Build succeeded with 0 Warnings...

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Bruno M. schrieb:
> Build started 6.8.2014 at 15:01:36
> mmcu=atmega88 -Wall -gdwarf-2 -std=gnu99               -DF_CPU=8000000UL
> -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -MD
> -MP -MT main.o -MF dep/main.o.d  -c  ../main.c
> /usr/bin/sh: -Wall: command not found

Da fehlt vorne am Anfang der Zeile der Compiler-Aufruf. Scheinbar ist 
Dein WinAVR (avr-gcc toolchain) zum AVR Studio nicht installiert bzw. 
AVR Studio hat es nicht gefunden.

von Joachim B. (Gast)


Lesenswert?

Frank M. schrieb:
> Da fehlt vorne am Anfang der Zeile der Compiler-Aufruf. Scheinbar ist
> Dein WinAVR (avr-gcc toolchain) zum AVR Studio nicht installiert bzw.
> AVR Studio hat es nicht gefunden.

Ich habe mir die Installationsreihenfolge so notiert:

1. winAVR
2. AVR-Studio

dann findet A-Studio auch gleich den AVR gcc und bindet ihn mit ein

Frank, kannst du bitte noch mal zu meiner Frage schauen 3 Beiträge höher 
?
danke

von Bruno M. (brumay)


Lesenswert?

Vorab herzlichen Dank für die verschiedenen Hinweise.

Auch wenn das Problem richtig erkannt wurde, hat es mir noch nicht 
geholfen.

Nachdem ich WINAVR und das Studio insgesamt 3 x in unterschiedlichen 
Verzeichnissen neu installiert habe und die Fehlermeldung gleich 
geblieben ist, habe ich versucht im Internet eine Antwort zu finden. Nun 
bin ich insoweit schlauer, dass bei meinem Studio 4.19 der Link zu 
WINAVR nicht mehr automatisch hergestellt wird, da jetzt eine eigene AVR 
- Toolchain integriert ist. Ich habe auch gefunden, wie und wo man die 
entsprechenden Links manuell eintragen kann, was ich dann mit älteren 
Codes, die früher schon mal gelaufen sind, erfolgreich versucht habe.

Bei IRMP hat aber auch das nicht zum Erfolg geführt. Es gibt jetzt eine 
neue Fehlermeldung, mit der ich nichts anfangen kann.

quote
rm -rf main.o irmp.o  irmp.elf dep/* irmp.hex irmp.eep irmp.lss irmp.map
Build succeeded with 0 Warnings...
gcc  -mmcu=atmega88 -Wall -gdwarf-2 -std=gnu99 
-DF_CPU=8000000UL -Os -funsigned-char -funsigned-bitfields -fpack-struct 
-fshort-enums -MD -MP -MT main.o -MF dep/main.o.d  -c  .
./main.c

gcc: CreateProcess: No such file or directory
make: *** [main.o] Error 1
Build failed with 1 errors and 0 warnings...
unquote

Bruno

von Joachim B. (Gast)


Lesenswert?

Bruno M. schrieb:
> dass bei meinem Studio 4.19

das kann der Ärger sein, ich glaube ich habe die 4.19 wieder 
rausgeworfen und arbeite überall mit der 4.18

von Joachim B. (Gast)


Lesenswert?

Bruno M. schrieb:
> gcc: CreateProcess: No such file or directory

hast du win-avr (gcc) nicht installiert ?

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Bruno M. schrieb:
> gcc: CreateProcess: No such file or directory

Der Compiler heisst avr-gcc, nicht gcc. Schau doch mal in Deiner 
Toolchain im Verzeichnis bin nach.

von Bruno M. (brumay)


Lesenswert?

Frank M. schrieb:

> Der Compiler heisst avr-gcc, nicht gcc. Schau doch mal in Deiner
> Toolchain im Verzeichnis bin nach.

In meinem WINAVR heißt er tatsächlich gcc.exe und darauf habe ich den 
Link gesetzt. Auch ein Umbenennen der Datei in avr-gcc.exe ergibt den 
gleichen Fehler, nur eben dann mit avr-gcc.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Bruno M. schrieb:
> In meinem WINAVR heißt er tatsächlich gcc.exe [...]

Merkwürdig. Habe ich noch nie gesehen. Wo liegt er denn? Also in welchem 
Pfad? Ich habe mein WinAVR direkt unter C:\ liegen. Es könnte Probleme 
geben, wenn im Pfad Leerzeichen sind.

Ausserdem habe ich hier mittlerweile avr-gcc V.4.8.1 laufen.

Vorgehen:

  http://www.atmel.com/tools/ATMELAVRTOOLCHAINFORWINDOWS.aspx

Dort

    Atmel AVR 8-bit Toolchain 3.4.4 - Windows

heruntergeladen. Dieses habe ich dann unter C:\WinAVR\avr-gcc-4.8.1 
abgelegt, also dass avr-gcc.exe in dem Ordner 
C:\WinAVR\avr-gcc-4.8.1\bin zum Liegen kommt.

Dann folgendes als reg-Datei gespeichert und ausgeführt:
1
Windows Registry Editor Version 5.00
2
3
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\WinAVR]
4
"DisplayVersion"="20100110"
5
"UninstallString"="C:\\WinAVR\\avr-gcc-4.8.1\\WinAVR-20100110-uninstall.exe"

Das ist ein bisschen tricky: Das AVR Studio 4.18 (ja, ich benutze 18 und 
nicht 19) merkt sich im UninstallString, wo das WinAVR-Verzeichnis 
liegt.

Das dort angegebene Programm WinAVR-20100110-uninstall.exe existiert gar 
nicht. Ist auch vollkommen schnuppe. Es geht nur um den Pfad.

Dann kann man unter den Projekt-Eigenschaften (Project -> Configuration 
Options -> Custom Options) einfach bei "Use WinAVR" ein Häkchen machen 
und es wird der neue Compiler benutzt.

Achja, in dem alten Verzeichnis WinAVR-20100110 (oder so ähnlich) gibt 
es ein Unterverzeichnis namens utils. Es empfiehlt sich, dieses nach 
WinAVR\avr-gcc-4.8.1 rüberzukopieren und die Umgebungsvariable PATH 
entsprechend auf den Pfad ....\utils\bin auszurichten. Denn dort 
befinden sich make & Co, die nicht Bestandteil der avr-gcc-Toolchain 
sind.

Wenn das alles bei Dir nicht funktioniert, dann versuchs doch lieber mit 
einer aktuelleren IDE, z.B. Atmel Studio 6.2. Da hast Du alles 
"all-in-one".

von Bruno M. (brumay)


Lesenswert?

Hallo Frank,
Du gibst Dir wirklich Mühe. Ich bin beeindruckt.

> Merkwürdig. Habe ich noch nie gesehen. Wo liegt er denn? Also in welchem
> Pfad? Ich habe mein WinAVR direkt unter C:\ liegen. Es könnte Probleme
> geben, wenn im Pfad Leerzeichen sind.

Ich habe mir für Dein Projekt die aktuellste Version von WINAVR 
runtergeladen.

Der Pfad ist : C:\WINAVR\avr\bin

Nun aber die gute Nachricht:

Da ich es leid war habe ich mir das Studio 4.18 installiert und siehe da 
alles lief wie geschmiert.

Das diente aber nur zum Testen auf meinem alten XP-Rechner. Eigentlich 
arbeite ich auch schon länger mit Studio 6. Weil ich aber schon mehrfach 
Probleme hatte beim Import von Studio 4 Projekten, hatte ich das gar 
nicht erst versucht.
Nun habe ich aber auch das mit Erfolg gelöst. Importieren klappte zwar 
nicht, aber ein neues Projekt mit Einfügen der Dateien läuft jetzt 
problemlos. Ich mußte allerdings die PROGMEM Variablen von static in 
const ändern.

Nochmals herzlichen Dank für die Unterstützung.

Gruß Bruno

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Bruno M. schrieb:
> Nun habe ich aber auch das mit Erfolg gelöst. Importieren klappte zwar
> nicht, aber ein neues Projekt mit Einfügen der Dateien läuft jetzt
> problemlos.

Eben, das habe ich auch so im Artikel IRMP beschrieben. Ist 
einfacher, als ein Projekt zu importieren.

> Ich mußte allerdings die PROGMEM Variablen von static in const ändern.

Wo hast Du denn diese Uralt-Version von IRMP her? Das habe ich bereits 
vor ca. 2 Jahren angepasst.

Hole Dir besser eine aktuelle Version, siehe Artikel.

von Joachim B. (Gast)


Lesenswert?

Bruno M. schrieb:
> Da ich es leid war habe ich mir das Studio 4.18 installiert und siehe da
> alles lief wie geschmiert.

sag ich doch, ich habe 4.19 auch von allen Rechnern runtergeworfen....


freut mich das es klappte 1

und so bin ich auch vorgegangen, neues Projekt und dort alles reingetan, 
klappt eben am Besten.

von Bruno M. (brumay)


Lesenswert?

Frank M. schrieb:

> Wo hast Du denn diese Uralt-Version von IRMP her? Das habe ich bereits
> vor ca. 2 Jahren angepasst.

Sorry, ich hatte mir wohl die aktuelle Version runtergeladen, dann aber 
offensichtlich bei wiederholtem Kopieren Dateien aus einem 
Anwendungsprojekt (IRMP-LCD) genommen.

von Karol B. (johnpatcher)


Lesenswert?

Hi Frank,

was hat es eigentlich mit der Differenz der Versionen im SVN und dem 
Wiki auf sich? Im Wiki ist Version 2.4.0 aktuell, im SVN findet sich 
schon Version 2.6.2 und ein entsprechender Tarball kann heruntergeladen 
werden.

Hast du nur vergessen den Wiki-Artikel zu aktualisieren, oder gibt es 
Gründe warum du Version 2.6.2 noch "zurück" hältst? Nicht, dass ich 
konkrete Probleme hätte, würde aber gerne stets so aktuell wie möglich 
bleiben, um später die notwendigen Anpassungsarbeiten so gering wie 
möglich zu halten.

Wie immer: Super Arbeit, welche du hier ablieferst, weiter so ;).

Mit freundlichen Grüßen,
Karol Babioch

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Hi Karol,

Karol Babioch schrieb:

> was hat es eigentlich mit der Differenz der Versionen im SVN und dem
> Wiki auf sich?

Reine Faulheit ;-)

Ich habe mir angewöhnt, im SVN immer einen aktuellen (aber nicht 
instabilen) Stand zu halten, um dann Rückmeldungen (Korrekturen, 
Verbesserungen) der User zu den Neuerungen abzuwarten. Nach einer 
gewissen Zeit "erkläre" ich dann den aktuellen SVN-Stand zur stabilen 
Version und erstelle dann ein neues ZIP-Archiv zum Download und biete es 
im Artikel an.

Sozusagen eine "very stable" Version als Zip, eine "stable" Version im 
SVN. Eine "unstable" gibts nur auf meinem Rechner.

Leider habe ich aus Zeitgründen diese Abstände immer größer werden 
lassen, wobei ich mir denke, dass dies nicht ganz so schlimm ist. In die 
letzten SVN-Versionen sind eher exotische Protokolle wie Klimaanlagen 
mit eingeflossen. Größere Korrekturen an den bereits etablierten 
Protokollen gab es auch nicht.

Ein weiterer Grund für den großen Abstand ist auch die nötige Pflege des 
Artikels. Solange die Zip-Version sich nicht ändert, muss ich im Artikel 
auch nicht soviel ändern - auch wenn ich hier und da durchaus 
Aktualisierungen vornehme, z.B. die "Entschlüsselung" des 
LG-Air-Protokolls, damit man seine Klimaanlage per µC steuern kann.

> Hast du nur vergessen den Wiki-Artikel zu aktualisieren, oder gibt es
> Gründe warum du Version 2.6.2 noch "zurück" hältst? Nicht, dass ich
> konkrete Probleme hätte, würde aber gerne stets so aktuell wie möglich
> bleiben, um später die notwendigen Anpassungsarbeiten so gering wie
> möglich zu halten.

Wenn Dir an Aktualität gelegen ist, nimm einfach die aktuelle 
SVN-Version. Im allgemeinen ist es so, dass ich diese einfach irgendwann 
in das  Download-Zip-Archiv kopiere.

Aber Du hast recht: Es ist mal wieder Zeit für ein Update. Ich schaue, 
dass ich es bis zum Wochenende schaffe.

> Wie immer: Super Arbeit, welche du hier ablieferst, weiter so ;).

Vielen Dank :-)

Gruß,

Frank

von Jörg R. (jrie)


Lesenswert?

Hallo Frank,
hier weitere Änderungen für den STM32F10x.
1
diff -Nru B/irmpsystem.h A/irmpsystem.h
2
--- B/irmpsystem.h      2014-07-21 11:05:03.000000000 +0200
3
+++ A/irmpsystem.h      2014-08-19 00:24:52.346944900 +0200
4
@@ -37,6 +37,7 @@
5
 #  include <stm32f10x.h>
6
 #  define ARM_STM32
7
 #  define ARM_STM32F10X
8
+#  define F_CPU (SysCtlClockGet())
9
 #elif defined(STM32F4XX)                                                            // ARM STM32
10
 #  include <stm32f4xx.h>
11
 #  define ARM_STM32
12
@@ -95,6 +96,13 @@
13
 #  define PROGMEM volatile
14
 #  define memcpy_P memcpy
15
 #  define APP_SYSTICKS_PER_SEC          32
16
+#elif defined(ARM_STM32F10X)
17
+#  include "stm32f10x_gpio.h"
18
+#  include "stm32f10x_rcc.h"
19
+#  include "stm32f10x_tim.h"
20
+#  include "misc.h"
21
+#  define PROGMEM
22
+#  define memcpy_P                      memcpy
23
 #else
24
 #  define PROGMEM
25
 #  define memcpy_P                      memcpy
und für main.c:
1
/*---------------------------------------------------------------------------------------------------------------------------------------------------
2
 * STM32:
3
 *---------------------------------------------------------------------------------------------------------------------------------------------------
4
 */
5
#elif defined(ARM_STM32)
6
7
uint32_t
8
SysCtlClockGet(void)
9
{
10
    RCC_ClocksTypeDef RCC_ClocksStatus;
11
    RCC_GetClocksFreq(&RCC_ClocksStatus);
12
    return RCC_ClocksStatus.SYSCLK_Frequency;
13
}
14
15
void
16
timer2_init (void)
17
{
18
    TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
19
    NVIC_InitTypeDef NVIC_InitStructure;
20
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
21
22
    TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
23
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
24
    TIM_TimeBaseStructure.TIM_Period = 7;
25
    TIM_TimeBaseStructure.TIM_Prescaler = ((F_CPU / F_INTERRUPTS)/8) - 1;
26
    TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
27
28
    TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);
29
30
    NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
31
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
32
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x0F;
33
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x0F;
34
    NVIC_Init(&NVIC_InitStructure);
35
36
    TIM_Cmd(TIM2, ENABLE);
37
}
38
39
void
40
TIM2_IRQHandler(void)                                                  // Timer2 Interrupt Handler
41
{
42
  TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
43
  (void) irmp_ISR();                                                        // call irmp ISR
44
  // call other timer interrupt routines...
45
}
46
47
int
48
main (void)
49
{
50
    IRMP_DATA irmp_data;
51
        
52
    irmp_init();                                                            // initialize irmp
53
    timer2_init();                                                          // initialize timer2
54
55
    for (;;)
56
    {
57
        if (irmp_get_data (&irmp_data))
58
        {
59
            // ir signal decoded, do something here...
60
            // irmp_data.protocol is the protocol, see irmp.h
61
            // irmp_data.address is the address/manufacturer code of ir sender
62
            // irmp_data.command is the command code
63
            // irmp_protocol_names[irmp_data.protocol] is the protocol name (if enabled, see irmpconfig.h)
64
        }
65
    }
66
}
Das sollte jetzt alles gewesen sein :-)
Gruß, Jörg

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Hallo Jörg,

Jörg R. schrieb:
> hier weitere Änderungen für den STM32F10x.

Vielen Dank, ich habe die Änderungen übernommen. Kommen in die nächste 
SVN-Version und ins ZIP-Release.

Gute Arbeit!

Gruß,

Frank

von Bruno M. (brumay)


Lesenswert?

Hallo Frank,

nachdem ich Deinen Code im Studio6 zum Laufen gebracht habe und auch die 
Hardware funktioniert, tun sich natürlich neue Frage auf:

Für mich als blutigen Anfänger in 'C' ist das Verstehen des Programms 
eine besondere Herausforderung, insbesondere durch die vielen if's.

Was jetzt funktioniert, ist das Loggen der Daten mittels UART. Wenn ich 
aber nun die Protokollnamen haben möchte, muß dann zwangsläufig auch das 
Loggen gewählt werden? Für mich ist das eine Frage des Speichers.

Gruß Bruno

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Bruno M. schrieb:
> Für mich als blutigen Anfänger in 'C' ist das Verstehen des Programms
> eine besondere Herausforderung, insbesondere durch die vielen if's.

Du meinst wohl eher die vielen #if ;-)

Dies ist 2 Dingen geschuldet:

 1. Nur den Code für diejenigen Protokolle compilieren, die auch
    aktiviert sind. Das spart jede Menge Flash und RAM.

 2. Unterstützung von möglichst vielen µCs, u.a. AVR, STM32 und PICs.

> Was jetzt funktioniert, ist das Loggen der Daten mittels UART. Wenn ich
> aber nun die Protokollnamen haben möchte, muß dann zwangsläufig auch das
> Loggen gewählt werden? Für mich ist das eine Frage des Speichers.

Natürlich brauchst Du dafür kein Logging. Dies ist nur dann 
erforderlich, wenn man ein bislang unbekanntes Protokoll analysieren 
möchte. Schalte dies also ab.

Schaue Dir dann die Muster-Main-Datei an. Dort sieht man nach dem Aufruf 
von irmp_get_data(), was zu tun ist, nämlich Protokoll-, Adress und 
Kommando-Vergleich, um dann gezielt zu reagieren.

Viele Grüße,

Frank

von Bruno M. (brumay)


Lesenswert?

Frank M. schrieb:

So lag auch meine Interpretation.

> Schaue Dir dann die Muster-Main-Datei an. Dort sieht man nach dem Aufruf
> von irmp_get_data(), was zu tun ist, nämlich Protokoll-, Adress und
> Kommando-Vergleich, um dann gezielt zu reagieren.

Was passiert aber, wenn kein Protokoll erkannt wird, kommt dann eine 
Negativmeldung oder passiert einfach nichts?

Gruß Bruno

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Bruno M. schrieb:
> Was passiert aber, wenn kein Protokoll erkannt wird, kommt dann eine
> Negativmeldung oder passiert einfach nichts?

Bitte schaue Dir im IRMP-Artikel den folgenden Abschnitt an:

  http://www.mikrocontroller.net/articles/IRMP#Anwendung_von_IRMP

Auszug:
1
   if (irmp_get_data (&irmp_data))
2
   {
3
      if (irmp_data.protocol == IRMP_NEC_PROTOCOL &&     // NEC-Protokoll
4
          irmp_data.address == 0x1234)                   // Adresse 0x1234
5
      {
6
         switch (irmp_data.command)
7
         {
8
            case 0x0001: key1_pressed(); break;          // Taste 1
9
            case 0x0002: key2_pressed(); break;          // Taste 2
10
            ...
11
            case 0x0009: key9_pressed(); break;          // Taste 9
12
         }
13
      }
14
   }

irmp_get_data() liefert also TRUE zurück, wenn ein Protokoll erkannt 
wurde, anderenfalls FALSE.

Im obigen Beispiel wird der Block nur durchlaufen, wenn irmp_get_data() 
TRUE zurückliefert.

Dann sollte man das Protokoll und die Adresse überprüfen, anschließend 
die Kommando-Codes, um dann entsprechend eine Aktion auszuführen.

Obige Werte sind natürlich fiktiv. Diese musst Du erst selbst empirisch 
für Deine Fernbedienung ermitteln, um sie dann verwenden zu können. Dazu 
kannst Du die erhaltenen Werte zunächst auf einem Display oder über UART 
ausgeben... oder was Du sonst noch so an Ausgabeschnittstellen hast.

Eine UART-Routine kann ich gerne hier posten, falls gewünscht.

von Bruno M. (brumay)


Lesenswert?

Bedeutet das, daß ich mit

>
1
>    if (irmp_get_data (&irmp_data))
2
>    {
3
>       if (irmp_data.protocol == FALSE
4
>    }
5
>

weiterarbeiten kann?

von Bruno M. (brumay)


Lesenswert?

Hallo Frank,

ich habe es einfach mal probiert, aber so geht es nicht.

Was muß ich tun um eine Negativmeldung ausgeben zu können?

von Karol B. (johnpatcher)


Lesenswert?

Bruno M. schrieb:
> Was muß ich tun um eine Negativmeldung ausgeben zu können?

Die Rückgabe von irmp_get_data() selbst auswerten.

Also in etwa so (ungetestet):
1
if (irmp_get_data(&irmp_data))
2
{
3
    // Es wurde irgendetwas erkannt
4
} else {
5
    // Es wurde nichts erkannt
6
}

Ich bin mir allerdings nicht so recht sicher was du überhaupt bezwecken 
möchtest. irmp_get_data() ruft man i.d.R. regelmäßig auf und es wird 
wohl weit aus öfter false zurück liefern als umgekehrt.

Mit freundlichen Grüßen,
Karol Babioch

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


Lesenswert?

Bruno M. schrieb:
> Bedeutet das, daß ich mit
>
>>
1
>>    if (irmp_get_data (&irmp_data))
2
>>    {
3
>>       if (irmp_data.protocol == FALSE
4
>>    }
5
>>
>
> weiterarbeiten kann?

Das erste if ist richtig. Dann wurden Daten empfangen und erkannt.

Bedenke auch: irmp_get_data() wartet nicht, sondern kommt sofort zurück, 
wenn nichts empfangen wurde!

Wenn Du warten willst:
1
     while (! irmp_get_data (&irmp_data))
2
     {
3
          ;                // warten
4
     }

Das zweite if ist falsch. Hier musst Du auf einen Wert prüfen, nämlich 
die Protokollnummer. IRMP unterstützt ca. 40 Protokolle. In 
irmp_data.protocol steht dann die erkannte Protokollnummer. Wenn Du sie 
nicht weisst, solltest Du erstmal alle Werte ausgeben, die Deine FB 
sendet, z.b. so:
1
    if (irmp_get_data (&irmp_data))
2
    {
3
        gebeWertaus (irmp_data.command);
4
        gebeWertaus (irmp_data.address);
5
        gebeWertaus (irmp_data.command);
6
        gebeWertaus (irmp_data.flags);
7
    }

Die Funktion gebeWertAus() musst Du selber schreiben, denn ich weiß ja 
nicht, was Du für Hardware benutzt.

Hier siehst Du das z.B. auf Youtube:

  https://www.youtube.com/watch?v=Q7DJvLIyTEI

Wenn Du dann alle Werte hast, kannst Du sie benutzen. Nehmen wir an, Du 
hast empfangen: Protokoll = 2, Adresse = 0x1234 mit

   Kommando = 0x1111   für Taste 1
   Kommando = 0x1112   für Taste 2

Dann kannst Du nun statt dem obigen Block schreiben:
1
    if (irmp_get_data (&irmp_data))
2
    {
3
        if (irmp_data.protocol == 2 && irmp_data.address == 0x1234)
4
        {
5
            switch (irmp_data.command)
6
            {
7
                case 0x1111: led_aus(); break;
8
                case 0x1112: led_an();  break;
9
            }
10
        }
11
    }

Die Funktionen led_aus() und led_an() sind natürlich nur Beispiele.

: Bearbeitet durch Moderator
von Karol B. (johnpatcher)


Lesenswert?

Frank M. schrieb:
> Das zweite if ist falsch.

Ich mag die Frage falsch verstanden haben, aber nach meiner Auffassung 
will er gerade denjenigen Fall abdecken, in welchem IRMP nichts erkannt 
hat, d.h. die Rückgabe von "irmp_get_data()" false ist.

Mit freundlichen Grüßen,
Karol Babioch

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Karol Babioch schrieb:
> Ich mag die Frage falsch verstanden haben, aber nach meiner Auffassung
> will er gerade denjenigen Fall abdecken, in welchem IRMP nichts erkannt
> hat, d.h. die Rückgabe von "irmp_get_data()" false ist.

Okay, den hast Du ja schon beschrieben.

Das Wichtigste: irmp_get_data() wartet nicht.

Wenn man unbedingt warten will:
1
     while (1)                // Hauptschleife
2
     {
3
         ...
4
5
         while (! irmp_get_data (&irmp_data))
6
         {
7
             ;                // warten
8
         }
9
10
         // Jetzt wurde etwas empfangen
11
         verarbeite_daten();
12
     }

Wenn man zwischendurch etwas anderes machen will:
1
     while (1)                // Hauptschleife
2
     {
3
         if (irmp_get_data (&irmp_data))
4
         {
5
             // Jetzt wurde etwas empfangen
6
             verarbeite_daten();
7
         }
8
         else
9
         {
10
              tue_was_anderes ();
11
         }
12
     }

Es kommt also immer auf den Anwendungsfall an.

: Bearbeitet durch Moderator
von Bruno M. (brumay)


Lesenswert?

Ich glaube ich muß meine Frage doch noch etwas präzisieren. Wenn ich es 
richtig verstande4n habe, wird mit

if (irmp_get_data (&irmp_data))

auf ein IR Signal gewartet. Wenn es kommt, kann ich das Signal weiter 
auswerten.
Mir geht es aber jetzt nicht darum festzustellen, ob ein IR Signal 
empfangen wurde (das kann ich ja mit dem Loggen sehr einfach 
überprüfen), sondern ich möchte wissen ob ein passendes Protokoll 
gefunden wurde. Ich kann ja aus der Vielzahl der möglichen Protokolle 
einige auswählen, andere nicht. Das hängt ja schon davon ab wieviel 
Speicher man zur Verfügung hat.
Habe ich also das richtige Protokoll nicht eingeschlossen, reagiert IRMP 
gar nicht. Da hat man (oder auch nur ich) nun am Anfang das Problem, daß 
man nicht genau weiß warum IRMP nicht reagiert. Vielleicht liegt es ja 
auch nur an meinem Code.
Ich habe mir deshalb gedacht, es wäre sinnvoll eine Info zu bekommen, 
wenn zwar ein Signal empfangen wurde, aber kein passendes Protokoll 
gefunden wurde. Diese Info kann ich dann über UART ausgeben und eine 
andere Auswahl bei den Protokollen treffen.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Bruno M. schrieb:
> Habe ich also das richtige Protokoll nicht eingeschlossen, reagiert IRMP
> gar nicht.

Schalte am Anfang soviele Protokolle frei wie möglich. Also alle 
"typical protocols" (4 Stück) und die unter "more protocols" angegebenen 
(9 Stück).

Damit hast Du dann eine 95%-ige Chance, dass IRMP den Code kennt. 
Anschließend kannst Du die nicht benötigten Protokolle wieder 
deaktivieren.

Alternativ kopierst Du hier eine Zeile aus dem LOGGING-Protokoll rein. 
Ich brauche keine Minute, um festzustellen, ob IRMP das Protokoll 
versteht und welches das ist.

: Bearbeitet durch Moderator
von Bruno M. (brumay)


Lesenswert?

Inzwischen bin ich ein Stückchen weiter. Ich habe jetzt mal protocol und 
command abgefragt und bekomme bei einer Fernbedienung als Ausgabe 16 und 
10, bei der anderen nichts. Bedeutet 16 nun das NOKIA Protokoll?

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Bruno M. schrieb:
> Inzwischen bin ich ein Stückchen weiter. Ich habe jetzt mal protocol und
> command abgefragt und bekomme bei einer Fernbedienung als Ausgabe 16 und
> 10, bei der anderen nichts. Bedeutet 16 nun das NOKIA Protokoll?

10 = SAMSUNG32
16 = Nokia

Siehe auch irmpprotocols.h. Da stehen sie alle direkt am Anfang drin.

Insofern kann ich Deine Frage mit "Ja" beantworten :-)

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Frank M. schrieb:
>> Inzwischen bin ich ein Stückchen weiter. Ich habe jetzt mal protocol und
>> command abgefragt und bekomme bei einer Fernbedienung als Ausgabe 16 und
>> 10, bei der anderen nichts. Bedeutet 16 nun das NOKIA Protokoll?

Achso, 10 ist bei Dir ein empfangenes Kommando, nicht eine 
Protokollnummer.

Du solltest aber protocol immer in Kombination mit der Adresse abfragen. 
Denn es könnte durchaus Fernbedienungen in Deinem Haushalt geben, die 
dasselbe Protokoll (z.B. Fernseher und DVD-Player) sprechen, aber 
unterschiedliche Adressen verwenden. Wenn die Adresse verschieden ist, 
kannst Du davon ausgehen, dass gleiche Kommando-Codes nicht von 
derselben Fernbedienung stammen.

Also: Die meisten FBs senden immer dasselbe Protokoll und dieselbe 
Adresse - egal welche Taste gedrückt ist.[*]

Wenn Du diese prüfst, kannst Du davon ausgehen, dass der Anwender die 
richtige Fernbedienung in den Händen hat.

[*] Ausnahmen bestätigen die Regel.

: Bearbeitet durch Moderator
von Bruno M. (brumay)


Lesenswert?

Hallo Frank,
bis hierhin schon mal herzlichen Dank. Ich hatte keine Ahnung, daß 
Fernbedienungen so viel Spaß machen können. Ich habe jetzt mal etwas 
variiert und bekomme nur bei protocol die zwei Werte 10 und 16 
hintereinander. Wenn ich command hinzunehme und zwei bestimmte Tasten 
drücke, bekomme ich folgende ASCII Anzeige.

(10) (16) UNKNOWN (10)
(10) (16) SAMSG32 (10) (die Zahlenwerte sind DEZ)

Welche Erklärung hast Du dafür?

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Bruno M. schrieb:
> bis hierhin schon mal herzlichen Dank. Ich hatte keine Ahnung, daß
> Fernbedienungen so viel Spaß machen können. Ich habe jetzt mal etwas
> variiert und bekomme nur bei protocol die zwei Werte 10 und 16
> hintereinander.

Von ein- und derselben FB bekommst Du 2 verschiedene Protokollnummern? 
Zu 99% kann ich das nicht glauben ;-)

> Wenn ich command hinzunehme und zwei bestimmte Tasten
> drücke, bekomme ich folgende ASCII Anzeige.
>
> (10) (16) UNKNOWN (10)
> (10) (16) SAMSG32 (10) (die Zahlenwerte sind DEZ)

Warum wird einmal UNKNOWN und einmal SAMSG32 ausgegeben, obwohl die 
Zahlenwerte identisch sind?

Welche Tasten sind das? Was ist das für eine Fernbedienung?

Zeige bitte mal Dein dazugehörendes Programm im Ausschnitt, also z.B. 
die while-Hauptschleife. Ich vermute da eher den Fehler.

von Bruno M. (brumay)


Lesenswert?

Frank M. schrieb:

> Warum wird einmal UNKNOWN und einmal SAMSG32 ausgegeben, obwohl die
> Zahlenwerte identisch sind?
>
> Welche Tasten sind das? Was ist das für eine Fernbedienung?

Es ist die FB für einen Panasonic DVD Player und es sind die Tasten 
'Pause' und 'Play'


> Zeige bitte mal Dein dazugehörendes Programm im Ausschnitt, also z.B.
> die while-Hauptschleife. Ich vermute da eher den Fehler.

[c]
for (;;)
    {
        if (irmp_get_data (&irmp_data))
        {
         irmp_uart_putc(0x0a);
    irmp_uart_puts(irmp_data.protocol);
    //irmp_uart_puts(irmp_data.address);
    //irmp_uart_puts(irmp_data.command);
    irmp_uart_putc(0x0a);
  }
    }
[c/]

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Bruno M. schrieb:
>     irmp_uart_puts(irmp_data.protocol);

irmp_uart_puts() erwartet einen String und keine Nummer.

>     //irmp_uart_puts(irmp_data.address);

Dito.

>     //irmp_uart_puts(irmp_data.command);

Dito.

Das erklärt das Verhalten. Du bekommst absoluten Unsinn zu sehen. Die 
übergebene Nummer wird als String-Adresse interpretiert und damit greift 
irmp_uart_puts() irgendwo in Deinen Speicher und versucht das als String 
auszugeben, was da zufälligerweise rumliegt.

Du hast da keine Compiler-Warnung bekommen???

Ausserdem benutzt Du da die IRMP-Logging-Funktionen. Da hauen Dir ja 
noch jede Menge 1en und 0en in den Output. Nicht schön.

Schalte das Logging aus (das ist nur für Analysezwecke) und ersetze den 
kompletten(!) Inhalt Deines main.c mal durch diesen:
1
#include "irmp.h"
2
#define BAUD  9600L
3
#include <util/setbaud.h>
4
5
#ifdef UBRR0H
6
7
#define UART0_UBRRH                             UBRR0H
8
#define UART0_UBRRL                             UBRR0L
9
#define UART0_UCSRA                             UCSR0A
10
#define UART0_UCSRB                             UCSR0B
11
#define UART0_UCSRC                             UCSR0C
12
#define UART0_UDRE_BIT_VALUE                    (1<<UDRE0)
13
#define UART0_UCSZ1_BIT_VALUE                   (1<<UCSZ01)
14
#define UART0_UCSZ0_BIT_VALUE                   (1<<UCSZ00)
15
#ifdef URSEL0
16
#define UART0_URSEL_BIT_VALUE                   (1<<URSEL0)
17
#else
18
#define UART0_URSEL_BIT_VALUE                   (0)
19
#endif
20
#define UART0_TXEN_BIT_VALUE                    (1<<TXEN0)
21
#define UART0_UDR                               UDR0
22
#define UART0_U2X                               U2X0
23
        
24
#else
25
26
#define UART0_UBRRH                             UBRRH
27
#define UART0_UBRRL                             UBRRL
28
#define UART0_UCSRA                             UCSRA
29
#define UART0_UCSRB                             UCSRB
30
#define UART0_UCSRC                             UCSRC
31
#define UART0_UDRE_BIT_VALUE                    (1<<UDRE)
32
#define UART0_UCSZ1_BIT_VALUE                   (1<<UCSZ1)
33
#define UART0_UCSZ0_BIT_VALUE                   (1<<UCSZ0)
34
#ifdef URSEL
35
#define UART0_URSEL_BIT_VALUE                   (1<<URSEL)
36
#else
37
#define UART0_URSEL_BIT_VALUE                   (0)
38
#endif
39
#define UART0_TXEN_BIT_VALUE                    (1<<TXEN)
40
#define UART0_UDR                               UDR
41
#define UART0_U2X                               U2X
42
43
#endif //UBRR0H
44
45
static void
46
uart_init (void)
47
{
48
    UART0_UBRRH = UBRRH_VALUE;                                                                      // set baud rate
49
    UART0_UBRRL = UBRRL_VALUE;
50
51
#if USE_2X
52
    UART0_UCSRA |= (1<<UART0_U2X);
53
#else
54
    UART0_UCSRA &= ~(1<<UART0_U2X);
55
#endif
56
57
    UART0_UCSRC = UART0_UCSZ1_BIT_VALUE | UART0_UCSZ0_BIT_VALUE | UART0_URSEL_BIT_VALUE;
58
    UART0_UCSRB |= UART0_TXEN_BIT_VALUE;                                                            // enable UART TX
59
}
60
61
static void
62
uart_putc (unsigned char ch)
63
{
64
    while (!(UART0_UCSRA & UART0_UDRE_BIT_VALUE))
65
    {
66
        ;
67
    }
68
69
    UART0_UDR = ch;
70
}
71
72
static void
73
uart_puts (unsigned char * s)
74
{
75
    while (*s)
76
    {
77
        uart_putc (*s);
78
        s++;
79
    }
80
}
81
82
static uint8_t
83
itox (uint8_t val)
84
{
85
    uint8_t rtc;
86
87
    val &= 0x0F;
88
89
    if (val <= 9)
90
    {
91
        rtc = val + '0';
92
    }
93
    else
94
    {
95
        rtc = val - 10 + 'A';
96
    }
97
    return (rtc);
98
}
99
100
static void
101
itoxx (unsigned char * xx, unsigned char i)
102
{
103
    *xx++ = itox (i >> 4);
104
    *xx++ = itox (i & 0x0F);
105
    *xx = '\0';
106
}
107
108
static void
109
timer1_init (void)
110
{
111
#if defined (__AVR_ATtiny45__) || defined (__AVR_ATtiny85__)                // ATtiny45 / ATtiny85:
112
113
#if F_CPU >= 16000000L
114
    OCR1C   =  (F_CPU / F_INTERRUPTS / 8) - 1;                              // compare value: 1/15000 of CPU frequency, presc = 8
115
    TCCR1   = (1 << CTC1) | (1 << CS12);                                    // switch CTC Mode on, set prescaler to 8
116
#else
117
    OCR1C   =  (F_CPU / F_INTERRUPTS / 4) - 1;                              // compare value: 1/15000 of CPU frequency, presc = 4
118
    TCCR1   = (1 << CTC1) | (1 << CS11) | (1 << CS10);                      // switch CTC Mode on, set prescaler to 4
119
#endif
120
121
#else                                                                       // ATmegaXX:
122
    OCR1A   =  (F_CPU / F_INTERRUPTS) - 1;                                  // compare value: 1/15000 of CPU frequency
123
    TCCR1B  = (1 << WGM12) | (1 << CS10);                                   // switch CTC Mode on, set prescaler to 1
124
#endif
125
126
#ifdef TIMSK1
127
    TIMSK1  = 1 << OCIE1A;                                                  // OCIE1A: Interrupt by timer compare
128
#else
129
    TIMSK   = 1 << OCIE1A;                                                  // OCIE1A: Interrupt by timer compare
130
#endif
131
}
132
133
#ifdef TIM1_COMPA_vect                                                      // ATtiny84
134
#define COMPA_VECT  TIM1_COMPA_vect
135
#else
136
#define COMPA_VECT  TIMER1_COMPA_vect                                       // ATmega
137
#endif
138
139
ISR(COMPA_VECT)                                                             // Timer1 output compare A interrupt service routine, called every 1/15000 sec
140
{
141
  (void) irmp_ISR();                                                        // call irmp ISR
142
  // call other timer interrupt routines...
143
}
144
145
int
146
main (void)
147
{
148
    IRMP_DATA irmp_data;
149
    unsigned char buf[3];
150
151
    irmp_init();                                                            // initialize irmp
152
    timer1_init();                                                          // initialize timer1
153
    uart_init();                                                            // initialize uart
154
155
    sei ();                                                                 // enable interrupts
156
157
    for (;;)
158
    {
159
        if (irmp_get_data (&irmp_data))
160
        {
161
            uart_puts ((unsigned char *) "protocol: 0x");
162
            itoxx (buf, irmp_data.protocol);
163
            uart_puts (buf);
164
165
            uart_puts ((unsigned char *) "   address: 0x");
166
            itoxx (buf, irmp_data.address >> 8);
167
            uart_puts (buf);
168
            itoxx (buf, irmp_data.address & 0xFF);
169
            uart_puts (buf);
170
171
            uart_puts ((unsigned char *) "   command: 0x");
172
            itoxx (buf, irmp_data.command >> 8);
173
            uart_puts (buf);
174
            itoxx (buf, irmp_data.command & 0xFF);
175
            uart_puts (buf);
176
177
            uart_puts ((unsigned char *) "   flags: 0x");
178
            itoxx (buf, irmp_data.flags);
179
            uart_puts (buf);
180
181
            uart_puts ((unsigned char *) "\r\n");
182
        }
183
    }
184
}

Da sind entsprechende UART-Routinen drin, die unabhängig vom 
IRMP-Logging arbeiten. Ausserdem werden die Nummern hier in Hexwerte in 
Form von Strings gewandelt, die dann ausgegeben werden.

Wenn das dann funktioniert, Dir aber die Hex-Ausgabe nicht behagt, 
kannst Du dann in einem 2. Schritt die Aufrufe von itoxx() durch itoa() 
ersetzen (Achtung, andere Parameter!).

von Bruno M. (brumay)


Lesenswert?

Frank M. schrieb:

> Du hast da keine Compiler-Warnung bekommen???

der Compiler hat sich nicht gerührt!

> Ausserdem benutzt Du da die IRMP-Logging-Funktionen. Da hauen Dir ja
> noch jede Menge 1en und 0en in den Output. Nicht schön.
>
> Schalte das Logging aus (das ist nur für Analysezwecke) und ersetze den
> kompletten(!) Inhalt Deines main.c mal durch diesen:

Das Logging ist ausgeschaltet!
Ich habe aber die komlette UART Funktion aus irmp.c nach main.c 
verschoben.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Bruno M. schrieb:
> Das Logging ist ausgeschaltet!
> Ich habe aber die komlette UART Funktion aus irmp.c nach main.c
> verschoben.

Achso... und weiterhin gleich genannt. Damit hast Du mich natürlich aufs 
Glatteis geführt. ;-)

Trotzdem hätte der Compiler meckern müssen, denn der Aufruf mit falschen 
Parametern kann einen Fehler bewirken, der hier (also in diesem 
speziellen Falle) ganz offensichtlich ist.

Wenn ich es probiere, bekomme ich sofort eine Warnung:
1
uart_puts (irmp_data.address);
2
3
../main.c:178:1: warning: passing argument 1 of 'uart_puts' makes pointer from integer without a cast [enabled by default]
4
../main.c:74:1: note: expected 'unsigned char *' but argument is of type 'uint16_t'

Schau mal unten in die Ausgabe Deiner IDE, da gibt es normalerweise noch 
"Reiter", mit denen man die Ansicht des Ausgabefensters ändern kann. 
Vermutlich schaust Du Dir den falschen Output an.

In meiner main.c (s. oben) habe ich die irmp_uart_xxxx() Funktionen in 
uart_xxx() (also ohne Prefix irmp_) umbenannt, damit es da keine 
Missverständnisse bzw. Konflikte gibt. Ausserdem habe ich sie auf die 
Zeilen eingestampft, die man im konkreten Fall (AVR) überhaupt braucht.

Versuche bitte mal meine Fassung von main.c (s. Posting oben) und 
berichte.

: Bearbeitet durch Moderator
von Bruno M. (brumay)


Lesenswert?

Frank M. schrieb:

> Versuche bitte mal meine Fassung von main.c (s. Posting oben) und
> berichte.

Ja, so sieht das natürlich ganz professionell aus. Jetzt ist es auch 
nicht mehr das Protokoll 10 oder 16, sondern 02.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Bruno M. schrieb:
> Frank M. schrieb:
>
>> Versuche bitte mal meine Fassung von main.c (s. Posting oben) und
>> berichte.
>
> Ja, so sieht das natürlich ganz professionell aus. Jetzt ist es auch
> nicht mehr das Protokoll 10 oder 16, sondern 02.

Also NEC. Das klingt plausibel für Deine Panasonic-FB. Na also, dann 
hast Du ja die Haupthürde geschafft :-)

von Bruno M. (brumay)


Lesenswert?

Frank M. schrieb:

> Schau mal unten in die Ausgabe Deiner IDE, da gibt es normalerweise noch
> "Reiter", mit denen man die Ansicht des Ausgabefensters ändern kann.
> Vermutlich schaust Du Dir den falschen Output an.

Ich habe mein main.c nochmals laufen lassen und bekomme tatsächlich 
entsprechende Warnungen, aber keine Fehler, die einen Abbruch auslösen.

von Karol B. (johnpatcher)


Lesenswert?

Bruno M. schrieb:
> Ich habe mein main.c nochmals laufen lassen und bekomme tatsächlich
> entsprechende Warnungen, aber keine Fehler, die einen Abbruch auslösen.

Deswegen sind beim gcc die Compiler-Flags -Wall und -Werror immer eine 
gute Idee ;).

Mit freundlichen Grüßen,
Karol Babioch

von Jörg R. (jrie)


Lesenswert?

Logging für den STM32F10x:
1
diff -Nru A/irmp.c B/irmp.c
2
--- A/irmp.c  2014-08-28 01:54:03.770837120 +0200
3
+++ B/irmp.c  2014-08-28 01:54:08.585836842 +0200
4
@@ -564,6 +564,9 @@
5
 #  define  STM32_UART_COM     USART2
6
 #  define  STM32_UART_BAUD    115200                                  // mit 115200 Baud
7
 #  include "stm32f4xx_usart.h"
8
+#elif defined(ARM_STM32F10X)
9
+#  define  STM32_UART_COM     USART3                                  // UART3 an PB10
10
+#  include "stm32f10x_usart.h"
11
 #else
12
 #  if IRMP_EXT_LOGGING == 1                                           // use external logging
13
 #    include "irmpextlog.h"
14
@@ -661,7 +664,38 @@
15
 
16
     // UART enable
17
     USART_Cmd(STM32_UART_COM, ENABLE);
18
+#elif defined(ARM_STM32F10X)
19
+    GPIO_InitTypeDef GPIO_InitStructure;
20
+    USART_InitTypeDef USART_InitStructure;
21
+
22
+    // Clock enable vom TX Pin
23
+    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); // UART3 an PB10
24
+
25
+    // Clock enable der UART
26
+    RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);
27
+
28
+    // UART als Alternative-Funktion mit PushPull
29
+    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
30
+    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
31
+
32
+    // TX-Pin
33
+    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
34
+    GPIO_Init(GPIOB, &GPIO_InitStructure);
35
+
36
+    // Oversampling
37
+    USART_OverSampling8Cmd(STM32_UART_COM, ENABLE);
38
+
39
+    // init mit Baudrate, 8Databits, 1Stopbit, keine Parität, kein RTS+CTS
40
+    USART_InitStructure.USART_BaudRate = 115200;
41
+    USART_InitStructure.USART_WordLength = USART_WordLength_8b;
42
+    USART_InitStructure.USART_StopBits = USART_StopBits_1;
43
+    USART_InitStructure.USART_Parity = USART_Parity_No;
44
+    USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
45
+    USART_InitStructure.USART_Mode = USART_Mode_Tx;
46
+    USART_Init(STM32_UART_COM, &USART_InitStructure);
47
 
48
+    // UART enable
49
+    USART_Cmd(STM32_UART_COM, ENABLE);
50
 #else
51
 #if (IRMP_EXT_LOGGING == 0)                                                                         // use UART
52
     UART0_UBRRH = UBRRH_VALUE;                                                                      // set baud rate
53
@@ -692,7 +726,7 @@
54
 irmp_uart_putc (unsigned char ch)
55
 {
56
 #ifndef UNIX_OR_WINDOWS
57
-#if defined(ARM_STM32F4XX)
58
+#if defined(ARM_STM32F4XX) || defined(ARM_STM32F10X)
59
     // warten bis altes Byte gesendet wurde
60
     while (USART_GetFlagStatus(STM32_UART_COM, USART_FLAG_TXE) == RESET)
61
     {
Gruß, Jörg

von E. K. (eku)


Lesenswert?

Hallo Frank,

die Definition von irmp_protocol_names führt auf AVR MCUs dazu, dass die 
Strings beim Start vom FLASH ins RAM dupliziert werden. Das vereinfacht 
zwar den Zugriff, verschwendet aber wertvollen RAM.

Besser ist folgende Implementierung:
1
static const char proto_unknown[] PROGMEM = "unknown";
2
static const char proto_sircs[] PROGMEM = "SIRCS";
3
static const char proto_nec[] PROGMEM = "NEC";
4
.....
5
6
const PGM_P const irmp_proto_names[] PROGMEM = {
7
  proto_unknown,
8
  proto_sircs,
9
  proto_nec,
10
....
11
};
12
13
14
15
  printf_P(PSTR("IRMP RX: proto %02" PRId8 " %S, address %04" PRIX16
16
                ", command %04" PRIX16 ", flags %02" PRIX8 "\n"),
17
           irmp_data_p->protocol,
18
           pgm_read_word(&irmp_proto_names[irmp_data_p->protocol]),
19
           irmp_data_p->address, irmp_data_p->command, irmp_data_p->flags);

von Karol B. (johnpatcher)


Lesenswert?

E. K. schrieb:
> Das vereinfacht
> zwar den Zugriff, verschwendet aber wertvollen RAM.

Ja.

E. K. schrieb:
> Besser ist folgende Implementierung:

Naja, ganz so einfach ist es dann doch nicht - zumindest wenn man 
plattformübergreifend funktionieren möchte ;).

E. K. schrieb:
> const PGM_P const irmp_proto_names[] PROGMEM = {

Zunächst einmal ist das hier doppelt gemoppelt. PGM_P ist bereits als 
"const char*" definiert, insofern kann man sich das erste (!) const 
sparen.

Das Problem ist aber, dass es pgm_read_word() auf anderen Plattformen 
nicht gibt. Man müsste also irgendwelche Hilfskonstrukte einführen, oder 
aber das Ganze von der aktuellen Plattform abhängig machen, was ggf. 
etwas unübersichtlich werden kann.

Prinzipiell halte ich das aber auch für eine gute Idee, weil das in etwa 
150 Byte RAM sind, der auch sinnvoller verwendet werden kann ;). Ich bin 
mir nur nicht sicher was die beste Option ist, um möglichst plattform 
kompatibel zu bleiben. Da hat Frank ggf. mehr Erfahrung bzw. bessere 
Ideen.

Mit freundlichen Grüßen,
Karol Babioch

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

E. K. schrieb:
> die Definition von irmp_protocol_names führt auf AVR MCUs dazu, dass die
> Strings beim Start vom FLASH ins RAM dupliziert werden. Das vereinfacht
> zwar den Zugriff, verschwendet aber wertvollen RAM.

Hm, ich hab das wohl übersehen. Normalerweise achte ich auf so etwas. 
Hat wohl historische Gründe - weil ich das Array ursprünglich nur für 
den Analyze-Modus auf dem PC brauchte.

Karol Babioch schrieb:
> Das Problem ist aber, dass es pgm_read_word() auf anderen Plattformen
> nicht gibt. [...]
> Da hat Frank ggf. mehr Erfahrung bzw. bessere Ideen.

Ja, normalerweise mache ich das mit

#define PROGMEM

auf Zielplattformen != AVR.

Ich kümmere mich drum. Im Moment bin ich aber ziemlich ausgelastet.

von SvenK (Gast)


Angehängte Dateien:

Lesenswert?

Hallo an Alle,

zuerst mal vielen Dank an die IRMP-Macher für die vielen wertvollen 
Infos. Möge sich Euer Sehspektrum immer weiter ins Langwellige 
vergrößern ;-)

Nach einigen Schwierigkeiten habe ich IRMP auf einem ATmega 1284P mit 8 
Mhz (auf Pollin Eval-Board) laufen und konnte mir von diversen 
Fernbedienungen (Samsung TV, Yamaha Receiver) die Codes auf einem LCD 
darstellen.

Ich benötige nun für ein Projekt die Codes der Fernbedienung eines JVC 
KW-NX7000 Navis. Die Fernbedienung mit dem Namen RM-RX250 wird aber 
leider nicht korrekt erkannt. Manchmal kam „Telefunken“, aber bei 
verschiedenen Tasten immer genau derselbe Code, teilweise auch kam auch 
„Siemens“ – alle Tasten gleicher Code

Mit der IRMP.exe auf dem PC analysiert erhalte ich eine weitere 
„Eigenartigkeit“:
Im Artikel bei Mikrocontroller.net sind die „dimensionslosen Zahlen“ 
1/100 der Zeit in µs
z.B.
1
 pulse avg: 91.0=9102.8 us
Bei mir sind es 1,5/100 !? – unabhängig von der Logging-Frequenz (10, 15 
oder 20 kHz)
z.B.
1
 pulse avg: 40.8=2720.0 us

Ich habe die Loggings der nötigen Befehle in einer ZIP-Datei angehäng – 
mit 10kHz jeweils 5-mal hintereinander aufgenommen und zusätzich nochmal 
alle zusammengefasst in einer Datei - falls das hilfreicher ist.

Einige Tasten der FB ergeben „kurze“ Sequenzen, andere ca. doppelt so 
lange.

Falls jdm damit etwas anfangen kann und mir einen Tip geben könnte, wie 
ich da weiterkomme wäre es schön wenn er sich melden würde.

Vielen Dank schon mal

SvenK

P.S.: die oben genannten Schwierigkeiten hatte ich bei der RS232 
Übertragung. Mit „U2X“ kam nichts oder nur „Matsch“ im PC an – ohne 
„U2X“ läuft es problemlos !?

von Karol B. (johnpatcher)


Lesenswert?

SvenK schrieb:
> Falls jdm damit etwas anfangen kann und mir einen Tip geben könnte, wie
> ich da weiterkomme wäre es schön wenn er sich melden würde.

Das müsste sich Frank mal genauer ansehen, der ist hier der Experte was 
die verschiedenen Protokolle und deren Dekodierung angeht ;).

SvenK schrieb:
> P.S.: die oben genannten Schwierigkeiten hatte ich bei der RS232
> Übertragung. Mit „U2X“ kam nichts oder nur „Matsch“ im PC an – ohne
> „U2X“ läuft es problemlos !?

Dies sollte eigentlich nicht der Fall sein. Das U2X Bit verkleinert den 
Baudraten-Teiler und verdoppelt damit die Frequenz. Für das Senden von 
Daten sollte das eigentlich überhaupt keine Konsequenz haben. Es wirkt 
sich laut Datenblatt nur auf das Empfangen von Daten aus, da es weniger 
Samples gibt.

Sicher, dass alle anderen Einstellungen (z.B. Baud Rate) stimmen und 
auch die richtigen Werte in den UBRR Registern stehen? Die Werte 
unterscheiden sich - je nachdem ob U2X gesetzt ist, oder eben nicht. 
Entweder händisch berechnen, die Tabelle im Datenblatt benutzen, oder 
die Hilfsfunktionalität aus <util/setbaud.h> benutzen, um Fehler zu 
vermeiden.

Mit welcher IDE entwickelst du? Hast du sicherheitshalber das Projekt 
einmal "gesäubert" und komplett neu kompiliert? Damit habe ich schon so 
allerlei unerklärliche Symptome beheben können, unter anderem auch 
Unstimmigkeiten in der Baud Rate, die sich in dem von dir beschriebenem 
Problem geäußert haben.

Mit freundlichen Grüßen,
Karol Babioch

: Bearbeitet durch User
von SvenK (Gast)


Lesenswert?

Hallo Karol,

danke für Deine Antwort. Ich arbeite mit AVR-Studio 6.1 bis dato 
funktionierte das auch immer ganz gut.

Mit der Holzhammermethode:
1
#if (IRMP_EXT_LOGGING == 0) //  use UART
2
UBRR0H  = 0;                   //  9600 Baud
3
UBRR0L  = 103;                 //  51 ohne / 103 mit U2X
4
UCSR0A |= (1<<1);              //  U2X
5
//         76543210
6
UCSR0C = 0b10000110;
7
UCSR0B = 0b00001000;

geht es jetzt auch mit U2X.

Den Rest der ganzen "#ifdef's in der Nähe" habe ich dann alle zu 
Kommentaren degradiert. Das könnte man wohl für diesen Bereich als 
"gesäubert" bezeichnen!?

Ansonsten habe ich die ganzen Möglichkeiten für Windows,Linux,Pic,STM 
etc. bis jetzt dringelassen, da der Rest ja (mit anderen 
Fernbedienungen) funktioniert.

...dann bin ich mal gespannt, ob Frank sich rührt / mit meinen Loggings 
was anfangen kann...

Viele Grüße

Sven

von Bruno M. (brumay)


Lesenswert?

Nachdem Frank so freundlich war mir ein UART-main hier reinzustellen, 
funktioniert das problemlos. Aber, der Mensch verlangt ja immer mehr und 
jetzt stehe ich wieder vor einem "C" Problem.

Ich habe versucht die Ausgabe um die Protokollnamen zu erweitern und 
dazu folgendes eingegeben:
1
uart_puts ((unsigned char *) "protocol: 0x");
2
      itoxx (buf, irmp_data.protocol);
3
      uart_puts (buf);
4
      uart_puts ((unsigned char *) " = ");
5
      uart_puts ((unsigned char *) irmp_protocol_names[irmp_data.protocol]);

Wenn ich dabei "define IRMP_PROTOCOL_NAMES" auf 1 stelle funktioniert 
das auch super. Stelle ich aber statt dessen "define IRMP_LOGGING" auf 1 
beschwert sich der Compiler, daß irmp_protocol_names nicht definiert 
ist, obwohl ich zusätzlich vor der gesamten Ausgabe ein

#if defined IRMP_PROTOCOL_NAMES == 1

gesetzt habe. Was muß ich tun um das zu bereinigen?

von Karol B. (johnpatcher)


Lesenswert?

Bruno M. schrieb:
> Wenn ich dabei "define IRMP_PROTOCOL_NAMES" auf 1 stelle funktioniert
> das auch super.

Ja, so ist das innerhalb der irmp.c auch definiert:
1
#if defined(UNIX_OR_WINDOWS) || IRMP_PROTOCOL_NAMES == 1
2
const char *
3
irmp_protocol_names[IRMP_N_PROTOCOLS + 1] =
4
// ...

Bruno M. schrieb:
> Stelle ich aber statt dessen "define IRMP_LOGGING" auf 1
> beschwert sich der Compiler,

Wie kommst du darauf, dass sie die beiden Optionen ausschließen bzw. 
warum schreibst du von "statt dessen"?

Bruno M. schrieb:
> obwohl ich zusätzlich vor der gesamten Ausgabe ein
>
> #if defined IRMP_PROTOCOL_NAMES == 1

Wozu? Übrigens verwendest du "defined" hier falsch. Damit prüfst du, ob 
ein bestimmtes Makro definiert ist, und nicht dessen Wert. Korrekt wäre
1
#if defined IRMP_PROTOCOL_NAMES && IRMP_PROTOCOL_NAMES == 1

Wobei man die Überprüfung mittels defined i.d.R. weglässt, da es zu 0 
ausgewertet wird, wenn das Makro nicht existiert, siehe [1].

Bruno M. schrieb:
> Was muß ich tun um das zu bereinigen?

Setzt doch einfach beides auf 1?

Mit freundlichen Grüßen,
Karol Babioch

[1]: https://gcc.gnu.org/onlinedocs/cpp/Defined.html

von Bruno M. (brumay)


Lesenswert?

Hallo Karol,

danke für die Hinweise!

> Setzt doch einfach beides auf 1?

das geht nicht, da es mein Speicher nicht zuläßt.

Gruß Bruno

von Karol B. (johnpatcher)


Lesenswert?

Bruno M. schrieb:
> das geht nicht, da es mein Speicher nicht zuläßt.

Von welcher Plattform und welchem Speicher (RAM oder Flash) sprechen wir 
denn hier? Ein paar Beiträge über dir wurde Frank darauf aufmerksam 
gemacht, dass die Stringkonstanten nicht im Programmspeicher landen. Das 
lässt sich optimieren, wodurch ein "wenig" (150?) Byte RAM frei würden.

Gibt es denn nicht eine Möglichkeit für dich bestimmte Protokoll 
abzuschalten? Oder einen größeren Mikrocontroller zu verwenden? Im 
Notfall müsstest du halt in den Quellen herumpfuschen und unnötiges 
herauswerfen. Ist aber nicht unbedingt empfehlenswert, wenn man 
kompatibel bleiben möchte und von zukünftigen Updates profitieren will.

Mit freundlichen Grüßen,
Karol Babioch

von Bruno M. (brumay)


Lesenswert?

> Von welcher Plattform und welchem Speicher (RAM oder Flash) sprechen wir
> denn hier?

Ich arbeite mit einem AT8, bei dem das Data Memory überläuft.

> Ein paar Beiträge über dir wurde Frank darauf aufmerksam
> gemacht, dass die Stringkonstanten nicht im Programmspeicher landen. Das
> lässt sich optimieren, wodurch ein "wenig" (150?) Byte RAM frei würden.

Das habe ich wohl gelesen, aber meine C-Kenntnisse reichen da bei weitem 
nicht.

> Gibt es denn nicht eine Möglichkeit für dich bestimmte Protokolle
> abzuschalten? Oder einen größeren Mikrocontroller zu verwenden?

Diese Möglichkeit gibt es sicher, aber da ich ja mit der Alternative 
loggen oder Protokoll gut klar kam, habe ich gar nicht weiter versucht.

> Im
> Notfall müsstest du halt in den Quellen herumpfuschen und unnötiges
> herauswerfen. Ist aber nicht unbedingt empfehlenswert, wenn man
> kompatibel bleiben möchte und von zukünftigen Updates profitieren will.

Das scheitert schon an meinen C-Kenntnissen.

Ich habe es jetzt mal mit

#if IRMP_PROTOCOL_NAMES == 1

versucht. Damit ist das Problem gelöst!

von Joachim B. (jar)


Lesenswert?

Karol Babioch schrieb:
> Von welcher Plattform und welchem Speicher (RAM oder Flash) sprechen wir
> denn hier? Ein paar Beiträge über dir wurde Frank darauf aufmerksam
> gemacht, dass die Stringkonstanten nicht im Programmspeicher landen. Das
> lässt sich optimieren, wodurch ein "wenig" (150?) Byte RAM frei würden.

ich bin ja grad beim Arduino

und diese kleine Änderung an vielen Stellen:

#ifdef IRMP_SUPPORT_KASEIKYO_PROTOCOL
  case IRMP_KASEIKYO_PROTOCOL: Serial.print("IR: "); 
Serial.print("KASEIKYO"); Serial.print(", Address: "); 
Serial.print(irmp_data.address); Serial.print(", Command: "); 
Serial.println(irmp_data.command); break;
#endif

zu

#ifdef IRMP_SUPPORT_KASEIKYO_PROTOCOL
  case IRMP_KASEIKYO_PROTOCOL: Serial.print(F("IR: ")); 
Serial.print(F("KASEIKYO")); Serial.print(F(", Address: ")); 
Serial.print(irmp_data.address); Serial.print(F(", Command: ")); 
Serial.println(irmp_data.command); break;
#endif

hat min. 800 Byte RAM freigemacht !

was so direktes Schreiben aus dem flash doch bewirken kann :-))) !

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


Lesenswert?

Hallo SvenK,

entschuldige bitte die späte Antwort. Ich war letzte Woche unterwegs.

SvenK schrieb:
> Ich benötige nun für ein Projekt die Codes der Fernbedienung eines JVC
> KW-NX7000 Navis. Die Fernbedienung mit dem Namen RM-RX250 wird aber
> leider nicht korrekt erkannt. Manchmal kam „Telefunken“, aber bei
> verschiedenen Tasten immer genau derselbe Code, teilweise auch kam auch
> „Siemens“ – alle Tasten gleicher Code

Ja, das scheint etwas neues zu sein, was IRMP noch nicht kennt.

> Mit der IRMP.exe auf dem PC analysiert erhalte ich eine weitere
> „Eigenartigkeit“:
> Im Artikel bei Mikrocontroller.net sind die „dimensionslosen Zahlen“
> 1/100 der Zeit in µs
> z.B.
1
 pulse avg: 91.0=9102.8 us
> Bei mir sind es 1,5/100 !? – unabhängig von der Logging-Frequenz (10, 15
> oder 20 kHz)
> z.B.
1
 pulse avg: 40.8=2720.0 us

Bei IRMP_INTERRUPTS = 10000 sollte man erhalten:

  pulse avg: 91.0=9102.8 us

Bei einer Scan-Frequenz von 15000 sollte der Zähler links aber das 
1,5-fache betragen, nämlich ungefähr:

  pulse avg: 136.0=9102.8 us

> Ich habe die Loggings der nötigen Befehle in einer ZIP-Datei angehäng –
> mit 10kHz jeweils 5-mal hintereinander aufgenommen und zusätzich nochmal
> alle zusammengefasst in einer Datei - falls das hilfreicher ist.

Danke. Ich habe gerade mal kurz reingeschaut. Das Protokoll sollte 
einfach in den IRMP einzubauen sein. Kann ich heute oder morgen machen. 
Ich stelle dann eine Testversion ins SVN.

> P.S.: die oben genannten Schwierigkeiten hatte ich bei der RS232
> Übertragung. Mit „U2X“ kam nichts oder nur „Matsch“ im PC an – ohne
> „U2X“ läuft es problemlos !?

Hm. Dafür habe ich leider keine Erklärung.

Gruß,

Frank

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Bruno M. schrieb:

> Ich arbeite mit einem AT8, bei dem das Data Memory überläuft.

Ist dieser auf einem Sockel aufgesteckt? Wenn ja, dann könntest Du den 
ATmega8 durch einen ATmega328 ersetzen. Dieser ist pinkompatibel und hat 
den vierfachen Speicher.

>> Ein paar Beiträge über dir wurde Frank darauf aufmerksam
>> gemacht, dass die Stringkonstanten nicht im Programmspeicher landen. Das
>> lässt sich optimieren, wodurch ein "wenig" (150?) Byte RAM frei würden.
>
> Das habe ich wohl gelesen, aber meine C-Kenntnisse reichen da bei weitem
> nicht.

Ich kümmere mich kurzfristig darum.

> #if IRMP_PROTOCOL_NAMES == 1
>
> versucht. Damit ist das Problem gelöst!

Ich schaue mir die Stelle im Code mal an.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Bruno M. schrieb:
> Ich arbeite mit einem AT8, bei dem das Data Memory überläuft.

Ich habe nun irmp_protocol_names[] auf PROGMEM umgestellt und 
desweiteren in das Beispiel-main.c UART-Routinen aufgenommen, so dass 
man nun die Daten zum empfangenen Protokoll direkt auf dem UART ausgeben 
kann. Für PROGMEM-Strings habe ich neben uart_puts() auch uart_puts_P() 
implementiert. Damit schrumpft bei Verwendung von irmp_protocol_names[] 
der RAM-Bedarf um 300 Bytes. Damit sollte bei Dir genügend Speicher 
übrig bleiben.

Eingecheckt sind die Änderungen im SVN als Version 2.6.3.

Viel Spaß,

Frank

von Joachim B. (jar)


Angehängte Dateien:

Lesenswert?

Frank M. schrieb:
> Für PROGMEM-Strings habe ich neben uart_puts() auch uart_puts_P()
> implementiert.

könnte man nicht durch ein "geschicktes" #define

wie hier:
#define usart_write(format, args...)   usart_write_P(PSTR(format) , ## 
args)

diese Unterscheidung für den User eliminieren oder ist das schon drin 
und der User merkt davon nix ?

ich nutze da immer den Ulrich Radig Code und finde das so genial das ich 
mich nie drum kümmern muss, Textkonstanten kommen direkt aus dem Flash 
ohne Ramverbrauch und ich muss beim proggen auch nie darauf achten 
welche usart_write ich aufrufen muss

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


Lesenswert?

SvenK schrieb:
> Ich benötige nun für ein Projekt die Codes der Fernbedienung eines JVC
> KW-NX7000 Navis. Die Fernbedienung mit dem Namen RM-RX250 wird aber
> leider nicht korrekt erkannt.

Nach Analyse Deiner Scans konnte ich feststellen, dass es sich um das 
Kaseikyo-Protokoll handelt. Es wurde nur nicht von IRMP erkannt, weil 
das Timing Deiner Fernbedienung sich nicht ganz an das 
Kaseikyo-Protokoll hält.

IRMP toleriert beim Kaseikyo-Protokoll eine Abweichung des 
Startbit-Timings um 10 Prozent. Das reicht aber nicht für Deine FB.

Abhilfe in irmp.c:

Alt:
1
#define KASEIKYO_START_BIT_PULSE_LEN_MIN        ((uint8_t)(F_INTERRUPTS * KASEIKYO_START_BIT_PULSE_TIME * MIN_TOLERANCE_10 + 0.5) - 1)
2
#define KASEIKYO_START_BIT_PULSE_LEN_MAX        ((uint8_t)(F_INTERRUPTS * KASEIKYO_START_BIT_PULSE_TIME * MAX_TOLERANCE_10 + 0.5) + 1)
3
#define KASEIKYO_START_BIT_PAUSE_LEN_MIN        ((uint8_t)(F_INTERRUPTS * KASEIKYO_START_BIT_PAUSE_TIME * MIN_TOLERANCE_10 + 0.5) - 1)
4
#define KASEIKYO_START_BIT_PAUSE_LEN_MAX        ((uint8_t)(F_INTERRUPTS * KASEIKYO_START_BIT_PAUSE_TIME * MAX_TOLERANCE_10 + 0.5) + 1)

Neu mit Toleranz von 20%:
1
#define KASEIKYO_START_BIT_PULSE_LEN_MIN        ((uint8_t)(F_INTERRUPTS * KASEIKYO_START_BIT_PULSE_TIME * MIN_TOLERANCE_20 + 0.5) - 1)
2
#define KASEIKYO_START_BIT_PULSE_LEN_MAX        ((uint8_t)(F_INTERRUPTS * KASEIKYO_START_BIT_PULSE_TIME * MAX_TOLERANCE_20 + 0.5) + 1)
3
#define KASEIKYO_START_BIT_PAUSE_LEN_MIN        ((uint8_t)(F_INTERRUPTS * KASEIKYO_START_BIT_PAUSE_TIME * MIN_TOLERANCE_20 + 0.5) - 1)
4
#define KASEIKYO_START_BIT_PAUSE_LEN_MAX        ((uint8_t)(F_INTERRUPTS * KASEIKYO_START_BIT_PAUSE_TIME * MAX_TOLERANCE_20 + 0.5) + 1)

Dann sollte es gehen. Die Änderung ist auch im SVN (Version 2.6.4) 
eingecheckt.

Was mir noch auffiel in Deinen Scans: Einige Tasten wiederholen den 
Frame ein zweites Mal (irmp_data.flag = 1). Das kann entweder daran 
liegen, dass Du diese Tasten länger gedrückt hast oder die FB es bei 
bestimmten Tasten prinzipiell macht. In diesem Fall könntest Du bei 
flag=1 den Frame ignorieren, falls die doppelte Erkennung Deine 
Anwendung "durcheinander bringen" könnte.

Gruß,

Frank

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Joachim B. schrieb:
> könnte man nicht durch ein "geschicktes" #define
>
> wie hier:
> #define usart_write(format, args...)   usart_write_P(PSTR(format) , ##
> args)
>
> diese Unterscheidung für den User eliminieren oder ist das schon drin
> und der User merkt davon nix ?

Nein. Dieses usart_write() erwartet IMMER einen konstanten String als 
Format. Eine Variable kannst Du da nicht übergeben! Das PSTR()-Makro 
funktioniert nämlich nur für konstante Strings. Wenn Du einen variablen 
String ausgeben willst, musst Du den ins Argument hinter das Format 
packen. Aber nur dann! Denn hier kannst Du wiederum keinen konstanten 
PROGMEM-String als Argument übergeben.

Daher ist dieses Makro gar nicht so genial, wie es ausschaut. Denn es 
funktioniert ausschließlich bei PROGMEM-Strings fürs Format.

Mein uart_puts() kann auch variable Strings (z.B. einen Buffer) 
ausgeben.

Da musst Du mit

   usart_write ("%s", buffer);

arbeiten. Die Unterscheidung (P vs. non P) machst Du also bei der 
Parameterübergabe, ich beim Funktions-Aufruf.

von Joachim B. (jar)


Lesenswert?

Frank M. schrieb:
> Mein uart_puts() kann auch variable Strings (z.B. einen Buffer)
> ausgeben.
>
> Da musst Du mit
>
>    usart_write ("%s", buffer);
>
> arbeiten.

danke, nur dann verstehe ich nicht wieso folgendes funktioniert ?

aus Hyperterminal
1
NIC init:READY!

aus dem Sourcecode
1
/*NIC Initialisieren*/
2
usart_write("NIC init:");
3
ETH_INIT();
4
usart_write("READY!\r\n");

hier arbeite ich doch nicht mit:
>    usart_write ("%s", buffer);

und trotzdem funktioniert es ....

: Bearbeitet durch User
von Karol B. (johnpatcher)


Lesenswert?

Joachim B. schrieb:
> und trotzdem funktioniert es ....

Du gibst ja auch konstante Strings aus. Diese werden durch das PSTR() 
Makro im Flash abgelegt und können ausgegeben werden. Franks Aussage 
bezog sich auf Strings, welche zur Laufzeit zusammen gesetzt werden.

Mit freundlichen Grüßen,
Karol Babioch

von Joachim B. (jar)


Lesenswert?

gleich noch ne Frage hinterher

besser mit 2 Interrupts arbeiten oder einen

weil nicht jeder Atmel genug Timer hat und mir kein Interrupt entgehen 
soll

habe ich alles in einen Timer gepackt

der macht Interrups 15000, eine Var zählt bis 150 für 10ms und dort wird 
ne Menge gemacht was über 64µs dauern kann, Folge es entgehen mir 
Interupts für IR, ist zwar bis jetzt nicht so auffällig kritisch ABER

ich grübel gerade ob nicht nicht doch besser bei Vorhandensein 2er Timer 
diese Interrupts trenne und den 10ms Interrupt durch ISR(irmp) 
unterbrechbar mache, die kurze IRMP Unterbrechung stört in meiner 10ms 
Routine nicht.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Joachim B. schrieb:
> und trotzdem funktioniert es ....

Wie Karol schon wiederholte: Der Format-String muss bei Deiner 
usart_write() konstant sein.

Versuch doch mal folgendes:
1
char buffer[] = "Hello World";

oder
1
char buffer[64];
2
strcpy (buffer, "Es ist egal, wie dieser String in diesen Buffer gelangte");

und dann:
1
usart_write (buffer);

Das wird so nicht funktionieren.

: Bearbeitet durch Moderator
von Joachim B. (jar)


Lesenswert?

Karol Babioch schrieb:
> Franks Aussage
> bezog sich auf Strings, welche zur Laufzeit zusammen gesetzt werden.

OK ich glaube ich verstehe so langsam, aber bei der typischen

printf("%s", buffer); wirds genauso gemacht und stört doch kein bischen 
....

OK verschiedene Ansätze und Philosophien, kommt ja öfter mal vor bei C

ich werde nie begreifen warum irgendweche STRING Funktionen mal

(signed) char mal unsigned char sind und warum manche char Funktionen 
int (16-bit) zurück geben (wo nur ein Zeichen drin ist)


Frank M. schrieb:
> Versuch doch mal folgendes:

da sehe ich aber nicht den Zusammenhang, char buffer im PROGMEM

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


Lesenswert?

Joachim B. schrieb:
> printf("%s", buffer); wirds genauso gemacht und stört doch kein bischen
> ....

Wenn ich eine printf-ähnliche Funktion, die einen Format-String scannen 
kann, in das Beispiel-Main einpflanze, wird das ausführbare Programm 
ungleich viel größer als das jetzige.

Und genau darum geht es nicht bei IRMP! main.c ist lediglich ein 
Beispiel-Programm, welches möglichst ohne große Anforderungen zeigen 
soll, wie man schnell etwas auf die Beine stellen kann.

> ich werde nie begreifen warum irgendweche STRING Funktionen mal
>
> (signed) char mal unsigned char sind

Wenn man 8-Bit-Zeichen (also Umlaute etc) übertragen muss, dann kann man 
unter Umständen bei signed-chars Probleme bekommen. Denn dann werden 
diese Zeichen negativ. Leider sind aus historischen Gründen Strings in 
Gänsefüßchen immer char und nicht unsigned char. Das liegt daran, dass 
die Amerikaner, die Anfang der 70er Jahre C entwickelten, überhaupt 
nicht daran dachten, dass jemand mal mehr als 7-Bit-Zeichen (US-ASCII) 
braucht.

> und warum manche char Funktionen
> int (16-bit) zurück geben (wo nur ein Zeichen drin ist)

Das liegt wohl am Sonder"zeichen" EOF, welches unter UNIX den Wert -1 
hat. Ist auch eine historische Altlast. Auf Rechnern außerhalb von µCs 
ist das aber auch sehr sinnvoll so.

> da sehe ich aber nicht den Zusammenhang, char buffer im PROGMEM

char buffer im PROGMEM? Wie soll das gehen, wenn die Daten erst zur 
Laufzeit per I2C, ETH, RF oder sonstwie in den Buffer gelangt sind?

Die Welt ist nicht so einfach, wie Du sie Dir machst ;-)

: Bearbeitet durch Moderator
von Karol B. (johnpatcher)


Lesenswert?

Joachim B. schrieb:
> printf("%s", buffer);

printf() ist im aber gerade im Bereich der Mikrocontroller oft 
ziemlicher Overkill, gerade bei stark beschränkten Ressourcen.

Frank M. schrieb:
> Leider sind aus historischen Gründen Strings in
> Gänsefüßchen immer char und nicht unsigned char.

Ja, aber für char ohne Angabe von signed bzw. unsigned ist nicht 
festgelegt wie diese zu implementieren sind und hängt daher vom Compiler 
ab, siehe [1].

Aber ja, das korrekte Verwenden von Datentypen innerhalb von C ist oft 
gar nicht so einfach. Dabei sind die historische Altlasten nur ein 
Grund, ein weiterer ist es den verschiedenen Plattformen ohne viel 
Overhead gerecht zu werden. Dadurch ist kaum etwas festgelegt. Gibt es 
nicht sogar Plattformen auf denen gilt: sizeof(short) = sizeof(int) = 
sizeof(long).

Das ganze Rumgegurke mit uint8_t bei den kleinen Mikrocontrollern ist ja 
auch nicht unbedingt portabel. Besser wäre wohl uint8_fast_t, aber das 
kann wiederum zu Nebeneffekten führen, wenn man sich irgendwo (implizit) 
auf den Wertebereich und damit verbundene Wrap-Arounds verlässt.

Wirklich portablen C Code zu produzieren ist gar nicht so einfach [2], 
und dürfte in den meisten Fällen zu einem Dschungel aus typedefs und 
Konditionen beim Kompilieren führen.

Joachim B. schrieb:
> OK verschiedene Ansätze und Philosophien, kommt ja öfter mal vor bei C

In diesem Zusammenhang interessant ist auch die "Rückgabe" von Fehlern. 
Je nach Gusto ist es hier üblich negative Werte für Fehler 
vorzubehalten, oder auch nicht. Dass 0 "success" bedeutet, beißt sich 
manchmal auch etwas mit der ansonsten üblichen Notation von false = 0 
bzw. true = 1.

Wie du schon sagst: Da ist man in C relativ frei. Als jemand der mit 
besser typisierten Programmiersprachen angefangen hat, wünsche ich mir 
manchmal schon etwas mehr Vorgaben herbei, aber was solls, ist eh etwas 
Off-Topic.

Mit freundlichen Grüßen,
Karol Babioch

[1]: 
https://stackoverflow.com/questions/2054939/is-char-signed-or-unsigned-by-default
[2]: 
https://www.mikrocontroller.net/articles/Plattformunabh%C3%A4ngige_Programmierung_in_C

von Joachim B. (jar)


Lesenswert?

Frank M. schrieb:
> Die Welt ist nicht so einfach, wie Du sie Dir machst ;-)

dafür betreibst du aber eine Menge Aufwand (in IRMP) um es anderen Usern 
doch einfach zu machen :-)

wollen wir nicht alle irgendwie einfach ?

noch mal zur obigen Frage, doch besser meine 10ms Berechnungen aus der 
IRMP ISR rausnehmen und in meiner 10ms ISR lieber IRMP ISR erlauben ?

von Bruno M. (brumay)


Lesenswert?

Frank M. schrieb:

> Eingecheckt sind die Änderungen im SVN als Version 2.6.3.

Hallo Frank,

herzlichen Dank für den prompten Service.
Speicher habe ich jetzt genug! Allerdings bekomme ich keine Protokolle 
angezeigt. Das Loggen funktioniert normal.

Ich muß mir das morgen mal näher ansehen, heute habe ich keine Lust 
mehr;-)

Gruß Bruno

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Joachim B. schrieb:
> besser mit 2 Interrupts arbeiten oder einen

Es kommt so oder so auf dasselbe heraus.

> weil nicht jeder Atmel genug Timer hat und mir kein Interrupt entgehen
> soll
>
> habe ich alles in einen Timer gepackt
> der macht Interrups 15000, eine Var zählt bis 150 für 10ms und dort wird
> ne Menge gemacht was über 64µs dauern kann,

Das wird im WordClock-Projekt genauso gemacht. Die ISR ruft neben 
irmp_ISR() noch jede Menge anderer Funktionen auf, welche durch Zähler 
in der ISR "getimed" werden.

> Folge es entgehen mir Interupts für IR

Dann machst Du zuviel in der ISR.

> ich grübel gerade ob nicht nicht doch besser bei Vorhandensein 2er Timer
> diese Interrupts trenne

Nein. Das bringts nicht. Ganz im Gegenteil: Dein zweiter Timer sorgt 
u.U. dafür, dass der IRMP-Timer nicht immer in gleichen Zeitabständen 
aufgerufen wird, sondern erst, wenn die zweite ISR beendet wird. Das 
verfälscht das Scan-Ergebnis.

Schau lieber, dass Du Deine eigenen Timer-Routinen abkürzen kannst, z.B. 
durch Setzen eines Flags, welches von der Hauptschleife ausgewertet 
wird.

Wenn Du einen neueren avr-gcc hast (z.B. 4.7.2), kannst Du einiges 
herausholen durch folgende Flags:

Compiler:

 -Os                    # hast Du wahrscheinlich schon
 -flto
 -ffunction-sections
 -fdata-sections

Linker:
 -Os                    # ja, beim Linker!
 -flto
 -ffunction-sections
 -fdata-sections
 -Wl,--gc-sections

Diese Flags bewirken unter anderem, dass der avr-gcc sämtliche 
Funktionen, die aus einer ISR aufgerufen werden, inline behandeln kann - 
auch wenn sie in verschiedenen C-Quelltexten stecken. Dadurch können 
einige PUSH-/POP-Befehle eingespart werden. Der Nachteil, dass bei 
Funktionsaufrufen aus der ISR auf Verdacht viel zuviele Register 
gesichert werden, wird dadurch eliminiert und das Zeitverhalten 
verbessert sich etwas.

Sinnvoller ist natürlich, das Übel an der Wurzel zu packen - d.h. Deine 
ISR-Funktionen zu überarbeiten.

: Bearbeitet durch Moderator
von Joachim B. (jar)


Lesenswert?

Frank M. schrieb:
> Dann machst Du zuviel in der ISR.

das ist ja klar, wenn IRMP Interrupts "verloren" gehen

> Schau lieber, dass Du Deine eigenen Timer-Routinen abkürzen kannst, z.B.
> durch Setzen eines Flags, welches von der Hauptschleife ausgewertet
> wird.

OK das hatte ich ja bei meinem anderen Projekt schon mit Erfolg gemacht, 
nun muss ich mal sehen wie ich das der Arduino IDE beibringe, die ist 
etwas zickiger sprich undurchsichtiger (für mich)

Danke.

> Nein. Das bringts nicht. Ganz im Gegenteil: Dein zweiter Timer sorgt
> u.U. dafür, dass der IRMP-Timer nicht immer in gleichen Zeitabständen
> aufgerufen wird, sondern erst, wenn die zweite ISR beendet wird. Das
> verfälscht das Scan-Ergebnis.

das verstehe ich nicht, ich kann am Anfang meiner 10ms Interrupts die 
IRMP Interrupt wieder erlauben und dann wird sofort meine 10ms ISR durch 
IRMP unterbrochen, im Timing passend !

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


Lesenswert?

Joachim B. schrieb:
> das verstehe ich nicht, ich kann am Anfang meiner 10ms Interrupts die
> IRMP Interrupt wieder erlauben und dann wird sofort meine 10ms ISR durch
> IRMP unterbrochen, im Timing passend !

Ja, das kannst Du natürlich machen, ist aber unüblich bei AVRs. Ich sehe 
da auch keinen Gewinn, denn 100% Auslastung bleibt 100% Auslastung.

Besser wäre ein µC mit priorisierten Interrupts. Das liefern die AVRs 
aber nicht von Haus aus.

von Joachim B. (jar)


Lesenswert?

>> ich kann am Anfang meiner 10ms Interrupts die
>> IRMP Interrupt wieder erlauben und dann wird sofort meine 10ms ISR durch
>> IRMP unterbrochen, im Timing passend !

Frank M. schrieb:
> Ja, das kannst Du natürlich machen, ist aber unüblich bei AVRs. Ich sehe
> da auch keinen Gewinn, denn 100% Auslastung bleibt 100% Auslastung.

ich glaube du hast was falsch verstanden, der Controller ist nicht zu 
100% ausgelastet, nur in meiner alle 10ms Routine kann es länger als 
64µs (INTERRUPT IRMP) dauern, was IRMP stört, ob ich meine maximal 100µs 
Berechnung im Hauptprogramm mache durch Flags oder in meiner 10ms 
Timerroutine und diese durch IRMP unterbrechen lasse ist doch egal.
Zudeinem ist doch unüblich lese ich hier durchaus anderes.

http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Unterbrechbare_Interruptroutinen

Aber ich will nicht mit dir streiten, ich danke dir für IRMP und freue 
mich über unseren fruchtbaren Gedankenaustausch (nicht furchtbar hoffe 
ich für dich)

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Joachim B. schrieb:
> Zudeinem ist doch unüblich lese ich hier durchaus anderes.
>
> 
http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Unterbrechbare_Interruptroutinen

Zitat daraus:

"Bei unsachgemässer Handhabung kann dies zu erheblichen Problemen durch 
Rekursion wie einem Stack-Overflow oder anderen unerwarteten Effekten 
führen und sollte wirklich nur dann eingesetzt werden, wenn man sich 
sicher ist, das Ganze auch im Griff zu haben."

Genau deshalb sehe ich das als "unüblich", aber natürlich auch nicht als 
ausgeschlossen.

> Aber ich will nicht mit dir streiten, [...]

Ja, lassen wir das. Es wird auch langsam offtopic.

: Bearbeitet durch Moderator
von Bruno M. (brumay)


Lesenswert?

Hallo Frank,

> Allerdings bekomme ich keine Protokolle
> angezeigt. Das Loggen funktioniert normal.
>
> Ich muß mir das morgen mal näher ansehen, heute habe ich keine Lust
> mehr;-)

Ich komme leider nicht weiter! Da ich die Vorgängerversion schon 
gelöscht habe, kann ich auch nicht mehr vergleichen und testen.

Funktioniert es bei dir denn normal?

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Hallo Bruno,

Bruno M. schrieb:
> Ich komme leider nicht weiter! Da ich die Vorgängerversion schon
> gelöscht habe, kann ich auch nicht mehr vergleichen und testen.
>
> Funktioniert es bei dir denn normal?

Konnte ich leider selber nicht testen, weil ich momentan keinen µC in 
Griffweite habe. Da die Änderungen gegenüber der oben geposteten Version
nur marginal waren, muss ich da irgendwas verkorkst haben. Ich schaue 
gleich mal danach.

Hier findest Du die Version wieder, die ich damals für Dich hier 
gepostet hatte:

  Beitrag "Re: IRMP - Infrared Multi Protocol Decoder"

Wenn diese jetzt plötzlich auch nicht mehr funktioniert, dann machst Du 
aber was falsch und nicht ich ;-)

von Karol B. (johnpatcher)


Lesenswert?

Bruno M. schrieb:
> Ich komme leider nicht weiter! Da ich die Vorgängerversion schon
> gelöscht habe, kann ich auch nicht mehr vergleichen und testen.

Ein Grund mehr für den Einsatz einer Versionsverwaltung. Ohne ist das 
Selbstmord auf Raten.

Mit freundlichen Grüßen,
Karol Babioch

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Karol Babioch schrieb:
> Ein Grund mehr für den Einsatz einer Versionsverwaltung. Ohne ist das
> Selbstmord auf Raten.

SVN ist eine Versionsverwaltung. ;-)

Aber das main.c, was Bruno vorher verwendet hatte, hatte ich hier damals 
lediglich in diesem Thread gepostet - speziell für Bruno als 
Einstiegshilfe.

Hier noch zu finden:

  Beitrag "Re: IRMP - Infrared Multi Protocol Decoder"

Verloren ist es also nicht.

EDIT:
Der Unterschied besteht im AVR-Teil der main.c nur durch neue Anwendung 
der uart_puts_P()-funktion. Sonst ist er identisch.

: Bearbeitet durch Moderator
von Joachim B. (jar)


Lesenswert?

Frank M. schrieb:
> "Bei unsachgemässer Handhabung kann dies zu erheblichen Problemen durch
> Rekursion wie einem Stack-Overflow oder anderen unerwarteten Effekten
> führen und sollte wirklich nur dann eingesetzt werden, wenn man sich
> sicher ist, das Ganze auch im Griff zu haben."
>
> Ja, lassen wir das. Es wird auch langsam offtopic.

so zum Abschluß, Testroutine geschrieben und das Tektronix TDS3014 
angehängt

meine 10ms Timerroutine braucht ca. 200µs damit entgehen mir 3 IRMP 
Impulse
deine IRMP ISR braucht 4µs (meine Hochachtung) an 16MHz atmega328p

ich sehe also keinerlei Problematik an Rekursion wenn ich mich an die 
Anleitung im AVR-GCC-Tutorial halte:
http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Unterbrechbare_Interruptroutinen

wenn meine 10ms ISR 200µs Ausführungsdauer hat -> keinerlei 
Rekusionsgefahr !

ich sehe nicht wenn in "meiner" ISR noch mal zusätzlich IRMP zum Zuge 
kommt, kostet mich lächerliche 4µs (oder 3x 4µs) die in meinen 200µs 
nicht auffallen

und alle sollten glücklich sein

noch jemand einen Einwand ?

vielen Dank, jar

PS, das ist mit einem Arduino nano (micro) mit atmega 328p die 
Vorbereitung zu 2x word clock

1x 25x25 cm Test mit IKEA ribba Rahmen LEDstripe WS2812b 60 LED/m
1x 50x50 cm Test mit IKEA ribba Rahmen LEDstripe WS2812b 30 LED/m

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


Lesenswert?

Joachim B. schrieb:
> meine 10ms Timerroutine braucht ca. 200µs damit entgehen mir 3 IRMP
> Impulse

Wofür zum Teufel brauchst Du 200µs? Zeig mal, was Du da alles machst.

> deine IRMP ISR braucht 4µs (meine Hochachtung) an 16MHz atmega328p

Womit gezeigt wäre, dass nicht die Länge, sondern die Geschwindigkeit 
einer ISR ausschlaggebend ist ;-)

> noch jemand einen Einwand ?

Grundsätzlich nicht, aber schön ist das nicht. Das kann man gewiss 
sauberer lösen.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Bruno M. schrieb:
> Funktioniert es bei dir denn normal?

Wie gesagt: Ich kann momentan mangels HW nicht testen.

Was funktioniert denn nicht? Wird gar nichts mehr auf dem UART 
ausgegeben oder fehlt lediglich der Protokollname? Wenn letzteres, muss 
in irmpconfig.h lediglich

IRMP_PROTOCOL_NAMES

auf 1 gesetzt werden.

von Joachim B. (jar)


Lesenswert?

was bis jetzt läuft,
LED  Stripe-steuerung mit WS2812
IRMP
Nokia 5110 LCD
I2C Tastatur mit PCF8574a
RTC DS1307 (die gegen die bessere DS3231 getauscht werden soll)


Frank M. schrieb:
> Wofür zum Teufel brauchst Du 200µs? Zeig mal, was Du da alles machst.

gerne,
1
ISR(COMPA_VECT)                                                             // Timer1 output compare A interrupt service routine, called every 1/15000 sec
2
{
3
  uint8_t ii;
4
5
#ifdef IRQ_TEST
6
PORT_QUITT_LED |= (1<<QUITT_LED);
7
#endif
8
9
  (void) irmp_ISR();                                                        // call irmp ISR
10
11
#ifdef IRQ_TEST
12
PORT_QUITT_LED &= ~(1<<QUITT_LED);
13
#endif
14
15
  if(teiler)
16
    teiler--;
17
  else
18
  {
19
20
#ifdef IRQ_TEST
21
PORT_CRTL_LED |= (1<<CRTL_LED);
22
#endif
23
24
    teiler=150; count++;
25
    if(lcd_time_update) 
26
      lcd_time_update--;
27
    else 
28
      lcd_time_update=33;
29
    
30
    if(warte_ms)
31
      warte_ms--;
32
33
    if(count==1)
34
      PORT_POW_LED |= (1<<POW_LED);
35
    else  
36
    {
37
      if(count==21)
38
        PORT_POW_LED &= ~(1<<POW_LED);
39
      if(count==100)
40
      {  count=0;
41
#ifdef RTCTEST
42
         sek_offset++;
43
#endif
44
      }
45
    }
46
47
#ifndef IRQ_TEST
48
    if(quitt_count)
49
    { PORT_QUITT_LED |= (1<<QUITT_LED); quitt_count--;    
50
    }
51
    else
52
      PORT_QUITT_LED &= ~(1<<QUITT_LED);
53
#endif
54
55
    if(_i2c_key)
56
    {  if(!_i2c_busy)
57
      {  _i2c_busy=1;
58
          if(_i2c_key=='A')
59
         {  if(!i2c_start(PCF8574A_0+I2C_READ))  //;  // set device address and write mode
60
              ii = key_state ^ ( ( ~(unsigned char)i2c_readNak() ) ); //jar key1 kaputt    
61
              // ii = key_state ^ ( ( ~(unsigned char)i2c_readNak() ) ___ ); //jar key1 kaputt    
62
            i2c_stop();
63
         }
64
         else
65
         {  if(!i2c_start(PCF8574_0+I2C_READ))  //;  // set device address and write mode
66
            ii = key_state ^ ( ( ~(unsigned char)i2c_readNak() ) ); //jar key1 kaputt    
67
            // ii = key_state ^ ( ( ~(unsigned char)i2c_readNak() ) ___ ); //jar key1 kaputt    
68
            // ___ | ((~ALARM_int1_PIN & (1<<_ALARM_int1_pin))>>2)
69
            i2c_stop();
70
         }
71
         _i2c_busy=0;
72
      }
73
  
74
      ii &= ALL_KEYS;
75
      //cam = ii & (1<<CAM_F || 1<<CAM_S);
76
      ct0 = ~( ct0 & ii );                             // reset or count ct0
77
      ct1 = ct0 ^ (ct1 & ii);                          // reset or count ct1
78
      ii &= ct0 & ct1;                                 // count until roll over ?
79
      key_state ^= ii;                                 // then toggle debounced state
80
      key_press |= key_state & ii;                     // 0->1: key press detect
81
   
82
      if( (key_state & REPEAT_MASK) == 0 )            // check repeat function
83
      rpt = REPEAT_START;                          // start delay
84
      if( --rpt == 0 )
85
      {  rpt = REPEAT_NEXT;                            // repeat delay
86
         key_rpt |= key_state & REPEAT_MASK;
87
      }
88
    }
89
#ifdef IRQ_TEST
90
PORT_CRTL_LED &= ~(1<<CRTL_LED);
91
#endif
92
  }
93
} // ISR (TIMER1_COMPA_vect)

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Joachim B. schrieb:
> Frank M. schrieb:
>> Wofür zum Teufel brauchst Du 200µs? Zeig mal, was Du da alles machst.
>
> gerne,

Die Zeit wird hier wohl in i2c_start() bzw. in i2c_stop() verbraten. 
Diese Funktionen benutzen wahrscheinlich Warteschleifen.

So etwas gehört nicht in eine ISR. Das ist ein No Go. Low-Level-IO ist 
in Ordnung, aber nicht so etwas.

Was machst Du überhaupt noch in der Hauptschleife? Warten und sonst nix?

von Joachim B. (jar)


Lesenswert?

Frank M. schrieb:
> Die Zeit wird hier wohl in i2c_start() bzw. in i2c_stop() verbraten.
> Diese Funktionen benutzen wahrscheinlich Warteschleifen.

mag sein, ist aber für mich OK weil ich da die I2C Tastatur entprelle 
(nach Dannegger), ich mag diese Methode weil mir da nie ein Tastendruck 
entgeht und sie sauber arbeitet.

> So etwas gehört nicht in eine ISR. Das ist ein No Go. Low-Level-IO ist
> in Ordnung, aber nicht so etwas.

ohne Kommentar.

> Was machst Du überhaupt noch in der Hauptschleife? Warten und sonst nix?
genug was eben noch so anfällt, auf IR reagieren, je nach Taste was tun, 
die LED Stripe Programme abarbeiten, das LCD mit der Uhrzeit 
aktualisieren, ab und an Statusmeldungen an serial print übergeben.

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


Lesenswert?

Zusatz:

Eigentlich ist die Lösung ganz einfach:

Einlesen und Setzen von ii machst Du in der Hauptschleife (wenn ein 
Zähler abgelaufen ist), das PeDa-Entprellen von ii machst Du im Timer.

von Bruno M. (brumay)


Lesenswert?

> Was funktioniert denn nicht? Wird gar nichts mehr auf dem UART
> ausgegeben oder fehlt lediglich der Protokollname?

Wie gesagt, das Loggen funktioniert problemlos, aber vom Protokoll kommt 
gar nichts.

> Wenn letzteres, muss
> in irmpconfig.h lediglich
>
> IRMP_PROTOCOL_NAMES
>
> auf 1 gesetzt werden.

Das habe ich natürlich gemacht!

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Bruno M. schrieb:
> Wie gesagt, das Loggen funktioniert problemlos, aber vom Protokoll kommt
> gar nichts.

Auch wenn das Logging abgeschaltet ist? Nicht, dass Du vor lauter Bäumen 
(sprich Einsen und Nullen) den Wald im Terminal-Programm nicht mehr zu 
sehen bekommst ;-)

Ehrlich gesagt: Ich bin ratlos, warum das nicht funktionieren soll. Muss 
ich selber testen. Vielleicht schaffe ich es heute abend.

Gruß,

Frank

von Bruno M. (brumay)


Lesenswert?

> Wenn diese jetzt plötzlich auch nicht mehr funktioniert, dann machst Du
> aber was falsch und nicht ich ;-)

Das Problem scheint tatsächlich bei mir zu liegen. Ich habe den Fehler 
zwar noch nicht gefunden, aber ich bin dran.

von Bruno M. (brumay)


Lesenswert?

Das Problem hat sich erledigt. Die Batterie meiner Fernbedienung war zu 
schwach und hat das Signal offensichtlich nicht ordentlich übertragen. 
Die Ursprungsversion funktioniert also wieder. Jetzt werde ich noch die 
neuee testen.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Bruno M. schrieb:
> Das Problem hat sich erledigt. Die Batterie meiner Fernbedienung war zu
> schwach und hat das Signal offensichtlich nicht ordentlich übertragen.

Tipp: Immer zwei ausprobieren ;-)

von Bruno M. (brumay)


Lesenswert?

> Tipp: Immer zwei ausprobieren ;-)

Ja, hinterher ist man immer schlauer.

Mit der neuen Version komme ich aber trotzdem nicht ganz klar, u.z. wird 
der Protokollname nicht richtig angezeigt

protocol: 0x05   YO   address: 0x2002   command: 0x90A0   flags: 
0x00<\r><\n>

oder

protocol: 0x02   /?.???,?+?*?)?(?'?&?%?$?#?"?!??   address: 0xEB14 
command: 0x0012   flags: 0x00<\r><\n>

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Bruno M. schrieb:
> protocol: 0x05   YO   address: 0x2002   command: 0x90A0   flags:
> 0x00<\r><\n>

Du hast jetzt auch die irmp.c-Version, wo
1
static const char proto_unknown[]       PROGMEM = "UNKNOWN";
2
usw. (viele PROGMEM-Zeilen)

drinsteht?

EDIT:

Ah, ich weiß schon, wo der Fehler steckt. Nicht nur die Array-Inhalte, 
sondern auch das Array selbst ist im Flash. Ich muss also 2x 
dereferenzieren. Irre Sache.

Ich melde mich gleich nochmal.

: Bearbeitet durch Moderator
von Bruno M. (brumay)


Lesenswert?

Frank M. schrieb:

> Du hast jetzt auch die irmp.c-Version, wostatic const char
> proto_unknown[]       PROGMEM = "UNKNOWN";
> usw. (viele PROGMEM-Zeilen)
>
> drinsteht?

Ja genau die habe ich und wenn ich an 3 Stellen (irmp.c, irmp.h und 
main.c) den alten Stand herstelle, dann funktioniert es wieder.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Frank M. schrieb:
> Ah, ich weiß schon, wo der Fehler steckt. Nicht nur die Array-Inhalte,
> sondern auch das Array selbst ist im Flash. Ich muss also 2x
> dereferenzieren. Irre Sache.

Du musst jetzt mal für mich testen.

Ersetze bitte in main.c:
1
    uart_puts_P (irmp_protocol_names[irmp_data.protocol]);

durch:
1
    PGM_P p = (PGM_P) pgm_read_word (irmp_protocol_names[irmp_data.protocol]);
2
    uart_puts_P (p);

von Bruno M. (brumay)


Lesenswert?

Frank M. schrieb:
> Du musst jetzt mal für mich testen.

Hat sich nichts geändert.

Es kommt auch eine Warnung:
uninitialized variable 'irmp_protocol_names' put into program memory 
area [-Wuninitialized]  irmp.h

von Joachim B. (jar)


Lesenswert?

Frank M. schrieb:
> Zusatz:
>
> Eigentlich ist die Lösung ganz einfach:

oder noch einfacher

ich weiss das deine IRQ keine 4µs dauert !
ich weiss das meine lange Ausführung 200µs dauert und nur alle 10ms 
stattfindet.

ich setze ein Flag wenn ich im langen 200µs Teil bin und erlaube dann 
mit sei(); wieder IRQ, und da deine IRQ nur 4µs dauern -um was meine 
200µs verlängert werden- die aber nur alle 10ms stattfinden und am Ende 
der langen IRQ-Ausführung lösche ich das Flag wieder und mache cli() -> 
damit habe ich kein Problem.

voila, es kommen nun wieder alle IRMP IRQ durch für 4µs, der lange Teil 
wird umgangen solange das Flag long_irq gesetzt ist und wird erst wieder 
ausgeführt wenn long_irq auf 0 gesetzt ist am Ende vom long IRQ

klappt prima !

Die Idee mit Timer2 schied aus weil der für die Arduino PWM genutzt 
wird.

: Bearbeitet durch User
von Karol B. (johnpatcher)


Lesenswert?

Hi,

Bin heute Morgen leider nicht mehr dazu gekommen das Ganze richtig zu 
recherchieren und wollte da nicht voreilig Falschaussagen treffen. Die 
vorgeschlagenen Linker-Optionen kamen mir nämlich ein wenig spanisch 
vor.

Frank M. schrieb:
> Wenn Du einen neueren avr-gcc hast (z.B. 4.7.2), kannst Du einiges
> herausholen durch folgende Flags:
>
> Compiler:
>
>  -Os                    # hast Du wahrscheinlich schon
>  -flto
>  -ffunction-sections
>  -fdata-sections

Das geht soweit in Ordnung bzw. macht Sinn.

> Linker:
>  -Os                    # ja, beim Linker!

Das ist nicht dokumentiert. Die Manpage sagt dazu folgendes:

> -O level
>     If level is a numeric values greater than zero ld optimizes the output.

Auf gut deutsch: Nur nummerische Werte sind erlaubt. Keine Ahnung was s 
bewirkt, wahrscheinlich gar nichts, siehe unten.

>  -flto
>  -ffunction-sections
>  -fdata-sections

Diese Optionen gibt es laut Manpage des Linkers (avr-ld) nicht.

>  -Wl,--gc-sections

Die eigentliche Option hier wäre aber nur gc-sections. Mit dem 
vorangestelltem "-Wl," reichst du die Option nur zum Linker durch, falls 
du diesen nicht explizit aufrufst, sondern "avr-gcc" direkt benutzt.

All dies lässt mich zu der Vermutung kommen, dass du hier etwas 
durcheinander gebracht hast und es dir nur durch Glück (bzw. Pech) nicht 
aufgefallen ist. Kann es sein, dass du die Optionen nicht zum Linker 
weiter reichst (weil du kein "-Wl," vorangestellt hast), sondern diese 
direkt vom Compiler ausgewertet werden. Dadurch kommt es zu keinen 
Fehlermeldungen, bringt halt nur auch nichts ;).

Frank M. schrieb:
> SVN ist eine Versionsverwaltung. ;-)

Das ich SVN für einen Krampf halte, weißt du ja von der Wordclock 
Diskussion schon. Aber ja, SVN ist eine Versionsverwaltung und besser 
als keine. Die Aussage bezog ich aber gar nicht auf dich, sondern auf 
Bruno M., der ja sagte, dass er den vorherigen Zustand nicht wieder 
herstellen kann.

Joachim B. schrieb:
> noch jemand einen Einwand ?

Ja, ich halte das auch für eine schlechte Idee. Prinzipiell möglich, 
aber man muss ÜBERVORSICHTIG sein. Die Lösung wäre es, wie schon 
gesagt, keine I2C Transfers innerhalb der ISR zu initiieren und auf die 
Antwort zu warten. Teil der I2C Spezifikation ist übrigens auch das sog. 
Clock Stretching, d.h. das zeitliche Verhalten ist absolut 
unvorhersagbar und hat nichts in der ISR verloren.

Frank M. schrieb:
> Nicht nur die Array-Inhalte,
> sondern auch das Array selbst ist im Flash. Ich muss also 2x
> dereferenzieren. Irre Sache.

Ja, und das wird ziemlich schnell ziemlich unleserlich, zumindest 
besonders intuitiv ist es nicht.

Frank M. schrieb:
> PGM_P p = (PGM_P) pgm_read_word
> (irmp_protocol_names[irmp_data.protocol]);

Fehlt da nicht noch ein "&" samt passender Klammerung innerhalb von 
pgm_read_word()? Also in etwa so:
1
    PGM_P p = (PGM_P) pgm_read_word (&(irmp_protocol_names[irmp_data.protocol]));

Du willst das was sich hinter "irmp_protocol_names[irmp_data.protocol]" 
verbirgt ja als Adresse an pgm_read_word() übergeben und selbst wieder 
als Adresse interpretieren (daher pgm_read_word() und der Cast zu 
(PGM_P)). So jedenfalls habe ich das kürzlich bei einem ähnlichem 
Problem bei meinen Umbaumaßnahmen am Wordclock Projekt gelöst, siehe [1] 
und [2]. Das hatte ich auch getestet und es hat funktioniert. Kann das 
aber leider gerade auch nicht verifizieren, müsste mich aber gerade 
schon ganz stark irren.

Mit freundlichen Grüßen,
Karol Babioch

[1]: 
https://github.com/Wordclock/firmware/blob/feat/log/src/uart_protocol.c#L1094
[2]: 
https://github.com/Wordclock/firmware/blob/feat/log/src/uart_protocol.c#L1121

: Bearbeitet durch User
von Joachim B. (jar)


Lesenswert?

Karol Babioch schrieb:
> Joachim B. schrieb:
>> noch jemand einen Einwand ?
>
> Ja, ich halte das auch für eine schlechte Idee. Prinzipiell möglich,
> aber man muss ÜBERVORSICHTIG sein. Die Lösung wäre es, wie schon
> gesagt, keine I2C Transfers innerhalb der ISR zu initiieren und auf die
> Antwort zu warten. Teil der I2C Spezifikation ist übrigens auch das sog.
> Clock Stretching, d.h. das zeitliche Verhalten ist absolut
> unvorhersagbar und hat nichts in der ISR verloren.

danke ist klar, aber nach über 4 Jahren mit meiner "I2C Tastatur" ist 
mir da nie was aufgefallen. Ich halte den PCF8574 nicht für so komplex 
das er Clock Stretching betreibt. Sein Verhalten war bis jetzt korrekt 
oder sagen wir überschaubar, von daher glaube ich kann ich in meiner 
Anwendung das so lassen. Selbst wenn er Clock Stretching betreiben würde 
glaube ich nicht das er seine default 100kHz -> 10µs pro bit Zugriff auf 
1ms verlängert was dann kritisch werden würde.

Ich glaube fest ohne weitere Hinweise das es für "meine" I2C Tastatur 
unkritisch bleibt. Weitere Anwendungen für I2C in einer ISR dafür fallen 
mir eh nicht ein.

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


Lesenswert?

Bruno M. schrieb:
> Hat sich nichts geändert.

Hm, komisch. Das sollte eigentlich die Lösung sein. Dann werde ich das 
heute abend mal selbst testen.

> Es kommt auch eine Warnung:
> uninitialized variable 'irmp_protocol_names' put into program memory
> area [-Wuninitialized]  irmp.h

Die bekomme ich nicht. Irgendwas ist bei Dir nicht konsistent. Du hast 
nun wieder alle Dateien aus dem SVN + Korrektur der 2 Zeilen?

Dann teste bitte mal Karols Vorschlag:
1
   PGM_P p = (PGM_P) pgm_read_word (&(irmp_protocol_names[irmp_data.protocol]));

: Bearbeitet durch Moderator
von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Hi Karol,

Karol Babioch schrieb:
>> Linker:
>>  -Os                    # ja, beim Linker!
>
> Das ist nicht dokumentiert. Die Manpage sagt dazu folgendes:

Es ist mir egal, was die Manpage dazu sagt. ;-)

Die Optionen sind von mir (und anderen!) einzeln und in Gruppen 
durchgetestet. Nur in dieser Kombination bekommt man ein optimales 
Ergebnis.

Erst mit dem Linker-Flag -Os funktioniert die flto-Optimierung, d.h. der 
gcc behandelt externe Funktionen wie static Funktionen. Bildlich 
gesprochen zieht er den kompletten Source in einen Quelltext und kann 
viel besser optimieren, nämlich z.B. quelltext-übergreifend inlinen. 
Real passiert natürlich etwas anderes: Es wird alles in eine 
Zwischensprache (GIMPLE) übersetzt, welche dann in der zweiten Stufe 
nochmals optimiert wird. Dazu muss der Linker(!) den Compiler nochmals 
aufrufen und ihm (dem Compiler!) das -Os als Optimierungsflag mitgeben.

Siehe dazu auch folgenden Thread, wo das Thema ausführlichst behandelt 
wird:

   Beitrag ""Include-Libs" - Teufelswerk?"

> Diese Optionen gibt es laut Manpage des Linkers (avr-ld) nicht.
>
>>  -Wl,--gc-sections

Ich kann nichts dafür, dass die Manpage nicht stimmt, s.o. ;-)

> Die eigentliche Option hier wäre aber nur gc-sections. Mit dem
> vorangestelltem "-Wl," reichst du die Option nur zum Linker durch, falls
> du diesen nicht explizit aufrufst, sondern "avr-gcc" direkt benutzt.

Siehe oben:
Der Linker muss den Compiler aufrufen und ihm die Compiler-Flags 
nochmals unterjubeln.

> All dies lässt mich zu der Vermutung kommen, dass du hier etwas
> durcheinander gebracht hast [...]

Nein, habe ich nicht. Der Witz ist, dass bei -flto der Linker den 
Compiler für einen 2. Optimierungslauf aufruft. Deshalb muss dem Linker 
die notwendigen Compilerflags mitgegeben werden.

> [irmp_protocol_names]...
> Ja, und das wird ziemlich schnell ziemlich unleserlich, zumindest
> besonders intuitiv ist es nicht.

Das liegt daran, dass zum einen die Strings im Flash liegen:
1
static const char proto_unknown[]       PROGMEM = "UNKNOWN";
2
static const char proto_sircs[]         PROGMEM = "SIRCS";
3
static const char proto_nec[]           PROGMEM = "NEC";
4
...

... und zum anderen das Array selbst:
1
const char * const
2
irmp_protocol_names[IRMP_N_PROTOCOLS + 1] PROGMEM =
3
{
4
    proto_unknown,
5
    proto_sircs,
6
    ...

> Fehlt da nicht noch ein "&" samt passender Klammerung innerhalb von
> pgm_read_word()? Also in etwa so:
>
>
1
>     PGM_P p = (PGM_P) pgm_read_word 
2
> (&(irmp_protocol_names[irmp_data.protocol]));
3
>

Ja, könnte durchaus sein. Ich habe mir da gestern zu wenig Gedanken 
drüber gemacht und einfach eine 2. Dereferenzierung eingebaut. Denn wir 
haben ja hier eine geschachtelte Situation. Habe ich so noch nie 
verwendet. Aber nur so wird der RAM-Verbrauch minimal.

Gruß,

Frank

von Karol B. (johnpatcher)


Lesenswert?

Joachim B. schrieb:
> Ich halte den PCF8574 nicht für so komplex
> das er Clock Stretching betreibt.

Das ist überhaupt kein komplexes Feature. Spreche das Teil einfach mal 
mit mehr als 100 kHz an und sehe was passiert.

Joachim B. schrieb:
> Sein Verhalten war bis jetzt korrekt
> oder sagen wir überschaubar,

Du verlässt dich damit halt implizit auf die von dir gemachte Erfahrung, 
dass das Teil schnell genug antwortet. Selbst wenn das Ding selbst keine 
Probleme macht, könnte jeder zusätzliche Teilnehmer am Bus deine Annahme 
auf den Kopf stellen. Das Debuggen wird dann nicht einfacher ...

Keine Ahnung in welchem Kontext du das Ganze entwickelst, aber sofern 
die Möglichkeit besteht, dass in einigen Monaten/Jahren jemand anderes 
bzw. (wieder du) daran weiterentwickelt, so machst du demjenigen nur das 
Leben schwer, wenn du da irgendwelche untypischen Dinge vollführst. 
Zumindest solltest du das GUT dokumentieren.

Letztendlich musst das natürlich du alleine entscheiden, du scheinst 
dich aber ganz schön vehement zu sträuben und sowieso an deiner Meinung 
fest zu halten. Insofern hättest du dir die Frage auch sparen können ;).

Mit freundlichen Grüßen,
Karol Babioch

: Bearbeitet durch User
von Bruno M. (brumay)


Lesenswert?

Frank M. schrieb:

> Dann teste bitte mal Karols Vorschlag:
>    PGM_P p = (PGM_P) pgm_read_word
> (&(irmp_protocol_names[irmp_data.protocol]));

Ergebnis:

protocol: 0x05   KASEIKYO   address: 0x2002   command: 0x90A0   flags: 
0x00<\r><\n>

das sieht doch gut aus. Die Warnung ist aber geblieben.

von Bruno M. (brumay)


Lesenswert?

Jetzt ergibt sich daraus aber noch eine Frage. Ich hatte das Programm so 
umgeschrieben, daß ich es auch auf LCD ausgeben kann. In der 
Vorgängerversion ging das auch gut.

Was muß ich aber jetzt für den Programmnamen hinter lcd_string eingeben?

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Bruno M. schrieb:
> protocol: 0x05   KASEIKYO   address: 0x2002   command: 0x90A0   flags:
> 0x00<\r><\n>
>
> das sieht doch gut aus. Die Warnung ist aber geblieben.

Prima, freut mich. Ich werde die korrigierte Version gleich ins SVN 
einchecken. Zu der Warnung kann ich leider nichts sagen, denn ich 
erhalte sie nicht. Wird da irgendwo eine Zeilennummer ausgegeben? Oder 
kannst Du per Copy&Paste den genauen Wortlaut hier reinstellen?

Bruno M. schrieb:
> Jetzt ergibt sich daraus aber noch eine Frage. Ich hatte das Programm so
> umgeschrieben, daß ich es auch auf LCD ausgeben kann. In der
> Vorgängerversion ging das auch gut.
>
> Was muß ich aber jetzt für den Programmnamen hinter lcd_string eingeben?

Ich weiß leider nicht, welche LCD-Lib Du nutzt. Aber ich vermute stark, 
dass es neben lcd_string() auch eine Funktion lcd_string_P() gibt. 
Probiers aus.

: Bearbeitet durch Moderator
von Karol B. (johnpatcher)


Lesenswert?

Frank M. schrieb:
> Bruno M. schrieb:
>> Jetzt ergibt sich daraus aber noch eine Frage. Ich hatte das Programm so
>> umgeschrieben, daß ich es auch auf LCD ausgeben kann. In der
>> Vorgängerversion ging das auch gut.
>>
>> Was muß ich aber jetzt für den Programmnamen hinter lcd_string eingeben?
>
> Ich weiß leider nicht, welche LCD-Lib Du nutzt. Aber ich vermute stark,
> dass es neben lcd_string() auch eine Funktion lcd_string_P() gibt.
> Probiers aus.

Alternativ kannst du den String auch mit strcpy_P bzw. strncpy_P in den 
SRAM kopieren und dann wie gewohnt an deine LCD-Ausgaberoutine 
übergeben.

Mit freundlichen Grüßen,
Karol Babioch

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Karol Babioch schrieb:
> Alternativ kannst du den String auch mit strcpy_P bzw. strncpy_P in den
> SRAM kopieren und dann wie gewohnt an deine LCD-Ausgaberoutine
> übergeben.

Wie???

Du willst die mit viel Aufwand gesparten Bytes im RAM jetzt wieder zum 
Fenster hinauswerfen?!? ;-)

Dann doch lieber eine lcd_string_P-Funktion schreiben, die analog zum 
uart_puts_P arbeitet.

Aber wie gesagt: Ich vermute stark, dass es die Funktion lcd_string_P() 
bereits schon gibt.

von Bruno M. (brumay)


Lesenswert?

Frank M. schrieb:

> Ich weiß leider nicht, welche LCD-Lib Du nutzt. Aber ich vermute stark,
> dass es neben lcd_string() auch eine Funktion lcd_string_P() gibt.
> Probiers aus.

Ich hatte die lib aus dem Tutorial, die enthält kein lcd_string_P(). Ich 
habe sie mir aber jetzt aus der lib von Peter Fleury kopiert und das 
funktioniert.

Karol Babioch schrieb:

> Alternativ kannst du den String auch mit strcpy_P bzw. strncpy_P in den
> SRAM kopieren und dann wie gewohnt an deine LCD-Ausgaberoutine
> übergeben.

Ich habe das mit
1
strcpy_P(p ,(PGM_P) pgm_read_word (&(irmp_protocol_names[irmp_data.protocol])));
2
      lcd_string(p);


probiert. Geht auch, aber dann warnt der Compiler wegen char und const 
char.

von Bruno M. (brumay)


Lesenswert?

Frank M. schrieb:

> Zu der Warnung kann ich leider nichts sagen, denn ich
> erhalte sie nicht. Wird da irgendwo eine Zeilennummer ausgegeben? Oder
> kannst Du per Copy&Paste den genauen Wortlaut hier reinstellen?

Warning  4  uninitialized variable 'irmp_protocol_names' put into 
program memory area [-Wuninitialized]  irmp.h  132  41

das ist die komplette Warnung, nur mein Dateipfad fehlt.

von Karol B. (johnpatcher)


Lesenswert?

Bruno M. schrieb:
> Geht auch, aber dann warnt der Compiler wegen char und const
> char.

Was genau wird beanstandet? Im Notfall castest du den Pointer halt 
passend :).

Mit freundlichen Grüßen,
Karol Babioch

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Bruno M. schrieb:
> Ich hatte die lib aus dem Tutorial, die enthält kein lcd_string_P(). Ich
> habe sie mir aber jetzt aus der lib von Peter Fleury kopiert und das
> funktioniert.

Prima. Diese Lösung solltest Du so beibehalten.

> Ich habe das mit
>
>
1
strcpy_P(p ,(PGM_P) pgm_read_word 
2
> (&(irmp_protocol_names[irmp_data.protocol])));
3
>       lcd_string(p);
>
>
> probiert. Geht auch, aber dann warnt der Compiler wegen char und const
> char.

Nicht nur das. p ist nur ein Pointer und stellt keinerlei RAM durch 
Reservierung zur Verfügung. Das heisst: Du schreibst Dir mit strcpy_P() 
irgendwo unkontrolliert in den Speicher. Ein Crash ist damit 
vorprogrammiert.

Wenn, dann musst Du p definieren als:

char p[32];           // 32: max. mögliche Länge des Strings + 1

Nur dann hast Du auch Speicher für die Copy-Funktion reserviert. Kostet 
Dich aber auch 32 Bytes. Und genau da wollten wir doch eigentlich 
sparen ;-)

von Karol B. (johnpatcher)


Lesenswert?

Frank M. schrieb:
> Du willst die mit viel Aufwand gesparten Bytes im RAM jetzt wieder zum
> Fenster hinauswerfen?!? ;-)

Frank M. schrieb:
> Wenn, dann musst Du p definieren als:
>
> char p[32];           // 32: max. mögliche Länge des Strings + 1
>
> Nur dann hast Du auch Speicher für die Copy-Funktion reserviert. Kostet
> Dich aber auch 32 Bytes. Und genau da wollten wir doch eigentlich
> sparen ;-)

Sind ja jetzt keine globalen Variablen mehr und können daher in den 
Speicherbereich eines Stackframes kopiert werden.

Ist ja auch nur eine Alternative gewesen, wenn entsprechende *_P() 
Funktionen zur Verfügung stehen. Interessant in diesem Zusammenhang ist 
ggf. auch das "__flash" Attribut, siehe [1]. Würde das aber gerne mal in 
Aktion sehen (bei einem größeren Projekt) bevor ich meine Quellen 
migriere und mir unnötig Arbeit mache.

Mit freundlichen Grüßen,
Karol Babioch

[1]: Beitrag "avr-gcc progmem immer noch?"

von Joachim B. (jar)


Lesenswert?

Karol Babioch schrieb:
> Joachim B. schrieb:
>> Ich halte den PCF8574 nicht für so komplex
>> das er Clock Stretching betreibt.
>
> Das ist überhaupt kein komplexes Feature. Spreche das Teil einfach mal
> mit mehr als 100 kHz an und sehe was passiert.

das Datenblatt weisst den nicht als 400kHz Typen aus, also warum sollte 
ich sowas machen ?

> Du verlässt dich damit halt implizit auf die von dir gemachte Erfahrung,
> dass das Teil schnell genug antwortet. Selbst wenn das Ding selbst keine
> Probleme macht, könnte jeder zusätzliche Teilnehmer am Bus deine Annahme
> auf den Kopf stellen. Das Debuggen wird dann nicht einfacher ...

OK das Argument lasse ich gelten, da ich aber bis jetzt den Takt auf 
100kHz habe und ich noch keinen unter 100kHz entdecken konnte weiss ich 
nicht ob dieser Einwand nicht ein wenig konstruiert wirkt, ich gebe zu 
viele verschiedene I2C Bausteine habe ich noch nicht angesteuert.

> Keine Ahnung in welchem Kontext du das Ganze entwickelst

nur für mich

> die Möglichkeit besteht, dass in einigen Monaten/Jahren jemand anderes

bin ich tot und dann geht es in den Elektronikschrott

> Zumindest solltest du das GUT dokumentieren.

meine berufliche Erfahrung, Unterlagen verschwinden als erstes !
(zumindest privat habe ich noch meine Quellprogramme dokumentiert aus 
den 80er bis 90er Jahren)

> Letztendlich musst das natürlich du alleine entscheiden, du scheinst
> dich aber ganz schön vehement zu sträuben und sowieso an deiner Meinung
> fest zu halten.

ich sträube mich normalerweise nicht, aber je weiter ich komme umso mehr 
tun sich Fragen auf.

Entweder ich schaffe es irgendwann alle Fragen perfekt zu beantworten, 
dann habe ich nichts geschaffen
(der Spezialist weiss immer mehr von immer weniger bis er bald alles von 
nichts weiss)

oder ich muss mich damit abfinden das es läuft aber Risiken der 
Fehlfunktion überbleiben

Es soll eine Spielerei oder word clock werden ! kein Feuermelder oder 
Entrauchungsanlage, auch keine Lasersteuerung.

Trotzdem danke für jeden Hinweis den ich bei Neugier auch mal selber 
folgen kann.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Karol Babioch schrieb:
> Interessant in diesem Zusammenhang ist
> ggf. auch das "__flash" Attribut, siehe [1].

Ich kenne diesen Thread, habe ja schließlich auch was dort dazu 
geschrieben ;-)

Aber eigentlich wird dem Programmierer mittels __flash nur etwas 
Schreibarbeit abgenommen. Das vom Compiler erzeugte Programm ist 
identisch zur PROGMEM-Variante. Ich würde kurzfristig IRMP und andere 
meiner Programme nicht darauf umstellen wollen, da ich darauf bedacht 
bin, dass andere Leute immer noch ältere Compiler verwenden können. Zum 
Beispiel ist AVRStudio4 mit avr-gcc 4.3.3 aus WinAVR-2010-01-20 immer 
noch sehr verbreitet.

> Würde das aber gerne mal in
> Aktion sehen (bei einem größeren Projekt) bevor ich meine Quellen
> migriere und mir unnötig Arbeit mache.

Das mit der Schreibweise __flash funktioniert tadellos. Es sieht 
natürlich im Quelltext schöner aus. Wenn es Dir nur um eigene Programme 
geht, die nur Du kompilierst, kannst Du das bedenkenlos umstellen.

gruß,

Frank

: Bearbeitet durch Moderator
von Joachim B. (jar)


Lesenswert?

Bruno M. schrieb:
> Frank M. schrieb:
>
>> Dann teste bitte mal Karols Vorschlag:
>>    PGM_P p = (PGM_P) pgm_read_word
>> (&(irmp_protocol_names[irmp_data.protocol]));

sind diese Änderungen schon im svn ?

ich hatte gerade mal nur irmp.c und irmp.h probiert aber gleich 
Fehlermeldungen bekommen bezüglich IRMP port und bit

die Namen im flash hätte ich auch schon gerne genutzt

im Moment habe ich

irmp.c
* $Id: irmp.c,v 1.145 2014/02/20 14:55:17 fm Exp $
irmp.h
* $Id: irmp.h,v 1.84 2014/02/19 12:57:36 fm Exp $

mein Code läuft nur die Namen erzeuge ich so, etwas umständlich halt

#ifdef IRMP_SUPPORT_NEC_PROTOCOL
        case IRMP_NEC_PROTOCOL: Serial.print(F("IR: ")); 
Serial.print(F("NEC")); Serial.print(F(", Address: ")); 
Serial.print(irmp_data.address); Serial.print(F(", Command: ")); 
Serial.println(irmp_data.command);

schöner wäre statt
Serial.print(F("NEC"));

direkt aus dem flash
Serial.print(irmp_protocol_names[IRMP_NEC_PROTOCOL]);

lg jar

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Joachim B. schrieb:
> sind diese Änderungen schon im svn ?

Ja, schon seit kurz vor Mittag.

> im Moment habe ich
>
> irmp.c
> * $Id: irmp.c,v 1.145 2014/02/20 14:55:17 fm Exp $
> irmp.h
> * $Id: irmp.h,v 1.84 2014/02/19 12:57:36 fm Exp $

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

zeigt was anderes. Du hast da die Version vom Februar aus dem 
Zip-Archiv.

> #ifdef IRMP_SUPPORT_NEC_PROTOCOL
>         case IRMP_NEC_PROTOCOL: Serial.print(F("IR: "));
> Serial.print(F("NEC")); Serial.print(F(", Address: "));
> Serial.print(irmp_data.address); Serial.print(F(", Command: "));
> Serial.println(irmp_data.command);

Viel zu umständlich. Das Array irmp_protocol_names gibt es schon seit 
ein paar Jahren.

> Serial.print(irmp_protocol_names[IRMP_NEC_PROTOCOL]);

Du musst wegen der doppelten Referenzierung des Arrays im Flash 
denselben Trick anwenden wie heute morgen diskutiert.

von Joachim B. (jar)


Lesenswert?

Frank M. schrieb:
> Ja, schon seit kurz vor Mittag.
wo ?

mit diesem habe ich Fehler bekommen (heute um diese Zeit aus dem gnu 
tarball ausgepackt)
* $Id: irmp.c,v 1.164 2014/09/15 12:36:28 fm Exp $

der 15 sagt mir war nicht von heute Mittag

deswegen wieder zurückgegangen

> zeigt was anderes. Du hast da die Version vom Februar aus dem
> Zip-Archiv.

war wohl misverständlich

> Viel zu umständlich. Das Array irmp_protocol_names gibt es schon seit
> ein paar Jahren.

ich weiss, hatte ich im studio 4 schon genutzt, aber irgendwas funzte am 
arduino nicht (weswegen ich diesen umständlichen Weg ging, nicht aus jux 
und dollerei) und nun einen neuen Versuch starte

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Joachim B. schrieb:
> der 15 sagt mir war nicht von heute Mittag

Das war vorgestern.

Wir reden hier seit 2 Tagen über das Beispiel-main.c und nicht über 
irmp.c - noch nicht gemerkt?

Ich habe mir eben die Arbeit gemacht, Dir einen Link auf das SVN zu 
posten.

Hier nochmal:

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

Da siehst Du direkt, von wann welche Datei ist.

Das erste, was Du dann fragst, ist: "Wo?".

Ich bitte Dich, etwas aufmerksamer bei der Sache zu bleiben. Sonst komme 
ich mir irgendwie verarscht vor.

von Joachim B. (jar)


Lesenswert?

Frank M. schrieb:
> Ich bitte Dich, etwas aufmerksamer bei der Sache zu bleiben. Sonst komme
> ich mir irgendwie verarscht vor.

verstehe ich auch, ich bin sogar der Pointer Diskusion zu Karol gefolgt, 
aber irgendwann rauchte mir so der Kopf das ich es lieber probieren 
wollte statt nicht weiterzukommen

nur den main Aufruf ändern oder wie, bin grad verwirrt....

reicht es nur IRMP.C und .H zu tauschen oder braucht es noch mehr ?

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


Lesenswert?

Joachim B. schrieb:
> das ändert nix daran wenn ich nur irmp.c und .h vom Februar mit
> September tausche das ich eine Fehlermeldung bekomme [...]

Zwischen Februar und heute liegt mehr als ein halbes Jahr. Da kannst Du 
nicht mehr einzelne Module einfach so austauschen, sondern alles oder 
gar nichts.

Also:

irmp.c
irmp.h
irmpprotocols.h
irmpsystem.h
irmpconfig.h

Das main.c solltest Du Dir zu Studienzwecken auch noch ansehen.

: Bearbeitet durch Moderator
von Joachim B. (jar)


Lesenswert?

danke mache ich, nichts für ungut .....

von Joachim B. (jar)


Lesenswert?

ich wusste warum ich die Namen ausgeklammert hatte in ARDUINO

lightweight_ws2812.cpp.o:(.progmem.data+0x5e): multiple definition of 
`irmp_protocol_names'
irmp.c.o:(.progmem.data+0x0): first defined here


muss ich ein andermal untersuchen....

von Karol B. (johnpatcher)


Lesenswert?

Joachim B. schrieb:
> ich wusste warum ich die Namen ausgeklammert hatte in ARDUINO

Arduino setzt auch intern auf gcc auf.

Joachim B. schrieb:
> lightweight_ws2812.cpp.o:(.progmem.data+0x5e): multiple definition of
> `irmp_protocol_names'
> irmp.c.o:(.progmem.data+0x0): first defined here

Zeige mal bitte lightweight_ws2812.cpp samt dazugehörigem Header. Laut 
Fehlermeldung versuchst du dort die Variable irmp_protocol_names zu 
definieren. Der Unterschied zwischen einer Definition und einer 
Deklaration ist dir klar?

Mit freundlichen Grüßen,
Karol Babioch

von Joachim B. (jar)


Lesenswert?

Karol Babioch schrieb:
> Zeige mal bitte lightweight_ws2812.cpp samt dazugehörigem Header. Laut
> Fehlermeldung versuchst du dort die Variable irmp_protocol_names zu
> definieren.

ist mir auch schon aufgefallen

ich habe an 2 Stellen das
#include "irmp.h"

in irmp.c und im main

egal wo ich es weglasse, einer meckert immer .......


> Der Unterschied zwischen einer Definition und einer
> Deklaration ist dir klar?

jau


die Arduino IDE macht mich wahnsinnig, wie schön ging das im AVR Studio4

aber auf Platinen löten und immer wieder AVRisp mk2 (clone) progger 
kaufen fehlt das Geld und die Lust (Zeit).....

es ist mühsam ehemalige C Sourcen und Header in die IDE zu übernehmen, 
habe da noch nicht den Durchblick

danke für Hilfe

: Bearbeitet durch User
von Karol B. (johnpatcher)


Lesenswert?

Joachim B. schrieb:
> #include "irmp.h"
>
> in irmp.c und im main

In irmp.c sollst du gar nicht herum werkeln. Das ist Franks Domäne ;). 
Lade doch mal das Projekt irgendwo hoch, vielleicht mag sich das ja 
jemand anschauen bzw. findet den Fehler.

Übrigens: Ein Arduino ist ein AVR + Bootloader. Du kannst du auch prima 
ohne Arduino IDE programmieren und Programme z.B. mittels avrdude auf 
den Arduino übertragen. Die IDE macht im Hintergrund nichts anderes.

Mit freundlichen Grüßen,
Karol Babioch

von SvenK (Gast)


Lesenswert?

Hallo Frank,

vielen herzlichen Dank für Deine Unterstützung.

Jetzt bin ich unterwegs - kann das also wahrscheinlich erst im Oktober 
austesten.

Ich gebe Bescheid, wenn ich so weit bin.

Zu den Doppelbefehlen:

Bei den "normalen = standard" Funktionen (Laut, Leise, Next, Prev) 
wurden ca. 1660 Werte ausgegeben.
Bei den "exotischeren" Befehlen (Map, Band) wurden ca. die doppelte 
Anzahl von Zeichen ausgegeben.
Bei einigen wenigen Tasten war es möglich mit einem sehr kurzen 
Tastendruck nur 1660 Werte zu erhalten. Stabil reproduzierbar war das 
aber nicht - meist kamen auch da die doppelte Anzahl.


Zur Diskrepanz der Zeitangaben bei der PC-Auswertung mit IRMP.exe:

Ich hatte eigentlich alle 3 Werte (10.000 15.000 und 20.000) getestet. 
Es wurden dann zwar mehr oder weniger Werte über den UART ausgegeben, 
aber die Auswertung mit IRMP.exe stimmte nie.

Wie sollte das eigentlich auch gehen: Aus der UART-Ausgabe wird ja nur 
eine Textdatei mit "0", "1" und ggf. Zeilenumbruch generiert.(Ich habe 
ht-Term verwendet und als RAW gespeichert.)

Ein "Zeitnormal" wird doch nicht mit eingebaut !? (...und die 
UART-Baudrate dürfte hier auch nicht mir reinspielen)

Das U2X-Problem hat sich nach kleiner "Reinigung" des Source-Codes mit 
dem Holzhammer (siehe oben ;-) undefiniert von selbst aufgelöst... ...ab 
jetzt "Never touch a running system"

Nochmal vielen herzlichen Dank

Viele Grüße

SvenK

von Karol B. (johnpatcher)


Lesenswert?

Joachim B. schrieb:
> nur für mich

Dann musst du das auch nur mit dir und deinem Gewissen vereinbaren ;). 
Ich persönlich erhebe immer den Anspruch solche Dinge architektonisch so 
gut wie möglich zu lösen. Und das notdürftige Verschachteln von 
Interrupts aufgrund von I2C Transfers in einem Interrupt gehört da nicht 
dazu :).

Frank M. schrieb:
> Ich würde kurzfristig IRMP und andere
> meiner Programme nicht darauf umstellen wollen, da ich darauf bedacht
> bin, dass andere Leute immer noch ältere Compiler verwenden können. Zum
> Beispiel ist AVRStudio4 mit avr-gcc 4.3.3 aus WinAVR-2010-01-20 immer
> noch sehr verbreitet.

Die Sorge teile ich nicht. Alles außer avr-gcc 4.9.1 ist alt ;). Ich 
pflege allerdings auch keine Bibliothek wie IRMP ...

Frank M. schrieb:
> Das mit der Schreibweise __flash funktioniert tadellos. Es sieht
> natürlich im Quelltext schöner aus. Wenn es Dir nur um eigene Programme
> geht, die nur Du kompilierst, kannst Du das bedenkenlos umstellen.

Es geht mir weniger um die Schreibweise, sondern wie man dann den 
Zugriff auf Inhalte im Flash am Besten löst. Weiterhin mit jeweils zwei 
Funktionen (jeweils eine mit *_P())", oder ggf. nur noch eine mit einem 
zusätzliche Parameter in dessen Abhängigkeit man den Pointer 
entsprechend zurecht castet.

Frank M. schrieb:
> Es ist mir egal, was die Manpage dazu sagt. ;-)

Mir aber nicht. Gerade bei Projekten wie gcc ist die Manpage eigentlich 
immer up to date und die Referenz.

Frank M. schrieb:
> Die Optionen sind von mir (und anderen!) einzeln und in Gruppen
> durchgetestet.

Mich wundert es eben nur ein bisschen.

Frank M. schrieb:
> Nur in dieser Kombination bekommt man ein optimales
> Ergebnis.

Das kann ich z.B. nicht nachvollziehen. Beim Kompilieren meiner Version 
des Wordclock Projekts gewinne ich NUR durch das Zuschalten der LTO 
beim Kompilieren (-flto beim Compiler) 1.5 kB. Die zusätzlichen Schalter 
(-Os, -flto, -ffunction-sections, -fdata-sections) beim Linken hingegen 
bringen keinen zusätzlichen Gewinn. Sogar -Wl,-gc-sections hat dann 
keine Auswirkungen mehr, obwohl es ohne die -flto Option etwas bringt.

Frank M. schrieb:
> Erst mit dem Linker-Flag -Os funktioniert die flto-Optimierung, d.h. der
> gcc behandelt externe Funktionen wie static Funktionen.

Nein, das funktioniert bei mir auch ohne -flto beim Linken.

Frank M. schrieb:
> Bildlich
> gesprochen zieht er den kompletten Source in einen Quelltext und kann
> viel besser optimieren, nämlich z.B. quelltext-übergreifend inlinen.

Ja, das ist die grundsätzliche Idee hinter der LTO und wird so auch in 
der Manpage ausgeführt ;).

Frank M. schrieb:
> Dazu muss der Linker(!) den Compiler nochmals
> aufrufen und ihm (dem Compiler!) das -Os als Optimierungsflag mitgeben.

Also mein finaler Aufruf zum Linken sieht so aus:
1
Building target: Wordclock.elf
2
Invoking: AVR C Linker
3
avr-gcc -Wl,-Map,Wordclock.map -Wl,-gc-sections -mmcu=atmega328p -o "Wordclock.elf"  ./src/base.o ./src/brightness.o ./src/color.o ./src/datetime.o ./src/dcf77.o ./src/display.o ./src/display_wc.o ./src/display_wc_eng.o ./src/display_wc_ger.o ./src/display_wc_ger3.o ./src/eeprom.o ./src/fifo.o ./src/i2c_master.o ./src/i2c_rtc.o ./src/ldr.o ./src/log.o ./src/main.o ./src/memcheck.o ./src/preferences_eeprom.o ./src/prng.o ./src/pwm.o ./src/shift.o ./src/timer.o ./src/uart.o ./src/uart_protocol.o ./src/user.o  ./lib/IRMP/irmp.o   
4
Finished building target: Wordclock.elf

Ich vermute (!), dass intern automatisch erkannt wird, in welcher Form 
die Objekte generiert worden sind.

Frank M. schrieb:
> Siehe dazu auch folgenden Thread, wo das Thema ausführlichst behandelt
> wird:
>
>    Beitrag ""Include-Libs" - Teufelswerk?"

So ausführlich wie es mir gerne gewünscht hätte, ist das aber gar nicht. 
Aber zumindest in deinem Fall scheint es ja Abhilfe geschafft zu haben. 
Leider konnte ich aber das Kommando des finalen Linkens nicht entdecken. 
Sicher, dass du das nicht auch über avr-gcc gemacht hast und damit das 
Kommando nicht doch an den Compiler bzw. das avr-gcc übergeben hast ;)? 
Wie bei mir oben schön zu sehen, ruft man i.d.R. ja nicht den Linker 
(avr-ld) selbst auf, sondern erledigt dies über avr-gcc, wo es 
entsprechend weitergeleitet wird.

Ich habe eben z.B. mal versucht -ffunction-sections bzw. -fdata-sections 
an avr-ld zu übergeben. Das wird mit einer Fehlermeldung quittiert:

> avr-ld: -f may not be used without -shared

All das lässt erhärtet meine zuvor in den Raum gestellte Vermutung nur. 
Ich will dich hier keineswegs als anfänglichen "Idioten" abtun, der 
nicht weiß wie die einzelnen Komponenten miteinander interagieren. Ganz 
im Gegenteil: Du bist schon "etwas" länger dabei und ein weitaus 
erfahrenerer Programmierer als ich es bin.

Ich versuche nur eine Erklärung für das Phänomen zu finden und stütze 
mich dabei auf die Aussagen aus der Manpage. Zumindest in meinem Kopf 
macht mein Erklärungsversuch auch Sinn, vielleicht liege ich aber auch 
voll daneben.

Es kann auch gut sein, dass hier verschiedene Compilerversionen 
unterschiedlich verhalten. Ich habe meine Experimente alle auf Basis von 
avr-gcc 4.9.1 und avr-binutils 2.24 durchgeführt. Du warst, wenn ich das 
jetzt richtig sehe bei 4.7.x als das Feature noch relativ neu war. 
Vielleicht wurden da im Hintergrund ja noch Umbauarbeiten durchgeführt. 
Ist mir jetzt zu mühselig den Changelog durchzugehen ;).

Frank M. schrieb:
> Ich kann nichts dafür, dass die Manpage nicht stimmt, s.o. ;-)

Ich kann mir fast nicht vorstellen, dass wir Unstimmigkeiten in der 
Manpage von gcc finden. Zumindest mir traue ich das nicht zu :).

Frank M. schrieb:
>> [irmp_protocol_names]...
>> Ja, und das wird ziemlich schnell ziemlich unleserlich, zumindest
>> besonders intuitiv ist es nicht.
>
> Das liegt daran, dass zum einen die Strings im Flash liegen:

Das war auch überhaupt keine Kritik, sondern nur eine Beobachtung von 
mir. Ich selbst mache es bei eigenen Projekten wie gesagt auch nicht 
anders. Ist halt einfach eine Konsequenz der Harvard-Architektur und der 
von uns verwendeten Werkzeuge (avr-gcc, avr-libc), die damit irgendwie 
zurecht kommen müssen.

Mit freundlichen Grüßen,
Karol Babioch

von Joachim B. (jar)


Lesenswert?

Karol Babioch schrieb:
> In irmp.c sollst du gar nicht herum werkeln. Das ist Franks Domäne ;).

da werkel ich auch nicht rum, einige Problemchen muss ich noch lösen,

aber durch das Gespräch mit euch beiden ist mir auf dem Heimweg 
wenigstens ein uralter Fehler aufgefallen der historisch gewachsen ist !

klar kann ich i2c in der IRQ nutzen, aber nicht gleichzeitig in der main 
loop, das ist erst später dazu gekommen, weswegen ich _i2c_busy (bei 
start_i2c) eingefügt hatte, was logisch nicht hilft wenn die in der main 
loop durch den IRQ unterbrochen wird.

Als ich die Arduino LIB wire.cpp untersuchte fand ich ähnliches, heisst 
hier nur transmission, nur die VAR transmission wird auch nie benutzt, 
habe jedenfalls nix gefunden

manchmal können andere zwar nicht sofort helfen, aber das Gespäch 
darüber.

danke dafür !

von Karol B. (johnpatcher)


Lesenswert?

Joachim B. schrieb:
> aber durch das Gespräch mit euch beiden ist mir auf dem Heimweg
> wenigstens ein uralter Fehler aufgefallen der historisch gewachsen ist !

So ist das, wenn man ab und an mal alles Revue passieren lässt. Ist mir 
auch schon des öfteren untergekommen. Von Zeit zu Zeit lernt bzw. sieht 
man auch immer mal wieder neue Programmiertechniken bzw. Muster, die man 
dann sofort bei sich selbst umsetzen kann.

Joachim B. schrieb:
> Als ich die Arduino LIB wire.cpp untersuchte fand ich ähnliches, heisst
> hier nur transmission, nur die VAR transmission wird auch nie benutzt,
> habe jedenfalls nix gefunden

Bin zwar kein absoluter Arduino Insider, aber immer, wenn ich mich damit 
beschäftigt habe, bin ich zu dem Schluss gekommen, dass vieles in Bezug 
auf das Interrupt-Handling ungünstig bzw. nicht gut gelöst ist. Die 
meisten Einsteiger wissen vermutlich noch nicht einmal etwas über 
interrupt-basierte Programmierung, jedenfalls lassen das die vielen 
Spaghetticode-artigen Schnipsel vermuten, welche sämtliche Ereignisse 
innerhalb von loop() verarbeiten.

Ich will das gar nicht zu einer Arduino Pro und Contro Diskussion werden 
lassen, sondern dich nur darauf aufmerksam machen, dass das 
Interrupt-Handling bei der Arduino Plattform nicht unbedingt das Maß 
aller Dinge ist, und du dich definitiv auch hier im Forum, Wiki und der 
Codesammlung umschauen solltest. Da findest du sicherlich mehr als genug 
Inspiration für die richtige Konzeption und Behandlung von Interrupts.

Mit freundlichen Grüßen,
Karol Babioch

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Hi Karol,

Karol Babioch schrieb:
> Die Sorge teile ich nicht. Alles außer avr-gcc 4.9.1 ist alt ;). Ich
> pflege allerdings auch keine Bibliothek wie IRMP ...

Eben. Wenn ich da nicht bis herunter zu 4.3.3 kompatibel bleibe, 
schreien hier gewiss einige auf. Ich hatte schon mal die flto-Geschichte 
ins AVR-Studio4-Projekt eingebaut (weil ich 4.7.2 benutze) und schon 
kamen Beschwerden, man könne nicht mehr kompilieren.

> Es geht mir weniger um die Schreibweise, sondern wie man dann den
> Zugriff auf Inhalte im Flash am Besten löst. Weiterhin mit jeweils zwei
> Funktionen (jeweils eine mit *_P())", oder ggf. nur noch eine mit einem
> zusätzliche Parameter in dessen Abhängigkeit man den Pointer
> entsprechend zurecht castet.

Ich benutze in diversen Projekten immer einen weiteren Parameter, stelle 
aber zusätzlich über Macros die _P-Funktionalität zur Verfügung, also 
zum Beispiel:
1
#define lcd_printyx_P(__line, __column, __text) lcd_printyx_s (__line, __column, (unsigned char *) PSTR(__text), TRUE)
2
#define lcd_printyx(__line, __column, __text)   lcd_printyx_s (__line, __column, (unsigned char *) __text, FALSE)

>> Es ist mir egal, was die Manpage dazu sagt. ;-)
>
> Mir aber nicht. Gerade bei Projekten wie gcc ist die Manpage eigentlich
> immer up to date und die Referenz.

Mein Smiley sollte andeuten, dass ich auch glaube, dass lediglich die 
Manpage für Dich nicht stimmt, weil Du die richtige Stelle noch nicht 
gefunden hast ;-)

Nein, Scherz. Ich glaube, wir missverstehen uns beide bzgl. 
"Linker-Aufruf". Für mich ist dieses hier schon ein Linker-Aufruf:

   gcc file1.o file2.o -o file.out

Es geht mir also immer um Flags, die an gcc (der ist weder Compiler noch 
Linker, sondern ruft ja bekanntermaßen die entsprechenden Programme auf) 
heruntergegeben werden.

Diverse Programmier-Umgebungen sehen das genauso. In AVRStudio4 zum 
Beispiel werden die "Linker-Options" an avr-gcc beim Linken 
heruntergegeben. Genauso läuft es auch in anderen IDEs.

> Das kann ich z.B. nicht nachvollziehen. Beim Kompilieren meiner Version
> des Wordclock Projekts gewinne ich NUR durch das Zuschalten der LTO
> beim Kompilieren (-flto beim Compiler) 1.5 kB. Die zusätzlichen Schalter
> (-Os, -flto, -ffunction-sections, -fdata-sections) beim Linken hingegen
> bringen keinen zusätzlichen Gewinn. Sogar -Wl,-gc-sections hat dann
> keine Auswirkungen mehr, obwohl es ohne die -flto Option etwas bringt.

IRMP-Standard-Projekt (wie im SVN abgelegt) nur mit -Os (und diversen 
anderen Standard-Optionen) als Compiler-Option:

Program:    2588 bytes (31.6% Full)
Data:         52 bytes (5.1% Full)

IRMP-Projekt zusätzlich mit Compiler-Optionen:

 -flto
 -ffunction-sections
 -fdata-sections

und mit Linker-Optionen:

 -flto
 -ffunction-sections
 -fdata-sections
 -Wl,--gc-sections
1
avr-gcc  -mmcu=atmega88 -Wall -gdwarf-2 -std=gnu99     -DF_CPU=8000000UL -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -flto  -ffunction-sections  -fdata-sections  -MD -MP -MT main.o -MF dep/main.o.d  -c  ../main.c
2
avr-gcc  -mmcu=atmega88 -Wall -gdwarf-2 -std=gnu99     -DF_CPU=8000000UL -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -flto  -ffunction-sections  -fdata-sections  -MD -MP -MT irmp.o -MF dep/irmp.o.d  -c  ../irmp.c
3
avr-gcc -mmcu=atmega88 -flto  -ffunction-sections  -fdata-sections  -Wl,--gc-sections  -Wl,-Map=irmp.map main.o irmp.o     -o irmp.elf
4
avr-objcopy -O ihex -R .eeprom -R .fuse -R .lock -R .signature  irmp.elf irmp.hex
5
avr-objcopy -j .eeprom --set-section-flags=.eeprom="alloc,load" --change-section-lma .eeprom=0 --no-change-warnings -O ihex irmp.elf irmp.eep || exit 0
6
avr-objdump -h -S irmp.elf > irmp.lss

Program:    3460 bytes (42.2% Full)
Data:         52 bytes (5.1% Full)

Das resultierende Programm wird also fast - wie vorausgesagt - 
wesentlich größer!

Woran liegt das? Ganz einfach: Der Compiler wird beim Linkvorgang 
nochmals aufgerufen. Wird hier kein Optimierungsflag angegeben, dann 
wird das Resultat einfach ganz schlecht.

Nun noch zusätzlich als Linker-Option -Os:
1
avr-gcc  -mmcu=atmega88 -Wall -gdwarf-2 -std=gnu99      -flto  -ffunction-sections  -fdata-sections   -DF_CPU=8000000UL -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -MD -MP -MT main.o -MF dep/main.o.d  -c  ../main.c
2
avr-gcc  -mmcu=atmega88 -Wall -gdwarf-2 -std=gnu99      -flto  -ffunction-sections  -fdata-sections   -DF_CPU=8000000UL -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -MD -MP -MT irmp.o -MF dep/irmp.o.d  -c  ../irmp.c
3
avr-gcc -mmcu=atmega88 -flto  -ffunction-sections  -fdata-sections  -Wl,--gc-sections  -Os  -Wl,-Map=irmp.map main.o irmp.o     -o irmp.elf
4
avr-objcopy -O ihex -R .eeprom -R .fuse -R .lock -R .signature  irmp.elf irmp.hex
5
avr-objcopy -j .eeprom --set-section-flags=.eeprom="alloc,load" --change-section-lma .eeprom=0 --no-change-warnings -O ihex irmp.elf irmp.eep || exit 0
6
avr-objdump -h -S irmp.elf > irmp.lss

Ergebnis:

Program:    2556 bytes (31.2% Full)
Data:         52 bytes (5.1% Full)

Das Programm ist also um 32 Byte kleiner geworden als die 
NICHT-FLTO-Version.

Woran liegt das? Es liegt genau daran, was ich vor ein paar Tagen 
beschrieben habe. Es können jede Menge PUSH/POP-Befehle vermieden 
werden, die vom Compiler eingebaut werden, wenn eine externe Funktion 
von einer ISR-aufgerufen wird.

Genau das ist der Übeltäter:
1
ISR(COMPA_VECT)
2
{
3
  (void) irmp_ISR();
4
}

Bei -flto wird irmp_ISR sozusagen inlined und die überzähligen 
PUSH/POP-Befehle können entfallen. Dadurch wird die ISR auch ein wenig 
schneller. Nichts anderes habe ich hier behauptet, als ich auf diese Art 
der Optimierung hier hinwies.

> Frank M. schrieb:
>> Erst mit dem Linker-Flag -Os funktioniert die flto-Optimierung, d.h. der
>> gcc behandelt externe Funktionen wie static Funktionen.
>
> Nein, das funktioniert bei mir auch ohne -flto beim Linken.

Siehe oben. Ich habe andere Erfahrungen gemacht und kann sie auch bei so 
ziemlich jedem Projekt mit Zahlen belegen. Irgendwas machst Du falsch. 
;-)

> Also mein finaler Aufruf zum Linken sieht so aus:
>
>
1
> Building target: Wordclock.elf
2
> Invoking: AVR C Linker
3
> avr-gcc -Wl,-Map,Wordclock.map -Wl,-gc-sections -mmcu=atmega328p -o 
4
> "Wordclock.elf"  ./src/base.o ./src/brightness.o ./src/color.o 
5
> ./src/datetime.o ./src/dcf77.o ./src/display.o ./src/display_wc.o 
6
> ./src/display_wc_eng.o ./src/display_wc_ger.o ./src/display_wc_ger3.o 
7
> ./src/eeprom.o ./src/fifo.o ./src/i2c_master.o ./src/i2c_rtc.o 
8
> ./src/ldr.o ./src/log.o ./src/main.o ./src/memcheck.o 
9
> ./src/preferences_eeprom.o ./src/prng.o ./src/pwm.o ./src/shift.o 
10
> ./src/timer.o ./src/uart.o ./src/uart_protocol.o ./src/user.o 
11
> ./lib/IRMP/irmp.o
12
> Finished building target: Wordclock.elf
13
>

Da fehlt ja schon das -flto. Baue das mit rein und Du wirst sehen, dass 
das Ergebnis größer als vorher wird. Im zweiten Schritt noch -Os und Du 
hast endlich den Gewinn.

> Ich vermute (!), dass intern automatisch erkannt wird, in welcher Form
> die Objekte generiert worden sind.

Ich nicht. Es fehlt das -flto beim obigen Aufruf. Erst danach können wir 
darüber nochmal reden ;-)

> So ausführlich wie es mir gerne gewünscht hätte, ist das aber gar nicht.

Für mich hat es zum Verständnis gereicht.

> Aber zumindest in deinem Fall scheint es ja Abhilfe geschafft zu haben.

Nicht nur in diesem Fall. Wie Du am IRMP-Projekt siehst, gibt es hier 
auch einen - wenn auch kleinen, aber nachvollziehbaren - Gewinn. Beim 
WordClock-Projekt sollte das noch Ergebnis wesentlich besser sein.

> Leider konnte ich aber das Kommando des finalen Linkens nicht entdecken.

Johann hat es in dem von mir angeführten Thread beschrieben, wie man 
sich die internen Programm-Aufrufe des gcc anschauen kann.

Zitat:

"Um die Aufrufe zu sehen, kann man z.B. -v -Wl,-v angeben."

> Sicher, dass du das nicht auch über avr-gcc gemacht hast und damit das
> Kommando nicht doch an den Compiler bzw. das avr-gcc übergeben hast ;)?

Ja, natürlich über avr-gcc, wer ruft denn schon den nativen Linker 
auf?!?

> Wie bei mir oben schön zu sehen, ruft man i.d.R. ja nicht den Linker
> (avr-ld) selbst auf, sondern erledigt dies über avr-gcc, wo es
> entsprechend weitergeleitet wird.

Ja. Schau es Dir mit obigen Optionen mal genauer an.

> Ich habe eben z.B. mal versucht -ffunction-sections bzw. -fdata-sections
> an avr-ld zu übergeben. Das wird mit einer Fehlermeldung quittiert:
>
>> avr-ld: -f may not be used without -shared
>
> All das lässt erhärtet meine zuvor in den Raum gestellte Vermutung nur.
> Ich will dich hier keineswegs als anfänglichen "Idioten" abtun, [...]

Wie gesagt: Wenn ich von "Linker-Optionen" spreche, meine ich die Flags, 
die dem avr-gcc beim Linken heruntergegeben werden. So macht es (fast) 
jede IDE der Welt, sogar "Microsoft Visual C++". Keiner ruft den nativen 
ld direkt auf.

So, ich hoffe, damit ist dieses Missverständnis eindeutig geklärt.

> Es kann auch gut sein, dass hier verschiedene Compilerversionen
> unterschiedlich verhalten. Ich habe meine Experimente alle auf Basis von
> avr-gcc 4.9.1 und avr-binutils 2.24 durchgeführt. Du warst, wenn ich das
> jetzt richtig sehe bei 4.7.x als das Feature noch relativ neu war.
> Vielleicht wurden da im Hintergrund ja noch Umbauarbeiten durchgeführt.
> Ist mir jetzt zu mühselig den Changelog durchzugehen ;).

Ich vermute eher, dass es bzgl. LTO keine grundlegenden Unterschiede 
zwischen 4.7.2 und 4.9.1 gibt. Gib das -flto zusammen mit dem -Os 
einfach auch beim Linken runter und Du wirst Dich freuen.

Übrigens: Die von mir zitierten sections-Optionen haben nicht direkt was 
mit -flto zu tun, sondern eliminieren nicht benutzte Funktionen aus 
externen C-Modulen. So kann man ein großes Objekt-File mit 
zig-Funktionen dazulinken, wovon ich vielleicht nur 2 Funktionen 
brauche. Die nicht benutzten 98 anderen Funktionen werden dann 
wegoptimiert - genau, das was ich mir damals als zweiten Vorteil 
gegenüber "Include-Libs" erhoffte.

Ich hoffe, damit ist die Sache nun umfassend geklärt. Ich bin jetzt nur 
noch gespannt auf Deine Zahlen bzgl. -flto -Os und WordClock-Projekt. 
:-)

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Joachim B. schrieb:
> die Arduino IDE macht mich wahnsinnig, wie schön ging das im AVR Studio4

Ich benutze teilweise auch Arduino-Boards, weil ich zu faul zum Löten 
bin. Das erste, was ich mache: Ich schmeiße den Arduino-Bootloader raus 
und programmiere den ATmega auf klassische Art und Weise. Also ohne 
Arduino-IDE.

> aber auf Platinen löten und immer wieder AVRisp mk2 (clone) progger
> kaufen fehlt das Geld und die Lust (Zeit).....

Du bekommst einen ISP-Programmer für 15 EUR, z.B. bei myAVR.de. Mit dem 
entsprechenden Arduino-Board (mit ISP-Stecker) klappt das dann schon.

von Joachim B. (jar)


Lesenswert?

Frank M. schrieb:
> Du bekommst einen ISP-Programmer für 15 EUR, z.B. bei myAVR.de.

ich hatte 2 billige China clones gekauft, die haben die gleiche 
Seriennummer und können nicht zusammen am PC genutzt werden, manchmal 
verweigern sie auch die Mitarbeit, mit dem echten AVR ISP Mk2clone und 
mit meinem USB im Stick design USB prog v2 von Sauter, aber den gibt es 
nicht mehr, ist mir das nie passiert . Ich hätte gerne mehr davon, aber 
der ist nun bei der 3ten Version so riesig.....

um mich mit den Eigenheiten der Bootloader zu beschäftigen fehlt mir 
noch das Wissen und die Zeit, mit jedem Schritt den ich vorwärts komme 
tun sich immer wieder neue Fragen auf und dann wechseln die Versionen 
was wieder neue Fragen aufwirft. Komme mir manchmal vor wie im 
Wettrennen zwischen Hase und Igel

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


Lesenswert?

Hallo Jörg,

Jörg R. schrieb:
> Logging für den STM32F10x:

Danke für den Port, ich habs ins SVN eincheckt als Version 2.6.6.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Ich habe die Download-Versionen von IRMP:

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

und IRSND:

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

vom Februar diesen Jahres nun auf denselben Stand gebracht, den man auch 
momentan im SVN vorfindet.

Das heisst: Die obigen Links enthalten nun folgende Versionen:

  IRMP V2.6.6 vom 18.09.2014

  IRSND V2.6.4 vom 15.09.2014

Zukünftig versuche ich, die Synchronisierungs-Intervalle kürzer zu 
halten.

Viele Grüße,

Frank

von Karol B. (johnpatcher)


Lesenswert?

Frank M. schrieb:
> Ich benutze in diversen Projekten immer einen weiteren Parameter, stelle
> aber zusätzlich über Macros die _P-Funktionalität zur Verfügung

Ok, das macht wahrscheinlich am meisten Sinn und ist ein guter 
Kompromiss aus "einmal implementieren" und der Gewohnheit der *_P() 
Funktionen. Nutzt du innerhalb der eigentlichen Funktionen dann schon 
das __flash Attribut?

Frank M. schrieb:
> Ich glaube, wir missverstehen uns beide bzgl.
> "Linker-Aufruf".

Ja, das erklärt wohl einiges ;). Gut, dass du mitdenkst, ich hab das 
vollständig ausgeblendet. Damit erklärt sich auch die Diskrepanz in der 
Auslegung der Manpage, da das meiste sich ja auf avr-gcc und nicht 
avr-ld bezieht und es die entsprechenden Optionen dort gibt.

Frank M. schrieb:
> Das resultierende Programm wird also fast - wie vorausgesagt -
> wesentlich größer!

Zumindest das kann ich aber hier nicht reproduzieren. Um es zu 
vereinfachen, beziehe ich mich im Folgenden auf Revision 148 aus dem 
IRMP Repository und builde das Ganze komplett manuell:
1
[johnpatcher@vpcs irmp]$ avr-gcc -mmcu=atmega88 -Wall -std=c99 -DF_CPU=8000000UL -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -flto -ffunction-sections -fdata-sections -c irmp/main.c
2
3
[johnpatcher@vpcs irmp]$ avr-gcc -mmcu=atmega88 -Wall -std=c99 -DF_CPU=8000000UL -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -flto -ffunction-sections -fdata-sections -c irmp/irmp.c
4
5
[johnpatcher@vpcs irmp]$ avr-gcc -mmcu=atmega88 -Wl,--gc-sections -Wl,-Map=main.map main.o irmp.o -o main.elf
6
7
[johnpatcher@vpcs irmp]$ avr-size main.elf 
8
   text     data      bss      dec      hex  filename
9
   2444        4       48     2496      9c0  main.elf

Ich habe also mit -flto kompiliert aber ohne -flto gelinkt.

Wenn ich dann nochmal mit allen von dir o.g. Optionen (samt -flto und 
-Os) linke:
1
[johnpatcher@vpcs irmp]$ avr-gcc -mmcu=atmega88 -Wl,--gc-sections -flto -ffunction-sections -fdata-sections -Os -Wl,-Map=main.map main.o irmp.o -o main.elf
2
3
[johnpatcher@vpcs irmp]$ avr-size main.elf 
4
   text     data      bss      dec      hex  filename
5
   2444        4       48     2496      9c0  main.elf

Also im Vergleich zu davor keine Verbesserung.

Hier nun das Resultat, wenn ich ohne -flto kompiliere und linke (andere 
übliche Optionen sind nach wie vor aktiviert).
1
[johnpatcher@vpcs irmp]$ avr-gcc -mmcu=atmega88 -Wall -std=c99 -DF_CPU=8000000UL -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -ffunction-sections -fdata-sections -c irmp/irmp.c
2
3
[johnpatcher@vpcs irmp]$ avr-gcc -mmcu=atmega88 -Wall -std=c99 -DF_CPU=8000000UL -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -ffunction-sections -fdata-sections -c irmp/main.c
4
5
[johnpatcher@vpcs irmp]$ avr-gcc -mmcu=atmega88 -Wall -std=c99 -DF_CPU=8000000UL -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -ffunction-sections -fdata-sections -c irmp/main.c
6
7
[johnpatcher@vpcs irmp]$ avr-gcc -mmcu=atmega88 -Wl,--gc-sections -ffunction-sections -fdata-sections -Wl,-Map=main.map main.o irmp.o -o main.elf
8
9
[johnpatcher@vpcs irmp]$ avr-size main.elf 
10
   text     data      bss      dec      hex  filename
11
   2484        4       48     2536      9e8  main.elf

Bei mir reicht also das reine Kompilieren mit der -flto Option, um Platz 
zu sparen. Beim Linken muss ich das nicht nochmal angeben.

Übrigens: Bei mir ist der Gewinn insgesamt 40 Byte groß. Außerdem sind 
meine Binaries kleiner. avr-gcc 4.9.x generiert anscheinend besseren 
Code ;).

Frank M. schrieb:
> Da fehlt ja schon das -flto. Baue das mit rein und Du wirst sehen, dass
> das Ergebnis größer als vorher wird. Im zweiten Schritt noch -Os und Du
> hast endlich den Gewinn.

Ok, da hatte ich wohl den falschen Ausschnitt kopiert. Aber wie auch 
schon beim IRMP Beispiel ändert sich an der Größe nichts, auch nicht mit 
diesen Optionen beim Linken:
1
Building target: Wordclock.elf
2
Invoking: AVR C Linker
3
avr-gcc -Wl,-Map,Wordclock.map -Wl,-gc-sections -Os -flto -mmcu=atmega328p -o "Wordclock.elf"  ./src/base.o ./src/brightness.o ./src/color.o ./src/datetime.o ./src/dcf77.o ./src/display.o ./src/display_wc.o ./src/display_wc_eng.o ./src/display_wc_ger.o ./src/display_wc_ger3.o ./src/eeprom.o ./src/fifo.o ./src/i2c_master.o ./src/i2c_rtc.o ./src/ldr.o ./src/log.o ./src/main.o ./src/memcheck.o ./src/preferences_eeprom.o ./src/prng.o ./src/pwm.o ./src/shift.o ./src/timer.o ./src/uart.o ./src/uart_protocol.o ./src/user.o  ./lib/IRMP/irmp.o   
4
Finished building target: Wordclock.elf

Fazit: Zumindest bei mir braucht es -flto nur beim Kompilieren. Dort 
bringt es auch einen enormen Größengewinn (wobei das natürlich von den 
Quellen und deren Abhängigkeiten untereinander abhängt).

Frank M. schrieb:
> Übrigens: Die von mir zitierten sections-Optionen haben nicht direkt was
> mit -flto zu tun, sondern eliminieren nicht benutzte Funktionen aus
> externen C-Modulen.

Ja. Diese Optionen werden ja auch im Wiki und an diversen anderen 
Stellen vorgeschlagen bzw. erklärt.

Frank M. schrieb:
> Ich hoffe, damit ist die Sache nun umfassend geklärt.

Zumindest teilweise. Reproduzieren kann ich den Größenzuwachs bzw. die 
Notwendigkeit die Optionen nochmals anzugeben nach wie vor nicht.

Frank M. schrieb:
> Ich bin jetzt nur
> noch gespannt auf Deine Zahlen bzgl. -flto -Os und WordClock-Projekt.
> :-)

Wie schon gesagt: Nur durch Zuschalten der -flto Option beim Kompilieren 
gewinne ich bereits 1500 kB. -Os bzw. -flto beim Linken hingegen bringen 
nichts mehr.

Mit freundlichen Grüßen,
Karol Babioch

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


Lesenswert?

Karol Babioch schrieb:
> Wie schon gesagt: Nur durch Zuschalten der -flto Option beim Kompilieren
> gewinne ich bereits 1500 kB.

1,5MB... Wow! :-)))

> -Os bzw. -flto beim Linken hingegen bringen nichts mehr.

Dann arbeitet 4.9.x doch anders als 4.7.x. Ich fand es damals schon 
unverständlich, beim Linken eine Compiler-Option angeben zu müssen. 
Vielleicht hat man dieses "Feature" ab 4.8.x oder 4.9.x doch besser 
gelöst.

Ich habe es gerade nochmal mit avr-gcc 4.8.1 getestet: Das Verhalten ist 
identisch zu 4.7.2. Das Ergebnis wird erheblich größer, wenn man -Os 
beim Linken weglässt. Das Programm ist zwar insgesamt ein wenig kleiner, 
aber ich benutzen den 4.8.1 nicht, weíl dieser den "misspelled signal 
handler" bug hat, der doch ziemlich nervt.

Vielen Dank für Deine ausführlichen Infos. Vielleicht gehen wir ja beide 
mit folgender Aussage konform:

  Bei Verwendung von LTO muss für avr-gcc kleiner als 4.9.x die Option
  -Os bei den Linker-Options zwingend angegeben werden, ab 4.9.x
  nicht mehr.

Ich glaube, ich sollte mir auch den 4.9.1 besorgen....

Viele Grüße,

Frank

EDIT: Habe gerade sogar den 4.9.2 gefunden :-)

: Bearbeitet durch Moderator
von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Gerade mit 4.9.2 getestet.

Programm normal: 2488
Programm mit -flto als Compiler- und Linker-Option: 3460
Programm mit -Os zusätzlich als Linker-Option: 2448

Also ich muss auch bei 4.9.2 das -Os angeben, damit ich 40 Byte 
gewinne.

Ausschlaggebend ist das Kommando:
1
avr-gcc -mmcu=atmega88 -flto  -Os  -Wl,-Map=irmp.map main.o irmp.o     -o irmp.elf

Wenn dort -Os fehlt, dann wird es 1KB größer.

EDIT:
Muss mich korrigieren (PATH war noch nicht angepasst): Es reicht nun 
tatsächlich ein -flto als Compiler-Option. Ergebnis ist dann 2448.

Also:

Programm normal: 2488
Programm mit -flto als zusätzliche Compiler-Option: 2448
Programm mit -Os zusätzlich als Linker-Option: 2448

Nun ist die Welt wieder in Ordnung :-)

P.S.
40 Byte sind nicht soviel, aber in einer ISR schon.

: Bearbeitet durch Moderator
von Karol B. (johnpatcher)


Angehängte Dateien:

Lesenswert?

Frank M. schrieb:
> 1,5MB... Wow! :-)))

Meinte natürlich 1,5 kB ;).

Frank M. schrieb:
> Bei Verwendung von LTO muss für avr-gcc kleiner als 4.9.x die Option
>   -Os bei den Linker-Options zwingend angegeben werden, ab 4.9.x
>   nicht mehr.

Ja, das scheint die Essenz unserer Experimente zu sein. Habe es mit 
älteren Versionen aber nicht probiert.

Frank M. schrieb:
> EDIT: Habe gerade sogar den 4.9.2 gefunden :-)

Diese Version gibt es offiziell noch gar nicht [1]. Wird laut [2] erst 
im Oktober oder November veröffentlicht. Wirst wahrscheinlich irgendein 
inoffiziellen Build haben - nehme ich an.

Bin aus Interesse heraus doch mal die Changelogs durchgegangen [3] [4] 
[5]. Da wurde zwar einiges an der LTO verändert bzw. verbessert, aber 
explizit erwähnt wird das neue Verhalten nicht.

Naja, was solls, letztendlich funktioniert es ja bei uns beiden - und 
verhält sich bei gleicher Version auch gleich. Allerdings frage ich mich 
gerade wo der Größenunterschied von 4 Byte herkommt? Meine Binary 
scheint in beiden Fällen 4 Byte kleiner zu sein?

Hab es jetzt nochmal kompiliert und gelinkt:
1
[johnpatcher@vpcs irmp]$ avr-gcc -mmcu=atmega88 -flto -Wall -std=c99 -DF_CPU=8000000UL -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -ffunction-sections -fdata-sections -c irmp/main.c
2
3
[johnpatcher@vpcs irmp]$ avr-gcc -mmcu=atmega88 -flto -Wall -std=c99 -DF_CPU=8000000UL -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -ffunction-sections -fdata-sections -c irmp/irmp.c
4
5
[johnpatcher@vpcs irmp]$ avr-gcc -mmcu=atmega88 -Wl,--gc-sections -Wl,-Map=main.map main.o irmp.o -o main.elf
6
7
[johnpatcher@vpcs irmp]$ avr-size main.elf 
8
   text     data      bss      dec      hex  filename
9
   2444        4       48     2496      9c0  main.elf

Du hast in diesem Fall ja 2448. Ich hänge mal meine resultierende Binary 
und das Mapfile mit an. Vielleicht kannst du ja gleiches tun bzw. dir 
mal die Unterschiede ansehen?

Im Übrigen: Danke für deine Geduld, bzw. dass du da überhaupt Interesse 
dran hast. Hat ja mittlerweile nur noch ganz peripher mit IRMP zu tun 
;).

Mit freundlichen Grüßen,
Karol Babioch

[1]: https://www.gnu.org/software/gcc/gcc-4.9/
[2]: https://gcc.gnu.org/ml/gcc/2014-07/msg00163.html
[3]: https://www.gnu.org/software/gcc/gcc-4.7/changes.html
[4]: https://www.gnu.org/software/gcc/gcc-4.8/changes.html
[5]: https://www.gnu.org/software/gcc/gcc-4.8/changes.html

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Ich habe das Ergebnis zur avr-gcc-Optimierung bzgl. LTO nun in 
IRMP-Artikel zusammengefasst:

  http://www.mikrocontroller.net/wikisoftware/index.php?title=IRMP&action=submit#avr-gcc-Optimierungen

Damit sollte das Thema LTO nun erschöpfend behandelt zu sein. Die 
Sections-Sache habe ich bewusst rausgenommen, das sie im Falle von IRMP 
keine tragende Rolle spielt.

Dank an Karol für die doch ziemlich spannende Mitarbeit.

@Karol: Antwort zu Deinem letzten Posting folgt gleich.

: Bearbeitet durch Moderator
von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Karol Babioch schrieb:
> Diese Version gibt es offiziell noch gar nicht [1]. Wird laut [2] erst
> im Oktober oder November veröffentlicht. Wirst wahrscheinlich irgendein
> inoffiziellen Build haben - nehme ich an.

Habe ich direkt von

   http://sourceforge.net/projects/mobilechessboar/files/avr-gcc%20snapshots%20%28Win32%29/

... also die Win32-Version.

> Bin aus Interesse heraus doch mal die Changelogs durchgegangen [3] [4]
> [5]. Da wurde zwar einiges an der LTO verändert bzw. verbessert, aber
> explizit erwähnt wird das neue Verhalten nicht.

Ja, ich habe auch nichts dazu gefunden. Es scheint so zu sein, dass die 
Compiler-Optionen nun mit in der Objekt-Datei gespeichert werden. Anders 
kann ich mir das nicht erklären.

> Meine Binary scheint in beiden Fällen 4 Byte kleiner zu sein?

Ja, ist mir auch aufgefallen :-)

> Hab es jetzt nochmal kompiliert und gelinkt:

Ich habe Deine Compiler-Optionen (z.B. c99 statt gnu99 und kein 
gdwarf-2) mal im AVR-Studio - soweit es ging - an Deine angepasst.

Ergebnis:
1
avr-gcc  -mmcu=atmega88 -Wall -flto -ffunction-sections -fdata-sections -std=c99 -DF_CPU=8000000UL -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums  -MD -MP -MT main.o -MF dep/main.o.d  -c  ../main.c
2
avr-gcc  -mmcu=atmega88 -Wall -flto -ffunction-sections -fdata-sections -std=c99 -DF_CPU=8000000UL -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums  -MD -MP -MT irmp.o -MF dep/irmp.o.d  -c  ../irmp.c
3
avr-gcc -mmcu=atmega88 -Os -Wl,-Map=irmp.map main.o irmp.o     -o irmp.elf
4
avr-objcopy -O ihex -R .eeprom -R .fuse -R .lock -R .signature  irmp.elf irmp.hex
5
avr-objcopy -j .eeprom --set-section-flags=.eeprom="alloc,load" --change-section-lma .eeprom=0 --no-change-warnings -O ihex irmp.elf irmp.eep || exit 0
6
avr-objdump -h -S irmp.elf > irmp.lss
7
8
AVR Memory Usage
9
----------------
10
Device: atmega88
11
12
Program:    2448 bytes (29.9% Full)
13
(.text + .data + .bootloader)
14
15
Data:         52 bytes (5.1% Full)
16
(.data + .bss + .noinit)
17
18
Build succeeded with 0 Warnings...

Es bleibt bei einer Differenz von 4 Bytes. Kann aber auch daran liegen, 
dass ich jetzt mit 4.9.2 und Du mit 4.9.1 getestet hast.

> Du hast in diesem Fall ja 2448. Ich hänge mal meine resultierende Binary
> und das Mapfile mit an. Vielleicht kannst du ja gleiches tun bzw. dir
> mal die Unterschiede ansehen?

Habe ich gemacht. Es ist aber schwierig, weil unter Windows die ganzen 
Pfade anders sind und ein diff viel zu groß ist.

Ich habe es dann eingeschränkt unter Linux mittels:
1
diff -b main.map ../irmp.map | grep -iv c: | grep -v /usr/ |less

Bleiben immer noch 325 Unterschiede, die aber hauptsächlich an der 
unterschiedlichen Ausgeformatierung liegt, z.B.
1
< .bss            0x0000000000800104       0x30
2
<                 0x0000000000800104                PROVIDE (__bss_start, .)
3
---
4
> .bss            0x00800104       0x30
5
>                 0x00800104                PROVIDE (__bss_start, .)

Ich bin da mal mit dem bloßen Auge drüber gegangen und habe eigentlich 
keinen signifikanten Unterschied feststellen können. Da ich auch nicht 
weiß, ob die 4 Bytes wegen 4.9.2 vs. 4.9.1 entstanden sind, will ich da 
auch gar nicht weiter suchen :-)

ELF-Dateien (als Binaries) sind schwer bis gar nicht zu vergleichen, 
allein der Größen-Unterschied ist enorm:
1
$ ls -l *.elf ../*.elf
2
-rw-r--r-- 1 root root  10940 2014-09-18 18:01 ../irmp.elf
3
-rwxr-xr-x 1 fm   users  9764 2014-09-18 17:06 main.elf

Meine ist über 1KB größer. Warum... weiß der Teufel.

Ich habe sie dann mal mit avr-strip um die Symbols erleichtert. Dann 
bleiben nur noch 2912 Bytes übrig.

Ich glaube, wir vergessen mal ganz schnell die 4 Bytes ;-)

> Im Übrigen: Danke für deine Geduld, bzw. dass du da überhaupt Interesse
> dran hast. Hat ja mittlerweile nur noch ganz peripher mit IRMP zu tun
> ;).

Ich bedanke mich ebenfalls. Hat Spaß gemacht! Und es ist immer wieder 
befriedigend, wenn man die Phänomene schlussendlich doch erklären kann.

EDIT:

Mir ist gerade aufgefallen, dass ich beim letzten Test doch wieder -Os 
als Linker-Flag drin hatte - siehe obiges Protokoll. Habs nun 
rausgenommen. Size erhöht sich auf 3460 Bytes :-(

PATH ist korrekt gesetzt. Es wird definitiv die 4.9.2 benutzt.

Vielleicht ist das ein prinzipielles Problem bei der Windows-Version?

Ich habe jedenfalls den Artikel-Abschnitt zur avr-gcc-Optimierung 
nochmal angepasst. Jetzt unterscheide ich nicht mehr zwischen 4.7.x und 
4.9.x, sondern zwischen Windows und Linux, was avr-gcc angeht.

: Bearbeitet durch Moderator
von Karol B. (johnpatcher)


Lesenswert?

Frank M. schrieb:
> Ich habe sie dann mal mit avr-strip um die Symbols erleichtert. Dann
> bleiben nur noch 2912 Bytes übrig.
>
> Ich glaube, wir vergessen mal ganz schnell die 4 Bytes ;-)

Ich glaube ich habe zumindest dieses Rätsel gelöst: Wir verwenden 
einfach unterschiedliche Versionen bzw. Darstellungsformen von avr-size 
;). Bei mir muss man die Programm und Datensektion zusammenzählen, dann 
kommt man auch auf 2448. Dafür ist meine bss Sektion nur 48 Byte groß, 
während deine Datensektion 52 Byte groß ist, weil bss bei dir dort 
gezählt wird. Letzendlich wahrscheinlich also doch der gleiche Inhalt.

Frank M. schrieb:
> Und es ist immer wieder
> befriedigend, wenn man die Phänomene schlussendlich doch erklären kann.

Ja, und in dem Fall hatten wir ja beide irgendwie recht bzw. unrecht ;). 
Nur ganz gelöst ist es ja immer noch nicht :'(. Ich bin nochmal die 
Manpage durchgegangen. Dort gibt es den folgenden Abschnitt:

> To use the link-time optimizer, -flto and optimization options should
> be specified at compile time and during the final link. For example:
>
>    gcc -c -O2 -flto foo.c
>    gcc -c -O2 -flto bar.c
>    gcc -o myprog -flto -O2 foo.o bar.o

Das scheint dir ja recht zu geben. Hier wird zwar nicht auf Codegröße 
hin optimiert, aber der Satz darüber sagt ja, dass man 
Optimierungsoptionen auch beim Linken angeben soll.

Die Frage ist also, warum es bei mir auch ohne funktioniert ;). Ich kann 
ja nicht nur das "-Os" sondern auch das "-flto" beim Linken weglassen. 
Du hingegen kannst das -flto weglassen, dafür das "-Os" aber nicht.

Wenn ich dein Protokoll oben richtig interpretiere, dann hast du zwar 
mit -Os gelinkt, aber ohne "-Wl,--gc-sections". Ich hingegen habe ohne 
"-Os" gelinkt, dafür aber mit "-Wl,--gc-sections". Kannst du das einfach 
mal anders herum ausprobieren? Ich habe es zwar bei mir probiert, aber 
es ist und bleibt bei 2444 bzw. 2448 Byte.

Frank M. schrieb:
> Vielleicht ist das ein prinzipielles Problem bei der Windows-Version?

Kann natürlich sein, wobei ich solche Unterschiede dann durchaus als Bug 
bezeichnen würde. Rein von der Manpage her ist dein Aufruf aber korrekt. 
Keine Ahnung warum ich das beim ersten Lesen übersehen habe. Das hätte 
uns ja die ganze Diskussion erspart. Andererseits hätten wir dieses 
unterschiedliche Verhalten nicht entdeckt ;). Ich wollte mich ja 
eigentlich an die avr-gcc ML wenden, aber die lachen uns wahrscheinlich 
aus, wenn wir a.) verschiedene Versionen benutzen und b.) (leicht) 
verschiedene Optionen beim Kompilieren bzw. Linken. Wir müssten also 
zunächst einmal wirklich exakt das selbe ausführen. Bei dir sind ja 
diverse Makefile und Depedency Optionen mit von der Partie, vielleicht 
interagieren die ja ungünstig (unwarscheinlich?). Ist auch egal, ich 
gebe mich geschlagen ;). Habe den Wiki-Artikel auch etwas angepasst, 
weil die Unterscheidung nicht notwendig ist - zumindest laut Manpage. 
Sich darauf zu verlassen, dass es auch ohne geht, wäre ja dann 
undokumentiertes Verhalten. Das kann man wohl niemandem empfehlen ;).

Danke trotzdem für die viele Geduld bzw. das Interesse.

Mit freundlichen Grüßen,
Karol Babioch

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


Lesenswert?

Hi Karol,

Karol Babioch schrieb:
> ;). Bei mir muss man die Programm und Datensektion zusammenzählen, dann
> kommt man auch auf 2448. Dafür ist meine bss Sektion nur 48 Byte groß,
> während deine Datensektion 52 Byte groß ist, weil bss bei dir dort
> gezählt wird. Letzendlich wahrscheinlich also doch der gleiche Inhalt.

Gut beobachtet. Ja, wahrscheinlich liegts am avr-size.

>> To use the link-time optimizer, -flto and optimization options should
>> be specified at compile time and during the final link.

Aha :-)

> Das scheint dir ja recht zu geben. Hier wird zwar nicht auf Codegröße
> hin optimiert, aber der Satz darüber sagt ja, dass man
> Optimierungsoptionen auch beim Linken angeben soll.

Ja, eben. Ich hab mir das ja nicht aus den Fingern gesaugt ;-)

> Die Frage ist also, warum es bei mir auch ohne funktioniert ;). Ich kann
> ja nicht nur das "-Os" sondern auch das "-flto" beim Linken weglassen.
> Du hingegen kannst das -flto weglassen, dafür das "-Os" aber nicht.

Wenn ich das -flto beim Linken weglasse, ist der LTO-Effekt komplett 
weg.

> Wenn ich dein Protokoll oben richtig interpretiere, dann hast du zwar
> mit -Os gelinkt, aber ohne "-Wl,--gc-sections". Ich hingegen habe ohne
> "-Os" gelinkt, dafür aber mit "-Wl,--gc-sections". Kannst du das einfach
> mal anders herum ausprobieren? Ich habe es zwar bei mir probiert, aber
> es ist und bleibt bei 2444 bzw. 2448 Byte.

Habe ich eben anders herum probiert. Die section-Options haben keinerlei 
Auswirkungen. Sie betreffen tatsächlich nur unbenutzte Funktionen, die 
es bei IRMP allerdings nicht gibt.

> Kann natürlich sein, wobei ich solche Unterschiede dann durchaus als Bug
> bezeichnen würde.

Ja.

> Ich wollte mich ja
> eigentlich an die avr-gcc ML wenden, aber die lachen uns wahrscheinlich
> aus, wenn wir a.) verschiedene Versionen benutzen und b.) (leicht)
> verschiedene Optionen beim Kompilieren bzw. Linken.

Ja, leider. Vielleicht werde ich mir am Wochenende mal die Linux-Version 
installieren.

> Habe den Wiki-Artikel auch etwas angepasst,

Danke dafür!

Gruß,

Frank

von Jörg R. (jrie)


Lesenswert?

Hallo Frank,
danke für das Aufnehmen meiner Patche.
In irmp.c ist dir das #else verrutscht, ca. Zeile 743, da fehlt ein 
Zeilenumbruch, bzw. er müßte vor statt hinter dem #else sein :-) .
Gruß, Jörg

von Karol B. (johnpatcher)


Lesenswert?

Frank M. schrieb:
> Sie betreffen tatsächlich nur unbenutzte Funktionen, die
> es bei IRMP allerdings nicht gibt.

Gut, so genau kenne ich die IRMP Quellen nicht. Ist mir nur beim 
Vergleich der Argumente aufgefallen.

Frank M. schrieb:
> Ja, leider. Vielleicht werde ich mir am Wochenende mal die Linux-Version
> installieren.

Habe mir auch schon überlegt, dass ich auf Version 4.7.x downgrade. 
Erschien mir dann aber aufgrund der Abhängigkeiten zu anderen 
Bibliotheken als zu viel Aufwand. Wäre zwar ein interessanter Vergleich, 
aber eilt alles nicht. Werde mich ggf. vielleicht wirklich einfach mal 
an die avr-gcc Mailing-Liste wenden.

Mit freundlichen Grüßen,
Karol Babioch

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Hallo Jörg,

Jörg R. schrieb:
> In irmp.c ist dir das #else verrutscht, ca. Zeile 743, da fehlt ein
> Zeilenumbruch, bzw. er müßte vor statt hinter dem #else sein :-) .

Danke, habe es korrigiert, neu eingecheckt und auch eine neue 
Download-Zip-Datei erstellt. So einen blöden Fehler wollte ich nicht in 
der Download-Datei belassen.

Obwohl.... den avr-gcc hat es nicht gestört, dass da vor dem #if in 
derselben Zeile noch C-Code war. Naja, schön ist es so oder so nicht.

Gruß,

Frank

von E. K. (eku)


Lesenswert?

Hallo Frank,

der Speicherbedarf für irmp_protocol_names lässt sich noch optimieren,
wenn man für jedes nicht aktivierte Protokoll einen Verweis auf 
proto_unknown in die Tabelle einfügt und den eigentlichen Protokollnamen 
spart. Ungefär so:
1
#if IRMP_SUPPORT_NEC_PROTOCOL == 1
2
static const char proto_nec[]           PROGMEM = "NEC";
3
#endif
4
5
....
6
7
const char * const
8
irmp_protocol_names[IRMP_N_PROTOCOLS + 1] PROGMEM =
9
{
10
    proto_unknown,
11
    proto_sircs,
12
#if IRMP_SUPPORT_NEC_PROTOCOL == 1
13
    proto_nec
14
#else
15
    proto_unknown
16
#endif
17
....

: Bearbeitet durch User
von E. K. (eku)


Lesenswert?

Hallo Frank,

ich habe hier folgenden Aufbau

AVR+IRSND --> AVR+IRMP

Auf beiden AVRs ist ausschließlich das SIEMENS-Protokoll einkompiliert.
Ich sende IR-Codes, die ich mal von einer SIEMENS-FB dekodiert habe. Der 
Empfänger erkennt den Gerätecode nur manchmal richtig, meist jedoch 
falsch. Auch wird teilweise RUWIDO erkannt.

Ich weiß, dass SIEMENS und RUWIDO ähnlich sind und viel Code teilen. 
Wenn ich aber nur SIEMENS einkompiliert habe, sollte bitte niemals 
RUWIDO erkannt werden.

Auch schleicht mich das Gefühl, dass die Erkennung von SIEMENS schon mal 
besser war, so ungefähr bis rev 116/120.

Die Linux-Kommandozeilenversion dekodiert 
IR-Data/Siemens-Gigaset-M740AV-15kHz.txt nach wie vor fehlerfrei. Aber 
was nützt das, wenn es auf einem AVR nicht zuverlässig funktioniert.

Was können wir tun?

von Bruno M. (brumay)


Angehängte Dateien:

Lesenswert?

Hallo Frank,

ich teste z.Zt. die Callback-Funktion und das funktioniert auch so weit 
(siehe Anlage). Was mir dabei allerdings auffällt ist, daß Du mit high 
startest. Ein normales Protokoll startet aber doch immer mit dem 
Übergang von low auf high. Kann ich daraus schließen, daß Deine Ausgabe 
mit diesem Übergang startet und das low daher unmittelbar davor liegt? 
Dann frage ich mich allerdings warum der Pin immer auf high steht, wenn 
man kein Signal sendet.

Gruß Bruno

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

E. K. schrieb:
> Auf beiden AVRs ist ausschließlich das SIEMENS-Protokoll einkompiliert.
> Ich sende IR-Codes, die ich mal von einer SIEMENS-FB dekodiert habe. Der
> Empfänger erkennt den Gerätecode nur manchmal richtig, meist jedoch
> falsch. Auch wird teilweise RUWIDO erkannt.

Kannst Du mir ein paar Scans schicken?

Gruß,

Frank

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Bruno M. schrieb:
> ich teste z.Zt. die Callback-Funktion und das funktioniert auch so weit
> (siehe Anlage). Was mir dabei allerdings auffällt ist, daß Du mit high
> startest.

Was meinst Du damit? Dass die Callback-Funktion bei der ersten fallenden 
Flanke nicht aufgerufen wird?

> Ein normales Protokoll startet aber doch immer mit dem
> Übergang von low auf high.

Nein, der TSOP-Emüfänger ist High im Ruhezustand. Das Start-Bit beginnt 
mit einer fallenden Flanke, also mit einem Übergang von High auf Low.

Gruß,

Frank

von Bruno M. (brumay)


Lesenswert?

Frank M. schrieb:

> Nein, der TSOP-Emüfänger ist High im Ruhezustand. Das Start-Bit beginnt
> mit einer fallenden Flanke, also mit einem Übergang von High auf Low.

Danke, wieder etwas gelernt!

Gruß Bruno

von Bruno M. (brumay)


Angehängte Dateien:

Lesenswert?

Hallo Frank,

auf Grund Deines Hinweises habe ich erst mal das Datenblatt des 
Empfängers studiert und bestätigt bekommen, daß der Empfänger alle Bits 
invertiert. Ich habe daher meine Anzeige ebenfalls invertiert um das 
richtige Protokoll zu sehen. Daraus ergeben sich aber jetzt eine Reihe 
anderer Fragen.

Ich fange mal mit dem NEC-Protokoll an.

UART Anzeige:
protocol: 0x02 = NEC   address: 0xEB14   command: 0x0012   flags: 0x00

Bei der Callback-Ausgabe ist so weit alles richtig, mit 2 Ausnahmen.
- die Adresse wird mit 0x14 angezeigt, statt der 0xEB14.

- im Signal wird der Unterschied von 0 und 1 nicht durch die Pausenlänge 
definiert, sondern durch die Pulslänge.

Wie erklärt sich das?

Gruß Bruno

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Hallo Bruno,

Bruno M. schrieb:
> auf Grund Deines Hinweises habe ich erst mal das Datenblatt des
> Empfängers studiert und bestätigt bekommen, daß der Empfänger alle Bits
> invertiert.

Freut mich :-)

> Ich habe daher meine Anzeige ebenfalls invertiert um das
> richtige Protokoll zu sehen.

Ich sehe bei Dir im Bild als Start-Bit:

________________-------
   Low            High

Wenn Du mit

  "Anzeige ebenfalls invertiert um das richtige Protokoll zu sehen"

meinst, dass es 1:1 den TSOP-Pegel zeigen soll: Ja, das ist genau das, 
was vom TSOP kommt. Low = Puls, High = Pause.

> UART Anzeige:
> protocol: 0x02 = NEC   address: 0xEB14   command: 0x0012   flags: 0x00

Zur Adresse: Im Standard-NEC-Protokoll hat die Adresse nur 8 Bit. Danach 
folgen dieselben 8 Bit aus Redundanzgründen nochmal - jedoch invertiert. 
Im Extended-Protokoll wird die Adresse auf 16 Bit aufgezogen und die 
Wiederholung als invertierte Bits entfällt.

IRMP interpretiert die Bits immer im NEC-Extended-Format - also mit 16 
Bit als Adresse. Denn dann ist das NEC-Standard-Format nur noch ein 
Spezialfall des Extended Formats und IRMP kann alle möglichen 
NEC-Adressen - egal, ob Standard oder Extended - eindeutig abbilden.

Jetzt schreiben wir mal 0xEB14 mal als Bits:

1110 1011 0001 0100
--------- ---------
    EB       14

Fällt Dir was auf? Die zweite 8er Gruppe enthält genau die zur ersten 
Gruppe enthaltenen Bits mit invertiertem Inhalt. Es handelt sich also um 
NEC-Standard-Format. Die Adresse wäre dann 0x14.

Aber wie ich eben schon sagte: IRMP speichert die Adresse immer im 
Extended-Format, um eben NEC-Signale, welche im Extended-Format gesandt 
werden, auch eindeutig abbilden zu können.

Also ist die Adresse 0xEB14. Jetzt schreiben wir mal die Adress-Bits in 
umgekehrter Reihenfolge hin:

0010 1000 1101 0111

Grund: Da bei NEC das Least Significant Bit (LSB) als erstes ausgesandt 
wird, müssen wir das hier umdrehen. Jetzt schau mal auf Dein Foto. Exakt 
diese Bitfolge findest Du dort wieder.

Das Kommando beim NEC-Protokoll besteht immer nur aus 8 Bit, gefolgt von 
invertierten 8 Bit. Hier gibt es kein "extended" Format.

0x12 = 0001 0010

Rückwärts geschrieben:

0100 1000

Genau diese Folge siehst Du auch im Bild als drittes Oktett.

Als letztes kommen dann noch die 8 invertierten Bits: 1011 0111

Passt alles haargenau.

> - die Adresse wird mit 0x14 angezeigt, statt der 0xEB14.

Erklärung siehe oben. 0x14 ist die Standard-Adresse, 0xEB14 ist die 
Extended-Adresse.

> - im Signal wird der Unterschied von 0 und 1 nicht durch die Pausenlänge
> definiert, sondern durch die Pulslänge.

Da Du im Bild die TSOP-Pegel 1:1 zeigst, gilt:

Low  = Puls
High = Pause

Die Pulse sind im Bild immer gleich lang, die Pausen sind verschieden. 
Daher kann ich Deine Folgerung nicht nachvollziehen.

Gruß,

Frank

: Bearbeitet durch Moderator
von Bruno M. (brumay)


Lesenswert?

Hallo Frank,

eigentlich wollte ich nicht das TSOP Signal darstellen, sondern das 
Protokoll.
Ich hatte aus Deinen ersten Antworten geschlossen, daß von Callback das 
TSOP Signal abgebildet wird. Das war aber anscheinend ein Trugschluß.

Meine erste Frage war ja:

> Was mir dabei allerdings auffällt ist, daß Du mit high
> startest. Ein normales Protokoll startet aber doch immer mit dem
> Übergang von low auf high. Kann ich daraus schließen, daß Deine Ausgabe
> mit diesem Übergang startet und das low daher unmittelbar davor liegt?
> Dann frage ich mich allerdings warum der Pin immer auf high steht, wenn
> man kein Signal sendet.

Ich muß also jetzt davon ausgehen, daß meine Vermutung richtig war und 
die Callback-Funktion mit dem ersten high startet. Das macht natürlich 
auch Sinn, da man ja einen Auslöser für die Funktion braucht und das ist 
dann der erste low-high Übergang. Die Frage warum der Pin immer auf high 
steht, ist dann aber noch nicht beantwortet.

Deine Erklärung zu NEC und extended NEC leuchtet ein.

Gruß Bruno

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Bruno M. schrieb:
> eigentlich wollte ich nicht das TSOP Signal darstellen, sondern das
> Protokoll.

Wo ist der Unterschied? Ein TSOP filtert die Modulationsfrequenz bereits 
und gibt Low für einen modulierten Puls und High für eine Pause aus.

> Ich hatte aus Deinen ersten Antworten geschlossen, daß von Callback das
> TSOP Signal abgebildet wird. Das war aber anscheinend ein Trugschluß.

Auszug aus irmp.c:
1
#if IRMP_USE_CALLBACK == 1
2
    if (irmp_callback_ptr)
3
    {
4
        static uint8_t last_inverted_input;
5
6
        if (last_inverted_input != !irmp_input)
7
        {
8
            (*irmp_callback_ptr) (! irmp_input);
9
            last_inverted_input = !irmp_input;
10
        }
11
    }
12
#endif // IRMP_USE_CALLBACK == 1

Die Callback-Funktion wird daher immer dann aufgerufen, wenn sich der 
Pegel zum letzten Zeitpunkt ändert, also beim Wechsel High-->Low und 
Low-->High. Als Argument wird der augenblickliche Pegel am TSOP 
übergeben.

Also eigentlich kannst Du auch direkt den Pegel am TSOP darstellen statt 
über eine Callback-Funktion den Pegel wieder auszugeben, um diesen dann 
anzuzapfen. Dieser hinkt dem TSOP-Pegel nur minimal nach.

> Ich muß also jetzt davon ausgehen, daß meine Vermutung richtig war und
> die Callback-Funktion mit dem ersten high startet.

Immer, wenn der Pegel wechselt. Da eine static-Variable wie 
last_inverted_input automatisch vom Compiler mit 0 initialisiert wird 
und der Ruhezustand des TSOP High ist, wird die Bedingung

     last_inverted_input != !irmp_input

erst TRUE, wenn irmp_input nach 0 springt, denn dann ist:

     0 != !0
-->  0 != 1

Also bleibe ich dabei: Die Callback-Funktion wird beim ersten Mal 
aufgerufen, nachdem der Pegel auf Low gesprungen ist, also wenn Du einen 
Knopf an der FB drückst.

> Das macht natürlich
> auch Sinn, da man ja einen Auslöser für die Funktion braucht und das ist
> dann der erste low-high Übergang.

Nein, jeder Wechsel des Pegels ruft die Callback-Funktion auf. Wie 
auch im IRMP-Artikel erwähnt, dient die Callback-Funktion lediglich 
Visualisierungszwecken - z.B. zur Ausgabe mittels LED. Sie ist optional, 
also für IRMP absolut nicht lebensnotwendig.

> Die Frage warum der Pin immer auf high
> steht, ist dann aber noch nicht beantwortet.

Welcher Pin ist immer auf High? Ich verstehe leider nicht, was Du 
meinst.

Gruß,

Frank

: Bearbeitet durch Moderator
von Bruno M. (brumay)


Lesenswert?

Frank M. schrieb:

> Wo ist der Unterschied? Ein TSOP filtert die Modulationsfrequenz bereits
> und gibt Low für einen modulierten Puls und High für eine Pause aus.

Ich glaube wir reden etwas aneinander vorbei! Natürlich macht es keinen 
Unterschied ob ich das TSOP nehme oder das Protokoll. Für mich ist es 
nur eine Frage der Darstellung. Protokolle werden immer mit Licht an = 
high und Licht aus = low dargestellt. Und genau so wollte ich es auf 
meinem LCD darstellen. TSOP ist dagegen invertiert.

>> Das macht natürlich
>> auch Sinn, da man ja einen Auslöser für die Funktion braucht und das ist
>> dann der erste low-high Übergang.
>
> Nein, jeder Wechsel des Pegels ruft die Callback-Funktion auf.

Auch damit hast Du natürlich recht. Wenn ich das aber optisch darstellen 
will, dann muß ich warten bis die Fernsteuerung betätigt wird (also ein 
Übergang stattfindet), der dann wiederum Auslöser für die Anzeige ist.

> Welcher Pin ist immer auf High? Ich verstehe leider nicht, was Du
> meinst.

Der Pin mit dem Callback ausgegeben wird steht in Ruheposition immer auf 
high. Inzwischen habe ich aber den Verursacher unseres 
Mißverständnissses gefunden! Der Fehler lag in der Ansteuerung meines 
LCDs. Ich habe ein low-Signal immer als high ausgegeben und umgekehrt.
Sorry für die Verwirrung;-)

Gruß Bruno

von Karol B. (johnpatcher)


Lesenswert?

Aus Interesse heraus traue ich mich jetzt einfach mal zu fragen: Wozu 
will man den Signalverlauf auf einem LCD-Display anzeigen? Klar, fürs 
Debugging bzw. zu Lehrzwecken mag das Sinn machen (wobei Oszilloskop 
bzw. Logic-Anaylzer wahrscheinlich nützlicher sind), aber gibt es auch 
eine praktische Anwendung hierfür?

Mit freundlichen Grüßen,
Karol Babioch

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Bruno M. schrieb:
> Protokolle werden immer mit Licht an = high und Licht aus = low
> dargestellt.

Naja, ich habe schon beides im Netz gesehen.

Gerade in der Elektronik wird oft Low = Aktiv, High = Inaktiv verwendet, 
z.B. bei /CS, /OE, /STROBE und anderen Steuersignalen. Das gleiche gilt 
auch für Ausgänge, z.B. bei Open Collector.

> Inzwischen habe ich aber den Verursacher unseres
> Mißverständnissses gefunden! Der Fehler lag in der Ansteuerung meines
> LCDs. Ich habe ein low-Signal immer als high ausgegeben und umgekehrt.

Gut, dann ist ja jetzt alles klar. :-)

von Bruno M. (brumay)


Angehängte Dateien:

Lesenswert?

Karol Babioch schrieb:
> Aus Interesse heraus traue ich mich jetzt einfach mal zu fragen:
> Wozu
> will man den Signalverlauf auf einem LCD-Display anzeigen? Klar, fürs
> Debugging bzw. zu Lehrzwecken mag das Sinn machen (wobei Oszilloskop
> bzw. Logic-Anaylzer wahrscheinlich nützlicher sind), aber gibt es auch
> eine praktische Anwendung hierfür?

Warum steigen manche Leute auf einen Berg;-)
Einfach aus Interesse und weil ichs kann. Oszi bzw. LA würde ich 
wahrscheinlich nutzen, wenn ich ein Speichergerät hätte.

Frank M. schrieb:
> Gut, dann ist ja jetzt alles klar. :-)

Ich habe mir jetzt 4 Protokolle angesehen und damit ist es auch gut. 
Allerdings sind dabei noch 2 Fragen aufgetaucht.

KASEIKYO: Der Herstellercode paßt, aber das Kommando wird mit 0x90A0 = 
0b1001000010100000 angezeigt. Das kann ich nicht nachvollziehen.

RC5: Herstellercode paßt, aber das Kommando wird mit 0x57 = 0b1010111 
angezeigt. Das wären ja schon 7 Bits!

Gruß Bruno

von Joachim B. (jar)


Lesenswert?

Bruno M. schrieb:
> KASEIKYO: Der Herstellercode paßt, aber das Kommando wird mit 0x90A0 =
> 0b1001000010100000 angezeigt. Das kann ich nicht nachvollziehen.
>
> RC5: Herstellercode paßt, aber das Kommando wird mit 0x57 = 0b1010111
> angezeigt. Das wären ja schon 7 Bits!

ja das war doch irgendwie der Trick vom Frank, er meinte mal das 
Kaseikyo hat 48 Bit, wie er das in 16 Bit gequetscht hat interessiert 
mich auch noch mal....

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Bruno M. schrieb:
> KASEIKYO: Der Herstellercode paßt, aber das Kommando wird mit 0x90A0 =
> 0b1001000010100000 angezeigt. Das kann ich nicht nachvollziehen.

Die Daten des Frames:

16 Hersteller-Bits + 4 Parity-Bits + 4 Genre1-Bits + 4 Genre2-Bits + 10 
Kommando-Bits + 2 ID-Bits + 8 Parity-Bits

Die 16 Hersteller-Bits werden in der Adresse gespeichert.

IRMP prüft zwar die Parity-Bits auf Validität, aber speichert sie nicht 
im Kommando. Grund: sie sind überflüssig, selbst IRSND kann sie fürs 
Senden wieder aus den IRMP-Daten reproduzieren.

Dann bleiben übrig:

4 Genre1-Bits + 4 Genre2-Bits + 10 Kommando-Bits + 2 ID-Bits

Wenn man das zusammenzählt, kommt man auf 20 Bit. Wir haben aber nur 16 
Bit Platz in irmp_data.command.

IRMP benutzt hier einen Kunstgriff: Da die 4 Genre2-Bits meist 0 sind, 
werden diese im oberen Nibble von irmp_data.flags gespeichert. Du musst 
also eigentlich die oberen 4 Bit von flags bei Vergleichen etc. mit 
berücksichtigen. Aber das ist in der Praxis kaum relevant, da in 9 von 
10 Fällen díe Genre2-Bits bei Kaseikyo sowieso 0 sind.

Ich gebe zu, dass ich das im Artikel nicht beschrieben habe. In diesem 
Thread wurde das Thema vor einigen Jahren ausführlicher behandelt.

Übrigens: IRSND berücksichtigt beim Senden diese 4 Bits aus flags, d.h. 
der Genre2-Code wird wieder in den Frame "eingebaut".

Die Arbeit, die 0en und 1en aus Deinem Bild mit dem oben beschriebenen 
Muster abzugleichen, möchte ich mir jetzt nicht machen. Dafür ist mir 
meine Zeit zu schade. Aber ich bin mir sicher, dass Du alle Bits 
wiederfinden wirst ;-)

> RC5: Herstellercode paßt, aber das Kommando wird mit 0x57 = 0b1010111
> angezeigt. Das wären ja schon 7 Bits!

RC5-Frame: (siehe Artikel: Die Protokolle im Detail):

   2 Start-Bits + 12 Daten-Bits + 0 Stop-Bits

RC5-Daten:

   1 Toggle-Bit + 5 Adress-Bits + 6 Kommando-Bits

Philips kam irgendwann auf den Trichter, dass Ihnen die 6 Kommando-Bits 
nicht mehr reichen. Denn damit kann man nur 2 hoch 6 = 64 verschiedene 
Kommandos unterscheiden. So kamen sie dann auf die glorreiche Idee, das 
2. Start-Bit (was bisher immer 1 war) zu einem Kommando-Bit 
umzufunktionieren.

RC5x-Frame:

   1 Start-Bit + 13 Daten-Bits + 0 Stop-Bit

RC5x-Daten:

   1 invertiertes Kommando-Bit + 1 Toggle-Bit + 5 Adress-Bits
   + 6 Kommando-Bits

Um dies kompatibel zum alten RC5-Frame zu halten, wurde dieses 
zusätzliche Kommando-Bit invertiert. D.h. man findet die uralten 
6-Bit-Kommando-Codes in den 7-Bit-Kommando-Codes sehr einfach wieder, 
denn sie sind identisch. Bei einem 6-Bit-Code ist das 7. Bit Null. Wenn 
Du das invertierst, kommt 1 raus. Und dieses hat denselben Wert wie das 
2. Start-Bit eines RC5-Frames.

Wenn also das 7. Kommando-Bit als 2. Start-Bit geschickt wird, kann 
sogar ein RC5-Empfänger zumindest die Hälfte der Kommandos (das heisst: 
alle 64 vom alten RC5!) von einer neueren RC5x-Fernbedienung verstehen. 
Ziemlich pfiffig eigentlich.

Die Anzahl der Bits sind beim RC5x-Frame (RC5x: lies "RC5-Extended") 
also gleich, aber sie haben ein zusätzliches Daten-Bit (konkret: 
Kommando-Bit) "erfunden".

Da hast Du nun das mysteriöse 7. Bit. Deine Fernbedienung spricht damit 
RC5x. Das 2. Start-Bit ist also hier 0 statt 1. Alles klar? :-)

Wie Du siehst, wurden in der Vergangenheit immer wieder IR-Protokolle 
aufgebohrt, z.B. NEC -> NEC-Extended, RC5 -> RC5x. Ich habe diese im 
IRMP-Artikel auch aufgeführt, muss aber zugeben, dass die Hintergründe 
(Zugewinn an Informationsmenge wegen vorherigem Mangel) und die 
Techniken (s.o.) dazu nicht beschrieben sind. Wenn Du möchtest, kannst 
Du das aber gerne nachholen ;-)

: Bearbeitet durch Moderator
von Bruno M. (brumay)


Lesenswert?

Frank M. schrieb:

> Alles klar? :-)

Super!! Herzlichen Dank.

Ich habe mir natürlich die Mühe gemacht und meine KASEIKYO-Ausgabe mit 
Deinen Infos abzugleichen. Es paßt wenn ich es so anordne:

1001000010100000 = 1001 + 00 + 0010100000

d.h. 4 Genre1-Bits + 2 ID-Bits+ 10 Kommando-Bits

Gruß Bruno

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Bruno M. schrieb:
> Ich habe mir natürlich die Mühe gemacht und meine KASEIKYO-Ausgabe mit
> Deinen Infos abzugleichen. Es paßt wenn ich es so anordne:
>
> 1001000010100000 = 1001 + 00 + 0010100000
>
> d.h. 4 Genre1-Bits + 2 ID-Bits+ 10 Kommando-Bits

Hm, das sollte eigentlich eher:

  4 Genre1-Bits + 10 Kommando-Bits + 2 ID-Bits

sein. Kann aber auch sein, dass ich mich irre.

Da IRSND die gespeicherten IRMP-Daten einwandfrei wiedergeben kann (d.h. 
IRMP versteht IRSND) und auch die Kaseikyo-Endgeräte die IRSND-Kommandos 
allesamt korrekt ausführen, bin ich mir sicher, dass IRMP das schon 
richtig macht ;-)

von Preisfrage (Gast)


Lesenswert?

Ich versuche aktuell IRMP mit 2 TSOP4838 zu betreiben, dazu gibt es 
prinzipiell 2 Möglichkeiten:

a) Beide TSOPs an einem Input Pin. Das funktioniert sogar, beide TSOPs 
gehen, auch im "Doppelbetrieb" gibts keine Probleme. Ist aber unschön. 
Oder ist das durchaus so lösbar?
b) Beide TSOPs an jeweils einen Input Pin und IRMP das ganze 
softwaremäßig beibringen, wenn möglich mit nur einem Timer.
Ich hab daher die Pin Definitionen verdoppelt und die ISR Routine 
dahingehend angepasst, das geprüft wird, ob sich die Werte von TSOP1 
oder TSOP2 verändert haben und dann einfach den Wert als neuen 
"irmp_input" zu nehmen, egal ob er von TSOP1 oder 2 stammt.
Das tut aber gar nicht, TSOP1 tut, aber TSOP2 löst nichts aus.
Gibt es einen einfacheren Weg als die halbe Lib umzuschreiben? Sehe ich 
vllt. Alternativen nicht?

Hat hier jemand einen Rat?

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Preisfrage schrieb:
> Ich versuche aktuell IRMP mit 2 TSOP4838 zu betreiben, dazu gibt es
> prinzipiell 2 Möglichkeiten:
>
> a) Beide TSOPs an einem Input Pin. Das funktioniert sogar, beide TSOPs
> gehen, auch im "Doppelbetrieb" gibts keine Probleme. Ist aber unschön.
> Oder ist das durchaus so lösbar?

Das funktioniert deshalb, weil die TSOPs einen Open-Collector-Ausgang 
mit eingebautem Pullup haben. Es ist deshalb kein Problem, beide TSOPs 
parallel an einem Pin zu betreiben.

> b) Beide TSOPs an jeweils einen Input Pin und IRMP das ganze
> softwaremäßig beibringen, wenn möglich mit nur einem Timer.
> Ich hab daher die Pin Definitionen verdoppelt und die ISR Routine
> dahingehend angepasst, das geprüft wird, ob sich die Werte von TSOP1
> oder TSOP2 verändert haben und dann einfach den Wert als neuen
> "irmp_input" zu nehmen, egal ob er von TSOP1 oder 2 stammt.
> Das tut aber gar nicht, TSOP1 tut, aber TSOP2 löst nichts aus.

Zeig mal Deine Änderung. Wenn beide Pins am gleichen Port hängen,
reicht eigentlich die Änderung des input-Makros, nämlich

Alt (in irmp.h):
1
#  define input(x)          ((x) & (1 << IRMP_BIT))

Neu:
1
#  define IRMP_BIT2   3     // Bit 3 am Port, hier anpassen!
2
#  define input(x)    (((x) & ((1 << IRMP_BIT) | (1 << IRMP_BIT2))) == ((1 << IRMP_BIT) | (1 << IRMP_BIT2)))

> Gibt es einen einfacheren Weg als die halbe Lib umzuschreiben?

Naja, ich würde diese klitzekleine Änderung nicht unbedingt "halbe Lib 
umschreiben" nennen ;-)

: Bearbeitet durch Moderator
von Joachim B. (jar)


Lesenswert?

Frank M. schrieb:
> #  define input(x)          ((x) & (1 << IRMP_BIT) & (1 << IRMP_BIT2))

versaut dir die möglicherweise zeitliche Differenz nicht dein knappes 
Protokolltiming ? (wenn die beiden das selbe optische Signal empfangen 
-können- bei gleicher Ausrichtung)

Es wurde schon mal erwähnt das Siemens und Ruwido so dicht liegen das es 
zu Fehlerkennungen kommt.

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


Lesenswert?

Joachim B. schrieb:
> Frank M. schrieb:
>> #  define input(x)          ((x) & (1 << IRMP_BIT) & (1 << IRMP_BIT2))

Ich hatte das Makro nochmal nacheditiert, siehe oben. So ist das nicht 
ganz korrekt. Du warst zu schnell beim Zitieren :-)

> versaut dir die möglicherweise zeitliche Differenz nicht dein knappes
> Protokolltiming ? (wenn die beiden das selbe optische Signal empfangen
> -können- bei gleicher Ausrichtung)

Das glaube ich nicht. Was meinst Du, wie groß diese zeitliche Differenz 
denn maximal werden könnte? IRMP hat bei 15kHz lediglich eine zeitliche 
Auflösung 66µsec.

> Es wurde schon mal erwähnt das Siemens und Ruwido so dicht liegen das es
> zu Fehlerkennungen kommt.

Ja, das ist aber erstens ein exotischer Spezialfall und zweitens glaube 
ich nicht, dass das Signal wesentlich verschliffen wird.

P.S.
Ich warte immer noch auf die Scans von E.K. Dann kann ich schauen, wie 
ich Siemens und Ruwido ordentlich auseinanderfieseln kann.

von Conny G. (conny_g)


Lesenswert?

Preisfrage schrieb:
> Ich versuche aktuell IRMP mit 2 TSOP4838 zu betreiben

Wofür brauchst Du das? Um den Empfangswinkel zu vergrößern (z.B. Vor- 
und Rückseite am Empfänger)?

von Preisfrage (Gast)


Lesenswert?

Frank M. schrieb:
> Zeig mal Deine Änderung. Wenn beide Pins am gleichen Port hängen,
> reicht eigentlich die Änderung des input-Makros, nämlich
>
> Alt (in irmp.h):
> #  define input(x)          ((x) & (1 << IRMP_BIT))
>
> Neu:
> #  define IRMP_BIT2   3     // Bit 3 am Port, hier anpassen!
> #  define input(x)    (((x) & ((1 << IRMP_BIT) | (1 << IRMP_BIT2))) ==
> ((1 << IRMP_BIT) | (1 << IRMP_BIT2)))
>
>> Gibt es einen einfacheren Weg als die halbe Lib umzuschreiben?
>
> Naja, ich würde diese klitzekleine Änderung nicht unbedingt "halbe Lib
> umschreiben" nennen ;-)

Danke erstmal!
So einfach geht es dann aber doch nicht, mit dem Code tut keiner der 
beiden TSOPs (ja hängen beide an Port B). Selbst mit
((x) & ((1 << IRMP_BIT) | (1 << IRMP_BIT2))) tut es nicht.
Meinen Code hier zu posten wäre zu lang, ich hab einfach jegliche 
Portdefiniton + Init + ISR kopiert, so dass ich für beide nachher im 
Timer eine ISR aufgerufen hab. Das ging auch ganz brauchbar, solange das 
Signal nicht an beiden IR Sensoren ankam. Aber dennoch erschien mir dein 
Ansatz als besser, aber wie gesagt er tut so nicht, auch wenn ich nicht 
ganz verstehe warum. Hast du eine Idee?

Conny G. schrieb:
> Preisfrage schrieb:
>> Ich versuche aktuell IRMP mit 2 TSOP4838 zu betreiben
>
> Wofür brauchst Du das? Um den Empfangswinkel zu vergrößern (z.B. Vor-
> und Rückseite am Empfänger)?

Genau aus dem Grund ;)

von Preisfrage (Gast)


Lesenswert?

Achso ich hab deinen Code natürlich nicht mit meinem rumgewurstelten 
Code ausprobiert, sondern in einer sauberen Codebasis.

von Preisfrage (Gast)


Angehängte Dateien:

Lesenswert?

Okay, da hatte ich wohl einen kurzen Hirnkrampf, es tut doch.
Im Anhang ist der Patch dafür, es ist genau die Änderung die Frank 
erwähnte.

Zur Anwendung den Patch in den Ordner von IRMP (Version 2.6.7, Stand vom 
19.09.2014) kopieren und dann: patch -p1 < irmp_two_tsops.patch

Zum Testen ob beide funktioniren reicht es nicht einen von beiden 
einfach abzustecken, man muss den Eingangspin auf VCC setzen 
(Open-Collector-Ausgang...s.o.).

Danke nochmal an Frank für die Hilfe und tolle Arbeit!

P.S.: Kennst du eigentlich https://github.com/shirriff/Arduino-IRremote 
.. ich vermute das bringt dir zwar nichts mehr, aber gerade für den 
RC6(A) Teil hättest du dort eventuell einen Blick reinwerfen können. 
Auch scheint diese Library problemlos mit 1 MHz zu laufen, ich hab das 
aber nur mit RC6A getestet. Der Ansatz selbst ist der afaik der gleiche 
(Timer).

von Andreas S. (preisfrage)


Angehängte Dateien:

Lesenswert?

Und man sollte natürlich den Pin auch entsprechend setzen, das hatte ich 
im oberen Patch vergessen. Korrigierte Version im Anhang.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Preisfrage schrieb:
> Okay, da hatte ich wohl einen kurzen Hirnkrampf, es tut doch.

Hätte mich auch gewundert, wenn nicht ;-)

Klar muss man an den nicht benutzten Pin dann einen Pullup-Widerstand 
klemmen, wenn doch nur ein TSOP angeschlossen ist.

Aber wie gesagt: Beide TSOPs parallel zu schalten ist sehr wohl auch 
eine Lösung.

Gruß,

Frank

von Stefan Z. (stefan_z)


Lesenswert?

Warum auch sollte das Parallelschalten Probleme machen?
IR ist Licht, Licht ist bekanntlich erstaunlich schnell :-)
Und die TSOPs einer Serie sollten auch bei extremer Streuung immer noch 
ein brauchbares Rechteck ausgeben.

Klemm doch einfahc mal zwei oder drei TSOP zusammen und schau auf dem 
Oszi wie das Signal "leidet".

von Joachim B. (jar)


Lesenswert?

Stefan Z. schrieb:
> Warum auch sollte das Parallelschalten Probleme machen?
> IR ist Licht, Licht ist bekanntlich erstaunlich schnell :-)
> Und die TSOPs einer Serie sollten auch bei extremer Streuung immer noch
> ein brauchbares Rechteck ausgeben.

dazu müssten aus der Grabbelkiste 3 aus einer Serie vom freundlichen 
distributor genommen werden, wenig vorstellbar

> Klemm doch einfahc mal zwei oder drei TSOP zusammen und schau auf dem
> Oszi wie das Signal "leidet".

wenn dann am 4 Kanal Oszi und schauen wie die Signale versetzt sind

wenn sie OC sind ist es kein Problem, wenn nicht sondern CMOS oder mit 
eingebauten pullup sind Differenzen evtl. schlecht.

Wenn ein TSOP low zieht, der ander noch etwas high ist....

na ja muss jeder selber wissen, Parallelschaltung ist auf dem selben 
Substrat eher weniger das Problem, sonst einfach nur ein temporärer 
Kurzschluß !

von Heino (Gast)


Lesenswert?

Hallo Frank,
Eine kleine Anmerkung meinerseits.

Ich finde es schade dass du Strings mittels der obsoleten PROGMEM Krücke 
in den Flash legst.
Ich würde entweder direkt den __flash Modifier verwenden, oder ihn 
hinter einem Define verstecken:
1
#define FLASH_STRING          const __flash

Auf Systemen ohne __flash kann man das Makro dann eben "leer" 
definieren.

Mein GreenHills Compiler auf Arbeit beispielsweise legt generell 
Konstanten in den Flash, da reicht dann ein
1
#define FLASH_STRING          const

Ich finde das also portabler und obendrein wird der Code nicht durch 
hässliche pgm Funktionen verschandelt.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Joachim B. schrieb:

> wenn sie OC sind ist es kein Problem, wenn nicht sondern CMOS oder mit
> eingebauten pullup sind Differenzen evtl. schlecht.

Ich wiederhole mich nochmal:

Die TSOPs sind generell Open Collector mit eingebautem Pullup. Von daher 
gibt es keinen Kurzschluss. Parallelschaltung ist also kein Problem.

> na ja muss jeder selber wissen, Parallelschaltung ist auf dem selben
> Substrat eher weniger das Problem, sonst einfach nur ein temporärer
> Kurzschluß !

Nein, in diesem Falle nicht.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Heino schrieb:
> Ich finde es schade dass du Strings mittels der obsoleten PROGMEM Krücke
> in den Flash legst.

Wenn Du mir sagst, wie ich __flash mit dem gcc-4.3.3 im AVR Studio 4.18 
zum Laufen bekomme, gerne ;-)

Da das 4er AVR Studio unter vielen Usern nachwievor ziemlich beliebt 
ist, sehe ich da kurzfristig keine Möglichkeit, PROGMEM so einfach 
loszuwerden.

> Ich finde das also portabler und obendrein wird der Code nicht durch
> hässliche pgm Funktionen verschandelt.

"Portabler" ist es, wenn es mit dem alten und einem aktuellen gcc 
läuft - nicht umgekehrt. Schönheit / Hässlichkeit ist eine andere Sache.

von Joachim B. (jar)


Lesenswert?

Frank M. schrieb:
> Die TSOPs sind generell Open Collector mit eingebautem Pullup.

also sorry das ist definitiv ein Widerspruch in sich

entweder der TSOP ist OC ! dann hat er keinen eingebauten Pullup ! oder 
er hat Pullup eingebaut, dann ist er kein OC.

OK was logisch funktioniert ist eine low Veroderung was parallelschalten 
ja bedeutet und da die eingebauten "Pullups" keine 1 Ohm sein werden 
wird das wohl klappen ohne Schädigung der TSOP, aber sauber ist anders. 
Wer low verodern will müsste erst mal invertieren, auf ein Odergatter 
gehen und wieder invertieren, oder ein NOR wählen.

Einfach parallelschalten empfinde ich (sorry) als unsauber, auch wenn es 
hier wohl nix kaputt macht.

von Frank M. (ukw) (Moderator) Benutzerseite


Angehängte Dateien:

Lesenswert?

Joachim B. schrieb:
> Frank M. schrieb:
>> Die TSOPs sind generell Open Collector mit eingebautem Pullup.
>
> also sorry das ist definitiv ein Widerspruch in sich

Nein, ist es nicht. Es soll ausdrücken, dass High nicht aktiv getrieben 
wird. Warum? Damit man es low verodern kann. Dabei erspart Dir der 
innere Pullup den externen. Bei 30k kann man wahrlich nicht von einem 
aktiven Ausgang sprechen - jedenfalls nicht, was die High-Side betrifft.

Schau Dir einfach das angehängte Innenschaltbild eines TSOPs an.

: Bearbeitet durch Moderator
von Bad U. (bad_urban)


Lesenswert?

Joachim B. schrieb:
> entweder der TSOP ist OC ! dann hat er keinen eingebauten Pullup ! oder
> er hat Pullup eingebaut, dann ist er kein OC.

OK. Bei OC ist normal kein Pullup dran. Stimmt. Aber den machst du dann 
eh extern dran oder nutzt einen eingebauten im uC-Pin.

Mal dir mal die Schaltung mit 2 TSOPs auf. dann hast du 2 Pullups. Die 
kannst Du im Ersatzschaltbild durch einen mit halbem Wert ersetzen. Was 
dann noch übrig bleibt sind zwei parallele OC mit einem Pullup.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Bad Urban schrieb:
> Mal dir mal die Schaltung mit 2 TSOPs auf. dann hast du 2 Pullups. Die
> kannst Du im Ersatzschaltbild durch einen mit halbem Wert ersetzen. Was
> dann noch übrig bleibt sind zwei parallele OC mit einem Pullup.

Eben. Die beiden Pullups reduzieren sich dann bei der Parallelschaltung 
von 30k auf einen mit 15k. Der eingebaute Transistor kann lt. Datenblatt 
5mA liefern. Durch die beiden Pullups fließen dabei jeweils 0,17mA, also 
ca. 0,34mA insgesamt. Das ist noch nichtmals ein Zehntel des Stroms, den 
jeder der Transistoren leisten kann, um gegen den jeweils anderen TSOP 
"anzukämpfen", solange beide nicht denselben Pegel haben. Das Ganze wird 
sogar noch mit 3 oder 4 parallelgeschalteten TSOPs funktionieren.

von Joachim B. (jar)


Lesenswert?

Frank M. schrieb:
> Schau Dir einfach das angehängte Innenschaltbild eines TSOPs an.

muss ich nicht, ich kenne sogar noch die Innenbeschaltung von TTL

Bad Urban schrieb:
> Mal dir mal die Schaltung mit 2 TSOPs auf.

muss ich nicht malen, soweit funzt der Kopf noch, nur mit dem 
Kurzzeitgedächnis haperts

Frank M. schrieb:
> Die beiden Pullups reduzieren sich dann bei der Parallelschaltung
> von 30k auf einen mit 15k.

auch klar

Ich schrieb schon das es geht (gehen kann, ach ne geht weil wurde 
getestet)

nur empfand ich das im ersten Lesen als unsauber, aber OK der Praktiker 
freut sich und theoretisiert weniger, ich weiss manchmal nicht wo ich 
mich einordnen will.

PS. ich habe dem Atari ST am Floppycontroller mit regulär 8 MHz und DD 
Datenstrom auch HD beigebracht durch Auf-Umschaltung von 8MHz zu 16MHz 
gesteuert durch das HD Loch. Könnte auch sofort einer aufschreien 16MHz 
statt 8MHz das kann nicht gehen.

von Ulli (Gast)


Lesenswert?

Denkt Ihr das ich meine IR-Diode und dem IRSEND auch mit einem udn2003 
treiben kann?

Würde das funktionieren oder klappt das nur mit der standard 
Transistorschaltung?

Hat das schon wer versucht?

von Joachim B. (jar)


Lesenswert?

Ulli schrieb:
> udn2003

wenn du ULN meinst den richtig benutzt und den Port und in Summe über 
alle Ports nicht GND überlastest gehts

: Bearbeitet durch User
von Stefan Z. (stefan_z)


Lesenswert?

Einen UDN2003 gibt / gabs aber auch.
Ob du die Diode jetzt von "links oder rechts" schaltest ist ja egal 
(also NPN oder PNP, finde grad kein Datasheet).
Ausschlaggebend ist immer die gewünschte Leistung, das sagt dir das 
Datasheet, wenn du es dann findest :-)

von Ulli -. (ulli2k)


Lesenswert?

Super danke für die Rückmeldung. D.h. ich brauch blos die IR diode, den 
richtigen Vorwiderstand und den uln ... Damit sollte es dann klappen 
richtig?

von Joachim B. (jar)


Lesenswert?

Ulli -- schrieb:
> IR diode, den
> richtigen Vorwiderstand und den uln ...

ja, aber warum einen ganzen ULN für eine IR Diode?
wäre ein Transistor nicht platzsparender?

: Bearbeitet durch User
von Ulli -. (ulli2k)


Lesenswert?

Habe noch paar Relais...wäre ein chip für alles

von Jörg R. (jrie)


Lesenswert?

Hallo Frank,

ich räume gerade den Code von meinem IRMP_STM32 Projekt auf.
Dabei ist mir aufgefallen, dass ich bei den Patchen, die ich vor ein 
paar Monaten vorgeschlagen habe, an zwei Stellen übers Ziel hinaus 
geschossen bin.
Da können 5 includes entfernt werden.
In irmpsystem.h, Zeile 100 - 103:
1
#  define memcpy_P memcpy
2
#  define APP_SYSTICKS_PER_SEC          32
3
#elif defined(ARM_STM32F10X)
4
//#  include "stm32f10x_gpio.h"
5
//#  include "stm32f10x_rcc.h"
6
//#  include "stm32f10x_tim.h"
7
//#  include "misc.h"
8
#  define PROGMEM
9
#  define memcpy_P                      memcpy
10
#else
und in irmp.c, Zeile 613
1
#  include "stm32f4xx_usart.h"
2
#elif defined(ARM_STM32F10X)
3
#  define  STM32_UART_COM     USART3                                    // UART3 on PB10
4
//#  include "stm32f10x_usart.h"
5
#else
6
#  if IRMP_EXT_LOGGING == 1                                             // use external logging
7
#    include "irmpextlog.h"

Die werden nämlich schon über vorhandene includes eingebunden, wenn man 
es richtig macht ;-)

Gruß, Jörg

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Hallo Jörg,

Jörg R. schrieb:

> Da können 5 includes entfernt werden.

Danke für den Hinweis, Änderungen kommen mit der nächsten Version.

Gruß,

Frank

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Jörg R. schrieb:
> Die werden nämlich schon über vorhandene includes eingebunden, wenn man
> es richtig macht ;-)

Wie macht man es denn richtig?

Ich spiele gerade mit dem STM32F4 Discovery herum und musste die 
stm32f4...-Includes dort wieder einbinden. Ich hab sie allerdings in 
irmp-system.h eingebaut.

: Bearbeitet durch Moderator
von Jörg R. (jrie)


Lesenswert?

Hallo Frank,

in Zeile 37 von irmpsystem.h wird stm32f10x.h eingebunden.
stm32f10x.h wiederum bindet stm32f10x_conf.h ein (vorausgesetzt 
USE_STDPERIPH_DRIVER ist definiert).
Und schließlich wird in stm32f10x_conf.h das eingebunden, was ich 
auskommentiert habe, und das ist auch der Ort, wo das hin gehört ;-)

Ich nehme mal an, dass es für den F4xx analog ist.

Gruß, Jörg

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


Lesenswert?

Hallo Jörg,

Jörg R. schrieb:

> in Zeile 37 von irmpsystem.h wird stm32f10x.h eingebunden.
> stm32f10x.h wiederum bindet stm32f10x_conf.h ein (vorausgesetzt
> USE_STDPERIPH_DRIVER ist definiert).
> Und schließlich wird in stm32f10x_conf.h das eingebunden, was ich
> auskommentiert habe, und das ist auch der Ort, wo das hin gehört ;-)
>
> Ich nehme mal an, dass es für den F4xx analog ist.

Ja, ist analog. Dort gibt es ein stm32f4xx_conf.h, welches allerdings 
von der CooCox-IDE nicht nachgepflegt wird. Das Ding muss man immer 
manuell nacheditieren. Daher ist der Sinn dieses Includes für mich 
zumindest zweifelhaft.

Ich überlege gerade: Wenn man die entsprechenden Includes drinlässt, 
schadet es doch nichts, oder? Ich glaube, dann erpart man sich die 
entsprechenenden Nachfragen, die entstehen, wenn der User die conf-Datei 
nicht up-to-date hat.

Hm, ist wirklich eine Geschmackssache... Man könnte es auch im 
IRMP-Artikel dokumentieren. Ich schwanke gerade...

von Di P. (drpepper) Benutzerseite


Lesenswert?

Hallo,

seit langem melde ich mich mal wieder, nachdem ich jahrelang schweigend 
genossen habe, wie gut IRMP funktioniert :).

Ich hatte IRMP vor einiger zeit erfolgreich auf einem STM32F4 am laufen, 
wobei ich CoIDE und die darin verfügbaren LIBs (GPIO, TIMER, ...) 
verwendet habe.
Jetzt bin ich auf das äußerst komfortable CubeMX von ST und eine andere 
IDE umgestiegen, und im Hardware Abstraction Layer (HAL) [1] sind jetzt 
die Initialisierungsstrukturen etwas anders aufgebaut. Ich schlage 
deshalb vor, dass man per #define die Verwendung des HAL von CubeMX 
angeben kann, und dann auf die dort definierten Funktionen 
zurückgegriffen wird.

Gruß, DiPi

[1]:
HAL Description:
http://www.st.com/web/en/resource/technical/document/user_manual/DM00105879.pdf 
(PDF - ca. 4,5 MB)

von Jörg R. (jrie)


Lesenswert?

Hallo Frank,

"olebowle", der meinem Code vom "IRMP auf STM32" Projekt "den letzten 
Schliff" gibt, bevorzugt IRMP_DATA  anstatt als
1
typedef struct
 lieber als
1
typedef struct __attribute__ ((__packed__))
zu deklarieren. Das hat den Vorteil, dass man einfach mit memcpy und 
memcmp arbeiten kann, während ich bisher eigene Funktionen dafür benutzt 
habe. Nicht dass mich das stören würde, aber mit packed struct ist es 
einfach viel eleganter.

Nun meine Frage an dich, ob es Sinn macht, das zu übernehmen?  Oder 
stört es andere Projekte? Es macht wohl nur auf 32-bit uCs einen 
Unterschied, aber da "stören" eben die Füllbytes.

Gruß,
Jörg

https://github.com/olebowle/STM32_IRMP/commit/33be1a37471267c3af5935374ca25b96470df544
https://github.com/olebowle/STM32_IRMP/commit/db0bdbb52e345c37fecd7cdc46b9c8655119f3d0

von Michael K. (Gast)


Lesenswert?

Jörg R. schrieb:
> typedef struct _attribute_ ((_packed_))

In älteren Releases war so realisiert. Da ich an fast demselben Projekt 
arbeite wie du (für Windows/MediaPortal), bin ich beim Aktualisieren von 
IRMP irgendwann mal da drüber gestolpert als dann plötzlich zwei Bytes 
mehr im USB Report landen sollten, die da aber keinen Platz hatten.

von Jörg R. (jrie)


Lesenswert?

Hallo Michael,

fast dasselbe Projekt?
Das macht mich neugierig. Lass mal mehr hören, hast du einen Link für 
mich auf dein Projekt?

Gruss,
Jörg

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Hallo Jörg,

Jörg R. schrieb:
> typedef struct _attribute_ ((_packed_))
> Nun meine Frage an dich, ob es Sinn macht, das zu übernehmen?

Ja, macht definitiv Sinn. Dann ist die Größe der Struct auf allen µC 
gleich.

Kommt mit der nächsten Version.

von Michael K. (Gast)


Lesenswert?

Jörg R. schrieb:
> fast dasselbe Projekt?
> Das macht mich neugierig. Lass mal mehr hören, hast du einen Link für
> mich auf dein Projekt?
Ich mache da schon ewig dran rum mit niedriger Priorität und vielen 
Unterbrechungen [wie lange genau, sage ich jetzt lieber nicht... ;-)]. 
Im Wesentlichen geht es um den IR-Empfang und das Aufwecken des PCs aus 
allen Zuständen. Ich nutze (ausschließlich) MePo und will dafür ein 
Plugin schreiben, wobei es auch eine Standalone-Applikation für Windows 
gibt (beides in C# mit der Generic HID von Janet Axelson als Basis). 
Prinzipiell funktioniert alles schon, im Produktiveinsatz ist es 
allerdings noch nicht. Als uC kommt ein STM32L151 auf einer eigens 
gelayouteten Platine zum Einsatz. Da ist allerdings noch etwas mehr 
drauf, z.B. ein optischer S/PDIF-Ausgang, da mein Board keinen solchen 
hat.

Frank M. schrieb:
> Ja, macht definitiv Sinn. Dann ist die Größe der Struct auf allen µC
> gleich.
In dem Fall ziehe ich obige Aussage zurück und behaupte das Gegenteil. 
Dann habe ich das damals wohl selbst entsprechend modifiziert und 
inzwischen vergessen.

von Jörg R. (jrie)


Lesenswert?

Hallo Michael,
wollen wir uns gegenseitig unterstützen? Ist dein Projekt als Open 
Source geplant?
Ich suche nämlich noch jemanden, der den Windows Teil von meinem Projekt 
macht.
Möglicherweise könnte ich da etwas von dir übernehmen.
Vielleicht passt das gut zusammen?
Was meinst du?
Gruß, Jörg

von M. K. (kichi)


Lesenswert?

Hi Jörg,
um den Beitrag hier nicht weiter zuzuspammen, habe ich dir eine 
Nachricht geschrieben.
Grüße,
Michael

von Jörg R. (jrie)


Lesenswert?

Hallo Frank,

eine Frage zu RC5: wo kommen eigentlich die 45ms 
RC5_FRAME_REPEAT_PAUSE_TIME her?
Ich kenne nur 25ms für die Daten und 114ms für einen Zyklus. Das macht 
als Pause 114 - 25 = 89ms. Meine Fernbedienung hält sich auch daran.
Verstehe ich was falsch?

Gruß, Jörg

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Hallo Jörg,

Jörg R. schrieb:

> eine Frage zu RC5: wo kommen eigentlich die 45ms
> RC5_FRAME_REPEAT_PAUSE_TIME her?

Diese habe ich irgendwann mal empirisch aus irgendwelchen Scan-Dateien, 
die mir zur Verfügung gestellt wurden, herausgelesen. Ich selber habe 
keine RC5-FB.

> Ich kenne nur 25ms für die Daten und 114ms für einen Zyklus. Das macht
> als Pause 114 - 25 = 89ms. Meine Fernbedienung hält sich auch daran.

Das klingt auch sehr plausibel. Strenggenommen ist die Pausenlänge auch 
nicht so kritisch. Sie wird nur von IRSND verwendet, um bei 
Wiederholungen (z.B. längerem Druck auf Lautstärke-Taste) einen Abstand 
zu erzielen. Bisher hat sich da auch niemand beschwert, dass es nicht 
funktionieren würde. Aber wer weiß, wer das überhaupt nutzt? 
Original-RC5 findet man heutzutage selten vor.

Hast Du eine Möglichkeit, zu testen, ob es (auch) mit 89ms geht? Dann 
ändere ich das im Source.

Gruß,

Frank

P.S.
Viele der definierten FRAME_REPEAT_PAUSE-Zeiten sind nur empirisch oder 
aus Plausibilitätsüberlegungen definiert worden. In den seltensten 
Fällen habe ich von den Usern Scans mit kurzem und langem Tastendruck 
bekommen, um diese dann vergleichen zu können.

Je mehr Du da richtig "messen" kannst, desto besser :-)

: Bearbeitet durch Moderator
von Jörg R. (jrie)


Lesenswert?

Hallo Frank,

am Anfang meiner Experimente mit Makros habe ich sofort nach einem 
empfangenem auslösendem IR Event andere IR Events ausgesendet, also Null 
Pause. Dadurch ist ein IgorPlug regelmässig abgestürzt. Zu kurze Pause 
kann also Geräte verwirren.

Eine andere Frage ist, was passiert, wenn ein Makro verschiedene 
Protokolle aussendet, also z.B. verschiedene Geräte mit 
unterschiedlichen Protokollen einschalten will.
Beim Überlegen, welcher (möglichst kleine) Wert da mindestens nötig ist, 
habe ich mir deine FRAME_REPEAT_PAUSE-Zeiten zur Orientierung 
angeschaut.
Gut zu wissen, dass man sich darauf nicht unbedingt verlassen kann.

Die 89ms werde ich noch testen und Feedback geben.

Gruß, Jörg

von Jörg R. (jrie)


Lesenswert?

Hallo Frank,

mit 89ms geht es auch, aber 45ms schadet bei mir nichts.

Gruß, Jörg

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Hallo Jörg,

Jörg R. schrieb:
> mit 89ms geht es auch, aber 45ms schadet bei mir nichts.

Danke für die Rückmeldung. Vielleicht ist es aber trotzdem sicherer, die 
89ms einzusetzen. Vielleicht reagieren nicht alle (mittlerweile eher 
ausgestorbenen) Geräte so tolerant.

von Wim (Gast)


Lesenswert?

Hallo,

Ich versuche, mit Hilfe Ihrer Bibliothek, meinem ADB Set Top Box 
Fernbedienung zu dekodieren.

Wenn ich die IRSND_SUPPORT_A1TVBOX_PROTOCOL Protokoll aktiviere, sehe 
Ich einige Buchstaben und Zahlen erscheinen, aber am Ende gibt es ein 
ERROR.

Ich denke meinen ADB Fernbedienung hat eine etwas andere Timing. Wie 
kann meine Fernbedienung an die Protokoll-Liste hinzugefügt werden? Kann 
ich die Fernbedienung an Sie senden? Ich habe nicht genug technisches 
knowledge, um die sourcecode selbst zu ändern.

Wim

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Wim schrieb:

> Ich versuche, mit Hilfe Ihrer Bibliothek, meinem ADB Set Top Box
> Fernbedienung zu dekodieren.

Für Dekodierung braucht man nur IRMP, nicht IRSND.

> Wenn ich die IRSND_SUPPORT_A1TVBOX_PROTOCOL Protokoll aktiviere, sehe
> Ich einige Buchstaben und Zahlen erscheinen, aber am Ende gibt es ein
> ERROR.

Das heisst, Du sendest mit IRSND? Was sendest Du mit IRSND? Das, was Du 
vorher mit IRMP empfangen hast? Beachte bitte, dass viele kommerzielle 
Geräte beim Timing sehr empfindlich sind. Von daher solltest Du bei 
Verwendung von IRSND auch einen Quarz verwenden.

> Ich denke meinen ADB Fernbedienung hat eine etwas andere Timing.

Kann sein.

> Wie
> kann meine Fernbedienung an die Protokoll-Liste hinzugefügt werden?

Im Artikel ist beschrieben, wie man Logging per IRMP_LOGGING einschalten 
kann. Dann zeichnest Du ein paar Scans Deiner Fernbedienung auf und 
schickst mir diese. Dann kann ich IRMP daran anpassen.

von Ulli (Gast)


Lesenswert?

Hallo zusammen,

ich habe einen Atmega328p in Betrieb, IRMP und RISND funktioniert auch 
wunderbar!
Nur möchte ich nun aus Stromspargründen den Atmega auf 1MHz takten. 
Leider funktiniert dabei IRSND nicht mehr.

Hat einer einen Tipp oder die niedrige Taktung schon einmal ausprobiert?

Viele Grüße und Danke!

von Konrad S. (maybee)


Lesenswert?

Ulli schrieb:
> aus Stromspargründen

Konfiguriere den TSOP-Pin für Pin-Change-Interrupt und schick den µC in 
den Sleep-Mode. Bei auftretendem Pin-Change-Interrupt deaktivierst du 
den Pin-Change-Interrupt und IRMP funktioniert normal. Nach einer Weile 
Inaktivität fängst du wieder von vorne an. Natürlich wird der µC 
manchmal auch durch Fehlalarme geweckt werden.

von Ulli (Gast)


Lesenswert?

So weit bin ich schon ;)
Möchte noch weiter runter weil ich nur aus einer AA Batterie speise..

von Konrad S. (maybee)


Lesenswert?

Dann sollte der Hauptverbraucher der TSOP sein (abgesehen vom Step-Up). 
Viel mehr wird nicht zu machen sein.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Ulli schrieb:
> So weit bin ich schon ;)
> Möchte noch weiter runter weil ich nur aus einer AA Batterie speise..

Schau dir mal

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

an. Dort wird der TSOP, der wohl den meisten Strom zieht, per Pin 
abgeschaltet, wenn man ihn nicht braucht. Aufwecken über den TSOP geht 
dann aber nicht, dafür müsste dann eine Taste herhalten.

Wieviel Strom zieht denn Deine Schaltung und wie sieht diese aus?

Beschreibe doch mal Deine Anwendung näher.

: Bearbeitet durch Moderator
von Ulli -. (ulli2k)


Lesenswert?

Heißt das jetzt das irsend nicht bei 1MHz Controller Taktung lauffähig 
ist?
Woran liegt das denn?

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Ulli -- schrieb:
> Heißt das jetzt das irsend nicht bei 1MHz Controller Taktung lauffähig
> ist?
> Woran liegt das denn?

Bei 1MHz Taktung bleiben bei F_INTERRUPTS = 15000 nur noch 65 Takte pro 
Interrupt. Das könnte arg eng werden.

Es steht nicht umsonst im IRMP-Artikel rot umrandet die folgende 
Bemerkung:

"Diese sollte mindestens den Wert 8000000UL haben, der Prozessor sollte 
also zumindest mit 8 MHz laufen."

Du könntest noch probieren, F_INTERRUPTS auf 10000 zurückzusetzen, dann 
sind es immerhin 100 Takte pro Interrupt. Aber dann könnten einige 
Protokolle nicht mehr funktionieren und deshalb schon beim Compilieren 
abgeschaltet werden. Welche von den aktivierten Protokollen davon 
betroffen sind, gibt der Compiler aber aus.

Ist die Stromersparnis bei 1MHz denn so hoch? Je nachdem, welchen TSOP 
Du verwendest, zieht der im Ruhezustand bis zu 5mA. Das sind einige 
Größenordnungen mehr als der Prozessor zieht. Die Stromaufnahme im 
Sleep-Mode beträgt auch bei 8MHz weniger als 1 µA - siehe "Lernfähige 
Fernbedienung". Da kommst Du mit einer AA-Batterie monatelang aus. Dein 
Problem muss woanders liegen.

Welchen TSOP verwendest Du? Wie sieht Deine Schaltung aus? Beschreibe 
bitte Deine Anwendung, sonst ist alles andere nur Spekulation.

: Bearbeitet durch Moderator
von Jörg R. (jrie)


Lesenswert?

Hallo Frank,

ich habe einen bisher unerkannten Fehler in "IRMP auf STM32".
Bestimmten Abläufe (Konfiguration über USB-HID) führen dazu, dass 
irmp_get_data 00 00 00 00 00 00 übergibt, bzw. wenn ich vorher RC5 
empfangen habe 07 00 00 00 00 00, obwohl kein IR gesendet wurde.

Gibt es einen Grund dafür, dass irmp_protocol nicht auf 0 zurückgesetzt 
wird (so wie irmp_command, irmp_address und irmp_flags)?
Wenn irmp_protocol auf 0 zurückgesetzt würde, könnte ich das abfangen.
Solange 07 00 00 00 00 00 übergeben wird, kann das Programm nicht 
wissen, ob das eine RC5 Null ist, oder ob was schief ging.

Man könnte eventuell auch rtc auf FALSE setzen, wenn irmp_protocol 0 
bleibt, dann merkt man aber nicht, das es ein Problem gibt.

Hast du eine Idee, was der Grund dafür sein könnte, dass 00 00 00 00 00 
00 ankommt, obwohl kein IR gesendet wurde? In anderen Worten, was könnte 
mein Programm falsch machen, was IRMP bzw. die IRMP ISR auf diese Art 
stört?

In irmp.c ab Zeile 1983 wäre es dann so (nur aufgeschrieben, nicht 
getestet):

        if (rtc)
        {
            /*if (irmp_protocol == 0) { // JR
              rtc = FALSE;
              break;
            }*/
          irmp_data_p->protocol = irmp_protocol;
            irmp_data_p->address = irmp_address;
            irmp_data_p->command = irmp_command;
            irmp_data_p->flags   = irmp_flags;
            irmp_protocol = 0; // JR
            irmp_command = 0;
            irmp_address = 0;
            irmp_flags   = 0;
        }

Gruß, Jörg

PS Deine irmp.tar.gz  ist zur Zeit unkompilierbar.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Jörg R. schrieb:
> ich habe einen bisher unerkannten Fehler in "IRMP auf STM32".
> Bestimmten Abläufe (Konfiguration über USB-HID) führen dazu, dass
> irmp_get_data 00 00 00 00 00 00 übergibt, bzw. wenn ich vorher RC5
> empfangen habe 07 00 00 00 00 00, obwohl kein IR gesendet wurde.

Das darf nicht sein. Ich habe zur Zeit auch IRMP auf dem 
STM32F4-Discovery und STM32F401-Nucleo Board ohne Probleme laufen. So 
etwas ist mir noch nicht aufgefallen.

Das hieße ja, dass irmp_get_data() ein TRUE zurückliefert, obwohl nichts 
empfangen wurde. Hm, das habe ich bisher noch nicht erlebt.

> Gibt es einen Grund dafür, dass irmp_protocol nicht auf 0 zurückgesetzt
> wird (so wie irmp_command, irmp_address und irmp_flags)?

Solange nicht 1 zurückgeliefert wird, sind die IRMP_DATA-Member 
undefiniert.

> Wenn irmp_protocol auf 0 zurückgesetzt würde, könnte ich das abfangen.

Unschön. Besser wäre es, den Grund dafür zu finden.

> Solange 07 00 00 00 00 00 übergeben wird, kann das Programm nicht
> wissen, ob das eine RC5 Null ist, oder ob was schief ging.

Ist schon klar. Das Blöde ist nur, dass ich keine RC5-Fernbedienung 
habe, um das zu reproduzieren. Da muss ich wohl mal in den Code schauen.

> Man könnte eventuell auch rtc auf FALSE setzen, wenn irmp_protocol 0
> bleibt, dann merkt man aber nicht, das es ein Problem gibt.

Eben.

> Hast du eine Idee, was der Grund dafür sein könnte, dass 00 00 00 00 00
> 00 ankommt, obwohl kein IR gesendet wurde?

Nein, im Moment habe ich keine Idee. Ausser Codeanalyse fällt mir dazu 
auch nichts ein.

> PS Deine irmp.tar.gz  ist zur Zeit unkompilierbar.

Hm, auf einem ATmega schon. Kannst Du mir die Compiler-Meldung zeigen?

Gruß,

Frank

P.S.
Bekommst Du auch für Protokoll eine 7 zurück, wenn Du vor dem Aufruf von 
irmp_get_data() das irmp_data.protocol auf 0 zurücksetzt?

: Bearbeitet durch Moderator
von Jörg R. (jrie)


Lesenswert?

Frank M. schrieb:
> Jörg R. schrieb:
>> Gibt es einen Grund dafür, dass irmp_protocol nicht auf 0 zurückgesetzt
>> wird (so wie irmp_command, irmp_address und irmp_flags)?
>
> Solange nicht 1 zurückgeliefert wird, sind die IRMP_DATA-Member
> undefiniert.

Das verstehe ich nicht.

>> Wenn irmp_protocol auf 0 zurückgesetzt würde, könnte ich das abfangen.
>
> Unschön. Besser wäre es, den Grund dafür zu finden.

Klar. Aber was mache ich solange, bis ich den Fehler gefunden habe?

>> Solange 07 00 00 00 00 00 übergeben wird, kann das Programm nicht
>> wissen, ob das eine RC5 Null ist, oder ob was schief ging.
>
> Ist schon klar. Das Blöde ist nur, dass ich keine RC5-Fernbedienung
> habe, um das zu reproduzieren. Da muss ich wohl mal in den Code schauen.

Da sieht man das schnell.

>> PS Deine irmp.tar.gz  ist zur Zeit unkompilierbar.
>
> Hm, auf einem ATmega schon. Kannst Du mir die Compiler-Meldung zeigen?

Hier:
http://www.vdr-portal.de/board18-vdr-hardware/board13-fernbedienungen/p1229073-irmp-auf-stm32-ein-usb-ir-empf%C3%A4nger-sender-einschalter-mit-wakeup-timer/#post1229073

> Bekommst Du auch für Protokoll eine 7 zurück, wenn Du vor dem Aufruf von
> irmp_get_data() das irmp_data.protocol auf 0 zurücksetzt?

Gute Idee, ich hab leider gerade keine Zeit, aber werde es sobald 
möglich ausprobieren.
PS Hab gerade noch mal in den Code geschaut, das würde ja wieder 
überschrieben, ich glaube nicht, dass es so geht.

Gruß, Jörg

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Jörg R. schrieb:
>> Solange nicht 1 zurückgeliefert wird, sind die IRMP_DATA-Member
>> undefiniert.
>
> Das verstehe ich nicht.

irmp_get_data() rührt die IRMP_DATA-Member nur an, wenn etwas gültiges 
empfangen wurde. Dann liefert die Funktion 1 zurück. Wenn also 0 
zurückgegeben wird, dann sind die Daten unangetastet, d.h. es steht das 
drin, was Du vor dem Aufruf von irmp_get_data() runtergegeben hast. Aus 
der Sicht von irmp_get_data() sind die Werte also undefiniert - weil 
unangetastet.

So sollte es jedenfalls sein. Wenn nicht, ist das ein Fehler.

>> Hm, auf einem ATmega schon. Kannst Du mir die Compiler-Meldung zeigen?
>
> Hier:
> 
http://www.vdr-portal.de/board18-vdr-hardware/board13-fernbedienungen/p1229073-irmp-auf-stm32-ein-usb-ir-empf%C3%A4nger-sender-einschalter-mit-wakeup-timer/#post1229073

Danke. Fällt auf dem ATmega nicht auf, weil uint8_t identisch ist mit 
uint_fast8_t.

Ersetze in irmp.c:
1
uint8_t
2
irmp_get_data (IRMP_DATA * irmp_data_p)

durch
1
uint_fast8_t
2
irmp_get_data (IRMP_DATA * irmp_data_p)

Dasselbe gilt für die Definition von irmp_ISR(). Ich habe es eben aber 
auch im SVN korrigiert.

> Gute Idee, ich hab leider gerade keine Zeit, aber werde es sobald
> möglich ausprobieren.
> PS Hab gerade noch mal in den Code geschaut, das würde ja wieder
> überschrieben, ich glaube nicht, dass es so geht.

Wie gesagt: Wenn irmp_get_data() die Daten ändert und trotzdem eine 0 
zurückliefert, ist das ein Fehler. Aber ich muss wohl doch in den Code 
schauen. Mache ich morgen. Das tritt nur nach dem Empfang eines 
RC5-Codes auf?

von Jörg R. (jrie)


Lesenswert?

Was ich sagen wollte:
irmp_get_data() liefert 1 zurück, obwohl kein IR Code gesendet wurde, 
und als Protokoll wird 0x00 bzw. das letzte tatsächlich empfangene 
Protokoll übergeben, als Adresse und Kommando 0x00 0x00 und als Flags 
0x00.

Das passiert nur auf dem F103. Der F105 hat das Problem nicht, und da 
der F105 und die F4xx dieselbe USB Bibliothek haben, tritt das auf den 
F4xx auch nicht auf. Ich muss also mit meinem USB-HID Teil auf dem F103 
etwas falsch machen.

Insofern betrachte ich das nicht als Fehler in IRMP, aber sicherlich 
wäre es schöner, IRMP robuster gegen Fehler zu machen.

Der USB-HID Fehler muss irgendwie die irmp_ISR stören, und das wird in 
irmp_get_data() nicht abgefangen. Im Code der irmp_get_data() ist das 
auch nachvollziehbar. Die irmp_ISR habe ich mir noch nicht genauer 
daraufhin angeschaut.

Den Fehler im USB-HID zu finden steht jetzt auf meiner TODO Liste ganz 
oben, aber leider nicht viel Zeit.

Da meine Fernbedienungen alle RC5 senden, habe ich nur mit RC5 getestet.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Jörg R. schrieb:
> Was ich sagen wollte:
> irmp_get_data() liefert 1 zurück, obwohl kein IR Code gesendet wurde,
> und als Protokoll wird 0x00 bzw. das letzte tatsächlich empfangene
> Protokoll übergeben, als Adresse und Kommando 0x00 0x00 und als Flags
> 0x00.

Okay, ich hatte es umgekehrt formuliert. Aber wir sind uns ja einig: 
Dass hier eine 1 zurückgeliefert wird, ist ein Fehler. Fragt sich nur, 
was die Ursache ist. Bisher hat so etwas noch niemand berichtet noch 
habe ich eine Erklärung dafür.

> Das passiert nur auf dem F103. Der F105 hat das Problem nicht, und da
> der F105 und die F4xx dieselbe USB Bibliothek haben, tritt das auf den
> F4xx auch nicht auf. Ich muss also mit meinem USB-HID Teil auf dem F103
> etwas falsch machen.

Was ist denn der Unterschied zwischen F103 und F105 - ausser der 
USB-Bibliothek? Vielleicht ist beim F103 weniger Speicher verfügbar und 
es passiert irgendwo ein Buffer-Overflow?

Tritt denn dieses Phänomen auch auf, wenn Du die USB-Bibliothek gar 
nicht nutzt?

> Insofern betrachte ich das nicht als Fehler in IRMP, aber sicherlich
> wäre es schöner, IRMP robuster gegen Fehler zu machen.

Eine Software-Bibliothek "robuster" gegen Fehler zu machen, die aus 
anderen Modulen herrühren, sehe ich als Herumdoktern an Symptomen. Man 
kann so vielleicht einen Workaround einbauen, um den eigentlich Fehler 
zu verschleiern, aber wenn man Pech hat, bricht der Bug dann an einer 
anderen Stelle durch und man muss noch ein Pflaster draufkleben.

> Der USB-HID Fehler muss irgendwie die irmp_ISR stören, und das wird in
> irmp_get_data() nicht abgefangen. Im Code der irmp_get_data() ist das
> auch nachvollziehbar. Die irmp_ISR habe ich mir noch nicht genauer
> daraufhin angeschaut.

Ich werde mir irmp_get_data() nochmal genauer anschauen. Sollte ich da 
einen (wahrscheinlichen) Fall finden, dass eine 1 zurückgeliefert wird, 
obwohl nichts empfangen wurde, werde ich das korrigieren.

Ich melde mich nochmal heute oder morgen dazu.

Gruß,

Frank

von Jörg R. (jrie)


Lesenswert?

Hallo Frank,
es tritt hier auf:
https://github.com/j1rie/IRMP_STM32/blob/master/STM32F103/src/main.c#L513
Vorher schicke ich Konfigurationsdaten über USB-HID vom uC zum PC.
Danach frage ich ab, ob neues IR empfangen wurde.
Im Falle des F103 bekomme ich nach dem USB Transfer von 
irmp_get_data(&myIRData) Daten, obwohl kein IR gesendet wurde.
Ich werde da mal einen sleep oder warten auf PrevXferComplete testweise 
einbauen, wenn ich wieder zuhause bin.
Aber da sowohl der USB Transfer als auch IRMP das in ihren jeweiligen 
ISRs machen, bin ich nicht sicher, ob das hilft.
Sowohl der USB Datenverkehr als auch IRMP an und für sich funktionieren 
bis auf den beschriebenen Fehler tadellos.
Gruß, Jörg

von Jörg R. (jrie)


Lesenswert?

Ist in Zeile 2415 von irmp.c
irmp_param_p = (IRMP_PARAMETER *) (IRMP_PARAMETER *) &sircs_param;
so richtig oder ein Verschreiber?

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Jörg R. schrieb:
> Ist in Zeile 2415 von irmp.c
> irmp_param_p = (IRMP_PARAMETER *) (IRMP_PARAMETER *) &sircs_param;
> so richtig oder ein Verschreiber?

Das ist ein Verschreiber, der glücklicherweise aber nicht schädlich ist.
Danke für den Hinweis, Korrektur kommt mit der nächsten Version.

von Jörg R. (jrie)


Lesenswert?

Hallo Frank,
irgendwie haben sich deine letzten Änderungen und meine Fehlersuche 
überkreuzt.
Sobald irmp_get_data() und irmp_ISR() als uint_fast8_t deklariert sind, 
ist der Fehler weg!! Es lag genau daran!
Ich bin froh, dass ich das hinter mir habe!
Gruß, Jörg
PS Ich habe auch mal meine relevanten Variablen auf fast umgestellt, 
wobei das nur noch eine war, und die macht keinen Unterschied.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Hallo Jörg,

Jörg R. schrieb:

> Ich bin froh, dass ich das hinter mir habe!

Verstehe ich :-)

> PS Ich habe auch mal meine relevanten Variablen auf fast umgestellt,
> wobei das nur noch eine war, und die macht keinen Unterschied.

Ich habe festgestellt, dass der Zugriff auf uint8_t Variablen ca. 8 mal 
langsamer ist als auf uint8_t, z.B. bei Schleifenzählern. Ich wollte 
aber nicht alles auf uint32_t umstellen, da dies auf 8-Bit-AVRs eine 
zusätzliche CPU- und Speicherbelastung gewesen wäre.

uint_fast8_t ist da ein guter Kompromiss: Auf STM32 wird alles bei 
voller Gschwindigkeit als uint32-Zugriff ausgeführt, auf AVRs bleibts 
aber bei genügsamen 8Bit.

von Jörg R. (jrie)


Lesenswert?

irmp.c und irmp.h sind noch nicht konsistent:
irmp_is_busy() und *cb sind verschieden deklariert

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Jörg R. schrieb:
> irmp.c und irmp.h sind noch nicht konsistent:
> irmp_is_busy()

Habe die Funktion irmp_is_busy gestrichen, da ich keine sinnvolle 
Anwendung dafür sehe. In irmp.c war sie sowieso schon auskommentiert.

> und *cb sind verschieden deklariert

Du meinst irmp_callback_ptr? Bei mir waren sie gleich, kann aber sein, 
dass es im SVN noch nicht der Fall war.

Update ist nun im SVN.

Danke,

Frank

von Jörg R. (jrie)


Lesenswert?

Hui! Jetzt gleich alle?!

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Jörg R. schrieb:
> Hui! Jetzt gleich alle?!

Ich hatte irgendwann vor ein bis zwei Wochen alles auf fast-Typen 
umgestellt, aber nur einen Teil eingecheckt - ich glaube, nur irmp.c und 
irmpprotocols.h - wegen eines neuen Protokolls "MERLIN".

Das war mein Fehler und so ist die Inkonsistenz irmp.c <-> irmp.h 
überhaupt entstanden, über die Du dann gestolpert bist. Denn diese 
Widersprüche hatte ich nämlich schon vor einiger Zeit mit einem 
Rundumschlag in Ordnung gebracht, aber leider nicht sofort eingecheckt.

von Jörg R. (jrie)


Lesenswert?

Ist das denn nötig alle umzustellen? Sind die alle zeitkritisch?
In den ST Libs z.B. werden teilweise auch etliche Variablen, obwohl sie 
nur einen klitzekleinen Wertebereich haben, als uint32_t deklariert. 
Aber viele auch als uint8_t.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Jörg R. schrieb:
> Ist das denn nötig alle umzustellen? Sind die alle zeitkritisch?

Die irmp_ISR() ist ziemlich fett, das ist nicht zu übersehen.

Ich habe auf STM32F4-µCs diverse Benchmarks erstellt, wie "schnell" 
uint8_t-, uint16_t- und uint32_t-Variablen tatsächlich sind.

Das Ergebnis:

Schon eine simple for-Schleife

for (i = 0; i < 255; i++)

läuft mit uint32_t (bzw. uint_fast8_t) als Zähler insgesamt 8-mal(!) 
schneller.

Ist ja auch klar: Die Register des µCs sind 32-Bit breit. Bei 
8-Bit-Operationen müssen die Register immer mit einer 8-Bit-Maske 
versehen werden. Das kostet einfach Zeit. Und was ist mit dem Alignment 
bei STM32? Müssen 8-Bit-Variablen sowieso auf Adressen im RAM zum Liegen 
kommen, die durch 4 teilbar sind?

Wenn ja:

  Dann braucht uint_fast8_t (alias uint32_t) genauso viel Speicherplatz
  wie ein uint8_t, weil sowieso alles vom Compiler aufs 4-fache
  aufgeblasen wird.

Wenn nein:

  Dann dürfte der RAM-Zugriff auf "ungerade" Adressen ziemlich
  ineffektiv sein.

Ergo:

Es ist sehr sinnvoll, bei 32-Bit-µCs auch 32-Bit-breite Variablen zu 
verwenden. Ein Einbruch auf ein Achtel der Geschwindigkeit macht den 
Vorteil eines 32-Bit-µCs wieder zunichte.

> In den ST Libs z.B. werden teilweise auch etliche Variablen, obwohl sie
> nur einen klitzekleinen Wertebereich haben, als uint32_t deklariert.

uint32_t kann ich nicht nehmen. Dann geht IRMP auf AVRs den Bach runter. 
Der Witz ist ja gerade, dass bei uint_fast8_t auf STM32 der Typ uint32_t 
verwendet wird, bei AVRs aber nur uint8_t.

Schau mal in <stdint.h> rein. Bei STM32 wirst du finden:
1
     typedef uint32_t  uint_fast8_t;

Bei AVRs jedoch:
1
     typedef uint8_t  uint_fast8_t;


Die Verwendung von fast-Variablen ist daher

 - portabel
 - sehr effektiv

Das darf natürlich nur mit Variablen machen, die den jeweiligen 
Wertebereich nicht überschreiten. Sonst wundert man sich später beim 
Port von AVR auf STM32, warum beim Überlauf eines Zählers nach 255 
plötzlich nicht 0, sondern 256 als Wert drinsteht.

> Aber viele auch als uint8_t.

Die habe ich auch noch, nämlich dann, wenn ich einen Buffer benutze, 
dessen Elemente 8 Bit breit sein müssen. Oder wenn ich einen Zähler 
benutze, der bei 255 wirklich auf 0 überlaufen soll und nicht auf 256.

Jetzt nochmal zu Deiner Frage:

> Ist das denn nötig alle umzustellen? Sind die alle zeitkritisch?

Wo siehst Du denn da ein Problem? Umstellen muss man da als Anwender der 
Lib eigentlich gar nichts, nur neu compilieren.

Auch das funktioniert:
1
uint8_t rtc;
2
3
  rtc = irmp_get_data (&irmp_data);

Der Compiler wandelt dann uint_fast8_t wieder zurück in uint8_t - was er 
übrigens auch machen muss, wenn irmp_get_data() einen uint8_t 
zurückliefert. Denn den Returncode muss er in einem 32-Bit-Register 
unterbringen. Das muss er dann genauso maskieren, wenn er diesen wieder 
auf 8-Bit runterbrechen muss.

Und deshalb:

So ganz habe ich auch immer noch nicht Dein Problem mit dem STM32-F105 
verstanden. Wenn in irmp.c die Definition von irmp_get_data() von der 
Deklaration in irmp.h abweicht (was ja tatsächlich ein Fehler von mir 
war), dann hätte der Compiler eigentlich aussteigen müssen. Wieso konnte 
er da fehlerhaften Code erzeugen?

Wie gesagt:

   uint8_t rtc = irmp_get_data (&irmp_data);

muss auch jetzt noch korrekt(!) funktionieren.

P.S.
Dass in den ST Libs uint32_t und nicht uint_fast8_t verwendet wird, ist 
klar: Die Systemprogrammierer brauchen auf Kompatibilität zu 8-Bit-µCs 
keine Rücksicht zu nehmen.

: Bearbeitet durch Moderator
von Jörg R. (jrie)


Lesenswert?

Hallo Frank,
wenn man deiner Argumentation folgt, müsste man, wie du selbst sagst, 
(fast) alle Variablen auf uint_fast8_t umstellen.
Ich habe es halt noch nie gesehen, dass jemand gleich alle seine 
Variablen auf uint_fast8_t umstellt, deshalb wundert mich das.
Ich kenne das eigentlich nur so, dass nur die Zeitkritischen 
umgestellt werden.
Deshalb auch meine Frage, ob tatsächlich alle, die vorher uint8_t waren 
und jetzt uint_fast8_t geworden sind, zeitkritisch sind? Das weißt du 
besser als ich :-) .
Sonst wäre das imho übers Ziel hinaus geschossen.
Gruß, Jörg
PS Das Problem mit dem F103 gab es schon seit Monaten, und es war weg, 
als ich  irmp_get_data() und irmp_ISR() auf uint_fast8_t geändert habe.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Hi Jörg,

Jörg R. schrieb:
> wenn man deiner Argumentation folgt, müsste man, wie du selbst sagst,
> (fast) alle Variablen auf uint_fast8_t umstellen.

Ja.

> Ich habe es halt noch nie gesehen, dass jemand gleich alle seine
> Variablen auf uint_fast8_t umstellt, deshalb wundert mich das.
> Ich kenne das eigentlich nur so, dass nur die Zeitkritischen
> umgestellt werden.

In einer ISR ist alles zeitkritisch ;-)

Aber mal im Ernst: Es war für mich einfacher, global im Editor 
stämtliche uint8_t-Variablen auf uint_fast8_t umzustellen und 
anschließend die wenigen Stellen, wo es unbedingt ein uint8_t sein muss, 
diese wieder zu korrigieren. Dasselbe habe ich mit uint16_t gemacht.

> Deshalb auch meine Frage, ob tatsächlich alle, die vorher uint8_t waren
> und jetzt uint_fast8_t geworden sind, zeitkritisch sind? Das weißt du
> besser als ich :-) .

Wie gesagt: In einer ISR schon. Okay, ich habe auch irmp_get_data und 
anderes umgestellt. Aber warum soll ich denn auf 32 Bit verzichten, wenn 
ich auf einem 32-Bit-µC bin?

Wäre da nicht die Kompatibilität zu AVR und PIC, hätte ich halt alles in 
ein uint32_t umgewandelt.

> Sonst wäre das imho übers Ziel hinaus geschossen.

Das sehe ich nicht so. Ich bewege mich mit den fast-Typen in der 
"natürlichen Umgebung" des µCs, d.h. ich passe mich damit optimal an die 
Register-Breite des jeweiligen µCs an. Was soll daran falsch sein? 
Ausserdem schadet die Anwendung von fast-Typen in keinster Weise - 
jedenfalls solange man sich des Wertebereichs, den man nutzt, im klaren 
ist.

Die damaligen C-Erfinder hatten damals ganz bewusst die Breite des Typs 
"int" nicht vorgeschrieben. Dieser sollte immer die Breite der 
Prozessor-Register verwenden und damit optimalen Code erzeugen.

Leider kann man mit einem "int" der Breite 8 sehr wenig anfangen. Daher 
ist ein "int" im avr-gcc auch 16 Bit breit. Es gibt aber auch 
AVR-Compiler, bei denen ein "int" tatsächlich nur 8-Bit breit ist.

Aber genau deshalb habe ich mich bei der AVR-Entwicklung des IRMP damals 
bewusst gegen "int" gestellt: 16 Bit bedeuten auf einem AVR eine 
deutliche Mehrbelastung. Hätte es diese nicht gegeben, hätte ich überall 
"int" verwendet.

Die "moderneren" fast-Typen (gibt's noch gar nicht so lange) helfen hier 
einem aus dieser Bredouille und erlauben, portablen, aber immer noch 
effizienten Code zu schreiben.

: Bearbeitet durch Moderator
von Jörg R. (jrie)


Lesenswert?

Mhm, sollte man dann generell auf den STM32 nur noch uint_fastN_t 
Variablen verwenden? Konkret, sollte ich in meinem IRMP auf STM32 
Projekt alle Variablen auf uint_fastN_t umstellen?

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Jörg R. schrieb:
> Mhm, sollte man dann generell auf den STM32 nur noch uint_fastN_t
> Variablen verwenden? Konkret, sollte ich in meinem IRMP auf STM32
> Projekt alle Variablen auf uint_fastN_t umstellen?

Nur wenn Du Dein Projekt mal auf einen 8-Bit-µC portieren willst. ;-)
Aber ich nehme nicht an, dass Du daran überhaupt denkst.

Sonst kannst Du genauso gut auch uint32_t (oder einfach "int" bzw. 
"unsigned int") wählen. Da muss man sich über Wertebereiche keine 
Gedanken machen und das Programm ist auf jeden Fall um einiges 
schneller.

von Jörg R. (jrie)


Lesenswert?

Ok, dann werde ich das gelegentlich tun ((u)int32_t).

Neulich habe ich in einem russischem Forum gelesen, dass je nachdem mit 
welchem Code man eine LED toggeln lässt, die Frequenz 2 bzw. 18 MHz ist 
(war glaube ich auf einem F4xx).
Code auf Schnelligkeit zu optimieren kann viel bringen.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Jörg R. schrieb:
> Ok, dann werde ich das gelegentlich tun ((u)int32_t).

Ja, auf einem 32-Bit-µC muss man sich vom einengenden uint8_t einfach 
lösen. Man spart nichts und hat nur Nachteile.

> Neulich habe ich in einem russischem Forum gelesen, dass je nachdem mit
> welchem Code man eine LED toggeln lässt, die Frequenz 2 bzw. 18 MHz ist
> (war glaube ich auf einem F4xx).

Ja, so etwas habe ich sogar hier in einem Thread gelesen. Auch da ging 
es um die Erzeugung einer möglichst hohen Frequenz mittels STM32. 
Quintessenz war, dass ein Funktionsaufruf von

  GPIO_WriteBit()

ein Vielfaches braucht gegenüber einer direkten Anweisung übers 
Port-Register.

Ist ja auch klar: Funktionsaufrufe bedeuten immer Overhead, solange sie 
nicht inline compiliert werden (können).

> Code auf Schnelligkeit zu optimieren kann viel bringen.

In einer ISR() auf jeden Fall. Ziel einer jeden ISR muss sein, sich 
möglichst schnell zu beenden. Die Länge des Codes spielt da eigentlich 
(entgegen vielen Aussagen anderer) keine Rolle, es kommt nur auf die 
Zeit an, die der µC in einer ISR verweilt. Diese muss möglichst kurz 
sein.

Die irmp_ISR() ist als Zustandsautomat programmiert. Daher wird immer 
nur ein kleiner Teil des Monstrums tatsächlich ausgeführt. Nur so ist es 
überhaupt möglich, eine so lange ISR zu schreiben, ohne dass die Zeit 
"überläuft".

Daher war die fast-Umstellung von IRMP für STM32 auf jeden Fall 
sinnvoll.

von Matthias F. (frank91)


Lesenswert?

gibt es mittlerweile eigentlich auch schon irmp für den xmega?

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Matthias Frank schrieb:
> gibt es mittlerweile eigentlich auch schon irmp für den xmega?

Nicht, dass ich wüsste. Sollte aber nicht so schwierig sein.

Was muss dafür getan werden:

1. Neue Timer-Initialisierungsroutine schreiben plus Timer-ISR, welche
   irmp_ISR() 15000 mal pro Sekunde aufruft.

2. Den in irmpconfig.h definierten Input-Pin initialisieren und das
   Macro input() anpassen.

Das sollte reichen. Evtl. noch ein #ifdef IRGENDWAS_MIT_XMEGA, um die 
richtigen System-Includes zu ziehen, z.B. das Pendant zu <avr/io.h> o.ä.

Willst Du es machen?

von Matthias F. (frank91)


Lesenswert?

> Willst Du es machen?
Bin gerade dabei :P

> Was muss dafür getan werden:
>
> 1. Neue Timer-Initialisierungsroutine schreiben plus Timer-ISR, welche
>    irmp_ISR() 15000 mal pro Sekunde aufruft.
>
> 2. Den in irmpconfig.h definierten Input-Pin initialisieren und das
>    Macro input() anpassen.

Die 2 Sachen hab ich getan. Das Empfangen funktioniert jetzt sogar :P
Jetzt mach ich mich dann mal an das senden.

> Das sollte reichen. Evtl. noch ein #ifdef IRGENDWAS_MIT_XMEGA, um die
> richtigen System-Includes zu ziehen, z.B. das Pendant zu <avr/io.h> o.ä.
Ich versteh nicht ganz, wie ich im Programm erkennen kann ob es es sich 
um einen Xmega oder einen normalen Mega handelt. Bis jetzt hab ich die 
ensprechenden Zeilen einfach direkt geändert, statt es für beide 
Controllertypen anzupassen

von Matthias F. (frank91)


Lesenswert?

Was genau muss ich den bei irsnd alles ändern? das kommt mir viel vor 
:-/

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Matthias Frank schrieb:
> Die 2 Sachen hab ich getan. Das Empfangen funktioniert jetzt sogar :P
> Jetzt mach ich mich dann mal an das senden.

Gratuliere. Wäre schön, wenn Du mir irgendwann Deine Änderungen 
zurückschicken würdest, damit ich sie in den allgemeinen Source 
einfließen lassen kann.

> Ich versteh nicht ganz, wie ich im Programm erkennen kann ob es es sich
> um einen Xmega oder einen normalen Mega handelt.

Für jeden µC wird im allgemeinen mindestens eine Preprocessor-Konstante 
definiert. Wenn Du zum Beispiel für einen ATmega328 übersetzt, dann 
heisst die Konstante
1
__AVR_ATmega328P__

Das heisst, man kann mit
1
#ifdef __AVR_ATmega328P__
2
....
3
#endif

prozessor-spezifischen Code einflechten. So eine Konstante wird es für 
den Xmega auch geben.

> Bis jetzt hab ich die
> ensprechenden Zeilen einfach direkt geändert, statt es für beide
> Controllertypen anzupassen

Ich kenne mich mit Xmega nicht aus, aber ich werde die Konstante schon 
finden, wenn Du mir den Xmega-Typ und die Änderungen des Codes schickst.

Matthias Frank schrieb:
> Was genau muss ich den bei irsnd alles ändern? das kommt mir viel vor

Auch hier brauchst Du den 15kHz-Timer. Aber das hast Du ja schon 
erledigt.

Dann brauchst Du noch zusätzlich einen variablen Timer, mit dem die 
IR-Modulation durch PWM erledigt wird (z.B. 38kHz für NEC-Protokoll).
Du brauchst also am Xmega einen PWM-fähigen Pin.

Dafür musst Du im wesentlichen anpassen:

  - irsnd_init() für die beiden Timer
  - irsnd_on() zum Einschalten der PWM
  - irsnd_off() zum Abschalten der PWM
  - irsnd_set_freq() zum Einstellen der PWM-Frequenz

Das sollte reichen.

von Konrad S. (maybee)


Lesenswert?

Frank M. schrieb:
> So eine Konstante wird es für
> den Xmega auch geben.
1
echo | avr-gcc -E -dDM - -mmcu=atxmega128a1 | grep -i xmega
2
#define __AVR_XMEGA__ 1
3
#define __AVR_ATxmega128A1__ 1

von Matthias F. (frank91)


Angehängte Dateien:

Lesenswert?

>
1
> echo | avr-gcc -E -dDM - -mmcu=atxmega128a1 | grep -i xmega
2
> #define __AVR_XMEGA__ 1
3
> #define __AVR_ATxmega128A1__ 1
4
>

danke, das scheint zu gehen :P

Ich lade hier jetzt einfach mal mein Projekt hoch, da ich nicht 
weiterkomme.

Aktueller Stand:
-Infrarot wird empfangen und am LCD ausgegeben.
-Infrarot LED sendet dieses Signal nun weiter. Mit der Handykamera sehe 
ich, dass die LED für einen kurzen Moment flackert. Allerdings reagiert 
kein einziges Gerät darauf :-/

Ich versteh nicht wieso...
Allerdings bin ich mir beim Erzeugen des PWM Signals unsicher ob ich 
alles richtig gemacht habe. Welcher Modus beim XMEGA kommt den dem CTC 
Modus wieder gleich (siehe Bild: Modus)?
Vlt hab ich hier auch einfach die falschen Register beschrieben und das 
PWM läuft mit einer falschen Frequenz....anderst kann ich es mir nicht 
erklären.

Ich habe (hoffentlich) alle Änderungen mit einem
# warning Hier wurde etwas veraendert
markiert, damit man meine Änderungen leichter nachvollziehen kann.

Ich denke, dass es sich nur noch um eine Kleinigkeit handeln kann^^

von Matthias F. (frank91)


Lesenswert?

achso eins noch....

ich habe die F_CPU teilweiße in manchen header dateien ganz oben noch 
einmal eingefügt, dass sie diese irgenwie nicht gefunden haben.

von Matthias F. (frank91)


Lesenswert?

Ich hab den Fehler gefunden, jetzt geht es :P
Ich schreibe alles noch ein bisschen schöner zusammen und lade es dann 
hoch.

von Matthias F. (frank91)


Angehängte Dateien:

Lesenswert?

Hier bitte sehr :P

jetzt sollte alles so passen.

Mein Verwendeter Controller ist der ATxmega128A1U.
Ich hab den Code jetzt nur auf diesen einen Controller angepasst.

Du solltest aber nochmal drüber schauen, bevor du es zu deinem Source 
Code hinzufügst:

-Die geänderten stellen habe ich markiert.
-F_CPU habe ich wie gesagt mehrmals definiert. Das ist das einzige, was 
ich noch nicht verstehe. Anderst kam immer eine Meldung, dass er dies 
nicht kennt.

von Einsteiger (Gast)


Lesenswert?

Hallo,
habe mir die Software hier runtergeladen und auch das Compilieren für 
den Mega88 läuft fehlerfrei. Einer halbstündigen Durchsicht der Doku und 
des Codes konnte ich noch nicht zweifelsfrei entnehmen, was die 
entstandene .hex, was IRMP bzw. die Beispiel-App nun eigentlich tut 
(kann ja sein daß es nach zwei Studienstunden klarer wird ;-)
Was meint denn nun Dekodieren? Was wird wo im Ergebnis ausgegeben?

von Matthias F. (frank91)


Lesenswert?

> Einer halbstündigen Durchsicht der Doku und
> des Codes konnte ich noch nicht zweifelsfrei entnehmen, was die
> entstandene .hex, was IRMP bzw. die Beispiel-App nun eigentlich tut

http://www.mikrocontroller.net/articles/IRMP
In dem Artikel ist eigentlich alles erklärt.

IRMP kann Daten von einer Infrarot Fernbedienung empfangen und 
auswerten, so dass du diese bei bedarf später wieder senden kannst.
Somit kannst du dir zum Beispiel eine eigene Universalfernbedienung oder 
ähnliches bauen :P

> Was meint denn nun Dekodieren? Was wird wo im Ergebnis ausgegeben?
In den Variablen
rmp_data.protocol
irmp_data.address
irmp_data.command
wird der dekodierte Code gespeichert.
Wenn man dokodieren ganz grob und einfach beschreiben müsste würde ich 
sagen, es wandelt das Signal so um, dass du damit es anfangen kannst.

von eku (Gast)


Lesenswert?

Hallo Frank,

ein "svn blame <datei>" liefert mir bei IRMP keine Informationen. Ich 
möchte herausfinden, mit welcher Version das Timing für das 
Siemens-Protokoll geändert wurde, denn die Erkennung ist nach wie vor 
zufällig (IRSND->IRMP). Ich habe die Einführung/Zusammenlegung mit dem 
RUWIDO in Verdacht, denn IRMP erkennt gerne RUWIDO, wenn es SIEMENS ist.

von Einsteiger (Gast)


Lesenswert?

Matthias Frank schrieb:
> In dem Artikel ist eigentlich alles erklärt.

Ja, technisch bis ins Detail- nur eine allgemeinverständliche 
Funktionsbeschreibung fehlt. Danke, daß Du die hiermit nachgeliefert 
hast.
Mit den Variablen
rmp_data.protocol
irmp_data.address
irmp_data.command
kann ich wenig anfangen, da ich IRMP nicht in eigene Projekte 
integrieren, sondern den Beispielcode als M88 Standalone-Lösung 
verwenden wollte. Darin sah ich auch was von UART-Ausgabe. Die müsste 
doch standardmäßig aktiv sein !?
Sorry für die fehlenden C-Kenntnisse ;-(

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Matthias Frank schrieb:
> jetzt sollte alles so passen.
>
> Mein Verwendeter Controller ist der ATxmega128A1U.
> Ich hab den Code jetzt nur auf diesen einen Controller angepasst.

Entschuldige bitte die späte Antwort. Ich war in der letzten Woche 
unterwegs und daher größtenteils offline.

Vielen Dank. Ich werde Deine Änderungen in den IRMP-Code einarbeiten.

Eventuell komme ich nochmal auf Dich für eine Rückfrage zurück.

> -Die geänderten stellen habe ich markiert.

Prima, das hilft.

> -F_CPU habe ich wie gesagt mehrmals definiert. Das ist das einzige, was
> ich noch nicht verstehe. Anderst kam immer eine Meldung, dass er dies
> nicht kennt.

Du solltest die Preprocessor-Variable nicht im Source, sondern im 
Projekt eintragen. Normalerweise kann man - je nach verwendeter IDE - 
eine Compiler-Option hinzufügen, wie zum Beispiel -DF_CPU=8000000L.

Das hat auch den Vorteil, dass man diese Konstante nicht über den ganzen 
Source verteilen muss. Ein Fehler ist dann bei einer Änderung 
vorprogrammiert.

von kum (Gast)


Lesenswert?

Hallo Zusammen,

nach Jahren komme ich nun endlich dazu das Projekt WordClock fertig zu 
stellen ;)

Auf der Zielgeraden taucht plötzlich doch noch ein Problem auf. In der 
IRMP-Anlernprozedur der WordClock werden die Tastendrücke der 
B&O-Fernbedienung nur sporadisch erkannt.

Was ich bisher versucht habe:

Hardware: Wordclock Steuerplatine Version 1.0, voll bestückt nach 
Teileliste

Letzte vorkomplierte SW (letzter Stand für Atmega 168) geflachst, TSOP 
1736 drangehängt und es lief sofort mit Fernbedienung aus der Wühlkiste.

TSOP 7000 drangehängt (Pinbelegung mehrfach überprüft) und die 
Anlernprozedur schlägt fehl. Einen weiteren TSOP 7000 getestet - das 
ging auch nicht. Hatte noch im Hinterkopf, dass nicht alle Protokolle 
default aktiviert sind. War dann auch so. Also Protokoll für B&O 
aktiviert, andere deaktiviert, Progmem-Errors wegen neuem AVR-GCC 
gefixt, gebaut und geflasht. Uhr läuft auch, aber Anlernprozedur wollte 
trotzdem nicht funktionieren. Also direkt an die Beinchen des TSOP Elko 
10µF parallel und 100 Ohm in Reihe als Versorgungs-Tiefpass. Auch noch 
mal ein anderen TSOP 700 getestet. Nach mehrfachen Versuchen wird 
sporadisch mal ein Tastendruck erkannt. TSOP mit ca. 30cm Zuleitung 
liegt fern der Steuerplatine.

Wo sollte ich weitermachen? Separate Schaltung bauen, um IRMP und TSOP 
7000 standalone zu testen, damit ich diesen Fehler ausschließen kann? 
Oder sollte ich die Steuerplatine untersuchen? Obwohl die mit TSOP 1736 
sofort lief.

Wäre nett, wenn jemand mir da einen Tipp geben könnte. Vielen Dank.

Kum

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

kum schrieb:
> Letzte vorkomplierte SW (letzter Stand für Atmega 168) geflachst, TSOP
> 1736 drangehängt und es lief sofort mit Fernbedienung aus der Wühlkiste.

Hm, Du meinst jetzt aber nicht die B&O-FB, oder?

> TSOP 7000 drangehängt (Pinbelegung mehrfach überprüft) und die
> Anlernprozedur schlägt fehl. Einen weiteren TSOP 7000 getestet - das
> ging auch nicht. Hatte noch im Hinterkopf, dass nicht alle Protokolle
> default aktiviert sind. War dann auch so. Also Protokoll für B&O
> aktiviert, andere deaktiviert, Progmem-Errors wegen neuem AVR-GCC
> gefixt, gebaut und geflasht.

Gut.

> Uhr läuft auch, aber Anlernprozedur wollte
> trotzdem nicht funktionieren. Also direkt an die Beinchen des TSOP Elko
> 10µF parallel und 100 Ohm in Reihe als Versorgungs-Tiefpass. Auch noch
> mal ein anderen TSOP 700 getestet. Nach mehrfachen Versuchen wird
> sporadisch mal ein Tastendruck erkannt. TSOP mit ca. 30cm Zuleitung
> liegt fern der Steuerplatine.

Der IRMP-Source im WordClock-Projekt ist schon ein paar Jährchen alt - 3 
Jahre mindestens. Könnten auch 4 Jahre sein.

> Wo sollte ich weitermachen?

Du solltest erstmal den aktuellen IRMP-Stand ins WordClock-Projekt 
einbauen. Sollte nicht sooo schwierig sein.

Du brauchst dafür:

  - irmp.c
  - irmpconfig.h
  - irmpsystem.h
  - irmpprotocols.h
  - irmp.h

Dann nochmal irmpconfig.h anpassen.

> Obwohl die mit TSOP 1736 sofort lief.

Nochmal: Welche? Tatsächlich die B&O-FB?

> Wäre nett, wenn jemand mir da einen Tipp geben könnte. Vielen Dank.

Wenn ich es recht in Erinnerung habe, läuft IRMP im WordClock-Projekt 
mit F_INTERRUPTS 10000. Das ist bei dem B&O-Protokoll ziemlich 
problematisch, da die Pulse hier ultrakurz sind, nämlich nur 200µs. Bei 
einer Abtastrate von 10000 Hz "sieht" IRMP nur 1-2 mal hintereinander, 
dass da überhaupt etwas ist.

Du könntest F_INTERRUPTS auf 15000 erhöhen. Dann werden die Pulse 
wenigstens 2-3 mal aufgezeichnet. Das bedeutet aber auch, dass Du dabei 
die Timer-Routine evtl. anpassen musst, weil beim WordClock-Projekt noch 
ganz andere Sachen als nur IRMP aus dem Timer aufgerufen wird.

Einfacher wäre es natürlich, Deine erfolgreich getestete FB plus 
TSOP1736 oder (heutzutage) TSOP31238 zu verwenden ;-)

von kum (Gast)


Lesenswert?

Frank M. schrieb:
> Der IRMP-Source im WordClock-Projekt ist schon ein paar Jährchen alt - 3
> Jahre mindestens. Könnten auch 4 Jahre sein.

Ist WordClock SW 0.13 und in der Tat deine inkludierte irmp.c von Mitte 
2010. Habe auch ein wenig länger gebraucht. Habe noch die Frontplatte 
aus deiner ersten Sammelbestellung ;) Und als es im Rahmen deiner 
IRMP-Entwicklung um das B&O-Protokoll ging, hatte dir Klaus (soweit ich 
mich erinnere) Scans zur Verfügung gestellt und ich hatte parallel das 
Datalink-Dokument im Netz entdeckt, welches aktuell noch hier im Wiki zu 
finden ist.

> Du solltest erstmal den aktuellen IRMP-Stand ins WordClock-Projekt
> einbauen. Sollte nicht sooo schwierig sein.

Ok. Mache ich.

>> Obwohl die mit TSOP 1736 sofort lief.
>
> Nochmal: Welche? Tatsächlich die B&O-FB?

Dann hätte ich vermutlich ein Sonder-Exemplar des 1736 der sooo 
breitbandig empfängt, dass er noch bis zum 13-fachen seiner Nennfrequenz 
reagiert. Spaß beiseite. Den 1736 habe ich mit einer x-beliebigen 
Fernbedienung aus der Wühlkiste - glaube es war Medion - ausprobiert. 
Lief auf Anhieb.

> Wenn ich es recht in Erinnerung habe, läuft IRMP im WordClock-Projekt
> mit F_INTERRUPTS 10000. Das ist bei dem B&O-Protokoll ziemlich
> problematisch, da die Pulse hier ultrakurz sind, nämlich nur 200µs. Bei
> einer Abtastrate von 10000 Hz "sieht" IRMP nur 1-2 mal hintereinander,
> dass da überhaupt etwas ist.
>
> Du könntest F_INTERRUPTS auf 15000 erhöhen. Dann werden die Pulse
> wenigstens 2-3 mal aufgezeichnet. Das bedeutet aber auch, dass Du dabei
> die Timer-Routine evtl. anpassen musst, weil beim WordClock-Projekt noch
> ganz andere Sachen als nur IRMP aus dem Timer aufgerufen wird.

Gefühlsmäßig kann das hinkommen, denn es erscheint mir unlogisch, wenn 
hardwareseitig sporadisch mal nen Signal durchkommt und mal nicht. 
Fühlte sich auch eher so an, als ob mal softwareseitig mal ein Frame 
erkannt wird und dann lange Zeit nicht ...

> Einfacher wäre es natürlich, Deine erfolgreich getestete FB plus
> TSOP1736 oder (heutzutage) TSOP31238 zu verwenden ;-)

Wenn alle Stricken reißen, dann werde ich genau das tun ;) So viel 
Interaktion findet später im Betrieb nun wirklich nicht statt.

Vielen Dank Frank. Für deine Hilfe, für IRMP, für WordClock, für 
Frontplatte usw.

von E. K. (eku)


Lesenswert?

Hallo Frank,

irsnd verhält sich merkwürdig:
1
./irsnd-15kHz 17 01b1 01 0
2
00001111111100001111000000001111000011111111000000001111000011111111000011110000111100000000111111110000111100001111000011110000111100001111000011110000111100001111000000001111111100001111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
3
00001111111100001111000000001111000011111111000000001111000011111111000011110000111100000000111111110000111100001111000011110000111100001111000011110000111100001111000000001111111100001111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111

Es werden zu viele Bits gesendet. Wird anscheinend durch send_trailer 
gesteuert. Was ist der Sinn?

Es wird eine Framewiederholung gesendet, obwohl das vierte Argument des 
Aufrufs 0 ist. Das passiert selbst dann, wenn ich n_auto_repetitions=0 
im Codezweig für das Protokoll setze (da steht eine 1).

Was mache ich falsch?

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

E. K. schrieb:
> irsnd verhält sich merkwürdig:

Nein, eigentlich nicht ;-)

> Es werden zu viele Bits gesendet. Wird anscheinend durch send_trailer
> gesteuert. Was ist der Sinn?

Was meinst Du mit "zu viele Bits"? Den zweiten Frame?

> Es wird eine Framewiederholung gesendet, obwohl das vierte Argument des
> Aufrufs 0 ist.

Das ist keine echte Framewiederholung, denn dann würde der zweite Frame 
in derselben Zeile stehen. Das passiert aber nur, wenn das vierte 
Argument des Aufrufs ungleich 0 ist.

Das, was Du da unter Linux siehst, ist etwas ganz anderes. Im 
Linux-main() habe ich eingebaut, dass der zu sendende Code (nicht 
unbedingt derselbe Frame!) zweimal ausgesandt wird - mit entsprechender 
Pause dazwischen.

Ich rufe einfach irsnd_send_data() zweimal auf:
1
        (void) irsnd_send_data (&irmp_data, TRUE);
2
        while (irsnd_busy)
3
        {
4
            irsnd_ISR ();
5
        }
6
        putchar ('\n');
7
#if 1 // enable here to send twice
8
        (void) irsnd_send_data (&irmp_data, TRUE);
9
        while (irsnd_busy)
10
        {
11
            irsnd_ISR ();
12
        }
13
        putchar ('\n');
14
#endif

IRSND unter Linux verhält sich daher so, als ob ein Benutzer 2x auf eine 
Taste (mit Pause dazwischen) drückt. Es handelte sich also NICHT um 
eine Framewiederholung, die zum Beispiel bei der Angabe eines "echten" 
vierten Arguments erscheint.

Warum mache ich das? Damit kann man wunderbar testen, ob bei 
Protokollen, die ein Toggle-Bit verwenden, wenn der Benutzer zweimal 
(mit Abstand) eine Taste drückt, IRSND das auch korrekt umsetzt. Aber 
das ist nur eine Anwendung. Ich möchte auch wissen, ob IRSND 
reproduzierbare Ergebnisse liefert.

Beispiel RC5:
1
./irsnd-15kHz 7 2 3 0 | ./irmp-15kHz
2
1100010000011 p= 7 (RC5), a=0x0002, c=0x0003, f=0x00  Erster Tastendruck
3
1000010000011 p= 7 (RC5), a=0x0002, c=0x0003, f=0x00  Zweiter Tastendruck
4
 ^
5
 Toggle-Bit

Siehst Du das Toggle-Bit? irmp_data.flags bleibt dabei übrigens 0x00 
(s.o.), d.h. es handelt sich um keine echte Framewiederholung.

Und jetzt das ganze mit einer Frame-Wiederholung:
1
./irsnd-15kHz 7 2 3 1 | ./irmp-15kHz
2
1100010000011 p= 7 (RC5), a=0x0002, c=0x0003, f=0x00  Erster Tastendruck
3
1100010000011 p= 7 (RC5), a=0x0002, c=0x0003, f=0x01  Halten
4
1000010000011 p= 7 (RC5), a=0x0002, c=0x0003, f=0x00  Zweiter Tastendruck
5
1000010000011 p= 7 (RC5), a=0x0002, c=0x0003, f=0x01  Halten

Jetzt passiert eine "echte" Frame-Wiederholung. Das Toggle-Bit ändert 
sich nicht bei der Wiederholung, flags ist dann auch gleich 0x01. Jetzt 
kommt der zweite Tastendruck: Das Toggle-Bit ändert sich, flags geht 
aber wieder auf 0. Hier wurde also das zweimalige längere Drücken 
einer Taste simuliert.

EDIT: Ich habe gerade dem IRMP-Artikel diese Erklärung in Auszügen 
hinzugefügt:

  http://www.mikrocontroller.net/articles/IRMP#IRSND_unter_Windows

: Bearbeitet durch Moderator
von Matthias F. (frank91)


Lesenswert?

Frank M. schrieb:

> Vielen Dank. Ich werde Deine Änderungen in den IRMP-Code einarbeiten.
>
> Eventuell komme ich nochmal auf Dich für eine Rückfrage zurück.

Entweder hast du es vergessen, keine Zeit gehabt oder es gibt wohl keine 
Rückfragen :P

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Hallo Matthias,

Matthias Frank schrieb:
> Entweder hast du es vergessen, keine Zeit gehabt oder es gibt wohl keine
> Rückfragen :P

Sorry, hatte in letzter Zeit weniger Zeit bzw. war mit anderen Sachen 
beschäftigt. Deinen Code habe ich aber mittlerweile im IRMP drin. Das 
Update kommt bis spätestens Wochenende.

Gruß,

Frank

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

So, hier ist es endlich:

Version 2.8.0:

    - Portierung auf AVR XMega

Version 2.8.1:

    - Neues Protokoll: PENTAX

SVN- und Download-Dateien sind auf dem Stand 2.8.1. Artikel ist 
aktualisiert.

Viel Spaß,

Frank

: Bearbeitet durch Moderator
von Manuel Reimer (Gast)


Lesenswert?

Hallo,

bei einer Multimedia-Anwendung (https://github.com/j1rie/IRMP_STM32 im 
Zusammenhang mit VDR und Kodi) habe ich das Problem, dass, obwohl eine 
Taste garnicht festgehalten wird, teilweise eine Tastenwiederholung 
erkannt wird.

Deshalb die Frage: Wird für RC5 bereits das Toggle-Bit unterstützt und 
wenn nein: Ab wann kann man mit einer Unterstützung rechnen?

Danke im Voraus.

von Jörg R. (jrie)


Lesenswert?


von Jörg R. (jrie)


Lesenswert?

Hier wurde ja mal was eingebaut dafür:
https://www.mikrocontroller.net/svnbrowser/irmp/irmp.c?r1=74&r2=73&pathrev=74
1
#if IRMP_SUPPORT_RC5_PROTOCOL == 1
2
            case IRMP_RC5_PROTOCOL:
3
                irmp_address &= ~0x20;                              // clear toggle bit
4
                rtc = TRUE;
5
                break;
6
#endif
https://www.mikrocontroller.net/svnbrowser/irmp/irmp.c?view=log&pathrev=74
"improved key repetition detection for RC5"

Ankündigung:
Beitrag "Re: IRMP - Infrared Multi Protocol Decoder"

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


Lesenswert?

Manuel Reimer schrieb:

> bei einer Multimedia-Anwendung (https://github.com/j1rie/IRMP_STM32 im
> Zusammenhang mit VDR und Kodi) habe ich das Problem, dass, obwohl eine
> Taste garnicht festgehalten wird, teilweise eine Tastenwiederholung
> erkannt wird.

Geht es dabei konkret um RC5?

> Deshalb die Frage: Wird für RC5 bereits das Toggle-Bit unterstützt und
> wenn nein: Ab wann kann man mit einer Unterstützung rechnen?

Wie Jörg bereits bestens recherchiert hat:

1. Das Toggle-Bit wird von IRMP u.a. als Kriterium verwendet, ob eine
   Taste kurz oder lang gedrückt wurde.

2. Das Toggle-Bit wird nicht an die Anwendung zurückgegeben. 
Stattdessen
   wird irmp_data.flag gesetzt, wenn die Taste länger gedrückt wurde.

von Jörg R. (jrie)


Lesenswert?

Hallo Frank,

bei Manuel gibt es mit Logging Probleme, die er ohne nicht hat.
Kann es sein, dass das Logging den STM32 so stark belastet, dass es zu 
falscher IR Erkennung kommt? Genauer gesagt, werden bei ihm die Flags 
falsch erkannt.

Mich erinnert das an die Probleme, die ich vor der Umstellung auf fast 
Variablen hatte.
Kann es sein, dass das Logging für den STM32 irgendwie optimiert werden 
muss?

Andererseits treten bei mir die Probleme, die Manuel hat, nicht auf.

Gruß,
Jörg

PS Mit allen Details ab hier:
http://www.vdr-portal.de/board18-vdr-hardware/board13-fernbedienungen/p1242784-irmp-auf-stm32-ein-usb-ir-empf%C3%A4nger-sender-einschalter-mit-wakeup-timer/#post1242784
und ab hier nachzulesen:
http://www.vdr-portal.de/board18-vdr-hardware/board13-fernbedienungen/p1242908-irmp-auf-stm32-ein-usb-ir-empf%C3%A4nger-sender-einschalter-mit-wakeup-timer/#post1242908

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Jörg R. schrieb:
> bei Manuel gibt es mit Logging Probleme, die er ohne nicht hat.
> Kann es sein, dass das Logging den STM32 so stark belastet, dass es zu
> falscher IR Erkennung kommt? Genauer gesagt, werden bei ihm die Flags
> falsch erkannt.

Kann ich mir eigentlich nicht vorstellen - gerade nicht beim STM32.

Aber:

Das Logging ist dafür gedacht, unbekannte Protokolle mitzuschneiden, 
damit man sie später am PC auswerten kann. Da unbekannte Protokolle ja 
eben unbekannt sind, erhebt die Software keinerlei Anspruch auf korrekte 
Funktionalität bezüglich korrektes Erkennen eines Protokolls während 
dieser Zeit. Daher schließen sich diese beiden Betriebsmodi eigentlich 
gegenseitig aus.

Eingeschaltetes Logging ist nicht für den Normalbetrieb gedacht. Manuel 
sollte es daher abschalten.

von Matthias F. (frank91)


Angehängte Dateien:

Lesenswert?

Frank M. schrieb:
> So, hier ist es endlich:
>
> Version 2.8.0:
>
>     - Portierung auf AVR XMega

Ich habe die neue Version gerade getestet. Leider haben sich dort noch
ein paar kleine Fehler eingebaut, welche behoben werden müssten.
Ich habe die abgeänderten Dateien hochgeladen, aber habe wieder
eine Warnung an den Entsprechenden stellen eingefügt, damit es
gleich ersichtlich ist.

irmp.h Zeile 24-29 bein CONCAT muss immer PORT stehen.
1
#  define IRMP_PORT_PRE                         CONCAT(PORT, IRMP_PORT_LETTER)
2
#  define IRMP_DDR_PRE                          CONCAT(PORT, IRMP_PORT_LETTER)
3
#  define IRMP_PIN_PRE                          CONCAT(PORT, IRMP_PORT_LETTER)

irsnd.c Zeile 189-191 Vor .OUT .DIR und .IN muss immer
IRSND_PORT_PRE stehen.
1
#  define IRSND_PORT                                IRSND_PORT_PRE.OUT
2
#  define IRSND_DDR                                 IRSND_PORT_PRE.DIR
3
#  define IRSND_PIN                                 IRSND_PORT_PRE.IN

irsnd.c Zeile 751 folgendes wurde vergessen:
1
# elif defined (__AVR_XMEGA__)
2
#    warning hier wurde etwas vergessen
3
    IRSND_PORT &= ~(1<<IRSND_BIT);                                              // set IRSND_BIT to low
4
    IRSND_DDR |= (1<<IRSND_BIT);                                                // set IRSND_BIT to output
5
6
    XMEGA_Timer.PER = 0xFFFF; //Topwert
7
    XMEGA_Timer.CTRLB |= TC_WGMODE_FRQ_gc; //Modus: Frequenz entspricht CTC
8
9
#       if AVR_PRESCALER == 8
10
    XMEGA_Timer.CTRLA |= TC_CLKSEL_DIV8_gc;                                           // start Timer  prescaler = 8
11
#       else
12
    XMEGA_Timer.CTRLA |= TC_CLKSEL_DIV1_gc;                                           // start Timer  prescaler = 1
13
#       endif

irsnd.c Zeile 477 und Zeile 594
IRSND_XMEGA_OC1A und IRSND_XMEGA_OC1B
wurde falsch behandelt (mein Fehler)
1
#    if (IRSND_OCx == IRSND_XMEGA_OC0A)                          // use OC0A
2
        XMEGA_Timer.CTRLB |= (1<<TC0_CCAEN_bp);                                         // Compare A 
3
#    elif (IRSND_OCx == IRSND_XMEGA_OC0B)                        // use OC0B
4
        XMEGA_Timer.CTRLB |= (1<<TC0_CCBEN_bp);                                         // Compare B 
5
#    elif IRSND_OCx == IRSND_XMEGA_OC0C                                                 // use OC0C
6
        XMEGA_Timer.CTRLB |= (1<<TC0_CCCEN_bp);                                         // Compare C
7
#    elif IRSND_OCx == IRSND_XMEGA_OC0D                                                 // use OC0D
8
        XMEGA_Timer.CTRLB |= (1<<TC0_CCDEN_bp);                                         // Compare D
9
#    elif IRSND_OCx == IRSND_XMEGA_OC1A                                                 // use OC1A
10
    XMEGA_Timer.CTRLB |= (1<<TC1_CCAEN_bp);                      // Compare A
11
#    elif IRSND_OCx == IRSND_XMEGA_OC1B                                                 // use OC1B
12
    XMEGA_Timer.CTRLB |= (1<<TC1_CCBEN_bp);                      // Compare B
1
if (IRSND_OCx == IRSND_XMEGA_OC0A)                          // use OC0A 
2
        XMEGA_Timer.CTRLB &= ~(1<<TC0_CCAEN_bp);                                        // Compare A disconnected
3
#    elif (IRSND_OCx == IRSND_XMEGA_OC0B)                        // use OC0B 
4
        XMEGA_Timer.CTRLB &= ~(1<<TC0_CCBEN_bp);                                        // Compare B disconnected
5
#    elif IRSND_OCx == IRSND_XMEGA_OC0C                                                 // use OC0C
6
        XMEGA_Timer.CTRLB &= ~(1<<TC0_CCCEN_bp);                                        // Compare C disconnected
7
#    elif IRSND_OCx == IRSND_XMEGA_OC0D                                                 // use OC0D
8
        XMEGA_Timer.CTRLB &= ~(1<<TC0_CCDEN_bp);                                        // Compare D disconnected
9
#    elif IRSND_OCx == IRSND_XMEGA_OC1A                                                 // use OC1A
10
    XMEGA_Timer.CTRLB &= ~(1<<TC1_CCAEN_bp);                                        // Compare A disconnected
11
#    elif IRSND_OCx == IRSND_XMEGA_OC1B                                                 // use OC1B
12
    XMEGA_Timer.CTRLB &= ~(1<<TC1_CCBEN_bp);                                        // Compare B disconnected

irsnd.config Zeile 98 Mir viel hier auf, dass die Timer Nummer
unnötig ist und man hier auch stattdessen direkt IRSND_PORT_PRE
angeben könnte. Außerdem war in den Kommentaren von OC0 statt
OC1 die Rede (mein Fehler).
1
*                                              IRSND_XMEGA_OC1A = OC1A on ATxmegas  supporting OC1A, e.g. ATxmega128A1U
2
 *                                              IRSND_XMEGA_OC1B = OC1B on ATxmegas  supporting OC1B, e.g. ATxmega128A1U
3
 *---------------------------------------------------------------------------------------------------------------------------------------------------
4
 */
5
#if defined(__AVR_XMEGA__)                                              // XMEGA
6
#  define IRSND_PORT_PRE      PORTD                   
7
#  define XMEGA_Timer                           TCD0
8
#  define IRSND_OCx                             IRSND_XMEGA_OC0B        // use OC0B

irsnd.c Zeile 150 dementsprechend können hier folgende Zeilen entfernt 
werden
1
//#  if (XMEGA_Timer_NR == 1)
2
//#               define IRSND_PORT_PRE               PORTC
3
//#  elif (XMEGA_Timer_NR == 2)
4
//#               define IRSND_PORT_PRE               PORTD
5
//#  elif (XMEGA_Timer_NR == 3)
6
//#               define IRSND_PORT_PRE               PORTE
7
//#  elif (XMEGA_Timer_NR == 4)
8
//#               define IRSND_PORT_PRE               PORTF
9
//#  else
10
//#    warning wrong XMEGA_Timer_NR, choose correct value in irsndconfig.h

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Matthias Frank schrieb:
> Ich habe die neue Version gerade getestet. Leider haben sich dort noch
> ein paar kleine Fehler eingebaut, welche behoben werden müssten.
> Ich habe die abgeänderten Dateien hochgeladen, aber habe wieder
> eine Warnung an den Entsprechenden stellen eingefügt, damit es
> gleich ersichtlich ist.

Vielen Dank! Ich habe die Änderungen eingebaut und das ganze als Version 
2.8.2 hochgeladen. Der Artikel und die Downloads sind aktualisiert.

Viel Spaß,

Frank

von Micha (Gast)


Lesenswert?

In irmpsystem.h nach Zeile 32 fehlt ein
#define F_CPU (SysCtlClockGet()).

von Karol B. (johnpatcher)


Lesenswert?

Hi Frank,

Frank M. schrieb:
> Der Artikel und die Downloads sind aktualisiert.

Es scheint, als ob du schon seit längerem vergessen hättest die 
Versionsnummern in der README Datei zu bumpen, oder?

Mit freundlichen Grüßen,
Karol Babioch

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Micha schrieb:
> In irmpsystem.h nach Zeile 32 fehlt ein
> #define F_CPU (SysCtlClockGet()).

Danke, habe ich nun in Version 2.8.3 hinzugefügt.

Karol Babioch schrieb:
> Es scheint, als ob du schon seit längerem vergessen hättest die
> Versionsnummern in der README Datei zu bumpen, oder?

Danke für den Hinweis. Ja, da hab ich wohl etwas geschlampt. Ist mit 
2.8.3 korrigiert.

Artikel, Downloads & SVN habe ich aktualisiert.

Viel Spaß,

Frank

von Matthias F. (frank91)


Angehängte Dateien:

Lesenswert?

Ich hab gerade die aktuelle Version noch einmal getestet.
Irgendwie hatte sich bei meiner hochgeladenen Datei doch noch
ein Fehler eingeschlichen.

So ist es jetzt aber richtig:
irsnd.c ab Zeile 471
1
#    elif IRSND_OCx == IRSND_XMEGA_OC1A          // use OC1A
2
    XMEGA_Timer.CTRLB |= (1<<TC1_CCAEN_bp);      // Compare A
3
#    elif IRSND_OCx == IRSND_XMEGA_OC1B          // use OC1B
4
    XMEGA_Timer.CTRLB |= (1<<TC1_CCBEN_bp);      // Compare B
5
#    else
6
#       error wrong value of IRSND_OCx
7
#    endif // IRSND_OCx

Ich habe in meinem Zimmer einen Ventilator, den ich steuern will. Leider 
scheint irmp das Protokoll nicht zu erkennen.
In deinem Artikel hast du geschrieben, dass du dir auch unbekannte 
Artikel anschauen würdest und diese vlt hinzufügen würdest, wenn es 
möglich ist.

Dafür muss ich aber das Protokoll per serieller Schnittstelle ausgeben.
Ich versteh aber noch nicht ganz was ich alles ändern muss, damit ich 
diese Ausgabe mit dem Xmega hinbekomme. Könntest du mir hierzu einen 
Ansatz geben?

Eine UART initialisierung beim Xmega sieht in etwas so aus:
1
void init_USART (void)
2
{
3
  //Alle Level für Prioritätensteuerung der Interrupts freigeben
4
  PMIC.CTRL |= PMIC_HILVLEN_bm|PMIC_MEDLVLEN_bm|PMIC_LOLVLEN_bm;
5
  
6
  //Einstellen der Baudrate
7
  //Formel zur Berechnung siehe Datenblatt Seite 282
8
  //9600 Baud => BSEL = 207 = 0xCF
9
  USARTC1.BAUDCTRLB = 0;
10
  USARTC1.BAUDCTRLA = 0xCF;
11
  USARTC1.CTRLA = USART_RXCINTLVL_HI_gc; // High Level (Empfangen)
12
  USARTC1.CTRLB = USART_TXEN_bm | USART_RXEN_bm; //Aktiviert Senden und Empfangen
13
  USARTC1.CTRLC = USART_CHSIZE_8BIT_gc; //Größe der Zeichen: 8 Bit
14
  PORTC.DIR |= (1<<7);  //TXD als Ausgang setzen
15
  PORTC.DIR &= ~(1<<6);
16
}

Eigentlich reicht es, wenn du diese Änderung übernimmst, sobald auch die 
Serielle Schnittstelle funktioniert.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Matthias Frank schrieb:
> Ich hab gerade die aktuelle Version noch einmal getestet.
> Irgendwie hatte sich bei meiner hochgeladenen Datei doch noch
> ein Fehler eingeschlichen.

Danke, ich habe die Korrektur ins SVN als Version 2.8.4 eingecheckt.
Die Download-Dateien werde ich bei Gelegenheit aktualisieren.

> Ich habe in meinem Zimmer einen Ventilator, den ich steuern will. Leider
> scheint irmp das Protokoll nicht zu erkennen.

Ja, die Hersteller denken sich immer wieder neue aus. ;-)

> In deinem Artikel hast du geschrieben, dass du dir auch unbekannte
> Artikel anschauen würdest und diese vlt hinzufügen würdest, wenn es
> möglich ist.

Ja, klar.

> Dafür muss ich aber das Protokoll per serieller Schnittstelle ausgeben.
> Ich versteh aber noch nicht ganz was ich alles ändern muss, damit ich
> diese Ausgabe mit dem Xmega hinbekomme. Könntest du mir hierzu einen
> Ansatz geben?

Das Prinzip ist eigentlich einfach:

1. Erweiterung von irmp_uart_init() um die µC-spezifischen
   UART-Initialisierungen, also Einbau Deiner uart_init().

2. Erweiterung von irmp_uart_putc().

Das wars. Anschließend noch IRMP_LOGGING auf 1 setzen, dann ein 
Terminal-Emulationsprogramm starten. Die 0en und 1en sollten nun 
ausgegeben werden, sobald Du eine IR-Taste drückst.

Du kopierst die Daten in eine Datei und schickst sie mir.

Aufbau:

  - Pro IR-Frame eine Zeile
  - Kommentare wie "Taste PowerOn" mit '#' einleiten

Beispiel:
1
# Taste Buuuuuuum!
2
00000000111111110000001111000001111100000.......

Weitere Beispiele findest Du im Unterverzeichnis IR-Data.

> Eigentlich reicht es, wenn du diese Änderung übernimmst, sobald auch die
> Serielle Schnittstelle funktioniert.

Fehlt nur noch eine Implementierung von irmp_uart_putc().

von Matthias F. (frank91)


Angehängte Dateien:

Lesenswert?

ok hat sogar ziemlich schnell geklappt :P

die Tasten haben irgendwie eine unterschiedliche Länge.
ich glaub das hängt damit zusammen, wie lange ich die Taste gedrückt 
gehalten haben.
Kürzer wie MODE und OSC habe ich es nicht hinbekommen.

Ich werde nächste Woche den geänderten Code hier hochladen, da ich 
schauen will ob ich ihn vlt noch übersichtlicher machen kann.

von Karol B. (johnpatcher)


Lesenswert?

Hi,

Matthias Frank schrieb:
> die Tasten haben irgendwie eine unterschiedliche Länge.
> ich glaub das hängt damit zusammen, wie lange ich die Taste gedrückt
> gehalten haben.
> Kürzer wie MODE und OSC habe ich es nicht hinbekommen.

Keine Sorge, Frank ist mitlerweile richtig fit im Dekodieren von 
IR-Protokollen :). Wenn er noch etwas braucht, dann meldet er sich 
schon. Ansonsten nimmt er das direkt in eine der nächsten Versionen auf, 
sobald er ein paar freie Augenblicke Zeit hat ;).

> Ich werde nächste Woche den geänderten Code hier hochladen, da ich
> schauen will ob ich ihn vlt noch übersichtlicher machen kann.

Was meinst du damit? Die Änderungen, die für das Logging notwendig 
waren? Ich weiß nicht so recht, inwiefern diese relevant sind bzw. Teil 
von IRMP werden sollten.

Mit freundlichen Grüßen,
Karol Babioch

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Matthias Frank schrieb:
> ok hat sogar ziemlich schnell geklappt :P

Habs gerade mit IRMP unter Linux eingelesen. Hat auch ziemlich schnell 
geklappt.... denn es ist das NUBERT-Protokoll, welches eigentlich für 
Lautsprechersysteme verwendet wird.

Ich brauche da also nichts in IRMP einzubauen. Aktiviere einfach NUBERT 
in irmpconfig.h und es wird funktionieren.

> Ich werde nächste Woche den geänderten Code hier hochladen, da ich
> schauen will ob ich ihn vlt noch übersichtlicher machen kann.

Prima.

Viel Spaß,

Frank

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Karol Babioch schrieb:
> Keine Sorge, Frank ist mitlerweile richtig fit im Dekodieren von
> IR-Protokollen :).

War noch nichtmals nötig, IRMP kannte das Protokoll bereits :-)

Ich mache mir mittlerweile Gedanken, wie der User bei der Vielzahl an 
Protokollen "seins" selber finden könnte. Mittlerweile sind wir ja bei 
über 40 Stück...

>> Ich werde nächste Woche den geänderten Code hier hochladen, da ich
>> schauen will ob ich ihn vlt noch übersichtlicher machen kann.
>
> Was meinst du damit? Die Änderungen, die für das Logging notwendig
> waren?

Ja, eine XMega-Variante fürs Logging gibt's noch nicht in IRMP. Daher 
wäre das schon wünschenswert.

Gruß,

Frank

: Bearbeitet durch Moderator
von Matthias F. (frank91)


Lesenswert?

Frank M. schrieb:

> War noch nichtmals nötig, IRMP kannte das Protokoll bereits :-)
>
> Ich mache mir mittlerweile Gedanken, wie der User bei der Vielzahl an
> Protokollen "seins" selber finden könnte. Mittlerweile sind wir ja bei
> über 40 Stück...

Ja stimmt, mit dem NUBERT-Protokoll hat es gleich funktioniert.
Allerdings nicht ganz so wie es soll. Die Taste OFF wird seltsamerweiße 
von IRMP nicht erkannt, daher bin ich auch nicht darauf gekommen, dass 
es sich um dieses Protokoll handelt, da ich nur diese eine Taste 
getestet habe.

Außerdem wird jede Taste beim senden irgendwie 2 mal vom Ventilator 
erkannt, obwohl irmp_data.flags auf 0 ist.
Sind da im Protokoll vlt noch kleine Schönheitsfehler? :P

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Matthias Frank schrieb:

> Ja stimmt, mit dem NUBERT-Protokoll hat es gleich funktioniert.
> Allerdings nicht ganz so wie es soll. Die Taste OFF wird seltsamerweiße
> von IRMP nicht erkannt, daher bin ich auch nicht darauf gekommen, dass
> es sich um dieses Protokoll handelt, da ich nur diese eine Taste
> getestet habe.

Stimmt, jetzt sehe ich das auch in Deinem Scan. Das Stop-Bit ist hier 
doppelt so lang wie die anderen. Daher wird der Frame verworfen. Das 
spricht dafür, dass Deine Ventilator-FB gar keine Stop-Bits verwendet 
und der letzte Puls noch ein weiteres Datenbit ist. Das wäre dann ein 
klarer Unterschied zu Nubert.

> Außerdem wird jede Taste beim senden irgendwie 2 mal vom Ventilator
> erkannt, obwohl irmp_data.flags auf 0 ist.
> Sind da im Protokoll vlt noch kleine Schönheitsfehler? :P

Ich habe gerade mal nachgeschaut. Original-Nubert-Lautstprecher wollen 
wohl immer mindestens 2 Frames sehen. Deshalb schickt IRSND im Fall 
NUBERT für flags=0,1,2 immer 2,4,8... Frames.

Oder derjenige, der mir die Nubert-Scans zugeschickt hat, hat leider 
immer die Tasten zu lange gedrückt und ich habe dann daraus die falschen 
Schlüsse gezogen. Kommt leider öfters vor, weil die Leute es einfach zu 
gut meinen. Auch Dir ist das bei 2 Tasten passiert ;-)

Hm, jetzt weiß ich nicht, wie ich damit umgehen soll. Wenn ich jetzt 
IRSND derart ändere, dass NUBERT-Frames nur einmal geschickt werden, 
dann kann es sein, dass Nubert-Lautsprecher die Befehle nicht mehr 
akzeptieren.

Du kannst jetzt erstmal in irmpprotocols.h ändern:

Alt:
1
#define NUBERT_FRAMES                           2                               // Nubert sends 2 frames

Neu:
1
#define NUBERT_FRAMES                           1                               // Nubert sends 1 frame

Dann sollte es bei Dir erstmal laufen - bis auf den Off-Befehl.

Am besten führe ich eine neue Protokoll-Nummer für Dein 
Ventilator-Protokoll ein, um das allgemein zu lösen. Dann kann ich beide 
Abweichungen (nur 1 Frame statt 2 und ein Datenbit mehr, aber kein 
Stop-Bit) berücksichtigen.

Ich melde mich dazu nochmal.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Matthias Frank schrieb:
> Ja stimmt, mit dem NUBERT-Protokoll hat es gleich funktioniert.
> Allerdings nicht ganz so wie es soll. Die Taste OFF wird seltsamerweiße
> von IRMP nicht erkannt, daher bin ich auch nicht darauf gekommen, dass
> es sich um dieses Protokoll handelt, da ich nur diese eine Taste
> getestet habe.
>
> Außerdem wird jede Taste beim senden irgendwie 2 mal vom Ventilator
> erkannt, obwohl irmp_data.flags auf 0 ist.
> Sind da im Protokoll vlt noch kleine Schönheitsfehler? :P

Da dies 2 gravierende Unterschiede zum NUBERT-Protokoll sind, habe ich 
nun kurzentschlossen ein neues Protokoll "FAN" eingebaut. Das 
berücksichtigt nun die Unterschiede zum Nubert-Protokoll.

Im SVN findet man nun die Version 2.9.0 mit folgenden Neuigkeiten:

  - Neues Protokoll FAN
  - Neues Protokoll MERLIN

Zip-Dateien zum Download kommen später. Erstmal reicht die SVN-Version.

Viel Spaß,

Frank

von Matthias F. (frank91)


Angehängte Dateien:

Lesenswert?

Ich habe nun folgende 2 Unterprogramme entsprechend ergänzt.

irmp_uart_init
1
#elif defined (__AVR_XMEGA__)
2
3
  PMIC.CTRL |= PMIC_HILVLEN_bm;
4
5
  USARTC1.BAUDCTRLB = 0;
6
  USARTC1.BAUDCTRLA = F_CPU /153600-1;
7
  USARTC1.CTRLA = USART_RXCINTLVL_HI_gc; // High Level (Empfangen)
8
  USARTC1.CTRLB = USART_TXEN_bm | USART_RXEN_bm; //Aktiviert Senden und Empfangen
9
  USARTC1.CTRLC = USART_CHSIZE_8BIT_gc; //Größe der Zeichen: 8 Bit
10
  PORTC.DIR |= (1<<7);  //TXD als Ausgang setzen
11
  PORTC.DIR &= ~(1<<6);
12
  
13
#else

irmp_uart_putc
1
#if (IRMP_EXT_LOGGING == 0)
2
  
3
  #  if defined (__AVR_XMEGA__)
4
  while (!(USARTC1.STATUS & USART_DREIF_bm));
5
  USARTC1.DATA = ch;

Reicht es dir, wenn ich hier die Register direkt beschreibe? Weil du die 
initialisierungen immer mithilfe von Defines gelöst hast?

von Matthias F. (frank91)


Lesenswert?

Frank M. schrieb:
> Auch Dir ist das bei 2 Tasten passiert ;-)
Ja ich hatte schon versucht die Tasten nur kurz zu drücken aber 
irgendwie hab ich es bei 2 nicht ganz hinbekommen xD

> Du kannst jetzt erstmal in irmpprotocols.h ändern:
> Dann sollte es bei Dir erstmal laufen - bis auf den Off-Befehl.

ja richtig, wenn ich NUBER_FRAMES ändere geht alles bis auf den Off 
Befehl :P

> Am besten führe ich eine neue Protokoll-Nummer für Dein
> Ventilator-Protokoll ein, um das allgemein zu lösen. Dann kann ich beide
> Abweichungen (nur 1 Frame statt 2 und ein Datenbit mehr, aber kein
> Stop-Bit) berücksichtigen.

Hier scheinen noch Fehler zu sein:

implicit declaration of function 'ANALYZE_PRINTF'
und
undefined reference to ANALYZE_PRINTF'
Da ich nicht wusste, was das bewirkt hatte ich es einfach mal 
auskommentiert.
Gehört das überhaupt da hin?

Die einzelnen Tasten werden jetzt alle erfolgreich erkannt.
Aber wenn ich sie versuche zu senden reagiert der Ventilator jetzt 
überhaupt nicht mehr :-/

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Matthias Frank schrieb:
> Ich habe nun folgende 2 Unterprogramme entsprechend ergänzt.

Vielen Dank, habe ich so übernommen. Ist in Version 2.9.1 (SVN).

> Reicht es dir, wenn ich hier die Register direkt beschreibe? Weil du die
> initialisierungen immer mithilfe von Defines gelöst hast?

Die Defines für ATmegas sind nur dafür da, um die unterschiedlichen 
Bezeichnungen der einzelnen UART-Register auszugleichen. Da herrscht in 
der ATmega-Welt ziemliches Chaos. Ich hoffe, dass Atmel hier bei den 
XMegas etwas klüger war...

Matthias Frank schrieb:
> ja richtig, wenn ich NUBER_FRAMES ändere geht alles bis auf den Off
> Befehl :P

Prima, dann sind wir ja auf dem richtigen Weg.

> Hier scheinen noch Fehler zu sein:
>
> implicit declaration of function 'ANALYZE_PRINTF'
> und
> undefined reference to ANALYZE_PRINTF'
> Da ich nicht wusste, was das bewirkt hatte ich es einfach mal
> auskommentiert.
> Gehört das überhaupt da hin?

Ja, das gehört da hin, aber bedingt. Nämlich nur für Linux und Windows. 
Hier werden zusätzliche Analyse-Meldungen ausgegeben, die fürs Debugging 
und Verständnis ziemlich hilfreich sind. Ich habe das in 2.9.1 
korrigiert.

> Die einzelnen Tasten werden jetzt alle erfolgreich erkannt.

Gut.

> Aber wenn ich sie versuche zu senden reagiert der Ventilator jetzt
> überhaupt nicht mehr :-/

Ich habe nun in 2.9.1 folgende Änderungen vorgenommen:

  - Deine Scans neu ausgemessen und die Timings für FAN angepasst
  - Die Pausen zwischen den Frames von 35ms auf 6,6ms gekürzt.

Teste bitte die neue Version nochmal. Sollte es damit immer noch nicht 
gehen, will Dein Ventilator offenbar zumindest bei einigen Kommandos 
doch eine Frame-Wiederholung. Lasse dann bitte IRSND noch einen 
Wiederholungsframe senden, indem Du flags auf 1 setzt. Sollte es erst 
dann funktionieren, haben wir dann evtl. das Dilemma, dass der 
Ventilator einige Befehle ohne Wiederholung versteht, bei anderen 
Befehlen wohl aber doch zwingend eine Wiederholung haben möchte. Denn Du 
sagtest ja, dass der Ventilator manche Befehle 2-fach ausführt beim 
NUBERT-Protokoll.

Auf das Ergebnis bin ich gespannt.

von Matthias F. (frank91)


Lesenswert?

Frank M. schrieb:
> Auf das Ergebnis bin ich gespannt.

Supi vielen dank. Jetzt geht alles so wie es soll :P

Einen kleinen Schönheitsfehler gibt es noch. Wenn NUBERT und FAN 
gleichzeitig aktiviert ist wird jeder Tastendruck als NUBERT erkannt und 
die Off Taste wird nicht erkannt.

Vielleicht sollte man es so machen, dass man nur eines von beiden 
aktivieren kann.

In der Version hast 2.9.1 hast du außerdem standartmäßig das Protokoll 
Fan schon aktiviert. Das kannst du ja theoretisch bei den nächsten 
Versionen wieder abschalten.

>Die Defines für ATmegas sind nur dafür da, um die unterschiedlichen
>Bezeichnungen der einzelnen UART-Register auszugleichen. Da herrscht in
>der ATmega-Welt ziemliches Chaos. Ich hoffe, dass Atmel hier bei den
>XMegas etwas klüger war...

Ich habe gerade noch mal bei einem anderem Controller der Xmega Serie 
geschaut. Da schienen die Register alle gleich zu sein. Was halt denke 
ich vielleicht sein kann ist dass es den Port C nicht gibt (an diesem 
ich den Uart verwende). Dann würde man aber an entsprechender Stelle 
eine Fehlermeldung bekommen.

Da die Register alle gleich zu seinen scheinen kann man auch folgendes 
ändern um auch andere Controller lauffähig zu bekommen:

irsnd.c Zeile 148
statt
1
#elif defined (__AVR_ATxmega128A1U__)
das hier
1
#elif defined (__AVR_XMEGA__)                               // ATxmega

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Matthias Frank schrieb:

> Supi vielen dank. Jetzt geht alles so wie es soll :P

Freut mich :-)

> Einen kleinen Schönheitsfehler gibt es noch. Wenn NUBERT und FAN
> gleichzeitig aktiviert ist wird jeder Tastendruck als NUBERT erkannt und
> die Off Taste wird nicht erkannt.

Ja, ich werde FAN automatisch deaktivieren, wenn NUBERT aktiviert ist.

> In der Version hast 2.9.1 hast du außerdem standartmäßig das Protokoll
> Fan schon aktiviert. Das kannst du ja theoretisch bei den nächsten
> Versionen wieder abschalten.

Ja, ich hatte vergessen, es nach dem Testen wieder abzuschalten. Nicht 
sooo schlimm. In 2.9.2 ist es wieder weg.

> Da die Register alle gleich zu seinen scheinen kann man auch folgendes
> ändern um auch andere Controller lauffähig zu bekommen:
>
> irsnd.c Zeile 148
> statt
>
1
> #elif defined (__AVR_ATxmega128A1U__)
2
>
> das hier
>
1
> #elif defined (__AVR_XMEGA__)                               // ATxmega
2
>

Okay, dann mache ich das so.

Gruß und Dank,

Frank

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Neue Version 2.9.2 ist online, sowohl zum Download als auch im SVN.

Änderungen:

  - Neues Protokoll S100
  - Kleinere Korrekturen (s. letztes Posting)

Den Artikel zu IRMP habe ich aktualisiert.

Viel Spaß,

Frank

von Matthias L. (mcl024)


Angehängte Dateien:

Lesenswert?

Hallo Zusammen,

hat jemand ne Idee was das für ein Protokoll sein könnte (siehe 
Excel-Sheet). Es handelt sich hierbei um ein 33 kHz Signal welches 
vermutlich über die Pulseweite arbeitet und immer die gleiche 
Pausenlänge hat.

Pause: ca. 300us
Puls lang: ca. 1300us
Puls kurz: ca. 900us

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Matthias Laubnitz schrieb:
> hat jemand ne Idee was das für ein Protokoll sein könnte (siehe
> Excel-Sheet). Es handelt sich hierbei um ein 33 kHz Signal welches
> vermutlich über die Pulseweite arbeitet und immer die gleiche
> Pausenlänge hat.
>
> Pause: ca. 300us
> Puls lang: ca. 1300us
> Puls kurz: ca. 900us

Das einzige Pulse Width Protokoll, welches ich in IRMP implementiert 
habe, ist SIRCS von Sony. In Deiner Aufzeichnung fehlt aber ein 
ausgezeichnetes Start-Bit mit einer abweichenden Länge. Ich gehe also 
davon aus, dass Dein Protokoll gar kein besonderes Start-Bit hat. Von 
daher kann das schon kein SIRCs sein.

Wenn Du möchtest, kann ich das Protokoll in IRMP einbauen. Dazu müsstest 
Du mit IRMP Scans erstellen und mir dann schicken. Wie das geht, findest 
Du im IRMP-Artikel:

  https://www.mikrocontroller.net/articles/IRMP#Scannen_von_unbekannten_IR-Protokollen

von gnuopfer (Gast)


Lesenswert?

Hallo,

Ich hab seit Neuestem einen Badezimmerheizkörper bei dem der Thermostat 
über IR angebunden ist. Typ ist "Milux IR Chrono-Thermostat"; (in etwa: 
http://ecommerce.nes-france.com/telecommande/13-stone-digit-anthracite.html)
Hat jemand dieses Gerät schon mal mit IRMP zum laufen gebracht ? Im Netz 
ist nichts zum verwendeten Protokoll zu finden.

mfg,

  gnuopfer

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

gnuopfer schrieb:
> Hallo,
>
> Ich hab seit Neuestem einen Badezimmerheizkörper bei dem der Thermostat
> über IR angebunden ist. Typ ist "Milux IR Chrono-Thermostat"; (in etwa:
> http://ecommerce.nes-france.com/telecommande/13-stone-digit-anthracite.html)
> Hat jemand dieses Gerät schon mal mit IRMP zum laufen gebracht ? Im Netz
> ist nichts zum verwendeten Protokoll zu finden.

Schicke mir am besten IR-Scans - aufgenommen mit IRMP und IRMP_LOGGING = 
1, siehe Artikel.

Dann kann ich Dir sagen, ob IRMP das Protokoll versteht. Wenn nicht, 
kann ich es einbauen.

Gruß,

Frank

von Matthias L. (mcl024)


Angehängte Dateien:

Lesenswert?

Frank M. schrieb:
> Matthias Laubnitz schrieb:
>> hat jemand ne Idee was das für ein Protokoll sein könnte (siehe
>> Excel-Sheet). Es handelt sich hierbei um ein 33 kHz Signal welches
>> vermutlich über die Pulseweite arbeitet und immer die gleiche
>> Pausenlänge hat.
>>
>> Pause: ca. 300us
>> Puls lang: ca. 1300us
>> Puls kurz: ca. 900us
>
> Das einzige Pulse Width Protokoll, welches ich in IRMP implementiert
> habe, ist SIRCS von Sony. In Deiner Aufzeichnung fehlt aber ein
> ausgezeichnetes Start-Bit mit einer abweichenden Länge. Ich gehe also
> davon aus, dass Dein Protokoll gar kein besonderes Start-Bit hat. Von
> daher kann das schon kein SIRCs sein.
>
> Wenn Du möchtest, kann ich das Protokoll in IRMP einbauen. Dazu müsstest
> Du mit IRMP Scans erstellen und mir dann schicken. Wie das geht, findest
> Du im IRMP-Artikel:
>
> 
https://www.mikrocontroller.net/articles/IRMP#Scannen_von_unbekannten_IR-Protokollen

Hallo Frank,

ich habe den IRMP am laufen und meine Fernbedienung für das Klimagerät 
gescannt.
Ich hoffe du erkennst darin mehr als ich.
Bei Fragen meld dich einfach!

Vielen Dank schonmal!

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Matthias Laubnitz schrieb:
> Frank M. schrieb:
>> Matthias Laubnitz schrieb:
>>> Pause: ca. 300us
>>> Puls lang: ca. 1300us
>>> Puls kurz: ca. 900us

Hab mal kurz drübergeschaut. Du scheinst Puls und Pause verwechselt zu 
haben. Die TSOPs arbeiten active low.

irmp -a zeigt mir:

Start-Puls: 390µs
Start-Pause: 950µs

Daten-Puls:    390µs
Daten-Pause 0: 950µs
Daten-Pause 1: 1300µs

Scheint tatsächlich was neues zu sein, auf jeden Fall ist die Zuordnung 
nicht eindeutig. Das Protokoll kann ich gerne einbauen. Was ist das für 
ein Klimagerät? Hast Du da eine Bezeichnung? Ich brauche einen Namen für 
das Kind ;-)

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Zusatz:

Der Decoder für die Klima-Anlage läuft schon mal. Jetzt habe ich "nur" 
noch das Problem, dass ich die 70 Datenbits in 16 verfügbare Adress- und 
16 verfügbare Kommando-Bits quetschen muss. Da muss ich noch nach 
Redundanzen suchen. Auf den ersten Blick sind jedenfalls jede Menge 
nicht genutzter 0-Bits drin. Außerdem scheint es mindestens zwei 
Toggle-Bits zu geben. Außerdem 4 CRC-Bits.

Wird noch etwas dauern, bis ich die Systematik komplett durchschaut 
habe.

: Bearbeitet durch Moderator
von Matthias L. (mcl024)


Lesenswert?

Hey das klingt ja super!
Vielen Dank schonmal!

Also ich kann dir auch noch mehr Funktionen scannen.
Es ist ein Klimagerät mit der Bezeichnung ACP-24 von der Firma Stiebel 
Eltron.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Matthias Laubnitz schrieb:
> ich habe den IRMP am laufen und meine Fernbedienung für das Klimagerät
> gescannt.
> Ich hoffe du erkennst darin mehr als ich.
> Bei Fragen meld dich einfach!

Für die Temperatur-Änderungen ergeben sich folgende Werte:
1
# Temperatur plus 1 Grad:
2
0011001 000010000000010001 ... 1000 p=46 (KLIMA), a=0x000c, c=0x8402, f=0x00
3
-------------------------------------------------------------------
4
# Temperatur plus 1 Grad:
5
0011001 000010000000010001 ... 1001 p=46 (KLIMA), a=0x000c, c=0x8402, f=0x00
6
-------------------------------------------------------------------
7
# Temperatur plus 1 Grad:
8
0011001 000010000000010010 ... 1010 p=46 (KLIMA), a=0x000c, c=0x8402, f=0x00
9
-------------------------------------------------------------------
10
# Temperatur minus 1 Grad:
11
0011001 000010000000010011 ... 1001 p=46 (KLIMA), a=0x000c, c=0x8402, f=0x00
12
-------------------------------------------------------------------
13
# Temperatur minus 1 Grad:
14
0011001 000010000000010011 ... 1000 p=46 (KLIMA), a=0x000c, c=0x8402, f=0x00
15
-------------------------------------------------------------------
16
# Temperatur minus 1 Grad:
17
0011001 000010000000010011 ... 0111 p=46 (KLIMA), a=0x000c, c=0x8402, f=0x00

(die vielen 0en habe ich mal auf "..." gekürzt).

Wenn man sich die letzten 4 Bits anschaut (die hinter dem "..."), wird 
diese Zahl bei "Temperatur plus 1 Grad" hochgezählt, bei "Temperatur 
minus 1 Grad" heruntergezählt. Das sieht für mich so aus, als ob die 
Temperatur mit absoluten Werten übertragen wird.

Jetzt meine Fragen:

  - Hat die Fernbedienung vielleicht ein Display, auf welchem die
    eingestellte Temperatur angezeigt wird? Anders kann ich mir die
    Übertragung absoluter statt relativer Werte nicht erklären.

  - Was möchtest Du erreichen? Eine Fernsteuerung der Klima-Anlage
    per IRSND? Dann ist es zwingend erforderlich, die Bits zu
    entschlüsseln. Ich bräuchte dann parallel zu den Temperatur-Scans
    auch noch die Angabe, was das Display als Temperatur anzeigt.
    Die meisten Klimaanlagen fangen bei 15°C = 0000 an und zählen
    dann in 0,5°C- oder 1°C-Schritten hoch bis 1111.

: Bearbeitet durch Moderator
von Matthias L. (mcl024)


Lesenswert?

Frank M. schrieb:
> - Hat die Fernbedienung vielleicht ein Display, auf welchem die
>     eingestellte Temperatur angezeigt wird? Anders kann ich mir die
>     Übertragung absoluter statt relativer Werte nicht erklären.

Ja genau die Fernbedienung hat ein Display auf welchem sämtliche 
Einstellungen angezeigt werden, unter anderem auch die Temperatur.

Siehe auch das zweite Foto hier: 
https://www.stiebel-eltron.de/de/home/produkte-loesungen/klima/klimageraete/lokale_raumklimageraete/lokales_kompakt-raumklimageraetacp24mitzweischlauch-technik-funk/acp_24_2.html#product-detail-layer

Frank M. schrieb:
> - Was möchtest Du erreichen? Eine Fernsteuerung der Klima-Anlage
>     per IRSND? Dann ist es zwingend erforderlich, die Bits zu
>     entschlüsseln. Ich bräuchte dann parallel zu den Temperatur-Scans
>     auch noch die Angabe, was das Display als Temperatur anzeigt.
>     Die meisten Klimaanlagen fangen bei 15°C = 0000 an und zählen
>     dann in 0,5°C- oder 1°C-Schritten hoch bis 1111.

Ich möchte das Klimagerät Internetfähig machen. Also mit einem ESP8266 
eine IR-LED ansteuern. Dazu muss ich die Schnittstelle kennen. Leider 
bin ich mir nicht mehr ganz sicher bei welcher Temperatur ich gescannt 
habe. Meine aber das es über 18°C war und unter 25°C. Ich kann heute 
Abend allerdings noch die genauen Werte posten.

: Bearbeitet durch User
von Matthias L. (mcl024)


Lesenswert?

Noch ne Frage:
Wo findest du denn die Kombination 1010 oder 1001?

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Matthias Laubnitz schrieb:
> Ja genau die Fernbedienung hat ein Display auf welchem sämtliche
> Einstellungen angezeigt werden, unter anderem auch die Temperatur.

Okay, das erklärt einiges.

> Siehe auch das zweite Foto hier:
> 
https://www.stiebel-eltron.de/de/home/produkte-loesungen/klima/klimageraete/lokale_raumklimageraete/lokales_kompakt-raumklimageraetacp24mitzweischlauch-technik-funk/acp_24_2.html#product-detail-layer

Danke, jetzt kann ich mir das besser vorstellen. Ich nenne das Protokoll 
dann ACP24.

> Ich möchte das Klimagerät Internetfähig machen. Also mit einem ESP8266
> eine IR-LED ansteuern.

Spannend! Okay, das ist sehr sinnvoll. Sobald wir die Bedeutung der Bits 
geknackt haben, baue ich das Protokoll auch noch in IRSND ein.

> Leider
> bin ich mir nicht mehr ganz sicher bei welcher Temperatur ich gescannt
> habe. Meine aber das es über 18°C war und unter 25°C. Ich kann heute
> Abend allerdings noch die genauen Werte posten.

Das wäre auf jeden sinnvoll. Ich brauche nur 2 Temperatur-Werte und die 
dazugehörenden Scans, damit wir den Offset haben. Deine FB macht 
1°C-Schritte, dann könnte das zum Beispiel so aussehen:

0000 15°C
0001 16°C
0010 17°C
0011 18°C
....
1111 30°C

Welche ist bei Dir die niedrigste und die höchste Temperatur, die Du 
einstellen kannst? Die Antwort könnte den Scan schon erübrigen, wenn die 
Differenz zwischen Maximal- und Minimalwert genau 15 ergibt ;-)

Matthias Laubnitz schrieb:
> Noch ne Frage:
> Wo findest du denn die Kombination 1010 oder 1001?

Die finde nicht ich, sondern IRMP (unter Linux) aus den Scans, nachdem 
ich das Protokoll in IRMP eingebaut habe. IRMP erzeugt dann aus den 
Puls-/Pause-Paaren:

   390µS Puls /  950µs Pause eine 0
   390µS Puls / 1350µs Pause eine 1

Daraus ergibt sich dann ein Bitmuster, das ein Mensch aus den Scans 
nicht unbeding sofort erkennen kann.
1
# Einschalten
2
# ADR  P      ?          ?????     TTTT
3
001100 1 0000 1 00000000 00100 ... 0111 p=46 (KLIMA), a=0x000c, c=0x8400, f=0x00
4
001100 1 0000 1 00000000 00111 ... 0111 p=46 (KLIMA), a=0x000c, c=0x8400, f=0x00
5
001100 1 0000 1 00000000 10000 ... 0111 p=46 (KLIMA), a=0x000c, c=0x8402, f=0x00
6
001100 1 0000 1 00000000 10110 ... 0111 p=46 (KLIMA), a=0x000c, c=0x8402, f=0x00
7
-------------------------------------------------------------------
8
# Ausschalten
9
# ADR  P      ?          ?????     TTTT
10
001100 0 0000 1 00000000 00101 ... 0111 p=46 (KLIMA), a=0x000c, c=0x0400, f=0x00
11
001100 0 0000 1 00000000 01001 ... 0111 p=46 (KLIMA), a=0x000c, c=0x0401, f=0x00
12
001100 0 0000 1 00000000 10000 ... 0111 p=46 (KLIMA), a=0x000c, c=0x0402, f=0x00
13
001100 0 0000 1 00000000 10110 ... 0111 p=46 (KLIMA), a=0x000c, c=0x0402, f=0x00
14
-------------------------------------------------------------------
15
# Temperatur plus 1 Grad:
16
# ADR  P      ?          ?????     TTTT
17
001100 1 0000 1 00000000 10001 ... 1000 p=46 (KLIMA), a=0x000c, c=0x8402, f=0x00
18
001100 1 0000 1 00000000 10001 ... 1001 p=46 (KLIMA), a=0x000c, c=0x8402, f=0x00
19
001100 1 0000 1 00000000 10010 ... 1010 p=46 (KLIMA), a=0x000c, c=0x8402, f=0x00
20
001100 1 0000 1 00000000 11001 ... 1011 p=46 (KLIMA), a=0x000c, c=0x8403, f=0x00
21
001100 1 0000 1 00000000 11001 ... 1100 p=46 (KLIMA), a=0x000c, c=0x8403, f=0x00
22
001100 1 0000 1 00000000 11001 ... 1101 p=46 (KLIMA), a=0x000c, c=0x8403, f=0x00
23
-------------------------------------------------------------------
24
# Temperatur minus 1 Grad:
25
# ADR  P      ?          ?????     TTTT
26
001100 1 0000 1 00000000 11000 ... 1100 p=46 (KLIMA), a=0x000c, c=0x8403, f=0x00
27
001100 1 0000 1 00000000 11000 ... 1011 p=46 (KLIMA), a=0x000c, c=0x8403, f=0x00
28
001100 1 0000 1 00000000 11000 ... 1010 p=46 (KLIMA), a=0x000c, c=0x8403, f=0x00
29
001100 1 0000 1 00000000 10011 ... 1001 p=46 (KLIMA), a=0x000c, c=0x8402, f=0x00
30
001100 1 0000 1 00000000 10011 ... 1000 p=46 (KLIMA), a=0x000c, c=0x8402, f=0x00
31
001100 1 0000 1 00000000 10011 ... 0111 p=46 (KLIMA), a=0x000c, c=0x8402, f=0x00

Die FB sendet nicht wie andere FBs nur einfach ein Kommando, sondern 
sendet bei jedem Tastendruck (egal welchem) ALLE Daten mit ihren 
Absolutwerten komplett.

Folgende Bits habe ich bereits identifiziert:

ADR  = Geräteadresse
P    = Power, 1=ein, 0=aus
TTTT = Temperatur in 1°C-Schritten, vermutlich 0000=15°, 1111=30°

Wenn Du zum Beispiel "Temp-Plus" drückst, wird auch der Power-Zustand 
übertragen. Oder wenn Du ein- bzw. ausschaltest, wird auch die 
Temperatur (hier 0111) übertragen.

Was jedoch noch komplett unklar ist, ist der ?????-Block. Hier werden 
scheinbar willkürliche 5 Bits übertragen, die sich dauernd ändern. 
Vielleicht sind die egal und IRSND kann sie mit irgendwelchen 
Phantasiewerten füllen. Aber besser wäre es, die Bedeutung 
herauszufinden, bevor wir noch zufälligerweise den 
Selbstzerstörungsmechanismus der Anlage auslösen ;-)

Da noch andere Tasten auf der FB sind, wäre es praktisch, wenn Du diese 
auch mal scannen würdest - auch wenn Du sie später nicht brauchst. 
Vielleicht finden wir dann mehr heraus und das Puzzle fügt sich dann 
zusammen.

: Bearbeitet durch Moderator
von Matthias L. (mcl024)


Angehängte Dateien:

Lesenswert?

Ok hier auf die schnelle den Rest! Morgen wieder mehr Kommentar :-)

von gnuopfer (Gast)


Lesenswert?

Frank M. schrieb:
> Schicke mir am besten IR-Scans - aufgenommen mit IRMP und IRMP_LOGGING =
> 1, siehe Artikel.
>
> Dann kann ich Dir sagen, ob IRMP das Protokoll versteht. Wenn nicht,
> kann ich es einbauen.

Danke & gut zu wissen. Allerdins hat die Anbindung des Heizkörpers an 
die Haussteuerung (darum gehts eigentlich :-) ) derzeit noch keine 
Priorität. Wenn es soweit ist werde ich mir das Protokoll auch selbst 
mal ansehen. Der Sender und Empfänger ist ein recht billig wirkender 
Aufbau, ich glaube nicht dass da etwas hochspezielles verbaut ist.

mfg

von Joachim B. (jar)


Lesenswert?

Matthias Laubnitz schrieb:
> Ja genau die Fernbedienung hat ein Display auf welchem sämtliche
> Einstellungen angezeigt werden, unter anderem auch die Temperatur.

wenn du aber nur + und - 1°C senden kannst kennst du nicht die absolute 
Temperatur.

Im Heizkörperthermostaten Thread wurde das so gelöst das erst mal x 
Schritte rückwärts gegangen wurde, mehr Schritte als nötig und dann die 
entsprechenden Schritte vorwärts das ein Sender auch die absolute 
anzeigen kann da er ja keine Rückmeldung bekommt.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Joachim B. schrieb:
> Matthias Laubnitz schrieb:
>> Ja genau die Fernbedienung hat ein Display auf welchem sämtliche
>> Einstellungen angezeigt werden, unter anderem auch die Temperatur.
>
> wenn du aber nur + und - 1°C senden kannst kennst du nicht die absolute
> Temperatur.

Die FB sendet aber kein + und -, sondern die absolute Temperatur. Diese 
ist offenbar in der FB gespeichert. Bei + wird sie intern inkrementiert 
und dann der absolute Wert geschickt.

Was aber auf jeden Fall Verwirrung geben kann: Wenn IRSND eine 
abweichtende Temperatur sendet, dann zeigt die IR-Fernbedienunng immer 
noch die alte Temperatur an. Drückt man dann Plus, wird die interne 
FB-Temperatur hochgezählt und nicht die in der Klimaanlage zuletzt 
empfangene.

Ich habe die neuen Scans mittlerweile ausgewertet:
1
# Einschalten
2
N VVMMM    ? ???    t vmA x                 y                     TTTT
3
0011001000010000000000100000000000000000000000000000000000000000000111 p=46 (ACP24), a=0x0000, c=0x8007, f=0x00, power on, temp=22
4
0011001000010000000000111000000000000000000000000000000000000000000111 p=46 (ACP24), a=0x0000, c=0x8007, f=0x00, power on, temp=22
5
0011001000010000000010000000000000000000000000000000000000000000000111 p=46 (ACP24), a=0x0000, c=0x8007, f=0x00, power on, temp=22
6
0011001000010000000010110000000000000000000000000000000000000000000111 p=46 (ACP24), a=0x0000, c=0x8007, f=0x00, power on, temp=22
7
0011001000010000000010110000000000000000000000000000000000000000000111 p=46 (ACP24), a=0x0000, c=0x8007, f=0x00, power on, temp=22
8
----------------------------------------------------------------------
9
# Ausschalten
10
N VVMMM    ? ???    t vmA x                 y                     TTTT
11
0011000000010000000000101000000000000000000000000000000000000000000111 p=46 (ACP24), a=0x0000, c=0x0007, f=0x00, power off, temp=22
12
0011000000010000000001001000000000000000000000000000000000000000000111 p=46 (ACP24), a=0x0000, c=0x0007, f=0x00, power off, temp=22
13
0011000000010000000010000000000000000000000000000000000000000000000111 p=46 (ACP24), a=0x0000, c=0x0007, f=0x00, power off, temp=22
14
0011000000010000000010110000000000000000000000000000000000000000000111 p=46 (ACP24), a=0x0000, c=0x0007, f=0x00, power off, temp=22
15
0011000000010000000010110000000000000000000000000000000000000000000111 p=46 (ACP24), a=0x0000, c=0x0007, f=0x00, power off, temp=22
16
----------------------------------------------------------------------
17
# Temperatur plus 1 Grad:
18
N VVMMM    ? ???    t vmA x                 y                     TTTT
19
0011001000010000000010001000000000000000000000000000000000000000001000 p=46 (ACP24), a=0x0000, c=0x8008, f=0x00, power on, temp=23
20
0011001000010000000010001000000000000000000000000000000000000000001001 p=46 (ACP24), a=0x0000, c=0x8009, f=0x00, power on, temp=24
21
0011001000010000000010010000000000000000000000000000000000000000001010 p=46 (ACP24), a=0x0000, c=0x800a, f=0x00, power on, temp=25
22
0011001000010000000011001000000000000000000000000000000000000000001011 p=46 (ACP24), a=0x0000, c=0x800b, f=0x00, power on, temp=26
23
----------------------------------------------------------------------
24
# Temperatur minus 1 Grad:
25
N VVMMM    ? ???    t vmA x                 y                     TTTT
26
0011001000010000000010011000000000000000000000000000000000000000001001 p=46 (ACP24), a=0x0000, c=0x8009, f=0x00, power on, temp=24
27
0011001000010000000010011000000000000000000000000000000000000000001000 p=46 (ACP24), a=0x0000, c=0x8008, f=0x00, power on, temp=23
28
0011001000010000000010011000000000000000000000000000000000000000000111 p=46 (ACP24), a=0x0000, c=0x8007, f=0x00, power on, temp=22
29
0011001000010000000011000000000000000000000000000000000000000000001100 p=46 (ACP24), a=0x0000, c=0x800c, f=0x00, power on, temp=27
30
0011001000010000000011000000000000000000000000000000000000000000001011 p=46 (ACP24), a=0x0000, c=0x800b, f=0x00, power on, temp=26
31
0011001000010000000011000000000000000000000000000000000000000000001010 p=46 (ACP24), a=0x0000, c=0x800a, f=0x00, power on, temp=25
32
----------------------------------------------------------------------
33
# Einschalten mit 18 Grad
34
N VVMMM    ? ???    t vmA x                 y                     TTTT
35
0011001000000111000000000000000000000000000000000000000000000000000011 p=46 (ACP24), a=0x0000, c=0x8003, f=0x00, power on, temp=18
36
----------------------------------------------------------------------
37
# Erhoehen auf 19 Grad
38
N VVMMM    ? ???    t vmA x                 y                     TTTT
39
0011001000000111000000000000000000000000000000000000000000000000000100 p=46 (ACP24), a=0x0000, c=0x8004, f=0x00, power on, temp=19
40
----------------------------------------------------------------------
41
# Erhoehen auf 20 Grad
42
N VVMMM    ? ???    t vmA x                 y                     TTTT
43
0011001000000111000000000000000000000000000000000000000000000000000101 p=46 (ACP24), a=0x0000, c=0x8005, f=0x00, power on, temp=20
44
----------------------------------------------------------------------
45
# Weiter bis...
46
0011001000000111000000011000000000000000000000000000000000000000000110 p=46 (ACP24), a=0x0000, c=0x8006, f=0x00, power on, temp=21
47
0011001000000111000000011000000000000000000000000000000000000000000111 p=46 (ACP24), a=0x0000, c=0x8007, f=0x00, power on, temp=22
48
0011001000000111000000011000000000000000000000000000000000000000001000 p=46 (ACP24), a=0x0000, c=0x8008, f=0x00, power on, temp=23
49
0011001000000111000000011000000000000000000000000000000000000000001001 p=46 (ACP24), a=0x0000, c=0x8009, f=0x00, power on, temp=24
50
0011001000000111000000011000000000000000000000000000000000000000001010 p=46 (ACP24), a=0x0000, c=0x800a, f=0x00, power on, temp=25
51
0011001000000111000000011000000000000000000000000000000000000000001011 p=46 (ACP24), a=0x0000, c=0x800b, f=0x00, power on, temp=26
52
0011001000000111000000011000000000000000000000000000000000000000001100 p=46 (ACP24), a=0x0000, c=0x800c, f=0x00, power on, temp=27
53
0011001000000111000000011000000000000000000000000000000000000000001101 p=46 (ACP24), a=0x0000, c=0x800d, f=0x00, power on, temp=28
54
0011001000000111000000011000000000000000000000000000000000000000001110 p=46 (ACP24), a=0x0000, c=0x800e, f=0x00, power on, temp=29
55
----------------------------------------------------------------------
56
# 30 Grad
57
N VVMMM    ? ???    t vmA x                 y                     TTTT
58
0011001000000111000000011000000000000000000000000000000000000000001111 p=46 (ACP24), a=0x0000, c=0x800f, f=0x00, power on, temp=30
59
----------------------------------------------------------------------
60
# 30 Grad
61
N VVMMM    ? ???    t vmA x                 y                     TTTT
62
0011001000000111000000011000000000000000000000000000000000000000001111 p=46 (ACP24), a=0x0000, c=0x800f, f=0x00, power on, temp=30
63
----------------------------------------------------------------------
64
# Luefter auf Stufe 1
65
N VVMMM    ? ???    t vmA x                 y                     TTTT
66
0000001000000111000000101000000000000000000000000000000000000000001111 p=46 (ACP24), a=0x0000, c=0x800f, f=0x00, power on, temp=30
67
----------------------------------------------------------------------
68
# Luefter auf Stufe 2
69
N VVMMM    ? ???    t vmA x                 y                     TTTT
70
0001001000000111000000101000000000000000000000000000000000000000001111 p=46 (ACP24), a=0x0000, c=0x800f, f=0x00, power on, temp=30
71
----------------------------------------------------------------------
72
# Luefter auf Stufe 3
73
N VVMMM    ? ???    t vmA x                 y                     TTTT
74
0010001000000111000000101000000000000000000000000000000000000000001111 p=46 (ACP24), a=0x0000, c=0x800f, f=0x00, power on, temp=30
75
----------------------------------------------------------------------
76
# Luefter auf Automatik
77
N VVMMM    ? ???    t vmA x                 y                     TTTT
78
0011001000000111000000101000000000000000000000000000000000000000001111 p=46 (ACP24), a=0x0000, c=0x800f, f=0x00, power on, temp=30
79
----------------------------------------------------------------------
80
# Modus Lueften
81
N VVMMM    ? ???    t vmA x                 y                     TTTT
82
0011010000000111000000111000000000000000000000000000000000000000001111 p=46 (ACP24), a=0x0000, c=0x000f, f=0x00, power off, temp=30
83
----------------------------------------------------------------------
84
# Modus Entfeuchten
85
N VVMMM    ? ???    t vmA x                 y                     TTTT
86
0011011000000111000000111000000000000000000000000000000000000000001111 p=46 (ACP24), a=0x0000, c=0x800f, f=0x00, power on, temp=30
87
----------------------------------------------------------------------
88
# Modus ???
89
N VVMMM    ? ???    t vmA x                 y                     TTTT
90
0000100000000111000000111000000000000000000000000000000000000000001111 p=46 (ACP24), a=0x0000, c=0x000f, f=0x00, power off, temp=30
91
----------------------------------------------------------------------
92
# Modus kuehlen
93
N VVMMM    ? ???    t vmA x                 y                     TTTT
94
0011001000000111000000111000000000000000000000000000000000000000001111 p=46 (ACP24), a=0x0000, c=0x800f, f=0x00, power on, temp=30
95
----------------------------------------------------------------------
96
# Nacht-Mode
97
N VVMMM    ? ???    t vmA x                 y                     TTTT
98
1011001000000111000001000000000000000000000000000000000000000000001111 p=46 (ACP24), a=0x0000, c=0x800f, f=0x00, power on, temp=30
99
----------------------------------------------------------------------
100
# Automatik-Programm aktivieren
101
N VVMMM    ? ???    t vmA x                 y                     TTTT
102
0011101000000111000001001000000000000000000000000000000000000000001111 p=46 (ACP24), a=0x0000, c=0x800f, f=0x00, power on, temp=30
103
----------------------------------------------------------------------
104
# Timer 1
105
N VVMMM    ? ???    t vmA x                 y                     TTTT
106
0011001000000111000010000010000000000000000000000000000000000000001111 p=46 (ACP24), a=0x0000, c=0x800f, f=0x00, power on, temp=30
107
----------------------------------------------------------------------
108
# Timer 2
109
N VVMMM    ? ???    t vmA x                 y                     TTTT
110
0011001000000111000010001000000000000000000010000000000000000000001111 p=46 (ACP24), a=0x0000, c=0x800f, f=0x00, power on, temp=30
111
----------------------------------------------------------------------
112
# Timer 1 und 2
113
N VVMMM    ? ???    t vmA x                 y                     TTTT
114
0011001000000111000010001010000000000000000010000000000000000000001111 p=46 (ACP24), a=0x0000, c=0x800f, f=0x00, power on, temp=30

Dabei ist:
1
TTTT = Temperatur + 15 Grad
2
        TTTT
3
        ----------
4
        0000        ???
5
        0001        ???
6
        0010        ???
7
        0011        18 Grad
8
        0100        19 Grad
9
        0101        20 Grad
10
        0110        21 Grad
11
        ...
12
        1111        30 Grad
13
14
N    = Nacht-Modus
15
        N
16
        ----------
17
        0           aus
18
        1           ein
19
20
VV   = Luefter-Stufe, v muss 1 sein!
21
        VV   v
22
        ----------
23
        00   1      Stufe 1
24
        01   1      Stufe 2
25
        10   1      Stufe 3
26
        11   1      Automatik
27
28
MMM  = Modus
29
        MMM  m
30
        ----------
31
        000  0      Ausschalten
32
        001  0      Einschalten
33
        001  1      Kuehlen
34
        010  1      Lueften
35
        011  1      Entfeuchten
36
        100  1      ???
37
        101  1      ---
38
        110  1      ---
39
        111  1      ---
40
41
A    = Automatik-Programm
42
        A
43
        ----------
44
        0           aus
45
        1           ein
46
47
t   = Timer
48
        t   x y
49
        ----------
50
        1   1 0     Timer 1
51
        1   0 1     Timer 2

Die Kunst besteht nun darin, die 70 Bits aus dem Frame in 16 
IRMP-command-Bits zu quetschen. Das habe ich nun folgendermaßen gemacht:
1
ACP24-Frame:
2
3
N VVMMM    ? ???    t vmA x                 y                     TTTT
4
0011001000010000000000100000000000000000000000000000000000000000000111 
5
6
IRMP-command - Bits 15 bis 00:
7
8
        1111110000000000
9
        5432109876543210
10
        ----------------
11
        NAVVvMMMmtxyTTTT

Dann kann man mit folgenden C-Funktionen die einzelnen Features der 
ACP24-Klimaanlage steuern:
1
#include "irmp.h"
2
#include "irsnd.h"
3
4
#define IRMP_ACP24_TEMPERATURE_MASK         0x000F                                          // TTTT
5
6
#define IRMP_ACP24_SET_TIMER_MASK           (1<<6)                                          // t
7
#define IRMP_ACP24_TIMER1_MASK              (1<<5)                                          // x
8
#define IRMP_ACP24_TIMER2_MASK              (1<<4)                                          // y
9
10
#define IRMP_ACP24_SET_MODE_MASK            (1<<7)                                          // m
11
#define IRMP_ACP24_MODE_POWER_ON_MASK       (1<<8)                                          // MMMm = 0010 Einschalten
12
#define IRMP_ACP24_MODE_COOLING_MASK        (IRMP_ACP24_SET_MODE_MASK | (1<<8))             // MMMm = 0011 Kuehlen
13
#define IRMP_ACP24_MODE_VENTING_MASK        (IRMP_ACP24_SET_MODE_MASK | (1<<9))             // MMMm = 0101 Lueften
14
#define IRMP_ACP24_MODE_DEMISTING_MASK      (IRMP_ACP24_SET_MODE_MASK | (1<<10) | (1<<8))   // MMMm = 1001 Entfeuchten
15
16
#define IRMP_ACP24_SET_FAN_STEP_MASK        (1<<11)                                         // v
17
#define IRMP_ACP24_FAN_STEP_MASK            0x3000                                          // VV
18
#define IRMP24_ACP_FAN_STEP_BIT             12                                              // VV
19
#define IRMP_ACP24_AUTOMATIC_MASK           (1<<14)                                         // A
20
#define IRMP_ACP24_NIGHT_MASK               (1<<15)                                         // N
21
22
23
// possible values for acp24_set_mode();
24
#define ACP24_MODE_COOLING                  1
25
#define ACP24_MODE_VENTING                  2
26
#define ACP24_MODE_DEMISTING                3
27
28
static uint8_t temperature = 18;                                                    // 18 degrees
29
30
static void
31
acp24_send (uint16_t cmd)
32
{
33
    IRMP_DATA irmp_data;
34
35
    cmd |=  (temperature - 15) & IRMP_ACP24_TEMPERATURE_MASK;
36
37
    irmp_data.protocol = IRMP_ACP24_PROTOCOL;
38
    irmp_data.address  = 0x0000;
39
    irmp_data.command  = cmd;
40
    irmp_data.flags    = 0;
41
42
    irsnd_send_data (&irmp_data, 1);
43
}
44
45
void
46
acp24_set_temperature (uint8_t temp)
47
{
48
    uint16_t    cmd = IRMP_ACP24_MODE_POWER_ON_MASK;
49
50
    temperature = temp;
51
    acp24_send (cmd);
52
}
53
54
void
55
acp24_off (void)
56
{
57
    uint16_t    cmd = 0;
58
    acp24_send (cmd);
59
}
60
61
#define ACP_FAN_STEP1       0
62
#define ACP_FAN_STEP2       1
63
#define ACP_FAN_STEP3       2
64
#define ACP_FAN_AUTOMATIC   3
65
66
void
67
acp24_fan (uint8_t fan_step)
68
{
69
    uint16_t    cmd = IRMP_ACP24_MODE_POWER_ON_MASK;
70
71
    cmd |= IRMP_ACP24_SET_FAN_STEP_MASK | ((fan_step << IRMP24_ACP_FAN_STEP_BIT) & IRMP_ACP24_FAN_STEP_MASK);
72
73
    acp24_send (cmd);
74
}
75
76
void
77
acp24_set_mode (uint8_t mode)
78
{
79
    uint16_t    cmd = 0;
80
81
    switch (mode)
82
    {
83
        case ACP24_MODE_COOLING:    cmd = IRMP_ACP24_MODE_COOLING_MASK;     break;
84
        case ACP24_MODE_VENTING:    cmd = IRMP_ACP24_MODE_VENTING_MASK;     break;
85
        case ACP24_MODE_DEMISTING:  cmd = IRMP_ACP24_MODE_DEMISTING_MASK;   break;
86
        default: return;
87
    }
88
    acp24_send (cmd);
89
}
90
91
void
92
acp24_program_automatic (void)
93
{
94
    uint16_t    cmd = IRMP_ACP24_MODE_POWER_ON_MASK | IRMP_ACP24_AUTOMATIC_MASK;
95
    acp24_send (cmd);
96
}
97
98
void
99
acp24_program_night (void)
100
{
101
    uint16_t    cmd = IRMP_ACP24_MODE_POWER_ON_MASK | IRMP_ACP24_NIGHT_MASK;
102
    acp24_send (cmd);
103
}

Ich nehme mal an, dass ich spätestens morgen die ACP24-Unterstützung 
komplett habe. Dann kann das direkt am lebenden Objekt so getestet 
werden.

: Bearbeitet durch Moderator
von Matthias L. (mcl024)


Lesenswert?

Das sieht ja super aus. Ich bin gespannt. Hast du noch nen Tipp für 
IR-Led?

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Version 2.9.4 ist online.

Änderungen für IRMP und IRSND:

  - Neues Protokoll ACP24 für Stiebel-Eltron-Klimaalagen.

Das ACP24-Protokoll ist im Artikel detailliert beschrieben - 
insbesondere die Entschlüsselung der Bits. Auch die oben aufgeführten 
C-Beispielfunktionen findet man dort auch nochmal.

Matthias Laubnitz schrieb:
> Das sieht ja super aus. Ich bin gespannt. Hast du noch nen Tipp für
> IR-Led?

Ich nehme mal an, dass Du keine großen Reichweiten benötigst. Daher 
kannst Du so ziemlich jede IR-LED benutzen, z.B. SFH-409. Gibt es bei 
Reichelt für 30ct. Die Schaltung zum Anschließen der LED findest Du im 
Artikel:

  https://www.mikrocontroller.net/articles/IRMP#IRSND_-_Infrarot-Multiprotokoll-Encoder

Soll es eine stärkere IR-LED sein, dann: SFH4550. Die kannst Du mit 1A 
pulsen. Beachte aber, dass der Austrittswinkel nur 3° beträgt, d.h. Du 
musst schon ziemlich genau zielen.

Viel Spaß,

Frank

von Jörg R. (jrie)


Lesenswert?

Hat schon mal jemand IRMP auf STM32Cube ausprobiert?

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Jörg R. schrieb:
> Hat schon mal jemand IRMP auf STM32Cube ausprobiert?

Mir ist jedenfalls nichts bekannt.

Gruß,

Frank

von Cyclotron (Gast)


Lesenswert?

Nur mal so in den Raum geworfen...

Nubert sollte umbennannt werden in Toshiba, denn er basiert auf den 
Toshiba TC9148P welcher auch noch von Princeton als PT2248 produziert 
wird.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Cyclotron schrieb:0
> Nubert sollte umbennannt werden in Toshiba, denn er basiert auf den
> Toshiba TC9148P welcher auch noch von Princeton als PT2248 produziert
> wird.

Vielen Dank für den Hinweis. Ich habe mir das Protokoll vom TC9148P mal 
angeschaut. Das scheint tatsächlich zu passen. Vermutlich kann ich das 
FAN-Protokoll (für Ventilatoren), welches sich bis auf die Anzahl der 
Frame-Wiederholungen nur unwesentlich von Nubert unterscheidet, mit 
diesen konkreten Angaben aus dem Datenblatt auf ein IRMP-Protokoll 
reduzieren.

Wie bist Du darauf gekommen? Fernbedienung aufgeschraubt?

von Cyclotron (Gast)


Lesenswert?

Jepp. Mich hatte mal interressiert wer was sendet.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Cyclotron schrieb:
> Jepp. Mich hatte mal interressiert wer was sendet.

Was mich mal interessiert: Welches Gerät steuert Deine Fernbedienung 
konkret? Offenbar werden diese Toshiba-ICs universell eingesetzt, 
nämlich nicht nur bei Lautsprechersystemen, sondern auch bei 
Ventilatoren.

von Cyclotron (Gast)


Lesenswert?

Die die ich habe stammen alle von Super Low-Cost Midi Kompakt Anlagen 
vom Discounter mit denen man gerade mal die Grundsteuerung wie An/Aus, 
Stumm, Lautstärke, Quelle regeln konnte. Die günstigen Japanischen Hifi 
Türme von anfang der 90er hatten die auch.

Sowas z.B.: 
http://www.kalaydo.de/kleinanzeigen/kompaktanlagen/stereo-musikanlage-mit-plattenspieler-und-fb/a/68463446/?search=a2V5d29yZD1tdXNpa2FubGFnZSZzZWFyY2g9U0VBUkNIX0lEX0JBUF9TQUxFJnZlcnRpY2FsPTU%253D

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Neue Version 2.9.5 von IRMP und IRSND ist online.

Änderung:

  * Neues Protokoll TECHNICS

Viel Spaß,

Frank

von Di P. (drpepper) Benutzerseite


Lesenswert?

Hallo zusammen,

hier mal eine grundsätzliche Idee, um das "Interruptflimmern" zu 
reduzieren:

 *Request for Comments*:

Was denkt ihr über die Möglichkeit, IRMP in einem Modus betreiben zu 
können, wo alles über einen Pin-Change-Interrupt läuft?

Die State-Machine müsste dabei nur marginal umgeschrieben werden. 
Anstatt die Aufrufe zu zählen und aus der bekannten Frequenz die 
Pulsdauern zu berechnen könnte bei jedem Wechsel des Pin-Status die Zeit 
auf einem frei-laufenden Timer abgefragt werden, und dann aus der Zeit 
seit dem letzten Statuswechsel alle Dauern berechnet werden.
Ein (langsam laufender) Timerinterrrupt kann dann eventuell fertige 
Kommandos freigeben und die "Ready-Flag" setzen.

Hierdurch könnte man IRMP viel einfacher zusammen mit wirklich 
timingkritischen Abläufen wie USB-CDC (bei der Initialisierung) 
einsetzen. Außerdem reduziert sich auch die CPU-Last, weil (fast) 
ausschließlich nur dann für IRMP das Programm unterbrochen wird, wenn 
auch etwas zu tun ist.

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


Lesenswert?

Di P. schrieb:
> Was denkt ihr über die Möglichkeit, IRMP in einem Modus betreiben zu
> können, wo alles über einen Pin-Change-Interrupt läuft?

Da denke ich schon seit einiger Zeit drüber nach, da mich die 15.000 
Interrupts pro Sekunde auch ziemlich stören.

Ich bin mir aber noch nicht so sicher, ob das Umschreiben tatsächlich 
nur "marginal" ist. Die Auswertung der Bits muss dann im 
Pin-Change-Interrupt geschehen, eine etwaige Timeout- und 
Fehler-Behandlung aber weiterhin in einem Timer-Interrupt.

Denn es gibt einige Protokolle (NEC, NEC16, NEC48, MATSUSHITA, TECHNICS 
uws.), wo sich erst anhand eines Timeouts klären lässt, um welches 
Protokoll es sich tatsächlich handelt. Beispiel MATSUSHITA und TECHNICS: 
Beide Protokolle benutzen dasselbe Timing, aber unterschiedlich viele 
Bits. Ein TECHNICS-Frame ist kürzer. Ausserdem müssen Fehler bei der 
Übertragung (Empfang eines unvollständigen Frames) die Statemachine 
zurücksetzen. Da reicht ein Pin-Change-Interrupt nicht aus: der wartet 
u.U. ewig.

Hinzu kommt noch das "Problem", dass IRMP mittlerweile nicht nur auf 
AVRs, sondern auch auf diversen STM32, Xmegas und Pics läuft. Auch hier 
muss dann ein neuer Port erstellt werden, wobei ich von Xmegas und Pics 
wenig bis keine Ahnung habe.

Außerdem muss dann noch die "Zusammenarbeit" mit IRSND geklärt und 
programmiert werden. Da nützt ein Pin-Change-Interrupts gar nichts. Aber 
man könnte natürlich einen Timer flexibler "einstellen", um nur noch 
Timer-Interrupts dann zu generieren, wenn der Pegel tatsächlich 
gewechselt werden muss.

Aber meinetwegen: Irgendwann muss der Sprung ins kalte Wasser gewagt 
werden. Ich werde die Aufgabenstellung mal in den nächsten Tagen 
angehen.

EDIT:
Es gibt noch eine andere Möglichkeit, den Hauptprozessor zu entlasten: 
Man nimmt einen ATTiny25/45/85 (je nach Anzahl der benötigten 
Protokolle), flasht dort IRMP und IRSND drauf und macht die 
Kommunikation mit dem Hauptprozessor über Soft-Uart. Dann brauchen pro 
Frame von/zum Hauptprozessor lediglich eine Handvoll Bytes übertragen zu 
werden. Das minimiert dann den Aufwand auf dem Hauptprozessor extrem.

: Bearbeitet durch Moderator
von Di P. (drpepper) Benutzerseite


Lesenswert?

Frank M. schrieb:
> Da denke ich schon seit einiger Zeit drüber nach, da mich die 15.000
> Interrupts pro Sekunde auch ziemlich stören.

Danke für die ausführliche Antwort :)

Mit den einzelnen Protokollen kenne ich mich nicht aus. Das von dir 
beschriebene Problem könnte ggf. durch einen "timestamp" des letzten 
und des ersten Pin-Change gelöst werden. Im Time-Out könnte dann die 
Dauer des letzten Befehls bestimmt werden.

Deinen Vorschlag für IRSND finde ich plausibel. Das könnte gut klappen - 
ich kanns aber überhaupt nicht genau einschätzen, da ich den Teil noch 
nicht verwendet habe.

An die Variante mit einem dedizierten Mini-µC hab ich auch schon 
gedacht. Die Variante ist aber für mich aus Platz- und Aufwandsgründen 
nicht gut machbar.

von Di P. (drpepper) Benutzerseite


Lesenswert?

Frank M. schrieb:
> Aber meinetwegen: Irgendwann muss der Sprung ins kalte Wasser gewagt
> werden. Ich werde die Aufgabenstellung mal in den nächsten Tagen
> angehen.

Cool! cheers

von eku (Gast)


Lesenswert?

Frank M. schrieb:
> Ich bin mir aber noch nicht so sicher, ob das Umschreiben tatsächlich
> nur "marginal" ist. Die Auswertung der Bits muss dann im
> Pin-Change-Interrupt geschehen, eine etwaige Timeout- und
> Fehler-Behandlung aber weiterhin in einem Timer-Interrupt.

Ich mach das mit der Dekodierung von 433MHz RF Signalen so, dass die 
Zeiten zwischen den Pegelwechseln von der ISR in einen Ringpuffer 
geschrieben werden. Die Auswerung erfolgt dann außerhalb der ISR.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

eku schrieb:
> Ich mach das mit der Dekodierung von 433MHz RF Signalen so, dass die
> Zeiten zwischen den Pegelwechseln von der ISR in einen Ringpuffer
> geschrieben werden. Die Auswerung erfolgt dann außerhalb der ISR.

Ich habe auch schon überlegt, die Dekodierung komplett aus der ISR 
rauszuziehen. Das braucht dann aber ein wenig mehr RAM. Beim 
Kasikyo-Protokoll mit 48 Bits wären das dann mindestens 96 Bytes.

Jetzt ist das anders: Durch die instantane Dekodierung wird aus 2 Zeiten 
(Puls + Pause) direkt ein einzelnes Bit.

von eku (Gast)


Lesenswert?

Frank M. schrieb:
> Das braucht dann aber ein wenig mehr RAM. Beim
> Kasikyo-Protokoll mit 48 Bits wären das dann mindestens 96 Bytes.

Die Konvertierung kann doch bereits starten, bevor das Telegramm 
vollständig empfangen wurde. Das macht die ISR von IRMP doch auch schon 
so.

Mein Dekoder für Wetterstationstelegramme mit 48Bit Information kommt 
mit einem Ringpuffer von 16 Shorts, je 8 für Low und High-Zeiten, aus. 
Es muss sichergestellt sein, dass die Dekodierroutine genügend 
Rechenzeit bekommt, so dass der Ringpuffer nicht überläuft.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

eku schrieb:
> Die Konvertierung kann doch bereits starten, bevor das Telegramm
> vollständig empfangen wurde. Das macht die ISR von IRMP doch auch schon
> so.

Ja, natürlich. Ich bezog mich nur auf Deinen Satz:

      "Die Auswerung erfolgt dann außerhalb der ISR."

> Mein Dekoder für Wetterstationstelegramme mit 48Bit Information kommt
> mit einem Ringpuffer von 16 Shorts, je 8 für Low und High-Zeiten, aus.
> Es muss sichergestellt sein, dass die Dekodierroutine genügend
> Rechenzeit bekommt, so dass der Ringpuffer nicht überläuft.

Achso, Du meinst Speichern der Zeiten im Ringbuffer, aber 
On-the-Fly-Auswertung in der Hauptroutine. Das ist aber schon eine sehr 
spezielle Situation, welche die Allgemeinheit der User wohl so nicht 
unbedingt bereitstellen kann. Wer weiß, wo die Hauptroutine gerade so 
hängt... Im Extremfall wird der Ringbuffer randvoll.

: Bearbeitet durch Moderator
von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Version 2.9.6 von IRMP ist online.

Einzige Änderung:

  - Portierung auf STM8

Der Artikel wurde an den entsprechenden Stellen aktualisiert.

Mein Dank geht an Axel Schwenke für den sauberen Port auf STM8.

von Frank M. (ukw) (Moderator) Benutzerseite


Angehängte Dateien:

Lesenswert?

Eine Neuigkeit über IRSND:

Ich habe die IRSND-Bibliothek nach Android (Java) portiert und in die 
Android-App "RemoteButler" aus dem Projekt Remote IRMP eingebaut.

Damit ist es möglich, nicht nur übers WLAN IRMP-codierte Frames an 
IRMP-Satelliten im Netz zu schicken, sondern auch den IR-Transmitter im 
Handy direkt zu verwenden. Das Handy lässt sich dann als 
Universal-Fernbedienung benutzen.

Es sind bisher ca. 50% aller von IRSND unterstützten Protokolle 
umgesetzt. Weitere werden folgen.

Im Anhang findet Ihr App RemoteButler.apk, die man am besten direkt am 
Handy über Download installiert. Dafür muss man jedoch in den 
Einstellungen die Installation von Apps aus "anderen Quellen" erlauben.

Das Senden von IR-Frames über Android wird von immer mehr Handys 
unterstützt, u.a. vom Galaxy S4 und diversen HTC-Smartphones. Genau an 
diese Anwender ist die Beta-Version gerichtet, nämlich um diese 
Geschichte zu testen.

Mit RemoteButler lassen sich auf insgesamt 24 Bildschirmseiten über die 
Oberfläche Fernbedienungen "zusammenklicken". Wie das geht, ist im 
Artikel Remote IRMP näher erklärt. Die dort zum Download angebotene 
Version von RemoteButler ist jedoch älter und unterstützt das Senden 
über den internen IR-Transmitter natürlich noch nicht.

Auf jeder Bildschirmseite (durch Wischen nach rechts/links auswählbar) 
lassen sich neben einem Titel in 20 Zeilen und 4 Spalten insgesamt bis 
zu 80 Fernbedienungstasten definieren. Diesen kann man zuweisen:

    - IRMP-Satellit: Hier immer "IR Transmitter" auswählen!
    - Text für Beschriftung
    - Protokollnummer (dez.)
    - Adresse (dez.)
    - Kommando (dez.)
    - Farbe der Taste

Die Taste "Anlernen" ist hier mangels IR-Empfänger ohne Funktion. Diese 
ist nur gedacht für die Zusammenarbeit mit den IRMP-Satelliten aus 
Remote IRMP.

In den Konfigurationsmodus gelangt man über den Menü-Eintrag 
"Bearbeiten". Mit Druck auf den Speichern-Button wird der 
Konfigurationsmodus wieder beendet. Eine neue Taste kann man definieren, 
indem man einfach auf eine leere Fläche tippt. Dann erscheint die neue 
Taste. Durch erneutes Tippen kann man diese dann konfigurieren. Löschen 
kann man eine Taste durch längeres Antippen.

Ein paar Tipps dazu:

Ihr könnt beim Konfigurieren mehrere Zeilen (für spätere Tasten oder zur 
optischen Abtrennung) freilassen. Sobald der Konfigurationsmodus 
verlassen wird, werden die Leerzeilen "zusammengequetscht", so dass die 
FB dann kompakter aussieht. Werden in einer Zeile nur 3 statt 4 Tasten 
definiert, werden diese 3 Tasten anschließend zentriert, so dass sie 
dann mittig ausgerichtet werden.

Im Anhang seht Ihr dazu ein paar ScreenShots. Ich habe mir damit schon 
eine FB für den Fernseher, DVD-Player und eine Nikon-Kamera 
zusammengebaut. Mit letzterem kann ich den Fernauslöser an der Kamera 
per Handy auslösen - sehr praktisch!

Hauptgrund dieser Beta-Version ist es, das ganze Programm mal 
durchzuchecken. Viele der Protokolle sind nicht nur ungetestet, auch am 
Komfort kann man noch einiges verbessern, wie Copy&Paste und das 
Verschieben von Tasten oder ganzen Bildschirmseiten oder auch Einfügen 
von Leerzeilen. Später soll man seine eigenen FB-Konfigurationen 
seitenweise auf einen Server schicken können, um sie da in einem Fundus 
einzupflegen, aus dem sich dann alle RemoteButler-Nutzer bedienen, d.h. 
die fertigen Konfigurationen wieder herunterladen können.

Aber zunächst sollten erstmal die Protokolle laufen. Da bin ich auf Eure 
Unterstützung angewiesen.

Folgende Protokolle habe ich bereits umgesetzt:

SIRCS
NEC
SAMSUNG
MATSUSHITA
KASEIKYO
RECS80
RC5
DENON
RC6
SAMSUNGG32
APPLE
RECS80EX
JVC
RC6A
NIKON
NEC16
NEC42
LEGO
THOMSON
LGAIR
SAMSG48
MERLIN
PENTAX

Aber längst alle sind noch nicht getestet. Ich habe mir dafür eine 
Test-Seite in RemoteButler zusammengeklickt, siehe 5-Test.png. Die 
Protokolle, welche die Manchester-Codierung verwenden (also z.B. RC5, 
RC6 und RC6A) bringen das Programm zum Crash... das habe ich schon 
rausgefunden. Offenbar hab ich das noch einen Bug beim Encodieren von 
Manchester-Codes. Bei den anderen Protokollen wird durchaus etwas 
ausgesandt. Diese kann man dann mit einem real existierenden Gerät oder 
mit einem IRMP-Empfänger selbst austesten. NEC und NIKON laufen 
jedenfalls mit real existierenden Geräten einwandfrei.

Über Feedback würde ich mich sehr freuen. Bitte dann bei der Gelegenheit 
Name und Version des Smartphones angeben. Sollten mehr Infos nötig sein, 
bitte melden.

Als letztes: Das Programm erwartet eine Mindest-Android-Version von 
4.4.2. Solltet Ihr ein Smartphone mit einer älteren Android-Version 
haben, in welchem ein IR-Transmitter verbaut ist, bitte melden. Ich 
versuche dann, das Programm auch für eine ältere Version 
zusammenzubauen.

Viel Spaß,

Frank

: Bearbeitet durch Moderator
von Frank M. (ukw) (Moderator) Benutzerseite


Angehängte Dateien:

Lesenswert?

Update:

Den Bug im Manchester-Encoder von RemoteButler konnte ich beseitigen. 
RC5, RC6 und Co. sollten daher nun auch laufen.

Außerdem sind folgende Protokolle hinzugekommen:

GRUNDIG
NOKIA
SIEMENS
FDC
RCCAR
RUWIDO
IR60
BOSE
TELEFUNKEN
ROOMBA
LGAIR
TECHNICS

Damit verbleiben nun nur noch 13 exotische Protokolle - von insgesamt 
47.

Das Update findet Ihr im Anhang.

Viel Spaß,

Frank

von Frank M. (ukw) (Moderator) Benutzerseite


Angehängte Dateien:

Lesenswert?

Ein weiteres Update von RemoteButler findet Ihr im Anhang.

Man kann nun im Beabeitungsmodus die Tasten per Copy, Cut & Paste 
kopieren oder aussschneiden und anschließend wieder einfügen. Ausserdem 
ist es möglich, Leerzeilen einzufügen oder ganze Zeilen auch wieder zu 
löschen.

: Bearbeitet durch Moderator
von Achill H. (Firma: AH Consulting GmbH) (achillh)


Angehängte Dateien:

Lesenswert?

Mit diesem Patch kann man irmp/irsend auch mit Teensy 3.x verwenden. 
Dies ist ein Arduino Clone mit 32Bit Prozessor.

@ Frank M, wenn du willst kanst du diesen Patch auf den svn trunk 
anwenden

ciao Achill

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Achill H. schrieb:
> Mit diesem Patch kann man irmp/irsend auch mit Teensy 3.x verwenden.

Sehr schön! Danke!

Ich habe nahezu alle Deine Änderungen übernommen, bis auf diese:
1
+#  ifndef memcpy_P
2
 #  define memcpy_P                      memcpy
3
+#  endif

Ich habe das eher "klassisch" aufgelöst:
1
#elif defined(TEENSY_ARM_CORTEX_M4)
2
#  define PROGMEM
3
#  define memcpy_P                      memcpy
4
5
#else
6
#  define PROGMEM
7
#  define memcpy_P                      memcpy

... auch wenns hier redundant ist.

Noch eine Frage. Das hier:
1
/* helper function: attachInterrupt wants void(), but irmp_ISR is uint8_t() */
2
void timerinterrupt()
3
{
4
  // only when tsop dont see the ir_led flashing
5
  irsnd_ISR();              // call irsnd ISR
6
  irmp_ISR();               // call irmp ISR
7
8
/*
9
  // do not recive when sending (tsop see the ir_led)
10
  if (! irsnd_ISR())          // call irsnd ISR
11
  {                           // if not busy...
12
    irmp_ISR();               // call irmp ISR
13
  }
14
*/
15
}

habe ich nicht recht verstanden. Warum kannst Du den Return-Wert von 
irsnd_ISR() denn nicht prüfen? Das wäre eigentlich wichtig, um keine 
Geister-Echos durch das eigene Senden reinzubekommen.

> Dies ist ein Arduino Clone mit 32Bit Prozessor.

Muss ich mir mal anschauen, danke.

> @ Frank M, wenn du willst kanst du diesen Patch auf den svn trunk
> anwenden

Ich habs eingepflegt - allerdings mit der Hand. Einige diffs - 
entstanden durch abweichende Einrückungen in nicht-relevanten 
Abschnitten - waren mir nicht ganz geheuer. Ich mache so etwas gerne 
händisch, wenn der Aufwand gering ist. Bei dieser Gelegenheit kann ich 
nämlich direkt den Code verstehen, Typos beseitigen, zusätzliche 
Kommentare einpflegen und fehlerhafte Einrückungen korrigieren.

Vielen Dank für Deine Arbeit! Der Port auf Teensy kommt mit dem nächsten 
Release.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Neue Version 2.9.7 von IRMP und IRSND ist online.

Änderungen IRMP:

 - 17.11.2015: Neues Protokoll: PANASONIC
 - 17.11.2015: Portierung auf ESP8266
 - 17.11.2015: Portierung auf Teensy (3.x)

Änderungen IRSND:

 - 17.11.2015: Neues Protokoll: BOSE
 - 17.11.2015: Neues Protokoll: PANASONIC
 - 17.11.2015: Portierung auf Teensy (3.x)

Vielen Dank an Wolfgang S. für die Portierung auf ESP8266, Achill Hasler 
für die Portierung auf Teensy.

: Bearbeitet durch Moderator
von Achill H. (Firma: AH Consulting GmbH) (achillh)


Angehängte Dateien:

Lesenswert?

Hallo Frank,
wenn der Empänger vom angeschlossen Sender nicht gesehen werden kann 
(Empfänger aussen, Sender innen bei den Geräten) dann ist es besser 
beide Funktionen in der isr aufzurufen.
1
  // only when tsop dont see the ir_led flashing
2
  irsnd_ISR();              // call irsnd ISR
3
  irmp_ISR();               // call irmp ISR
Dammit empfängt und sendet er nur mit der verzögerung der Packet-länge, 
nach kompletter Erkennung wird gleich mit dem Senden dieses Paketes 
begonnen. D.h. Auch während des Senden kann Empfangen werden. Dabei muss 
der Empfänger eine andere IRMP_DATA Struktur befüllen als die gesendete.
Im angehängten Bild sieht man wie dass zusammen geht. (blau tsop, rot 
ir-diode, 15khz)
1
APPLE P:B A:1A C:A 0
2
APPLE P:B A:1A C:A 1
3
000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011111111111111111111111111111111111111111111111111111111111111111111100000000011111111100000000011111111111111111111111111000000000111111111111111111111111100000000001111111111111111111111111000000000011111111000000000111111111111111111111111110000000001111111111111111111111111100000000011111111111111111111111111000000000111111111111111111111111110000000001111111111111111111111111100000000011111111111111111111111111000000000111111110000000000111111110000000001111111110000000001111111110000000001111111111111111111111111100000000011111111100000000011111111111111111111111111000000000111111110000000001111111111111111111111111100000000011111111100000000011111111100000000011111111100000000011111111000000000011111111000000000111111111111111111111111110000000001111111110000000001111111111111111111111111100000000011111111111111111111111111000000000111111111000000000111111110000000001111111110000000001111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111110000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000111111111111111111111111111111111100000000011111111111111111111
4
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011111111111111111111111111111111111111111111111111111111111111111111100000000011111111100000000011111111100000000011111111000000000011111111000000000111111111000000000111111111111111111111111110000000001111111111111111111111111100000000011111111111111111111111111000000000111111111111111111111111110000000001111111111111111111111111000000000011111111111111111111111110000000000111111110000000001111111110000000001111111110000000001111111110000000001111111111111111111111111100000000011111111111111111111111110000000000111111111111111111111111100000000011111111111111111111111111000000000111111111000000000111111111000000000111111111000000000111111110000000000111111110000000001111111110000000001111111111111111111111111100000000011111111100000000011111111111111111111111111000000000111111111111111111111111110000000001111111100000000001111111100000000011111111100000000011111111111111111111
bei
1
  // do not recive when sending (tsop see the ir_led)
2
  if (! irsnd_ISR())          // call irsnd ISR
3
  {                           // if not busy...
4
    irmp_ISR();               // call irmp ISR
5
  }
überliest er jedes zweite gesendete Packet, da ja den Empfang während 
des Senden abgschalten ist.
ABER Dies muss man so machen, wenn der TSOP von der IR-Diode geblitzt 
wird!

oder meinst du den Kommntar? Bei Arduino werden isr mit void fn(void) 
installiert, uint8_t fn(void) können nicht installiert werden.
1
  Timer1.attachInterrupt(timerinterrupt);

Die Einrückungen sind dadurch entstanden, weil dein Editor nun spaces 
durch tabs ersetzt. Ich arbeite normalerweise mit tab 2, Du wohl mit tab 
4. Am besten stellst du deinen Editor so ein, dass er nur spaces 
einfügt, auch wenn du tab drückst.

Das Beispiel unter irmp/examples/Arduino.ino muss unter 
irmp/examples/Arduino/Arduino.ino stehen, dammit die Arduino IDE dieses 
Beispiel anzeigen und kompilieren kann. Kannst du das noch verschieben?

Ich hab den neuen code gleich ausprobiert, alles soweit ok

PS: neu sind Panasonic und Bose Protokoll. In irsend.c Zeile 2413 & 2428 
benutzt aber im folgendem mega #if (z 2471) fehlt der bose define?

Im Bild sieht man auch, dass nicht wirklich das geschickt wird, was 
Empangen wurde, apple: sendet Paket, repeat-puls (solange man auf der 
Taste ist), ende-Paket. irsend sendet Paket, Paket(..), kein ende-Paket.

Die lib selbst gefällt mir, verwendet habe ich sie auch schon mit Atmel 
Projekten. merci für deinen Einsatz

ciao Achill

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Hallo Achill,

Achill H. schrieb:

> wenn der Empänger vom angeschlossen Sender nicht gesehen werden kann
> (Empfänger aussen, Sender innen bei den Geräten) dann ist es besser
> beide Funktionen in der isr aufzurufen.

Ja, natürlich, dann geht das.

> Im angehängten Bild sieht man wie dass zusammen geht.

Vielen Dank für das Bild. Darf ich das im Artikel IRMP verwenden? 
Dann könnte ich das Verhalten dort besser erklären.


> bei [...]
> überliest er jedes zweite gesendete Packet, da ja den Empfang während
> des Senden abgschalten ist.

Ja, wenn man den Finger runterhält, stimmt das. Das habe ich bisher 
nicht bedacht. Danke für den Hinweis.

> ABER Dies muss man so machen, wenn der TSOP von der IR-Diode geblitzt
> wird!

Ja.

> oder meinst du den Kommntar?

Ja, den hatte ich missverstanden. Für mich sah es so aus, als ob Du 
wegen dieses Kommentars das if() weggenommen hättest. Schließlich hast 
Du es ja auskommentiert noch stehen lassen.

Ich werde beide Möglichkeiten im Source dokumentieren, wann welcher Fall 
sinnvoller ist.

> Die Einrückungen sind dadurch entstanden, weil dein Editor nun spaces
> durch tabs ersetzt. Ich arbeite normalerweise mit tab 2, Du wohl mit tab
> 4. Am besten stellst du deinen Editor so ein, dass er nur spaces
> einfügt, auch wenn du tab drückst.

Der ist schon seit Jahren so eingestellt, dass er nur Spaces speichert. 
;-)

Egal. War nicht schlimm.

> Das Beispiel unter irmp/examples/Arduino.ino muss unter
> irmp/examples/Arduino/Arduino.ino stehen, dammit die Arduino IDE dieses
> Beispiel anzeigen und kompilieren kann. Kannst du das noch verschieben?

Upps, das wusste ich nicht. Ich fand die Idee mit dem 
examples-Verzeichnis eigentlich sehr gut und dachte daran, unter 
examples zukünftig weitere main-Beispiele (PIC, XMEGA, STM32 usw) 
abzulegen, da die jetzige main.c durch die #ifdef-Statements recht 
unübersichtlich geworden ist.

Ja, natürlich, verschiebe ich.

> Ich hab den neuen code gleich ausprobiert, alles soweit ok

Prima, danke.

> PS: neu sind Panasonic und Bose Protokoll. In irsend.c Zeile 2413 & 2428
> benutzt aber im folgendem mega #if (z 2471) fehlt der bose define?

Hm, tatsächlich? Werde ich prüfen.

> Die lib selbst gefällt mir, verwendet habe ich sie auch schon mit Atmel
> Projekten. merci für deinen Einsatz

Danke für die Portierung! :-)

: Bearbeitet durch Moderator
von Achill H. (Firma: AH Consulting GmbH) (achillh)


Lesenswert?

Natürlich kannst du das Bild verwenden. Besser währe aber png Format. 
(kleiner) Wenn ich deine e-mail kennen würde, könnte ich dir diese 
Bilder und weiter scans direkt schicken.

> Der ist schon seit Jahren so eingestellt, dass er nur Spaces speichert.
Das währe gut, wenn du das wider so machen würdest. (In letzten svn up 
sind sehr viele tabs dazugekommen in den sourcen)

ciao Achill

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Achill H. schrieb:
> Natürlich kannst du das Bild verwenden. Besser währe aber png Format.
> (kleiner) Wenn ich deine e-mail kennen würde, könnte ich dir diese
> Bilder und weiter scans direkt schicken.

Meine E-Mail-Adresse steht in jedem Source-Modul oben im Header ;-)

> Das währe gut, wenn du das wider so machen würdest. (In letzten svn up
> sind sehr viele tabs dazugekommen in den sourcen)

Echt? Mist. Bringe ich in Ordnung.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

So, ich habe die oben erwähnten kleineren Mißstände nun behoben:

  - Es sind wieder Spaces in den Sources
  - examples/Arduino.ino -> examples/Arduino/Arduino.ino
  - Fehlendes IRSND_SUPPORT_BOSE_PROTOCOL ergänzt

SVN und die Downloads über den IRMP-Artikel sind aktualisiert.

von Achill H. (Firma: AH Consulting GmbH) (achillh)


Lesenswert?

OK, Pics und Scans werde ich dir direkt zustellen. (heute Abend, denn 
ich bin z.Z. am Geld verdienen)
ciao Achill

von Andy P. (Gast)


Lesenswert?

Hat noch jemand das Problem, eine der letzten beiden Remote_butler.apks 
zu installieren?

"Möchten Sie ein Update für diese vorhandene App installieren? Ihre 
vorhandenen Daten bleiben erhalten. Die aktualisierte App erhält Zugriff 
auf:
(Neu:) Infrarotübertragung
(Alle:)
SDKarteninhalt ändern/löschen
SDkarten lesen
Voller Netzwerkzugriff

[ Installieren ]"

und nach Druck auf den Button:
"X Anwendung nicht installiert [ Fertig ]"

Android Lollipop 5.1.1
Kernel 3.10.49
Sony Z5c

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Andy P. schrieb:
> Hat noch jemand das Problem, eine der letzten beiden Remote_butler.apks
> zu installieren?

"Die letzten beiden"? Die vom 11.11. geht also, die vom 12.11. und 
14.11. (s.o) nicht?

von Andy P. (Gast)


Lesenswert?

Boah, bist du auf Zack! Kaum dreht man sich um, antwortet unser Frank. 
So eine Reaktionsgeschwindigkeit kenn ich nichtmal von 
Serviceunternehemen, die dafür höhere 3stellige Summen pro Jahr 
verlangen. RESPEKT!

Habs grad getestet, die vom 11.11. geht auch nicht. Die Version von der 
Artikelseite selbst geht, fragt aber nicht nach Infrarotübertragung. 
(Hat das Z5c nicht). vllt. liegts daran. Kann auch sein, das mein 
Android hier ein Problem mit dem updaten selbst hat statt der neuen 
Software.
Deshalb frag ich erstmal nach ähnlichen Usererfahrungen.

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Vielen Dank für IRMP! Nachdem ich mir mit einem Mega88 und Fleurys LCD 
Lib einen IRMP Analyzer gebastelt hatte, war das Ausklingeln der 
vorhandenen FB und die Implementierung in einem LED Controller auf 
Tiny85 nur noch ein Klacks.

Einfach super!

von Andy P. (Gast)


Lesenswert?

Andy P. schrieb:
> Kann auch sein, das mein
> Android hier ein Problem mit dem updaten selbst hat statt der neuen
> Software.

Auflösung: Komplett deinstallieren + Neuinstallation half. Jetzt heißt 
es: alles neu anlernen.

von Andy P. (Gast)


Lesenswert?

Irgendwie komm ich nicht zu Potte. Mit der neuen .apk sind die 
Protokolle jetzt nach Alphabet sortiert, nicht mehr nach 
Protokollnummer. Somit ist ein Übersetzen der Antwort von "ipclient rec 
<IP> <PORT>" nach Eingabeformular nicht mehr so einfach.
Okay, dacht ich, nutzt du halt die nette Anlernfunktion im Remotebutler.
Die geht nicht, obwohl ein "ipclient rec" vom PC aus funktioniert.
Es stellt sich raus, daß man in der Server.xml zwar angeben kann 
"<protocol>TCP</protocol>", die apk laut Wireshark dann aber noch immer 
UDP sendet.
Das wäre nicht so schlimm, wenn der Server nicht ein merkwürdiges 
Verhalten zeigen würde.
REC per TCP:
"user@linux:~/Remote-irmp/IP-Client and IPflash/win32_source/ipclient> 
./ipclient rec 192.168.1.20 10001
answer     = R
error code = +
protocol   = 2
addr       = 0x7282
cmd        = 0x00df
flags      = 0

REC per UDP:
user@linux:~/Remote-irmp/IP-Client and IPflash/win32_source/ipclient> 
./ipclient udprec 192.168.1.20 10001
Sent.
answer     = S
error code = +
protocol   = 2
addr       = 0x7282
cmd        = 0x00df
flags      = 0"

Das Problem ist das Byte "answer". REC antwortet im UDP-Modus mit "S" 
statt richtigerweise mit "R".
In /Remote-irmp/AtmelStudioV6_Source_IR_Remote/ipserver/ipserver.c in 
Zeile 444 steht auch korrekterweise "ipbuf[0] = 'R';".
Leider bin ich mit meinem Latein am Ende. Dummerweise habe ich grad 
keinen WindowsPC, um mit AtmelStudio die Datei neu zu kompilieren.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Andy P. schrieb:

> Auflösung: Komplett deinstallieren + Neuinstallation half.

Hm, eine Erklärung habe ich dafür nicht.

> Jetzt heißt es: alles neu anlernen.

Das ist blöd. Du kannst jedoch, wenn Du Dein Smartphone an den PC 
hängst, die Datei RemoteButler/Buttons.xml auf den PC als Backup 
kopieren. Die neue RemoteButler-App arbeitet jedoch mit 4 Spalten und 
rechnet alte 3-spaltige XML-Dateien um. Umgekehrt geht das leider nicht, 
d.h. die alte kann mit der neuen Datei nichts anfangen.

: Bearbeitet durch Moderator
von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Andy P. schrieb:
> Irgendwie komm ich nicht zu Potte. Mit der neuen .apk sind die
> Protokolle jetzt nach Alphabet sortiert, nicht mehr nach
> Protokollnummer.

Ja, das stimmt. Ich hielt das so für einfacher. Ich könnte aber hinter 
jedem Protokoll auch noch die dazugehörende Nummer in Klammern 
einblenden.

> Okay, dacht ich, nutzt du halt die nette Anlernfunktion im Remotebutler.
> Die geht nicht, obwohl ein "ipclient rec" vom PC aus funktioniert.

Ja, ich hab da wohl im Protokoll noch irgendwas kaputtrepariert :-(

> Es stellt sich raus, daß man in der Server.xml zwar angeben kann
> "<protocol>TCP</protocol>", die apk laut Wireshark dann aber noch immer
> UDP sendet.

Das kann man in der App aber nicht einstellen. Ich habe in der App 
bisher nur UDP realisiert. Das manuelle Umstellen in der 
Server.xml-Datei bewirkt daher nichts.

> Das wäre nicht so schlimm, wenn der Server nicht ein merkwürdiges
> Verhalten zeigen würde.
> [...]
> Das Problem ist das Byte "answer". REC antwortet im UDP-Modus mit "S"
> statt richtigerweise mit "R".

Ja, da liegt wohl der Hund begraben. Wie ich schon sagte, habe ich 
damals (lang ists her) irgendetwas im Protokoll nach meinen Tests 
kaputtgemacht.

Ich werde mir das heute abend nochmal in Ruhe anschauen und dann 
entscheiden, was da richtig ist.

> In /Remote-irmp/AtmelStudioV6_Source_IR_Remote/ipserver/ipserver.c in
> Zeile 444 steht auch korrekterweise "ipbuf[0] = 'R';".
> Leider bin ich mit meinem Latein am Ende. Dummerweise habe ich grad
> keinen WindowsPC, um mit AtmelStudio die Datei neu zu kompilieren.

Arbeitest Du mit der Version 1.0 oder 1.1 unter

    https://www.mikrocontroller.net/articles/Remote_IRMP#Downloads

Die Version von Rahphael kenne ich nicht. Er hat diese auch ohne mein 
Wissen hochgeladen.

Wie gesagt: Ich schaue mir heute abend mal alles genau an. Dann werde 
ich den Fehler schon finden und beseitigen.

von Andy P. (Gast)


Lesenswert?

Nichts übers Knie brechen, das ist schon so alles okay. Nur wohl ein 
paar Altlasten in Form von nicht geupdateten AVR.


Frank M. schrieb:
> Andy P. schrieb:

> Ich könnte aber hinter jedem Protokoll auch noch die dazugehörende
> Nummer in Klammern einblenden.
Nein andersrum wäre es sinnvoller- in ipclient einfach:
1
string protoname['SIRCS','NEC','Samsung','Kaseiko','JVC',...];
und statt:
1
printf ("protocol   = %d\n", protocol);
einfach ergänzend:
1
printf ("protocol   = %d", protocol); 
2
printf (" (name = %s)\n", protoname[protocol]);
Im RemoteButler ist die Reihenfolge nach Alphabet schon die intuitivere 
Sortierung. Lediglich das Umrechnen von ipclient-Ausgabe nach 
RemoteButlereingabe wird so wieder ohne Quelltextstudium möglich.

> Ja, ich hab da wohl im Protokoll noch irgendwas kaputtrepariert :-(
Nee, alles chic. Im Quelltext ist es ja richtig, nur das Binary des 
Servers scheint noch den Bug zu haben.

> Ich habe in der App bisher nur UDP realisiert. Das manuelle Umstellen
> in der Server.xml-Datei bewirkt daher nichts.
Ah, ok, macht Sinn. Ich habs nur aus dem xml geschlußfolgert.

>
> Ja, da liegt wohl der Hund begraben. Wie ich schon sagte, habe ich
> damals (lang ists her) irgendetwas im Protokoll nach meinen Tests
> kaputtgemacht.
>
> Ich werde mir das heute abend nochmal in Ruhe anschauen und dann
> entscheiden, was da richtig ist.
>
>> In /Remote-irmp/AtmelStudioV6_Source_IR_Remote/ipserver/ipserver.c in
>> Zeile 444 steht auch korrekterweise "ipbuf[0] = 'R';".
> Arbeitest Du mit der Version 1.0 oder 1.1 unter
>
>     https://www.mikrocontroller.net/articles/Remote_IRMP#Downloads
>
> Die Version von Rahphael kenne ich nicht. Er hat diese auch ohne mein
> Wissen hochgeladen.

Das war wohl der richtige Hinweis. Ich habe wohl 1.1 im Einsatz (nach 
Datumsangaben zu urteilen). Und den Teil später nicht weiter gelesen. Da 
steht ja klar:
[code:]
Changelog:
...
- Bugfix: prüfe auf 'R' und 'S' anstatt beides mal auf 'R'
...[/code]

Ich hab morgen wieder eine Windows-Büchse in zur Hand, da kann ich mal 
AVRStudio draufpacken + irserver neu kompilieren.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Andy P. schrieb:
> Nein andersrum wäre es sinnvoller- in ipclient einfach:
>
1
 printf (" (name = %s)\n", protoname[protocol]);

Habe es so gemacht:
1
printf ("protocol name = %s\n", protocol < IRMP_N_PROTOCOLS ? irmp_protocol_names[protocol] : "unknown");

> Im RemoteButler ist die Reihenfolge nach Alphabet schon die intuitivere
> Sortierung. Lediglich das Umrechnen von ipclient-Ausgabe nach
> RemoteButlereingabe wird so wieder ohne Quelltextstudium möglich.

Sollte mit obiger Änderung ja nun erledigt sein.

Ich habe im Remote IRMP-Artikel nun die Version 1.3 hochgeladen. 
Dort ist das mit dem 'R' vs. 'S' im UDP-Teil nun auch bei mir 
korrigiert. ipclient.c mit obiger Änderung ist dort nun auch drin. Die 
EXE-Datei ipclient.exe ist damit auch auf dem neuesten Stand.

von Marius (Gast)


Lesenswert?

Hallo zusammen,

ich versuche gerade, einen LED Controller zu bauen. Dazu möchte ich 
gerne IR Fernbedienungs-Signale einlesen, idealerweise NEC (wg. der 
China Remotes!).
Jetzt liegt meine Controller Programm aber in ASM vor und ich habe es 
mangels Kenntnisse nicht geschafft, einen lauffähigen NEC-Decoder zu 
basteln. Allerdings ist im Controller eine funktionierende RC-5 Routine.

Deswegen möchte ich jetzt gerne IRMP nutzen...Allerdings fällt die 
native Nutzung flach, da ich ASM und C nicht mischen kann...

Daher habe ich mir eine Krücke überlegt:
Ich nehme 2 Mikrokontroller (in meinem Fall ATtiny4313), auf dem einen 
läuft IRMP und auf dem anderen der LED Controller.

Der IRMP-Controller empfängt also über PD2 das IR Signal (NEC) und soll 
es über PD5 als RC-5 weitergeben. Der zweite Controller liest dann über 
PD1 das RC-5 Signal und interpretiert es entsprechend.

Um es nicht zu kompliziert zu machen, wollte ich in einem ersten Schritt 
ausprobieren, ob dieses "durchreichen" nur mit RC-5 funktioniert.
Also ob der LED Controller sozusagen trotz Zwischenschaltung des IRMP 
Controllers noch auf die RC5 Befehle hört.
Erst im zweiten Schritt soll dann die Umwandlung von NEC->RC-5 folgen.

Allerdings läuft irgendetwas momentan noch schief... Ich bin 
Mircocontrolleranfänger :) Habe jetzt die letzen Wochen mich in ASM 
eingearbeitet und nun in die Grundzüge von C. Allerdings reicht mein 
Wissen jetzt bei weitem nicht aus, weshalb ich euch um Hilfe bitte, mir 
einen kleinen Wink zu geben, woran es haken könnte...

Vielen Dank schon vorab!


Hier noch der Code von IRMP:
1
/*
2
 * IRMP_ATTINY.c
3
 *
4
 * Created: 16.12.2015 10:18:02
5
 *  
6
 * IR Input an PD2
7
 * Output an PD5
8
 */ 
9
10
#include <avr/io.h>
11
// run ATtiny4313 @ 8 MHz intern
12
// FUSES: -U lfuse:w:0xe4:m -U hfuse:w:0xd9:m -U efuse:w:0xff:m 
13
#define F_CPU       8000000UL
14
#include "irmp.h"
15
#include "irsnd.h"
16
17
18
#ifndef F_CPU
19
#error F_CPU unknown
20
#endif
21
22
/*---------------------------------------------------------------------------------------------------------------------------------------------------
23
 * ATMEL AVR part:
24
 *---------------------------------------------------------------------------------------------------------------------------------------------------
25
 */
26
27
#include "irmp.h"
28
#define BAUD  9600L
29
#include <util/setbaud.h>
30
31
#ifdef UBRR0H
32
33
#define UART0_UBRRH                             UBRR0H
34
#define UART0_UBRRL                             UBRR0L
35
#define UART0_UCSRA                             UCSR0A
36
#define UART0_UCSRB                             UCSR0B
37
#define UART0_UCSRC                             UCSR0C
38
#define UART0_UDRE_BIT_VALUE                    (1<<UDRE0)
39
#define UART0_UCSZ1_BIT_VALUE                   (1<<UCSZ01)
40
#define UART0_UCSZ0_BIT_VALUE                   (1<<UCSZ00)
41
#ifdef URSEL0
42
#define UART0_URSEL_BIT_VALUE                   (1<<URSEL0)
43
#else
44
#define UART0_URSEL_BIT_VALUE                   (0)
45
#endif
46
#define UART0_TXEN_BIT_VALUE                    (1<<TXEN0)
47
#define UART0_UDR                               UDR0
48
#define UART0_U2X                               U2X0
49
50
#else
51
52
#define UART0_UBRRH                             UBRRH
53
#define UART0_UBRRL                             UBRRL
54
#define UART0_UCSRA                             UCSRA
55
#define UART0_UCSRB                             UCSRB
56
#define UART0_UCSRC                             UCSRC
57
#define UART0_UDRE_BIT_VALUE                    (1<<UDRE)
58
#define UART0_UCSZ1_BIT_VALUE                   (1<<UCSZ1)
59
#define UART0_UCSZ0_BIT_VALUE                   (1<<UCSZ0)
60
#ifdef URSEL
61
#define UART0_URSEL_BIT_VALUE                   (1<<URSEL)
62
#else
63
#define UART0_URSEL_BIT_VALUE                   (0)
64
#endif
65
#define UART0_TXEN_BIT_VALUE                    (1<<TXEN)
66
#define UART0_UDR                               UDR
67
#define UART0_U2X                               U2X
68
69
#endif //UBRR0H
70
71
static void
72
uart_init (void)
73
{
74
    UART0_UBRRH = UBRRH_VALUE;                                                                      // set baud rate
75
    UART0_UBRRL = UBRRL_VALUE;
76
77
#if USE_2X
78
    UART0_UCSRA |= (1<<UART0_U2X);
79
#else
80
    UART0_UCSRA &= ~(1<<UART0_U2X);
81
#endif
82
83
    UART0_UCSRC = UART0_UCSZ1_BIT_VALUE | UART0_UCSZ0_BIT_VALUE | UART0_URSEL_BIT_VALUE;
84
    UART0_UCSRB |= UART0_TXEN_BIT_VALUE;                                                            // enable UART TX
85
}
86
87
static void
88
uart_putc (unsigned char ch)
89
{
90
    while (!(UART0_UCSRA & UART0_UDRE_BIT_VALUE))
91
    {
92
        ;
93
    }
94
95
    UART0_UDR = ch;
96
}
97
98
static void
99
uart_puts (char * s)
100
{
101
    while (*s)
102
    {
103
        uart_putc (*s);
104
        s++;
105
    }
106
}
107
108
static void
109
uart_puts_P (PGM_P s)
110
{
111
    uint8_t ch;
112
113
    while ((ch = pgm_read_byte(s)) != '\0')
114
    {
115
        uart_putc (ch);
116
        s++;
117
    }
118
}
119
120
static char *
121
itoh (char * buf, uint8_t digits, uint16_t number)
122
{
123
    for (buf[digits] = 0; digits--; number >>= 4)
124
    {
125
        buf[digits] = "0123456789ABCDEF"[number & 0x0F];
126
    }
127
    return buf;
128
}
129
130
static void
131
timer1_init (void)
132
{
133
#if defined (__AVR_ATtiny45__) || defined (__AVR_ATtiny85__)                // ATtiny45 / ATtiny85:
134
135
#if F_CPU >= 16000000L
136
    OCR1C   =  (F_CPU / F_INTERRUPTS / 8) - 1;                              // compare value: 1/15000 of CPU frequency, presc = 8
137
    TCCR1   = (1 << CTC1) | (1 << CS12);                                    // switch CTC Mode on, set prescaler to 8
138
#else
139
    OCR1C   =  (F_CPU / F_INTERRUPTS / 4) - 1;                              // compare value: 1/15000 of CPU frequency, presc = 4
140
    TCCR1   = (1 << CTC1) | (1 << CS11) | (1 << CS10);                      // switch CTC Mode on, set prescaler to 4
141
#endif
142
143
#else                                                                       // ATmegaXX:
144
    OCR1A   =  (F_CPU / F_INTERRUPTS) - 1;                                  // compare value: 1/15000 of CPU frequency
145
    TCCR1B  = (1 << WGM12) | (1 << CS10);                                   // switch CTC Mode on, set prescaler to 1
146
#endif
147
148
#ifdef TIMSK1
149
    TIMSK1  = 1 << OCIE1A;                                                  // OCIE1A: Interrupt by timer compare
150
#else
151
    TIMSK   = 1 << OCIE1A;                                                  // OCIE1A: Interrupt by timer compare
152
#endif
153
}
154
155
#ifdef TIM1_COMPA_vect                                                      // ATtiny84
156
#define COMPA_VECT  TIM1_COMPA_vect
157
#else
158
#define COMPA_VECT  TIMER1_COMPA_vect                                       // ATmega
159
#endif
160
161
ISR(COMPA_VECT)                                                             // Timer1 output compare A interrupt service routine, called every 1/15000 sec
162
{
163
   if (! irsnd_ISR())          // call irsnd ISR
164
  {                           // if not busy...
165
      irmp_ISR();             // call irmp ISR
166
  }
167
  // call other timer interrupt routines...
168
}
169
170
int
171
main (void)
172
{
173
    IRMP_DATA   irmp_data;
174
175
  irmp_init();                // initialize irmp
176
  irsnd_init();               // initialize irsnd
177
  timer1_init();               // initialize timer
178
  sei ();                     // enable interrupts
179
 
180
  for (;;)
181
  {
182
    if (irmp_get_data (&irmp_data))
183
    {
184
      irmp_data.flags = 0;    // reset flags!
185
      irsnd_send_data (&irmp_data, FALSE);
186
    }
187
  }
188
}
F_INTERRUPTS läuft auf 15000
in der irmpconfig.h und irsndconfig.h habe ich jeweils NEC und RC5 
aktiviert.
DAnn hab ich in den irmpconfig
1
#if defined (ATMEL_AVR) || defined (__AVR_XMEGA__)                      // use PD2 as IR input on AVR @ ATtiny2313
2
#  define IRMP_PORT_LETTER                      D
3
#  define IRMP_BIT_NUMBER                       2
und in der irsndconfig.h
1
#elif defined(ATMEL_AVR)
2
#  define IRSND_OCx                             IRSND_OC0B              // use OC0B = PD5 @ ATtiny2313
eingefügt, wobei dann in der irsnd.c noch folgendes nötig war
1
#if defined (__AVR_ATtiny2313__) || defined (__AVR_ATtiny4313__)        // ATtiny23/43 uses OC0B = PD5
2
#  if IRSND_OCx == IRSND_OC0B                                       // OC0B
3
#    define IRSND_PORT_LETTER                       D
4
#    define IRSND_BIT_NUMBER                        5
5
#  else
6
#    error Wrong value for IRSND_OCx, choose IRSND_OC0A or IRSND_OC0B in irsndconfig.h
7
#  endif

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Marius schrieb:
> Daher habe ich mir eine Krücke überlegt:
> Ich nehme 2 Mikrokontroller (in meinem Fall ATtiny4313), auf dem einen
> läuft IRMP und auf dem anderen der LED Controller.

Prinzipiell erstmal vom Ansatz her keine schlechte Idee.

> Der IRMP-Controller empfängt also über PD2 das IR Signal (NEC) und soll
> es über PD5 als RC-5 weitergeben.

Das wiederum halte ich für suboptimal, und zwar aus folgenden Gründen:

  - NEC kann man nicht in RC5 quetschen, da in NEC mehr Informationsbits
    als in RC5 stecken.

  - IRSND produziert ein moduliertes Signal mit 36kHz, Deine ASM-RC5-
    Empfangsroutine jedoch möchte ein statisches Signal - so wie
    es ein TSOP fix und fertig liefert.

  - zu aufwändig

> Um es nicht zu kompliziert zu machen, wollte ich in einem ersten Schritt
> ausprobieren, ob dieses "durchreichen" nur mit RC-5 funktioniert.

Theoretisch ginge es, wenn Du nur die für die Unterschiede relevanten 
NEC-Bits (z.B. Tasten 1-9) in einen RC5 quetschst und gleichzeitig die 
36-kHz-Modulation in IRSND abstellst - durch Anpassung der Funktionen 
irsnd_off() und irsnd_on().

Es geht aber viel einfacher: Du koppelst beide µCs über den UART und 
schreibst in main.c:
1
int
2
main (void)
3
{
4
  IRMP_DATA   irmp_data;
5
6
  irmp_init();                 // initialize irmp
7
  // irsnd_init () RAUS!
8
  timer1_init();               // initialize timer
9
  sei ();                     // enable interrupts
10
11
  for (;;)
12
  {
13
    if (irmp_get_data (&irmp_data))
14
    {
15
      uart_putc (0);                           // start byte
16
      uart_putc (irmp_data.protocol);          // protocol
17
      uart_putc (irmp_data.address & 0x00FF);  // address lower byte
18
      uart_putc (irmp_data.address >> 8);      // address upper byte
19
      uart_putc (irmp_data.command & 0x00FF);  // command lower byte
20
      uart_putc (irmp_data.command >> 8);      // command upper byte
21
    }
22
  }
23
}

IRSND kannst Du dann komplett rauswerfen.

Auf der Assembler-Seite holst Du Dir die 1 + 5 Bytes wieder über den 
UART (RX) und machst damit, was Du dann willst. Deine 
RC5-Empfängerroutine kannst Du dann komplett rauswerfen.

> F_INTERRUPTS läuft auf 15000
> in der irmpconfig.h und irsndconfig.h habe ich jeweils NEC und RC5
> aktiviert.

Ja, korrekt.

> eingefügt, wobei dann in der irsnd.c noch folgendes nötig war
>
1
> #if defined (__AVR_ATtiny2313__) || defined (__AVR_ATtiny4313__)

Danke für den Tipp, ich werde den 2313 & 4313 hinzufügen.

P.S.

In Deinem Versuch wäre dies:
1
ISR(COMPA_VECT)                                                             // Timer1 output compare A interrupt service routine, called every 1/15000 sec
2
{
3
    irsnd_ISR())          // call irsnd ISR
4
    irmp_ISR();           // call irmp ISR
5
}

die bessere Wahl, um keine Frames zu verschlucken, während IRSND sendet. 
Das zusätzliche if mit Totschalten von IRMP in der Dokumentation ist nur 
für den Fall drin, dass IRMP den eigenen Output, den IRSND erzeugt, als 
Echo wieder sehen könnte. Das ist aber bei Dir nicht der Fall, da Du 
per Kabel übertragen wolltest.

Wenn Du das aber sowieso mit dem UART löst, dann fliegt IRSND komplett 
raus und die ISR reduziert sich auf:
1
ISR(COMPA_VECT)                                                             // Timer1 output compare A interrupt service routine, called every 1/15000 sec
2
{
3
    irmp_ISR();           // call irmp ISR
4
}

von Marius (Gast)


Lesenswert?

Hallo Frank,

wow, vielen Dank für die schnelle, kompetente und hilfreiche Antwort!!

Frank M. schrieb:

>
> Es geht aber viel einfacher: Du koppelst beide µCs über den UART

Das geht leider nicht, da dieser beim zweiten µC schon mit der DMX 
Empfangsroutine belegt ist. Sorry, hatte ich nicht gleich mit erwähnt.

Ich dachte an eine Umsetzung auf die Art:
"Wenn die NEC Taste '1' gedrückt wurde, sende das RC5 Kommando '1'". 
D.h. in dem C-Programm kommt auch eine Art "Übersetzer" mit rein...
auch wenn das vermutlich umständlich sein wird.

Dh. ich schaue mir jetzt mal an, ob es klappt, wenn ich die Modulation 
abstelle.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Marius schrieb:
>> Es geht aber viel einfacher: Du koppelst beide µCs über den UART
>
> Das geht leider nicht, da dieser beim zweiten µC schon mit der DMX
> Empfangsroutine belegt ist. Sorry, hatte ich nicht gleich mit erwähnt.

Du könntest auch einen Software-UART auf dem zweiten µC verwenden. Ich 
denke mir, das findest Du auch als ASM-Code.

> Ich dachte an eine Umsetzung auf die Art:
> "Wenn die NEC Taste '1' gedrückt wurde, sende das RC5 Kommando '1'".
> D.h. in dem C-Programm kommt auch eine Art "Übersetzer" mit rein...
> auch wenn das vermutlich umständlich sein wird.

Ja, das ginge. Aber hier müsstest Du schon für Deinen Test:
1
    if (irmp_get_data (&irmp_data))
2
    {
3
      irmp_data.flags = 0;    // reset flags!
4
      irsnd_send_data (&irmp_data, FALSE);

vor dem Senden das Protokoll auf RC5 umstellen, damit Deine 
ASM-RC5-Empfangsroutine überhaupt etwas versteht. Oder hältst Du eine 
RC5-Fernbedienung an den TSOP?

> Dh. ich schaue mir jetzt mal an, ob es klappt, wenn ich die Modulation
> abstelle.

Die folgenden Funktionen reduzierst Du dafür auf folgende 
Minimal-Varianten:
1
void
2
irsnd_init (void)
3
{
4
    IRSND_PORT |= (1<<IRSND_BIT);         // set IRSND_BIT to high
5
    IRSND_DDR |= (1<<IRSND_BIT);          // set IRSND_BIT to output
6
}
7
8
static void
9
irsnd_off (void)
10
{
11
    if (irsnd_is_on)
12
    {
13
        IRSND_PORT |= (1<<IRSND_BIT);     // set IRSND_BIT to high
14
        irsnd_is_on = FALSE;
15
    }
16
}
17
18
static void
19
irsnd_on (void)
20
{
21
    if (irsnd_is_off)
22
    {
23
        IRSND_PORT  &= ~(1<<IRSND_BIT);   // set IRSND_BIT to low
24
        irsnd_is_on = TRUE;
25
    }
26
}
27
28
static void
29
irsnd_set_freq (IRSND_FREQ_TYPE freq)
30
{
31
}

OFF heißt hier also BIT = high, ON heißt dann BIT = low. Damit 
simulierst Du dann den Ausgang eines TSOP-Empfängers, welcher im 
Ruhezustand HIGH-Pegel hat.

Der originale Code steuert über einen Transistor eine IR-LED an. Da ist 
die Logik sowieso invertiert. Da ist der Ruhezustand nämlich low - genau 
umgekehrt zum TSOP. Schon allein deshalb konnte das so nicht 
funktionieren. Hinzu kommt dann noch die Modulation mit 
50/50-Tastverhältnis. Die Chance für Deine ASM-RC5-Empfangsroutine, 
danebenzugreifen, liegt hier also bei fifty-fifty.

: Bearbeitet durch Moderator
von Marius (Gast)


Lesenswert?

Ja das mit der Modulation hat geklappt.

Ich habe eine RC-5 Fernbedienung, und trotz zwischenschaltung des 
IRMP-Microcontrollers macht der LED-Mikrocontroller jetzt genau das, was 
er lt. RC-5 Kommando machen soll :)
Vielen Dank!!

Jetzt bastel ich wohl mal an einigen switch-case Verzweigungen, die die 
verschiedenen Tastenumwandlungen darstellen...
Oder hast du hier auf Anhieb eine bessere/schnelle Lösung oder C-Befehl 
parat?

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Marius schrieb:
> Ich habe eine RC-5 Fernbedienung, und trotz zwischenschaltung des
> IRMP-Microcontrollers macht der LED-Mikrocontroller jetzt genau das, was
> er lt. RC-5 Kommando machen soll :)

Freut mich :-)

> Jetzt bastel ich wohl mal an einigen switch-case Verzweigungen, die die
> verschiedenen Tastenumwandlungen darstellen...
> Oder hast du hier auf Anhieb eine bessere/schnelle Lösung oder C-Befehl
> parat?

Nein, ich wüsste jetzt auch nichts besseres als:
1
    if (irmp_get_data (&irmp_data))
2
    {
3
      irmp_data.flags = 0;    // reset flags!
4
5
      if (irmp_data.protocol == IRMP_NEC_PROTOCOL && irmp_data.address == 0x00FF)
6
      {
7
          irmp_data.protocol = IRMP_RC5_PROTOCOL;
8
          irmp_data.address = 0;  // Hier aendern!
9
10
          switch (irmp_data.command)
11
          {
12
              case 0x11: irmp_data.command = 0x12; break;
13
              case 0x22: irmp_data.command = 0x13; break;
14
              case 0x33: irmp_data.command = 0x14; break;
15
              case 0x44: irmp_data.command = 0x15; break;
16
              default: irmp_data.command = 0x77; break;
17
          }
18
19
          irsnd_send_data (&irmp_data, FALSE);
20
      }
21
    }

Alle oben genannten Zahlen sind natürlich Phantasiewerte.

von Marius (Gast)


Lesenswert?

läuft perfekt :)
Dankeschön!!

Jetzt bin ich nur gerade am überlegen, ob es wirklich der ATTiny4313 
sein muss, auf dem das IRMP Programm läuft, oder ob es einen passenden
preiswerteren (und evtl vom Bauraum her kleineren) µC gibt ??
Die hex Datei hat jetzt ganz genau 4096 byte :)

von Won K. (Firma: Outside the Asylum) (the_sane)


Lesenswert?

Der Tiny85 sollte für die Anwendung reichen, der Preisunterschied zum 
Tiny45 ist nicht groß und es wird nicht so eng.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Won K. schrieb:
> Der Tiny85 sollte für die Anwendung reichen, der Preisunterschied zum
> Tiny45 ist nicht groß und es wird nicht so eng.

Kann ich nur unterschreiben. Der Tiny85 ist dafür ideal.

: Bearbeitet durch Moderator
von Marius (Gast)


Lesenswert?

Hallo nochmal,

habe jetzt den Tiny85 da und wollte das Programm, dass auf dem Tiny43 
lief, auf den 85 spielen.
In den Einstellung vom AVR Studio ist das richtige Device auch 
ausgewählt, allerdings scheint noch etwas mit den Bezeichnungen nicht zu 
passen.
Denn ich bekomme lauter Fehlermeldungen:
1
Error  1  'UBRRH' undeclared 
2
Warning  2  each undeclared identifier is reported only once for each function it appears in  
3
Error  3  'UBRRL' undeclared 
4
Error  4  'UCSRA' undeclared 
5
Error  5  'U2X' undeclared ... 
6
7
usw.

Was habe ich vergessen?
Vielen Dank!

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Marius schrieb:
> Was habe ich vergessen?

Du hast offenbar die Demo-main.c genommen, in welcher UART-Funktionen 
enthalten sind. Die Demo-main.c gibt die IR-Werte auf dem UART aus. Der 
ATTiny hat jedoch keinen UART.

Wirf bitte aus Deiner main.c alles unterhalb
1
#include "irmp.h"

raus, also ab:
[c]
#define BAUD  9600L
#include <util/setbaud.h>

#ifdef UBRR0H
[c]

bis einschließlich der Funktion itoh(). Du brauchst diese Funktionen 
allesamt nicht.

Drinbleiben müssen timer1_init(), ISR() und main().

Gruß,

Frank

: Bearbeitet durch Moderator
von Marius (Gast)


Lesenswert?

Hat funktioniert!!

Vielen Dank und frohes Fest!!

von Jojo S. (Gast)


Angehängte Dateien:

Lesenswert?

Hallo, schon wieder IRMP :-)
Ich kann auch noch eine Portierung anbieten, auf mbed. Es scheint hier 
ja wenig mbed User zu geben, aber da das Projekt ja hier entstanden ist 
möchte ich das auch erstmal hier vorzeigen. Danke an Frank und die 
anderen Mitstreiter für die geniale Arbeit, der Einbau in mbed ist 
wirklich sehr einfach.
Zur Implementierung:
Ich habe erstmal nur den Receiver, den Sender baue ich auch noch. Ich 
habe nur den Input Pin in die IRMP Quellen gepackt, den zyklischen 
Aufruf habe im main gelassen. Das ist durch die Basisfunktionen von mbed 
nur ein Einzeiler und hat den Vorteil das man sich noch in die ISR 
einklinken kann, ich habe zum Testen zB eine Laufzeitmessung eingebaut.
mbed ist auf Anwender Ebene eigentlich C++, eine IRMP Receiver und 
Sender Klasse wäre schöner, ist aber aufwändiger weil dann die globalen 
Variablen entsorgt werden müssten. Mehrere Instanzen eines Receivers an 
einem µC macht vielleicht nicht wirklich Sinn, aber den Inputpin im 
Konstruktor zu übergeben ist bei den mbed Komponenten eigentlich 
Standard und macht die Nutzung noch einfacher.
Da die mbed Welt eine eigene Versionsverwaltung hat halte ich hier einen 
Fork für sinnvoll, solche groben Änderungen in die aktuellen Quellen zu 
würgen ist sicher nicht gut. Nachteil ist natürlich das Änderungen am 
Original IRMP Projekt bei Bedarf nachgezogen werden müssen.
mbed gehört ARM und ich habe in den Nutzungsbedingungen nichts davon 
gefunden das man seine Seele verkauft wenn man da Quellcode hostet. Die 
GNU GPL v2 Notiz bleibt natürlich erhalten und ich werde da auch auf 
mikrocontroller.net verweisen. BTW, gibt es die Doku auch in englisch? 
mbed ist ziemlich MultiKulti.
Es gibt mittlerweile >80 Boards mit verschiedensten Cortex-M von allen 
Herstellern die da unterstützt werden, da wird IRMP noch einige Freunde 
gewinnen. Es hat wich gewundert das es noch nicht da vorhanden ist.
Zu den Laufzeiten die ich in meinem Muster gemessen habe:
Prozesser ist ein LPC1347 Cortex-M3 mit 72 MHz, kompiliert erstmal als 
offline LPCXpresso Projekt mit gcc 4.9.3. Bei Optimierung -Os braucht 
die ISR im Mittel 3 µs und max 28 µs, in der Debug Version 4.1 / 36 µs. 
Aktiviert sind die Standardprotolle und RC5.
Konstruktive Kritik ist willkommen, Diskussionen über C++ bitte gleich 
nach /dev/null verschieben.
So sieht das main.cpp jetzt aus:
1
#include "mbed.h"
2
#include "irmp.h"
3
4
#define LED_ON  0
5
#define LED_OFF 1
6
7
DigitalOut led(P0_14, 1);
8
DigitalOut flash(P0_12, 1);
9
10
Ticker t;
11
12
// only for performance test
13
Timer   timerPerfTest;
14
int    timeISRMax = 0;
15
float  timeISRAvg;
16
int    timeISRAvgSum = 0;
17
int    countISRCalls = 0;
18
19
void irmpISR(void)
20
{
21
  int t1 = timerPerfTest.read_us();
22
23
  irmp_ISR();        // call irmp ISR
24
25
  int timeISR = timerPerfTest.read_us() - t1;    // calc time spent in worker ISR
26
  if (timeISR > timeISRMax)             // store maximum
27
    timeISRMax = timeISR;
28
  timeISRAvgSum += timeISR;            // sum for avg
29
  countISRCalls++;
30
}
31
32
int main() {
33
  printf("IRMP on mbed\n");
34
35
    led = LED_OFF;
36
    timerPerfTest.start();
37
38
    IRMP_DATA irmp_data;
39
40
    irmp_init();                                                            // initialize irmp
41
    t.attach_us(&irmpISR, 1E6 / F_INTERRUPTS);                // call ISR 15.000 / s
42
43
    // infinite loop, interrupts will blink PORTD pins and handle UART communications.
44
    while (1)
45
    {
46
        flash = !flash;
47
48
        if (irmp_get_data (&irmp_data))
49
        {
50
            // ir signal decoded, do something here...
51
            // irmp_data.protocol is the protocol, see irmp.h
52
            // irmp_data.address is the address/manufacturer code of ir sender
53
            // irmp_data.command is the command code
54
          // irm_data.flags is press/release information
55
            // irmp_protocol_names[irmp_data.protocol] is the protocol name (if enabled, see irmpconfig.h)
56
            // printf("proto %d addr %d cmd %d\n", irmp_data.protocol, irmp_data.address, irmp_data.command );
57
58
          // sample decoding, turn LED on / off
59
          if (irmp_data.protocol == IRMP_RC5_PROTOCOL && irmp_data.address == 5)    // old RC5 VCR Remote. TV uses address 0
60
          {
61
            if (irmp_data.flags == 0)    // switch only on button press
62
            {
63
          switch (irmp_data.command)
64
          {
65
          case 0:    // Key '0'
66
            led = LED_OFF;
67
            break;
68
          case 1:    // Key '1'
69
            led = LED_ON;
70
            break;
71
          case 53:    // Key 'play'
72
            printf("bring me a beer!\n");
73
            break;
74
          case 54:    // Key 'stop'
75
            timeISRAvg = (float)timeISRAvgSum / countISRCalls;
76
            timeISRAvgSum = 0;
77
            countISRCalls = 0;
78
            printf("ISR max / avg runtime [microseconds] : %d / %5.2f\n", timeISRMax, timeISRAvg);
79
            timeISRMax = 0;
80
            break;
81
          }
82
            }
83
          }
84
85
          // log to stdout
86
            printf("proto %d addr %d cmd %d flags %x name %s\n", irmp_data.protocol, irmp_data.address, irmp_data.command, irmp_data.flags, irmp_protocol_names[irmp_data.protocol] );
87
        }
88
    }
89
90
}

von Dirk W. (glotzi)


Lesenswert?

Interessante Portierung, ich kannte mbed noch gar nicht. Welches Board 
benutzt du?

Einen Fork von IRMP-MBED fände ich aber ziemlich unschön.

von Jojo S. (Gast)


Lesenswert?

Für diesen Test jetz einen Nachbau von 
https://github.com/sebseb7/pentarm13uxx ,ist zwar kein 'echtes' mbed 
Board ist aber ähnlich wie der DipCortexM3. Ich habe aber noch andere 
LPCxxx Boards, die sollten jetzt ohne weitere Änderung mit der Lib 
laufen.
Die Anpassungen können natürlich in das Original Repository rein. Das 
mbed hat aber einen Online Compiler mit dem man sein Projekt startet. 
Dann kann man über Import eine Lib auswählen und fertig.
mbed wird gerade auf eine neue Version gestellt, das dauert aber schon 
ewig und ist noch sehr unübersichtlich. Der Einstig über die 'Classic' 
Site ist einfacher: https://developer.mbed.org/. Einmal registrieren und 
rechts oben über 'Compiler' ist man in der Welt.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Hallo Jojo,

Jojo S. schrieb:

> Ich kann auch noch eine Portierung anbieten, auf mbed.

Sehr schön, ich werde Deine Änderungen ins IRMP-SVN-Repository 
einpflegen. Danke!

> Ich habe erstmal nur den Receiver, den Sender baue ich auch noch.

Also demnächst noch IRSND? Klasse!

> Da die mbed Welt eine eigene Versionsverwaltung hat halte ich hier einen
> Fork für sinnvoll, solche groben Änderungen in die aktuellen Quellen zu
> würgen ist sicher nicht gut.

Kommt darauf an, wieviel Änderungen notwendig wären. Kann ich aber 
schlecht beurteilen.

> Nachteil ist natürlich das Änderungen am
> Original IRMP Projekt bei Bedarf nachgezogen werden müssen.

Ja.

> BTW, gibt es die Doku auch in englisch? mbed ist ziemlich MultiKulti.

Ich wollte schon immer mal die Doku ins Englische übersetzen, habe aber 
bisher immer den Zeitaufwand gescheut. Ich habe aber schon mal eine 
Formatierung fürs Wiki getestet, mit der man den Doku-Text zweispaltig 
formatieren könnte: Links deutsch, rechts englisch - oder umgekehrt. Die 
Nicht-Fliesstext-Segmente wie Codeausschnitte und Tabellen brauchen ja 
nicht in 2 Sprachen übersetzt werden. Der Code wurde von mir sowieso 
schon immer in Englisch kommentiert.

Vielleicht hat jemand Lust, sich an dem Übersetzungsprojekt zu 
beteiligen? Ich würde dann den Artikel schon mal zweispaltig aufbereiten 
und dann können sich gern Leute kapitelweise daran beteiligen. Wäre 
super, wenn IRMP auch über die Landesgrenzen hinaus bekannter werden 
würde.

> So sieht das main.cpp jetzt aus:

Sehr gut. Ich habe mir sowieso vorgenommen, für jede µC-Familie 
zukünftig ein eigenes main.c bzw. main.cpp anzubieten, damit das wieder 
übersichtlicer wird.

Ich baue Deine Änderungen im Laufe der kommenden Woche ein.

von Conny G. (conny_g)


Lesenswert?

Als Nutzer und Fan würde ich mich an der Übersetzung beteiligen.

von Jojo S. (Gast)


Lesenswert?

Hallo Frank,
danke für die Rückmeldung.
Ich habe den Receivercode mit einer kurzen Beschreibung jetzt auf mbed 
public gemacht: https://developer.mbed.org/users/JojoS/code/IRMP/

Danke auch das du den Code in das SVN übernimmst, die Änderungen sind ja 
überschaubar. Für mbed Nutzer ist der Import über das eigene System 
einfacher und hier geht das Interesse an mbed glaube ich gegen Null, 
deshalb sollte ein Fork hier nichts ausmachen. Ich lasse den Code auf 
mbed erstmal so, mal sehen wie die Resonanz ist, mir würde eine C++ 
Version besser gefallen. Aber erstmal noch die Sendefunktionen einbauen.

An der Übersetzung kann ich mich auch beteiligen. Wäre es nicht 
einfacher die Seite zu kopieren und dann zu übersetzen? Das Layout mit 
den vielen Illustrationen wird zweispaltig sicher unübersichtlich und 
alleine das Layout zu ändern ist schon viel Arbeit.

Wenn du den Code nochmal reorganisieren möchtest: bei mbed ist aus einem 
Board mittlerweile auch >80 mit vielen verschiedenen Prozessoren 
geworden. Da wurde das über einen HAL (hardware abstraction layer) 
gelöst. Es gibt /hal in dem C-headerfiles als interface für die internen 
Funktionen liegen. Die Implementierung ist dann in 
/targets/controller_xy/hal. Dann gibt es noch /common wo zB das 
plattformunabhängige init() oder analyze() drin ist. In /api sind die 
header für die Funktionen die der User aufrufen darf. Um das dann für 
C++ tauglich nutzbar zu machen (auch mbed code für gpio & co. ist innen 
C) müssen die benutzten Variablen in eine Struktur und die Funktionen 
haben als Argument einen Zeiger auf die Struktur.

von Dirk W. (glotzi)


Lesenswert?

Johannes, du hast die Lizenz von IRMP im mbed-Repo falsch angegeben, 
nicht Apache, sondern GPL ist richtig.

Das Selbstbau-Board auf github ist nichts für mich. Mir sind da die 
STM32 Nucleo ins Auge gesprungen, die sind recht günstig und sollten für 
einen IR-Empfänger locker reichen. Der NUCLEO-F303K8 beispeilsweise ist 
schön kompakt. Wie sind deine Erfahrungen mit den Dingern?

von Jojo S. (Gast)


Lesenswert?

Als Lizenz Option kann man da MIT oder Apache oder nichts (?) angeben. 
GPL sehe ich da nicht, habe da keine Erfahrungen. Passt MIT besser?

Ein Nucleo Board habe ich nicht, aber die neuen kleinen im Nano-Format 
gefallen mir auch. Ich habe gerade noch ein China board mit ST32 F103 
C8T6, vielleicht passt der Code. Aber da ist kein STLink dran, das 
kriege ich ad hoc nicht geflasht. Ich habe das in 'meine Hardware' Liste 
gepackt um sehen ob der Code kompiliert wird, das tut er, nur die 
Portnamen müssen angepasst werden.

Edit:
hiernach http://producingoss.com/de/license-choosing.html ist MIT GPL 
kompatibel, ich habe das umgestellt.

von Dirk W. (glotzi)


Lesenswert?

MIT oder Apache sind definiv falsch, ich würde dann wohl lieber nichts 
angeben. Dann gilt wohl das, was im Sourcecode steht. Aber eigentlich 
ist das Frank's Sache, ich wollte nur drauf hinweisen.

Die ST32F103 werden unterstützt:
https://www.mikrocontroller.net/articles/IRMP_auf_STM32_-_ein_USB_IR_Empf%C3%A4nger/Sender/Einschalter_mit_Wakeup-Timer

von Jojo S. (Gast)


Lesenswert?

Danke für den Hinweis, ich denke du hast Recht. Habe jetzt nichts 
angegeben und die Lizenz Info auf der Website ist weg. Damit gelten die 
Angaben im Quelltext, das habe ich ja unverändert übernommen.

Die ST32F103 werden quasi nativ von IRMP unterstützt, aber wenn man den 
Code mit der mbed lib nimmt wird dieser nativ-Code ja nicht genutzt. Das 
ist ja der Charme von mbed, mit den paar Zeilen Änderung läuft das auch 
auf Atmel, Freescale, Nordic, Renesas, ST und was da sonst noch kommen 
mag. Für richtige 'mbed ready' boards braucht man keine Zusatzhardware 
bis auf ein USB Kabel, programmiert wird per Copy auf einen USB Speicher 
der von integrierter mbed Hardware bereitgestellt wird. Bei den ST 
Boards ist das der STLink v2 der eine passende Firmware bekommt. Wenn an 
dem Board ein SWD/JTag Anschluss ist kann man das binärfile aber auch 
mit anderen Tools flashen.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Conny G. schrieb:
> Als Nutzer und Fan würde ich mich an der Übersetzung beteiligen.

Vielen Dank für Dein Angebot!

Jojo S. schrieb:
> Ich habe den Receivercode mit einer kurzen Beschreibung jetzt auf mbed
> public gemacht: https://developer.mbed.org/users/JojoS/code/IRMP/

Gut.

> An der Übersetzung kann ich mich auch beteiligen.

Prima! Auch Dir ein Danke!

> Wäre es nicht
> einfacher die Seite zu kopieren und dann zu übersetzen? Das Layout mit
> den vielen Illustrationen wird zweispaltig sicher unübersichtlich und
> alleine das Layout zu ändern ist schon viel Arbeit.

Da habe ich auch lange überlegt. Nachteil bei zwei getrennten Artikeln 
wäre, dass wahrscheinlich nicht jedes Update im Artikel in der jeweils 
anderen Sprache nachgezogen wird. Allerdings ist es auch nicht möglich, 
die Überschriften, die im Inhaltsverzeichnis landen, zweispaltig zu 
machen. Wahrscheinlich ist es doch besser, einen extra Artikel für die 
englischsprachige Version zu erstellen.

Bei der Gelegenheit würde ich gerne IRSND als eigenen Artikel gestalten. 
Das modularisiert das Ganze mehr und die Artikel werden nicht so 
ellenlang.

Was meint Ihr? Ich würde dann heute abend schonmal IRSND von IRMP 
abtrennen und für IRMP und IRSND dann zwei englischsprachige Artikel 
anlegen, indem ich dort erstmal den deutschsprachigen Inhalt 
reinkopiere. Dann kann man den Text besser übersetzen, wenn man auf 
einen Blick den deutschen Text sieht, ohne dauernd in ein zweites 
Fenster wechseln zu müssen.

> Wenn du den Code nochmal reorganisieren möchtest: bei mbed ist aus einem
> Board mittlerweile auch >80 mit vielen verschiedenen Prozessoren
> geworden. Da wurde das über einen HAL (hardware abstraction layer)
> gelöst. Es gibt /hal in dem C-headerfiles als interface für die internen
> Funktionen liegen. Die Implementierung ist dann in
> /targets/controller_xy/hal. Dann gibt es noch /common wo zB das
> plattformunabhängige init() oder analyze() drin ist. In /api sind die
> header für die Funktionen die der User aufrufen darf. Um das dann für
> C++ tauglich nutzbar zu machen (auch mbed code für gpio & co. ist innen
> C) müssen die benutzten Variablen in eine Struktur und die Funktionen
> haben als Argument einen Zeiger auf die Struktur.

Danke für den Tipp. Muss ich mir mal anschauen.

Dirk W. schrieb:
> Das Selbstbau-Board auf github ist nichts für mich. Mir sind da die
> STM32 Nucleo ins Auge gesprungen, die sind recht günstig und sollten für
> einen IR-Empfänger locker reichen. Der NUCLEO-F303K8 beispeilsweise ist
> schön kompakt. Wie sind deine Erfahrungen mit den Dingern?

IRMP läuft bereits seit einem Jahr auf den Nucleo STM32F4xx-Boards. Wird 
auch von mir in folgendem Projekt bereits verwendet: 
WordClock mit WS2812.


Jojo S. schrieb:
> Ich habe gerade noch ein China board mit ST32 F103
> C8T6, vielleicht passt der Code.

Auch da läuft bereits IRMP nativ - ebenso bei obigem Projekt.

Gruß,

Frank

von Jojo S. (Gast)


Lesenswert?

Frank M. schrieb:
> Was meint Ihr? Ich würde dann heute abend schonmal IRSND von IRMP
> abtrennen und für IRMP und IRSND dann zwei englischsprachige Artikel
> anlegen, indem ich dort erstmal den deutschsprachigen Inhalt
> reinkopiere.

ja, so sollte das einfach gehen.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Ich habe nun IRSND von IRMP abgetrennt und jeweils Duplikate für die 
englischsprachige Variante angelegt.

Übersicht:

  IRMP
  IRSND

  IRMP - english
  IRSND - english

Wenn jemand ein bestimmtes Kapitel bearbeiten möchte, sollte er einfach 
dieses Kapitel hier im Thread nennen und dann beginnen. So vermeiden wir 
Doppelarbeit. Nicht, dass sich 2 Leute gleichzeitig auf ein- und 
dasselbe Kapitel stürzen...

Gruß,

Frank

von Jojo S. (Gast)


Lesenswert?

Is schon spät, aber ein paar Zeilen schaffe ich noch. Es wird nich immer 
Wort für Wort sein, aber mein alter Englischlehrer fand es auch 
wichtiger den Sinn zu treffen.
Bis ich Stop sage...

von Jojo S. (Gast)


Lesenswert?

...stop. Bis Download runtergerasselt, darf gerne noch korrigiert 
werden, ich seh nix mehr.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Jojo S. schrieb:
> ...stop.

Super, da hast Du ja schon saubere Arbeit geleistet! :-)

> Bis Download runtergerasselt, darf gerne noch korrigiert
> werden, ich seh nix mehr.

Bis auf ein paar vergessene Wörter (z.B. "als" -> "as") ist es perfekt. 
Aber das sind Kleinigkeiten.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Ich hab mal

   IRMP - english: IR Protocols in Detail
und
   IRMP - english: Software History

durchgearbeitet. Kleine Änderungen sind noch nötig, aber es wird :-)

: Bearbeitet durch Moderator
von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Es geht weiter:

Ich habe nun dank Jojos Vorarbeit an der Übersetzung von IRMP den 
englischen Text nun ebenso für IRSND bis "Download" übersetzt. War ja 
fast nur "Abschreibearbeit" :-)

Ebenso habe ich in IRSND die "Software History" nach englisch übersetzt 
und sämtliche Links auf die entsprechenden englisch-sprachigen Titel 
umgeschrieben.

: Bearbeitet durch Moderator
von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Wenn ich nichts übersehen habe, ist IRSND - english nun komplett 
übersetzt. :-)

Mag da jemand mal drüberschauen?

Der Großteil steckt allerdings im IRMP-Artikel. Da ist noch jede Menge 
zu tun.

Danke,

Frank

: Bearbeitet durch Moderator
von Jojo S. (Gast)


Lesenswert?

Nearly done.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Jojo S. schrieb:
> Nearly done.

Klasse! Ich habe noch den Rest erledigt (Literature & Acknowledgement). 
Du stehst da natürlich jetzt auch drin ;-)

Vielen vielen Dank, Jojo!

Gruß,

Frank

P.S.
Wäre trotzdem nicht schlecht, wenn da jemand nochmal drüberschauen 
möchte. Ab und zu findet man noch ein deutsches Wort oder einen Satz. 
Manches ist wahrscheinlich auch nicht optimal übersetzt. Aber das sieht 
schon verdammt gut aus! :-)

von Jojo S. (Gast)


Lesenswert?

Ich danke auch, die ganze Lib und Tools und dann noch dokumentiert sind 
ja sehr saubere Arbeit. Wenn man das so intensiv liest sieht man das da 
verdammt viel drinsteckt.
Mein China STM32F103 board konnte ich inzwischen auch flashen (mit 
CooCox CoFlash und LPCLink2), aber die mbed Version der lib läuft darauf 
leider nicht. Das ist aber ein Problem der Ticker Implementierung, ich 
habe gesehen das da mehrere Leute Probleme mit haben. Schade, der mbed 
Ansatz ist gut aber in der Praxis stösst man doch öfter auf Probleme. 
Die lib läuft bei mir auf einem LPC4088 (von Embedded Artists) und dem 
LPC1347 Selbstbau. Auf einem LPC1549 der auch einen Cortex-M3 mit 72 MHz 
hat (wie der 1347) läuft es nur ganz müde mit 5 kHz Int, die 
Timergeschichte verbrät viel zu viel Zeit, auch ein Fehler in der mbed 
lib.
Interesse gab es auf der mbed Seite auch noch nicht, aber die Community 
dort ist viel träger als µC.net :-)

Eine weitere Idee: kann IRMP nicht auch Funksignale dekodieren? Der 
Ansatz müsste doch auch passen um z.B. Funkthermometer oder FS20 zu 
verstehen. Hat das hier schonmal jemand in diese Richtung probiert?

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Jojo S. schrieb:
> Ich danke auch, die ganze Lib und Tools und dann noch dokumentiert sind
> ja sehr saubere Arbeit. Wenn man das so intensiv liest sieht man das da
> verdammt viel drinsteckt.

Das stimmt allerdings. Macht aber auch Spaß :-)

> Mein China STM32F103 board konnte ich inzwischen auch flashen (mit
> CooCox CoFlash und LPCLink2), aber die mbed Version der lib läuft darauf
> leider nicht.

Immerhin läuft IRMP nativ auf dem kleinen Ding. Ist ja schon mal was.

> Schade, der mbed
> Ansatz ist gut aber in der Praxis stösst man doch öfter auf Probleme.

Das ist das Problem bei der Abstraktion: Man muss immer Kompromisse 
eingehen. Das kann dann auch zu Problemen führen.

> Die lib läuft bei mir auf einem LPC4088 (von Embedded Artists) und dem
> LPC1347 Selbstbau.

Prima. Ich plane, die Infos zu der tauglichen Hardware im Artikel noch 
generell etwas auszubauen.

> Auf einem LPC1549 der auch einen Cortex-M3 mit 72 MHz
> hat (wie der 1347) läuft es nur ganz müde mit 5 kHz Int, die
> Timergeschichte verbrät viel zu viel Zeit, auch ein Fehler in der mbed
> lib.

Wahrscheinlich.

> Interesse gab es auf der mbed Seite auch noch nicht, aber die Community
> dort ist viel träger als µC.net :-)

Nicht so ungeduldig. Gut Ding will Weile haben :-)

> Eine weitere Idee: kann IRMP nicht auch Funksignale dekodieren?

Ja, erste Versuche habe ich bereits mit einer 
Aldi-Funksteckdosen-Fernbedienung gemacht. Da kommt garantiert etwas in 
der nächsten Zeit :-)

Gruß und nochmals Dank,

Frank

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

IRMP und IRSND 3.0.0 sind online.

Änderungen IRMP:

  - Korrektur der Portierung auf ESP8266
  - Portierung auf MBED-Systeme hinzugefügt
  - Mehrere Beispiel-Main-Source-Dateien (plattformabhängig) hinzugefügt

Als Beispiel-Anwendungen habe ich hinzugefügt:

    irmp-main-avr.c           - AVR
    irmp-main-avr-uart.c      - AVR mit UART-Ausgabe
    irmp-main-pic-xc8.c       - PIC (XC8 compiler)
    irmp-main-stm32.c         - STM32
    irmp-main-stellaris-arm.c - TI Stellaris LM4F120 Launchpad
    irmp-main-esp8266.c       - ESP8266
    irmp-main-mbed.cpp        - MBED

Änderungen IRSND:

  - Beispiel-Main-Datei irsndmain.c in irsnd-main-avr.c umbenannt

Die Artikel IRMP und IRMP - english sind beide auf dem neuesten 
Stand.

Viel Spaß mit IRMP!

von Micha H. (Firma: Dg3brb) (kanadakruemel)


Lesenswert?

Hallo Frank,
erstmal vielen Dank für die tolle Arbeit. Läuft seit Ewigkeiten in 
meinem VDR als Einschalter und LIRC Quelle.
Zu der Idee mit der Funkanbindung:
Schau doch mal beim SIGNALduino Projekt vorbei. Die machen sowas 
ähnliches schon. Vielleicht kannst Du Dir da noch ein paar Ideen holen.
Siehe http://www.fhemwiki.de/wiki/SIGNALduino
und https://github.com/RFD-FHEM/SIGNALduino.
Ich benutze den SIGNALduino für Intertechno Steckdosen schalten und 
Wettersensoren empfangen.

Gruß,
Micha

von Jojo S. (Gast)


Lesenswert?

Frank M. schrieb:
> Das ist das Problem bei der Abstraktion: Man muss immer Kompromisse
> eingehen. Das kann dann auch zu Problemen führen.

ja, ist richtig. Aber der eine gleich schnelle schafft die ISR ja auch 
in 3 µs, der 1549 verbrät >30µs. Gut ist das die Quellen der mbed lib 
auch public sind. Ich sollte mal was anderes machen, aber es juckt schon 
wieder in den Fingern...

> Ja, erste Versuche habe ich bereits mit einer
> Aldi-Funksteckdosen-Fernbedienung gemacht. Da kommt garantiert etwas in
> der nächsten Zeit :-)

Klasse. Etwas schwieriger ist sicher das mehr Informationen in den 
Telegrammen steckt als nur Typ/Adresse/Kommando.

> Nicht so ungeduldig. Gut Ding will Weile haben :-)
ja ist richtig. Aber IR Fernbedienungen sind ja auch schon out, heute 
läuft alles übers Smartphone :-)
Und die mbed developer Seite wird gerade wieder zugespamt, ein übles 
Problem da das öfter zu sehen ist.

von Reinhard (Gast)


Lesenswert?

Kann mir bitte jemand bestätigen, ob die IR-Fernbedienung MERLIN, die es 
bei Pollin für einen Euro gibt mit einem 38kHz oder 56kHz TSOP 
funktioniert? Leider habe ich widersprüchliche Angaben dazu gefunden. 
Mit 38kHz bekomme ich meine Fernbedienung leider nicht zum Laufen, nicht 
eine Taste wird erkannt. Aktiviert habe ich nur das Merlin Protokoll bei 
20kHz Interrupts.

Danke und viele Grüße,

Reinhard

von Reinhard (Gast)


Lesenswert?

Mit dem 56kHz TSOP 31256 läuft die Merlin Fernbedienung einwandfrei.
Ich habe nur das Merlin Protokoll aktiviert und 20kHz Interrupts 
konfiguriert.

Viele Grüße!!!

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Reinhard schrieb:
> Mit dem 56kHz TSOP 31256 läuft die Merlin Fernbedienung einwandfrei.

Sorry, war letzte Woche unterwegs, sonst hätte ich Dir eher antworten 
können.

Im Artikel sind auch die 56kHz eingetragen, siehe:

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

P.S.

Ich sehe gerade: Das wurde erst kürzlich (wahrscheinlich von Dir?) im 
Artikel korrigiert. Ich habe die Änderung im englischsprachigen Artikel 
gerade nachgezogen.

: Bearbeitet durch Moderator
von Daniel W. (Gast)


Lesenswert?

Hallo,

ich versuche gerade IRMP auf einem ATtiny85 zum Laufen zu bekommen aber 
komme nicht so ganz weiter.

Ich nutze das AtmelStudio 7.0
Hat das schon mal einer hinbekommen? Ich habe hier Fehler beim linken.

Der lib Ordner und die lib ist angegeben. Aber die Parameter für den 
avr-gcc sehen auch so komisch aus die das Studio zusammenbaut, sowas wie 
-lirmp.h ich meine da fehlt doch ein Leerzeichen. Bearbeite ich das 
Makefile manuell und nehme das kommen wieder andere Fehler.

Vielleicht ist ja jemand dabei, der das schon am rennen hat.

Gruß
Daniel

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Daniel W. schrieb:
> Hat das schon mal einer hinbekommen?

Auf einem ATTiny85? Ja, ich. Auch mit ATTiny45. Aber bisher nicht mit 
AtmelStudio 7 probiert.

> Ich habe hier Fehler beim linken.

Welche Fehler? Man kann die kopieren und hier einfügen. ;-)

> Vielleicht ist ja jemand dabei, der das schon am rennen hat.

Zeig einfach mal die Fehlermeldungen.

Hast Du denn irmp.c zum Projekt hinzugefügt?

: Bearbeitet durch Moderator
von Daniel W. (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Frank, danke für deine Unterstützung.

Die .c habe ich nicht angegeben bei Studio 7, ich habe nur die irmp.h 
bei den libraries angegeben.

Fehlerausgabe von Studio 7 ist im Anhang.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Daniel W. schrieb:
> Die .c habe ich nicht angegeben bei Studio 7,

IRMP ist keine vorkompilierte Library, Du musst daher irmp.c als 
Quellcode zum Projekt hinzufügen.

> ich habe nur die irmp.h
> bei den libraries angegeben.

irmp.h ist eine sog. Header-Datei und keine Library. Nimm das wieder 
raus.

Dann sollte es gehen.

von Daniel W. (Gast)


Lesenswert?

Ja stimmt, und der andere Fehler mit der avr25 spec habe ich auch 
behoben. Der hat nach "specs-avr25" gesucht aber es lag nur eine 
"specs-attiny85" im Ordner, ich hab die einfach umkopiert.

Gut Danke, dann schaue ich mal ob ich weiter kommt.

Gruß
Daniel

von Reinhard (Gast)


Lesenswert?

Hi Frank,

ja, ich habe den Artikel bearbeitet und die 38kHz durch 56kHz ersetzt.

Viele Grüße,

Reinhard

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Hi Reinhard,

Reinhard schrieb:
> ja, ich habe den Artikel bearbeitet und die 38kHz durch 56kHz ersetzt.

Danke für die Info, dann hat sich das ja nun geklärt :-)

von Daniel W. (Gast)


Lesenswert?

Nabend,

ich hab da noch mal eine Frage zum ATtiny85 und dem Interrupt. Ich hab 
alles so wie im Beispiel, F_CPU 8000000UL und F_INTERRUPTS auf 15000 pro 
Sekunde. Allerdings sind das bei mir ca 15000 pro 11 Sekunden. Also 
irgend etwas läuft da zu langsam.

Das Fusebit steht bei mir auf 8 MHz internal 6CK_15CK_64MS, sollte doch 
also passen?!?

Bemerkt habe ich das, da ich ein Taster abfrage ob dieser unter 1s oder 
länger gedrückt wurde und das mache ich über die ISR.

Was kann ich denn noch vergessen haben? Ich muss gestehen ich bin ein 
bissel raus aus der µC Programmierung ;-)

/Daniel

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Daniel W. schrieb:
> ich hab da noch mal eine Frage zum ATtiny85 und dem Interrupt. Ich hab
> alles so wie im Beispiel, F_CPU 8000000UL und F_INTERRUPTS auf 15000 pro
> Sekunde. Allerdings sind das bei mir ca 15000 pro 11 Sekunden. Also
> irgend etwas läuft da zu langsam.

Offenbar ist die CKDIV8-Fuse bei Dir noch gesetzt. Dann wird der Takt 
intern durch 8 geteilt und der µC läuft nur mit 1MHz.

von Gottfried P. (gottfried_p)


Angehängte Dateien:

Lesenswert?

Hallo!

Ich möchte einen kleinen Beitrag zu diesem tollen Projekt leisten.
Im Anhang die Erweiterung um ein zusätzliches Protokoll, Mitsubishi
Heavy Airconditioner, sowohl IRMP als auch IRSND.
Bitte Datei Info.txt beachten!

GP

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Hallo Gottfried,

Gottfried P. schrieb:

> Im Anhang die Erweiterung um ein zusätzliches Protokoll, Mitsubishi
> Heavy Airconditioner, sowohl IRMP als auch IRSND.

Erstmal vielen Dank!

Ich habe Deine Änderungen in den aktuellen Source eingearbeitet. Dabei 
habe ich die uneinheitliche Schreibweise xxxx_MITSUBISHI_xxxx und 
xxxx_MITSU_HEAVY_xxxx vereinheitlicht zu xxxx_MITSU_HEAVY_xxxx.

> Bitte Datei Info.txt beachten!

Danke, habe ich gelesen. Du schreibst da etwas zu Timingverfälschungen, 
die im Empfänger(?) entstehen. Kann es sein, dass Du einen TSOP benutzt 
hast, der nicht ganz zur tatsächlichen Modulationsfrequenz passt?

Außerdem habe ich gesehen, dass Du einige Timing-Parameter von anderen 
Protokollen geändert hast. Das kam mir ziemlich spanisch vor, besonders, 
weil bestimmte Protokolle wie NEC sehr gut im Internet dokumentiert 
sind.

Benutzt Du vielleicht keinen Quarz am Sende-AVR? Während IRMP da 
ziemlich tolerant ist und keinen Quarz braucht, ist dieser für IRSND 
schon sinnvoll, da einige Geräte bzgl. Timing ziemlich penibel sind.

Deine Änderungen kommen dann ins nächste Release. Deine Erläuterungen 
zum MITSU_HEAVY-Protokoll werde ich dann auch in den Artikel schieben.

Vielen Dank,

Frank

: Bearbeitet durch Moderator
von Daniel W. (Gast)


Lesenswert?

Frank M. schrieb:
> Offenbar ist die CKDIV8-Fuse bei Dir noch gesetzt. Dann wird der Takt
> intern durch 8 geteilt und der µC läuft nur mit 1MHz.

Hallo Frank,

das hatte ich raus genommen. Aber wie ich festgestellt habe war der µC 
echt defekt und scheint genau das nicht gefressen zu haben. Ich hab den 
Haken entfernt, der verify sagte alles ok, beim erneuten auslesen war er 
Haken wieder drin! Ich habe einen anderen µC genommen und jetzt 
funktioniert es! Gibt von AVR auch schon Kopien auf dem Markt?!?

Ich habe mal noch eine andere Frage. Mein Projekt (IR USB Switch) 
funktioniert mittlerweile sehr gut. Also ein kleiner USB Zwischenstecker 
wo man per IR den Strom an und ausstellen kann. Ist Ideal für sowas wie 
die FireTV Sticks etc.

Beim anlernen der Befehle ist es so, dass ich erst den "An" Befehl 
anlerne, diesen dann abspeicher im eeprom und der nächste gelesene Wert 
ist dann das "Aus" Kommando. Allerdings scheint die Fernbedienung das 
Signal so oft zu senden, dass das falsche Signal im Puffer ist. Wie kann 
ich denn nach dem Lesen des ersten Codes das irmp_get_data so 
"zurücksetzen" das alles aus der Pipe ist?

Also um es mal einfach zu sagen, der Codeabschnitt ist mein Problem:
1
while (1)
2
{
3
  if (irmp_get_data  &irmp_data))  
4
  {
5
    if (mode == 2)
6
    {
7
      // Programmierung/Speicherung Taste AN
8
      commandArray[0] = irmp_data.address;
9
      commandArray[1] = irmp_data.command;
10
      mode = 3;
11
    }
12
    else if (mode == 3)
13
    {
14
      // Programmierung/Speicherung Taste AUS
15
      commandArray[2] = irmp_data.address;
16
      commandArray[3] = irmp_data.command;
17
      
18
      // Daten im EEPROM speichern
19
      eeprom_write_block (commandArray, eeArray, sizeof(commandArray));
20
      mode = 0;
21
    }
22
    else if (mode == 0 || mode == 1)
23
    {
24
      // Wenn Code bekannt, schalte USB an oder aus
25
      if (irmp_data.address == commandArray[0] && irmp_data.command == commandArray[1])
26
      mode = 1;
27
      if (irmp_data.address == commandArray[2] && irmp_data.command == commandArray[3])
28
      mode = 0;          
29
  }  
30
}
Gruß
Daniel

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Daniel W. schrieb:

> Ich habe einen anderen µC genommen und jetzt funktioniert es!

Freut mich.

> Gibt von AVR auch schon Kopien auf dem Markt?!?

Keine Ahnung, wo hast Du den denn her?

> Allerdings scheint die Fernbedienung das
> Signal so oft zu senden, dass das falsche Signal im Puffer ist. Wie kann
> ich denn nach dem Lesen des ersten Codes das irmp_get_data so
> "zurücksetzen" das alles aus der Pipe ist?

Ja, das Problem kenne ich. Die Pipe-Länge beim IRMP ist maximal 1. Um 
die Pipe zu leeren, reicht ein Einfügen von

   irmp_get_data (&irmp_data);

vor dem eigentlichen irmp_get_data() Aufruf, welcher ausgewertet werden 
soll. Damit schmeisst Du einen vorher zuviel empfangenen Frame weg. Bei 
Deiner Logik ist das nicht ganz so einfach. Deshalb habe ich dort den 
Flush dann nach dem Speichern im EEPROM eingebaut, s.u. Müsste so 
klappen.

Außerdem solltest Du nur Frames ohne Repetition-Flag auswerten - siehe 
erstes if. Genau damit ignorierst Du dann Frames, wenn Du eine Taste zu 
lang drückst.

Also:
1
while (1)
2
{
3
  if (irmp_get_data  (&irmp_data) &&
4
      (irmp_data.flags & IRMP_FLAG_REPETITION) == 0)  // only if no repetition
5
  {
6
    if (mode == 2)
7
    {
8
      // Programmierung/Speicherung Taste AN
9
      commandArray[0] = irmp_data.address;
10
      commandArray[1] = irmp_data.command;
11
      mode = 3;
12
      irmp_get_data  (&irmp_data);   // flush input
13
    }
14
    else if (mode == 3)
15
    {
16
      // Programmierung/Speicherung Taste AUS
17
      commandArray[2] = irmp_data.address;
18
      commandArray[3] = irmp_data.command;
19
20
      // Daten im EEPROM speichern
21
      eeprom_write_block (commandArray, eeArray, sizeof(commandArray));
22
      mode = 0;
23
      irmp_get_data  (&irmp_data);   // flush input
24
    }
25
    else if (mode == 0 || mode == 1)
26
    {
27
      // Wenn Code bekannt, schalte USB an oder aus
28
      if (irmp_data.address == commandArray[0] && irmp_data.command == commandArray[1])
29
      {
30
          mode = 1;
31
      }
32
      else if (irmp_data.address == commandArray[2] && irmp_data.command == commandArray[3])
33
      {
34
          mode = 0;
35
      }
36
  }
37
}

Beachte auch das else unten. Spart etwas CPU-Zeit.

Gruß,

Frank

: Bearbeitet durch Moderator
von Daniel W. (Gast)


Lesenswert?

Super danke, läuft sehr gut jetzt.

Dann kann ich ja mal eine Platine Layouten und ein passendes Gehäuse 
suchen ;-)

Vielen Dank für deine Hilfe!

Daniel

von Gottfried P. (gottfried_p)


Lesenswert?

Hallo Frank!

> Du schreibst da etwas zu Timingverfälschungen,
> die im Empfänger(?) entstehen. Kann es sein, dass Du einen TSOP benutzt
> hast, der nicht ganz zur tatsächlichen Modulationsfrequenz passt?

> Außerdem habe ich gesehen, dass Du einige Timing-Parameter von anderen
> Protokollen geändert hast. Das kam mir ziemlich spanisch vor, besonders,
> weil bestimmte Protokolle wie NEC sehr gut im Internet dokumentiert
> sind.
> Benutzt Du vielleicht keinen Quarz am Sende-AVR?

Also ich betreibe das auf Basis eines Arduino Uno Klones. Der hat aber 
sehr wohl einen Quarz. Und wie ich im Begleittext geschrieben habe, RC6 
hat der VU+ einfach nicht verstanden mit dem vorgegebenen Timing.
Bzgl. TSOP: ich hab da nicht so genau geschaut. Einmal verwende ich das 
"Verlängerungskabel" das bei VU dabei war (IR-Sensor und IR-Led), in der 
Anwendung einen aus einem Beamer ausgebauten Empfänger. Könnte schon 
sein, dass da die empfangenen Bitzeiten ein bisserl verschieden sind. 
Die Timing-Parameter der für mich interessanten Protokolle habe ich so 
lange geändert, bis kein merklicher Unterschied zwischen Original-FB und 
IRSND am Logic-Analyser zu sehen war. Die Verfälschungen durch den TSOP 
fallen da weg.
Ansonsten könnte natürlich auch sein, dass die vermessenen 
Fernbedienungen ziemlich daneben sind. Besonders bei meiner NEC die zu 
einem Ledstrip gehört lege ich mich da gar nicht fest....

Dank und Anerkennung für das IRMP- und Deine anderen Projekte, 
namentlich Fli4l und Eisfair.

lg Gottfried

von Morpheus1997 (Gast)


Lesenswert?

Hallo Frank,

ich habe am Wochenende auch angefangen, mich mit dem Thema 
Infrarot-Dekodierung auseinander zu setzen. Ich habe hierfür eine 
Platine mit einem Atmega32, der mit einem 12 MHz Quarz läuft, zusammen 
gelötet, und wollte nun mit deinem Programm mittels UART die Codes von 
verschiedenen Fernbedienungen am PC über HTerm auslesen.

Ich benutze den IRMP Code der Version 3.0.0. Hierbei benutze ich als 
Main-Programm den Code aus "irmp-main-avr-uart". Ich arbeite mit dem AVR 
Studio 5.1 und habe aus den Dateien irmp.c, irmp-main-avr-uart.c, 
irmpprotocols.h, irmpsystem.h, irmp.h und irmpconfig.h ein Projekt 
erstellt. Die Einstellungen sollten soweit alle richtig sein, den 
Mikrocontroller habe ich über das AVR Studio eingestellt (in dem 
makefile ist es somit auch richtig angegeben), den Code habe ich an den 
verwendeten Quarz angepasst, die Fuses auch soweit eingestellt und bei 
der Konfigurationsdatei den verwendeten Pin des angeschlossenen 
TSOP-31238 Infrarot-Empfängers angepasst.

So nun versuche ich wie gesagt, über eine serielle Schnittstelle eine 
Verbindung zum PC aufzubauen. In HTerm antwortet der Mikrocontroller 
jedoch weder auf gesendete Befehle, noch sendet er die dekodierten 
Protokolldaten über die serielle Schnittstelle.

Ich konnte ausschließen, dass es ein Hardware-Fehler ist, denn wenn ich 
die Endlossschleife leicht anpasse, in dem der Mikrocontroller 
beispielsweise jede Sekunde den Buchstaben 'A' sendet, so wird dies auch 
bei HTerm angezeigt. Kommentier ich das jedoch wieder aus und füge 
wieder wie gehabt
1
for (;;)
2
    {
3
        if (irmp_get_data (&irmp_data))
4
        {
5
            uart_puts_P (PSTR("protocol: 0x"));
6
            itoh (buf, 2, irmp_data.protocol);
7
            uart_puts (buf);
8
9
#if IRMP_PROTOCOL_NAMES == 1
10
            uart_puts_P (PSTR("   "));
11
            uart_puts_P (pgm_read_word (&(irmp_protocol_names[irmp_data.protocol])));
12
#endif
13
14
            uart_puts_P (PSTR("   address: 0x"));
15
            itoh (buf, 4, irmp_data.address);
16
            uart_puts (buf);
17
18
            uart_puts_P (PSTR("   command: 0x"));
19
            itoh (buf, 4, irmp_data.command);
20
            uart_puts (buf);
21
22
            uart_puts_P (PSTR("   flags: 0x"));
23
            itoh (buf, 2, irmp_data.flags);
24
            uart_puts (buf);
25
26
            uart_puts_P (PSTR("\r\n"));
27
        }
28
    }
 in die Endlosschleife, so kommt erneut nichts bei HTerm an.

Zusammengefasst sollte als die Hardware-Uart-Anbindung stimmen.
Wahrscheinlich habe ich irgend eine Kleinigkeit übersehen, die man am 
Code noch an den Mikrocontroller anpassen muss, sodass die 
Uart-Kommunikation erfolgreich verläuft. Ich kann jedoch einfach nicht 
herausfinden, woran es genau scheitert.

Vielleicht kannst du mir hier ja helfen.

LG Marcel

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Morpheus1997 schrieb:

> So nun versuche ich wie gesagt, über eine serielle Schnittstelle eine
> Verbindung zum PC aufzubauen. In HTerm antwortet der Mikrocontroller
> jedoch weder auf gesendete Befehle, noch sendet er die dekodierten
> Protokolldaten über die serielle Schnittstelle.

Wahrscheinlich ist im HTERM Hardware-Handshake eingestellt. Dann klappt 
das nicht, weil der UART vom AVR keine Hardware-Handshake-Leitungen hat.

Abhilfe: Im HTERM Handshake abstellen - falls möglich, oder PuTTY 
verwenden.

: Bearbeitet durch Moderator
von Morpheus1997 (Gast)


Lesenswert?

Frank M. schrieb:
> Wahrscheinlich ist im HTERM Hardware-Handshake eingestellt. Dann klappt
> das nicht, weil der UART vom AVR keine Hardware-Handshake-Leitungen hat.
>
> Abhilfe: Im HTERM Handshake abstellen - falls möglich, oder PuTTY
> verwenden.

Hm, ich habs heute ausprobiert, doch leider schafft auch PuTTY keine 
Abhilfe. Die üblichen "Hello-World"-Uart-Programme funktionieren jedoch 
auch hier.

Muss man denn - außer die von mir genannten Punkte - nichts in dem 
Programm ändern?

von Stefan Z. (stefan_z)


Lesenswert?

Ich würde IRMP gerne auf einem NodeMCU v3 mit Arduino IDE nutzen.
Jetzt ist IRMP neuerdings ja schon ESP8266 tauglich - also sollte darauf 
nativ compilen / laufen wenn ich es richtig verstehe.
Wie muss ich die Lib anpassen, dass er mein Board erkennt?
Im Prinzip ist es nur ein ESP8266 auf einem Trägerboard plus 
USB->Seriell Wandler.
Achja und es ist ein ESP-12E Modul - also die neuere Revision.

Wie geht man da vor? (ich bin nicht unbedingt der Hellste was Libraries 
schreiben angeht)

von Klaus R. (klaus2)


Lesenswert?

...kennt jmd die B&O commads für ältere Systeme, ich will mit IRSND eine 
kleine FB für ein beomaster 5500 bauen. Bräuchte Vol +/-, Radio, Stdby, 
Aux, Loudness...

Danke, Klaus.

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Klaus R. schrieb:
> ...kennt jmd die B&O commads für ältere Systeme, ich will mit IRSND eine
> kleine FB für ein beomaster 5500 bauen. Bräuchte Vol +/-, Radio, Stdby,
> Aux, Loudness...

Das besondere bei B&O ist die hohe Trägerfrequenz von 455kHz - im 
Gegensatz zu den sonst üblichen 32-40kHz.
Schau mal auf der IRMP Hauptseite:
https://www.mikrocontroller.net/articles/IRMP

Das Dokument unten bei den Anmerkungen beschreibt auch recht genau das 
Protokoll für Beosystem 5500.
http://www.mikrocontroller.net/attachment/33137/datalink.pdf

von Klaus R. (klaus2)


Lesenswert?

Hallo Matthias,

Danke für die Info. Das mit den 455kHz war mir klar, dachte cih müsste 
dann zB nur den Play-Cmd kennen. Aber da wird ja noch ein etwas 
komplexerer Header mit übertragen, den muss ich natürlich auch noch 
kennen (und mit IRSND übertragen können?!), in meinem Falle möchte ich 
eine MCP5500 nachstellen. Format also local, to Radio, from 
MCP5500...ich ahne, du hast auch einen beomaster? :)

EDIT: Ah, da kann ich das ja fest einstellen: irmp_data.address = 
0x00FF; // set address to 0x00FF - Fehlen mir aber noch die CMDs, außer 
ich muss die selbst mit IRMP auslesen :)

Klaus.

: Bearbeitet durch User
von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Klaus R. schrieb:
> ich ahne, du hast auch einen beomaster? :)

So ist es - meiner ist aber nochmal etwas älter und hat überhaupt keine 
Fernbedienung:
http://beocentral.com/beomaster3000-1970s
Ich habe ihn aber in Schleiflack Weiss :-P

Klaus R. schrieb:
> Fehlen mir aber noch die CMDs, außer
> ich muss die selbst mit IRMP auslesen :)

Das würde ich so machen - habe ich bei unbekannten Fernbedienungen auch 
so gemacht, bei mir habe ich so viele Protokolle wie möglich in IRMP 
eingebunden und dann einfach probiert, welches Protokoll die FB nun 
sendet und welche Codes was sind. Dazu geht das serielle Beispiel, das 
bei IRMp bei ist.
Das Problem bei dir ist ein für 455kHz brauchbarer Empfänger, dazu habe 
ich im Moment keine Idee ausser Photodiode und ein ZF Verstärker aus 
einem alten Mittelwellen Radio.

von Klaus R. (klaus2)


Angehängte Dateien:

Lesenswert?

TSOP7000 geht zB, ist aber etwas "pricy" weshalb ich ja extra 
nachfrage...bei beocentral habe ich leider auch nix konkretes gefunden. 
Vll muss der Leidensdruck erst wachsen, indem ich die (gefühlten) 2,5kg 
MCP5500 jedes Mal zwischen Wohnzimmer und Essbereich hin- und 
herschleppen muss :)
Im Zweifelsfall zapfe ich aber den Receiver im beo an, da kommt man gut 
dran.

EDIT: Der beo3000 ist auch ein wahrlich schönes Gerät!

Gruß, Klaus.

: Bearbeitet durch User
von technikus (Gast)


Lesenswert?

Hallo Forum!

Bis jetzt habe ich irmp in einigen Umgebungen erfolgreich auf AVR 
eingesetzt.
Jetzt jabe ich mir diese VolmetallFernbedienung angeschafft um etwas in 
der Hand zu haben

http://www.wsdistributing.com/web/wp-content/gallery/vincent-audio/sa-31mk-remote.jpg

Leider scheint das Protokoll keinem der implementierten Protokolle zu 
entsprechen.
Ich verwende einen TSOP4836 und habe nach und nach Protokoll für 
Protokoll aktiviert.

Habt Ihr nähere Informationen zu den Vincent Fernbedienungen bzw. eine 
Lösung für mich ?

Danke und Gruß
Daniel

von technikus (Gast)


Lesenswert?

Anmerkung:

Google spuckt nur das hier raus

http://www.remotecentral.com/cgi-bin/mboard/rc-prontong/thread.cgi?9405

Ich erkenne den weiteren Kontext aber nicht aus dem was die Jungs da 
schreiben...

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

technikus schrieb:
> Jetzt jabe ich mir diese VolmetallFernbedienung angeschafft um etwas in
> der Hand zu haben
>
> 
http://www.wsdistributing.com/web/wp-content/gallery/vincent-audio/sa-31mk-remote.jpg
>
> Leider scheint das Protokoll keinem der implementierten Protokolle zu
> entsprechen.

Du kannst mit IRMP die gesandten Daten aufzeichnen und den Scan hier 
ablegen. Dann schaue ich mir das an.

Wie das geht, steht hier:

https://www.mikrocontroller.net/articles/IRMP#Scannen_von_unbekannten_IR-Protokollen

von technikus (Gast)


Lesenswert?

Super! Danke schon mal!

Mit welchem AVR passt der Source Code ohne Anpassungen direkt?

Dann werde ich einen entsprechenden Versuchsaufbau auf die Beine 
stellen.

Daniel

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

technikus schrieb:
> Mit welchem AVR passt der Source Code ohne Anpassungen direkt?

Für alle, die im Artikel angegeben sind. Du musst nur in irmpconfig.h 
den Pin einstellen, an dem der TSOP hängt.

von Rainer G. (gera)


Lesenswert?

Die Artikel zu IRMP und IRSND sind nur noch ein paar Zeilen lang.
Da scheint was verloren gegangen zu sein.
https://www.mikrocontroller.net/articles/IRMP

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Rainer G. schrieb:
> Die Artikel zu IRMP und IRSND sind nur noch ein paar Zeilen lang.
> Da scheint was verloren gegangen zu sein.

Ja, da hat sich ein Troll ausgetobt. Wurde mittlerweile wieder 
korrigiert. Da dies in der Vergangenheit gehäuft auftrat, bekomme ich 
mittlerweile eine Benachrichtigung, wenn sich IRMP oder IRSND 
ändert. Dann können solche "Aktionen" schnell wieder in Ordnung gebracht 
werden.

von Rainer G. (gera)


Lesenswert?

Ich hatte dir mal ne Mail geschickt.
Ist die angekommen ?

Der C18 geht nicht mit der Version 3.00.
Folgendes ist zu ändern:

Die fast Typen müssen deklariert werden.

irmpsystem.h
#if defined(PIC_CCS) || defined(PIC_C18) || defined(ARM_STM32) || 
defined(STELLARIS_ARM_CORTEX_M4)
typedef unsigned char                   uint8_t;
typedef unsigned short                  uint16_t;
#  define uint_fast8_t uint8_t
#  define uint_fast16_t uint16_t
#endif


((_packed_)) kennt der C18 Compiler nicht.

#if defined(PIC_C18)
typedef struct _attribute_
{
    uint8_t      protocol;      // protocol, e.g. NEC_PROTOCOL
    uint16_t     address;       // address
    uint16_t     command;       // command
    uint8_t      flags;         // flags, e.g. repetition
} IRMP_DATA;
#else
typedef struct _attribute_  ((_packed_))
{
    uint8_t      protocol;     // protocol, e.g. NEC_PROTOCOL
    uint16_t     address;      // address
    uint16_t     command;      // command
    uint8_t      flags;        // flags, e.g. repetition
} IRMP_DATA;
#endif


Den IF Teil mit digitalPinHasPWM mag der Compiler überhaupt nicht.
Musste ich kommentieren. Andere Lösung hab ich nicht gefunden.

/*
#elif defined (TEENSY_ARM_CORTEX_M4)  // Teensy3
#  if !digitalPinHasPWM(IRSND_PIN)
#    error need pin with PWM output.
#  endif
*/

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Hallo Rainer,

Rainer G. schrieb:
> Ich hatte dir mal ne Mail geschickt.
> Ist die angekommen ?

Ja, die ist angekommen :-)

Ich war leider in den letzten Wochen mit ganz anderen Dingen 
beschäftigt, so dass ich mich (noch) nicht drum kümmern konnte. Ich 
werde die Änderungen nun zeitnah einbauen und mich nochmal bei Dir per 
Mail melden.

Danke,

Frank

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Die Version 3.0.2 von IRMP und IRSND ist online. Zwei 
Änderungen:

  - Neues Protokoll Mitsubishi Heavy (Klimaanlage)
  - Anpassungen an Compiler PIC C18

Dank an Rainer G. (gera) für die Hinweise für den C18-Compiler.

@Rainer:

Ich habe Deine Änderungen noch etwas anders eingepflegt, ich hoffe, das 
ist in Deinem Sinne. Für das zuletzt aufgeführte Problem mit dem Makro 
digitalPinHasPWM(), das beim C18 überhaupt nicht zum Tragen kommt, habe 
ich leider mangels C18-Compiler auch keine bessere Lösung. Ich habe 
daher den Block - wie von Dir empfohlen - komplett auskommentiert. Da 
geht zwar etwas Komfort für Teensy-Anwender verloren, aber ich denke, 
das ist zu verschmerzen.

von SE (Gast)


Lesenswert?

Hallo,
ich habe da ein kleines Verständnisproblem mit IRSND und einem AtMega88.

Für ein konkretes Prohekt wollte ich IRSND einsetzen. Doch der 
eingestellte PIN bleibt LOW. Der Timer-Interrupt von IRSND wird aber 
aufgerufen.

Den Timer habe ich wie folgt eingestellt:
1
// Timer for IRSND
2
void timer1_init (void)
3
{
4
  OCR1A   = (F_CPU / F_INTERRUPTS) - 1;    // compare value: 1/15000 of CPU frequency
5
  TCCR1B  = (1 << WGM12) | (1 << CS10);    // switch CTC Mode on, set prescaler to 1
6
  TIMSK1  = (1 << OCIE1A);          // OCIE1A: Interrupt by timer compare
7
}
8
9
// timer 1 compare handler, called every 1/10000 sec
10
ISR(TIMER1_COMPA_vect)                            // Timer1 output compare A interrupt service routine, called every 1/15000 sec
11
{
12
  irsnd_ISR();                            // call irsnd ISR
13
}

in der irsndconfig.h steht:
1
#elif defined(ATMEL_AVR)
2
#  define IRSND_OCx                             IRSND_OC2B              // use OC2B

Was mich jetzt verwirrt ist, das der OC2B zum Timer 2 gehört und OC1x 
vom Timer 1 ist nicht in der IRSND vorgesehen. In einem Beitrag in 
diesem Thread stand, das IRSND Timer 1 aber benötigt.

Kann mit jemand auf die Sprünge helfen, wo jetzt mein Denkfehler ist?

von SE (Gast)


Lesenswert?

SE schrieb:
> Kann mit jemand auf die Sprünge helfen, wo jetzt mein Denkfehler ist?

Bin nach langer Suche auf den Fehler gekommen.

Ich hatte meine Fernbedienung vom Kenwood AV-Receiver gescannt.
IRMP zeigte mir Protokoll 2 an.
Also habe ich für IRSND das Protokoll Kenwood eingestellt und Protocol 2 
gesendet.
Der Fehler: Protocol 2 ist NEC. Also NEC bei IRSND reingenommen und 
schon wurde gesendet. ;-)

Vg

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

SE schrieb:
> Bin nach langer Suche auf den Fehler gekommen.

Danke für die Rückmeldung. Als ich eben Deine Fehlerbeschreibung gelesen 
habe, konnte ich mir auch nicht vorstellen, wo da der Fehler wäre.

> Der Fehler: Protocol 2 ist NEC. Also NEC bei IRSND reingenommen und
> schon wurde gesendet. ;-)

NEC ist eigentlich standardmäßig in irsndconfig.h eingeschaltet. Hattest 
Du das vorher versehentlich abgeschaltet?

von SE (Gast)


Lesenswert?

Frank M. schrieb:
>> Der Fehler: Protocol 2 ist NEC. Also NEC bei IRSND reingenommen und
>> schon wurde gesendet. ;-)
>
> NEC ist eigentlich standardmäßig in irsndconfig.h eingeschaltet. Hattest
> Du das vorher versehentlich abgeschaltet?

Ja, aber nicht versehentlich. Hatte aus Platzspargründen nur Sony und 
Kasayco drin und alles andere abgeschaltet.

Aber noch kurz zum OC2x.
Wird beim IRSND nur der I/O-PIN hinter dem OC2x genutzt?
Denn zu dem Timer 1 gehört doch der OC1x.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

SE schrieb:
> Aber noch kurz zum OC2x.
> Wird beim IRSND nur der I/O-PIN hinter dem OC2x genutzt?
> Denn zu dem Timer 1 gehört doch der OC1x.

IRSND benötigt 2 Timer. Dabei wird Timer1 genutzt, um das Bitmuster 
auszusenden. Da wird die ISR standardmäßig 15000 mal pro Sekunde 
aufgerufen.

Aber das reicht noch nicht, denn das Signal muss zusätzlich noch 
moduliert werden, üblicherweise mit 32kHz bis 42kHz - je nach Protokoll. 
Dafür wird dann eine PWM mit der nötigen Modulationsfrequenz benötigt. 
Da Timer1 ja schon belegt ist, können dafür PWM-Pins für Timer0 oder 
Timer2 genutzt werden.

Daher findest Du in irsndconfig.h als Kommentar direkt über der Auswahl 
des I/O-Pins:
1
IRSND_OC2  = OC2  on ATmegas         supporting OC2,  e.g. ATmega8
2
IRSND_OC2A = OC2A on ATmegas         supporting OC2A, e.g. ATmega88
3
IRSND_OC2B = OC2B on ATmegas         supporting OC2B, e.g. ATmega88
4
IRSND_OC0  = OC0  on ATmegas         supporting OC0,  e.g. ATmega162
5
IRSND_OC0A = OC0A on ATmegas/ATtinys supporting OC0A, e.g. ATtiny84, ATtiny85, ATtiny87/167
6
IRSND_OC0B = OC0B on ATmegas/ATtinys supporting OC0B, e.g. ATtiny84, ATtiny85

Wie Du siehst, stehen dafür OC0x und OC2x zur Verfügung.

: Bearbeitet durch Moderator
von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Eine neue Version 3.0.3 von IRMP ist online.

Einzige Änderung:

 - Neues Protokoll: VINCENT

Damit ist die Anzahl der unterstützten Protokolle nun auf die schöne 
runde Zahl von 50 gewachsen. :-)

: Bearbeitet durch Moderator
von SE (Gast)


Lesenswert?

Frank M. schrieb:
> SE schrieb:
>> Aber noch kurz zum OC2x.
>> Wird beim IRSND nur der I/O-PIN hinter dem OC2x genutzt?
>> Denn zu dem Timer 1 gehört doch der OC1x.
>
> IRSND benötigt 2 Timer. Dabei wird Timer1 genutzt, um das Bitmuster
> auszusenden. Da wird die ISR standardmäßig 15000 mal pro Sekunde
> aufgerufen.
>
> Aber das reicht noch nicht, denn das Signal muss zusätzlich noch
> moduliert werden, üblicherweise mit 32kHz bis 42kHz - je nach Protokoll.
> Dafür wird dann eine PWM mit der nötigen Modulationsfrequenz benötigt.
> Da Timer1 ja schon belegt ist, können dafür PWM-Pins für Timer0 oder
> Timer2 genutzt werden.

Jetzt wird nen Schuh draus.
Danke für den Hinweis. :-)

Vg

von batman (Gast)


Lesenswert?

> Damit ist die Anzahl der unterstützten Protokolle nun auf die schöne
> runde Zahl von 50 gewachsen. :-)

Ein tolles Projekt! Ließ sich flott für ATMega 8 kompilieren. Ich habe 
da noch diverse ältere Geräte ohne funktionierende Fernbedienung. Macht 
das Sinn, hier mal mit dem IRSND zu scannen, ob man die Tastenkommandos 
rauskriegt?

Ich hatte das schon mit verschiedenen "Universal"-Fernbedienungen 
versucht aber die Ergebnisse sind nicht zufriedenstellend. Wenn sie 
überhaupt mal Protokoll/Adresse(?) treffen, fehlen einfach noch zu viele 
Kommandos. Ich will die Geräte nicht gern wegschmeißen.

Vielleicht hat jemand sowas Ähnliches schon mal gemacht?

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

batman schrieb:
> Ich habe
> da noch diverse ältere Geräte ohne funktionierende Fernbedienung.

Bei älteren Geräten waren die Empfänger-Chips oft noch in spezielle 
Hardware gegossen. Da lohnt sich schon mal das Aufschrauben und 
Nachsehen. Über den Namen des Chips kann man dann das verwendete 
Protokoll ermitteln und für dieses dann evtl. zusammen mit IRSND ein 
Progrämmchen schreiben, um die Codes per Brute Force herauszufinden.

> Macht
> das Sinn, hier mal mit dem IRSND zu scannen, ob man die Tastenkommandos
> rauskriegt?

Wenn man noch nichtmals weiß, um welches Protokoll es sich handelt, wird 
das wegen der riesigen Zahl der möglichen Kombinationen eine Suche der 
Stecknadel im Heuhaufen. Da müsste man erstmal wenigstens durch das 
Ausschlussverfahren die Zahl der möglichen Protokolle einschränken. Und 
selbst dann kann das immer noch jede Menge an möglichen Codes ergeben, 
die man durchprobieren muss.

Am besten stellst Du mal diese Geräte hier vor. Vielleicht kennt sogar 
jemand das entsprechende Gerät und kann entweder Hinweise oder sogar 
direkt IRMP-Daten dazu liefern.

von Stefan Z. (stefan_z)


Lesenswert?

batman schrieb:
> Ein tolles Projekt! Ließ sich flott für ATMega 8 kompilieren. Ich habe
> da noch diverse ältere Geräte ohne funktionierende Fernbedienung. Macht
> das Sinn, hier mal mit dem IRSND zu scannen, ob man die Tastenkommandos
> rauskriegt?

Das ist normalerweise der Weg, ja.
ABER es gab/gibt durchaus Systeme die nicht "passen".
Ich habe z.B. eine Mitsubishi FB aus den frühen 80ern.
Die hält 15 Jahre mit zwei AAA Batterien, sendet aber auch ultra-kurze 
Impulse und das in exotischer Frequenz.

Prinzipiell KANN man JEDES Protokoll erkennen / nutzen, aber so seltsame 
Trägerfrequenzen / Impulslängen werden nicht mit einem TSOP36/38KHz als 
Empfänger laufen.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Stefan Z. schrieb:
> ABER es gab/gibt durchaus Systeme die nicht "passen".

Du hast batmans Frage nicht ganz verstanden: Ihm fehlen Fernbedienungen 
zu bestimmten Geräten. Das heißt, er kann diese noch nichtmals 
einscannen, sondern lediglich mit IRSND diverse Codes einfach 
durchprobieren und schauen, wie das Gerät darauf reagiert.

Ein ziemlich aussichtsloses Unterfangen, solang man nicht zumindest das 
verwendete Protokoll durch irgendwelche (externe) Informationen 
bestimmen kann.

: Bearbeitet durch Moderator
von Stefan Z. (stefan_z)


Lesenswert?

Frank M. schrieb:
> Ein ziemlich aussichtsloses Unterfangen, solang man nicht zumindest das
> verwendete Protokoll durch irgendwelche (externe) Informationen
> bestimmen kann.

Ah stimmt. My bad...
Ja dann wird es in der Tat sehr schwierig - der Blick auf die 
Empfänger-ICs wäre vermutlich wirklich die einzige Chance.
Oder in einem Sammler-Forum einen Besitzer der FB finden der auch noch 
einen Arduino oder ein Oszi hat…

von batman (Gast)


Lesenswert?

Naja ich werd mir alles erstmal richtig durchlesen. 50 Protokolle klingt 
viel aber überschaubar. Meint ihr, es dauert zu lange, alle möglichen 
darauf basierenden Codes mal hintereinander durchzublinken? Also per 
Hand wollte ich das nicht versuchen, nech. :)

Ein Gerät ist z.B. ein DVB-S-Receiver mit einem verreckten PT2211 in der 
FB, evt. mal Batterien verpolt, die IR-LED leuchtet/flackert dauerhaft. 
Über den Code kriege ich noch näheres raus, obwohl es sich für das Gerät 
weniger lohnt.

Interessanter aber schwieriger wäre der Fall des VCR Samsung SVX 322, 
den muß ich mal aufmachen, wird wohl aber in den Haupt/Timercontroller 
gehen.

von Stefan Z. (stefan_z)


Lesenswert?

batman schrieb:
> Naja ich werd mir alles erstmal richtig durchlesen. 50 Protokolle klingt
> viel aber überschaubar. Meint ihr, es dauert zu lange, alle möglichen
> darauf basierenden Codes mal hintereinander durchzublinken? Also per
> Hand wollte ich das nicht versuchen, nech. :)

Nunja, es ist ja eine Library…
Man KÖNNTE nun ein Programm schreiben, das alle Codes durchprobiert.
Aber das klingt nach Science Fiction :-)
Ich persönlich würde den µC mit größtem Flash dafür wählen - dann kann 
man alle Protokolle aktivieren und loslegen.
Zwischen jedem Protokoll ggfs. nen Tastendruck fordern, dass man weiß 
was denn grad funktioniert hat - wenn es denn ein Treffer ist.

von Johannes S. (Gast)


Lesenswert?

bei den Universall FB gibt es auch oft einen manuellen Suchmodus. Wenn 
der aktiv ist drückt man die Power Taste, wenn das Gerät reagiert kann 
man andere Tasten probieren. Wenn das Gerät nicht reagiert drückt man 
wieder die Lern-Taste um auf den nächsten Code umzuschalten.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

batman schrieb:
> Ein Gerät ist z.B. ein DVB-S-Receiver mit einem verreckten PT2211 in der
> FB,

Protokoll ist RC5. Das sollte einfach rauszubekommen sein, da die Zahl 
der Kombinationen überschaubar sind. Die Geräteadressen sind fix an 
einen festen Wert für jede Geräteklasse (Radio, CD-Player, Fernseher 
usw.) gebunden. Das Ein-/aus-Kommando ist auch bekannt für alle 
RC5-Geräte.

Also: RC5-Adresse für DVB-S-Receiver Geräteklasse ergoogeln und dann die 
bekannten RC5-Kommandos ausprobieren. Sollte sich nichts für DVB-S 
finden lassen, dann alle möglichen Geräteadressen in Kombination mit 
Ein-/Aus-Kommando ausprobieren. Die Anzahl der möglichen Geräteadressen 
ist ziemlich beschränkt.

> Interessanter aber schwieriger wäre der Fall des VCR Samsung SVX 322,

Höchstwahrscheinliches Protokoll: SAMSUNG oder SAMSUNG32.

SAMSUNG32:

16 Adress-Bits + 16 Kommando-Bits, damit 4294967296 mögliche 
Kombinationen. Da wird man alt, bis man die durchhat. Zumindest 65536 
Adressen müsste man durchprobieren, in der Hoffnung, dass man mit dem 
Kommando einen Treffer erzielen könnte.

SAMSUNG:

16 Adress-Bits + 4 ID-Bits + 8 Kommando-Bits, damit 268435456 
Kombinationen. Kann man ebenso vergessen.

Stefan Z. schrieb:
> Ich persönlich würde den µC mit größtem Flash dafür wählen - dann kann
> man alle Protokolle aktivieren und loslegen.

Ja, klar... und sich mit Popcorn auf die Couch setzen und warten, bis 
der Fernseher anspringt. Wenn Du Glück hast, siehst Du es gerade noch, 
bevor Dir die Augen zufallen.

von Stefan Z. (stefan_z)


Lesenswert?

Frank M. schrieb:
> Ja, klar... und sich mit Popcorn auf die Couch setzen und warten, bis
> der Fernseher anspringt. Wenn Du Glück hast, siehst Du es gerade noch,
> bevor Dir die Augen zufallen.

Er wollte wissen wie man es BruteForce macht… :-)
Ich habe nicht behauptet, dass das schnell geht.

von Heinz K. (hagejot)


Lesenswert?

Zuerst einmal vielen Dank für das sehr nützliche Programmpaket.

Beim Testen ist mir eine Kleinigkeit aufgefallen (wenn mich meine 
rostigen C-Kenntnisse nicht täuschen):

In dem Beispielprogramm "irmp-main-avr-uart.c" vom 09.09.2016 dürfte es 
im Buffer
    char        buf[3];
spätestens bei
    itoh (buf, 4, irmp_data.address);
etwas eng werden ;-o

Viele Grüsse

Heinz

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Danke für den Hinweis, es muss natürlich
1
char        buf[5];
heißen.

Wird in der Zip-Datei und im SVN aktualisiert.

: Bearbeitet durch Moderator
von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Ich habe da nochmal eine Frage zum NEC/NEC42 Protokoll, bei dem beim 
ersten Tastendruck zwar der komplette Satz mit Adresse und Kommando 
gesendet wird, danaich aber nur noch der Frame 'Tastenwiederholung', 
egal welche Taste gedrückt blieb.

Gibt es eine Chance, das mit IRMP auch auszuwerten oder ist IRMP da 
hilflos, weil ja nicht mehr der ganze Satz gesendet wird? Beim nächsten 
Aufruf von irmp_get_data() bekomme ich jedenfalls kein Repetition Flag. 
Ich habe schon probiert, die IRMP_KEY_REPETITION_LEN von 150ms auf z.B. 
500ms zu erhöhen, dann wird das Flag gesetzt, wenn ich schnell genug auf 
der Fernbedienung hämmere - aber das ist ja nicht der Sinn der Sache.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Matthias S. schrieb:
> Gibt es eine Chance, das mit IRMP auch auszuwerten oder ist IRMP da
> hilflos, weil ja nicht mehr der ganze Satz gesendet wird?

IRMP erkennt natürlich die kurzen NEC-Key-Repetition-Frames, welche 
durch längeres Tastendrücken entstehen - aber nur innerhalb einer 
gewissen Zeit. Wenn diese abgelaufen ist (Timeout), werden 
NEC_Repetition-Frames ignoriert, bis wieder ein richtiger Frame kommt.

Das ist auch sinnvoll so. Denn sonst werden versehentlich eingefangene 
Key-Repetition-Frames (z.B. durch wildes Herumschwenken einer ganz 
anderen Fernseh-FB) noch Stunden später ausgewertet, obwohl der 
eigentliche Frame vorher eine ganz andere(!) Adresse enthielt. Diese 
Macke hat zum Beispiel meine Multimedia-Festplatte: Wenn ich diese mal 
kurz bedient habe und anschließend mit meiner Fernseh-FB durch längeres 
Tastendrücken die Lautstärke hochschraube, bekommt das meine 
Multimedia-Festplatte in den falschen Hals und wiederholt den letzten 
Befehl, den sie vor einer halben Stunde mal bekommen hat.

IRMP hatte denselben Fehler auch mal. Ist aber schon 5-6 Jahre her. 
Damals ist das aufgefallen, weil eine Word Clock im Wohnzimmer 
plötzlich bei Bedienung des Fernsehers gesponnen hat. Daher habe ich 
einen Timeout (100ms) dafür eingebaut. Läuft dieser ab, werden 
nachfolgende Repetition-Frames ignoriert.

Wie groß ist denn der zeitliche Abstand bei dieser merkwürdigen FB? 
Größere Abstände als 100ms habe ich noch nicht gesehen.

> Ich habe schon probiert, die IRMP_KEY_REPETITION_LEN von 150ms auf z.B.
> 500ms zu erhöhen,

Das war die falsche Stelle, diese Konstante ist für Protokolle, die 
keinen gesonderten Key-Repetition-Frame kennen, sondern einfach den 
letzten wiederholen.

In irmp.c findest Du:
1
#define NEC_FRAME_REPEAT_PAUSE_LEN_MAX          (uint_fast16_t)(F_INTERRUPTS * 100.0e-3 * MAX_TOLERANCE_20 + 0.5)

Hier ist der maximal mögliche zeitliche Abstand des Key-Repetition-Frame 
definiert, dass dieser gerade noch erkannt wird: 100.0e-3 entspricht 
100µms. Den Wert könntest Du hier durch Ändern nach Deinem Geschmack 
erhöhen.

Eventuell musst Du dabei aber auch IRMP_KEY_REPETITION_LEN synchron dazu 
erhöhen. Ich glaube aber - ohne in den Source gesehen zu haben - dass 
dieses nicht nötig ist.

: Bearbeitet durch Moderator
von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Frank M. schrieb:
> Wie groß ist denn der zeitliche Abstand bei dieser merkwürdigen FB?

Die Fernbedienung ist zwar merkwürdig, aber ich habe zwei solche Modelle 
(Analoger SAT Receiver und Billig FFS), die vom Layout sehr gut für das 
Audiocenter für meine Eltern geeignet sind. Die brauchen zwei getrennt 
regelbare TV-Lautstärken für Lautsprecher(Mutter) und Kopfhörer(Vater), 
für die das Layout der alten FB gut geeignet sind. (Kurz: Tiny85 steuert 
per I2C einen TDA8444, der 2 Stück LM1036 Audioprozessoren regelt).

Die Repeat Frames setzen etwa nach 100ms ein (muss ich nochmal genauer 
oszillodingsen), also deutlich später als die o.a. 100µs.
Ich werde mal NEC_FRAME_REPEAT_PAUSE_LEN_MAX so erhöhen, das ich noch 
keinen Überlauf riskiere - vielen Dank, Frank!

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Matthias S. schrieb:
> Ich werde mal NEC_FRAME_REPEAT_PAUSE_LEN_MAX so erhöhen, das ich noch
> keinen Überlauf riskiere

Da die Konstante mit einem uint_16t-Cast versehen ist, wird sie 
vermutlich auch mit einem 16-Bit-Zähler verglichen. Du darfst Dich also 
ruhig trauen. So schnell sollte der Überlauf nicht zu erreichen sein. 
65536 geteilt durch 15000 ergibt mehr als 4 Sekunden :-)

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

So, es klappt bei mir nicht mit den Repeat Codes, aber ich weiss 
wenigstens, warum.
Die standardisierte NEC_REPEAT_START_BIT_PAUSE_TIME liegt bei 2250µs, 
bei meinem beiden Fernbedienungen aber bei 4200µs und liegt damit voll 
im Bereich der normalen NEC_START_BIT_PAUSE_TIME. IRMP erkennt also 
einen normalen FB Code und verlangt mit Recht nun Daten. Da kommt aber 
nur der eine kurze Puls wie in diesem Oszillogramm:
https://www.mikrocontroller.net/attachment/78767/NEC-Repeat.JPG

Und das wird von IRMP verworfen. Es hilft natürlich auch nichts, 
NEC_REPEAT_START_BIT_PAUSE_TIME auf 4200 zu drehen, denn es gibt keine 
Möglichkeit, echten Datenframe und Repeatframe auseinander zu halten.

Macht nix, dann muss ich meinen alten Herrschaften nur sagen, das sie 
tippen müssen. Das Audiodings speichert dann sowieso die Daten im 
EEPROM, so das sie nicht allzuviel hämmern müssen.

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


Lesenswert?

Matthias S. schrieb:
> IRMP erkennt also
> einen normalen FB Code und verlangt mit Recht nun Daten.

Ich kann das durchaus als Sonderbedingung in IRMP einbauen, wenn Du es 
möchtest. Ich schau mir das mal im Laufe des Tages näher an.

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Frank M. schrieb:
> Ich kann das durchaus als Sonderbedingung in IRMP einbauen, wenn Du es
> möchtest.

Wenn es möglich ist, wäre das natürlich super - mein Papa ist 93 Jahre 
alt und nur schwer auf ungewohnte Sachen zu schulen. Da die Audiokiste 
was zu Weihnachten ist, würdest du ein altes Ehepaar sehr glücklich 
machen und lobend erwähnt werden :-)

Ich hatte schon probiert, NEC_REPEAT_START_BIT_PAUSE_TIME auf 4200µs 
umzustellen, aber da hatte ich zu einfach gedacht. Im Moment habe ich 
auch nicht die Zeit, mich in den Code einzuarbeiten, da hast du nämlich 
ein voluminöses Stück Software geschaffen :-)

Ich baue heute die Lautsprecherendstufe und den Kopfhörerverstärker - 
Ich schau einfach mal später wieder vorbei.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Version 3.0.5 ist im SVN.

Änderung:

 - 16.12.2016: Unterstützung von Nicht-Standard Nec-Repetition-Frames
   (4500us Pause statt 2250us)

@Matthias: Damit sollte Dein Problem behoben sein. Die Änderung ist 
alleinig in irmp.c.

: Bearbeitet durch Moderator
von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Frank M. schrieb:
> @Matthias: Damit sollte Dein Problem behoben sein. Die Änderung ist
> alleinig in irmp.c.

Es tut mir leid, aber nun ist jeder Frame einer mit gesetztem 
IRMP_FLAG_REPETITION :-(

Es gelingt mir manchmal, durch wiederholtes Drücken das Flag zu toggeln, 
aber selbst bei kürzesten Auslösen wird das Flag gesetzt, oder auch 
gelöscht und dann aber auch nicht im Repeat Fall gesetzt. Am besten 
belassen wir es dabei und nehmen die Änderung wieder raus. Vielen Dank 
für deine Mühe. Wenn ich die Zeit habe, werde ich da nochmal eintauchen, 
aber nun muss ich erstmal noch an der Hardware rumbauen.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Matthias S. schrieb:
> Es gelingt mir manchmal, durch wiederholtes Drücken das Flag zu toggeln,
> aber selbst bei kürzesten Auslösen wird das Flag gesetzt

Dann schickt die FB wohl immer noch mindestens einen Repetition-Frame 
hinterher.

> Am besten
> belassen wir es dabei und nehmen die Änderung wieder raus. Vielen Dank
> für deine Mühe. Wenn ich die Zeit habe, werde ich da nochmal eintauchen,
> aber nun muss ich erstmal noch an der Hardware rumbauen.

Okay, dann machen wir das später.

Du könntest mir irgendwann einen Scan schicken mit kurzen Tastendrücken 
als Scan schicken, dann weiß ich, wieviele die FB da noch 
hinterherschickt. Die könnte IRMP dann ignorieren.

Oder Du ignorierst in der Anwendung die ersten 1,2 oder 3 
Repetition-Frames. Das ist wohl einfacher, in der Anwendung einen Zähler 
mitzuführen.

von ADG (Gast)


Angehängte Dateien:

Lesenswert?

Schönen Guten Abend
Ich darf euch heute Abend meine Anpassungen für IRSND UND IRMP 
vorstellen

Die Projekte worden so erweitert das es auf der Erweierung(ESP8266) für 
Arduino IDE zum laufen gebracht worden sind.


Die Anpassungen von IRSND  sind in der Datei IRSND.txt zusammengefast 
bzw. IREMP.txt für IREMP.

IRSEND.ino ist für den Arduino Skechfile

Hoffe das ich euch ein bisschen weitergebracht habe und das diese 
Projekte weiter erweitert werden.

mfg
ADG

von ADG (Gast)


Angehängte Dateien:

Lesenswert?

Nochmal Guten Abend

Bin gerade dabei mein Fernbedienung für meinen Alten Satresiver 
einzulesen
Dabei ist mir aufgefallen das 2 Sachen merkwürdig sind

Der ATMEGA und der ESP8266 erkennt bei der der Taste "OK" der 
Fernbedienung
folgen den CODE

protocol 7 -> RC5 ?
address  8
command  80

Sollte es nicht IRMP_RECS80EXT_PROTOCOL sein "protocol 12" da es 
Technisat ist und wenn ich nun den Code Sende über IRSND eragiert der 
Reviser nicht.

Vielleicht kann mir von euch Jemand helfen.

Danke ADG


PS.
Habe auch den Scan von IRMP mit beigefügt (F_INTERRUPTS 20000)

000000000000000000000000000000000000001111111111111111111111111111111111 
100000000000000000000000000000000000001111111111111111111111111111111111 
100000000000000000000000000000000000000111111111111111100000000000000000 
000111111111111111110000000000000000000111111111111111110000000000000000 
000111111111111111111111111111111111110000000000000000000000000000000000 
000111111111111111111111111111111111110000000000000000000111111111111111 
110000000000000000000111111111111111110000000000000000000011111111111111 
111111<\n>

000000000000000000000000000000000000001111111111111111100000000000000000 
001111111111111111100000000000000000001111111111111111111111111111111111 
100000000000000000000000000000000000000111111111111111100000000000000000 
000111111111111111100000000000000000000111111111111111110000000000000000 
000111111111111111111111111111111111100000000000000000000000000000000000 
000111111111111111111111111111111111110000000000000000000111111111111111 
110000000000000000000111111111111111110000000000000000000011111111111111 
111111<\n>

000000000000000000000000000000000000001111111111111111111111111111111111 
000000000000000000000000000000000000001111111111111111111111111111111111 
100000000000000000000000000000000000000011111111111111110000000000000000 
000011111111111111110000000000000000000111111111111111110000000000000000 
000011111111111111111111111111111111110000000000000000000000000000000000 
000001111111111111111111111111111111110000000000000000000011111111111111 
111000000000000000000001111111111111111000000000000000000011111111111111 
111111<\n>

000000000000000000000000000000000000001111111111111111000000000000000000 
001111111111111111100000000000000000001111111111111111111111111111111111 
100000000000000000000000000000000000000111111111111111100000000000000000 
000111111111111111110000000000000000000111111111111111110000000000000000 
000111111111111111111111111111111111110000000000000000000000000000000000 
000111111111111111111111111111111111110000000000000000000011111111111111 
110000000000000000000011111111111111111000000000000000000011111111111111 
111111<\n>

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

ADG schrieb:
> Ich darf euch heute Abend meine Anpassungen für IRSND UND IRMP
> vorstellen

Vielen Dank! Ich werde die ESP8266-Teile in den aktuellen IRMP-Source 
übernehmen.

ADG schrieb:
> Der ATMEGA und der ESP8266 erkennt bei der der Taste "OK" der
> Fernbedienung
> folgen den CODE
>
> protocol 7 -> RC5 ?
> address  8
> command  80

Wenn ich den beigefügten Scan auswerte, bekomme ich:

protocol 7   = RC5
address 0x08 = dec 8
command 0x57 = dec 87

Bis auf das Kommando stimmt es also überein. Das solltest Du nochmal 
überprüfen.

> Sollte es nicht IRMP_RECS80EXT_PROTOCOL sein "protocol 12" da es
> Technisat ist und wenn ich nun den Code Sende über IRSND eragiert der
> Reviser nicht.

Nein, es ist definitiv RC5. Ich habe mit dem Linux-IRSND genau obige 
Daten ausgegeben und es ergibt sich dasselbe Muster. Zu Deiner Frage 
wegen des Herstellers: Es gibt Hersteller, die durchaus verschiedene 
IR-Protokolle nutzen bzw. genutzt haben. Dazu gehört zum Beispiel auch 
Technisat.

: Bearbeitet durch Moderator
von ADG (Gast)


Lesenswert?

Guten Morgen

und guten Morgen UKW

ja du hast recht habe es auch noch herausgefunden das es RC5ex ist.
Somit habe ich ein Problem mit IRSND von ATMEGA der den Code nicht 
richtig Moduliert auf RC5.

Werde heute Abend den Scann von RC5ex von ATMEGA(IRSEND) dann mal 
posten.
Vielleicht habe ich timeing Probleme am ATMEGA

mfg
ADG

von batman (Gast)


Angehängte Dateien:

Lesenswert?

Entweder ich mache was falsch oder ich habe einfach nur Pech mit meinen 
exotischen FB. Jedenfalls bekomme ich bestenfalls jede dritte mit IRMP 
überhaupt erkannt und beim Zurücksenden mit IRSND siehts dann noch 
schlechter aus. Kein Problem scheinen generell die langen Frames mit 
langen Pulsen zu machen aber ich habe wohl ziemlich viele Kurzpulser-FB 
- viel altes Geraffel.

Um das Problem zu untersuchen, habe ich mal mit einem Power-Kommando für 
ein DVB-T angefangen, der von IRMP noch als RECS80 erkannt wird aber mit 
IRSND ans Gerät zurückgesendet, keine Reaktion.

Folgendes verstehe ich dabei nicht:
Die originale FB sendet, immer alles pro einzelnem kurzen Knopfdruck, 
abwechselnd 2 versch. Frames (Dateien dt-pow-rec1/2.gif). Nennt man wohl 
Toggeln?
Sende ich die emfangenen IRMP_DATA mit IRSND, sendet der scheinbar 
jedesmal einen anderen Frame (ich habe die ersten 5 als 
dt-pow-snd1-5.gif aufgefangen) aber keins identisch mit den original 
Frames? Protokoll evt. falsch erkannt?

protocol: 0x06   RECS80   address: 0x0005   command: 0x001E   flags: 
0x00

ps: F_INTERRUPTS = 20000, Mega8 @8Mhz mit gut kalibriertem internen Osc.

von ADG (Gast)


Lesenswert?

Hallo zusammen

Beim Testen ist mir heute Abend noch ein Fehler beim ESP8266 irsnd 
Modull aufgefallen

Beim Senden von RC5 wurden die Zeiten nicht eingehalten und daher musste 
ich im IRSEND.ino in der IRS noch einen OFFSET einbauen.

habe mit -160 gute Erfahrung gemacht bei RC5 wenn ihr einen besseren 
Wert findet umso besser

#define INTERRUPT  (F_CPU/F_INTERRUPTS) -160

und in der ISR muss der nächste IRS an erste Stelle




/*---------------------------------------------------------------------
* INTERRUPT FUER IRSND UND IREMP
---------------------------------------------------------------------*/
void timer0_ISR (void){
    // Set-up fure den naechsten  interrupt cyclus
      timer0_write(ESP.getCycleCount() + INTERRUPT);

 if (! irsnd_ISR())          // call irsnd ISR
  {                           // if not busy...
      irmp_ISR();             // call irmp ISR
  }
}

von batman (Gast)


Lesenswert?

Moin. Die Senderoutine für RECS80 scheint die Frames um ein Bit 
rechtsvorschoben zu senden. Das Toggelbit erscheint auf Pos.3 statt 2. 
Wenn ich den Sendepuffer vorm Senden nach links schiebe, kommen die 
Kommandos teilweise an.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

ADG schrieb:
> habe mit -160 gute Erfahrung gemacht bei RC5 wenn ihr einen besseren
> Wert findet umso besser

Erstmal danke, ich werde das im Arduino-Source nachziehen. Mal eine 
Frage wegen des Timers: Kann man den beim ESP8266 nicht so einstellen, 
dass er regelmäßig feuert, ohne dass man ihn in der ISR retriggern muss? 
Dadurch könnte man den Jitter eliminieren.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

batman schrieb:
> Die Senderoutine für RECS80 scheint die Frames um ein Bit
> rechtsvorschoben zu senden. Das Toggelbit erscheint auf Pos.3 statt 2.
> Wenn ich den Sendepuffer vorm Senden nach links schiebe, kommen die
> Kommandos teilweise an.

Mit RECS80 hast Du genau dasjenige Uralt-Protokoll erwischt, das im IRMP 
am wenigsten getestet wurde - besser gesagt: gar nicht. Denn es gibt 
kaum noch Geräte, die RECS80 verwenden. So habe ich RECS80 komplett nach 
Dokumentation implementiert - ohne Chance auf irgendwelche Gerätetests.

Ich werde mir die IRSND-Routine dazu nochmal anschauen und 
gegebenenfalls nachbessern.

von batman (Gast)


Lesenswert?

Dafür hast du es aber schon super getroffen. Die Empfangsroutine IRMP 
funktioniert und im Sendepuffer von IRSND wird das Frame auch schon 
korrekt zusammengebaut (inkl. Startbit!). Dann scheint die Senderoutine 
noch ein Startbit vorne dran zu hängen, also irgendwo ist wohl was 
doppelt gemoppelt.

Ich habe das irsnd.c entsprechend abgeändert, so daß hier kein "1"-Bit 
vorangestellt wird, der Puffer startet dann mit dem Togglebit. Also 
praktisch alles einmal links geschoben, die vordere "1" fällt weg. So 
funktionierts bei mir:
1
#if IRSND_SUPPORT_RECS80_PROTOCOL == 1
2
        case IRMP_RECS80_PROTOCOL:
3
        {
4
            toggle_bit_recs80 = toggle_bit_recs80 ? 0x00 : 0x80;
5
6
            irsnd_buffer[0] = toggle_bit_recs80 | ((irmp_data_p->address & 0x000F) << 4) |
7
                              ((irmp_data_p->command & 0x003C) >> 2);                                           // STAAACCC
8
            irsnd_buffer[1] = (irmp_data_p->command & 0x03) << 6;                                               // CCC00000
9
            irsnd_busy      = TRUE;
10
            break;
11
        }
12
#endif

Sehr nützliches Proggi, danke dafür!

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

batman schrieb:
> So funktionierts bei mir:

Danke für den Hinweis, ich werde das so im Source anpassen.

von batman (Gast)


Lesenswert?

Ich habe mir noch eine FB vorgenommen, die von IRMP nicht erkannt wird. 
Ich habe davon sogar mehrere und jede paßt wieder zu einer ganzen Reihe 
früher verbreiteter Fernseher mit dem gleichen oder ähnlichen Chassis. 
Es steckt z.B. im Nordmende F17, Telefunken 618, Thomson ICC5, Saba, 
Ferguson u.a.

Wie die Analyse mittels Oszilloskop ergab, handelt es sich schlicht um 
RECS80 auf Adresse 0x7 mit 400 kHz Resonator Basistakt, ABER diesmal im 
Flashed Mode. D.h. (1) statt Modulation gibts nur einen einzelnen 
IR-Puls pro Bit und (2) wird das Startbit als 2.Toggelbit verwendet - 
ist also nicht konstant.

Erkennung
Letzteres läßt sich durch eine kleine Erweiterung der Erkennung im 
irmp.c beheben. Ob es dann möglicherweise auch andere Protokolle falsch 
als RECS80 erkennt, kann ich nicht ausschließen. Glaube es aber nicht, 
da das doch ziemlich speziell ist.
1
                    if ( irmp_pulse_time >= RECS80_START_BIT_PULSE_LEN_MIN && irmp_pulse_time <= RECS80_START_BIT_PULSE_LEN_MAX &&
2
                       ((irmp_pause_time >= RECS80_START_BIT_PAUSE_LEN_MIN && irmp_pause_time <= RECS80_START_BIT_PAUSE_LEN_MAX) ||
3
                        (irmp_pause_time >= RECS80_0_PAUSE_LEN_MIN         && irmp_pause_time <= RECS80_0_PAUSE_LEN_MAX)))
4
                    {                                                           // it's RECS80
5
#ifdef ANALYZE
6
                        ANALYZE_PRINTF ("protocol = RECS80, start bit timings: pulse: %3d - %3d, pause: %3d - %3d or pause %3d - %3d\n",
7
                                        RECS80_START_BIT_PULSE_LEN_MIN, RECS80_START_BIT_PULSE_LEN_MAX,
8
                                        RECS80_START_BIT_PAUSE_LEN_MIN, RECS80_START_BIT_PAUSE_LEN_MAX,
9
                                        RECS80_0_PAUSE_LEN_MIN,     RECS80_0_PAUSE_LEN_MAX);
10
#endif // ANALYZE
11
                        irmp_param_p = (IRMP_PARAMETER *) &recs80_param;
12
                    }


Timing
Das geänderte Timing (400 statt 455 kHz Basistakt) muß noch man im 
irmpprotocols.h anpassen. Wie ich das sehe, kann man nicht verschiedene 
Timing-Varianten desselben Protokolls gleichzeitig erkennen (und senden) 
können. Daher habe ich mal einen Kompromiß ausgetestet, der anscheinend 
alle meine RECS80 erfolgreich erkennt und sendet. Ich setze das mal als 
Vorschlag rein, ohne Gewähr. Da sich bei RECS80 alle Zeitkonstanten vom 
Basistakt ableiten, braucht man eigentlich nur jeweils diesen im Header 
ändern.
1
/*---------------------------------------------------------------------------------------------------------------------------------------------------
2
 * RECS80:
3
 *---------------------------------------------------------------------------------------------------------------------------------------------------
4
 */
5
#define RECS80_CLK             440e+3              // 440 kHz resonator prim.clock (standard is 455 kHz)
6
#define RECS80_PULSE_TIME                       (5.0*12+4)/RECS80_CLK           // modulated: 1/RECS80_CLK*(5*12+4), flashed: 1/RECS80_CLK*4
7
#define RECS80_1_PAUSE_TIME                     (3.0*1152)/RECS80_CLK           // 3*To pause time
8
#define RECS80_0_PAUSE_TIME                     (2.0*1152)/RECS80_CLK           // 2*To pause time
9
#define RECS80_START_BIT_PULSE_TIME             RECS80_PULSE_TIME               // constant pulse time
10
#define RECS80_START_BIT_PAUSE_TIME             RECS80_1_PAUSE_TIME             // always 1-bit for modulated mode, 0/1 toggled in flashed mode
11
#define RECS80_FRAME_REPEAT_PAUSE_TIME          (55296.0/2)/RECS80_CLK          // frame distance / 2 (?)
12
#define RECS80_ADDRESS_OFFSET                   1                               // skip 1 bit (toggle bit)
13
#define RECS80_ADDRESS_LEN                      3                               // read 3 address bits
14
#define RECS80_COMMAND_OFFSET                   4                               // skip 4 bits (1 toggle + 3 address)
15
#define RECS80_COMMAND_LEN                      6                               // read 6 command bits
16
#define RECS80_COMPLETE_DATA_LEN                10                              // complete length
17
#define RECS80_STOP_BIT                         1                               // has stop bit
18
#define RECS80_LSB                              0                               // MSB...LSB
19
#define RECS80_FLAGS                            0                               // flags

Pulsbreite
Sämtliche obige Pulse Distance Werte werden nach meiner Erfahrung exakt 
eingehalten, nur bei der Pulsbreite gabs leider problematische 
Abweichungen. Der errechnete (modulierte) Standardpuls mit 455 kHz 
Resonator liegt bei 141us. In Dokus verschiedener Chips findet man aber 
Werte von 158, 167 u.a., während die von mir gemessenen Pulsbreiten 
sogar 250 und mehr sind. Keine Ahnung wieso aber ich mußte dann einen 
Korrekturfaktor von 1.3 zum Theoriewert multiplizieren, damit es 
klappte. Oben hab ich ihn wieder rausgenommen.

Flashed Mode
Eine Flashed Mode Transmission kann man nicht mit einem üblichen TSOP 
Schmalband Receiver empfangen. Zum Scannen des Codes bis ca. 10 cm 
Entfernung tut es als "Breitband-Receiver" ein Fototransistor mit Pullup 
zw. 10k-50kOhm. Größere R strecken die Pulslänge, was manchmal 
vorteilhaft ist.
Senden im Flashed Mode funktioniert dagegen hier ganz normal mit IRSND, 
d.h. die Modulation stört den Breitband-Empfänger(TV) anscheinend nicht. 
Ich empfehle allerdings eine gute Sendepower. Ich pulse 500-600mA, also 
ein knappes Watt. Die originalen Flasher-FB haben alle 2 Sendedioden.

Tastrate
Schließlich, für eine Verbesserung der Effizienz sollte der Träger 
1/3-1/4 Tastrate bekommen, so kann man den Sendestrom pro IR-LED 
verdoppeln, mit entsprechendem Reichweitenvorteil. Mir scheint, das 
Umkonfigurieren der Tastrate ist bei IRSND nicht so leicht zu machen 
aber vielleicht kriegst du es ja hin, Frank. Ansonsten muß man eben ggf. 
mehr Blitzer beschäftigen.

von ADG (Gast)


Lesenswert?

Hallo UKW
(Frage vom 21.12.2016)

Sorry das ich erst jetzt Antworte war anderweitig beschäftigt.
Das mit dem Jitter muss ich mal ausproben und das es ohne ISR geht muss 
ich mal darüber denken.

Kannst du mir die genau Laufzeit von der ISR(IRSND) zukommen lassen

mfg
ADG

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

ADG schrieb:
> Das mit dem Jitter muss ich mal ausproben und das es ohne ISR geht muss
> ich mal darüber denken.

Ich meinte das so: Jedesmal, wenn die ISR betreten wird, musst Du einen 
Zeitpunkt angeben, wann sie wieder aktiv werden soll. Das ist ziemlich 
blöd, denn je nach Laufzeit der ISR muss dieser Zeitraum länger oder 
kürzer angegeben werden, damit die ISR in konstanten Zeitabständen 
aufgerufen wird.

Mich wundert, dass das nicht besser geht. Auf jedem mickrigen ATTiny 
kann man sagen: "Feuere 15000 mal in der Sekunde". Und das passiert dann 
auch, egal wie lange die ISR gerade braucht.

Geht das mit dem ESP8266 nicht?

> Kannst du mir die genau Laufzeit von der ISR(IRSND) zukommen lassen

Genau das ist doch das Problem: Die Laufzeit der ISR ist komplett 
unterschiedlich - je nachdem, ob was gesendet werden muss oder nicht. 
Ich kann Dir also keine Laufzeit angeben.

Bei IRMP ist es übrigens genauso: Je nachdem, ob ein Frame empfangen 
wird, ist die Laufzeit entweder extrem kurz (gerade nix los) und sehr 
lang (Suchen nach dem Protokoll nach Empfang des Start-Bits).

Deshalb bieten ja die µCs einen Timer im CTC-Modus, welcher die ISR in 
konstanten Zeitabschnitten aufruft. Dabei ist dieser Zeitabschnitt 
unabhängig von der Laufzeit der ISR. Sowas muss es doch auch für den ESP 
geben?!?

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

batman schrieb:
> Wie die Analyse mittels Oszilloskop ergab, handelt es sich schlicht um
> RECS80 auf Adresse 0x7 mit 400 kHz Resonator Basistakt, ABER diesmal im
> Flashed Mode. D.h. (1) statt Modulation gibts nur einen einzelnen
> IR-Puls pro Bit und (2) wird das Startbit als 2.Toggelbit verwendet -
> ist also nicht konstant.

Danke für Deine ausführliche Dokumentation zu Deinen Erfahrungen mit dem 
RECS80-Protokoll. Ich werde Deine Änderungsvorschläge in die nächste 
Version einfließen lassen.

von Marcel (Gast)



Lesenswert?

Hallo,

es gibt da ein Samsung Protokoll das nutzt nicht 4500µs sondern 
irgendetwas um die 1800µs als Startbit. Kann das Jemand implementieren, 
bestätigen oder mir einen Vorschlag machen wie ich das dennoch gut 
umgesetzt bekomme?

Es handelt sich bei dem Gerät um einen AV-Receiver von Samsung. Im 
Anhang mal ein paar Aufzeichnungen zu dem Protokoll und zu den 
funktionierenden und implementierten Samsungprotokollen als Vergleich.

Danke und Gruß
Marcel

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Marcel schrieb:

> es gibt da ein Samsung Protokoll das nutzt nicht 4500µs sondern
> irgendetwas um die 1800µs als Startbit. Kann das Jemand implementieren,
> bestätigen oder mir einen Vorschlag machen wie ich das dennoch gut
> umgesetzt bekomme?

Am besten machst Du mittels IRMP_LOGGING ein paar Scans. Wie das geht, 
ist im Artikel erklärt. Wenn Du sie mir schickst, baue ich das ein.

von Gasparo (Gast)


Lesenswert?

There is any port of for STM32DUINO? This is a very could port of 
ARDUINO por STM32 processor, that have ARM VERSION with good price and 
features.

Thanks.

von Jörg R. (jrie)


Lesenswert?

Hallo Frank,

für STM32 etc. sind
typedef unsigned char                   uint8_t;
typedef unsigned short                  uint16_t;
in  irmpsystem.h doppelt gemoppelt.

Gruß,
Jörg

von 900ss (900ss)


Lesenswert?

Moin Frank,

ich wollte einfach nur DANKE sagen für das schöne Stück Software.

Habe es schon sehr lange auf dem Schirm gehabt, das einfach mal 
auszuprobieren aber wie das so ist. Jetzt gibt es ein kleines Projekt, 
wo ich das einsetzen möchte.

Es war so verblüffend einfach und hat sofort funktioniert, dass ich es 
immer noch nicht glauben kann :-)

Habe hier ein Teensy-3.1 liegen, den ich aber bare-metal programmiere. 
Habe ein paar kleine Änderungen in deinem Source in dem "TEENSY-Zweig" 
dazu gemacht, ins Projekt genommen, Start und geht :-) Unglaublich.

Super und nochmal Danke.

900ss

von Marcel (Gast)


Angehängte Dateien:

Lesenswert?

Frank M. schrieb:
> Marcel schrieb:
>
>> es gibt da ein Samsung Protokoll das nutzt nicht 4500µs sondern
>> irgendetwas um die 1800µs als Startbit. Kann das Jemand implementieren,
>> bestätigen oder mir einen Vorschlag machen wie ich das dennoch gut
>> umgesetzt bekomme?
>
> Am besten machst Du mittels IRMP_LOGGING ein paar Scans. Wie das geht,
> ist im Artikel erklärt. Wenn Du sie mir schickst, baue ich das ein.

Hallo,

danke für die Antwort. Haben jetzt mal die Daten aufgezeichnet. Siehe 
Anhang.
Danke! Gruß Marcel

von Marcel (Gast)


Lesenswert?

Zur Ergänzung noch: Taktfrequenz CPU 16MHz Hardware Atmega1284P

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Marcel schrieb:
> Haben jetzt mal die Daten aufgezeichnet. Siehe Anhang.

Danke, schaue ich mir an. Es ist ein sehr interessantes und absolut 
exotisches Protokoll: 2 verschiedene Pulslängen und 3 verschiedene 
Pausenlängen. Ist mal etwas ganz anderes :-)

Sobald ich mehr herausbekommen habe, melde ich mich wieder.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Marcel schrieb:
> danke für die Antwort. Haben jetzt mal die Daten aufgezeichnet. Siehe
> Anhang.

Im IRMP-Artikel unter Download findest Du die Version 3.0.7 im SVN.

Änderungen:

  - Neues Protokoll: SAMSUNGAH (ich wusste keinen besseren Namen)
  - Einige Verbesserungen für den ESP8266-Support

Mit dieser Version sollte Deine SAMSUNG-Fernbedienung auszulesen sein. 
Ich habe Adresse und Kommando erstmal folgendermaßen aufgeteilt, weil 
ein Frame 48 Bit hat:

  0..15 Adresse
 16..31 wird ignoriert, ist sowieso bis auf 1 Bit immer 0
 32..48 Kommando

Damit bekommt man für Deine Scans:
1
# Taste 1:
2
110000101100101010000000001000001000000010100000 p=51 (SAMSUNGAH), a=0x5343, c=0x0501, f=0x00
3
----------------------------------------------------------------------
4
# Taste 2:
5
110000101100101010000000001000000010111011110000 p=51 (SAMSUNGAH), a=0x5343, c=0x0f74, f=0x00
6
----------------------------------------------------------------------
7
# Taste 3:
8
110000101100101010000000001000001100111001110000 p=51 (SAMSUNGAH), a=0x5343, c=0x0e73, f=0x00
9
----------------------------------------------------------------------
10
# Power-Taste:
11
110000101100101010000000001000000000000000100000 p=51 (SAMSUNGAH), a=0x5343, c=0x0400, f=0x00
12
----------------------------------------------------------------------
13
# Lautstaerke UP:
14
110000101100101010000000001000000000010001100000 p=51 (SAMSUNGAH), a=0x5343, c=0x0620, f=0x00
15
----------------------------------------------------------------------
16
# Lautstaerke UP GEHALTEN:
17
110000101100101010000000001000000000010001100000 p=51 (SAMSUNGAH), a=0x5343, c=0x0620, f=0x00
18
110000101100101010000000001000000000010001100000 p=51 (SAMSUNGAH), a=0x5343, c=0x0620, f=0x01

Die Adresse ist also immer 0x5343.

Du solltest mal sämtliche Tasten durchtesten, um sicherzustellen, dass 
die Aufteilung Adresse/Kommando so sinnvoll ist. Ich habe die Grenzen 
nämlich ziemlich willkürlich gewählt.

P.S.
Setze F_INTERRUPTS besser runter auf 15000. Die 20000 bedeuten hier nur 
unnötige Belastung des Prozessors. Für die SAMSUNG-FB sind 15000 
Interrupts pro Sekunde völlig ausreichend. Selbst 10000 für F_INTERRUPTS 
würden reichen, um das Protokoll zuverlässig zu erkennen.

: Bearbeitet durch Moderator
von Marcel (Gast)


Lesenswert?

Das ging aber schnell! Danke werde es ausprobieren  und mich dann 
nochmal melden.

von Jörg R. (jrie)


Lesenswert?

Hallo Frank,

seit Version 3.0.2:
1
In file included from irmp/irmp.h:18:0,
2
                 from src/irmpmain.h:4,
3
                 from src/irmpmain.c:11:
4
irmp/irmpsystem.h:161:41: error: conflicting types for 'uint_fast8_t'
5
 typedef unsigned char                   uint_fast8_t;
6
                                         ^
7
In file included from /video/gcc-arm-none-eabi-5_4-2016q3/lib/gcc/arm-none-eabi/5.4.1/include/stdint.h:9:0,
8
                 from cmsis/core_cm3.h:120,
9
                 from cmsis_boot/stm32f10x.h:488,
10
                 from irmp/irmpsystem.h:38,
11
                 from irmp/irmp.h:18,
12
                 from src/irmpmain.h:4,
13
                 from src/irmpmain.c:11:
14
/video/gcc-arm-none-eabi-5_4-2016q3/arm-none-eabi/include/stdint.h:52:31: note: previous declaration of 'uint_fast8_t' was here
15
   typedef __UINT_FAST8_TYPE__ uint_fast8_t;
                               ^
Gruß
Jörg

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Jörg R. schrieb:
> seit Version 3.0.2:
> In file included from irmp/irmp.h:18:0,
>                  from src/irmpmain.h:4,
>                  from src/irmpmain.c:11:
> irmp/irmpsystem.h:161:41: error: conflicting types for 'uint_fast8_t'
>  typedef unsigned char                   uint_fast8_t;
>                                          ^

Danke für den Hinweis. Für STM32 gehört das natürlich nicht dahin. Es 
geht doch um STM32?

Gruß,

Frank

von Jörg R. (jrie)


Lesenswert?

Ja, geht um STM32.
Gruß
Jörg

von Wilhelm M. (wimalopaan)


Lesenswert?

Als eifriger Nutzer des IRMP-Codes hätte ich einen Vorschlag zur 
Code-Strukturierung, um die Integration in C++-Projekte (mit header-only 
Libs) einfacher zu gestalten:

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.

b) das Cpp-Macro input(x) mit einem #ifndef versehen.

Das wäre super (für die nä. Version).

von Marcel (Gast)


Lesenswert?

Moin,

kannst Du noch bitte das SAMSUNGAH Protokoll in IRSND übernehmen?

Danke und Gruß Marcel

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

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...

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

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?

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

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

#ifndef WAS-Denn?

: Bearbeitet durch Moderator
von Wilhelm M. (wimalopaan)


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
1
namespace Irmp {
2
extern "C" {
3
struct IrmpData {
4
    uint8_t                             protocol;                                   // protocol, e.g. NEC_PROTOCOL
5
    uint16_t                            address;                                    // address
6
    uint16_t                            command;                                    // command
7
    uint8_t                             flags;                                      // flags, e.g. repetition
8
} __attribute__ ((__packed__));
9
10
typedef struct IrmpData IRMP_DATA;
11
12
extern void                             irmp_init (void);
13
extern uint_fast8_t                     irmp_get_data (IRMP_DATA *);
14
extern uint_fast8_t                     irmp_ISR (void);
15
16
}
17
constexpr uint8_t Repetition = 0x01;
18
19
}
einfach innerhalb des namespaces die (neue) Headerdatei inkludieren (mit 
Ausnahme des constexpr ...).

Ganz am Ende(!) meiner (einzigen) Implmentierungsddatei kommt dann:
1
constexpr auto finterrupts = IrInterruptFrequency.value;
2
3
static_assert(finterrupts >= 10000, "IR Interrupts frequeny too low");
4
static_assert(finterrupts <= 20000, "IR Interrupts frequeny too high");
5
6
#define F_INTERRUPTS finterrupts
7
8
#define input(x) iRPin::read()
9
10
namespace Irmp {
11
#include "irmp/irmp.c"
12
}

>
> "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:
1
#ifndef input
2
#  define input(x)                              ((x) & (1 << IRMP_BIT))
3
#endif

: Bearbeitet durch User
von Marcel (Gast)


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!

von Jörg R. (jrie)


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

von Frank M. (ukw) (Moderator) Benutzerseite


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.

von Marcel (Gast)


Lesenswert?

Hi,

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

Gruß
Marcel

von Frank M. (ukw) (Moderator) Benutzerseite


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.

von Stefan B. (n0b0dy)


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
von Frank M. (ukw) (Moderator) Benutzerseite


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.

von Stefan B. (n0b0dy)


Angehängte Dateien:

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. :-)

von Leo C. (rapid)


Angehängte Dateien:

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

von Frank M. (ukw) (Moderator) Benutzerseite


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.

von Marcel (Gast)


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

von Leo C. (rapid)


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
1
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

von Text (Gast)


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


???

von Leo C. (rapid)


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.

von Text (Gast)


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.

von Text (Gast)


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?

von Text (Gast)


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...

von Andres B. (adb)


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

von Andres B. (adb)


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

von Ulf (Gast)


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

von Oliver (Gast)


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

von Jörg R. (jrie)


Lesenswert?

Das kannst du mit einem Repeat Counter machen.
https://github.com/j1rie/IRMP_STM32/blob/master/STM32F103/src/main.c#L669
Zeile 669 bis 675.
MIN_REPEATS entsprechend deinem Bedarf einstellen.

von Frank M. (ukw) (Moderator) Benutzerseite


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
von Oliver (Gast)


Lesenswert?

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

Grüße
Oliver

von Arthur (Gast)


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.

von Marcel (Gast)


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

von Uwe (Gast)


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

von Helmut K. (chaosbastler)


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

von Frank M. (ukw) (Moderator) Benutzerseite


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_.2B_extended_NEC

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

wurde irgendwann im Extended NEC-Format:
1
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.
1
Taste "1" = 0x11  erste  Reihe, erste  Spalte
2
Taste "2" = 0x12  erste  Reihe, zweite Spalte
3
Taste "3" = 0x12  erste  Reihe, dritte Spalte
4
Taste "4" = 0x21  zweite Reihe, erste  Spalte
5
Taste "5" = 0x22  zweite Reihe, zweite Spalte
6
Taste "6" = 0x23  zweite Reihe, dritte Spalte
7
Taste "7" = 0x31  dritte Reihe, erste  Spalte
8
Taste "8" = 0x32  dritte Reihe, zweite Spalte
9
Taste "9" = 0x33  dritte Reihe, dritte Spalte

Oder auch:
1
Taste "1" = 0x31
2
Taste "2" = 0x32
3
...
4
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
von Helmut K. (chaosbastler)


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

von Matthias F. (frank91)


Angehängte Dateien:

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
von Frank M. (ukw) (Moderator) Benutzerseite


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 :-)

von Klaus R. (klaus2)


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!

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Artikel "DIY Lernfähige Fernbedienung mit IRMP":

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

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

: Bearbeitet durch Moderator
von Klaus R. (klaus2)


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
von Frank M. (ukw) (Moderator) Benutzerseite


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.

von Klaus R. (klaus2)


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
von Frank M. (ukw) (Moderator) Benutzerseite


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.

von Klaus R. (klaus2)


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!

von Frank M. (ukw) (Moderator) Benutzerseite


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.

von Klaus R. (klaus2)


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.

von Frank M. (ukw) (Moderator) Benutzerseite


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
von Frank M. (ukw) (Moderator) Benutzerseite


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.

von Klaus R. (klaus2)


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
von Frank M. (ukw) (Moderator) Benutzerseite


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
von Frank M. (ukw) (Moderator) Benutzerseite


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 :-)

von Klaus R. (klaus2)


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.

von Frank M. (ukw) (Moderator) Benutzerseite


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 ;-)

von Klaus R. (klaus2)


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
von Frank M. (ukw) (Moderator) Benutzerseite


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.

von Klaus R. (klaus2)


Lesenswert?

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

Klaus.

von Klaus R. (klaus2)


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.

von Klaus R. (klaus2)


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.

von Frank L. (Firma: Flk Consulting UG) (flk)


Lesenswert?

Hallo,
Warum die Tasten mit ADC auswerten, wieviele Tasten willst Du abfragen 
und wieviele Pins hast Du frei?

Gruß
Frank

von Frank M. (ukw) (Moderator) Benutzerseite


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 ;)

von Klaus R. (klaus2)


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.
1
/*-----------------------------------------------------------------------------------------------------------------------
2
 * Initialize ADC
3
 *-----------------------------------------------------------------------------------------------------------------------
4
 */
5
static void
6
adc_init (void)
7
{
8
9
  ADMUX = (1<<REFS1);                                    // Interne Referenz 1,1V
10
  ADCSRA = (1<<ADSC) | (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS1);                  // Frequenzvorteiler 128
11
  ADCSRB |= (0<<ADLAR);                                    // Linksbündig = 1
12
  ADCSRA |= (1<<ADEN);                                    // Enable ADC
13
14
}
15
16
17
/*-----------------------------------------------------------------------------------------------------------------------
18
 * Read ADC value
19
 *-----------------------------------------------------------------------------------------------------------------------
20
 */
21
22
uint16_t ADC_Read(void){
23
24
  uint16_t ADC_value=0;
25
26
  ADMUX  |= (1<<MUX0);                      // Kanal ADC1 (PB2)
27
  
28
  ADCSRA |= (1<<ADSC);                            // eine Wandlung "single conversion"
29
  
30
  while (ADCSRA & (1<<ADSC) ) {}                   // auf Abschluss der Konvertierung warten
31
32
  ADC_value = ADCL;                           // mit uint16_t x
33
  ADC_value += (ADCH<<8);                     // in zwei Zeilen (LSB/MSB-Reihenfolge und
34
                                        // C-Operatorpriorität sichergestellt)
35
  
36
  return ADC_value;                               // ADC auslesen und zurückgeben
37
38
}

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
von Klaus R. (klaus2)


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.

von Klaus R. (klaus2)


Angehängte Dateien:

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
von Klaus R. (klaus2)


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
von Klaus R. (klaus2)


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.

von Frank M. (ukw) (Moderator) Benutzerseite


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:
1
if (! (irmp_data.flags & IRMP_FLAG_REPETITION))
2
{
3
    store_in_eeprom (irmp_data.protocol, irmp_data.address, irmp_data.command, irmp_data.flags & 0xF0);
4
}
5
else
6
{
7
    ignore frame;
8
}

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

von Klaus R. (klaus2)


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...:
1
while (ms_cnt < 250)
2
                    {
3
                        // some devices need a repeated frame to accept the command, e.g. POWER command on Toshiba TV to switch off
4
                        if (! cancelled && irmp_data[k].protocol != 0xFF)       // after 250 ms....
5
                        {
6
                            IRMP_DATA id;
7
8
                            if (irmp_get_data (&id))                            // ... receive IR signal again
9
                            {
10
                                if (id.flags == 1)                              // it's a repeated frame, store it!
11
                                {
12
                                    framecnt++;
13
                                }
14
                                cli ();
15
                                ms_cnt = 0;
16
                                sei ();
17
                            }
18
                        }
19
                    }
20
21
                    irmp_data[k].flags = framecnt;

Danke, Klaus.

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


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:
1
irmp_data[k].flags = framecnt;

folgendermaßen ändern:
1
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
von Klaus R. (klaus2)


Lesenswert?

GENAU das hatte ich QnD morgen vor!

Toshiba hat das übrigens geändert ;)

Danke! Klaus.

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


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.

von Klaus R. (klaus2)


Lesenswert?

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

Klaus.

von Klaus R. (klaus2)


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.

von Frank M. (ukw) (Moderator) Benutzerseite


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?

von Klaus R. (klaus2)


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.

von Klaus R. (klaus2)


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.

von Klaus R. (klaus2)


Angehängte Dateien:

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.

von Klaus R. (klaus2)


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.

von Klaus R. (klaus2)


Lesenswert?

Peter hat (fast) alles fertig, war ja klar :)

Beitrag "Tastenmatrix auslesen über nur 2 Leitungen"

Klaus.

von Klaus R. (klaus2)


Angehängte Dateien:

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.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

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

Der Trick ist, gar keine .eep einzuspielen.

von Klaus R. (klaus2)


Lesenswert?

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

Klaus.

von Klaus R. (klaus2)


Angehängte Dateien:

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
von Frank M. (ukw) (Moderator) Benutzerseite


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.

von Klaus R. (klaus2)


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!

von Frank M. (ukw) (Moderator) Benutzerseite


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.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

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

von Klaus R. (klaus2)


Lesenswert?

...ja klar, nur standard irmp. Ich meld mich!

Klaus.

von Frank L. (florenzen)


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

von Daniel (Gast)


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!

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

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

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

von Klaus R. (klaus2)


Lesenswert?

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

Klaus.

von technikus (Gast)


Lesenswert?

Hallo,

hat jemand mal irmp in einem STM32 HAL Projekt genutzt?

Gruß
Stephan

von Gerd E. (robberknight)


Angehängte Dateien:

Lesenswert?

Als leidenschaftlicher Nutzer von ChibiOS (http://www.chibios.org) 
wollte ich IRMP auch in meinen ChibiOS-basierten Projekten verwenden und 
habe daher eine Integration geschrieben. Da IRMP ja mittlerweile schon 
für einige Plattformen verfügbar ist und daher entsprechende defines 
vorsieht, war das auch gar nicht mal so schwer oder viel Code.

Patch ist angehängt und ich würde mich über eine Aufnahme ins offizielle 
IRMP-Repo oder Kritik und Verbesserungsvorschläge freuen.

Nachdem ChibiOS als RTOS auch so nette Dinge wie Events mitbringt, auf 
die z.B. Threads warten können, habe ich auch dafür eine Unterstützung 
eingebaut. Wenn man das in der irpmconfig.h mit IRMP_USE_EVENT aktiviert 
und einen passenden Threadpointer und Eventflag definiert, bekommt der 
Thread einen Event gesendet sobald gültige IR-Daten empfangen wurden.

In der irmp-main-chibios.c wird gezeigt wie man das verwendet.

Ich habe den Code bei mir jetzt mit ChibiOS/NIL Version 18.2.1 auf einem 
kleinen STM32F030F4 am Laufen und da ist neben IRMP noch genug Platz für 
eine kleine serielle Shell und RGB-LED-Anzeige als Status-Feedback.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Gerd E. schrieb:
> Patch ist angehängt und ich würde mich über eine Aufnahme ins offizielle
> IRMP-Repo oder Kritik und Verbesserungsvorschläge freuen.

Kann ich gerne machen, danke dafür. Würdest Du dann im IRMP-Artikel 
die Besonderheiten, die Du angesprochen hast, auch dort dokumentieren?

von Gerd E. (robberknight)


Lesenswert?

Frank M. schrieb:
> Kann ich gerne machen, danke dafür.

Danke.

> Würdest Du dann im IRMP-Artikel
> die Besonderheiten, die Du angesprochen hast, auch dort dokumentieren?

Deutscher und englischer Artikel sind angepasst.

Ich hoffe das passt so.

Du müsstest nur noch die Versionsnummer eintragen wenn Du den neuen 
Release machst.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Gerd E. schrieb:
> Deutscher und englischer Artikel sind angepasst.

Super, vielen Dank! :-)

> Du müsstest nur noch die Versionsnummer eintragen wenn Du den neuen
> Release machst.

Ich habs gerade eben eingecheckt. Versionsnummer ist nun 3.1.0, passe 
ich an.

von Gerd E. (robberknight)


Lesenswert?

Das ging ja fix. Wenn alle Opensource-Projekte so schnell beim 
Integrieren von Änderungen wären ;)

Frank M. schrieb:
> Ich habs gerade eben eingecheckt. Versionsnummer ist nun 3.1.0, passe
> ich an.

Wenn ich die SVN-Diffs richtig interpretiere, ist noch das 
GREE-Protokoll neu dazugekommen. Das fehlt noch im Changelog & in der 
Dokumentation.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Gerd E. schrieb:
> Das ging ja fix. Wenn alle Opensource-Projekte so schnell beim
> Integrieren von Änderungen wären ;)

Du hast ja auch alles sehr gut vorbereitet. Einmal patch aufgerufen und 
das war's. :)

> Wenn ich die SVN-Diffs richtig interpretiere, ist noch das
> GREE-Protokoll neu dazugekommen. Das fehlt noch im Changelog & in der
> Dokumentation.

Stimmt. Das hatte ich komplett vergessen, da ich es irgendwann 
zwischendurch eingebaut habe. Werde ich mir bei Gelegenheit anschauen 
und dann die Dokumentation entsprechend aktualisieren.

Vielen Dank nochmal und Kompliment auch an die exzellente Umsetzung und 
auch an die perfekte Aktalisierung der Doku - auch der englischen!

Ich halte gerade bei OpenSource Software eine gute Dokumentation für 
äußerst wichtig. Leider wird sie oft genug vernachlässigt. Ich war mal 
vor 20 Jahren bei einem Vortrag von Richard Stallman zugegen, der an die 
anwesenden Entwickler appellierte, sie mögen doch genauso viel Zeit in 
die Doku stecken wie in die Entwicklung der Software. Zur Ermunterung 
sagte er: "Documentation doesn't crash!". :)

von Gerd E. (robberknight)


Lesenswert?

Frank M. schrieb:
> Vielen Dank nochmal und Kompliment auch an die exzellente Umsetzung und
> auch an die perfekte Aktalisierung der Doku - auch der englischen!

Danke für die Blumen.

Mich hat jetzt aber noch der Ehrgeiz gepackt und ich wollte den 
ständigen Aufruf des Timer-IRQs in der (Haupt-)Zeit ohne jegliche 
IR-Daten loswerden so daß der µC dann in den Sleepmode gehen kann. Das 
ChibiOS gibt sich extra große Mühe tickless zu arbeiten, und dann kommt 
das IRMP und macht das alles kaputt ;)

Ich möchte dafür aus der irmp_ISR() eine irmp_idle()-Funktion aufrufen 
die von meinem Hauptprogramm gestellt wird. Darin schalte ich dann den 
Timer aus und einen Pinchange-IRQ an. Wenn der Pinchange kommt, wird der 
Timer wieder gestartet und irmp_ISR() aufgerufen.

Funktioniert soweit schon ganz gut, der Stromverbrauch meines kleinen 
Boards mit dem STM32F030F4 und dem IR-Empfänger ist von 15mA auf 9mA im 
Idle runtergegangen.

Allerdings muss ich zugeben daß ich in der Statemachine der irmp_ISR 
noch nicht so ganz durchsteige.

So sieht mein Code am Ende der irmp_ISR jetzt aus:
1
--- a/irmp.c
2
+++ b/irmp.c
3
@@ -5212,6 +5212,23 @@ irmp_ISR (void)
4
         chEvtSignalI(IRMP_EVENT_THREAD_PTR,IRMP_EVENT_BIT);
5
 #endif
6
 
7
+#if IRMP_USE_IDLE_CALL == 1
8
+    // check if there is no ongoing transmission or repetition
9
+    if (!irmp_start_bit_detected &&
10
+        !irmp_pulse_time &&
11
+        !irmp_pause_time &&
12
+        !wait_for_start_space &&
13
+        key_repetition_len > IRMP_KEY_REPETITION_LEN)
14
+// TODO: do we need to check irmp_tmp_address, irmp_tmp_command, irmp_bit ??
15
+// TODO: why is wait_for_space kept set after receiving ir data once and then idle?
16
+    {
17
+        // no ongoing transmission
18
+        // enough time passed since last decoded signal that a repetition won't affect our output
19
+
20
+        irmp_idle();
21
+    }
22
+#endif // IRMP_USE_IDLE_CALL
23
+
24
     return (irmp_ir_detected);
25
 }

Wie im Kommentar vermerkt ist mir aufgefallen, daß nach dem ich ein 
IR-Telegramm empfangen habe, wait_for_space immer auf 1 stehen bleibt. 
Das hatte ich am Anfang auch immer für die Idle-Bedingung mit abgefragt.

Hat das einen tieferen Sinn oder ist das an der Stelle einfach nicht 
relevant und wird daher nicht zurückgesetzt?

Fange ich mit meiner jetzigen Abfrage wirklich alle Fälle von 
Übertragung und sonstigen relevanten Pause-Zuständen ab? Oder muss ich 
noch weitere Variablen wie z.B. irmp_tmp_address, irmp_tmp_command, 
irmp_bit beachten?

Getestet habe ich nur mit NEC-Codes.

Wäre nett wenn Du da nochmal drüberschauen könntest.

Wenn es passt kann ich das als Patch mit Beispiel & Doku fertig machen.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Gerd E. schrieb:
> Wie im Kommentar vermerkt ist mir aufgefallen, daß nach dem ich ein
> IR-Telegramm empfangen habe, wait_for_space immer auf 1 stehen bleibt.

Merkwürdig. Eigentlich sieht es so aus:
1
    if (! irmp_ir_detected)              // ir code already detected?
2
    {                                    // no...
3
        if (! irmp_start_bit_detected)   // start bit detected?
4
        {                                // no...
5
            ....
6
        }
7
        else
8
        {
9
            if (wait_for_start_space)    // we have received start bit...
10
            {                            // ...and are counting the time of darkness
11
                if (irmp_input)          // still dark?
12
                {                        // yes
13
                    ...
14
                }
15
                else
16
                {                        // receiving first data pulse!
17
                    ...
18
                    wait_for_start_space = 0;
19
                }
20
            }
21
        }
22
    }

wait_for_start_space sollte also nach dem Empfang des ersten 
Daten-Pulses wieder auf 0 zurückgesetzt werden.

> Fange ich mit meiner jetzigen Abfrage wirklich alle Fälle von
> Übertragung und sonstigen relevanten Pause-Zuständen ab?

Warum nicht folgende einfache Bedingung?
1
    if (!irmp_start_bit_detected &&
2
    {
3
        irmp_idle();
4
    }

Dann sollte der µC außerhalb der Zeit, wenn ein Frame übertragen wird, 
schlafen. Reicht das nicht?

von Gerd E. (robberknight)


Lesenswert?

Frank M. schrieb:
> wait_for_start_space sollte also nach dem Empfang des ersten
> Daten-Pulses wieder auf 0 zurückgesetzt werden.

wird es auch. Ich meinte wait_for_space.

> Warum nicht folgende einfache Bedingung?
>
1
>     if (!irmp_start_bit_detected &&
2
>     {
3
>         irmp_idle();
4
>     }
5
>
>
> Dann sollte der µC außerhalb der Zeit, wenn ein Frame übertragen wird,
> schlafen. Reicht das nicht?

Naja, also zumindest irmp_pulse_time muss ich noch abfragen, da es ganz 
am Anfang erhöht wird, bevor irmp_start_bit_detected überhaupt gesetzt 
wird.

Außerdem wird im Idle dann natürlich auch key_repetition_len nicht mehr 
erhöht, so daß die ganze Wiederholungserkennung kaputt wäre. Den Check 
sollte ich also auch machen.

Die Frage ist halt ob es irgendwelche anderen Zustände geben kann, bei 
denen eine Übertragung läuft oder irgendwie auf eine Wiederholung 
reagiert wird die ich mit diesen Checks noch nicht abgedeckt hätte.

Weil die Funktionsweise für mich eben nicht ganz offensichtlich war, 
habe ich die Kandidaten, die mir relevant aussahen, auch noch mit 
geprüft. Aber es kann dennoch sein daß ich irgendeinen Fall übersehen 
hab, vorallem welche in den protokollspezifischen Defines. Da gibt es ja 
auch noch eigne Repetition-Logik wie z.B. denon_repetition_len.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Gerd E. schrieb:

> wird es auch. Ich meinte wait_for_space.

Upps, da habe ich mich verlesen, sorry. Ich habe das gerade mal unter 
Linux getestet: Tatsächlich bleibt das Flag nach dem Einlesen eines 
kompletten Frames gesetzt. Scheint dann aber keine Rolle mehr zu 
spielen, da dann andere Zustandsvariablen greifen. Muss ich mir nochmal 
in Ruhe anschauen bzw. ich müsste mal alle Zustandsvariablen 
dokumentieren.

> Naja, also zumindest irmp_pulse_time muss ich noch abfragen, da es ganz
> am Anfang erhöht wird, bevor irmp_start_bit_detected überhaupt gesetzt
> wird.

Stimmt, irmp_start_bit_detected wird natürlich erst nach dem Empfang des 
Start-Bits gesetzt. Das war von mir zu kurz gedacht.

Ich habe eben mal unter Linux folgendes im Source testweise eingesetzt:
Alt:
1
#ifdef ANALYZE
2
    time_counter++;
3
#endif // ANALYZE

Neu:
1
#ifdef ANALYZE
2
    static uint_fast8_t     last_irmp_start_bit_detected = 0xFF;
3
    static uint_fast8_t     last_irmp_pulse_time = 0xFF;
4
5
    if (last_irmp_start_bit_detected != irmp_start_bit_detected || last_irmp_pulse_time != irmp_pulse_time)
6
    {
7
        last_irmp_start_bit_detected    = irmp_start_bit_detected;
8
        last_irmp_pulse_time            = irmp_pulse_time;
9
10
        printf ("%d %d %d\n", time_counter, irmp_start_bit_detected, irmp_pulse_time);
11
    }
12
13
    time_counter++;
14
#endif // ANALYZE

Dann kann man mit
1
    ./irmp-10kHz < IR-Data/nec.txt

schön beobachten, wie sich die Zustandsvariablen ändern. Eine von beiden 
ist während des Empfangs eines IR-Frames immer gesetzt - auch bei den 
Repetition-Frames.

Damit sollte diese Bedingung ausreichen:
1
    if (!irmp_start_bit_detected && !irmp_pulse_time)
2
    {
3
        irmp_idle();
4
    }

Mit
1
    ./irmp-15kHz < IR-Data/denon-rc-176-repeat-15kHz.txt

sieht man auch, dass es für die sehr speziellen Denon-Repetition-Frames 
einwandfrei klappt.

von Gerd E. (robberknight)


Lesenswert?

Frank M. schrieb:
> ich müsste mal alle Zustandsvariablen
> dokumentieren.

Du warst der, der oben Stallman zum Thema Dokumentation zitierte ;)

> Damit sollte diese Bedingung ausreichen:
>
1
>     if (!irmp_start_bit_detected && !irmp_pulse_time)
2
>     {
3
>         irmp_idle();
4
>     }
5
>

Danke für den Testcode und die Analyse. Ich stimme Dir zu....

...bis auf die Prüfung von key_repetition_len.

Wenn ich diesen Code verwende:
1
    if (!irmp_start_bit_detected && !irmp_pulse_time
2
        && key_repetition_len > IRMP_KEY_REPETITION_LEN)
3
    {
4
        irmp_idle();
5
    }
funktioniert alles wie gewünscht. Wenn ich 2x die selbe Taste kurz 
hintereinander drücke, wird das IRMP_FLAG_REPETITION-Bit gesetzt. Mache 
ich das mit längerem Zeitabstand, wird es nicht mehr gesetzt.

Ohne die Prüfung von key_repetition_len wird das 
IRMP_FLAG_REPETITION-Bit immer gesetzt, egal was für ein Zeitabstand 
zwischen den Tastendrücken liegt.

Ist auch klar wenn man sich den Code anschaut:
1
if (irmp_ir_detected)
2
{
3
    if (last_irmp_command == irmp_tmp_command &&
4
        last_irmp_address == irmp_tmp_address &&
5
        key_repetition_len < IRMP_KEY_REPETITION_LEN)
6
    {
7
        irmp_flags |= IRMP_FLAG_REPETITION;
8
    }
Wenn hier das key_repetition_len wegen des Sleepmode nicht mehr 
hochgezählt wird, ist die Bedingung halt immer wahr.

Ich denke also die Prüfung auf key_repetition_len > 
IRMP_KEY_REPETITION_LEN ist notwendig.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Gerd E. schrieb:
> Wenn hier das key_repetition_len wegen des Sleepmode nicht mehr
> hochgezählt wird, ist die Bedingung halt immer wahr.

Ja, das ist natürlich richtig. Diese Situation ist zur Zeit nicht 
simulierbar, da der Simulator sich zwischen den Frames nicht schlafen 
legt.

> Ich denke also die Prüfung auf key_repetition_len >
> IRMP_KEY_REPETITION_LEN ist notwendig.

Korrekt.

: Bearbeitet durch Moderator
von Gerd E. (robberknight)


Angehängte Dateien:

Lesenswert?

Ok, der Patch mit dem IRMP_USE_IDLE_CALL ist anbei.

Wenn das soweit passt, kann ich das auch wieder im IRMP-Artikel 
dokumentieren.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Gerd E. schrieb:
> Wenn das soweit passt, kann ich das auch wieder im IRMP-Artikel
> dokumentieren.

Passt und ist online als 3.1.1 :-)

von Gerd E. (robberknight)


Lesenswert?

Frank M. schrieb:
> Passt und ist online als 3.1.1 :-)

Danke. Die Artikel sind jetzt auch angepasst.

(OT: falls Du das noch nicht kennst: die Übersetzung ins Englische hab 
ich https://www.deepl.com machen lassen. Bis auf ein paar kleine 
Anpassungen bei den Formulierungen kommt der Text direkt aus der 
maschinellen Übersetzung. Ich finde das ist Welten besser als Google 
Translator und Konsorten und schon echt brauchbar so.)

von Markus (Gast)


Lesenswert?

Mir ist aufgefallen das am Abend unter Neonlicht zum Teil falsche 
Scans/gestörte Scans bei meinem IR Empfänger ankommen (ist jetzt nicht 
IRMP) aber habt ihr auch schon solche Erfahrungen gemacht?

Das war jetzt in nem nicht so oft besetzten Labor so wo die Lampen noch 
nicht durch LED ausgetauscht wurden.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Gerd E. schrieb:
> Danke. Die Artikel sind jetzt auch angepasst.

Prima, danke.

> (OT: falls Du das noch nicht kennst: die Übersetzung ins Englische hab
> ich https://www.deepl.com machen lassen.

Kannte ich noch nicht. Aber ein paar kurze Stichprobentests haben mich 
überzeugt. Der ist schon verdammt gut... Lesezeichen gesetzt :-)

von Conny G. (conny_g)


Lesenswert?

Markus schrieb:
> Mir ist aufgefallen das am Abend unter Neonlicht zum Teil falsche
> Scans/gestörte Scans bei meinem IR Empfänger ankommen (ist jetzt nicht
> IRMP) aber habt ihr auch schon solche Erfahrungen gemacht?
>
> Das war jetzt in nem nicht so oft besetzten Labor so wo die Lampen noch
> nicht durch LED ausgetauscht wurden.

Ähnliches hab ich früher schon gelesen.
Auf die Schnelle ("neonlicht stört ir fernbedienung") z.B. das hier 
gefunden:

https://www.tt-board.de/forum/threads/leuchtstoffroehre-vs-infrarot.46583/

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Markus schrieb:
> Mir ist aufgefallen das am Abend unter Neonlicht zum Teil falsche
> Scans/gestörte Scans bei meinem IR Empfänger ankommen (ist jetzt nicht
> IRMP) aber habt ihr auch schon solche Erfahrungen gemacht?

Ja, das ist allgemein bekannt.

Bei IRMP können solche gestörten IR-Frames ziemlich gut aussortiert 
werden, da hier die Pulse nicht nur stumpfsinnig aufgezeichnet werden, 
sondern immer erst das Protokoll ermittelt und dann sämtliche 
Pulse/Pausen auf Plausibilität geprüft werden.

Dabei werden on-the-fly bzw. abschließend folgende Regeln geprüft:

1. Sind die Puls-/Pause-Zeiten innerhalb der für das Protokoll
   definierten Toleranzen?

Das gilt für jedes Protokoll.

2. Sind CRCs/Parity-Bits im Protokoll enthalten?

Wenn ja, stimmen diese mit den empfangenen Daten überein?

Beispiele:

Kaseikyo (Japan) Protokoll: 4 + 8 Parity Bits
LEGO: 4 Bits CRC

3. Sind Redundanzen im Frame enthalten?

Wenn ja, stimmen diese (nach eventueller Transformation) überein?

Beispiele NEC, SAMSUNG und BOSE:

Daten liegen sowohl als nicht-invertierte als auch als invertierte
Bits in demselben Frame vor.

4. Werden die IR-Frames mit n-facher Wiederholung gesandt?

Wenn ja, stimmen die Frames vom Inhalt auch überein?

Beispiele:

DENON: im 2. Frame ist das Kommando invertiert.
SAMSUNG48: der 1. Frame wird immer ein zweites Mal wiederholt.
KASEIKYO: der 1. Frame wird optional innerhalb 50ms wiederholt
SONY (SIRCS): der 1. Frame wird optional innerhalb 50ms wiederholt

von technikus (Gast)


Lesenswert?

Matthias F. schrieb:
> Hal


Habe die STM32 HAL Implementierung soweit getestet. Frank hast kannst du 
die Erweiterung von Matthias F. aus Beitrag #5328596 noch übernehmen?

Gruß
Stephan

von Jonas (Gast)


Lesenswert?

technikus schrieb:
Habe die STM32 HAL Implementierung soweit getestet.


technikus eine Frage an Sie oder an jemanden, der es geschafft hat. Ich 
habe versucht, ein Projekt STM32 mit HAL auszuführen, aber es 
funktioniert nicht. Es ist möglich, dass ich etwas falsch mache. Obwohl 
es keine Fehler gibt. Können Sie mir Ihre Projektumsetzung per E-Mail 
schicken (jonkul001@utp.edu.pl)?

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

technikus schrieb:
> Frank hast kannst du
> die Erweiterung von Matthias F. aus Beitrag #5328596 noch übernehmen?

Die habe ich aus irgendwelchen Gründen übersehen/vergessen. Hole ich 
nach.

von technikus (Gast)


Lesenswert?

Super!
Danke

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

technikus schrieb:
> Frank hast kannst du die Erweiterung von Matthias F. aus Beitrag
> #5328596 noch übernehmen?

Die Änderungen sind nun online, die Doku wurde angepasst.

Viel Spaß,

Frank

von technikus (Gast)


Lesenswert?

Jonas,

beschreib doch mal dein Problem.
Bekommst du Fehler beim Compilieren?
Im Grunde wird irmp ja nur initialisiert und in der Timer ISR 
aufgerufen.
Die ISR Frequenz ist sehr wichtig. Bei STM32 ist die richtige Clock 
Config wichtig.
Ich toggle immer erst eine LED in der ISR und prüfe mit dem Oszilloskop 
die Frequenz...

Gruß
Stephan

von technikus (Gast)


Lesenswert?

Hallo Frank,

gerne möchte ich mir eine T+A Fernbedienung zulegen um mein DIY 
Vorverstärker zu steuern. Deshalb habe den Hersteller angefragt welches 
Protokoll implementiert ist.
Hier die Antwort:
RC2
Habe das Dokument vom Hersteller hier hochgeladen
https://filehorst.de/d/cFypmGgi

Ist es denkbar das Protokoll anhand dieser Daten in irmp zu 
implementiern?
Dann würde ich mir das Teil bestellen.

Danke und Gruß
Stephan

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

technikus schrieb:
> Ist es denkbar das Protokoll anhand dieser Daten in irmp zu
> implementiern?

Ja. Das ist einfacher Manchester Code ("bi-phase"). Allerdings gibt es 
als Besonderheit noch dieses Pre-Bit vor dem eigentlichen Start-Bit. Ich 
würde es als Protokoll mit 2 unterschiedlichen Start-Bits 
implementieren.

Reicht die Protokoll-Erkennung (IRMP) oder soll auch gesendet werden 
(IRSND)?

Noch eines: Die 31,25 kHz Modulationsfrequenz sind etwas ungewöhnlich. 
Ich würde dafür nicht unbedingt einen TSOP nehmen, der auf 38kHz 
abgestimmt ist, sondern eher einen für 30kHz, wie den TSOP31230. Oder 
den TSOP31233 für 33kHz.

: Bearbeitet durch Moderator
von technikus (Gast)


Lesenswert?

Frank M. schrieb:
> Reicht die Protokoll-Erkennung (IRMP)

Danke für die schnelle Antwort!
IRMP, also Empfang würde reichen.

Gruß
Stephan

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

technikus schrieb:
> IRMP, also Empfang würde reichen.

Die Version 3.1.3 ist online.

Neuerung:

 - Neues Protokoll: RC II (T+A)

Den IRMP-Artikel habe ich ebenso aktualisiert. Dank der sehr guten 
Dokumentation zu diesem Protokoll konnte ich die Erkennung des 
Protokolls zügig umsetzen. Zum Testen habe ich eine Scan-Datei 
IR-Data/rcii-15kHz.txt mit dem Editor erstellt, welche alle Codes der FB 
berücksichtigt. Es könnte noch sein, dass man noch etwas an den 
Toleranzen schrauben muss. Das wird sich dann herausstellen, sobald die 
Fernbedienung mit IRMP gestestet werden kann.

Viel Spaß,

Frank

: Bearbeitet durch Moderator
von Technikus (Gast)


Lesenswert?

Danke dir!
Ich werde mir den Geber besorgen und testen.

Gruß

von Stefan O. (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

ich versuche gerade IRMP so zu erweitern, dass er das Merlin-Protokoll 
vollständig und Fehlerfrei unterstützt, im Moment wird nur ein Teil 
fehlerhaft unterstützt.

Die Herausforderung ist, dass es eine variable Länge hat und Manchester 
kodiert ist. Das Dunkel am Ende kann, muss aber nicht, Teil des letzten 
Bits sein:

Beispiel für Taste loslassen:
Start-Bits: 10
Adresse:    00000001
Ergibt dann (1 Dunkel, ein Zeichen pro Symbol):
...1111|0110|1010101010101001|1111...


Beispiel für die Taste A:
Start-Bits: 10
Adresse:    00000001
Kommando:   00000100
End-Bit:    1
Ergibt dann (1 Dunkel, ein Zeichen pro Symbol):
...1111|0110|1010101010101001|1010101010011010|01|1111...

Beispiel für die Taste B:
Start-Bits: 10
Adresse:    00000001
Kommando:   00000101
End-Bit:    0
Ergibt dann (1 Dunkel, ein Zeichen pro Symbol):
...1111|0110|1010101010101001|1010101010011001|10|1111...

Wie man aus den Trennstrichen sieht, ist das letzte Bit z.T. im 
Endbereich wo es nicht mehr hell wird.

Die Anzahl der Kommando-Bytes kann zwischen 0 und 4 liegen, wenn ein 
Kommando-Byte kommt, dann kommt auch ein End-Bit am Schluss des Frames 
welches immer das Inverse des Bits davor ist.

Ich habe schon etwas rumgebastelt, aber ich bekomme es nicht hin, das 
alles geht, entweder 01 am Ende geht oder 10.
Die Kommando-Länge habe ich bereits auf 32 Bit geändert wenn Merlin 
aktiviert ist, dazu kommt noch ein Feld was dann die Kommando-Länge 
enthalten soll.
Ich verstehe auch noch nicht alles in dem Code, vielleicht kann mir 
jemand helfen das einzubauen. Im Idealfall würde es auch das offizielle 
IRMP übernommen, aber es erfordert halt eine Erweiterung der API.

Vielen Dank
Stefan

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Stefan O. schrieb:
> Ich verstehe auch noch nicht alles in dem Code, vielleicht kann mir
> jemand helfen das einzubauen.

Kannst Du Scans mittels IRMP_LOGGING erstellen und diese dann hier zur 
Verfügung stellen? Das wäre das einfachste für mich.

von Stefan Z. (stefan_z)


Lesenswert?

Erstaunlich, dass es immer noch Protokolle gibt, die nicht in IRMP 
integriert sind :-)

Wäre es nicht auch mal möglich, IRMP in die "offizielle" Arduino Library 
zu integrieren, so dass man es einfach über die IDE aktuelle halten und 
auf allen µC nutzen kann? Ich frage für nen Freund… hust

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Stefan Z. schrieb:
> Erstaunlich, dass es immer noch Protokolle gibt, die nicht in IRMP
> integriert sind :-)

Doch, das Merlin-Protokoll, um welches es geht, ist bereits integriert. 
Aber offenbar ist die Integration unvollständig, ich kann halt nur das 
umsetzen, was man mir als Stoff (in Form von Scans) liefert. Denn ich 
kann nicht alle Fernbedienungen der Welt vorrätig haben. Außerdem weiß 
ich aus Erfahrung, dass es zu vielen Protokollen etliche 
herstellerspezifische "Erweiterungen" gibt. Wahrscheinlich ist dies hier 
auch der Fall.

> Wäre es nicht auch mal möglich, IRMP in die "offizielle" Arduino Library
> zu integrieren, so dass man es einfach über die IDE aktuelle halten und
> auf allen µC nutzen kann? Ich frage für nen Freund… hust

Klar, mach. ;-)

Das Arduino-Problem ist wohl folgendes: IRMP braucht einen 
Timer-Interrupt. Da kann man unter Arduino wohl nicht jeden x-beliebigen 
Timer nehmen, weil das Arduino-Runtime-System bereits einen für sich 
reserviert - jedenfalls bei AVR. Wie das bei anderen µC-Familien ist, 
entzieht sich meiner Kenntnis.

Es gibt bereits Portierungen von IRMP für Arduino, einfach mal im 
IRMP-Artikel nach Arduino suchen. Diese Ports wurden aber wohl immer 
nur für einen speziellen µC durchgeführt und niemals so allgemein 
formuliert, wie es der IRMP-Source generell ist. Zudem kann ich über die 
Qualität der jeweiligen Portierung nichts sagen.

von Joachim B. (jar)


Lesenswert?

Stefan Z. schrieb:
> Wäre es nicht auch mal möglich, IRMP in die "offizielle" Arduino Library
> zu integrieren,

das habe ich mit einer älteren Version von IRMP schon geschafft (ist ja 
"nur" C), einfach einen arduinofreien Timer wählen, ABER die letzten 
IRMP waren so monster groß das die IDE überlastet wurde.

: Bearbeitet durch User
von Stefan Z. (stefan_z)


Lesenswert?

Frank M. schrieb:
> Klar, mach. ;-)

Ich bin mir nicht sicher, ob das zielführend wäre.
Ich habe vor Jahren mal eine IRMP Version auf Arduino umgebastelt, die 
nutze ich auch noch, aber sauber war das nicht zu 100%.

Arduino ist ja eh an so vielen Stellen total bekloppt.
Die seltsame Board-From die keinen Sinn ergibt.
Die Abstände der Pinleisten.
Die Platzierung der Bohrlöcher.

IRMP kann man aber schon auf andere Timer umbiegen, vor allem weil 
Arduino doch nur T0 für Millis u.Ä. nutzt:
"The standard Arduino has 3 timers, timer0 is 8 bit and used for the 
millis() and micros() functions. Timer1 is 16 bit and not used by 
default, timer2 is another 8 bit timer like timer0 but not used by 
default."
http://sphinx.mythic-beasts.com/~markt/ATmega-timers.html

Es hatte mich nur gewundert, weil IRMP ja schon sehr 
"Scheckheftgepflegt" ist und super sauber implementiert.
Vielleicht sehe ich es mal als persönliches Lern-Projekt, aber das ist 
schon einschüchternd viel was man wissen muss, um auf dem Level dann die 
Integration in Arduino zu machen.

von Joachim B. (jar)


Lesenswert?

Stefan Z. schrieb:
> Die seltsame Board-From die keinen Sinn ergibt.
> Die Abstände der Pinleisten.

ergibt schon Sinn, bastelsicher verdrehsicher für Shields!

auch wenns uns nicht gefällt für Lochrasteraufbauten, ich hatte einfach 
etwas Lochraster um 1,27mm verschoben eingesetzt.

von Stefan Z. (stefan_z)


Lesenswert?

Joachim B. schrieb:
> Stefan Z. schrieb:
>> Die seltsame Board-From die keinen Sinn ergibt.
>> Die Abstände der Pinleisten.
>
> ergibt schon Sinn, bastelsicher verdrehsicher für Shields!

Gut, da hätte man auch einfach asymmetrisch arbeiten können (was de 
fakto eh so ist, nur dass zusätzlich noch schief verschoben wird in alle 
Dimensionen), oder einen Elko so platziert, dass es physisch unmöglich 
wäre zu verpolen.

Ist halt ein Standard der leicht "bitter" schmeckt.
Von dem delay() im ersten Hallo Welt mal ganz abgesehen…

von Stefan O. (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,
vielen Dank für die schnelle Reaktion.
Ich habe es jetzt geschafft es zu implementieren: Das Problem war, dass 
sich die Toleranzgrenzen überlappen und ein kurzer auch als langer 
erkannt wurde (aber nicht andersherum) und man daher zwingend erst auf 
kurz prüfen müssen.

Da das Protokoll vorher nicht richtig implementiert war (Adresse wurde 
falsch erkannt, war im Manchester-Code verschoben, Kommandos erhielten 
ein zusätzliches Bit am Anfang), ist es nicht kompatibel mit der 
vorherigen Implementierung, da sich Adresse als auch Kommandos 
unterscheiden.
Es werden jetzt Kommandos bis 4 Byte erkannt (länger geht mit der 
Tastatur nicht), erkannt und das Prüfbit wird überprüft.

Zur Implementierung:
-Wenn Merlin aktiviert ist, wird die Kommando-Länge auf 32 Bit gesetzt 
und es gibt das Feld cmdlen in IRMP_DATA (leider sind die aktivierten 
Protokolle nicht in der irmpsystem.h verfügbar, daher hab ich das da 
nochmal definiert, sehr unschön).

-Wenn er Merlin erkannt hat und eine Pause kommt die länger ist als eine 
lange Pause, setzt er die Frame-Länge auf die aktuelle Länge und setzt 
"got_light".

-Wenn er in dann in dem if(got_light) ist und die aktuelle Länge den 
Frame-Länge entspricht, baut er basierend auf der letzten 
Pausen/Pulslänge und Zustand die letzten ein bis zwei Bits (da die Pause 
dazugehören kann aber nicht muss ist das der schwierige Teil)

-In irmp_get_data prüft er dann die korrekte Länge (entweder 10 oder 
11+n*8) und das letzte Bit und setzt die Länge des Kommandos in Byte (0 
bis 4).

-Da nach der Adresse noch 33 Bit folgen können wegen dem Prüfbit, habe 
ich die Adresse auf 9 Bit definiert, nachdem das letzte Bit überprüft 
wurde wird in irmp_get_data das Bit von der Adresse ins Kommando 
geschoben.

-Da die Erkennung ob Merlin in keinster Weise geändert wurde und auch in 
keinem nicht-Merlin spezifischen Teil was geändert ist (außer das 
Kommando jetzt 32 Bit), sollte kein anderes Protokoll irgendwie 
beeinflusst werden.

-Die Menge an Programmspeicher, welcher benötigt wird wächst von ~300 
Byte auf ~1200 Byte.

Ich würde mich freuen, wenn das in das offizielle IRMP übernommen werden 
kann.
Das mit dem IR Logging klappt nicht richtig bei mir, die serielle 
Schnittstelle hängt sich dabei irgendwie auf und es geht erst wieder 
nach Reset. Falls noch Bedarf ist, kann ich es mit dem Logic-Analyzer 
bei 20kHz aufnehmen, sollte dann doch das gleiche sein?

Vielen Dank
Stefan

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Stefan O. schrieb:
> Ich habe es jetzt geschafft es zu implementieren: Das Problem war, dass
> sich die Toleranzgrenzen überlappen und ein kurzer auch als langer
> erkannt wurde (aber nicht andersherum) und man daher zwingend erst auf
> kurz prüfen müssen.

Die Reihenfolge der Prüfung sollte hier nicht maßgeblich sein, vielmehr 
sollte man dafür sorgen, dass sich die Toleranzgrenzen nicht überlappen.

> Da das Protokoll vorher nicht richtig implementiert war

Bist Du Dir sicher, dass wir hier von demselben Protokoll sprechen?

MERLIN bezieht sich auf die Pollin-FB 
https://www.pollin.de/p/infrarot-fernbedienung-merlin-620185 (Artikelnr. 
620 185). Es gibt unter IR-Data eine Datei merlin-15kHz.txt, die über 
die Test-Suite (siehe test-suite.sh) auf Reproduzierbarkeit getestet 
wird.

> (Adresse wurde
> falsch erkannt, war im Manchester-Code verschoben, Kommandos erhielten
> ein zusätzliches Bit am Anfang),

Das hört sich nach einer ganz anderen FB an. Wenn dem so ist, dann 
sollte dem Protokoll Deiner FB auch ein anderer Name gegeben werden. Um 
was handelt es sich? Ich lese bei Dir "Tastatur", geht es hier um eine 
IR-Tastatur für den PC?

> Es werden jetzt Kommandos bis 4 Byte erkannt (länger geht mit der
> Tastatur nicht), erkannt und das Prüfbit wird überprüft.

Ja, die Tatsache, dass in IRMP sowohl Adresse als auch Kommando auf 16 
Bit beschränkt sind, hat mich später schon gestört, weil es durchaus 
auch Protokolle gibt, welche mehr Bits verwenden. Trotzdem konnte ich 
meist Redundanzen (CRCs, Parity-Bits und Wiederholungen) erkennen, 
welche dann besser lediglich geprüft, aber nicht in command oder 
address mit abgespeichert wurden. Zur Reproduzierung des Original-Frames 
werden dann in IRSND die notwendigen Bytes wieder neu berechnet und in 
den zu sendenden Frame wieder eingeführt.

Bist Du Dir da sicher, dass mehr als 16 Bit an reiner Information 
notwendig sind? Durch die Verwendung von mehr als 16 Bits wird IRMP zu 
einer größeren Reihe an real existierenden Anwendungen inkompatibel - 
siehe Abschnitt

  https://www.mikrocontroller.net/articles/IRMP#Hardware_.2F_IRMP-Projekte

Hier wird meist die Struct über UART oder USB als feste Größe 
verschickt. Durch Deine Änderungen

   1. Erweiterung der Struct um Variable cmdlen
   2. Erweiterung des Typs von command auf 32 Bit

laufen viele dieser Anwendungen ohne Anpassung nicht mehr.

Ich habe schon öfters überlegt, address und command auf 32 Bits zu 
erweitern, um es mir bei manchen Protokollen leichter zu machen, aber 
immer wieder diese Änderung verworfen, nämlich aus dem einfachen Grund, 
dass die 8-Bit-AVRs bei 32Bit-Variablen-Operationen (wie z.B. Shifts 
etc) grottenlangsam werden und so etwas in einer ISR tödlich ist.

Frage: Welchen µC setzt Du hier konkret ein? Hast Du es mit einem AVR-µC 
getestet?

Ich kann mir durchaus vorstellen, ab Version 4.0 einen Schnitt zu machen 
und address und command generell auf 32-Bit zu erweitern (bei 
Verzicht(!) auf cmdlen). Vorher muss aber greprüft werden, ob die 
8-Bit-AVRs da noch mithalten können und bei welcher Taktfrequenz.

> Zur Implementierung:
> -Wenn Merlin aktiviert ist, wird die Kommando-Länge auf 32 Bit gesetzt
> und es gibt das Feld cmdlen in IRMP_DATA (leider sind die aktivierten
> Protokolle nicht in der irmpsystem.h verfügbar, daher hab ich das da
> nochmal definiert, sehr unschön).

Das mit der Nochmal-Definition in irmpsystem.h ist ein NoGo, das müsste 
anders gelöst werden, z.B. durch generelles Arbeiten mit 32-Bit, siehe 
oben. Ich könnte mir auch vorstellen, lediglich bei den 32-Bit-µCs auf 
32 Bit zu gehen. Dann bleiben die AVRs halt bei 16 Bit und unterstützen 
Dein "Merlin-Protokoll" nicht.

> -Wenn er Merlin erkannt hat und eine Pause kommt die länger ist als eine
> lange Pause, setzt er die Frame-Länge auf die aktuelle Länge und setzt
> "got_light".

Hm, sehr speziell. Besser wäre eine Anpassung der Toleranzen, so dass 
sich diese "in beiden Richtungen" nicht mehr überschneiden.

> -In irmp_get_data prüft er dann die korrekte Länge (entweder 10 oder
> 11+n*8) und das letzte Bit und setzt die Länge des Kommandos in Byte (0
> bis 4).

Bist Du Dir da sicher mit den variablen Bitlängen? Hast Du da irgendeine 
Dokumentation zu Deiner Tastatur?

> -Da die Erkennung ob Merlin in keinster Weise geändert wurde und auch in
> keinem nicht-Merlin spezifischen Teil was geändert ist (außer das
> Kommando jetzt 32 Bit), sollte kein anderes Protokoll irgendwie
> beeinflusst werden.

Mir scheint, dass IRMP bei Deiner FB fälschlicherweise wegen der 
Start-Bits auf MERLIN springt, das Protokoll aber hier ein ganz anderes 
ist. Wie gesagt, MERLIN steckt hier in der Test-Suite und ist daher 
ziemlich gesichert, was die Erkennung betrifft.

> -Die Menge an Programmspeicher, welcher benötigt wird wächst von ~300
> Byte auf ~1200 Byte.

Hui, das ist eine Menge Holz. Naja, kommt auf den Prozessor an. Außerdem 
habe ich gesehen, dass Du F_INTERRUPTS auf 20000 gesetzt hast. Ist das 
für Dein "Merlin" so notwendig?

> Ich würde mich freuen, wenn das in das offizielle IRMP übernommen werden
> kann.

Sorry, in dieser Form bestimmt nicht, das fängt mit der inkompatiblen 
Änderung von IRMP_DATA an und hört auch nicht mit mit dem festen #define 
von IRMP_SUPPORT_MERLIN_PROTOCOL an der falschen Stelle auf. Als 
allererstes wäre überhaupt zu klären, ob wir beide überhaupt dasselbe 
"Merlin-Protokoll" meinen.

Hast Du mal nach Deinen Änderungen die Test-Suite aufgerufen, um zu 
prüfen, ob noch alles so läuft wie vorher?

> Das mit dem IR Logging klappt nicht richtig bei mir, die serielle
> Schnittstelle hängt sich dabei irgendwie auf und es geht erst wieder
> nach Reset. Falls noch Bedarf ist, kann ich es mit dem Logic-Analyzer
> bei 20kHz aufnehmen, sollte dann doch das gleiche sein?

Wenn Du den Logic-Analyzer-Output wieder ins IRMP-Loggin-Format 
zurückübersetzt, damit man unter Linux mit "irmp -a" im Analyzer-Modus 
das Protokoll näher analysieren kann, dann ja ;-)

Gruß,

Frank

: Bearbeitet durch Moderator
von Stefan Z. (stefan_z)


Lesenswert?

Stefan O. schrieb:
> Das mit dem IR Logging klappt nicht richtig bei mir, die serielle
> Schnittstelle hängt sich dabei irgendwie auf und es geht erst wieder
> nach Reset. Falls noch Bedarf ist, kann ich es mit dem Logic-Analyzer
> bei 20kHz aufnehmen, sollte dann doch das gleiche sein?

20kHz ist aber zu wenig bei einem 36kHz Empfänger.
Aber Rohdaten vom TSOP abzugreifen sollte ja mit 10 Zeilen Code und 
einem Arduino auch einfach sein, wobei die Logging Funktion von IRMP für 
mich früher immer gut funktionierte…

von Stefan O. (Gast)


Lesenswert?

> Die Reihenfolge der Prüfung sollte hier nicht maßgeblich sein, vielmehr
> sollte man dafür sorgen, dass sich die Toleranzgrenzen nicht überlappen.
Ich habe die Toleranzen auf 10% reduziert, geht immer noch problemlos.
Es könnte sein, dass die Toleranzgrenzen so groß gewählt (30%) waren 
damit der Fehler in der Implementierung ausgeglichen wird.

> Bist Du Dir sicher, dass wir hier von demselben Protokoll sprechen?
Sicher bin ich mir nicht, da ich die Fernbedienung dort nicht besitze, 
sondern diese Tastatur: 
https://www.mikrocontroller.net/articles/IR-Tastatur_Merlin_Ruwido
Das Protokoll SIEMENS_OR_RUWIDO erkennt gar nichts, MERLIN erkennt in 
seinem derzeitigen Zustand einzelne Tastendrücke inkorrekt, aber 
reproduzierbar.

> MERLIN bezieht sich auf die Pollin-FB
> https://www.pollin.de/p/infrarot-fernbedienung-merlin-620185 (Artikelnr.
> 620 185). Es gibt unter IR-Data eine Datei merlin-15kHz.txt, die über
> die Test-Suite (siehe test-suite.sh) auf Reproduzierbarkeit getestet
> wird.
Test-Suite läuft problemlos, auch merlin-15kHz.txt wird korrekt erkannt 
(das ist genau das Protokoll das ich meine, meine Tastatur gibt exakt 
solche Werte aus!), jedoch sind die Soll-Werte falsch:
Adresse muss 0x0001 sein und statt 0x0122 muss es 0x0022 sein etc. Das 
meinte ich damit als ich schrieb, es ist inkompatibel zur vorherigen 
fehlerhaften Implementierung. Argument warum vorher falsch und jetzt 
richtig folgt im nächsten Absatz.

> Bist Du Dir da sicher, dass mehr als 16 Bit an reiner Information
> notwendig sind? Durch die Verwendung von mehr als 16 Bits wird IRMP zu
> einer größeren Reihe an real existierenden Anwendungen inkompatibel

Ja, definitiv: Es können mehrere Tasten gleichzeitig gedrückt werden 
(bis zu 4) und die Tastatur überträgt dann genau die 4 8-Bit Codes der 
Tasten direkt hintereinander (32 Bit). Dies ist absolut konsistent und 
die Codes entsprechen für alle Standard-Tasten exakt den USB HID Codes. 
Daher bin ich mir auch so sicher, dass die Erkennung vorher falsch war, 
weil wie ich es jetzt habe ist es konsistent.

> Frage: Welchen µC setzt Du hier konkret ein? Hast Du es mit einem AVR-µC
> getestet?
Ein ATmega644P mit 18,432 MHz. Es soll später auf einem ATmega32U2 bei 
16MHz laufen (warte noch auf die Leiterplatte, wird wohl Ende November 
bis ich das testen kann)

> Hm, sehr speziell. Besser wäre eine Anpassung der Toleranzen, so dass
> sich diese "in beiden Richtungen" nicht mehr überschneiden.

Hier das Problem (ausgabe von irmp-15khz):
protocol = MERLIN, start bit timings: pulse:   2 -   4, pause:   5 -   8
pulse:   1 -   5 or   2 -  10
pause:   1 -   5 or   2 -  10

Problem scheint zu sein, dass die Werte einfach verdoppelt werden, was 
exakt korrekt wäre, aber bei den auf- und abgerundeten Werten halt zu 
sowas führt.


> Mir scheint, dass IRMP bei Deiner FB fälschlicherweise wegen der
> Start-Bits auf MERLIN springt, das Protokoll aber hier ein ganz anderes
> ist. Wie gesagt, MERLIN steckt hier in der Test-Suite und ist daher
> ziemlich gesichert, was die Erkennung betrifft.
Nein, defintiv nicht. Mit der vorherigen Implementierung kann ich 
einzelne Tastendrücke empfangen, die genau wie in der Testdatei 
aussehen. Nur die Erkennung vorher war meiner Ansicht nach mit den oben 
genannten Gründen falsch.

> Hui, das ist eine Menge Holz. Naja, kommt auf den Prozessor an. Außerdem
> habe ich gesehen, dass Du F_INTERRUPTS auf 20000 gesetzt hast. Ist das
> für Dein "Merlin" so notwendig?
Ja, für die letzten Bits ist es etwas speziell, daher wohl. 15kHz geht 
auch, ist aber an der Grenze (kurzer Puls darf 1 lang sein).

> Das mit der Nochmal-Definition in irmpsystem.h ist ein NoGo, das müsste
> anders gelöst werden, z.B. durch generelles Arbeiten mit 32-Bit, siehe
> oben. Ich könnte mir auch vorstellen, lediglich bei den 32-Bit-µCs auf
> 32 Bit zu gehen. Dann bleiben die AVRs halt bei 16 Bit und unterstützen
> Dein "Merlin-Protokoll" nicht.

Ja, das mit der irmpsystem.h ist klar, war nur zum testen, wäre das so 
übernommen worden hätte ich mich arg gewundert.

Mein Vorschlag:
Statt auf 32 Bit zu gehen wenn Merlin aktiviert ist, eine Option mit der 
man 32 Bit einschaltet. Dann kann man beim Kompilieren selber 
entscheiden unabhängig vom Protokoll. Für cmdlen genauso, wenn man es 
nicht aktiviert bleibt es ABI-kompatibel zu vorherigen Version.

> 20kHz ist aber zu wenig bei einem 36kHz Empfänger.
> Aber Rohdaten vom TSOP abzugreifen sollte ja mit 10 Zeilen Code und
> einem Arduino auch einfach sein, wobei die Logging Funktion von IRMP für
> mich früher immer gut funktionierte…

Der Empfänger ist sogar 56 KHz, aber das Protokoll reizt das zum Glück 
nicht aus.

Ich werde sonst gleich mal eine Testdatei basteln mit Kommandos der 
Tastatur.


Nochmal was ganz anderes:
Da mein Projekt auch IR Befehle wieder senden können soll (vom HTPC zu 
Fernseher etc.) habe ich mal eben meine Fernbedienungen untersucht. Ich 
habe einen alten Metz TV, da wird nichts erkannt. Es scheint ein 
Pulse-Distance-Protokoll zu sein:

Start: 866µs Pulse / 2300µs Pause
Bit A: 433µs Pulse /  956µs Pause
Bit B: 433µs Pulse / 1648µs Pause

Irgendeine Idee was das ist?

Viele Grüße
Stefan

von Stefan O. (Gast)


Angehängte Dateien:

Lesenswert?

So, ich habe die zu erwartenden Werte in der merlin-15kHz-correct.txt 
angepasst und eine weitere Test-Datei für die Tastatur angelegt, welche 
Kommandos von 0, 1 und 2 Byte Länge überprüft (für 3 und 4 Byte müsste 
das Testprogramm wohl angepasst werden).

Noch eine Bestätigung das ich das selbe Merlin-Protokoll meine: In der 
Testdatei merlin-15kHz.txt sind die Kommandos für die Ziffern 1 bis 0 
(10?), die sind genau wie bei meiner Tastatur. Vorher stand da 0x011e 
bis 0x0127, USB HID codes für die Ziffern 1,2, ... bis 0 sind 0x1e bis 
0x27, die werden jetzt auch erkannt.

Wenn man sich Merlin vorher anschaut machen schon die Werte im Header 
für Adresse- und Kommandoposition bzw. -länge keinen Sinn (sie 
überlappen sich), dazu kommt in dem Kommentar steht was anderes als im 
define direkt davor.

Ich bin mir doch sehr sehr sicher das ich es richtig habe und es vorher 
falsch implementiert war.

Natürlich bricht die neue Implementierung die Kompatibilität, 
möglicherweise kann man das auch wieder mit defines Regeln, man muss 
zusätzlich zu
IRMP_SUPPORT_MERLIN_PROTOCOL noch 
IRMP_MERLIN_PROTOCOL_OLD_IMPLEMENTATION oder 
IRMP_MERLIN_PROTOCOL_NEW_IMPLEMENTATION definieren (ich würde kein 
default setzen, damit man sich beim Kompilieren überlegen muss was man 
möchte).

> wobei die Logging Funktion von IRMP für
> mich früher immer gut funktionierte…
Da ist jetzt vielleicht die Grenze vom AVR erreicht weil ich 32 Bit und 
20 kHz aktiviert habe...

Nochwas: Ich verwende avr-gcc 8.2 als Kompiler (habe ich selber 
kompiliert weil ich einen AVR dieser neuen tiny1-Serie verwendet habe 
und die erst ab 8 unterstützt werden). Möglicherweise gab es mal 
Optimierungen das 32-Bit jetzt schneller läuft, soweit ich weiß habe ich 
da mal was gelesen, weiß aber gerade nicht bei welcher Version das war.

Viele Grüße
Stefan

von Stefan O. (Gast)


Lesenswert?

Das Metz Protokoll einzubauen war eine Angelegenheit von Minuten, hab 
keine Ahnung ob es noch woanders genutzt wird, die Aufteilung 
Adresse/Kommando erfolgte nach dem Prinzip solange Bits von Adresse nach 
Kommando geschoben bis Adresse für alle Tasten der Fernbedienung gleich. 
Die Kommandos sind ziemlich willkürlich, es gibt ein paar die direkt 
aufeinander folgen, der Großteil scheint ziemlich willkürlich über einen 
großen Bereich verteilt zu sein:

irmpprotocols.h:
1
/*---------------------------------------------------------------------------------------------------------------------------------------------------
2
 * METZ:
3
 *---------------------------------------------------------------------------------------------------------------------------------------------------
4
 */
5
#define METZ_START_BIT_PULSE_TIME                870.0e-6                       //  870 usec pulse
6
#define METZ_START_BIT_PAUSE_TIME               2300.0e-6                       // 2300 usec pause
7
#define METZ_PULSE_TIME                          435.0e-6                       //  435 usec pulse
8
#define METZ_1_PAUSE_TIME                       1680.0e-6                       // 1680 usec pause
9
#define METZ_0_PAUSE_TIME                        960.0e-6                       //  960 usec pause
10
#define METZ_FRAME_REPEAT_PAUSE_TIME             122.0e-3                       // frame repeat after 122ms
11
#define METZ_ADDRESS_OFFSET                      1                              // skip 1 bit (toggle bit)
12
#define METZ_ADDRESS_LEN                         6                              // read 6 address bits
13
#define METZ_COMMAND_OFFSET                      7                              // skip 7 bits
14
#define METZ_COMMAND_LEN                        12                              // read 12 bits
15
#define METZ_COMPLETE_DATA_LEN                  19                              // complete length
16
#define METZ_STOP_BIT                            0                              // has no stop bit
17
#define METZ_LSB                                 0                              // MSB...LSB
18
#define METZ_FLAGS                               0                              // flags

irmp.c:
1
/* im Anfangsbereich: */
2
#define METZ_START_BIT_PULSE_LEN_MIN            ((uint_fast8_t)(F_INTERRUPTS * METZ_START_BIT_PULSE_TIME * MIN_TOLERANCE_15 + 0.5) - 1)
3
#define METZ_START_BIT_PULSE_LEN_MAX            ((uint_fast8_t)(F_INTERRUPTS * METZ_START_BIT_PULSE_TIME * MAX_TOLERANCE_15 + 0.5) + 1)
4
#define METZ_START_BIT_PAUSE_LEN_MIN            ((uint_fast8_t)(F_INTERRUPTS * METZ_START_BIT_PAUSE_TIME * MIN_TOLERANCE_15 + 0.5) - 1)
5
#define METZ_START_BIT_PAUSE_LEN_MAX            ((uint_fast8_t)(F_INTERRUPTS * METZ_START_BIT_PAUSE_TIME * MAX_TOLERANCE_15 + 0.5) + 1)
6
#define METZ_PULSE_LEN_MIN                      ((uint_fast8_t)(F_INTERRUPTS * METZ_PULSE_TIME * MIN_TOLERANCE_20 + 0.5) - 1)
7
#define METZ_PULSE_LEN_MAX                      ((uint_fast8_t)(F_INTERRUPTS * METZ_PULSE_TIME * MAX_TOLERANCE_20 + 0.5) + 1)
8
#define METZ_1_PAUSE_LEN_MIN                    ((uint_fast8_t)(F_INTERRUPTS * METZ_1_PAUSE_TIME * MIN_TOLERANCE_20 + 0.5) - 1)
9
#define METZ_1_PAUSE_LEN_MAX                    ((uint_fast8_t)(F_INTERRUPTS * METZ_1_PAUSE_TIME * MAX_TOLERANCE_20 + 0.5) + 1)
10
#define METZ_0_PAUSE_LEN_MIN                    ((uint_fast8_t)(F_INTERRUPTS * METZ_0_PAUSE_TIME * MIN_TOLERANCE_20 + 0.5) - 1)
11
#define METZ_0_PAUSE_LEN_MAX                    ((uint_fast8_t)(F_INTERRUPTS * METZ_0_PAUSE_TIME * MAX_TOLERANCE_20 + 0.5) + 1)
12
#define METZ_FRAME_REPEAT_PAUSE_LEN_MAX         (uint_fast16_t)(F_INTERRUPTS * METZ_FRAME_REPEAT_PAUSE_TIME * MAX_TOLERANCE_20 + 0.5)
13
14
/* ... */
15
16
static const char proto_metz[]          PROGMEM = "METZ";
17
18
/* ... */
19
    proto_rcii,
20
    proto_metz,
21
    proto_radio1
22
};
23
24
25
#if IRMP_SUPPORT_METZ_PROTOCOL == 1
26
27
static const PROGMEM IRMP_PARAMETER metz_param =
28
{
29
    IRMP_METZ_PROTOCOL,                                                 // protocol:        ir protocol
30
    METZ_PULSE_LEN_MIN,                                                 // pulse_1_len_min: minimum length of pulse with bit value 1
31
    METZ_PULSE_LEN_MAX,                                                 // pulse_1_len_max: maximum length of pulse with bit value 1
32
    METZ_1_PAUSE_LEN_MIN,                                               // pause_1_len_min: minimum length of pause with bit value 1
33
    METZ_1_PAUSE_LEN_MAX,                                               // pause_1_len_max: maximum length of pause with bit value 1
34
    METZ_PULSE_LEN_MIN,                                                 // pulse_0_len_min: minimum length of pulse with bit value 0
35
    METZ_PULSE_LEN_MAX,                                                 // pulse_0_len_max: maximum length of pulse with bit value 0
36
    METZ_0_PAUSE_LEN_MIN,                                               // pause_0_len_min: minimum length of pause with bit value 0
37
    METZ_0_PAUSE_LEN_MAX,                                               // pause_0_len_max: maximum length of pause with bit value 0
38
    METZ_ADDRESS_OFFSET,                                                // address_offset:  address offset
39
    METZ_ADDRESS_OFFSET + METZ_ADDRESS_LEN,                             // address_end:     end of address
40
    METZ_COMMAND_OFFSET,                                                // command_offset:  command offset
41
    METZ_COMMAND_OFFSET + METZ_COMMAND_LEN,                             // command_end:     end of command
42
    METZ_COMPLETE_DATA_LEN,                                             // complete_len:    complete length of frame
43
    METZ_STOP_BIT,                                                      // stop_bit:        flag: frame has stop bit
44
    METZ_LSB,                                                           // lsb_first:       flag: LSB first
45
    METZ_FLAGS                                                          // flags:           some flags
46
};
47
48
#endif
49
50
/* .... in der Erkennung irgendwo: ...*/
51
52
#if IRMP_SUPPORT_METZ_PROTOCOL == 1
53
                    if (irmp_pulse_time >= METZ_START_BIT_PULSE_LEN_MIN && irmp_pulse_time <= METZ_START_BIT_PULSE_LEN_MAX &&
54
                        irmp_pause_time >= METZ_START_BIT_PAUSE_LEN_MIN && irmp_pause_time <= METZ_START_BIT_PAUSE_LEN_MAX)
55
                    {
56
#ifdef ANALYZE
57
                        ANALYZE_PRINTF ("protocol = METZ, start bit timings: pulse: %3d - %3d, pause: %3d - %3d\n",
58
                                        METZ_START_BIT_PULSE_LEN_MIN, METZ_START_BIT_PULSE_LEN_MAX,
59
                                        METZ_START_BIT_PAUSE_LEN_MIN, METZ_START_BIT_PAUSE_LEN_MAX);
60
#endif // ANALYZE
61
                        irmp_param_p = (IRMP_PARAMETER *) &metz_param;
62
                    }
63
                    else
64
#endif // IRMP_SUPPORT_METZ_PROTOCOL == 1

Ich habe das Toggle-Bit jetzt einfach weggeworfen, bei anderen 
Protokollen passiert das manchmal erst bei irmp_get_data, wie sollte 
damit umgegangen werden?

Viele Grüße
Stefan

von Lötlackl *. (pappnase) Benutzerseite


Angehängte Dateien:

Lesenswert?

Bezüglich des RCII-Protokolls ist IRMP zumindest mit meinem Equipment 
nicht in der Lage, diesen zu erkennen. Getestet mit einer originalen 
Fernbedienung von T+A, Programm wurde compiliert für einen ATmega168 
@16MHz, Empfänger an PORTB 0.
Habe nur die RC5- und RCII-Protokolle aktiviert. Signal kommt auch an, 
das Oszi-Bild steht für eine "0".
RC5 wird erkannt.
Habe ich etwas übersehen?
Ich weiß, mein Scope ist schon etwas "abgerockt".

Auszug aus der "irmpconfig.h"
1
//schnipp
2
#ifndef F_INTERRUPTS
3
#  define F_INTERRUPTS                          20000   // interrupts per second, min: 10000, max: 20000, typ: 15000
4
#endif
5
6
//schnipp
7
#define IRMP_SUPPORT_RC5_PROTOCOL               1       // RC5                  >= 10000                 ~250 bytes
8
...
9
#define IRMP_SUPPORT_RCII_PROTOCOL              1       // RCII T+A             >= 15000                 ~250 bytes

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


Lesenswert?

Stefan O. schrieb:
> Ich habe die Toleranzen auf 10% reduziert, geht immer noch problemlos.
> Es könnte sein, dass die Toleranzgrenzen so groß gewählt (30%) waren
> damit der Fehler in der Implementierung ausgeglichen wird.

Ich stelle die Toleranzen immer erstmal großzügig ein, weil ich aus 
Erfahrung weiß, dass diverse Fernbedienungen teilweise erheblich von den 
Sollwerten abweichen. Solange das nicht in Konflikt mit anderen 
Protokollen steht, lasse ich das so. Sollte es einen Konflikt mit 
anderen Protokollen geben, verkleinere ich anschließend die Toleranzen.

> Sicher bin ich mir nicht, da ich die Fernbedienung dort nicht besitze,
> sondern diese Tastatur:
> https://www.mikrocontroller.net/articles/IR-Tastatur_Merlin_Ruwido

Ah, okay.

> Test-Suite läuft problemlos, auch merlin-15kHz.txt wird korrekt erkannt
> (das ist genau das Protokoll das ich meine, meine Tastatur gibt exakt
> solche Werte aus!), jedoch sind die Soll-Werte falsch:
> Adresse muss 0x0001 sein und statt 0x0122 muss es 0x0022 sein etc. Das
> meinte ich damit als ich schrieb, es ist inkompatibel zur vorherigen
> fehlerhaften Implementierung. Argument warum vorher falsch und jetzt
> richtig folgt im nächsten Absatz.

Das überzeugt mich. Bei einigen Protokollen, bei denen mir lediglich ein 
paar wenige Scans vorlag und keine Dokumentation dazu, musste ich bei 
der Verteilung der Bits auf Adressen und Kommandos einfach raten. Es 
musste halt so passen, dass die Adresse immer dieselbe ist. Ob damit die 
Breite der Adresse korrekt ist, kann ich natürlich nicht immer 
garantieren.

Fazit:

Ich versuche, Dein korrigiertes Merlin-Protokoll in den IRMP einzubauen 
- unter optionaler Erweiterung der IRMP-Struct-Members auf 32 Bit. Wählt 
man den Standard "16 Bit" in der Konfiguration, ist halt Merlin nicht 
verfügbar. Das lässt sich aber durchaus verschmerzen, da es nicht sooo 
verbreitet ist.

Vielen Dank für Deine Arbeit.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Stefan O. schrieb:
> Das Metz Protokoll einzubauen war eine Angelegenheit von Minuten,
> hab keine Ahnung ob es noch woanders genutzt wird, die Aufteilung
> Adresse/Kommando erfolgte nach dem Prinzip solange Bits von Adresse nach
> Kommando geschoben bis Adresse für alle Tasten der Fernbedienung gleich.

Ja, meist passt das dann - wenigstens ungefähr.

> Die Kommandos sind ziemlich willkürlich, es gibt ein paar die direkt
> aufeinander folgen, der Großteil scheint ziemlich willkürlich über einen
> großen Bereich verteilt zu sein:

Wenn dieser Effekt auftritt, kann es sein, dass die Bitreihenfolge auf 
LSB statt MSB eingestellt werden muss. Wenn die Werte dann 
"vernünftiger" erscheinen, kannst Du davon ausgehen, dass das Umdrehen 
der Bits richtig war.

Von daher würde ich Dich bitten, mal
1
#define METZ_LSB                                 1

auszuprobieren.

> Ich habe das Toggle-Bit jetzt einfach weggeworfen, bei anderen
> Protokollen passiert das manchmal erst bei irmp_get_data, wie sollte
> damit umgegangen werden?

Ja, das kann man meist wegwerfen, weil IRMP die Abstände zwischen den 
Frames misst, um festzustellen, ob es sich um eine lang gedrückte Taste 
handelt oder nicht. Hast Du das getestet, ob flag korrekt gesetzt wird?

Zum Umgang: Meist ist es einfacher, es erst am Ende, also bei 
irmp_get_data() wegzuwerfen. Dann bleibt der Eingriff in die 
zeitkritische ISR "minimalinvasiv".

Ich werde das METZ-Protokoll gerne übernehmen. Interessant wäre jedoch 
noch der Test auf LSB-Reihenfolge.

Was immer ganz wünschenswert ist, ist eine Scan-Datei zu einem neuen 
Protokoll. Dann kann man sie in die Test-Suite mit aufnehmen und damit 
auch gewährleisten, dass bei zukünftigen Änderungen der Decoder noch 
vernünftig arbeitet. Vielleicht probierst Du nochmal, den UART zum 
Laufen zu überreden. Alternativ kann man so eine Scan-Datei auch mit 
einem Editor "künstlich anlegen", wenn man das Protokoll gut kennt. Ist 
aber ein wenig Arbeit...

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Lötlackl *. schrieb:
> Bezüglich des RCII-Protokolls ist IRMP zumindest mit meinem Equipment
> nicht in der Lage, diesen zu erkennen. Getestet mit einer originalen
> Fernbedienung von T+A, Programm wurde compiliert für einen ATmega168
> @16MHz, Empfänger an PORTB 0.

Es kann durchaus sein, dass TA hier ein anderes Protokoll als das 
"hauseigene" Protokoll verwendet. Das kommt sogar ziemlich oft vor, z.B. 
wenn das betreffende Gerät oder die Entwicklung lediglich eingekauft 
oder einfach nur "umgelabelt" wurde. Um das zu entscheiden, solltest Du 
ruhig ein paar mehr Protokolle aktivieren.

Alternativ machst Du mit IRMP ein paar Scans. Dann kann ich ziemlich 
schnell herausfinden, ob IRMP das Protokoll kennt oder nicht. Wenn es 
noch unbekannt ist, kann ich es einbauen. Falls Du es also nicht selbst 
herausfindest, solltest Du Dich mit IRMP_LOGGING beschäftigen ;-)

> Habe nur die RC5- und RCII-Protokolle aktiviert. Signal kommt auch an,
> das Oszi-Bild steht für eine "0".
> RC5 wird erkannt.

RC5... gilt das jetzt für die TA-Fernbedienung oder für eine andere? 
Wenn für die TA-FB, dann hast Du ja schon das verwendete Protokoll 
gefunden.

> Ich weiß, mein Scope ist schon etwas "abgerockt".

Leider kann ich da nicht wirklich Zeiten ablesen, nur die Verhältnisse 
von Puls/Pause zueinander. Bei einer 0, wo alle Pausen und Pulse gleich 
lang ist, ist das aber wenig aussagekräftig. Ich kann daher nur 
erkennen, dass da ein längeres Startbit ist, kann aber wegen der 
gleichlangen Verhältnisse nicht sagen, ob danach Manchester-, 
Pulse-Distance-, Pulse-Width- oder Pulse-Position-Code folgt. 
Aussagekräftiger wären daher Frames, wo verschiedene 
Pulse-/Pausen-Verhältnisse erkennbar sind - unter Angabe der Zeiten.

Einfacher wirds aber mit IRMP_LOGGING, siehe oben.

> #  define F_INTERRUPTS                          20000   // interrupts

Da würde ich nicht unbedingt mit so einem hohen Wert anfangen, sonder 
erstmal moderat 15000 Interrupts/Sekunde wählen.

Wie gesagt: Wenn IRMP tatsächalich bei der TA-FB RC5 erkennt, dann ist 
es auch RC5 (und nicht RCII) und der Drops ist gelutscht.

: Bearbeitet durch Moderator
von Lötlackl *. (pappnase) Benutzerseite


Angehängte Dateien:

Lesenswert?

Frank M. schrieb:
> Es kann durchaus sein, dass TA hier ein anderes Protokoll als das
> "hauseigene" Protokoll verwendet. Das kommt sogar ziemlich oft vor, z.B.
> wenn das betreffende Gerät oder die Entwicklung lediglich eingekauft
> oder einfach nur "umgelabelt" wurde. Um das zu entscheiden, solltest Du
> ruhig ein paar mehr Protokolle aktivieren.

Frank M. schrieb:
> Da würde ich nicht unbedingt mit so einem hohen Wert anfangen, sonder
> erstmal moderat 15000 Interrupts/Sekunde wählen.


Das hatte ich anfangs sogar, und auch 15000 Interrupts/Sekunde benutzt. 
Ich habe es zwecks Fehlereingrenzung nur auf die beiden Protokolle 
zurechtgestutzt.

Frank M. schrieb:
> RC5... gilt das jetzt für die TA-Fernbedienung oder für eine andere?
> Wenn für die TA-FB, dann hast Du ja schon das verwendete Protokoll
> gefunden.

RC5 gilt für eine andere Fernbedienung. Die habe ich nur beispielhaft 
aufgeführt, um Zweifel über die Funktionsfähigkeit meines Aufbaus zu 
zerstreuen. Viele andere Protokolle wurden schließlich richtig erkannt, 
nur eben RCII nicht.

Frank M. schrieb:
> Alternativ machst Du mit IRMP ein paar Scans. Dann kann ich ziemlich
> schnell herausfinden, ob IRMP das Protokoll kennt oder nicht. Wenn es
> noch unbekannt ist, kann ich es einbauen.
Es ist definitiv RCII, weil ich dieses Protokoll ohne Träger für meine 
TV-Mimik (nur noch eine Fernbedienung für "alles") in einer anderen 
Schaltung implementiert habe. Die Mimik empfängt dabei RC5-Befehle und 
übersetzt sie bei Bedarf nach RCII. Die T+A-Dinger haben einen so 
genannten "R-Link"-Eingang, dort gibt es nur +5V, GND und den 
Signaleingang, ideal, um einen TSOP*** dranzuklöppeln. Und das 
funktioniert sogar mit der originalen FB wie auch mit meiner Mimik.

Frank M. schrieb:
> Falls Du es also nicht selbst
> herausfindest, solltest Du Dich mit IRMP_LOGGING beschäftigen ;-)

So siehts wohl aus.

Anbei noch ein Bild besagter Mimik.

Trotzdem Danke und einen schönen Abend.

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


Lesenswert?

Lötlackl *. schrieb:
> Frank M. schrieb:
>> Falls Du es also nicht selbst
>> herausfindest, solltest Du Dich mit IRMP_LOGGING beschäftigen ;-)
>
> So siehts wohl aus.

Wenn Du die Scans dann hier reinstellst, kann ich anschließend IRMP 
daran anpassen.

von Stefan O. (Gast)


Angehängte Dateien:

Lesenswert?

Frank M. schrieb:
> Stefan O. schrieb:
>> Das Metz Protokoll einzubauen war eine Angelegenheit von Minuten,
>> hab keine Ahnung ob es noch woanders genutzt wird, die Aufteilung
>> Adresse/Kommando erfolgte nach dem Prinzip solange Bits von Adresse nach
>> Kommando geschoben bis Adresse für alle Tasten der Fernbedienung gleich.
>
> Ja, meist passt das dann - wenigstens ungefähr.
>
>> Die Kommandos sind ziemlich willkürlich, es gibt ein paar die direkt
>> aufeinander folgen, der Großteil scheint ziemlich willkürlich über einen
>> großen Bereich verteilt zu sein:
>
> Wenn dieser Effekt auftritt, kann es sein, dass die Bitreihenfolge auf
> LSB statt MSB eingestellt werden muss. Wenn die Werte dann
> "vernünftiger" erscheinen, kannst Du davon ausgehen, dass das Umdrehen
> der Bits richtig war.
>
> Von daher würde ich Dich bitten, mal
>
1
> #define METZ_LSB                                 1
2
>
>
> auszuprobieren.
Hatte ich schon, war ebenfalls Murks, aber ich habe ein Muster erkannt 
und mir  das mal genauer angeschaut: Die Adresse/Kommando wird zweimal 
hintereinander übertragen, davon beim zweiten mal mit invertierten Bits. 
Stimmt für alle Tasten und die Ziffern 0-9 sind jetzt die Kommandos 0 
bis 9, auch alle anderen Tastengruppen liegen sinnvoll hintereinander. 
Hier wird das überprüft :
1
#if IRMP_SUPPORT_METZ_PROTOCOL == 1
2
            case IRMP_METZ_PROTOCOL:
3
                irmp_address &= ~0x40;                              // clear toggle bit
4
                if (((~irmp_address)&0x7)==(irmp_address>>3) && ((~irmp_command)&0x3f)==(irmp_command>>6))
5
                {
6
                    irmp_address>>=3;
7
                    irmp_command>>=6;
8
                    rtc = TRUE;
9
                }
10
                break;
11
#endif
>
>> Ich habe das Toggle-Bit jetzt einfach weggeworfen, bei anderen
>> Protokollen passiert das manchmal erst bei irmp_get_data, wie sollte
>> damit umgegangen werden?
>
> Ja, das kann man meist wegwerfen, weil IRMP die Abstände zwischen den
> Frames misst, um festzustellen, ob es sich um eine lang gedrückte Taste
> handelt oder nicht. Hast Du das getestet, ob flag korrekt gesetzt wird?
>
> Zum Umgang: Meist ist es einfacher, es erst am Ende, also bei
> irmp_get_data() wegzuwerfen. Dann bleibt der Eingriff in die
> zeitkritische ISR "minimalinvasiv".
Das Flag wurde richtig gesetzt für Wiederholung, in irmp_get_data geht 
es genauso.
>
> Ich werde das METZ-Protokoll gerne übernehmen. Interessant wäre jedoch
> noch der Test auf LSB-Reihenfolge.
>
> Was immer ganz wünschenswert ist, ist eine Scan-Datei zu einem neuen
> Protokoll. Dann kann man sie in die Test-Suite mit aufnehmen und damit
> auch gewährleisten, dass bei zukünftigen Änderungen der Decoder noch
> vernünftig arbeitet. Vielleicht probierst Du nochmal, den UART zum
> Laufen zu überreden. Alternativ kann man so eine Scan-Datei auch mit
> einem Editor "künstlich anlegen", wenn man das Protokoll gut kennt. Ist
> aber ein wenig Arbeit...
Ich habe eine Testdatei angehängt, es gibt jedoch 2 Probleme:
-Erst wenn die Start-Pulse/Pause-Toleranz runter auf 5% ist, wird 
Grundig/Nokia nicht mehr fälschlicherweise als Metz erkannt. Ich weiß 
nicht ob das sinnvoll ist (mit meiner Fernbedienung OK, aber wie ist die 
Streuung?) oder ob die Protokolle sich gegenseitig ausschließen sollten.
-Er erkennt zwar richtig, aber er irgendwo findet er noch ein start 
pulse und hat dann ein timeout, weiß nicht genau warum.

Frank M. schrieb:
> Ich versuche, Dein korrigiertes Merlin-Protokoll in den IRMP einzubauen
> - unter optionaler Erweiterung der IRMP-Struct-Members auf 32 Bit. Wählt
> man den Standard "16 Bit" in der Konfiguration, ist halt Merlin nicht
> verfügbar. Das lässt sich aber durchaus verschmerzen, da es nicht sooo
> verbreitet ist.
Vielen Dank! Das Drücken von nur einer oder zwei Tasten geht ja noch mit 
16 Bit, weiß nicht wie das mit der Merlin-Fernbedienung die du verlinkt 
hattest ist und ob der Aufwand lohnt mit einem Haufen ifdefs ein Teil 
des Merlin-Protokolls mit 16 Bit zu unterstützen.
Was wichtig ist: Wenn man während die Tastatur einen Frame sendet eine 
weitere Taste drückt, ist es nicht unwahrscheinlich, das Blödsinn 
gesendet wird, es ist daher unbedingt erforderlich nur die korrekten 
Längen zuzulassen und das letzte Bit zu prüfen wie das mein Code macht.

> Vielen Dank für Deine Arbeit.
Sehr gerne, ich möchte es ja nutzen :)


Viele Grüße
Stefan

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Stefan O. schrieb:
> Hatte ich schon, war ebenfalls Murks, aber ich habe ein Muster erkannt
> und mir  das mal genauer angeschaut: Die Adresse/Kommando wird zweimal
> hintereinander übertragen, davon beim zweiten mal mit invertierten Bits.
> Stimmt für alle Tasten und die Ziffern 0-9 sind jetzt die Kommandos 0
> bis 9, auch alle anderen Tastengruppen liegen sinnvoll hintereinander.
> Hier wird das überprüft :#if IRMP_SUPPORT_METZ_PROTOCOL == 1

Sehr gut!

> Das Flag wurde richtig gesetzt für Wiederholung, in irmp_get_data geht
> es genauso.

Prima, das reicht.

> Ich habe eine Testdatei angehängt [...]

Danke.

> -Erst wenn die Start-Pulse/Pause-Toleranz runter auf 5% ist, wird
> Grundig/Nokia nicht mehr fälschlicherweise als Metz erkannt.

5% für Start-Bits ist - aus eigener Erfahrung - akzeptabel. Eventuell 
kann man die Toleranz auch noch für Grundig/Nokia etwas 
herunterschrauben, dann hat man mehr Spielraum.

> -Er erkennt zwar richtig, aber er irgendwo findet er noch ein start
> pulse und hat dann ein timeout, weiß nicht genau warum.

Das habe ich nicht verstanden.

Gruß,

Frank

: Bearbeitet durch Moderator
von Stefan O. (Gast)


Lesenswert?

Frank M. schrieb:
> 5% für Start-Bits ist - aus eigener Erfahrung - akzeptabel. Eventuell
> kann man die Toleranz auch noch für Grundig/Nokia etwas
> herunterschrauben, dann hat man mehr Spielraum.

Ich hatte bei mir in der Erkennung Metz vor Grundig/Nokia und er hat die 
Dateien Dbox.txt und die Grundig Dateien als Metz erkannt bis ich die 
Toleranz runter auf 5% hatte. Vielleicht ist es andersherum besser.

Frank M. schrieb:
> Das habe ich nicht verstanden.

Hier die Ausgabe von irmp beim Überprüfen der Testdatei, du wirst aus 
der Meldung sicher mehr Rückschlüsse ziehen können:
1
# Volume Down [55 (METZ) 0x0001 0x001b]
2
   4.350ms [starting pulse]
3
   7.500ms [start-bit: pulse = 17, pause = 46]
4
protocol = METZ, start bit timings: pulse:  16 -  19, pause:  43 -  49
5
pulse_1:   6 -  11
6
pause_1:  26 -  41
7
pulse_0:   6 -  11
8
pause_0:  14 -  24
9
command_offset:  7
10
command_len:     12
11
complete_len:    19
12
stop_bit:         0
13
   9.600ms [bit  0: pulse =   9, pause =  33] 1
14
  11.000ms [bit  1: pulse =   8, pause =  20] 0
15
  12.350ms [bit  2: pulse =   8, pause =  19] 0
16
  14.450ms [bit  3: pulse =   9, pause =  33] 1
17
  16.550ms [bit  4: pulse =   9, pause =  33] 1
18
  18.600ms [bit  5: pulse =   8, pause =  33] 1
19
  20.000ms [bit  6: pulse =   9, pause =  19] 0
20
  21.400ms [bit  7: pulse =   9, pause =  19] 0
21
  23.450ms [bit  8: pulse =   8, pause =  33] 1
22
  25.550ms [bit  9: pulse =   9, pause =  33] 1
23
  26.950ms [bit 10: pulse =   9, pause =  19] 0
24
  29.000ms [bit 11: pulse =   8, pause =  33] 1
25
  31.100ms [bit 12: pulse =   9, pause =  33] 1
26
  33.150ms [bit 13: pulse =   8, pause =  33] 1
27
  34.550ms [bit 14: pulse =   9, pause =  19] 0
28
  35.950ms [bit 15: pulse =   9, pause =  19] 0
29
  38.000ms [bit 16: pulse =   9, pause =  32] 1
30
  39.400ms [bit 17: pulse =   9, pause =  19] 0
31
  40.800ms [bit 18: pulse =   9, pause =  19] 0
32
  40.800ms code detected, length = 19
33
  40.800ms p=55 (METZ), a=0x0001, c=0x001b, f=0x00 checked!
34
  40.850ms [starting pulse]
35
   5.550ms error 1: pause after start bit pulse 8 too long: 311

Viele Grüße
Stefan

von Klaus R. (klaus2)


Lesenswert?

Hallo Frank,

wenn man IRMP kennt und es daher sehr zu schätzen weiß, verzweifelt man 
unter Linux mit LIRC geradezu. Man muss sehr krude Sachen machen um eine 
FB anzulernen, alles ist sehr unkomfortabel und funktioniert dann doch 
nicht.

Hast du eine Implementierung oder kennst etwas empfehlenswertes für 
RasPi? IRMP wird wohl wg der fehlenden interruptfähigkeit nicht 
portierbar sein?

Danke, Klaus.

von Joachim B. (jar)


Lesenswert?

Klaus R. schrieb:
> wenn man IRMP kennt und es daher sehr zu schätzen weiß, verzweifelt man
> unter Linux mit LIRC geradezu. Man muss sehr krude Sachen machen um eine
> FB anzulernen, alles ist sehr unkomfortabel und funktioniert dann doch
> nicht.

ja kenne ich

> Hast du eine Implementierung oder kennst etwas empfehlenswertes für
> RasPi? IRMP wird wohl wg der fehlenden interruptfähigkeit nicht
> portierbar sein?

könnte doch machbar sein, ich hatte mal gelesen das um 1µs (oder waren 
das 100µs) machbar sind, damit sollte es eigentlich gehen können.

von 900ss (900ss)


Lesenswert?

Klaus R. schrieb:
> empfehlenswertes für RasPi

Evtl. ist das hier ein Kompromiss?

Beitrag "USB IR Remote Receiver (V-USB + IRMP)"

von Klaus R. (klaus2)


Lesenswert?

...eigentlich nicht. Außer Frank sagt, es geht aus dem und dem Grund gar 
nicht anders.

Klaus.

von 900ss (900ss)


Lesenswert?

Nun, auf dem Rpi eine IRQ-Rate mit 15kHz hinzugekommen um IRMP zu 
treiben ist schon sehr sportlich. Ich denke selbst mit Kernel-Treiber 
wird das haarig.

von Klaus R. (klaus2)


Lesenswert?

...das befürchte ich auch. Man müsste die IRQ ja quasi nur auslagern und 
die serialisierten Daten dann verarbeiten (was wohl mit der VUSB Lsg 
passiert). Ziel ist, dass der RasPi unterscheidliche andere Geräte 
steuert (433Mhz, RC5, 455kHz IR, ...) und quasi als Server dient und man 
auch das Inet-Radio steuern kann. Ich hatte große Hoffnung auf LIRC, 
aber iwie erscheint mir das extrem merkwürdig zu sein und eher ein 
"netter Versuch".

Klaus.

von 900ss (900ss)


Lesenswert?

Hallo Frank,

für den RPi habe ich gerade mal einen Test gemacht.
Es gibt dort die pigpio library mit GPIO Support.

Dort kann ein Portpin mit 200kHz (default, geht auch langsamer) gepollt 
werden. Man kann einen Callback einrichten, der bei Pin change 
aufgerufen wird. Dort bekommt man dann einen Tickcounter in usec 
mitgeliefert. Man kann also die Zeitdifferenz zwischen den Pegelwechseln 
errechnen.

Könnte man den Mechanismus in IRMP nutzen um damit das IR-Signal zu 
dekodieren? Jetzt wird doch sicher nichts anderes gemacht, nur das IRMP 
das Signal sampled und dann die Zeiten berechnet.

Ich stecke jetzt garnicht tiefer in IRMP drin. Aber evtl. lässt sich das 
ja "leicht" nutzen.

Ich habe mal einen DCF77-Empfänger an einen Pin gehängt und in der 
Callbackfunktion dann nur die Zeiten und den Pinzustand geloggt. Die 
Zeiten sind in usec.

Man kann gut die 100/200ms Signale vom DCF erkennen.
1
GPIO 27 became 1 at 3839270678
2
GPIO 27 became 0 at 3839368284
3
GPIO 27 became 1 at 3840267646
4
GPIO 27 became 0 at 3840369131
5
GPIO 27 became 1 at 3841266373
6
GPIO 27 became 0 at 3841461904
7
GPIO 27 became 1 at 3842267956
8
GPIO 27 became 0 at 3842371996
9
GPIO 27 became 1 at 3843264478
10
GPIO 27 became 0 at 3843467599
11
GPIO 27 became 1 at 3844266506
12
GPIO 27 became 0 at 3844365561
13
GPIO 27 became 1 at 3845273349
14
GPIO 27 became 0 at 3845367674
15
GPIO 27 became 1 at 3846270121
16
GPIO 27 became 0 at 3846368736
17
GPIO 27 became 1 at 3847267424
18
GPIO 27 became 0 at 3847464939
19
GPIO 27 became 1 at 3848271741
20
GPIO 27 became 0 at 3848461172

Ein Timer mit 10-20kHz geht leider nicht in der Lib.

: Bearbeitet durch User
von Lötlackl *. (pappnase) Benutzerseite


Lesenswert?

Es fällt mir wieder wie Schuppen von den Augen, es ist schon etwas 
länger her, als ich das Sendeprotokoll implementierte. Das Oszi-Bild 
zeigt lediglich das Startkommando, ein vollständiges Telegramm 
beinhaltet aber noch etwas mehr.
Siehe auch: 
https://www.ta-hifi.de/wp-content/uploads/tua_ir_commands.pdf
Ich zitiere:
"A telegram consists of a 10-bit start command
(Start), one or more 10-bit commands (CMD) and a 10-bit end command 
(END)."
In dieser Beziehung ist das von technikus verlinkte PDF etwas ungenau.
Vielleicht ist das der Grund, weshalb IRMP mit RCII nichts anfangen 
kann.

Gute N8

: Bearbeitet durch User
Beitrag #5616429 wurde vom Autor gelöscht.
von Stefan O. (Gast)


Lesenswert?

Habe die Leiterplatten am Samstag bekommen und IRMP läuft problemlos mit 
32-Bit-Kommandos auf einem ATmega32u2 mit 16 MHz. Der macht bei mir 
jetzt 2 USB-HID-Geräte: Eine HID-Tastatur, die Merlin-Tastatur 
funktioniert damit wie eine normale Tastatur (auch 
Tastenkombinationen/lange Drücken funktioniert ganz normal), nur bei 
sehr schnellem Tippen fehlen z.T. Buchstaben (das liegt aber nicht am 
Empfänger, die werden nicht vollständig gesendet wenn schon die nächste 
Taste kommt). Das zweite ist ein universelles HID-Gerät welches 
IR-Befehle mit IRSND senden kann.

Ich werde Schaltplan/Layout/Quellcode gerne veröffentlichen, warte aber 
bis die nächste IRMP-Version draußen ist, jetzt geht es nur mit meiner 
angepassten Version.

Viele Grüße
Stefan

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Stefan O. schrieb:
> Habe die Leiterplatten am Samstag bekommen und IRMP läuft problemlos mit
> 32-Bit-Kommandos auf einem ATmega32u2 mit 16 MHz.

Freut mich zu hören.

> Ich werde Schaltplan/Layout/Quellcode gerne veröffentlichen, warte aber
> bis die nächste IRMP-Version draußen ist, jetzt geht es nur mit meiner
> angepassten Version.

Beim Einbau in den IRMP ist da noch eine Frage aufgetaucht: Ist cmdlen 
als eigener Struct-Member von IRMP_DATA speziell für das 
Merlin-Protokoll tatsächlich notwendig?

Ich schlage vor, diese Information besser als Zusatzinfo in "flags" 
unterzubringen. Das wird für spezielle Genre-Flags im Kaseikyo-Protokoll 
nämlich auch schon so gemacht, weil die bisherigen 16 Bit dort auch 
nicht ausreichten.

Für solche protokollspezifischen Zusatzinformationen sind nämlich in 
flags die oberen 4 Bit reserviert. Wenn ich es richtig verstanden habe, 
reichen diese 4 Bits auch aus, um cmd_len zu speichern, da es nur die 
Werte von 1 bis 4 annehmen kann.

ich plädiere daher dafür:
Alt:
1
#if IRMP_SUPPORT_MERLIN_PROTOCOL == 1
2
            irmp_data_p->cmdlen   = cmd_len;
3
#endif

Neu:
1
#if IRMP_SUPPORT_MERLIN_PROTOCOL == 1
2
            irmp_data_p->flags   |= cmd_len << 4;
3
#endif

Dann kann cmdlen in der neuen IRMP-Struct komplett entfallen. Wenn Du in 
der Anwendung dann cmd_len wieder auswerten möchtest, schreibst Du:
1
            cmd_len = (irmp_data.flags >> 4) & 0x0F;

Oder kürzer, da die Flags immer nur 8 Bit breit sind:
1
            cmd_len = irmp_data.flags >> 4;
Wärest Du damit einverstanden?

: Bearbeitet durch Moderator
von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Stefan O. schrieb:
> protocol = METZ, start bit timings: pulse:  16 -  19, pause:  43 -  49
> [...]
>    5.550ms error 1: pause after start bit pulse 8 too long: 311

Ich habe das Metz-Protokoll eingebaut. Die obige Fehlermeldung erscheint 
typischerweise, wenn man ein Bit zuwenig einliest.

Ich habe das so korrigiert:
1
#define METZ_COMMAND_LEN                        13                              // read 13 bits
2
#define METZ_COMPLETE_DATA_LEN                  20                              // complete length

Dann läufts ohne Fehlermeldung durch.

: Bearbeitet durch Moderator
von Stefan O. (Gast)


Lesenswert?

Hallo,
das mit cmdlen in den Flags ist eine sehr gute Idee! Die Werte können 
zwischen einschließlich 0 und 4 liegen (Länge 0 bedeutet alle Tasten 
wurden losgelassen, es wird nur Adresse übertragen), 3 Bit wären also 
sogar schon ausreichend.

In der irsnd.c war noch keine Definition für den ATmega32U2, habe ich 
ergänzt:
1
#elif defined (__AVR_ATmega8U2__)   \
2
   || defined (__AVR_ATmega16U2__)  \
3
   || defined (__AVR_ATmega32U2__)                                  // ATmega(8|16|32)U2 uses OC0A = PB7 or OC0B = PD0
4
#  if IRSND_OCx == IRSND_OC0A
5
#    define IRSND_PORT_LETTER                       B
6
#    define IRSND_BIT_NUMBER                        7
7
#  elif IRSND_OCx == IRSND_OC0B
8
#    define IRSND_PORT_LETTER                       D
9
#    define IRSND_BIT_NUMBER                        0
10
#  endif // IRSND_OCx

Ich weiß nicht ob du das Metz-Protokoll auch direkt in irsnd eingebaut 
hast, sonst probiere ich das am Wochenende mal.

Viele Grüße
Stefan

von Frank M. (ukw) (Moderator) Benutzerseite


Angehängte Dateien:

Lesenswert?

Stefan O. schrieb:
> das mit cmdlen in den Flags ist eine sehr gute Idee!

Ich habe hier mal die aktuelle Fassung von IRMP angehängt. Wenn das 
alles so bei Dir funktioniert, dann mache ich daraus ein neues Release. 
Wichtig ist, dass man hier im Projekt IRMP_32_BIT auf 1 setzt, also die 
Compileroption
1
-DIRMP_32_BIT=1

verwendet. Ich wollte das eigentlich mit in irmpconfig.h aufnehmen, 
überlege aber noch, wie ich das realisiere. irmpconfig.h wird nämlich 
aus gutem grund nach irmpsystem.h includiert. Dafür ist es aber dann zu 
spät.

> Ich weiß nicht ob du das Metz-Protokoll auch direkt in irsnd eingebaut
> hast, sonst probiere ich das am Wochenende mal.

Das METZ-Protokoll ist zwar im IRMP-Source drin, aber nicht in IRSND. Da 
kannst Du Dich gern austoben :-)

P.S.
IR-Data und damit die Test-Suite habe ich ebenso um Deine Scan-Dateien 
erweitert.

: Bearbeitet durch Moderator
von Bastler #7 (Gast)


Lesenswert?

https://www.mikrocontroller.net/articles/IRMP#Kodierungen
legt nahe das IRMP auch als 'HFMP' für ASK auf 433/868 MHz funktionieren 
könnte.

Kommt er gut mit Bit-Rauschen klar wenn gerade kein Signal Übertragen 
wird, oder braucht er eine Rauschsperre (Squelch)?

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Bastler #7 schrieb:
> https://www.mikrocontroller.net/articles/IRMP#Kodierungen
> legt nahe das IRMP auch als 'HFMP' für ASK auf 433/868 MHz funktionieren
> könnte.

Ja, ich habe da mal vor ein, zwei Jahren auch mit experimentiert, das 
dann aber mangels Interesse nicht weiter verfolgt.

> Kommt er gut mit Bit-Rauschen klar wenn gerade kein Signal Übertragen
> wird, oder braucht er eine Rauschsperre (Squelch)?

IRMP sollte ganz gut damit klarkommen. Wenn etwas empfangen wird, was 
keinem Muster zugeordnet werden kann, wird die Statemachine 
zurückgesetzt. Rauschen sollte also nichts weiter bewirken, als dass 
IRMP sich jedesmal wieder neu in die Startlöcher hockt, bis was "echtes" 
wie z.B. eine Präambel kommt.

von Holger W. (holgerw)


Lesenswert?

Hallo,
komme gerade nicht weiter. Ich möchte einen RC5 weitersenden.
irrcv sagt mir:

 // RC5 C0C
uint32_t address = 0x10;
uint32_t command = 0xC;
uint64_t data = 0xC0C;

Wie muss denn jetzt der irsend.sendRC5 aussehen, damit er genau den 
Befehl sendet?

irsend.sendRC5(0x10CC0C,24) ???
Wie wird Data "zusammengebaut"?


Holger


ok, hab zu kompliziert gedacht. Einfach den Wert 0xC0C senden...passt 
jetzt

: Bearbeitet durch User
von Uwe S. (steinm)


Lesenswert?

Ich habe hier eine alte Fernbedienung eines Videorecorders von Grundig. 
Es handelt sich um eine VIDEO PILOT 615. Ein TSOP für 38kHz kann das IR 
Signal sauber erkennen. Das Ausgangssignal entspricht weitgehend dem in 
https://www.mikrocontroller.net/attachment/77507/Grundig_10bit.pdf 
beschriebenen Signal, allerdings mit dem Unterschied, das hier nur 7 Bit 
(1 Startbit und 6 Datenbits) gesendendet werden. Sieht ganz so aus, als 
fehlten die Gruppenbits. Die Daten selbst passen zu den Codes in der 
Befehlsliste des obigen Dokuments.

Nun die Frage: Die Grundig/Nokia Fernbedienung in IRMP geht von 10 Bit 
aus. Reicht es daraus 7 Bit zu machen, um diese alte Fernbedienung zu 
erkennen?

  Uwe

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Uwe S. schrieb:
> Die Grundig/Nokia Fernbedienung in IRMP geht von 10 Bit aus. Reicht es
> daraus 7 Bit zu machen, um diese alte Fernbedienung zu erkennen?

Ja, kann gut sein, probiere es einfach aus. Du musst dafür nur 
irmpprotocols.h anpassen.

Wenn es klappt, kann ich auch in den Source einen Timeout-Handler 
einbauen, damit IRMP sowohl 10 Bit als auch 7 Bit erkennen kann.

Dafür wäre eine Scan-Datei (IRMP_LOGGING auf 1) sehr sinnvoll, damit ich 
das testen kann.

von Uwe S. (steinm)


Angehängte Dateien:

Lesenswert?

Frank M. schrieb:
> Uwe S. schrieb:
>> Die Grundig/Nokia Fernbedienung in IRMP geht von 10 Bit aus. Reicht es
>> daraus 7 Bit zu machen, um diese alte Fernbedienung zu erkennen?
>
> Ja, kann gut sein, probiere es einfach aus. Du musst dafür nur
> irmpprotocols.h anpassen.
Das hat erstaunlich gut geklappt. Damit wird die Fernbedienung schon 
erkannt.

> Wenn es klappt, kann ich auch in den Source einen Timeout-Handler
> einbauen, damit IRMP sowohl 10 Bit als auch 7 Bit erkennen kann.
>
> Dafür wäre eine Scan-Datei (IRMP_LOGGING auf 1) sehr sinnvoll, damit ich
> das testen kann.
Ich habe in der Schaltung leider keine serielle Ausgabe. Angehängt ist 
daher eine modifizierte Ausgabe von Sigrok. 0 steht für hell und 1 für 
dunkel, abgetastet mit 20 kHz. Im angehängten Screenshot sieht man das 
Signal auch grafisch aufbereitet. Der erste Frame ist immer gleich. Im 
zweiten Frame ist dann das eigentliche Kommando. Dieses wird so oft 
wiederholt, wie die Taste gedrückt wird. Nach Loslassen der Taste kommt 
nochmal der Frame vom Anfang (im Bild und dem Dump nicht vorhanden). Das 
entspricht weitesgehend der 10Bit Grundig Fernbedienung. Die Daten 
werden LSB gesendet. Die in der Beschreibung der 10Bit 
Grundig-Fernbedienung gelisten Codes, stimmen bis auf das letzte 
gesendete Bit überein. Für die Stop Taste wird "S001101" (S=Startbit) 
gesendet. Laut Beschreibung sollte es aber "S001100" sein. Das ist auch 
bei anderen Tasten so. Das letzte Bit könnte natürlich auch ein Stop bit 
sein, denn bisher habe ich keine Taste gefunden, deren letztes Bit nicht 
"1" war.

Noch eine Frage zu den Frames. Kümmert sich IRMP um die Frames und deren 
Interpretation oder muss ich das selbst machen?

  Uwe

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Uwe S. schrieb:
> Das hat erstaunlich gut geklappt. Damit wird die Fernbedienung schon
> erkannt.

Prima.

> Ich habe in der Schaltung leider keine serielle Ausgabe.

Schade.

> Angehängt ist
> daher eine modifizierte Ausgabe von Sigrok. 0 steht für hell und 1 für
> dunkel, abgetastet mit 20 kHz.

Okay, danke. Die Aufzeichnung kann ich verarbeiten.

> Die in der Beschreibung der 10Bit
> Grundig-Fernbedienung gelisten Codes, stimmen bis auf das letzte
> gesendete Bit überein. Für die Stop Taste wird "S001101" (S=Startbit)
> gesendet. Laut Beschreibung sollte es aber "S001100" sein.

Kann sein, dass Du die Anzahl der Bits in irmpprotcols.h um 1 zu hoch 
eingestellt hast. Am besten zeigst Du auch alle Änderungen, die Du in 
irmpprotocols.h vorgenommen hast.

> Noch eine Frage zu den Frames. Kümmert sich IRMP um die Frames und deren
> Interpretation oder muss ich das selbst machen?

Da kümmert sich IRMP selbst drum. Ab einer längeren Ruhepause weiß die 
Statemachine, dass der Frame zuende ist - egal ob vollständig oder 
nicht. Die Statemachine wird dann automatisch zurückgesetzt.

von Uwe S. (steinm)


Lesenswert?

Frank M. schrieb:
> Uwe S. schrieb:

[...]

>> Die in der Beschreibung der 10Bit
>> Grundig-Fernbedienung gelisten Codes, stimmen bis auf das letzte
>> gesendete Bit überein. Für die Stop Taste wird "S001101" (S=Startbit)
>> gesendet. Laut Beschreibung sollte es aber "S001100" sein.
>
> Kann sein, dass Du die Anzahl der Bits in irmpprotcols.h um 1 zu hoch
> eingestellt hast. Am besten zeigst Du auch alle Änderungen, die Du in
> irmpprotocols.h vorgenommen hast.
Nur diese beiden Zeilen
1
#define GRUNDIG_COMMAND_LEN                     6//9                               //    read 9 command bits
2
#define GRUNDIG_COMPLETE_DATA_LEN               7//10                              //    complete length: 1 start bit + 9 data bits

  Uwe

von Uwe S. (steinm)


Angehängte Dateien:

Lesenswert?

Hallo Frank,

mit der kleinen Korrektur der GRUNDIG_COMMAND_LEN von 9 auf 6 und 
GRUNDIG_COMPLETE_DATA_LEN von 10 auf 7 habe ich mal alle Tasten der FB 
aufgezeichnet. Das Scannen selbst habe ich mit sigrok und pulseview mit 
einer Abtastrate von 20kHz gemacht und das Ergebnis in die Datei 
IR-Data/Grundig_Video-Pilot-615-20kHz.txt der angehängten Zip-Datei 
geschrieben.
In jeder Zeile steht die Abtastung einer Taste. Das dann durch 
irmp-20kHz geschickt, ergibt die Ausgabe in 
IR-Data/Grundig_Video-Pilot-615-20kHz.out

Sieht soweit alles recht ordentlich aus, aber wie erweitert man den 
Quellcode von IRMP entsprechend, damit sowohl die 10-Bit als auch die 
6-Bit FB von Grundig erkannt wird? Und was passiert mit den Start- und 
End-Code, der bei jeder Taste gedrückt wird? Kümmert sich irmp darum 
oder muss ich das in der Anwendung selbst machen.

  Uwe

von Bernd (Gast)


Lesenswert?

Hallo

 habe gerade versucht, mit irsnd ein NEC - Datagramm zu erstellen - ging 
nicht, die Modulationsfrequenz war viel zu hoch (~700kHz). Kann es sein, 
dass in der Zeile (irsnd.c)
1
#  define IRSND_FREQ_36_KHZ (IRSND_FREQ_TYPE) ((F_CPU / 36000 / AVR_PRESCALER / 2) - 1)
2
#  define IRSND_FREQ_38_KHZ (IRSND_FREQ_TYPE) ((F_CPU / 38000 / AVR_PRESCALER / 2) - 1)
was nicht stimmt?
F_CPU=20000000,
F_INTERRUPTS=16000

Wenn ich IRSND_FREQ_36[38]_KHZ = 250 setze, ist alles gut.

p.s. falls ich richtig rechne, ergibt sich doch für F_CPU =20MHz und 
F_INTERRUPTS=15k ein Wert, der größer als 8 bit ist. Ist das gewollt?

In void irsnd_init (void) steht für NEC: irsnd_set_freq 
(IRSND_FREQ_36_KHZ),
in uint8_t irsnd_ISR (void): irsnd_set_freq (IRSND_FREQ_38_KHZ); ist das 
so gewollt?

@Frank, kannst Du gelegentlich die Versionsnummern mit in die Quelltexte 
aufnehmen?

Gruß, Bernd

[Mod: Macros in C-Tags gesetzt]

: Bearbeitet durch Moderator
von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Bernd schrieb:
> Kann es sein, dass in der Zeile (irsnd.c)
> ...
> was nicht stimmt?

Ich habe in Deinem Beitrag mal die Macros in C-Tags gepackt, damit die 
Operator-Zeichen von der Forumssoftware nicht verschluckt werden.

> p.s. falls ich richtig rechne, ergibt sich doch für F_CPU =20MHz und
> F_INTERRUPTS=15k ein Wert, der größer als 8 bit ist. Ist das gewollt?

Das sehe ich anders. Wegen
1
#  if F_CPU >= 16000000L
2
#    define AVR_PRESCALER                       8
3
#  else
4
#    define AVR_PRESCALER                       1
5
#  endif

ist bei F_CPU = 20MHz dann AVR_PRESCALER = 8.

Damit kommt für
1
#  define IRSND_FREQ_38_KHZ (IRSND_FREQ_TYPE) ((F_CPU / 38000 / AVR_PRESCALER / 2) - 1)
raus:
1
  (uint8_t) ((20000000 / 38000 / 8 / 2) - 1) = 31

Der Wert 31 passt durchaus in ein uint8_t. Das hatte ich damals schon 
berücksichtigt, dass bei größerem CPU-Takt hier ein Overflow auftreten 
könnte.

AVR_PRESCALER wird dann später auch genutzt beim Setzen von TCCR2 bzw. 
TCCR2B bzw. TCCR0 bzw. TCCR0B - je nach AVR-Typ.

> Wenn ich IRSND_FREQ_36[38]_KHZ = 250 setze, ist alles gut.

Das sieht jetzt aber so aus, als ob bei Dir AVR_PRESCALER auf 1 steht, 
also das obige #if nicht funktioniert. Oder hast Du in den Source 
eingegriffen?

Wo hast Du denn F_CPU gesetzt? Im Projekt selbst, also da, wo es 
hingehört? Ändere den Wert mal in 20000000UL - wie im Artikel empfohlen. 
Wenn ich es richtig in Erinnerung habe, konnten ältere avr-gcc solche 
großen Werte ohne den Zusatz "UL" nicht richtig verarbeiten.

Es könnte auch sein, dass das Makro IRSND_FREQ_38_KHZ generell in 
16-Bit-Integer gerechnet wird, solange da kein ausgezeichneter Long-Wert 
im Ausdruck angegeben wird. Die Angabe von 20000000UL (mit UL) könnte es 
also schon richten.

Welche avr-gcc-Version nutzt Du?
Welchen AVR-µC nutzt Du?

Du kannst leicht überprüfen, ob der avr-gcc den richtigen Wert für 
AVR_PRESCALER wählt.

Schreibe einfach mal:
1
#  if F_CPU >= 16000000L
2
#    define AVR_PRESCALER                       8
3
xxxxxxxx // produce syntax error
4
#  else
5
#    define AVR_PRESCALER                       1
6
#  endif

Wenn der avr-gcc den Syntax-Error findet, dann nimmt er den richtigen 
Wert.

Bernd schrieb:
> In void irsnd_init (void) steht für NEC: irsnd_set_freq
> (IRSND_FREQ_36_KHZ),
> in uint8_t irsnd_ISR (void): irsnd_set_freq (IRSND_FREQ_38_KHZ); ist das
> so gewollt?

Ja, das ist gewollt. In irsnd_init() wird erstmal ein Standardwert 
gesetzt, deshalb steht da auch im Kommentar "default frequency" 
dahinter. Da steht auch nichts von NEC, das ist ganz allgemein zu sehen.

Später, wenn Du das gewollte Protokoll auswählst, wird dann die 
protokollspezifische Frequenz genommen, also 38kHz für NEC, was auch 
richtig ist.

> @Frank, kannst Du gelegentlich die Versionsnummern mit in die
> Quelltexte aufnehmen?

Hm, hatte ich die nicht mal drin? Werde ich prüfen.

: Bearbeitet durch Moderator
von Bernd (Gast)


Lesenswert?

@Frank
F_CPU wird über eine h-Datei korrekt und als erstes in main.c 
inkludiert. Trotzdem ist der Wert an der Definitionsstelle AVR_PRESCALER 
F_CPU==1000000. Ursache dürfte bei mir delay.h sein. Da bringt der 
Compiler manchmal eine Warnung und manchmal nicht.

Danke für die schnelle Hilfe, komme nun (hoffentlich) allein weiter.

Gruß
Bernd

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Bernd schrieb:
> Ursache dürfte bei mir delay.h sein. Da bringt der Compiler manchmal
> eine Warnung und manchmal nicht.

Wenn delay.h meckert, hast Du eben nicht überall F_CPU definiert. Dann 
wird übrigens F_CPU blöderweise auf 1MHz gesetzt, statt mit einem Fehler 
auszusteigen.

IRMP und IRSND benutzen auch gar keine Delays.

F_CPU gehört als Option in Dein Projekt. Jede IDE für AVR bietet die 
Möglichkeit, F_CPU in den Projekteinstellungen zu definieren, damit es 
für alle C-Files einheitlich gilt. Wenn Du ohne IDE arbeitest, gehört es 
halt ins Makefile: -DF_CPU=20000000UL

Hast Du das mal mit "UL" hinter 20000000 ausprobiert?

: Bearbeitet durch Moderator
von Armin J. (arminj)


Lesenswert?

Hallo Frank,

ich wollte mal Irmp auf dem Arduiono laufen lassen um es mit 2 anderen 
Arduino IR libraries zu vergleichen.
Leider ist es nicht direkt lauffähig.
Es sind aber nur einige Änderungen zu machen, wenn man sich auskennt.

Ich würde es auch gerne als Arduio library zusammenstellen, da muss man 
nur eine library.properties und eine keywords.txt hinzufügen (hab ich 
beides schon gemacht) und leider alle mains entfernen, aber das wars 
auch schon.

Bestände da Interesse, es ist übrigens die beste der 3 Libraries und es 
wäre doch schade, sie einer größeren Community vorzuenthalten.

Wie könnte man das organisatorisch mit den Updates und dem 
zusammenstellen machen, Arduino verlangt ein Github Repo als Master. 
Soll ich / kann ich da noch das svn2github.py anpassen? Gibt es schon 
einen github account (für die Word Clock) den man benutzen kann?

Beste Grüße
Armin

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Armin J. schrieb:
> Es sind aber nur einige Änderungen zu machen, wenn man sich auskennt.

Ich kenne mich mit den Arduino-Spitzfindigkeiten so gut wie gar nicht 
aus.

> Ich würde es auch gerne als Arduio library zusammenstellen, da muss man
> nur eine library.properties und eine keywords.txt hinzufügen (hab ich
> beides schon gemacht) und leider alle mains entfernen, aber das wars
> auch schon.

Das klingt sehr gut. Kannst Du gern machen!

> Bestände da Interesse, es ist übrigens die beste der 3 Libraries und es
> wäre doch schade, sie einer größeren Community vorzuenthalten.

Auf jeden Fall.

> Wie könnte man das organisatorisch mit den Updates und dem
> zusammenstellen machen, Arduino verlangt ein Github Repo als Master.
> Soll ich / kann ich da noch das svn2github.py anpassen? Gibt es schon
> einen github account (für die Word Clock) den man benutzen kann?

Das svn2github stammt nicht von mir. Nein, es gibt noch keinen github 
account. Soll ich einen anlegen?

von Stefan Z. (stefan_z)


Lesenswert?

Bin auch 100% für eine Arduino Version, hatte ich auch schon angeregt, 
liegt aber klar außerhalb meines Skillsets.
Da IRMP ja multi-platform ist, könnte man als Fernziel auch noch eine 
Integration in PlatformIO in Betracht ziehen, bzw. das von vornherein 
berücksichtigen. Der Arduino Editor ist ja schon extrem schrecklich im 
Vergleich zu jeder richtigen IDE…

von 900ss (900ss)


Lesenswert?

Ehrlich, es ist nun gar kein großes Problem, dass so wie es ist für 
Arduino zu verwenden.
Die Leute, die das nicht hinbekommen, die werden dann an anderer Stelle 
scheitern wo etwas konfiguriert werden muss oder doch trotz richtiger 
Konfiguration etwas nicht funktioniert.
Es ist so eine super gut funktionierende Library und ohne großen Aufwand 
fast überall so einzubinden.

von Stefan Z. (stefan_z)


Lesenswert?

900ss D. schrieb:
> Ehrlich, es ist nun gar kein großes Problem, dass so wie es ist für
> Arduino zu verwenden.

Es ist aber auch nicht elegant, so wie es jetzt ist.
GIT in PlatformIO eintragen, Compiler saugt die aktuelle / gewünschte 
Version.
Oder eben in der Arduino IDE direkt verfügbar.

Ich sehe den Nachteil nicht, das endlich mal offiziell und sauber zu 
machen.

von Joachim B. (jar)


Lesenswert?

900ss D. schrieb:
> Ehrlich, es ist nun gar kein großes Problem, dass so wie es ist für
> Arduino zu verwenden.

die irmp.c,v 1.164 2014/09/15 läuft bei mir astrein im Arduino

eine neuere Version hat die Arduino IDE überfordert

900ss D. schrieb:
> Es ist so eine super gut funktionierende Library und ohne großen Aufwand
> fast überall so einzubinden.

ja, aber sie ist in der aktuellen Version ziemlich fett geworden, ich 
hatte es ja versucht, aber die Arduino IDE hatte verweigert, die kam mit 
denganzen Verschachtelungen nicht mehr zurecht.

von Armin J. (arminj)


Lesenswert?

Das klingt doch ermutigend.
Dann will ich mal.

Frank es ist wohl am besten, wenn du ein Github Repository Irmp anlegst 
und mich https://github.com/ArminJo dafür auch gleich berechtigst.
Soll ich erst mal die Library dort zusammenbauen und später schauen wir 
dann, wie wir die Synchronisation mit svn hinkriegen?

Und noch 2 Sachen:
1. Der Arduino Standardport in den Sourcen ist zurzeit B6, das 
funktioniert garantiert auf keinem Arduino, da alle dort den Quarz 
haben.
Kann man das ändern, z.B. auf D6 oder D4, oder muss das 
rückwärtskompatibel bleiben?

2. Muss die irmp.c weiter eine C Source sein, oder kann ich auch ein cpp 
draus machen? Dann funktioniert nämlich das Logging aus der Tüte mit der 
Arduino Klasse Serial. Ist jetzt nicht sooo wichtig, wäre aber nett. 
Vielleicht auch nur für die Arduino Version...

Und wie lasse ich Dir Änderungen für das svn zukommen? Vielleicht baue 
ich erst mal die library und sage dann, welche Files ich wo geändert 
hab.

@900ss D. Natürlich läuft es nach einer Stunde im Arduino, wenn man das 
mit dem Port mal gerafft hat und die kapitalen Fehler in Arduino 
Beispiel bei der Protokollnamensausgabe nicht stören....

von 900ss (900ss)


Lesenswert?

Stefan Z. schrieb:
> das endlich mal offiziell und sauber zu machen

Wenn alle Software so sauber wie diese Library wäre, dann würde einiges 
besser funktionieren. ....kopfschüttel.....

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Joachim B. schrieb:
> ja, aber sie ist in der aktuellen Version ziemlich fett geworden, ich
> hatte es ja versucht, aber die Arduino IDE hatte verweigert, die kam mit
> denganzen Verschachtelungen nicht mehr zurecht.

Dann hast Du vermutlich etwas kaputtrepariert. Nenn doch bitte mal eine 
Fehlermeldung.

Was meinst Du mit "Verschachtelungen"? Die ganzen #ifdefs? Die sind doch 
überhaupt kein Problem für den Preprozessor, da kannst Du auch 
irgendeinen uralten nehmen.

von Joachim B. (jar)


Lesenswert?

Frank M. schrieb:
> Dann hast Du vermutlich etwas kaputtrepariert. Nenn doch bitte mal eine
> Fehlermeldung.

ist schon wieder einige Jahre her, zwischen 2014 und jetzt sinds ja 
wieder >4 Jahre.
Ich probiere das nun nicht mit jeder IDE oder gcc Version neu.
Die IDE hatte ich irgendwann von 1.0.5 über 1.6.x zu 1.8.5 bis 1.8.8 
gewechselt.

Vielleicht war der Unterschied auch nur damals alles angekreuzt um einen 
Universaltester zu bauen, klappte. Später alles angekreuzt und die IDE 
schmierte ab.

> Was meinst Du mit "Verschachtelungen"? Die ganzen #ifdefs? Die sind doch
> überhaupt kein Problem für den Preprozessor, da kannst Du auch
> irgendeinen uralten nehmen.

mag ja sein, vielleicht ist meinem Rechner XP win32 mit 2GB Ram auch nur 
die Puste ausgegangen.

Ich sollte es mal mit der IDE 1.8.8 unter win7 64Bit und 8GB Ram noch 
mal versuchen, aber momentan habe ich zu viele andere Baustellen.

wenn ich was an meiner wordclock ändern will bleibe ich erst mal bei der 
IRMP von 2014, da die funktioniert mit nur einem Dekoder aus einer FB 
brauche ich da nichts anfassen.

: Bearbeitet durch User
von Stefan Z. (stefan_z)


Lesenswert?

900ss D. schrieb:
> Stefan Z. schrieb:
>> das endlich mal offiziell und sauber zu machen
>
> Wenn alle Software so sauber wie diese Library wäre, dann würde einiges
> besser funktionieren. ....kopfschüttel.....

Die Aussage bezog sich offensichtlich auf die Einbindung in das Arduino 
/ POI Rep System. Denn das finde ich deutlich sauberer als wenn jeder 
User das erst wieder für sich macht und nach Updates neu machen muss.

Dass IRMP super edel gebaut ist weiß ich natürlich.

von 900ss (900ss)


Lesenswert?

Meine persönliche Meinung: es ist furchtbar diese Arduino IDE zu 
unterstützen. Diese IDE ist das Grauen schlechthin. So einen furchtbaren 
und nichts beherrschenden Editor gibt es kaum ein zweites mal. Die IDE 
ist zwar im Laufe der Zeit etwas besser geworden aber immer noch 
grottig.

Und dann das Buildsystem hinter dem Arduino- Zeugs ist sowas von 
durcheinander, dass sucht auch seines gleichen. Wenn man 
Arduino-Projekte ohne die IDE bauen möchte, ist das sehr aufwendig bis 
es geht. Solch ein Chaos. Und komm mir keiner, es gibt ja ein Plugin für 
Eclipse. Das ist seit Jahren buggy. Ich habe es mehrmals probiert. Taugt 
nicht.

Nun, Arduino ist zum schnellen Basteln erfunden worden und genau dafür 
ist sie auch gut und hat da einen guten Platz.
Aber leider steigen alle Hersteller auf dieses Zeug ein, alles ist 
plötzlich Arduino kompatibel und man kommt um dieses Zeug kaum herum, 
selbst im professionellen Bereich. Und diese Entwicklung finde ich übel.
Und jetzt auch noch IRMP......ich heul gleich ;)

So, war auch etwas OT aber musste ich loswerden. :)

von Armin J. (arminj)


Lesenswert?

900ss D. schrieb:
> Und komm mir keiner, es gibt ja ein Plugin für
> Eclipse. Das ist seit Jahren buggy. Ich habe es mehrmals probiert. Taugt
> nicht.

Ich empfehle da Sloeber: http://eclipse.baeyens.it/ , mach ich mit 
meinen Schülern...
Ist Arduino Ökosystem mit echter IDE.

von Stefan Z. (stefan_z)


Lesenswert?

900ss D. schrieb:
> Meine persönliche Meinung: es ist furchtbar diese Arduino IDE zu
> unterstützen. Diese IDE ist das Grauen schlechthin. So einen furchtbaren
> und nichts beherrschenden Editor gibt es kaum ein zweites mal. Die IDE
> ist zwar im Laufe der Zeit etwas besser geworden aber immer noch
> grottig.
Darum PlatformIO!
MS Visual Studio Code kostet auch nix und kann alles - wenn man 
rausfindet wie…

> Und dann das Buildsystem hinter dem Arduino- Zeugs ist sowas von
> durcheinander, dass sucht auch seines gleichen. Wenn man
> Arduino-Projekte ohne die IDE bauen möchte, ist das sehr aufwendig bis
> es geht. Solch ein Chaos.
Durchaus, aber inzwischen tuts das schon ganz geschmeidig, wenn man die 
Libraries gekonnt auswählt. Wie gesagt: PlatformIO.

> Nun, Arduino ist zum schnellen Basteln erfunden worden und genau dafür
> ist sie auch gut und hat da einen guten Platz.
Eben. Dank der vielen Libraries weiß man zumindest schnell ob ein Teil 
funktioniert.

> Aber leider steigen alle Hersteller auf dieses Zeug ein, alles ist
> plötzlich Arduino kompatibel und man kommt um dieses Zeug kaum herum,
> selbst im professionellen Bereich. Und diese Entwicklung finde ich übel.
> Und jetzt auch noch IRMP......ich heul gleich ;)
Aber, aber, wer wird denn gleich Tränen vergießen?
IRMP bleibt doch guter Code, jetzt halt noch erweitert um auf Arduino zu 
compilieren - was ja wie erwähnt mit einer Stunde basteln eh schon geht.

Am Ende ists doch eh nur C(++) Code der auf einer Zielplattform durch 
den Compiler raschelt. Wäre halt nice wenn ich ein neues Projekt 
aufmache, den GIT link in die .ini paste, dann ein paar Zeilen Code und 
ZACK! habe ich eine IRMP Remote auf einem Arduino, ESP, etc.

Man darf auch nicht vergessen, dass nicht nur die µCs schneller/fetter 
werden (Moore's Law), sondern sich auch die Komplexität/Macht der 
Entwicklungstools alle paar Jahre verdoppelt. Was ja bei den Anwendungen 
heute auch ein wichtiger Vorteil ist!
Vor 15 Jahren musste man noch einen riesen Aufriss für eine 
Multimediaanwendung machen, heute code ich sowas an einem Abend im 
Browser - inkl. Video-In, GPU Rendering und kompletter GUI.

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


Lesenswert?

Armin J. schrieb:
> Frank es ist wohl am besten, wenn du ein Github Repository Irmp anlegst
> und mich https://github.com/ArminJo dafür auch gleich berechtigst.

Habe ich gemacht: https://github.com/ukw100/IRMP

> Soll ich erst mal die Library dort zusammenbauen und später schauen wir
> dann, wie wir die Synchronisation mit svn hinkriegen?

Jepp.

> 1. Der Arduino Standardport in den Sourcen ist zurzeit B6, das
> funktioniert garantiert auf keinem Arduino, da alle dort den Quarz
> haben.
> Kann man das ändern, z.B. auf D6 oder D4, oder muss das
> rückwärtskompatibel bleiben?

Klar kannst Du das ändern. Der Default muss zu nichts kompatibel sein.

> 2. Muss die irmp.c weiter eine C Source sein, oder kann ich auch ein cpp
> draus machen? Dann funktioniert nämlich das Logging aus der Tüte mit der
> Arduino Klasse Serial. Ist jetzt nicht sooo wichtig, wäre aber nett.
> Vielleicht auch nur für die Arduino Version...

Für die Arduino-Version ist das okay.

> Und wie lasse ich Dir Änderungen für das svn zukommen? Vielleicht baue
> ich erst mal die library und sage dann, welche Files ich wo geändert
> hab.

Das wäre am besten. Bei größeren Änderungen sind diff-Files hilfreich.

Dank und Gruß,

Frank

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

900ss D. schrieb:
> Meine persönliche Meinung: es ist furchtbar diese Arduino IDE zu
> unterstützen.

Ich kann Deine Meinung ja verstehen, aber es tut ja keinem weh, Arduino 
zusätzlich zu unterstützen. Es wird ja weiterhin auch ohne Arduino 
gehen.

von 900ss (900ss)


Lesenswert?

Frank M. schrieb:
> Es wird ja weiterhin auch ohne Arduino
> gehen.

Das ist auch gut so :)

Noch etwas OT:
Das ist bei vielen Libraries oder Projekten leider nicht der Fall. Man 
kann sie ohne Arduino nicht bauen, weil dort viele Abhängigkeiten zu 
Arduino bestehen. Man kann es dann besser neu machen. Bei IRMP ist alles 
in sich geschlossen, da wird jetzt Arduino "oben drüber" gebaut. Dann 
ist es auch ok. Aber bei vielem ist es eben nicht so und dadurch ist man 
dann zu dem Zeugs verdonnert oder muss es neu machen. Es gibt einige 
gute Libs für Arduino aber man kann sie nur mit Arduino nutzen, obwohl 
es ja nur Code für ein AVR (o.a.) uc ist. Das stört mich. Ohne Arduino 
kann bald niemend mehr ein Projekt bauen.

Stefan Z. schrieb:
> Eben. Dank der vielen Libraries weiß man zumindest schnell ob ein Teil
> funktioniert.

Hmmm... bedingt stimme ich dir zu. Man weiß oft nicht, wenn es nicht 
funktioniert, ob es nicht doch die Library ist.

Beitrag #5791752 wurde von einem Moderator gelöscht.
von Armin J. (arminj)


Lesenswert?

So die Arduino library ist fertig!
https://github.com/ukw100/IRMP

Jetzt werde ich noch ein bischen an der Doku schreiben.

@Frank, guck dir mal die library.properties an, ob die 
Verantwortlichkeiten und Mailadressen in deinem Sinne sind. Die Zeile 
paragraph= werde ich noch im Rahmen der Doku erweitern.

Beitrag #5792177 wurde von einem Moderator gelöscht.
von Armin J. (arminj)


Lesenswert?

Hi,
ich versuche gerade IRMP zu verstehen und bin dabei über folgendes 
gestolpert:
1
                    {
2
#ifdef ANALYZE
3
                        ANALYZE_PRINTF ("protocol = UNKNOWN\n");
4
#endif // ANALYZE
5
6
                        irmp_start_bit_detected = 0;                            // wait for another start bit...
7
                    }
8
                    if (irmp_start_bit_detected) {
für mich sieht das so aus, dass die Bedingung immer false ist, oder 
übersehe ich da was?

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Armin J. schrieb:
> Hi, ich versuche gerade IRMP zu verstehen und bin dabei über
> folgendes gestolpert:                    {
> #ifdef ANALYZE
>                         ANALYZE_PRINTF ("protocol = UNKNOWN\n");
> #endif // ANALYZE
>
>                         irmp_start_bit_detected = 0;
> // wait for another start bit...
>                     }
>                     if (irmp_start_bit_detected) {
>
> für mich sieht das so aus, dass die Bedingung immer false ist, oder
> übersehe ich da was?

Ja, Du übersiehst die Zeile direkt darüber, also hier die 1. Zeile:
1
                    else
2
#endif // IRMP_SUPPORT_RCMM_PROTOCOL == 1
3
                    {
4
#ifdef ANALYZE
5
                        ANALYZE_PRINTF ("protocol = UNKNOWN\n");
6
#endif // ANALYZE
7
                        irmp_start_bit_detected = 0;                            // wait for another start bit...
8
                    }
9
10
                    if (irmp_start_bit_detected)
11
                    {

In das obige "else" geht er nur, wenn ganz spezielle Bedingungen 
vorliegen. Beachte auch, dass die noch weiter darüberliegenden 
if-Bedingungen noch ein "else" darüber stehen haben - je nachdem, welche 
Protokolle aktiviert sind.

Ja, die vielen Preprocessor-Statements machen das ziemlich 
unübersichtlich. Aber nur so kann man den Code auf die tatsächlich 
genutzten Protokolle reduzieren, damit das auch noch auf einem ATTiny 
läuft.

: Bearbeitet durch Moderator
von Armin J. (arminj)


Lesenswert?

Frank M. schrieb:


Frank M. schrieb:
> In das obige "else" geht er nur

DANKE!

Bei mir steht das aktive else ca 650 Zeilen vorher, das hab ich glatt 
übersehen ;-).
Aber alles gut, ich würde es genauso machen...

Ich versuche gerade IRMP (erstmal nur NEC) mit PinChangeInterrupt zu 
betreiben. Klappt schon recht gut.

von Armin J. (arminj)


Lesenswert?

So,

ich bin so weit, die Library https://github.com/ukw100/IRMP ist jetzt 
schön und einfach gemacht.

Wenn Frank zustimmt, würde ich dann ein Release bauen, und beantragen, 
es als  Arduino Library aufzunehmen.

von Boris S. (cool-man)


Lesenswert?

Hallo Frank,
hab Probleme beim kompilieren des Arduino Samples. Als Board hab ich 
Olimex Mod Wifi ESO 8266DEV ausgewählt und bin nur auf kompilieren 
gegangen. Wird jedoch abgebrochen da /util/setbaud.h nicht gefunden 
wird. Diese hab ich versucht nach zu installieren wird aber weiterhin 
nicht gefunden. Hast du eine Idee ?

(Eigenltich möchte ich nur IR Codes analysieren, und wollte es auf dem 
Wemos D1 Mini zum laufen bringen).

Installiert habe ich die IRMP.zip  von dieser Webseite.

Grüsse

von E. K. (eku)


Angehängte Dateien:

Lesenswert?

Hallo Frank,

ich habe hier eine Onkyo RC-911R FB, die das NEC-Protokoll verwendet - 
zumindest alle Tasten bis auf eine. Im oberen Bereich befinden sich 12 
Tasten zur Selektion der Quelle, die letzte davon ist mit Bluetooth 
beschriftet und wird von IRMP nicht erkannt. Angehangene Protokolldatei 
wurde mit 15kHz Taktung aufgezeichnet. Wirf bitte einen Blick darauf.

Danke vorab.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Die Bluetooth-Taste benutzt auch das NEC-Protokoll. Allerdings verletzt 
sie die Regel, dass im vierten und letzten Byte die Bits invertiert zum 
dritten Byte wiederholt werden.

Bits im 3. Byte: 00001010
Bits im 4. Byte: 01110000

Aus diesem Grund wird das Ergebnis verworfen, da von einem 
Übertragungsfehler ausgegangen wird.

Bei allen anderen Tasten wird die Regel befolgt, z.B. bei PHONO:

Bits im 3. Byte: 11010000
Bits im 4. Byte: 00101111

Hier sieht man schön, wie 1 und 0 immer übereinander bzw. untereinander 
stehen.

Wie könnte man jetzt lösen, dass die Taste trotzdem erkannt wird? Ich 
möchte die obige Regel eigentlich nicht außer Kraft setzen, denn sie 
passt sonst immer. Noch niemand hat mir je einen Code präsentiert, wo 
auch diese Regel verletzt wird. Außerdem ist sie im Internet gut 
dokumentiert.

Ich schlage folgendes vor:

Ich führe ein neues Protokoll "ONKYO" ein, auf welches gewechselt wird, 
wenn die Regel verletzt wird. Dann bekommt man nicht nur 2 Bytes für die 
Adresse (Extended NEC), sondern auch 2 Byte (statt nur eins) für das 
Kommando.

Interessant ist bei dieser FB auch, dass nicht nur die BLUETOOTH-Taste 
eine abweichende Adresse benutzt, sondern auch die Taste BD/DVD. Kann es 
sein, dass man diese FB für verschiedene Onkyo-Geräte verwenden kann?

: Bearbeitet durch Moderator
von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Boris S. schrieb:
> hab Probleme beim kompilieren des Arduino Samples. Als Board hab ich
> Olimex Mod Wifi ESO 8266DEV ausgewählt und bin nur auf kompilieren
> gegangen. Wird jedoch abgebrochen da /util/setbaud.h nicht gefunden
> wird.

Ich vermute mal, dass util/setbaud.h nur für AVRs existiert. Ich selbst 
habe auch nicht den Arduino-Port gemacht, sondern Armin J. Du findest 
seinen letzten Beitrag hier genau über Deinem. Vielleicht kann Armin ja 
noch etwas dazu sagen.

Ich selbst kann nur vermuten, dass der Arduino-Code tatsächlich nur für 
AVRs getestet wurde.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Frank M. schrieb:
> Ich führe ein neues Protokoll "ONKYO" ein, auf welches gewechselt wird,
> wenn die Regel verletzt wird.

Gesagt, getan, ist online als Version 3.1.4.

Viel Spaß,

Frank

von Armin J. (arminj)


Lesenswert?

Hallo Frank,

ich teste gerade die ESP Versionen für Arduino und dabei ist mir 
aufgefallen, dass das PENTAX + GREE Protokoll inkompatibel mit dem Lego 
+ RCMM Protokoll ist, weil es bei #define F_INTERRUPTS 20000 zu 8 Bit 
Überlauf bei den Konstanten PENTAX_START_BIT_PULSE_TIME und 
GREE_START_BIT_PULSE_TIME kommt.
Sollte man die beiden Protokolle nicht genauso bei 20000 abschalten, wie 
Lego + RCMM bei 15000 abgeschaltet wird?

von Boris S. (cool-man)


Lesenswert?

Hallo Armin,

ich versuche IRMP es auf eine ESP8266 zum laufen zu bringen, in meinem 
Fall ein Wemos D1 Mini. Aber wenn ich auch das Borad Olimex Mod Wifi ESO 
8266DEV nehme, kommen diverse Fehlermeldungen. z.B. liegt 
/util/setbaud.h nicht vor. Ich glaube das brauche ich eigentlich nicht. 
Mir geht es spezielle um ACP25 Protokoll (hab ein baugleiche Klimaanlage 
von Trotec).

Hast du eine Idee ?

Grüss

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Hi Armin,

Armin J. schrieb:
> Sollte man die beiden Protokolle nicht genauso bei 20000 abschalten, wie
> Lego + RCMM bei 15000 abgeschaltet wird?

Ja, das ist eine gute Idee. Ich habe es gemacht und ins SVN als Version 
3.1.5 eingecheckt. Die Änderungen sind alleinig in irmp.h:
1
#if IRMP_SUPPORT_PENTAX_PROTOCOL == 1 && F_INTERRUPTS > 16000
2
#  warning F_INTERRUPTS too high, PENTAX protocol disabled (should be max 16000)
3
#  undef IRMP_SUPPORT_PENTAX_PROTOCOL
4
#  define IRMP_SUPPORT_PENTAX_PROTOCOL          0
5
#endif
6
7
#if IRMP_SUPPORT_GREE_PROTOCOL == 1 && F_INTERRUPTS > 16000
8
#  warning F_INTERRUPTS too high, GREE protocol disabled (should be max 16000)
9
#  undef IRMP_SUPPORT_GREE_PROTOCOL
10
#  define IRMP_SUPPORT_GREE_PROTOCOL            0
11
#endif

P.S.
Ich habe hier mal 16000 als obere Schranke gewählt. Das sollte reichen, 
um den Wert für den Startbit-Counter noch unter 256 zu halten. 18000 
sollte zwar auch noch gehen, könnte aber knapp bei späteren 
Toleranzänderungen werden.

Startbit-Länge bei Pentax ist 13 msec.

Dann gilt für den Zählwert:
1
0.013 * 16000 = 208
2
208 + 5% = 218.4

: Bearbeitet durch Moderator
von Armin J. (arminj)


Lesenswert?

Hi Frank,

bei mir tuts 17000 auch noch :-)
Wann sollen wir unsere Sourcen mal zusammenwerfen?
Ich hab jetzt die ESP Versionen fertig.

von Armin J. (arminj)


Lesenswert?

Boris S. schrieb:

> Hast du eine Idee ?

Ja klar :-)
Nimm die aktuellen Arduino Library Sourcen von 
https://github.com/ukw100/IRMP
Ich hab sie gerade fertig getestet.
Wenn Du auch damit klar kommst, sag bescheid, dann kann ich ja ein neues 
Arduino Release bauen.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Armin J. schrieb:
> bei mir tuts 17000 auch noch :-)

Es geht auch noch 18611 ;-)

> Wann sollen wir unsere Sourcen mal zusammenwerfen?
> Ich hab jetzt die ESP Versionen fertig.

Gute Frage. Kannst Du Deine Änderungen bei github reinstellen? Ich würde 
die dann auschecken, meine Änderungen einpflegen und diese dann wieder 
committen.

Oder hast Du einen anderen Vorschlag?

von Armin J. (arminj)


Lesenswert?

Frank M. schrieb:

> Es geht auch noch 18611 ;-)

na ja 18000 knallte bei mir im Compiler man hat ja den Faktor 1,1 bei 
PENTAX oder 1,2 bei GREE


> Gute Frage. Kannst Du Deine Änderungen bei github reinstellen? Ich würde
> die dann auschecken, meine Änderungen einpflegen und diese dann wieder
> committen.
>
> Oder hast Du einen anderen Vorschlag?

Sind soeben eingecheckt.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Armin J. schrieb:
> na ja 18000 knallte bei mir im Compiler man hat ja den Faktor 1,1 bei
> PENTAX oder 1,2 bei GREE

Ja, bei 10% knallt es früher, stimmt. Ich hatte das mit 5% Toleranz 
durchgerechnet.

> Sind soeben eingecheckt.

Danke, schaue ich mir in den nächsten Tagen an.

von E. K. (eku)


Lesenswert?

Frank M. schrieb:
> Ich schlage folgendes vor:
>
> Ich führe ein neues Protokoll "ONKYO" ein, auf welches gewechselt wird,
> wenn die Regel verletzt wird. Dann bekommt man nicht nur 2 Bytes für die
> Adresse (Extended NEC), sondern auch 2 Byte (statt nur eins) für das
> Kommando.

Man wird mit ONKYO dann alle Codes per IRSEND senden können oder muss 
man für einige auf NEC zurückgreifen?

> Interessant ist bei dieser FB auch, dass nicht nur die BLUETOOTH-Taste
> eine abweichende Adresse benutzt, sondern auch die Taste BD/DVD. Kann es
> sein, dass man diese FB für verschiedene Onkyo-Geräte verwenden kann?

Das kann gut sein. Ich habe aber nur ein Gerät.

Beim Scannen aller Tasten ist mir aufgefallen, dass die Codes in das 
Schema Device XXD2 Command 00YY passen, also das MSB des Gerätes sich 
auch ändert.

: Bearbeitet durch User
von Boris S. (cool-man)


Lesenswert?

Armin J. schrieb:

> Ja klar :-)
> Nimm die aktuellen Arduino Library Sourcen von
> https://github.com/ukw100/IRMP
> Ich hab sie gerade fertig getestet.
> Wenn Du auch damit klar kommst, sag bescheid, dann kann ich ja ein neues
> Arduino Release bauen.

Hab die IRMP-Master.zip frisch heruntergeladen und eingebunden. Und 
SimpleReceiver auf Wemos D1 mini geladen. IR an D5 läuft ! SUPER danke 
für die Hilfe.

Im irmpconfigMain15.h hab ich 4x weiter Protokolle enabled, u.a. ACP24 
mit :
#define IRMP_SUPPORT_ACP24_PROTOCOL             1       // ACP24

Ausgabe über Seriellen Monitor :
z.B. TV Samsung (Taste1) wird erkannt : P=SAMSG32  A=0x707 C=0xFB04

Aber die KlimaFB wird nicht so gut erkannt, einmal gedrückt :
P=SIEMENS  A=0x2AA C=0x15A
P=SIEMENS  A=0x2AA C=0x15A R
P=SIEMENS  A=0x2AA C=0x15A R
P=SIEMENS  A=0x2AA C=0x15A R
Code bleibt gleich egal welche Taste.

Die Klimaanlage die ich steuern möchte ist eine Trotec PAC 3550 Pro die 
baugleich zu Stiebel Eltron ACP 35 ist.  Gut ist nicht ACP25 - dachte 
aber das wäre das gleiche Protokoll. Problem ist das sich der Code der 
origFB kaum lernen läßt, nur mit einer Pronto aber passt nicht so 
richtig mit der Beschreibung der ACP25.

Hab mal eine universal KlimaFB genommen und versucht die Trotec zu 
steuern und hab wenigstens per Suchlauf einen Code gefunden der die 
ein/aus schaltet (toggel) : P=NEC  A=0xE710 C=0x0   ein ganz anderer 
Code alles komisch...

Wenigstens läuft das Prog mit Wemos.  Allerdings nur der SimpleReceiver, 
die anderen werden kompliert und hochgeladen aber die Ausgabe ist nicht 
so wie am SimpleReceiver.
vielen Dank und Grüsse

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

E. K. schrieb:
> Man wird mit ONKYO dann alle Codes per IRSEND senden können oder muss
> man für einige auf NEC zurückgreifen?

Nein, Du musst dann für die NEC-Tasten auch NEC angeben, für die 
ONKYO-Taste dann ONKYO.

Du kannst natürlich NEC in ONKYO umrechnen, indem Du das negiert Byte 
beim Kommando zusätzlich angibst, aber das wäre zusätzlicher Aufwand 
ohne weiteren Nutzen.

Hattest Du mitbekommen, dass IRMP mit ONKYO bereits verfügbar ist? Den 
Empfang kannst Du also schon mal ausprobieren. ONKYO muss auch nicht 
zusätzlich aktiviert werden.

von E. K. (eku)


Lesenswert?

Frank M. schrieb:
> Hattest Du mitbekommen, dass IRMP mit ONKYO bereits verfügbar ist? Den
> Empfang kannst Du also schon mal ausprobieren. ONKYO muss auch nicht
> zusätzlich aktiviert werden.

Rev 189 "added ONKYO protocol"

Da ist aber vieles drinnen, was den Blick auf Onkyo versperrt. Trotzdem 
Danke.

von Armin J. (arminj)


Lesenswert?

Boris S. schrieb:
> Wenigstens läuft das Prog mit Wemos.  Allerdings nur der SimpleReceiver,
> die anderen werden kompliert und hochgeladen aber die Ausgabe ist nicht
> so wie am SimpleReceiver.

Hi Boris,
welches Beispiel hat denn welchen unerwarteten Output, kannst Du das 
präzisieren, dann kann ich mal forschen.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

IRSND 3.1.5 ist online.

Änderungen:

* Neues Protokoll: ONKYO

von Boris S. (cool-man)


Lesenswert?

Armin J. schrieb:
> Hi Boris,
> welches Beispiel hat denn welchen unerwarteten Output, kannst Du das
> präzisieren, dann kann ich mal forschen.

Speziell das hier, hier hätte ich den APC24 Klima code erwartet.
 KlimaFB einmal gedrückt :
P=SIEMENS A=0x2AA C=0x15A
P=SIEMENS A=0x2AA C=0x15A R
P=SIEMENS A=0x2AA C=0x15A R
P=SIEMENS A=0x2AA C=0x15A R
Code bleibt gleich egal welche Taste.
Wenn alles gleich bleibt egal welch Taste der KlimaFB ich drücke, dann 
meine ich der code wird nicht richtig interpretiert.
Der output ist vom SimpleReceiver prog das Protokoll ACP24 hab ich 
aktiviert.

Grüße

von Armin J. (arminj)


Lesenswert?

Dann nimm mal den #include <irmpNone.h> und aktiviere danach nur dein 
Protokoll.
Oder nimm das neue Beispiel OneProtocol, dann musst Du aber auch die 
anderen Files abrufen, da wurde etwas umgebaut :-)

Good Luck

von Boris S. (cool-man)


Lesenswert?

Armin J. schrieb:
> Dann nimm mal den #include <irmpNone.h> und aktiviere danach nur
> dein
> Protokoll.
> Oder nimm das neue Beispiel OneProtocol, dann musst Du aber auch die
> anderen Files abrufen, da wurde etwas umgebaut :-)
>
> Good Luck

Hallo,
habs mit nur einem und mit allen Protokollen probiert, es kommt nur ein 
Output mit dem Siemens Protokoll, denke aber das ist immernoch eine 
falsche Interpretation, da es keinen Unterschied gibt egal welche Taste 
ich drücke.

P=SIEMENS A=0x2AA C=0x15A
P=SIEMENS A=0x2AA C=0x15A R
P=SIEMENS A=0x2AA C=0x15A R
P=SIEMENS A=0x2AA C=0x15A R

Mit der Pronto aufgezeichnet gibts Unterschiede :
In dem Code Telegramm sind alle Angaben enthalten ähnlich ACP24, also 
Temperatur, Modus (Kühlen, Enfeuchten, Auto..) aber wie genau?!

Das wäre Ein, 18°C Kühlen:
0000 006c 004a 0000 01ca 00c4 0015 0013 0018 004a 0015 0013 0018 004a 
0015 0013 0018 004a 0015 0013 0018 004a 0015 0013 0015 0013 0018 004a 
0018 004a 0015 0013 0015 0013 0018 004a 0015 0013 0015 0013 0015 0013 
0015 0013 0015 0013 0015 0013 0015 0013 0015 0013 0015 0013 0015 0013 
0015 0013 0015 0013 0015 0013 0015 0013 0018 004a 0018 004a 0018 004a 
0015 0013 0015 0013 0015 0013 0015 0013 0015 0013 0015 0013 0015 0013 
0015 0013 0015 0013 0015 0013 0015 0013 0015 0013 0015 0013 0015 0013 
0015 0013 0015 0013 0015 0013 0015 0013 0018 004a 0015 0013 0015 0013 
0015 0013 0015 0013 0018 004a 0018 004a 0015 0013 0015 0013 0015 0013 
0015 0013 0015 0013 0015 0013 0015 0013 0015 0013 0015 0013 0018 004a 
0015 0013 0018 004a 0018 004a 0018 004a 0018 004a 0015 00c4

Das wäre Aus :
0000 006c 004a 0000 01ca 00c4 0015 0013 0018 004a 0015 0013 0018 004a 
0015 0013 0018 004a 0015 0013 0018 004a 0015 0013 0018 004a 0018 004a 
0015 0013 0015 0013 0015 0013 0018 004a 0018 004a 0015 0013 0015 0013 
0015 0013 0015 0013 0015 0013 0015 0013 0015 0013 0015 0013 0015 0013 
0015 0013 0015 0013 0015 0013 0018 004a 0018 004a 0015 0013 0018 004a 
0015 0013 0015 0013 0015 0013 0015 0013 0015 0013 0015 0013 0015 0013 
0015 0013 0015 0013 0015 0013 0015 0013 0015 0013 0015 0013 0015 0013 
0015 0013 0015 0013 0015 0013 0015 0013 0018 004a 0015 0013 0015 0013 
0015 0013 0015 0013 0015 0013 0018 004a 0015 0013 0015 0013 0015 0013 
0018 004a 0015 0013 0015 0013 0015 0013 0015 0013 0018 004a 0018 004a 
0015 0013 0018 004a 0018 004a 0015 0013 0018 004a 0015 00c4

Aber leider verstehe ich die Logik nicht.

Grüsse

: Bearbeitet durch User
von Armin J. (arminj)


Lesenswert?

Hallo Boris,
da muss ich passen, da kann nur Frank helfen.
@Frank: Übernimmst Du?

von E. K. (eku)


Angehängte Dateien:

Lesenswert?

Hallo Frank,

ich schaffe es nicht, mit IRMP eine Thomson RC3000E02 einzulesen. Sowohl 
Thomson als RC80 und RC80EXT sind aktiviert. Ab und zu wird Ruwido 
ausgegeben, obwohl das Protokoll in IRMP nicht aktiviert ist. Ansonsten 
rein garnichts.

Scan mit 15kHz anbei. Danke vorab.

von E. K. (eku)


Lesenswert?

E. K. schrieb:
> ich schaffe es nicht, mit IRMP eine Thomson RC3000E02 einzulesen. Sowohl
> Thomson als RC80 und RC80EXT sind aktiviert.

Hätte ich ahnen können, dass Thomson das Matsushita-Protkoll für seine 
FB benutzt? Hat sich hiermit erledigt.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Hi eku,

sorry, bin bisher nicht dazu gekommen, mir Deine Scans anzuschauen.

E. K. schrieb:
> Hätte ich ahnen können, dass Thomson das Matsushita-Protkoll für seine
> FB benutzt?

Tja, die Wege sind manchmal sonderbar ;-)

> Hat sich hiermit erledigt.

Freut mich. Viel Spaß weiterhin.

von Jörg R. (jrie)


Angehängte Dateien:

Lesenswert?

Der angehängte Patch für IRMP fügt STM32F30x Support (für die SPL) 
hinzu.

von Vlad T. (vlad_tepesch)


Angehängte Dateien:

Lesenswert?

Hi Frank, ich hab mit der aktuellen SVN-Version probleme, sie unter 
Windows mit dem Visual Studio zu kompilieren:

1. Es ist eine Sonderbehandlung drin, die nicht mehr nötig sein sollte 
wegen der inttypes.h. In der Sonderbehandlung werden da nicht alle typen 
definiert, die auch benutzt werden
2. Hab ich Probleme mit IRMP_PACKED_STRUCT


Ich hab einen Patch angehangenen.

Außerdem wollte ich irmp als dll benutzen können
Deswegen habe ich ein paar funktionen hinzugefügt.
Für das Interface, was ich wollte, brauchte ich aber auch die nummer des 
Startsamples, weswegen ich oben auch noch was reinfummeln musste. kannst 
ja mal gucken, ob du das einbauen willst.

außerdem dafür einen c# wrapper

Grund war, dass ich es in den USBeeSuite CustomDecoder einbauen wollte.
Keine Ahnung, ob nochjemand dieses alte ding nutzt ^^.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Jörg R. schrieb:
> Der angehängte Patch für IRMP fügt STM32F30x Support (für die SPL)
> hinzu.

Danke für den Patch, kommt ins nächste Release.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Hi Vlad,

Vlad T. schrieb:

> 1. Es ist eine Sonderbehandlung drin, die nicht mehr nötig sein sollte
> wegen der inttypes.h. In der Sonderbehandlung werden da nicht alle typen
> definiert, die auch benutzt werden

Geht das unter Windows auch mit stdint.h? Das würde ich heute lieber 
nutzen statt inttypes.h. Damals, als ich mit IRMP begann, gab es in 
Windows weder inttypes.h noch stdint.h. Deshalb die typedefs.

> 2. Hab ich Probleme mit IRMP_PACKED_STRUCT

Habe den Patch übernommen.

> Ich hab einen Patch angehangenen.

Danke, der ist aber so unbrauchbar, da sich mittlerweile durch andere 
Patches die Zeilennummern geändert haben. Kannst Du da einen 
Context-Diff erstellen?

> Außerdem wollte ich irmp als dll benutzen können
> Deswegen habe ich ein paar funktionen hinzugefügt.

Kann ich gerne übernehmen. Was ist mit den dazugehörenden 
extern-Deklarationen für irmp.h? Hast Du da noch was?

Viele Grüße,

Frank

von Vlad T. (vlad_tepesch)


Lesenswert?

Frank M. schrieb:
> Damals, als ich mit IRMP begann, gab es in
> Windows weder inttypes.h noch stdint.h. Deshalb die typedefs.

in den neueren VS-Versionen sind die drin.
ja, die stdint.h geht auch, in dem Patch wird die ja sogar verwendet.
ich hab oben nur die Sonderbehandlung rausgeschmissen.

Frank M. schrieb:
> Danke, der ist aber so unbrauchbar, da sich mittlerweile durch andere
> Patches die Zeilennummern geändert haben. Kannst Du da einen
> Context-Diff erstellen?

Ich dachte, ich hätte extra nochmal die neueste Version aus dem SVN 
gezogen, aber kann ich machen. Das im Artikel verlinkte git wird 
übrigens nicht mehr synchronisiert.


Ich seh gerade, dass da aber auch noch was drin gelandet ist, was der 
editor von allein geändert hatte, wegen der Sonderzeichen. Die geben bei 
mir auch Warnungen, sowohl im GCC als auch MSC. Da passen irgendwie die 
ganzen Inputencodings nicht.

Frank M. schrieb:
> Kann ich gerne übernehmen. Was ist mit den dazugehörenden
> extern-Deklarationen für irmp.h? Hast Du da noch was?

Da ich die Files sowieso in c# und python einbinden wollte, die keine 
Header verstehen, haben mir die exportierten Symbole in der exe/dll 
gereicht. Man muss ja die declspec deklaration geignet setzen. Ich kann 
das sauberer einbauen, aber ich wusste nicht, ob du es überhaupt 
drinhaben willst, deswegen hab ich mir die Mühe erstmal gespart.

Hab aber schon noch weitere kleinere Änderungen. Nachdem ich jetzt doch 
endlich Sigrok/Pulseview mit meinem LogicAnalyser-Klon zum Laufen 
gebracht habe, bin ich gerade dabei die IRMP als Sigrok-Decoder da 
einzubauen.

Daher würde ich warten, bis das läuft und dann die notwendigen 
Änderungen nochmal zusammenfassen.


Ein Problem ergibt sich beim bauen der Lib mit dem gcc. dieser 
exportiert sämtliche non-static functions standardmäßig. Das heißt, dass 
auch die internen Funktionen von außen aufrufbar sind. deswegen hatte 
ich einen anderen Präfix gewählt 'IRMP_', um die Funktionen nicht zu 
verwechseln. Vielleicht auch eine komplett unabhängige Header-Datei für 
die DLL erstellen (name?)



Nebenbei:
Hättest du was dagegen Analyzer-Programm-Teil aus der irmp.c-Datei 
rauszuziehen?
Also alles nach  "main functions - for Unix/Linux + Windows only!"
Eventuell auch die internen protocol/parameter definitionen.
Ich glaub, das würde die Übersichtlichkeit und Navigierbarkeit etwas 
erhöhen.

Mein Vorschlag wäre:
irmp.h/c wie gehabt (nur ohne die erwähnten Anteile).
irmpprotocols_intern.h die parameter defines/structuren (bis ca Zeile 
3000, ohne logging)
irmp-main-PC.c enthält exklusiven PC-Code includiert irmp.c (ab zeile 
~5500)

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


Lesenswert?

Vlad T. schrieb:
> ja, die stdint.h geht auch, in dem Patch wird die ja sogar verwendet.

Dann passe ich das so an.

> Ich dachte, ich hätte extra nochmal die neueste Version aus dem SVN
> gezogen, aber kann ich machen.

Sorry, das ist aber nicht die neueste Version, die ich auf meinem 
Rechner habe ;-)

> Ich seh gerade, dass da aber auch noch was drin gelandet ist, was der
> editor von allein geändert hatte, wegen der Sonderzeichen.

Ist mir auch aufgefallen, das waren ISO8859-Zeichen, Dein Editor scheint 
im UTF-8-Format zu arbeiten. Macht aber nichts, ich habe nun alle 
8-Bit-Zeichen durch Hex-Werte ersetzt.

> Daher würde ich warten, bis das läuft und dann die notwendigen
> Änderungen nochmal zusammenfassen.

Alles klar.

> Ein Problem ergibt sich beim bauen der Lib mit dem gcc. dieser
> exportiert sämtliche non-static functions standardmäßig. Das heißt, dass
> auch die internen Funktionen von außen aufrufbar sind.

Welche sind das zum Beispiel? Eigentlich sollten alle internen 
Funktionen auch static sein.

> Nebenbei:
> Hättest du was dagegen Analyzer-Programm-Teil aus der irmp.c-Datei
> rauszuziehen?
> Also alles nach  "main functions - for Unix/Linux + Windows only!"

Ja, kann ich machen. Stört mich sowieso mittlerweile.

> Mein Vorschlag wäre:
> irmp.h/c wie gehabt (nur ohne die erwähnten Anteile).
> irmpprotocols_intern.h die parameter defines/structuren (bis ca Zeile
> 3000, ohne logging)
> irmp-main-PC.c enthält exklusiven PC-Code includiert irmp.c (ab zeile
> ~5500)

Ja, so ähnlich werde ich es wohl machen.

von Vlad T. (vlad_tepesch)


Lesenswert?

Frank M. schrieb:
> Welche sind das zum Beispiel? Eigentlich sollten alle internen
> Funktionen auch static sein.

Intern im Sinne von 'sollen nicht zum Interface der PC shared library 
gehören'. Zb die ISR

Frank M. schrieb:
> Ist mir auch aufgefallen, das waren ISO8859-Zeichen, Dein Editor scheint
> im UTF-8-Format zu arbeiten. Macht aber nichts, ich habe nun alle
> 8-Bit-Zeichen durch Hex-Werte ersetzt.

Ich hatte es auch versucht mir notepad++ nach ansi zu konvertieren, aber 
der GCC hatte trotzdem Warnungen ausgespuckt. Hatte das dann aber nicht 
weiter untersucht

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Vlad T. schrieb:
> aber der GCC hatte trotzdem Warnungen ausgespuckt.

Ja, dem GCC ist egal, in welchem Zeichensatz der Quelltext vorliegt. 
8-Bit-Zeichen sind ihm generell suspekt.

Ersetze einfach den Block durch folgendes:
1
    static uint8_t key_table[128] =
2
    {
3
     // 0     1      2    3    4     5    6    7    8     9     A     B     C     D     E     F
4
        0x00, '^',  '1', '2', '3',  '4', '5', '6', '7',  '8',  '9',  '0',  0xDF, 0xB4,  0x00, '\b',
5
        '\t', 'q',  'w', 'e', 'r',  't', 'z', 'u', 'i',  'o',  'p',  0xFC, '+',  0x00,  0x00, 'a',
6
        's',  'd',  'f', 'g', 'h',  'j', 'k', 'l', 0xF6, 0xE4, '#',  '\r', 0x00, '<',   'y',  'x',
7
        'c',  'v',  'b', 'n', 'm',  ',', '.', '-', 0x00, 0x00, 0x00, 0x00, 0x00,  ' ',  0x00, 0x00,
8
9
        0x00, 0xB0, '!', '"', 0xA7, '$', '%', '&', '/',  '(',  ')',  '=',  '?',  0x60,  0x00, '\b',
10
        '\t', 'Q',  'W', 'E', 'R',  'T', 'Z', 'U', 'I',  'O',  'P',  0xDC, '*',  0x00,  0x00, 'A',
11
        'S',  'D',  'F', 'G', 'H',  'J', 'K', 'L', 0xD6, 0xC4, '\'', '\r', 0x00, '>',   'Y',  'X',
12
        'C',  'V',  'B', 'N', 'M',  ';', ':', '_', 0x00, 0x00, 0x00, 0x00, 0x00, ' ',   0x00, 0x00
13
    };

Das ist dann reines 7-Bit.

: Bearbeitet durch Moderator
von Vlad T. (vlad_tepesch)



Lesenswert?

Vlad T. schrieb:
> Daher würde ich warten, bis das läuft und dann die notwendigen
> Änderungen nochmal zusammenfassen.

So, in Sigrok/Pulseview läufts (screenshot). Ich hab den Code für die 
DLL in eigene Dateien gezogen. Allerdings ist ein kleiner Patch (patch 
1) für die irmp.c trotzdem nötig.

Dem Compiler darf nur die irmp-main-SharedLib.c gegeben werden, da die 
irmp.c includiert wird.

Außerdem hab ich angehangen, was für die IRMP integration in Sigrok oder 
Pulseview nötig ist. Auch fertig gebaute dlls sind enthalten.


patch 2 fixt ein paar const issues.
Außerdem ist mir aufgefallen, dass an einigen stellen, Mikro und 
Milli-Sekunden durchander gebracht werden.
Bei den Timeout-defines und bei dieser Zeile:
1
   for (i = 0; i < (int) ((10000.0 * F_INTERRUPTS) / 10000); i++)               // newline: long pause of 10000 msec

Meiner meinung nach kommt da eine Sekunde raus, weile F_INTERUPTS genau 
einer Sekunde entspricht, was das komische rumgerechner überflüssig 
macht.

: Bearbeitet durch User
von Vlad T. (vlad_tepesch)


Angehängte Dateien:

Lesenswert?

hmpff - warum fällt einem sowas immer erst hinterher auf:
Hier eine korigierte Version des decoders, der in den höchsten 
zoomstufen auch die PRotokoll-Nummer anzeigt.

von Abraxa (Gast)


Lesenswert?

Hallo Vlad, wie du IRMP in libsigrokdecode eingebunden hast, zeugt von 
viel Willen, das zum Laufen zu bekommen. Hut ab! :)

Wir würden dir die Arbeit gerne einfacher machen, indem wir ctypes 
direkt bereitstellen und IRMP zusammen mit libsigrokdecode kompilieren. 
Somit würde IRMP dann Bestandteil von libsigrokdecode werden und die 
Benutzer müssten nichts weiter tun, um IRMP nutzen zu können. Hast du 
daran Interesse?

Falls ja würden wir uns freuen, wenn du uns bspw. in IRC besuchen 
würdest (Link auf sigrok.org), um das zu besprechen.

von Vlad T. (vlad_tepesch)


Lesenswert?

Abraxa schrieb:
> Somit würde IRMP dann Bestandteil von libsigrokdecode werden und die
> Benutzer müssten nichts weiter tun, um IRMP nutzen zu können. Hast du
> daran Interesse?

Davon würde ich aktuell abraten (dazu mehr weiter unten) Glaube auch, 
dass es nicht nötig ist.
Das Konzept mit den externen Dekodern ist ja an sich Recht hübsch. Da 
einzelne Dekoder mit einzukompilieren fühlt sich falsch an.
Das größte Problem, was ich beim einbinden hatte, war ja tatsächlich die 
fehlende ctypes DLL. Wenn das gelöst wäre, wäre es viel einfacher. 
(Andererseits entfällt natürlich dass erstellen der 
Plattformspezifischen irmp lib)

Zu dem anderen Problem:
Ich würde den aktuellen Stand der irmp nicht als so stabil betrachten, 
um ihn als festen Bestandteil auszuliefern. Nicht, weil die irmp buggy 
ist, sondern ihr Design ist aktuell nicht auf multithreading ausgelegt. 
Das kann auch die DLL oder der Python-Wrapper nicht ändern.

Hier könnte man Frank fragen, wie die weitere Planung für die irmp 
aussieht.
Er hatte geäußert, dass er selbst ein paar Restrukturierungen geplant 
hat. Danach könnte man schauen, ob man Den Zustand nicht vielleicht in 
einem Objekt, anstelle von globalen/statischen Variablen speichern kann 
(eventuell kriegt man das auch konfigurierbar hin, ohne den Code ins 
bodenlose mit ifdefs zuzupflastern)

Alternativ wäre natürlich ein branch denkbar.
Wenn möglich würde ich das allerdings vermeiden wollen.

von gsi (Gast)


Lesenswert?

[ Fuer die Eiligen: Find's gut, kein Blocker, bitte integrieren. :) ]

Dass IRMP im Kern nicht multithreading faehig ist sehe ich nicht als
Blocker an, fuer eine MCU Firmware ist das voellig normal und erwartbar.
Wenn daraus folgt dass man die DLL zusammen mit dem Decoder-Code nur
fuer exakt eine Decoder-Instanz zu jeweils einer Zeit einsetzen kann,
ist das eine Einschraenkung, die aber voellig in Ordnund sein kann (weil
bekannt und dokumentiert).  Vergleicht man das mit dem bisherigen 
Zustand
(nur wenige Decoder fuer Protokolle die "immer mehr aus der Mode kommen"
und keine(?) fuer aktuell gesprochene Protokolle), dann ist der Support
fuer viele und vor allem relevante Protokolle durch Einsatz von IRMP
eine klare Verbesserung und damit wuenschenswert.

Fuer die konkrete Anbindung von IRMP an sigrok sehe ich mehrere 
Varianten:
Die C-Library die IRMP "im Bauch" hat und statt Hardware-Timer und -Pin
ein API hat ueber das der PC die Daten anliefert.  Die Lizenz erlaubt
die Integration in und Auslieferung mit sigrok zusammen.  Den 
zusaetzlichen
Code mit libsigrokdecode zusammen zu uebersetzen muss auch machbar sein.

Ob's verrueckt klingt muss jeder fuer sich entscheiden.  Ich sehe noch
eine Alternative: IRMP auf der MCU laufen lassen wie bisher, ueber UART
ein Protokoll sprechen das: identifizieren laesst, unterstuetzte 
Protokolle
listet (Namen holen und cachen), Pin-Werte injiziert, Ergebnisse holt.
Dann kann der Python-Code in pd.py ueber das pyserial Modul mit der UART
sprechen, was plattform-unabhaengig ist.  Womit die C-Library auf dem PC
entfaellt, inclusive ctypes Wrapper, und Integration von IRMP-Code und
-Build in libsigrokdecode.  Man haette praktisch ein "Hardware-Dongle"
das sehr nahe am "traditionellen" Einsatz von IRMP auf MCUs ist, 
sozusagen
hardware-unterstuetztes Protokoll-Decoding. :)  Dass der COM-Port auch 
nur
einmal geoeffnet werden kann und damit nur eine Decoder-Instanz erlaubt,
ist keine Verschlechterung.  Siehe oben.

Meinungen?  Habe ich was uebersehen?

Die globalen Variablen im IRMP Kern in einen struct zu verschieben
und evtl mehrere Instanzen davon zu unterstuetzen (je nach Target,
also z.B. auch nur wenn fuer PC gebaut), sehe ich als unabhaengig
von oder zusaetzliche Moeglichkeit zur Integration mit sigrok an.  Je
nach Target kann das sogar eine Verbesserung sein die fuer MCU
wuenschenswert ist.  Fuer AVR macht es wohl weniger aus.  Fuer ARM
(Cortex-M3) koennte es ein wenig Performance und/oder reduzierten
Speicherverbrauch ergeben.  Ob der kosmetische Gewinn den Aufwand
wert ist -- Geschmackssache.  Fuer die Konfigurationen die mehrere
State-Instanzen unterstuetzen, muss man dann aber wohl die Referenz
darauf oder Index da rein ueberall durchreichen, was evtl keine
wuenschenswerte Aenderung am bestehenden Projekt ist, weil der
Einsatzzweck evtl zu obskur oder zu rar ist.

von Abraxa (Gast)


Lesenswert?

Hallo Vlad,

> Glaube auch, dass es nicht nötig ist.
Warum bist du dieser Meinung? Das ist mir leider nicht schlüssig.

> Da einzelne Dekoder mit einzukompilieren fühlt sich falsch an
Ob die Dekoder jetzt in python laufen oder in C ist für den Benutzer 
irrelevant und ctypes werden wir langfristig sowieso in Dekodern sehen, 
um noch ganz andere Features umsetzen zu können. Von daher wäre IRMP nur 
der Vorreiter :)

> ihr Design ist aktuell nicht auf multithreading ausgelegt
...dann erlaubt man eben nur eine Instanz des Dekoders, bis das gefixt 
ist. Das ist kein Problem.

von Vlad T. (vlad_tepesch)


Lesenswert?

Abraxa schrieb:
> ctypes werden wir langfristig sowieso in Dekodern sehen, um noch ganz
> andere Features umsetzen zu können. Von daher wäre IRMP nur der
> Vorreiter :)

Ctypes wird doch nur Verwendet, weil es in einer externen dynamischen 
lib ist. Wenn ihr das in Zukunft sowieso immer mitliefert, ist es nicht 
notwendig, wenn der komplette Decoder in der Decoder-lib als c(++) 
vorliegt, es sei denn der Python Decoder bleibt und zieht nur die irmp - 
Funktionen aus der Decoder-lib

gsi schrieb:
> Fuer die konkrete Anbindung von IRMP an sigrok sehe ich mehrere
> Varianten: Die C-Library die IRMP "im Bauch" hat und statt
> Hardware-Timer und -Pin ein API hat ueber das der PC die Daten anliefert

Genau so funktioniert es ja aktuell in meiner Lösung. Natürlich braucht 
man keine mcu.

gsi schrieb:
> Vergleicht man das mit dem bisherigen Zustand (nur wenige Decoder fuer
> Protokolle die "immer mehr aus der Mode kommen" und keine(?) fuer
> aktuell gesprochene Protokolle), dann ist der Support fuer viele und vor
> allem relevante Protokolle durch Einsatz von IRMP eine klare
> Verbesserung und damit wuenschenswert.

Jepp

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


Lesenswert?

Zur libsigrokdecode-Diskussion:

Leider bin ich nicht früher dazu gekommen, mich hier eingehend dazu zu 
äußern... ich habe bisher einfach keine Zeit dazu gefunden.

Der jetzige IRMP-Code ist zwar für verschiedenste Umgebungen bzw. 
Plattformen geeignet, jedoch sind die neueren Features (Protokolle und 
Zielplattformen) seit 2009 immer wieder angeflanscht worden. Mit der 
Zeit entstand daher ein Gebilde, was ich heute so nicht mehr erstellen 
würde, wenn ich mit allen inzwischen gesammelten Anforderungen nochmals 
von vorne beginnen würde.

Von daher könnte man die sigrok-Geschichte als Anlass nehmen, IRMP 
komplett neu zu machen - mit identischen Anforderungen/Interfaces wie 
beim bisherigen IRMP. Man könnte die neue Version zum Beispiel IRMP2 
nennen.

Was mir schon lange ein Dorn im Auge ist:

1. 16 Bit Members in IRMP-Struct. Diese würde ich gern auf 32 Bit 
erhöhen.
2. Die riesengroße ISR, welche on-the-fly decodiert.
3. Viele globale (Zustands-)Variablen, welche immer mehr wurden.
4. Große irmp.c

zu 1)

Manche Prokolle bieten mehr Informationen als nur 16 + 16 Bits für 
Adresse und Kommando. Es war zum Beispiel gar nicht so einfach, das 
Kaseikyo-Protokoll mit 48 Bits da rein zu quetschen. Nach Abzug der 
redundanten Infos wie zum Beispiel CRCs blieben immer noch 4 Bit übrig, 
die irgendwo unterebracht werden müssen. Diese landeten daher im oberen 
Nibble der flag-Variablen. Dieses Nibble wurde kurzerhand als zum 
Kommando gehörendes Teilpaket erklärt, so dass hier dann 20 Bit fürs 
Kommando möglich waren. Eine Anpassung an IRSND sorgte dann auch dafür, 
dass diese 4 Bits (die meist 0 sind) auch wieder gesendet werden 
konnten.

Dann gibts da zum Beispiel auch noch das Merlin-Protokoll, welches in 
der Anzahl der möglichen Bits variabel ist und auf bis zu 32 Bits fürs 
Kommando anschwellen kann. Hier wurde die IRMP-Struct per 
Preprocessor-Define einfach auf 32 Bit  Werte aufgebohrt, sobald man 
Merlin decodieren wollte. Als Nachteil hat sich jetzt im nachhinein 
herausgestellt, dass zumindest die AVRs bei 32-Bit-Variablen innerhalb 
der ISR ins Schleudern kommen. Sobald man als Merlin als Protokoll 
hinzunimmt, kann es passieren, dass der Decoder dann überhaupt nicht 
mehr läuft - egal für welches Protokoll.

zu 2)

Die Größe der ISR ist erstmal nicht das Problem für den µC. Durch die 
Zustandsvariablen verbleibt der µC nur kurze Zeit in der ISR, weil immer 
nur ein kleiner Teil durchlaufen wird. Damit kann IRMP das 
identifizierte Protokoll schon inmerhalb der ISR on-the-fly decodieren. 
ohne Zeitprobleme zu bekommen.

Allerdings hat sich ein anderer Nachteil im Laufe der Zeit 
herausgestellt:

Es gibt nämlich Protokolle, die zueinander so ähnlich sind, dass sie in 
der ISR parallel decodiert werden müssen. Das macht IRMP nämlich 
zumindest bei einigen Protokollen so: Gibt es mehrere Möglichkeiten für 
ein Protokoll, verfährt IRMP parallel, bis eines der in Frage kommenden 
Protokolle verworfen werden kann. Das wird dann rausgekickt und dann nur 
noch der andere Zweig verfolgt. Ebenso kann IRMP über 
Plausibilitätsregeln (frühzeitiges Timout o.ä.) zwischen verschiedenen 
Protokollen dynamisch hin- und herschalten, bis am Ende nur noch eines 
übrig bleibt.

Im Laufe der Zeit sind aber so viele Protokolle hinzugekommen, dass 
diese Parallelverarbeitung immer komplizierter wird. Daher habe ich mich 
irgendwann dafür entschlossen, bei Verwendung von ganz bestimmten 
Protokoll-Kombinationen Teile von Protokollen per Preprocessor während 
der Compilezeit aus dem Code zu werfen: Man bekommt dann eine Warnung, 
dass wenn man X + Y verwenden will, das Protokoll Y ausgeschlossen wird.

Letzteres ist ein erheblicher Qualitätsverlust. Daher schwebt mir 
mittlerweile ein anderes Verfahren vor:

a) In der ISR wird der empfangene Frame nur noch aufgezeichnet 
("Recording") und möglichst kompakt gespeichert.

b) Außerhalb der ISR wird dann der aufgezeichnete Frame analysiert und 
decodiert. Das hat den Vorteil, dass man alle möglichen Protokolle 
nacheinander gemütlich durchgehen kann. Stress wegen 
Parallelverarbeitung entfällt dann.

Letzteres ist ein wesentlicher Vorteil, den man sich jedoch eventuell 
mit erhöhtem Speicherbedarf erkauft. Ich denke hier an den knappen RAM 
von ATTinys. Man gewinnt jedoch auch Speicher, weil dann viele der 
jetzigen Zustandsvariablen entfallen.

Ein weiterer Gewinn: Wenn sich die ISR auf Recording beschränkt, ist die 
Verwendung von 32-Bit-Variablen für Adresse und Kommando auch für AVRs 
kein Hindernis mehr. Auf diese wird dann nur noch außerhalb der ISR 
zugegriffen.

Zu 3)

Viele der Zustandsvariablen können entfallen, wenn Recording und 
Decoding zwei getrennt Vorgänge sind.

zu 4)

Das Decoding kann dann außerhalb der ISR auch außerhalb von irmp.c 
geschehen. Hier könnten zuminfdest die verschiedenen Kodierungen wie 
Pulse Distance, Pulse Width, Biphase (Manchester), usw. in einzelne 
C-Module wandern.

Im Zuge dessen könnte man den ganzen Code auch weiter modularisieren, 
d.h. in weitere C-Module aufsplitten.

Fazit:

Ich halte es für sinnvoll, IRMP neu zu machen. Dann aber nicht als 
One-Man-Show, sondern eher als Team-Projekt. Mit dem ganzen Wissen der 
letzten 10 Jahre dürfte ein Redesign nicht so lange dauern. Schließlich 
existiert ja ein Source, der lediglich neu strukturiert werden muss.

: Bearbeitet durch Moderator
von Joachim B. (jar)


Lesenswert?

Frank M. schrieb:
> Die Größe der ISR ist erstmal nicht das Problem. Durch die
> Zustandsvariablen verbleibt der µC nur kurze Zeit in der ISR, weil immer
> nur ein kleiner Teil durchlaufen wird. Damit kann IRMP das
> identifizierte Protokoll schon inmerhalb der ISR on-the-fly decodieren.
> ohne Zeitprobleme zu bekommen.

das hatte mir IMMER am Besten gefallen, damit hatte ich Tastenauswertung 
und IR Code zusammen fertig im loop und war in der Abarbeitung 
zeitunabhängig.

Klar verstehe ich deine Ausführungen, kann mir nur noch nicht vorstellen 
wie das läuft da innerhalb meiner loop die Zeiten ja variabel sind, je 
nach dem was anliegt!
Ich müsste noch mehr in Richtung state machine denken.

aber schaun mer mal....

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Joachim B. schrieb:
> das hatte mir IMMER am Besten gefallen, damit hatte ich Tastenauswertung
> und IR Code zusammen fertig im loop und war in der Abarbeitung
> zeitunabhängig.

Für Dich als Anwender würde sich gar nichts ändern.

Im Moment ist es so - stark vereinfacht:

A. ISR:

1. ISR prüft Start-Bit und legt sich auf Protokoll fest
2. ISR decodiert die Bits und füllt Adresse + Kommando
3. Wenn fertig, wird ein Flag gesetzt

B: irmp_get_data ()

1. Es wird geprüft, ob Flag von ISR gesetzt
2. Wenn nein, zurück mit FALSE
3. Wenn ja, werden Adresse + Kommando auf Plausibilität geprüft
4. Adresse + Kommando werden nach IRMP-Struct kopiert
5. Zurück mit TRUE

Zukünftig ginge das so:

A. ISR:

1. ISR füllt Recording-Buffer
2. ISR setzt Flag, wenn kein Pegelwechsel innerhalb von einem zu
   definierendem Timeout.

B: irmp_get_data ()

1. Es wird geprüft, ob Flag von ISR gesetzt
2. Wenn nein, zurück mit FALSE
3. Wenn ja, werden alle durch Start-Bit validierten Protokolle
   durchprobiert - nacheinander
4. Wenn Protokoll valide, werden die Zeiten im Recording-Buffer
   decodiert und als Adresse + Kommando in IRMP-Struct abgelegt
5. Zurück mit TRUE

Es wird also nur ein wenig Arbeit von der ISR in die Funktion 
irmp_get_data() verlagert.

Vorteile:

- Es entfallen jede Menge Zustandsvariablen.
- Der ISR-Code vereinfacht sich erheblich.
- Der Recording-Buffer kann auch direkt für IRMP_LOGGING genutzt werden.
- Es können 32-Bit-Members in der Struct verwendet werden.
- Es können alle Protokolle durchgetestet werden, d.h. es gibt
  keine Ausschlüsse von Protokollen mehr.
- Der Code für das Decoding von Manchester und den anderen
  Kodierungstypen kann getrennt werden, da komplett verschieden.
- Es können viele Teile des Codes in der ISR mehr modularisiert werden,
  weil diese nach irmp_get_data verschoben werden.
- Da die ISR sich nur noch auf das Recording beschränkt, wird die
  Durchlaufzeit noch weiter verkürzt. Dadurch wird das ganze System
  "echtzeitfähiger", da weniger Zeit in der ISR verweilt wird.

Nachteile:
- irmp_get_data() hat etwas mehr zu tun und braucht etwas länger,
  aber unmerklich. Vielleicht 1-2 msec auf AVR.
- Durch die Timeout-Erkennung in der ISR ergibt sich eine weitere
  Verzögerung.
- Eventuell etwas mehr RAM-Bedarf wegen Recording-Buffer.

Diskussion:

Der Mehrbedarf an RAM für den Recording-Buffer wird durch den Wegfall 
von vielen Zustandsvariablen teilweise kompensiert. Aufgabe ist hier, 
für den Recordingbuffer eine möglichst platzsparende Datenstruktur zu 
finden.

Da die ISR nun "dumm" ist und nichts mehr über IR-Protokolle weiss, muss 
das Ende eines empfangenen Frames über eine Timeout-Behandlung gemacht 
werden. Es gilt hier, diesen Timeout möglichst gering zu halten, damit 
die Verzögerung, wann irmp_get_data() mit der Decodierung loslegen kann, 
minimal ist. Dank den vielen gesammelten Daten der User (abgelegt im 
Verzeichnis IR-Data) kann man da aber schnell Erfahrungen sammeln und 
optimieren.

: Bearbeitet durch Moderator
von Jörg R. (jrie)


Lesenswert?

Würden dann auch Protokolle gehen, die jetzt nicht möglich sind, z.B. 
IMON?
Siehe 
Beitrag "Re: IRMP - Infrared Multi Protocol Decoder"

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Jörg R. schrieb:
> Würden dann auch Protokolle gehen, die jetzt nicht möglich sind, z.B.
> IMON?

Ja, das sollte damit wesentlich einfacher zu machen sein.

von Vlad T. (vlad_tepesch)


Lesenswert?

Frank M. schrieb:
> Jörg R. schrieb:
> Würden dann auch Protokolle gehen, die jetzt nicht möglich sind, z.B.
> IMON?
>
> Ja, das sollte damit wesentlich einfacher zu machen sein.

Wird nicht nicht aktuell schon eine Tastatur unterstützt, die auch quasi 
UART über IR ist?

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Vlad T. schrieb:
> Wird nicht nicht aktuell schon eine Tastatur unterstützt, die auch quasi
> UART über IR ist?

Ja, meine ich mich auch zu erinnern - aber nicht mit 38 Bit ;-)

von 900ss (900ss)


Lesenswert?

Frank M. schrieb:
> - Durch die Timeout-Erkennung in der ISR ergibt sich eine weitere
>   Verzögerung.

Wie lang müsste der timeout denn sein? Hab mich mit den Protokollen nie 
beschäftigt.

Wenn man nur ein Protokoll aktiviert, dann könnte man diese Zeit sehr 
kurz halten, da ja der Frame mit der Dauer bekannt ist. Als Option 
vielleicht?

: Bearbeitet durch User
von 900ss (900ss)


Lesenswert?

Ich habe noch einen Vorschlag damit man IRMP leichter unter Linux 
verwenden könnte. Dort sind die Jitter der IRQs ja "recht groß" wenn man 
nicht im Kernel einen low Level Treiber baut.
Eine Option einbauen, die es erlaubt die Zeit aus einem Timer auszulesen 
anstatt die IRQ Frequenz als Zeitbasis zu nutzen. Damit darf die IRQ in 
gewissem Rahmen jittern und trotzdem könnte man die Zeit genau 
ermitteln.

Theoretisch könnte man dann die IRQ sogar wegfallen lassen und diese 
Funktion in einer sehr schnellen main-Loop aufrufen.

: Bearbeitet durch User
von Vlad T. (vlad_tepesch)


Lesenswert?

900ss D. schrieb:
> Ich habe noch einen Vorschlag damit man IRMP leichter unter Linux
> verwenden könnte. Dort sind die Jitter der IRQs ja "recht groß" wenn man
> nicht im Kernel einen low Level Treiber baut. Eine Option einbauen, die
> es erlaubt die Zeit aus einem Timer auszulesen anstatt die IRQ Frequenz
> als Zeitbasis zu nutzen. Damit darf die IRQ in gewissem Rahmen jittern
> und trotzdem könnte man die Zeit genau ermitteln.
>
> Theoretisch könnte man dann die IRQ sogar wegfallen lassen und diese
> Funktion in einer sehr schnellen main-Loop aufrufen.

Löst das wirklich das Problem? Zum einen braucht man hochgenaue 
Zeitstempel (Auflösung im 10μs Bereich - klassischer Weise kriegt man ja 
aber nur ms) und zum anderen weiß man dann nur, um wieviel man daneben 
liegt. Den Messwert zum eigentlich gewollten Zeitpunkt kriegt man auch 
nicht.


Gibt es unter Linux so eine Zeitbasis? Ich weiß, dass Qt eine Klasse zur 
Zeitmessung anbietet, und ich meine mich aus der Doku zu erinnern, dass 
die hochpräzise Messung mit unter Windows funktioniert. Da die Leute 
Ahnung von plattformunabhängigen Implementierungen haben, gehe ich davon 
aus, dass sie das implementiert hätten.

von 900ss (900ss)


Lesenswert?

Vlad T. schrieb:
> Gibt es unter Linux so eine Zeitbasis?

Du bekommst die absolute Zeit in Nanosekunden.
Damit hast du dann genau die Differenz zum vorherigen Ereignis.

Der Implementierungsaufwand für meinen Vorschlag dürfte sich auch sehr 
in Grenzen halten.

von gsi (Gast)


Lesenswert?

[ schnelles Fazit: Linux ist out of the box nicht echtzeitfaehig ]

Hab's nicht gemessen, ist eher ein Bauchgefuehl, aber:  Ich vermute
dass IRMP auf Linux weniger stabil funktionieren wuerde, wenn's im
User Space rennt (also nicht im Kernel in einem Treiber implementiert
ist).  Weil ein SoC keine MCU ist, und ein Desktop-OS kein RTOS.  Diese
Aussage bezieht sich ausdruecklich auf den Aufbau mit angeschlossener
Hardware, nicht die reine Software-"Simulation".

Mag sein dass man Zeitstempel kriegt die eine extrem hohe Aufloesung
suggerieren (besagte Nanosekunden).  Fraglich ist ob die entsprechende
Praezision auch gegeben waere und was die Granularitaet waere (hoch
aufloesen zu koennen aber selten und dann unscharf zu schedulen kann
ein Blocker sein).  Und egal ob man zuerst den Zeitstempel abgreift
und dann den aktuellen Level am Pin, oder umgekehrt: Dazwischen
kann beliebig viel Zeit vergehen und die Daten muessen nicht zu einander
passen.  Dem OS steht es frei dazwischen beliebige andere Aktivitaeten
auszufuehren.  Weiss nicht sicher ob der IRMP Kern gerne "aequidistante"
Samples haette, oder mit burst-artig angelieferten Daten beliebigen
Timings umgehen kann.  Aber ich waere nicht ueberrascht wenn so ein
Aufbau (Applikation im User Space die versucht Pins zu samplen und ein
IR Protokoll darin zu erkennen) nur zufaellig funktionieren wuerde, und
sporadische Fehler liefern bis wenig robust/zuverlaessig sein wuerde,
und dabei extrem schwer zu diagnostizieren weil das Verhalten sehr
individuell fuer verschiedene Maschinen sein wird.

Was sicher gut funktionert ist, die Pin-Werte per API in den Kern zu
liefern und dabei ein festes Timing anzunehmen.  So wie's der oben
diskutierte Ansatz des sigrok Decoders tut.  Darueber hinaus haette
ich aus den genannten Gruenden Bedenken.

Der richtige Ansatz unter Linux und Einbeziehung von Hardware waere
den Kernel um einen entsprechenden Treiber zu erweitern.  Da gibt es
schon einige, siehe drivers/media/pci/, drivers/media/rc/,
drivers/media/hid/, usw.  LIRC ist da und unterstuetzt aktuell
27 Protokolle soweit ich das sehe.  Andere Devices (spezielle Dongles
und IP Cores) werden auch unterstuetzt.  Im Zweifelsfall kann man
nach "infrared" unterhalb von Documentation/ oder drivers/ suchen,
sollte nur ein paar Dutzend bis wenige Hundert Treffer geben.

Uebrigens:  Selbst "ISR" sind im Linux-Kernel "kleine Tasks", die
scheduled werden und sich gegenseitig unterbrechen oder blockieren
koennen.  IRQ-Raten um die 100k/s fressen CPUs auf oder machen sie
tot (je nachdem wie viel man darin rechnet), mehrere 10k/s sind
je nach Maschine und Konfiguration gerade noch akzeptabel, oder schon
schmerzhaft bis grenzwertig, oder absolut nicht mehr ertraeglich.
Es hat seinen Grund warum manche Tasks besser in einem RTOS oder
bare metal auf einer MCU laufen. :)  Desktop-Systeme sind auf
Durchsatz getrimmt, was der genau vorher bestimmbaren Abarbeitung
im Weg steht und umgekehrt.  Man kann nicht beides gleichzeitig haben.

Wer's nicht glaubt, oder selbst sehen will:  Ausprobieren. :-]  Eine
Task schreiben die die ganze Zeit nichts anderes tut als an einem
Pin zu wackeln.  Und dann zusehen wie und ob der Takt gehalten wird.
Oder wie viele Denkpausen von welcher Laenge zu beobachten sind.  Ich
rate mal, und behaupte dass auch ein "unbeschaeftigter" Desktop-Rechner
nicht wie ein klassischer Microcontroller tickt.  Stabile Funktion
waere Zufall oder erfordert extra Klimmzuege.  Wenn's nur um zehn bis
hundert Zyklen je Sekunde geht und Aussetzer nichts machen, mag's gehen.
Wenn's wie bei IRMP um 20kHz Rate geht und nichts verpasst oder
verschliffen werden darf, koennte es ein Blocker sein.

von Stephan L. (kiffie)


Lesenswert?

Hallo Frank,

habe Anpassungen am Code gemacht, damit IRMP gut mit PIC32 tut, und zwar 
mit der PIC XC32 bzw ChipKIT toolchain. Hast du Interesse daran, das zu 
integrieren? Wäre auch bereit, ein Beispielprogramm, etwa 
irmp-main-pic32.c, zu schreiben.

Hier ein Link auf die Änderungen: 
https://github.com/kiffie/usb-spdif/commit/cb874246821425b9427c355e9f4f337935739dd3#diff-dd9e82c9e77c9de4a991b9b94f37ecec

Sind eigentlich nur ein paar wenige Zeilen.

Auf jeden Fall finde ich die IRMP lib super praktisch, weil man damit 
einfach sehr viele Fernbedienungsprotokolle unterstützen kann.

Viele Grüße

Stephan

von technikus (Gast)


Lesenswert?

Hallo Forum, Hallo ukw,

danke für das hervorragende Projekt!
Ich möchte gerne IRMP und IRSND für Apple Remotes in einem gemeinsamen 
Projekt nutzen.
Jetzt bin ich verwirrt. IRMP erkennt die Apple Remote. IRSND kann die 
angelernten Kommandos aber nicht übertragen.

Alle anderen Fernbedienungen die ich hier habe können empfangen und die 
empfangenen Daten können gesendet werden.

Laut Artikel IRSND Apple.

Hat jemand einen Ansatz wonach ich suchen könnte?

Danke
technikus

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Stephan L. schrieb:
> habe Anpassungen am Code gemacht, damit IRMP gut mit PIC32 tut, und zwar
> mit der PIC XC32 bzw ChipKIT toolchain. Hast du Interesse daran, das zu
> integrieren?

Vielen Dank, das übernehme ich.

> Wäre auch bereit, ein Beispielprogramm, etwa
> irmp-main-pic32.c, zu schreiben.

Sehr gern, würde mich freuen.

Gruß,

Frank

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

technikus schrieb:
> IRSND kann die angelernten Kommandos aber nicht übertragen.

Kannst Du die mit IRSND ausgesandten Codes denn mit IRMP wieder 
empfangen?

Zeige bitte einen Ausschnitt aus Deinem Source, mit welchen Codes Du den 
IRSND fütterst. Dann kann ich mir das ausgesandte Ergebnis im Simulator 
anschauen.

von technikus (Gast)


Lesenswert?

Hi,

ich empfange mit IRMP
z.B. Protokoll=11, Add=67, Cmd=10;

Das jage ich mit IRSND wieder raus.


Lernen
1
if (irmp_get_data(&irmpData))
2
{
3
if (!(irmpData.flags & IRMP_FLAG_REPETITION))
4
{
5
  System->irParameter.irmp[IRDATA_KEY1].protocol = irmpData.protocol;
6
  System->irParameter.irmp[IRDATA_KEY1].address = irmpData.address;
7
  System->irParameter.irmp[IRDATA_KEY1].command = irmpData.command;
8
  //nur die oberen 4 Bit speichern, da die unteren 4 Bit für diverse Flags reserviert sind
9
  System->irParameter.irmp[IRDATA_KEY1].flags = (irmpData.flags & 0xF0); 
10
          
11
  System-_LedBlink(1);
12
        
13
}
14
}



Senden
1
 irmpData.protocol = System->irParameter.irmp[IRDATA_KEY1].protocol;
2
 irmpData.address = System->irParameter.irmp[IRDATA_KEY1].address;
3
 irmpData.command = System->irParameter.irmp[IRDATA_KEY1].command;     
4
 irmpData.flags = RepVal;
5
      
6
 irsnd_send_data(&irmpData, 1);

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

technikus schrieb:
> ich empfange mit IRMP z.B. Protokoll=11, Add=67, Cmd=10;

Ich habe es gerade getestet und wohl den Fehler gefunden. IRSND sendet 
mit kontanter Apple-ID 0x8B (ergibt Adresse 0xD1) und ignoriert daher 
die von Dir übergebene Adresse 67. Das schien für alle mir übersandten 
Apple-Scans bisher zu stimmen.

Korrigiere bitte in irsnd.c die folgende Zeile:
1
irsnd_buffer[3] = 0x8B;
und ersetze sie durch
1
irsnd_buffer[3] = (command & 0x00FF);
(Ja, die Adresse landet hier im unteren Byte von command, das ist dem 
gemeinsamen Code von NEC und APPLE geschuldet)

Bitte sag dann Bescheid, ob es geklappt hat.

P.S.
Ausgabe im Simulator vor der Korrektur:
1
./irsnd-15kHz 11 67 10 | ./irmp-15kHz
2
01110111111000010000100010001011 p=11 (APPLE), a=0x00d1, c=0x0010, f=0x00
Die hier ermittelte Adresse 0x00d1 ist falsch.

Ausgabe im Simulator nach der Korrektur:
1
./irsnd-15kHz 11 67 10 | ./irmp-15kHz
2
01110111111000010000100011100110 p=11 (APPLE), a=0x0067, c=0x0010, f=0x00
Die hier ermittelte Adresse 0x0067 ist korrekt.

: Bearbeitet durch Moderator
von technikus (Gast)


Lesenswert?

Danke!!!

Wo in irsnd die Zeile?

von technikus (Gast)


Lesenswert?

Wenn ich mit IRSND gesendet hatte, habe ich mit IRMP auch sauber 
empfangen können.

Ich habe die Zeile gefunden und werde es nachstellen.
Leider komme ich erst nächste Woche wieder an die Hardware, gebe aber 
sofort Rückmeldung.

Danke vorab

von technikus (Gast)


Lesenswert?

Feedback: Positiv Getestet.
Die Änderung kannst du also übernehmen.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Prima. Danke für die Rückmeldung.

von gsi (Gast)


Lesenswert?

[ Zusammenfassung: plane submission fuer sigrok, brauche Feedback ]

Habe mir endlich mal die Zeit genommen und was fuer libsigrokdecode
vorbereitet, um IRMP basiertes Dekodieren von IR in mainline zu 
bekommen.
Dabei gab es einige Stolpersteine.

Der https://www.mikrocontroller.net/articles/IRMP#Download Abschnitt
hat nicht gut funktioniert. Koennt Ihr bitte die Links einem Update
unterziehen? Das Subversion Repo kann man nur ansehen aber keine
Sandbox davon ziehen. Der git Mirror wird schon laenger nicht mehr
gespiegelt. Ein funktionierendes VCS Repo ist dem Download von ZIP
Archiven oder gar von Attachments in langen Forums-Threads vorzuziehen.
Wenn man externe Quellen weiter verfolgen und Updates einpflegen will,
ist Filetransfer einfach unguenstig.

Habe jetzt svn://mikrocontroller.net/irmp r191 als Basis verwendet. Wenn
ein anderes Repo besser geeignet ist und stattdessen verwendet werden
sollte, gebt bitte bescheid.

Auf diese r191 Version habe ich dann C und Python Anteile von Vlad drauf
gesetzt.  Start- und Ende-Marker, DLL-Verpackung, Python binding, und
sigrok Decoder.  Dieser Aufbau liefert gute Ergebnisse unter Linux, ein
Test mit Windows und Mac steht noch aus.

Am liebsten wuerde ich Euch angemessene Credits geben ("attribution"),
nur ist das schwer mit den bisher verwendeten Pseudonymen und ohne
Adressen, wie sie in git commits ueblich sind.  Bitte sagt ob und wie
Ihr genannt werden wollt, schliesslich habt Ihr die Arbeit geleistet.

Ich muss hier noch was aufraeumen, plane naechste Woche zu pushen (in
mein privates Repo, von wo aus andere sichten und testen koennen, bevor
es entweder weitere Runden mit Verbesserungen gibt, oder ins sigrok
Projekt eingeht).

von Jörg R. (jrie)


Lesenswert?


von Vlad T. (vlad_tepesch)


Lesenswert?

gsi schrieb:
> Habe mir endlich mal die Zeit genommen und was fuer libsigrokdecode
> vorbereitet, um IRMP basiertes Dekodieren von IR in mainline zu
> bekommen. Dabei gab es einige Stolpersteine

Was ist denn mit meinem pullrequest?
Da hatte ich auch alles noch Mal schön geordnet.

von gsi (Gast)


Lesenswert?

Vlad T. schrieb:
> Was ist denn mit meinem pullrequest?
> Da hatte ich auch alles noch Mal schön geordnet.

Kurz? Ist in der Form nicht im sigrok Projekt verwendbar. Gibt zwar fuer 
den Moment einen Satz von Code. Ist aber in der anschliessenden Wartung 
nicht mehr handhabbar. Wird verrotten wenn's nicht weiter gepflegt wird, 
ist aber unnoetig aufwaendig in der Wartung. Weshalb ich versuche zu 
helfen, und die verbleibende Arbeit noch zu machen, so dass das 
wuenschenswerte Feature integriert und den Nutzern verfuegbar gemacht 
werden kann. Ich glaube immer noch dass daran nichts Schlimmes ist.

Tip: Gib niemals Referenzen an, lass andere suchen. Macht mehr Spass.
https://github.com/sigrokproject/libsigrokdecode/pull/27
https://github.com/vladtepesch/libsigrokdecode 70038ea8803b

Stell Dir einfach vor ich wuerde nicht aus Langeweile fragen, sondern 
wuerde mir wirklich eine Antwort wuenschen, um danach mit der erhaltenen 
Information weiter zu arbeiten. Ist das so schwer zu glauben? Also noch 
ein Versuch, bei Desinteresse kann ich's auch gerne lassen und meine 
Zeit mit anderen Arbeiten verbringen.

Wo kann man die IRMP Version herkriegen, die als die Hauptversion 
gilt? In der die Entwicklung stattfindet, von der andere Varianten 
hergeleitet sind, in die externe Entwicklung wieder zurueck uebernommen 
wird. Von der man sich kuenftig Updates holt. Der Download Abschnitt in 
der IRMP Projektseite liefert diese Information leider nicht. Welche 
Version verwendet man von dort am sinnvollsten (falls es Branches oder 
Release-Tags oder aehnliches gibt). Wem soll man fuer die Anbindung an 
sigrok danken? Einer Figur aus der Literatur mit einer noreply Adresse? 
Oder einer realen Person, oder niemandem? Mir egal wie die Antwort 
heisst, aber antworte bitte damit ich's wissen kann.

Hier ist was ich aus Deiner Vorlage gemacht habe. Mangels Information 
habe ich halt raten muessen. Gib Bescheid wenn was falsch ist. Danke! 
(Zum Schmoekern empfehle ich die 'commitdiff' Links.) Test mit Mac und 
Windows steht immer noch aus.

https://repo.or.cz/libsigrokdecode/gsi.git/shortlog/refs/heads/wip/irmp-pd-v2

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

gsi schrieb:
> Wo kann man die IRMP Version herkriegen, die als die Hauptversion gilt?

svn://mikrocontroller.net/irmp

Tarball: http://www.mikrocontroller.net/svnbrowser/irmp/?view=tar

von Vlad T. (vlad_tepesch)


Lesenswert?

Ich bin etwas verwirrt und ehrlich gesagt auch ein wenig angepisst.
Wir haben nen halben Abend im IRC darüber geschrieben, wie es erstmal 
integriert werden könnte, und wie ich euch dabei unterstützen kann.

Fazit war eine aufs nötige reduzierte IRMP-Version.

gsi schrieb:
> Kurz? Ist in der Form nicht im sigrok Projekt verwendbar. Gibt zwar fuer
> den Moment einen Satz von Code. Ist aber in der anschliessenden Wartung
> nicht mehr handhabbar. Wird verrotten wenn's nicht weiter gepflegt wird,
> ist aber unnoetig aufwaendig in der Wartung.

Wie wir bereits eigentlich besprochen hatte, ist der Code ja auch 
erstmal als Brücke gedacht, solange, bis eine redesignte IRMP verfügbar 
ist. Für diesen Zweck ist der Code alte IRMP-Code ausreichend stabil. 
Wie von euch gewünscht, hab ich die für die Integration nicht benötigten 
Teile auch grob entfernt.

gsi schrieb:
> Tip: Gib niemals Referenzen an, lass andere suchen. Macht mehr Spass.

Dass ich nen PR gegen das github repo stelle, hattet ihr euch explizit 
gewünscht und war doch auch abgesprochen. Soviele offene sinds ja auch 
nicht. Das nen Monat nix passiert ist, hat mich nochnicht mal gestört, 
aber das es quasi ignoriert wird und neu nachgefragt wird, finde ich 
etwas unhöflich.

gsi schrieb:
> Wo kann man die IRMP Version herkriegen, die als die Hauptversion
> gilt?

auch diese Frage wurde schon mehrmals beantwortet. Sowohl hatte ich sie 
euch im IRC chat beantwortet, als auch hat Frank sie hier bereits 
beantwortet.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Vlad T. schrieb:
> Ich bin etwas verwirrt und ehrlich gesagt auch ein wenig angepisst.

Kann ich verstehen.

Was ist mit dem geplanten github-Repo als zukünftige Hauptquelle? 
Erstmal auf Eis legen?

von Vlad T. (vlad_tepesch)


Lesenswert?

Frank M. schrieb:
> Was ist mit dem geplanten github-Repo als zukünftige Hauptquelle?
> Erstmal auf Eis legen?

wie du bestimmt gesehen hast, hatte ich angefangen ein wenig den Code 
aufzuteilen. allzuviel  hab ich aber tatsächlich noch nicht gemacht. In 
den letzten Wochen ist der Drive nach der Arbeit zu Coden nicht so 
stark.

Daher dauert es bis dahin noch ein weilchen, denke ich.

Eine Frage, die ich Dir noch stellen wollte:
pflegst du eine Exceltabelle mit den ganzen Konstanten der 
unterschiedlichen Protokolle oder so? Falls nicht erstelle ich 
vielleicht mal eine.
Wollte versuchen damit mal ein wenig experimentieren.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Vlad T. schrieb:
> pflegst du eine Exceltabelle mit den ganzen Konstanten der
> unterschiedlichen Protokolle oder so?

Nein. Ich pflege da nur die irmpprotocols.h ;-)

Außerdem findet man die Konstanten im IRMP-Artikel unter 
IRMP: Die IR-Protokolle im Detail

von gsi (Gast)


Lesenswert?

Kann ich ein ACK oder NAK bekommen zu dem Branch den ich angelegt habe, 
so dass IRMP basiertes Dekodieren in das sigrok Projekt integriert 
werden kann? Wie oben erwaehnt zeigen die 'commitdiff' Links die am 
besten lesbare Form, die ich empfehlen kann um zu sehen was passiert 
(und warum jenseits vom pull request noch Arbeit uebrig war die auch 
noch getan werden muss).

Basis:
https://github.com/sigrokproject/libsigrokdecode/pull/27

aufbereitet:
https://repo.or.cz/libsigrokdecode/gsi.git/shortlog/refs/heads/wip/irmp-pd-v2

Sind die Angaben korrekt? Falls nicht, wie waere es richtig? Bei 
Ausbleiben von Antworten muss ich zurueckdrehen dort wo ich geraten 
habe, und auf die bisher verfuegbare duerftige Information zurueck 
fallen weil nichts Besseres zu kriegen war. Was ich schade faende.

Waere schoen den Vorgang vom Tisch zu kriegen. Zum Vorteil der Nutzer 
beider Projekte. Danke fuer Eure Muehe beim Sichten.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

gsi schrieb:
> Bei Ausbleiben von Antworten muss ich zurueckdrehen dort wo ich geraten
> habe,

Ich hoffe, Du lässt mir auch zwei Wochen Zeit, mir das anzuschauen. IRMP 
ist ein Privatprojekt für mich, da kann ich nicht täglich reinschauen.

Und Druck kann ich bei Privatprojekten überhaupt nicht leiden.

von Vlad T. (vlad_tepesch)


Lesenswert?

gsi schrieb:
> Kann ich ein ACK oder NAK bekommen zu dem Branch den ich angelegt habe,

Ich bin mir nicht sicher, was du erwartest.
Wofür brauchst du das ACK? BzW welche Informationen?

In der ersten Datei, in die ich geschaut habe, ist das erste, was mir 
auffällt, ist dass du die DLLSPEC defines an die Definitionen 
geschrieben hast.

Das ist nicht erlaubt. Keine Ahnung, ob du das unter Windows kompiliert 
hast, und der verwendete Compiler das nicht checkt, aber laut Docu ist 
das nicht erlaubt:

https://docs.microsoft.com/de-de/cpp/cpp/definitions-and-declarations-cpp?view=vs-2019


Und warum es eine stilistische Verbesserung darstellt, geschweifte 
Klammern bei Conditions zu entfernen, scheint mir auch fragwürdig. 
Nahezu jede Best-Practice empfiehlt diese und jede Codier-Richtlinie, 
die ich bisher gelesen habe forcieren sie.

Berücksichtigt die Platform detection Änderung auch Win64? Da ist nur 
von Win32 die rede.

gsi schrieb:
> (und warum jenseits vom pull request noch Arbeit uebrig war die auch
> noch getan werden muss).

vieles davon war in meinen Augen für eine Erst-Integration überflüssig 
und hätte gerade gezogen werden können, wenn IRMP2 verfügbar ist.

zB: Umbenneung der Funktionen im irmp-shared-lib.
Bennenst du bei jeder Lib, die du inkludierst, die Funktionen um?

Die Reformatierung im Python und die Restrukturierung der 
Python-Struktur:
Die Trennung der Sample-Nummern und der eigentlichen Protokolldaten war 
zB Absicht. Die spätere Struktur wird eher so aussehen, wie die 
Python-Struktur. Wobei hier die gleiche Frage greift: der 
IRMP-Python-Wrapper ist imho als fremd-lib zu sehen. Da ändert man doch 
nicht dran rum, wenn man die ins eigene Projekt integriert.

Die Anpassungen im IRMP-Code ebenso. Ich weiß, der wirft Warnungen, 
allerdings wollte ich so wenige Diffs wie möglich zum Original-Code 
erzeugen. Ich hatte im Wesentlichen, glaub ich, aus der irmp.c nur code 
gelöscht, was sich einfach mergen lässt, falls man wirklich noch mal ein 
update machen möchte.


Edit:
> DLLSPEC defines an die Definitionen
> Das ist nicht erlaubt.

Korrektur: Okay wieder was gelernt: streng genommen ist nur "import" an 
Definitionen nicht erlaubt, was eigentlich nicht vorkommen sollte, wenn 
man die lib kompiliert.

Imho ist das aber rein eine Sache der Deklaration - mag aber 
Geschmacksache sein, weil man eventuell möchte, dass die Definition ganz 
genauso aussieht, wie die Deklaration.

: Bearbeitet durch User
von gsi (Gast)


Lesenswert?

Frank M. schrieb:
> gsi schrieb:
> > Bei Ausbleiben von Antworten muss ich zurueckdrehen dort wo ich geraten
> > habe,
>
> Ich hoffe, Du lässt mir auch zwei Wochen Zeit, mir das anzuschauen. IRMP
> ist ein Privatprojekt für mich, da kann ich nicht täglich reinschauen.
>
> Und Druck kann ich bei Privatprojekten überhaupt nicht leiden.

Nachdem die vorherigen Antworten so ziemlich anders klangen (war Euch 
moeglicherweise nur nicht bewusst), habe ich halt nach etwa zehn Tagen 
nochmal nachgefragt, um herauszufinden was der Status ist. Diese Antwort 
von Dir war uebrigens das erste Signal in Richtung "sehe ich mir an" 
(auch das war Dir vermutlich nur nicht bewusst). Danke dafuer! Mir ist 
sehr klar dass da Arbeit dran haengt, ich kenne beide Seiten von 
Submission und Review. Nur kann ich leider keine Gedanken lesen, und 
muss das nehmen was verfuegbar wird.

Nimm Dir die Zeit die Du brauchst, jetzt wo ich den Status erfahren 
konnte (war vorher einfach nur offen geblieben, daher die Nachfrage). 
Und danke fuer's Ansehen!

Das ist uebrigens unser aller Freizeit in der wir an diesen Projekten 
arbeiten, geht ja nicht nur Dir so. Und ich habe mich auch nicht 
darueber beschwert dass es ein paar Wochen dauert bevor mal jemand seine 
Freizeit aufbringt um anderer Leute Features zu unterstuetzen. Das kam 
aus einer anderen Richtung. :-P

von gsi (Gast)


Lesenswert?

@Vlad: IRMP basiertes Dekodieren in sigrok scheint ja vor allem Deine 
Baustelle zu sein. Danke auch Dir fuer's Ansehen! Die Fragen beantworte 
ich etwas spaeter. Waren viele, dauert einen Moment. :)

von Vlad T. (vlad_tepesch)


Lesenswert?

gsi schrieb:
> @Vlad: IRMP basiertes Dekodieren in sigrok scheint ja vor allem Deine
> Baustelle zu sein. Danke auch Dir fuer's Ansehen! Die Fragen beantworte
> ich etwas spaeter. Waren viele, dauert einen Moment. :)

wirkliche fragen waren es ja nicht. Der größte Knackpunkt, der sich ja 
geklärt hat war das __declspec (vielleicht noch der check , ob win64 
korrekt funktioniert. Ich habs nicht getestet)

Der Rest war im wesentlichen nur etwas geringfügige Verständnislosigkeit 
über ein paar Kleinigkeiten, mit denen du dir zum einen wahrscheinlich 
unnötig Arbeit gemacht hast, und zum anderen eventuell die Integration 
späterer Versionen erschwerst.

Wenn es für das sigrok-decode Projekt aber erstmal funktioniert, ist es 
doch prima. Später kann man immer noch mal weiter schauen

von gsi (Gast)


Lesenswert?

Vlad T. schrieb:
> [ ... ] Der größte Knackpunkt, der sich ja
> geklärt hat war das __declspec (vielleicht noch der check , ob win64
> korrekt funktioniert. Ich habs nicht getestet)

Zum Thema Plattform-Erkennung:

Die UNIX_OR_WINDOWS Logik ist originaler IRMP Code, den habe ich weder 
erfunden noch veraendert. Ich habe den Kern sogar ganz bewusst gelassen 
wie er ist, und lege "von aussen" im Wrapper etwas vor damit der Kern 
findet was er nach Eurer Logik erwartet. Dabei verwendet der Wrapper 
eine Kondition die auch sonst fuer den gleichen Zweck in sigrok Sourcen 
verwendet wird, die in 32 und 64 Bit Varianten auf verschiedenen 
Windows-Versionen rennen. Ist also nicht total falsch, und zumindest so 
gut wie der vorherige Zustand im Projekt war (in beiden Projekten, um 
genau zu sein).

Waere vielleicht noch interessant warum "isoliert" (direkter 
Compiler-Aufruf) die Erkennung der Plattform in der Kern-IRMP #ifdef 
Sequenz funktioniert, aber nicht wenn der gleiche Code unter libtool und 
autotools uebersetzt wird. Wollte ich aber nicht tiefer untersuchen, 
sondern habe einfach schon andernorts funktionierende Konditionen 
uebernommen.

Gleicher Grund fuer die Export Dekoration. Siehe SR_API und SRD_API im 
sigrok Projekt. Ist dort seit ewig ueblich das Attribut bei Deklaration 
und Definition konsistent durchzureichen. Funktioniert in existentem 
Code quer ueber eine Latte verschiedener Plattformen. Habe mir nur 
verkniffen den IRMP Wrapper auf SRD_API (und seine Dependencies) zu 
hieven, und bin beim IRMP_DLLEXPORT Namen geblieben.

> Der Rest war im wesentlichen nur etwas geringfügige Verständnislosigkeit
> über ein paar Kleinigkeiten, mit denen du dir zum einen wahrscheinlich
> unnötig Arbeit gemacht hast, und zum anderen eventuell die Integration
> späterer Versionen erschwerst.

Was die kuenftige Wartung angeht: Schaetze ich genau anders herum ein.

Der IRMP-Kern (irmp.c und daraus referenzierte Header) ist bewusst 
"original" (erster "Import"), darauf folgend nur wenige Modifikationen 
die alle sehr konservativ sind und vor allem alle klar erkennbar (VCS, 
separate Commits). So dass ein Update des Kerns absolut schmerzfrei ist 
wenn das irmp.c API gleich bleibt.

Sollte das irmp.c API sich aendern, erwarte ich dass alle Anpassungen im 
Wrapper bleiben. Der vom Umfang her absolut ueberschaubar ist. Die 
Trennung von Wrapper und Kern war mir sehr wichtig, weshalb ich die 
"amalgamated" Version nicht als Verbesserung empfinden konnte.

Das prinzipielle Vorgehen (Zustand zuruecksetzen, Samples rein fuettern, 
Ergebnisse abholen wenn verfuegbar) bleibt ja. Wenn's in kuenftigen 
Versionen noch mehr Details nach Dekodierung vom Input geben sollte, 
bleibt der Ablauf gleich und damit der Wrapper und das Binding, und nur 
die Ergebnis-Struktur hat ein paar mehr Felder (und die Annotation im 
sigrok PD wird detaillierter). (Boese) Ueberraschungen erwarte ich an 
der Stelle nicht.

Wenn's in kuenftigen IRMP Versionen Aenderungen gibt die ueber die oben 
skizzierten Szenarien hinaus gehen, muss man halt sehen. Prognosen sind 
immer schwierig, und ganz besonders wenn sie sich auf die Zukunft 
beziehen. :-P Aber wenn man betrachtet wie "duenn" die Schichten Wrapper 
und Binding und Decoder sind gegenueber dem maechtigen Kern, und dass 
der Kern absolut geradeaus mit Updates versehen werden kann, erwarte ich 
wie gesagt keine Probleme.

Falls ich's vorher ungluecklich ausgedrueckt habe: Dein Ansatz ist ja 
sehr in Ordnung, und Du hast auch viel Muehe in die Zusammenstellung des 
Pull Request gesteckt. Es ist weniger der Inhalt der die Aufnahme in 
das sigrok Projekt unwahrscheinlich aussehen laesst, sondern die Form 
des Pull Requests. Die ich deshalb massiert habe um die Integration ins 
andere Projekt zu erleichtern. Auch wenn ich IRMP erst vor ein paar 
Wochen kennengelernt habe (sehr interessantes Projekt uebrigens, habe 
ich das schon einmal gesagt?), Du darfst mir glauben dass ich die 
Arbeitsweise vom sigrok Projekt recht gut kenne. Der Maintainer hat mir 
in den letzten Jahren mehrere hundert Commits abgenommen. D.h. ich kann 
schon ungefaehr einschaetzen ob etwas mehr oder weniger gut zum 
Gesamtbild und zur existierenden Codebasis passt. :-] Dein Ansatz wird 
uebernommen, die notwendige Arbeit ist fast getan (Tests stehen noch 
aus), Dir wird dafuer oeffentlich gedankt, und alle sind gluecklich. Und 
kuenftige Versionen werden noch besser. Was will man mehr?

Andere Formen der Anbindung sind vorstellbar, aber bedeuten mehr Arbeit: 
Aus dem Wrapper ein eigenes Projekt machen, das als selbstaendige 
Komponente daherkommt (aehnlich ftdi oder zip oder hidapi Libraries, mit 
cmake bauen oder so, bleibt aber die enge Interaktion mit IRMP und die 
Abhaengigkeit von dessen Interna, Stichwort #include von .c Files). 
Aufnahme des Wrapper als integraler Bestandteil des IRMP Projektes 
selbst (uebrigens: die Stile vom Wrapper und vom Kern unterscheiden sich 
drastisch, der Wrapper ist fast sowas wie der Ausreisser verglichen mit 
beiden Projekten, sigrok und IRMP). Meine massierte Version Deiner 
Vorlage ist einfach ein Kompromiss den ich mit vertretbarem Aufwand 
hinkriegen konnte, der wohl in dieser Form aufgenommen werden kann, und 
der die kuenftige Wartung ermoeglicht oder erleichtert. Ihr seid frei in 
was immer in IRMP an Fixes oder Verbesserungen oder Umbauten stattfinden 
soll, sowohl im Umfang und in der Weise als auch in der Zeit. Und bis 
dahin haben sigrok Nutzer ein neues Feature (bessere Abdeckung von IR 
Protokollen) und das IRMP Projekt hat mehr Nutzer und Sichtbarkeit.

Was die offenen Fragen angeht:

Hast eine Kopie vom Code angesehen ("Schnappschuss", Datei-Inhalt)? Oder 
die commits? Weil genau um die letzteren ging's mir die ganze Zeit. Die 
Meta-Daten, die ueber die Zeilen Code hinaus gehen, aber mindestens 
genauso wichtig sind. Weshalb ich immer auf die 'commitdiff' Links 
verwiesen habe, und nicht nach ZIP Archiv sondern nach URL zum Repo 
frage. Uebrigens ist es auch gute Tradition, dass man in commit messages 
lesen kann warum etwas passiert. Weil dass Code veraendert wurde und 
wie das kann man dem Diff ansehen, das ist fast schon langweilig. Das 
Warum sieht man leider nicht, aber genau da steckt oft der Hirnschmalz 
drin. Und genau diese Informationen braucht man wenn man Fehler sucht 
oder Updates einarbeitet.

von tolero (Gast)


Lesenswert?

Hallo,
habe mal ein paar Fragen zu IRMP. Habe es in meinem Arduino eingebunden. 
Es funktioniert soweit gut. Es gibt aber noch ein paar Problemchen.

Das Ganze läuft per AttachInterrupt auf Pin 3. Wenn eine bestimmte Taste 
gedrückt wird, soll ein Motor laufen. Leider enthält die Variable 
irmp_Data immer den letzten Wert, auch wenn keine Taste gedrückt wird. 
Wie kann man abfragen, ob gerade eine Taste gedrückt wird bzw. keine 
Taste gedrückt wird?

Danke.

von tolero (Gast)


Lesenswert?

Ach so, gibt es eine Art Funktionsübersicht zu IRMP?

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

tolero schrieb:
> Wie kann man abfragen, ob gerade eine Taste gedrückt wird bzw. keine
> Taste gedrückt wird?

Der Rückgabewert der Funktion irmp_get_data() gibt die Information, ob 
eine Taste gedrückt wurde oder nicht.

tolero schrieb:
> Ach so, gibt es eine Art Funktionsübersicht zu IRMP?

Siehe Artikel IRMP. <-- hier klicken

von tolero (Gast)


Lesenswert?

Danke für die schnelle Antwort. Habe deinen Artikel genau gelesen, die 
Funktion aber wohl übersehen.

Der folgende Code funktioniert, nur gibt es bei dem Schrittmotor keine 
flüssige Bewegung. Nach jeder "fahren" Routine ruckelt es kurz, bis der 
neue IR-Befehl verarbeitet wurde.
1
void loop() {
2
  fahren();
3
}
4
5
void fahren() {
6
  if (runallowed == true) {
7
    for (int i = 0; i <= 320; i++) {
8
      digitalWrite(DIR, ydir);
9
      digitalWrite(STP, HIGH);
10
      delayMicroseconds(20);
11
      digitalWrite(DIR, ydir);
12
      digitalWrite(STP, LOW);
13
      delayMicroseconds(mspeed);
14
      runallowed = false;
15
      interrupts(); // enable interrupts
16
    }
17
  }
18
}
19
20
void handleReceivedIRData() {
21
  irmp_get_data(&irmp_data[0]);
22
  switch (irmp_data[0].command) {
23
    case 360: //rechts
24
      runallowed = true; //allow running
25
      ydir = HIGH;
26
      break;
27
    case 872:  //links
28
      runallowed = true; //allow running
29
      ydir = LOW;
30
      break;
31
  }
32
}

von Armin J. (arminj)


Lesenswert?

Na ja, die IR Befehle kommen ja auch nicht beliebig schnell 
hintereinander.
Daran kann das schon liegen.
Gib mal nur die millis() in handleReceivedIRData() aus, dann siehst du 
es.
Dann muss ein IR Befehl bei Dir vieleicht für eine längere Fahrzeit 
reichen (z.B. 400 statt 320).

von tolero (Gast)


Lesenswert?

Danke, habe ich gemacht. Einmal drücken = losfahren, nochmal 
drücken=stoppen

Funktioniert leider noch nicht. Das repetition-flag funktioniert nicht 
zuverlässig. Zeigt immer eine 1, wenn die Taste bereits gedrückt wurde 
und keine andere in der Zwischenzeit gedrückt wurde. Liegt das am 
attachInterrupt oder ist das generell so?
1
void handleReceivedIRData() 
2
  {
3
  irmp_get_data(&irmp_data[0]);
4
5
  switch (irmp_data[0].command) {
6
    case 360: //rechts
7
      Serial.print("rechts flags->");
8
      Serial.println(irmp_data[0].flags); 
9
      if (! (irmp_data[0].flags & IRMP_FLAG_REPETITION)) {
10
        Serial.println("rechts Einmalig");
11
        if (runallowed == true) {
12
          runallowed = false;
13
        }
14
        else {
15
          runallowed = true; //allow running
16
          ydir = HIGH;
17
        }
18
      }
19
      break;
20
    case 872:  //links
21
      Serial.print("links flags->");
22
      Serial.println(irmp_data[0].flags); 
23
      if (! (irmp_data[0].flags & IRMP_FLAG_REPETITION)) {
24
        Serial.println("links Einmalig");
25
        if (runallowed == true) {
26
          runallowed = false;
27
        }
28
        else {
29
          runallowed = true; //allow running
30
          ydir = LOW;
31
        }
32
      }
33
      break;
34
  }
35
}

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

tolero schrieb:
> irmp_get_data(&irmp_data[0]);

Das solltest du etwas ändern:
1
 if (irmp_get_data (&irmp_data))
2
  {
3
   if ((irmp_data.protocol == 0x1C) && (irmp_data.address == 0x0113)) 
4
   {
5
    switch (irmp_data.command) {
6
    case    FB_VIDEOUP  :  if (DAC[0] < 63) DAC[0]++;                 
7
          break;
8
// usw.
irmp_get_data() gibt 0 zurück, wenn da nichts neues war und einen Wert 
<> 0, wenn was empfangen wurde. protocol und address sind spezifisch für 
meine FB und sind bei dir sicherlich anders.

: Bearbeitet durch User
von tolero (Gast)


Lesenswert?

Das steht im seriellen Monitor:
1
links flags->1
2
links flags->1
3
links flags->1
4
links flags->1
5
rechts flags->0
6
rechts Einmalig
7
rechts flags->1
8
rechts flags->1
9
rechts flags->1
10
rechts flags->1
11
rechts flags->1
12
rechts flags->1
13
rechts flags->1
14
rechts flags->1
15
rechts flags->1
16
rechts flags->1
17
rechts flags->1
18
rechts flags->1
19
rechts flags->1
20
rechts flags->1
21
rechts flags->1
22
rechts flags->1
23
rechts flags->1
24
rechts flags->1
25
rechts flags->1
26
rechts flags->1
27
rechts flags->1
28
rechts flags->1
29
rechts flags->1
30
links flags->0
31
links Einmalig
32
links flags->1
33
rechts flags->0
34
rechts Einmalig
35
rechts flags->1
36
rechts flags->1
37
rechts flags->1
38
rechts flags->1
39
rechts flags->1
40
rechts flags->1
41
rechts flags->1
42
rechts flags->1
43
rechts flags->1
44
rechts flags->1
45
rechts flags->1
46
rechts flags->1
47
rechts flags->1

von tolero (Gast)


Lesenswert?

Matthias S. schrieb:
> tolero schrieb:
>> irmp_get_data(&irmp_data[0]);
>
> Das solltest du etwas ändern: if (irmp_get_data (&irmp_data))
>   {
>    if ((irmp_data.protocol == 0x1C) && (irmp_data.address == 0x0113))
>    {
>     switch (irmp_data.command) {
>     case    FB_VIDEOUP  :  if (DAC[0] < 63) DAC[0]++;
>           break;
> // usw.
> irmp_get_data() gibt 0 zurück, wenn da nichts neues war und einen Wert
> <> 0, wenn was empfangen wurde. protocol und address sind spezifisch für
> meine FB und sind bei dir sicherlich anders.

auch wenn es über einen attachInterrupt läuft?

von Armin J. (arminj)


Lesenswert?

@tolero
Bei Interrupt ist das schon richtig, wie Du das machst.
Die Standard IRMP die man hier im Forum kennt, kann gar kein Interrupt, 
das ist eine experimentelle Arduino Erweiterung von mir.
Ich werd mal bei mir testen und meld mich dann. Kann sein, dass da noch 
ein Bug drin ist.

: Bearbeitet durch User
von Armin J. (arminj)


Lesenswert?

Also bei mir tuts das, ich bekomme bei dem Interrupt Example:
1
P=NEC  A=0xFF00 C=0x19
2
P=NEC  A=0xFF00 C=0x19 R
3
P=NEC  A=0xFF00 C=0x19 R
4
P=NEC  A=0xFF00 C=0x19 R
5
P=NEC  A=0xFF00 C=0x19  <- Taste sehr kurz gedrückt
6
P=NEC  A=0xFF00 C=0x19  <- Taste sehr kurz gedrückt
7
P=NEC  A=0xFF00 C=0x19
8
P=NEC  A=0xFF00 C=0x19 R
9
P=NEC  A=0xFF00 C=0x19 R
10
P=NEC  A=0xFF00 C=0x19   <- Taste kurz gedrückt, 1 repeat
11
P=NEC  A=0xFF00 C=0x19 R
12
P=NEC  A=0xFF00 C=0x19
13
P=NEC  A=0xFF00 C=0x19 R
Das Interrupt Example tuts aber nicht für alle Protokolle, das geht 
theoretisch auch gar nicht.

Läuft das Interrupt Example denn bei Dir?

: Bearbeitet durch User
von Joachim B. (jar)


Lesenswert?

Armin J. schrieb:
> Die Standard IRMP die man hier im Forum kennt, kann gar kein Interrupt,
> das ist eine experimentelle Arduino Erweiterung von mir.

ähm, das ist so nur halb richtig, ich nutze IRMP auf dem AVR und auch 
auf den Arduino in der IDE aus früheren Zeiten auch mit IRQ, mache ein 
IRQ von 15000/s rufe IRMP auf, zähle bis 150 (10ms) und wenn die 
erreicht sind hüpfe ich in die Tastaturroutine von Dannegger mit 
Entprellung, schicke meine WS Updates raus (3ms), lese noch ein DCF77 
Bit sowie die RTC ein und bin dann wieder raus.
Das läuft auf meiner wordclock12h seit 2015.

IR geht,
Tastenabfrage und Entprellung geht,
DCF77 Auswertung geht auch
114 WS2812B gehen auch

Nur für ESP32 habe ich das noch nicht umgesetzt.

: Bearbeitet durch User
von Armin J. (arminj)


Lesenswert?

Joachim B. schrieb:
> ähm, das ist so nur halb richtig,
Ja wenn Du meinst...

Meine experimentelle Erweiterung ruft irmp_ISR() NUR auf, wenn der IR 
Pin wackelt.
Wenn das schonmal gemacht wurde, toll. Ist mir aber bis jetzt nicht über 
den Weg gelaufen.

von Joachim B. (jar)


Lesenswert?

Armin J. schrieb:
> Ja wenn Du meinst...

meine ich nicht, ist so

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Armin J. schrieb:
> Die Standard IRMP die man hier im Forum kennt, kann gar kein Interrupt,
> das ist eine experimentelle Arduino Erweiterung von mir.

Ach du meine Nase - was macht ihr gerade mit IRMP? Das war ein gut 
funktionierendes Stück Software, problemlos zu implementieren und gut zu 
verstehen.
Bitte lasst es jetzt nicht in einen Dschungel von verschiedenen 
Versionen untergehen und auseinanderdriften.

von Müllheim (Gast)


Lesenswert?

Armin J. schrieb:

> Meine experimentelle Erweiterung ruft irmp_ISR() NUR auf, wenn der IR
> Pin wackelt.

Daran erkenne ich den Profi: " ... wenn der IR Pin wackelt."

von 900ss (900ss)


Lesenswert?

Matthias S. schrieb:
> Ach du meine Nase

Das ging mir auch durch den Kopf... :-/
Ich fürchte es wird jetzt ein undurchschaubares Gewurschtel.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Armin J. schrieb:
> Meine experimentelle Erweiterung ruft irmp_ISR() NUR auf, wenn der IR
> Pin wackelt.

Das kann bei vielen Protokollen zu einem Problem werden. IRMP behandelt 
oft Timeouts, um bestimmte Protokolle auseinanderzuhalten, gerade, wenn 
sich ähnliche Protokolle nur durch die Anzahl der Bits unterscheiden. 
Wenn die ISR nur noch bei Flanken aufgerufen wird, dann greifen diese 
Timeouts nicht mehr. Damit schließt Du die Erkennung von mindestens 
einem Dutzend von Protokollen prinzipiell aus. Es kann sogar dann 
passieren, dass bei bestimmten Kombinationen von aktivierten Protokollen 
dann beide nicht mehr erkannt werden.

Einfachstes Beispiel, um das zu veranschaulichen:

Wenn NEC und NEC42 oder NEC16 und NEC aktiviert sind - oder gar alle 
drei, dann werden diese dadurch unterschieden, dass entweder nach 16 
oder 32 oder 42 Bits ein Timeout erkannt wird. Das geht bei reinen 
flankengetriggerten Interrupts voll in die Hose. Die Statemachine hängt 
sich dann auf und bleibt mitten in der Abarbeitung eines Protokolls 
hängen, weil sie nicht mehr aufgerufen wird.

Ich hatte schon öfters überlegt, IRMP auf flankengetriggerte Interrupts 
umzustellen, dies aber immer wieder deshalb verworfen, weil ich dann für 
die Timeouts doch wieder einen zusätzlichen Timer hätte verwenden 
müssen. Ergo wäre der Gewinn (weniger CPU-Zeit) dadurch wieder 
relativiert worden.

Deshalb: Vergiss das mit den flankengetriggerten Interrupts, dafür ist 
die Statemachine nicht ausgelegt.

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Frank M. schrieb:
> Wenn NEC und NEC42 oder NEC16 und NEC aktiviert sind - oder gar alle
> drei, dann werden diese dadurch unterschieden, dass entweder nach 16
> oder 32 oder 42 Bits ein Timeout erkannt wird.

Und genau diese Protokolle gehören zu den meist verwendeten heute. Jedes 
kleine RGB Drückerchen nutzt NEC - diese Dinger hier:
https://www.ebay.de/c/1956075631
https://www.ebay.de/itm/1M-10M-LED-Stripe-RGB-Leiste-Streifen-5050-SMD-Band-Wasserdicht-Lichterkette/362928547894

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Matthias S. schrieb:
> Und genau diese Protokolle gehören zu den meist verwendeten heute.

So ist es. War aber nur ein Beispiel, weil es am anschaulichsten war. 
IRMP arbeitet bei geschätzt jedem zweiten Protokoll über Timeouts, bei 
Manchester zum Beispiel zu 100 Prozent.

Da ist auch noch ein anderes Problem, wenn nur noch Flanken-Trigger 
reinkommen:

Bei einer simplen Störung, wie sie tagtäglich bei IR auftritt, zum 
Beispiel bei einer Nicht-Erkennung einer einzelnen Flanke, verbleibt die 
Statemachine in der Decodierung und wartet ewig auf das verbleibende 
letzte Bit. Erst ein erneutes Drücken der FB holt sie dann da raus - 
unter der Gefahr, dass dann diese Taste auch nicht mehr zuverlässig 
erkannt werden kann, da das Start-Bit zur "Reparatur" des letzten Frames 
und nicht zur Erkennung des nächsten Frames genutzt werden kann. 
Resultat: man drückt sich dann dumm und dämlich auf der Tastatur, bis 
die Statemachine wieder "im Takt" ist.

: Bearbeitet durch Moderator
von Armin J. (arminj)


Lesenswert?

Hallo,
Danke für die vielen Anmerkungen, Ihr habt ja alle recht:
Armin J. schrieb:
> Das Interrupt Example tuts aber nicht für alle Protokolle, das geht
> theoretisch auch gar nicht.

Die Flankensteuerung ist auch nicht in IRMP eingebaut, sondern 
aufgesetzt mittels extra Funktionen, die irgendwann irmp_ISR() aufrufen.
Frank M. schrieb:
> Deshalb: Vergiss das mit den flankengetriggerten Interrupts, dafür ist
> die Statemachine nicht ausgelegt.
Das habe ich auch bei meiner Implementierung festgestellt, aber es läuft 
jetzt mit überschaubarem Aufwand für wichtige Protokolle (siehe unten), 
und spart einen Arduino Timer und jede Menge CPU und ISR Calls, die z.B. 
bei anderen Libraries wie Neopixel oder Servo doch sehr stören können, 
bzw gar nicht funktionieren würden.

Matthias S. schrieb:
> Und genau diese Protokolle gehören zu den meist verwendeten heute. Jedes
> kleine RGB Drückerchen nutzt NEC - diese Dinger hier:

Und genau diese Dinger tun es mit der Flankensteuerung hervorragend, 
siehe protokoll: 
Beitrag "Re: IRMP - Infrared Multi Protocol Decoder"

Nehmt einfach 
https://github.com/ukw100/IRMP/tree/master/examples/Interrupt
und probiert es aus :-)

Tested for NEC, Kaseiko, Denon, RC6, Samsung + Samsg32.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Armin J. schrieb:
> Tested for NEC, [...]

Dürfte aber dann nur noch funktionieren, wenn NEC42 ausgeschlossen ist. 
Kannst Du das bestätigen?

von Armin J. (arminj)


Lesenswert?

Frank M. schrieb:
> Armin J. schrieb:
>> Tested for NEC, [...]
>
> Dürfte aber dann nur noch funktionieren, wenn NEC42 ausgeschlossen ist.
> Kannst Du das bestätigen?

Steht so in dem Beispiel :-)
1
#include <irmpSelectMain15Protocols.h>  // This enables 15 main protocols
2
#undef IRMP_SUPPORT_NEC42_PROTOCOL // this protocols is incompatible to NEC in interrupt mode, since it is the same as NEC but has longer data sections
3
#define IRMP_SUPPORT_NEC42_PROTOCOL      0

von gsi (Gast)


Lesenswert?

Ist gerade wieder ein Monat ohne Antwort vergangen. :(

Koennt Ihr bitte einen funktionierenden Link zum versionsverwalteten 
Stand der Quellen auf die Projektseite packen? Sollte sich hoffentlich 
"zwischendurch" erledigen lassen, dauert vermutlich nicht so lange wie 
Code gegenzulesen, oder schwierige technische Sachverhalte zu 
durchdringen, oder mit Hardware bisher noch nicht betrachtete 
Randsituationen nachzustellen. Sollte man denken.

Wenn die Projektseite warnt dass in diesem Repo Zwischen-Versionen oder 
Test-Zustaende liegen, ist es dann wert einen Hinweis auf eine 
bevorzugte Version zu geben? Oder die letzte bekannte funktionierende 
Version zu nennen? Sonst muss der Nutzer raten worauf der Schnappschuss 
im ZIP sich beziehen mag. Oder kann gar keinen Zusammenhang zwischen dem 
ZIP-Inhalt und dem Code-Repo herstellen. (Und ich glaube immer noch dass 
ein ZIP kein Repo ersetzen kann.)

Im Moment ist es fuer externe Projekte wirklich schwierig, vom aktuellen 
Zustand zu erfahren, oder den Fortschritt zu verfolgen, oder (auf 
wartbare Weise) Euren Code zu integrieren und spaeter Updates zu 
uebernehmen. Und das leider ganz ohne Notwendigkeit fuer die 
Erschwernis. Modifizierte Kopien aufzustapeln von denen man nicht 
erfahren kann wie sie aus einander entstanden oder wodurch sie sich 
unterscheiden kann's doch bestimmt nicht sein was man als Entwickler 
will.

Falls meine Variante der Integration in libsigrokdecode umstaendlich 
oder eigenartig oder aus anderen Gruenden nicht akzeptabel erscheint: 
Gibt's Meinungen zu oder Arbeiten an einer der anderen Vorgehensweisen? 
Ein eigenstaendiges Projekt, oder der Wrapper als Teil von IRMP? Hier im 
Forum und auch im Subversion kann ich davon nichts erkennen (letzte 
Aktivitaet vom 2019-08-28, seitdem Stille).

@Vlad: Willst Du fuer Deinen Beitrag zum sigrok Projekt genannt werden, 
und wenn ja wie? Kann ich weder dem Chat noch dem Forum noch dem Pull 
Request entnehmen, habe inzwischen mehrmals gefragt und immer noch keine 
Antwort bekommen. Musste raten, und muss ohne ACK die unbestaetigte 
Annahme wieder entfernen wenn keine Bestaetigung moeglich ist.

Falls Ihr kein Interesse an der Kommunikation habt, dann gebt bitte 
wenigstens ein NAK statt gar nichts. Dann kann ich wenigstens damit 
arbeiten statt weiter zu warten oder zu raten. Die aktuelle Haengepartie 
macht jedenfalls keinen Spass.

Nochmal die Links:
- https://www.mikrocontroller.net/articles/IRMP#Download
- https://github.com/sigrokproject/libsigrokdecode/pull/27
- 
https://repo.or.cz/libsigrokdecode/gsi.git/shortlog/refs/heads/wip/irmp-pd-v2

von Jörg R. (jrie)


Lesenswert?

gsi schrieb:
> einen funktionierenden Link zum versionsverwalteten
> Stand der Quellen

Ich mach das seit Jahren so:
1
wget "http://www.mikrocontroller.net/svnbrowser/irmp/?view=tar" -O irmp.tar.gz

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

gsi schrieb:
>
> Koennt Ihr bitte einen funktionierenden Link zum versionsverwalteten
> Stand der Quellen auf die Projektseite packen?

Ich habe soeben im Artikel IRMP den Text unter Download angepasst. 
Dort ist nun ein Link auf die Stable Version als zip-Archiv und ebenso 
ein Link für die Development-Version auf das SVN von µc.net.

Den Hinweis auf irgendein spiegelndes GitHub-Repository habe ich 
rausgenommen, da das Spiegeln wohl schon seit Jahren nicht mehr 
funktioniert. Keine Ahnung, wer das mal gemacht und den GitHub Link im 
Artikel plaziert hat.

> Wenn die Projektseite warnt dass in diesem Repo Zwischen-Versionen oder
> Test-Zustaende liegen, ist es dann wert einen Hinweis auf eine
> bevorzugte Version zu geben?

IRMP ist ein Projekt, was mittlerweile "betagter" ist, das heisst die 
wilde Zeit der Entwicklung ist vorbei. Bis dahin gab es halt eine 
Entwicklungs- und eine Stable-Version, die sich unter Umständen stark 
unterscheiden konnten. Die Warnung war für diejenigen End-User gedacht, 
die mit Entwicklung nichts am Hut haben und lediglich ein stabiles Tool 
anwenden wollen.

Da schon seit geraumer Zeit hier nichts mehr grundlegendes zu 
entwickleln ist und daher seitdem lediglich Bug-Fixes oder ein mal ein 
neues IR-Protokoll hinzukommen, halte ich die Entwickler- und 
Stable-Version in letzter Zeit meist synchron. Ich habe daher nun die 
Warnung rausgenommen.

Zur Stable-Version: Diese ist ausschließlich für den End-User und 
damit für Dich als Entwickler uninteressant. Diese wird auch nicht 
weiterentwickelt, sondern spiegelt lediglich einen gut getesteten Stand 
dar.

Die Development-Version ist also für Dich als Entwickler die einzig 
maßgebliche, also der Link svn://mikrocontroller.net/irmp/

> Oder die letzte bekannte funktionierende
> Version zu nennen? Sonst muss der Nutzer raten worauf der Schnappschuss
> im ZIP sich beziehen mag.

Keine Ahnung, wen Du hier als "Nutzer" siehst. Ich sehe einen Nutzer als 
jemanden an, der IRMP ausschließlich in seiner Applikation anwendet und 
nichts am IRMP-Quellcode anpassen oder erweitern möchte. Also den 
Endanwender.

> (Und ich glaube immer noch dass ein ZIP kein Repo ersetzen kann.)

Natürlich soll das ZIP kein Repo ersetzen. Das ZIP ist für den 
Endanwender, der mit Entwicklung von IRMP nichts am Hut hat.

> Im Moment ist es fuer externe Projekte wirklich schwierig, vom aktuellen
> Zustand zu erfahren, oder den Fortschritt zu verfolgen, oder (auf
> wartbare Weise) Euren Code zu integrieren und spaeter Updates zu
> uebernehmen.

Wie gesagt, da tut sich sowieso im Code nicht mehr viel. Der letze Stand 
ist vom August 2018, das sagt doch schon alles. IRMP ist ein gut 
getestetes Tool und der Großteil der Anwender ist sehr zufrieden damit. 
Ab und zu kommt mal ein neues Protokoll dazu... das ist also 
mittlerweile eine ziemlich langweilige Geschichte geworden - was die 
Entwicklung angeht.

> Falls meine Variante der Integration in libsigrokdecode umstaendlich
> oder eigenartig oder aus anderen Gruenden nicht akzeptabel erscheint:

Was ich aus Deinen Anpassungen entnehmen konnte, ist das so okay für 
mich.

> Gibt's Meinungen zu oder Arbeiten an einer der anderen Vorgehensweisen?
> Ein eigenstaendiges Projekt, oder der Wrapper als Teil von IRMP?

Das ist mir vollkommen egal. Hauptsache, die bisherige 
End-Anwender-Zielgruppe kann weiterhin so einfach wie bisher IRMP in 
sein µC-Projekt integrieren.

> Hier im
> Forum und auch im Subversion kann ich davon nichts erkennen (letzte
> Aktivitaet vom 2019-08-28, seitdem Stille).

Ja, seitdem Stille. Da gibt es auch keine "geheimen" neuere Versionen. 
Okay, ich habe auf meinem PC noch eine etwas neuere Version vom Februar. 
Da IRMP aber letztendlich eine One-Man-Show ist, kann ich es mir 
leisten, diese Version erst irgendwann einzuchecken und nicht morgen. 
Ich bin sowieso (bisher) der einzige, der ins SVN eincheckt.

> Nochmal die Links:

Der einzig für Dich relevante:

svn://mikrocontroller.net/irmp/

: Bearbeitet durch Moderator
von gsi (Gast)


Lesenswert?

@Frank
Danke fuer die schnelle Antwort, und fuer das Update der Projekt-Seite!

Was "Nutzer" angeht, gibt's vermutlich verschiedene Sorten. Auch wenn 
ich Software-Entwickler bin und an anderen Projekten mitarbeite, bin ich 
bzgl IRMP dennoch "nur" Nutzer, weil ich die Komponente verwenden (s.o. 
integrieren) will, aber nicht vorhabe an der Komponente selbst zu 
schrauben, so lange nicht notwendig. Vielleicht haette ich "von aussen 
neu zu IRMP dazu kommend" oder aehnliches verwenden sollen? Als Kontrast 
zu jemandem der die Interna auswendig kennt, oder schon laenger mit IRMP 
vertraut ist und ueber die Zeit "genug mitbekommen" hat.

Der Punkt war, dass neu hinzukommende Teilnehmer mache Informationen 
nicht selbst schon wissen koennen, und auch durch Lesen oder Suchen 
nicht selbst herausfinden koennen. Weshalb sie dann fragen, 
moeglicherweise begruendet. Es ist wert, diese Frage zur Kenntnis zu 
nehmen und zu durchdenken, statt sie "wegzubuegeln" oder abzutun. Die 
angefragte Information zu liefern, oder besser noch gleich dem 
Naechsten auch verfuegbar zu machen, koennte insgesamt am hilfreichsten 
sein. Ich fand schade dass es so zaeh war an den Punkt zu gelangen wo 
dann die Information selbst mal aufkam und damit die Frage hinfaellig 
wurde. Und noch bedauerlicher dass der naechste Nutzer die gleiche 
Situation wieder vorgefunden haette und fast zwangsweise den gleichen 
Schmerz wieder erleben muss. Und "kommuniziere deshalb so viel 
hinterher", weil ich hoffe dass es dem naechsten Nutzer besser geht, 
weil der Schmerz inzwischen "schon mal durchlitten" aber auch "die 
Lektion mitgenommen" war. Versucht bitte beim naechsten Mal zu verstehen 
warum jemand fragt und welche Antwort wirklich hilft. Danke!

von gsi (Gast)


Lesenswert?

Jörg R. (jrie) schrieb:
> gsi schrieb:
> > einen funktionierenden Link zum versionsverwalteten
> > Stand der Quellen
>
> Ich mach das seit Jahren so:
>
> wget "http://www.mikrocontroller.net/svnbrowser/irmp/?view=tar"; -O irmp.tar.gz

Schoen fuer Dich dass Du Dir selbst helfen kannst. Nur war das 
ueberhaupt nicht die Frage! In dem Teil den Du zitierst steht 
versionsverwalteter Stand der Quellen, was ein Schnappschuss in einem 
ZIP nicht ist. Was ich seit Januar (Chat mit vlad) bzw Februar (hier 
im Forum) versuche zu kommunizieren. Inzwischen haben wir April und ich 
konnte noch nicht einmal uebermitteln was die Frage war. Da kommt man 
sich manchmal vergackeiert vor. (Frank hat's inzwischen gemerkt -- Danke 
dafuer!)

Wenn Dir die Antwort soooo offensichtlich und einfach erscheint, und die 
Frage sooo dumm oder gegenstandslos, erwaege beim naechsten Mal bitte ob 
Du die Frage richtig verstanden hast. Fuer wie beschraenkt musst Du 
einen anderen Teilnehmer halten, der mehrfach beschreibt "ich sehe ein 
ZIP und ein Webfrontend, aber suche denk Link zum Repo", und glaubst die 
Antwort heisst "das ZIP ist dort"? Als ob ein anderer 
Software-Entwickler nicht in der Lage waere ein ZIP zu saugen von einem 
Link den er kennt und auf den er verweist und von dem er mehrfach 
aussagt dass das nicht die gesuchte Information ist ...

Der groesste Teil meines Frusts kommt nicht vom Fehlen einzelner 
Detail-Information, oder der vergangenen Zeit. Sondern vom scheinbaren 
Mangel an Bewusstsein fuer die Position des anderen Teilnehmers. Bitte 
bedenkt einmal diesen Aspekt! Versetzt Euch selbst fuer einen Moment in 
die Situation des anderen Menschen. Ihr koenntet Euch wundern. Und 
danach hoffentlich weniger schroff agieren. Sollte einen Versuch wert 
sein ...

von eku (Gast)


Lesenswert?

Hallo Frank und wer noch helfen könnte,

ich versuche Interoperabilität zwischen IRMP auf einem AVR, 
IRremoteESP8266 (https://github.com/crankyoldgit/IRremoteESP826) auf 
einem ESP8266 mit Tasmota, einer lernbaren Universalfernbedienung und 
der FB meines Thomson TV herzustellen.

Die Universal-FB habe ich von der TV-FB angelernt. Mit beiden kann ich 
den TV steuern. Und jetzt kommen IRMP und IRremoteESP8266 ins Spiel. 
Beispielhaft hier der Power-Knopf der originalen FB.

IRMP: MATSUSHITA 04 0AB0 054F
IRremoteESP8266: "NIKAI","Bits":24,"Data": 
"0x0D5F2A","DataLSB":"0xB0FA54"

Laut IRMP-Artikel hier im Wiki stimmt das mit den 24 Bit. In welcher 
Beziehung MATSUSHITA und NIKAI stehen, kann ich nicht beurteilen.

Hier der Versuch, die Bits zwischen IRMP und IRremoteESP8266 zuzuordnen:

1011 0000 1111 1010 0101 0100 0xB0FA54
HHHH HHCC CCCC AAAA AAAA AAAA

0000 1101 0101 1111 0010 1010 0x0D5F2A
HHHH HHCC CCCC AAAA AAAA AAAA

H=Herseller, C=Kommando, A=Adresse

Betrachtet man 4 Bit und lässt ein wenig Fantasie walten, dann geht das 
schon irgendwie auf. Ich hätte aber gerne ein klares Verständnis, schon 
wegen der eingangs genannten Interoperabilität. Der IRMP-Wikiartikel 
schweigt sich bezüglich der Aufteilung der 24 Bits aus.

Nächster Test ist das Senden ebendieses Signals.

IRSND -> IRremoteESP8266
"Protocol":"UNKNOWN","Bits":132,"Hash":"0xCEBB54B5","Repeat":0

IRremoteESP8266 -> IRMP
04 0AB0 054F

Sendet IRSND unsauber, was das Timing anbetrifft, oder liegt es an 
IRremoteESP8266?

Und noch ein Test.

Universal-IR -> IRMP
04 0AB0 054F

Universal-IR -> IRremoteESP8266
"Protocol":"UNKNOWN","Bits":52,"Hash":"0x641EDF9D","Repeat":0

Dabei muss man der Universal-FB zu gute halten, dass diese das Protokoll 
beim Anlernen nicht dekodiert, sonder nur aufzeichent und dann 
wiedergibt.

Wer kann helfen?

von Jörg R. (jrie)


Lesenswert?

Funktioniert denn IRSND -> Thomson TV?

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

eku schrieb:
> Hier der Versuch, die Bits zwischen IRMP und IRremoteESP8266 zuzuordnen:
>
> 1011 0000 1111 1010 0101 0100 0xB0FA54
> HHHH HHCC CCCC AAAA AAAA AAAA
>
> 0000 1101 0101 1111 0010 1010 0x0D5F2A
> HHHH HHCC CCCC AAAA AAAA AAAA

IRMP fasst den Frame mit LSB first auf. Ob das richtig ist, weiß ich 
nicht, darüber habe ich keine Infos im Netz gefunden, das war damals 
lediglich bei der Dekodierung des MATSUSHITA-Protokolls eine Vermutung 
von mir.

Deshalb steht unter 
https://www.mikrocontroller.net/articles/IRMP#MATSUSHITA :
1
Bit-Order       LSB first?

Wenn Du also jeweils 8 Bit rückwärts liest, wird aus:
1
1011 0000 -> 0000 1101
2
1111 1010 -> 1111 0101
3
0101 0100 -> 0010 1010

> Der IRMP-Wikiartikel
> schweigt sich bezüglich der Aufteilung der 24 Bits aus.

Im IRMP-Artikel wird die Aufteilung durchaus genannt, siehe 
https://www.mikrocontroller.net/articles/IRMP#MATSUSHITA :
1
Frame           1 Start-Bit + 24 Daten-Bits + 1 Stop-Bit
2
Daten           6 Hersteller-Bits + 6 Kommando-Bits + 12 Adress-Bits
3
Start-Bit       3488µs Puls, 3488µs Pause
4
0-Bit           872µs Puls, 872µs Pause
5
1-Bit           872µs Puls, 2616µs Pause
6
Stop-Bit        872µs Puls

> Sendet IRSND unsauber, was das Timing anbetrifft, oder liegt es an
> IRremoteESP8266?

Wenn ich unter Linux den Output von IRSND in den IRMP per Pipe 
"reinschicke", sieht das ganz korrekt aus:
1
./irsnd-15kHz 04 0AB0 054F | ./irmp-15kHz
2
3
111100101010000011010101 p= 4 (MATSUSH), a=0x0ab0, c=0x054f, f=0x00

Es kann natürlich sein, dass die Timings etwas abweichen. Ich persönlich 
habe die Timings damals vermutlich empirisch aus mir zugesandten 
IRMP-Scans per IRMP_LOGGING=1 gewonnen. Genau weiß ich es nicht mehr, 
ist zu lange her.

Wie Jörg bereits fragte: Funktioniert denn IRSND -> Thomson TV?

Außerdem könntest Du mir einen Scan Deiner Original-FB schicken. 
Genaueres findest Du unter IRMP_LOGGING im IRMP-Artikel.

: Bearbeitet durch Moderator
von Armin J. (arminj)


Lesenswert?

eku schrieb:
> ich versuche Interoperabilität zwischen IRMP auf einem AVR,
> IRremoteESP8266 (https://github.com/crankyoldgit/IRremoteESP826) auf
> einem ESP8266 mit Tasmota, einer lernbaren Universalfernbedienung und
> der FB meines Thomson TV herzustellen.
Ist das Zufall oder warum bekomme ich bei dem Link ein 404?

eku schrieb:
> Sendet IRSND unsauber, was das Timing anbetrifft, oder liegt es an
> IRremoteESP8266?
IRremote hat eine seeeeehr schlechte Dekodierung, die Issues sind voll 
davon.
Nimm einfach die Arduino IRMP https://github.com/ukw100/IRMP, die gibt 
es für avr,esp8266,esp32,STM32,stm32,stm32duino,samd,apollo3.

von Jörg R. (jrie)


Lesenswert?

Armin J. schrieb:
> warum bekomme ich bei dem Link ein 404?

Da fehlt die zweite 6 am Ende.

von eku (Gast)


Lesenswert?

Armin J. schrieb:
> IRremote hat eine seeeeehr schlechte Dekodierung, die Issues sind voll
> davon.
> Nimm einfach die Arduino IRMP https://github.com/ukw100/IRMP, die gibt
> es für avr,esp8266,esp32,STM32,stm32,stm32duino,samd,apollo3.

Gut gemeinter Rat. Ich verwende, wie geschrieben, Tasmota. Freilich 
könnte ich versuchen, das Projekt zu einem Umstieg zu bewegen oder einen 
PR dafür einzureichen. Allerdings bin ich bei Tasmota nur Anwender und 
habe kein weiteres Wissen der Struktur und Arduino ist nicht meine 
Domäne.

von Armin J. (arminj)


Lesenswert?

eku schrieb:
> Allerdings bin ich bei Tasmota nur Anwender und
> habe kein weiteres Wissen der Struktur und Arduino ist nicht meine
> Domäne.
Danke, der Zusammenhang zwischen Tasmota und IRremote war mir gar nicht 
klar.

Und auf dem AVR machst du IRMP nativ? Das ist mutig, ich hab mir das 
nicht angetan.

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Hi, gibt's irgendwo nen Link auf die aktuellen IRMP-Quellen? AVR, 
non-Arduino?

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Johann L. schrieb:
> Hi, gibt's irgendwo nen Link auf die aktuellen IRMP-Quellen? AVR,
> non-Arduino?

IRMP: Download

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

hmmm... Danke ersma

Ich dachte es wäre ein Projekt for AVRs?  Das Makefile baut aber nur 
Programme für den Host / PC?

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


Lesenswert?

Johann L. schrieb:
> Ich dachte es wäre ein Projekt for AVRs?  Das Makefile baut aber nur
> Programme für den Host / PC?

Das Makefile ist für den Analyzer unter LINUX.

IRMP läuft auf AVR, XMega, PIC, STM32, STM8, TI, ESP und diversen 
ARM Cortex.

Um das Projekt für AVR zu bauen, müsstest Du schon ein paar Blicke in 
den Artikel IRMP werfen, insbesondere in das Kapitel 
IRMP: Source-Code.

Zitat:
------------------------- Schnipp -----------------------
Der Source-Code lässt sich einfach für AVR-µCs übersetzen, indem man 
unter Windows die Projekt-Datei irmp.aps in das AVR Studio 4 lädt.

Für andere Entwicklungsumgebungen ist leicht ein Projekt bzw. Makefile 
angelegt. Zum Source gehören:

    irmp.c - Der eigentliche IR-Decoder
    irmpprotocols.h - Sämtliche Definitionen zu den IR-Protokollen
    irmpsystem.h - Vom Zielsystem abhängige Definitionen für 
AVR/PIC/STM32
    irmp.h - Include-Datei für die Applikation
    irmpconfig.h - Anzupassende Konfigurationsdatei
------------------------- Schnapp -----------------------

Beachte auch bitte die Hinweise zu den Konfigurationsparametern: 
IRMP: Konfiguration

: Bearbeitet durch Moderator
von eku (Gast)


Lesenswert?

Armin J. schrieb:
> Und auf dem AVR machst du IRMP nativ? Das ist mutig, ich hab mir das
> nicht angetan.

Von mir stammt sogar die Integration in Ethersex (www.ethersex.de, 
https://github.com/ethersex/ethersex).

von Joachim B. (jar)


Angehängte Dateien:

Lesenswert?

Armin J. schrieb:
> Und auf dem AVR machst du IRMP nativ? Das ist mutig, ich hab mir das
> nicht angetan.

das war easy, vielleicht einfacher als ich meinen ersten nativen AVR 
Timer zur Camauslösung gebaut hatte irgendwann um 2007

achnee das war noch mit
/*                      RC5 Remote Receiver 
*/
/*              Author: Peter Dannegger 
*/

IRMP erst mit Timer2 2011
nachdem das Display 2x zu früh aufgab nie fertig gebaut

IRMP also erst in wordclock12h eingesetzt 2015

: Bearbeitet durch User
von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Wie deaktiviert man denn ANALYZE, d.h. Anzeige der 01-Darstellung ohne 
die Anzeige der Protokoll-Parameter zu deaktivieren?

-UANALYZE hat keinen Effekt, und -DANALYZE=0 führt zu Fehlern...

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Die Version 3.2.0 ist online.

Neuerungen:

- 22.06.2020: Unterstützung von 433MHz Funkprotokollen (RF)
- 22.06.2020: "Neues Protokoll:" RF_GEN24
- 22.06.2020: "Neues Protokoll:" RF_X10

Das generische Protokoll RF_GEN24 wird von vielen Handfernbedienungen 
für Funsteckdosen und Garagentoröffnern verwendet, z.B. Pollin 550666. 
Ich habe da noch mindestens drei andere Fernbedienungen gefunden, die 
dasselbe Protokoll verwenden.

Das Protokoll RF_X10 wird von einer PC-Funkfernbedienung verwendet, die 
ebenso bei Pollin unter der Bestellnr. 721815 erhältlich ist und 
ursprünglich von Medion stammt. Mit über 40 Tasten und sogar einem 
Rollrad ist sie vielseitig einsetzbar, z.B. um damit Funkbrücken zu 
IRSND (in einem anderen Raum) zu bauen - oder ähnliches. Kosten: 
Schlappe 75 Cent.

Da die 433 MHz Funkempfänger im Gegensatz zu den IR-TSOPs mit aktivem 
High-Pegel arbeiten, gibt es in irmpconfig.h dafür eine neue 
Konfigurationsvariable:
1
#define IRMP_HIGH_ACTIVE 0

Diese ist für Funkempfänger auf 1 zu ändern. Für IR-Anwendungen ändert 
sich nichts.

Die Software wurde im Artikel aktualisiert, die entsprechenden Stellen 
bzgl. Funktionsumfang und Konfiguration wurde angepasst. Im Laufe dieser 
Woche werde ich noch ein paar Bilder von diversen Funkfernbedienungen 
einstellen und auch noch ein neues Kapitel zu geeigneten Empfängern 
hinzufügen.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Johann L. schrieb:
> Wie deaktiviert man denn ANALYZE, d.h. Anzeige der 01-Darstellung
> ohne die Anzeige der Protokoll-Parameter zu deaktivieren?
>
> -UANALYZE hat keinen Effekt, und -DANALYZE=0 führt zu Fehlern...

Redest Du jetzt von der Host-Version oder von der AVR-Version?

AVR: ANALYZE-Ausgaben überhaupt nicht sinnvoll, schon gar nicht in einer 
ISR. Hier könnte man addr, cmd, flags aber nach irmp_get_data() in der 
main-Funktion ausgeben - auch den Protokollnamen, wenn gewünscht.

Host: ANALYZE wird hier in irmpsystem.h gesetzt, nämlich für Windows und 
Linux.

Wenn ich es richtig verstehe, möchtest Du die 01-Ausgaben unterdrücken, 
die Protokoll-Daten (addr, cmd, flags) aber ausgeben? Da wird im Code 
jedoch nicht unterschieden. Man könnte noch ein ANALYZE-Level oder eine 
Maske implementieren, um bestimmte ANALYZE-Ausgaben auszumaskieren.

Bisher bin ich allerdings der Einzige, der irmp überhaupt auf einem Host 
nutzt. Von daher habe ich mir über solche Ideen überhaupt keine Gedanken 
gemacht.

Was hast Du denn vor?

P.S.
Workaround:
1
./irmp-10kHz <IR-Data/nec.txt | sed 's/.*\(p=\)/\1/g'

: Bearbeitet durch Moderator
von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Von der AVR-Variante.  Da sieht die Ausgabe z.B. aus wie unten; mit 
würde ersma die Ausgabe der oberen Zeile genügen.

Momentan stellt sich die Ausgabe auf einem Terminal so dar:
1
protocol: 0x02   NEC   address: 0xEF00   command: 0x0003   flags: 0x01
2
00000000000000000000000000000000000000000000000000000000000000000000000000000000
3
00000000000000000000000000000000000000000000000000000000111111111111111111111111
4
11111111111111111111111111111111111111111000000000011111110000000000111111100000
5
00001111111000000000011111110000000000111111100000000001111110000000000111111100
6
00000000111111100000000001111111111111111111111110000000001111111111111111111111
7
11000000000011111111111111111111111000000000011111111111111111111111100000000001
8
11111000000000011111111111111111111111110000000001111111111111111111111110000000
9
00111111111111111111111111000000000011111111111111111111111100000000011111111111
10
11111111111110000000000111111100000000011111110000000000111111100000000001111111
11
00000000001111110000000000111111100000000001111111000000000011111110000000000111
12
11111111111111111111100000000011111111111111111111111100000000001111111111111111
13
11111110000000000111111111111111111111111000000000111111111111111111111111000000
14
00001111111111111111111111100000000001111111111111111111111111111111111111111111
15
11111111111111111111111111111111111111111111111111111111111111111111111111111111
16
11111111111111111111111111111111111111111111111111111111111111111111111111111111
17
11111111111111111111111111111111111111111111111111111111111111111111111111111111
18
11111111111111111111111111111111111111111111111111111111111111111111111111111111
19
11111111111111111111111111111111111111111111111111111111111111111111111111111111
20
11111111111111111111111111111111111111111111111111111111111111111111111111111111
21
11111111111111111111111111111111111111111111111111111111111111111111111111111111
22
11111110000000000000000000000000000000000000000000000000000000000000000000000000
23
00000000000000000000000000000000000000000000000000000000000000111111111111111111
24
11111111111111000000000011111111111111111111
25
                                            00011111111111111111111
26
                                                                   0000111111111
27
11111111111
28
           0000011111111111111111111
29
                                    00011111111111111111111
30
                                                           000111111111111111111
31
11
32
  00011111111111111111111
33
                         00011111111111111111111
34
                                                00011111111111111111111
35
                                                                       000111111
36
11111111111111
37
              00011111111111111111111
38
                                     00011111111111111111111
39
                                                            00001111111111111111
40
1111
41
    00011111111111111111111

von Joachim B. (jar)


Lesenswert?

Frank M. schrieb:
> - 22.06.2020: Unterstützung von 433MHz Funkprotokollen (RF)

das ist hochinteressant, hat du Kenntnis über die Marmitek IR 
Transmitter?
https://www.reichelt.de/marmitek-ir-funkuebertragungssystem-marmitek-08900-p50081.html

Ich habe davon einige im Einsatz, auch eine alte Marmitek FB die sendet 
aber mittlerweile zu wenig Platz für Codes hat.

Ein Sendemodul in eine FB zu integrieren wäre klasse.

Ich weiss aber immer noch nicht ob die auf 433 MHz senden oder 866/868 
MHz

Die Stabantenne ist bei einem RF Empfänger 17 cm also sieht nach 433MHz 
aus und beim anderen 30cm keine Ahnung.

Natürlich kann eine Stabantenne Lambda/4 oder abweichend haben, entweder 
mit Verlängerungsspule oder Verkürzungskondensator, ich habe die noch 
nicht zerlegt.

: Bearbeitet durch User
von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Frank M. schrieb:
> AVR: ANALYZE-Ausgaben überhaupt nicht sinnvoll, schon gar nicht in einer
> ISR.

Keine Ahnung wo Du das ausgibst, ich hab's aktiviert um rauszufinden, 
welches Protokoll überhaupt verwendet wird von dem Bleil-Schrott den ich 
mir da gekauft habe...

Compiliert hab ich mit
1
-DIRMP_LOGGING -DIRMP_PROTOCOL_NAMES -DF_CPU=22118400UL -DBAUD=19200UL

Übrigens wird BAUD im Code 2× hart codiert; ich musste das 
auskommentieren um die Baudrate von Kommandozeile aus setzen zu können.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Johann L. schrieb:
> Von der AVR-Variante.

Lösung: Auf AVR die lediglich für Debugging-Zwecke gedachte Konstante 
ANALYZE nicht verwenden, sondern einfach in main() schreiben:
1
   IRMP_DATA irmp_data;
2
3
   while (1)
4
   {
5
       if (irmp_get_data (&irmp_data))
6
       {
7
            printf ("p=%2d a=0x%04x c=0x%04x f=0x%x\n",
8
                    irmp_data.protocol,
9
                    irmp_data.address,
10
                    irmp_data.command,
11
                    irmp_data.flags);
12
       }
13
    }

: Bearbeitet durch Moderator
von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Johann L. schrieb:
> Keine Ahnung wo Du das ausgibst, ich hab's aktiviert um rauszufinden,
> welches Protokoll überhaupt verwendet wird von dem Bleil-Schrott den ich
> mir da gekauft habe...

Siehe Beispiel aus meinem Beitrag obendrüber.

> Compiliert hab ich mit -DIRMP_LOGGING -DIRMP_PROTOCOL_NAMES
> -DF_CPU=22118400UL -DBAUD=19200UL

Wenn Du den Protokollnamen auch noch ausgeben möchtest, dann ändert sich 
das obige printf() zu:
1
            printf ("p=%2d n=%s a=0x%04x c=0x%04x f=0x%x\n",
2
                    irmp_data.protocol,
3
                    irmp_protocol_names[irmp_data.protocol],
4
                    irmp_data.address,
5
                    irmp_data.command,
6
                    irmp_data.flags);

> Übrigens wird BAUD im Code 2× hart codiert; ich musste das
> auskommentieren um die Baudrate von Kommandozeile aus setzen zu können.

Danke, schaue ich mir an.

: Bearbeitet durch Moderator
Beitrag #6312104 wurde vom Autor gelöscht.
von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Johann L. schrieb:
> Compiliert hab ich mit -DIRMP_LOGGING -DIRMP_PROTOCOL_NAMES
> -DF_CPU=22118400UL -DBAUD=19200UL

Wirf -DIRMP_LOGGING noch raus, das protokolliert jeden Pegelwechsel. 
Brauchst Du aber nicht. Die LOGGING-Routinen sind dafür da, um aus den 
IR-Frames Samples auf der Console zu erstellen.

Jetzt weiß ich auch, warum bei Dir 2x BAUD definiert ist. Du benutzt 
sowohl die UART-LOGGING-Routinen aus irmp.c als auch die aus 
irmp-main-avr-uart.c. Das passt natürlich nicht.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Johann L. schrieb:
> Bleil-Schrott

Habs jetzt im Artikel gelesen. ;-)

Ja, das sind billigste Fernbedienungen, die man für 50 Cent beim 
Chinesen um die Ecke nachkaufen kann. Die verwenden alle durch die Bank 
das NEC-Protokoll mit derselben Adresse 0xFE00. Suchst Du da nach einer 
Alternative oder möchtest da selber eine bauen?

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Joachim B. schrieb:

> das ist hochinteressant, hat du Kenntnis über die Marmitek IR
> Transmitter?

Nein.

> Ich habe davon einige im Einsatz, auch eine alte Marmitek FB die sendet
> aber mittlerweile zu wenig Platz für Codes hat.

Was heisst das? Ist das eine IR-FB oder eine RF-FB? Wieviele Codes 
brauchst Du denn bzw. was machst Du damit? IR empfangen, RF übertragen 
und dann wieder als IR ausgeben?

> Ein Sendemodul in eine FB zu integrieren wäre klasse.

Ein RF-Sendemodul? Ich habe mittlerweile auch IRSND prototypisch mit 
einem RF-Sender ausgestattet, die Veröffentlichung eines neuen 
IRSND-Releases dauert aber noch etwas. Vorher muss ich noch die 
Abschaltung der IR-Modulation parametrisieren, damit man das allgemein 
verwenden kann.

> Ich weiss aber immer noch nicht ob die auf 433 MHz senden oder 866/868
> MHz

Steht im Datenblatt bei Reichelt: Frequency  433.92 MHz.

Schau Dir mal https://www.pollin.de/p/pc-funkfernbedienung-x10-721815 
an. Diese Funkfernbedienung hat über 40 Tasten und kann von IRMP 
dekodiert werden. Per IRSND könntest Du dann wieder IR-Signale für das 
Endgerät (TV o.ä.) generieren.

: Bearbeitet durch Moderator
von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Frank M. schrieb:
> Johann L. schrieb:
>> Bleil-Schrott
>
> Habs jetzt im Artikel gelesen. ;-)
>
> Ja, das sind billigste Fernbedienungen, die man für 50 Cent beim
> Chinesen um die Ecke nachkaufen kann. Die verwenden alle durch die Bank
> das NEC-Protokoll mit derselben Adresse 0xFE00. Suchst Du da nach einer
> Alternative oder möchtest da selber eine bauen?

Nach ca. 2 Wochen hat das Ding rumgesponnen um nur noch grell türkis zu 
leuchten no matter what.  Erneuerung der Betterie der Fernbedienung 
brachte nix, und als ich das Steuermodul aufgeschraut hatte sah ich dass 
ein Transistor offenbar einen auf Geysir gemacht hatte.

Ergo: Die Fernbedienung will ich weiter verwenden aber ein neues 
Steuermodul bauen, mit richtig dimensionierten FETs und mit höherer 
PWM-Frequenz so dass die LED-Streifen nicht mehr (merklich) flackern, 
also > 200 Hz oder so.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Johann L. schrieb:
> Die Fernbedienung will ich weiter verwenden aber ein neues Steuermodul
> bauen

Danke für die Info. Läuft der IRMP denn nun bei Dir wunschgemäß? Sollten 
noch Probleme auftreten, melde Dich einfach.

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Frank M. schrieb:
> Johann L. schrieb:
>> Die Fernbedienung will ich weiter verwenden aber ein neues Steuermodul
>> bauen
>
> Danke für die Info. Läuft der IRMP denn nun bei Dir wunschgemäß? Sollten
> noch Probleme auftreten, melde Dich einfach.

War easy zum Laufen zu bringen, und NEC-Protokoll (0x2) wird auch 
erkannt; RC5 allerdings nicht, z.B.
1
00000000000000011111111111100000000000000111111111111000000000000000000000000000
2
00111111111111000000000000001111111111110000000000000001111111111110000000000000
3
00111111111110000000000000001111111111110000000000000001111111111110000000000000
4
01111111111110000000000000001111111111110000000000000001111111111110000000000000
5
0111111111111111111111111100000000000000011111111111111111111

ATmega168 @ 22.1184 MHz

...und was etwas nervig ist sind die überlangen Code-Zeilen in den 
Quellen.

: Bearbeitet durch User
von Joachim B. (jar)


Angehängte Dateien:

Lesenswert?

Frank M. schrieb:
> Nein.

schade

Frank M. schrieb:
> Was heisst das? Ist das eine IR-FB oder eine RF-FB? Wieviele Codes
> brauchst Du denn bzw. was machst Du damit? IR empfangen, RF übertragen
> und dann wieder als IR ausgeben?

genaugenommen habe ich 2

1.
https://cdn-reichelt.de/documents/datenblatt/X600/Powermid_XL.pdf

die konnte eh zu wenig Code lernen und speichern, schon nach der Hälfte 
der angelernten Tasten war der Speicher voll.

2. dito
https://www.bedienungsanleitu.ng/thumbs/products/l/84244-marmitek-easy-icon-10-rf.jpg
Trotz toller Multiauswahl mit Display, nach nur einer FB mit halben 
Tastencodes war Schluß.

Beide lernen IR und senden IR und RF, die Empfänger im Wohnzimmer senden 
dann IR an die Video/DVD Recorder, || Pause, > Play, << fast rewind, >> 
fast wind, STOP.

Frank M. schrieb:
> Steht im Datenblatt bei Reichelt: Frequency  433.92 MHz.

wozu dann 30cm Antenne, ach egal!

Frank M. schrieb:
> Schau Dir mal https://www.pollin.de/p/pc-funkfernbedienung-x10-721815
> an.

gerne, nur wie hoch ist deren Speicher?
Ich bin ja was Speichertiefe bei beiden Marmitek reingefallen, wenn die 
nicht mal Platz für alle eigenen Tasten Codes aufnehmen?
Ich verlange ja nicht mal das mehr Tasten etwa soviel wie die 
angelernten FB benutzt werden können als die RF FB besitzt, aber 
mindestens die sollten doch belegt werden können.

Bis jetzt habe ich mir den Bau eines IRSND sparen können, weil ich 
daheim gerne die Pyramiden nutze, soll ja nicht eine never ending 
Bastelstunde werden ohne Gehäuse wie meine 433 MHz Rolladen 
Fernbedienungen vom nano.

v1 2015
https://www.mikrocontroller.net/attachment/276364/rolladen.jpg

v2 2017 Anhang Bild

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


Lesenswert?

Joachim B. schrieb:
> Frank M. schrieb:
>> Schau Dir mal https://www.pollin.de/p/pc-funkfernbedienung-x10-721815
>> an.
>
> gerne, nur wie hoch ist deren Speicher?

Die hat gar keinen, sie ist nicht anlernbar. Die Intelligenz müsstest Du 
schon in IRMP (empfangen der Funksignale) und anschließendem Senden per 
IRSND reinstecken. Gewiss sollte da der Speicher eines entsprechenden 
AVR-µCs ausreichen.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Johann L. schrieb:
> War easy zum Laufen zu bringen, und NEC-Protokoll (0x2) wird auch
> erkannt; RC5 allerdings nicht,

Das wundert mich aber, das ist eines der bestgetesteten Protokolle. Du 
hast RC5 auch in irmpconfig.h freigeschaltet?

von Joachim B. (jar)


Lesenswert?

Frank M. schrieb:
> Die hat gar keinen,

also nur ein FB Gehäuse?
Das verstehe ich gerade nicht!

der Link funktioniert nicht
 Verfügbare Downloads:
    Download Beschreibung

am raspi ging es!

egal aber heftig
2,25 € 3 Stk
5,95 € Versandkosten
----
8,20€

bestellt, nun erst mal lesen!

"Ist der Funkkanal des Empfängers bekannt, stellen Sie die Fernbedienung 
wie unten beschrieben auf den entsprechenden
Funkkanal ein.
1. SELECT-Taste drücken bis die LED erlischt (ca. 5 Sekunden).
2. Die Häufigkeit des LED-Blinkens entspricht dem eingestellten Kanal 
(1...16)
3. Die LED leuchtet nach dem Blinken dauerhaft - ein neuer Kanal kann 
jetzt vergeben werden
4. Zum Ändern des Kanals die gewünschte Kanalnummer mit der 
Fernbedienungstastatur eingeben (1...16)
und mit der SELECT-Taste bestätigen.
5. Die LED blinkt erneut in der Häufigkeit des neu eingestellten Kanals
6. Der gewünschte Kanal ist jetzt aktiv - die Fernbedienung kann 
verwendet werden

Ich verstehe immer noch Bahnhof....
Ein AVR mit IRSND hat keinen Funkempfänger, ein Nano keinen Port für USB
Kanäle muss ich in der FB vergeben?

Wie soll denn mit IRSND eine RF IR Brücke werden?

: Bearbeitet durch User
von Klaus R. (klaus2)


Lesenswert?

Joachim B. schrieb:
> also nur ein FB Gehäuse?
> Das verstehe ich gerade nicht!

Nein. Eine FB die statt IR 433MHz nutzt. Das Protokoll kennt irmp und 
das wars. Den 433MHz Empfänger brauchste noch...

Klaus.

von Klaus R. (klaus2)


Lesenswert?

Joachim B. schrieb:
> Wie soll denn mit IRSND eine RF IR Brücke werden?

Ich denke schon länger eher über einen BT -> IR / RF Hub 
nach...allerdings sind die Protokolle meiner Funksteckdose eher komplex 
und ne SCHÖNE BT app braucht auch Zeit. Dann wär endlich alles übers 
smartphone Bedienbar und die FB immer "dabei".

Gibts da schon ein Projekt?

Klaus.

von Joachim B. (jar)


Lesenswert?

Klaus R. schrieb:
> Den 433MHz Empfänger brauchste noch...
>
> Klaus.

also sowas:
https://www.ebay.de/i/173291278318
die einzigen Empfänger die was taugen, jedenfalls bei mir.
Mit den Sendern:
https://www.ebay.de/itm/1-5X315-433-Mhz-RF-Sender-Empfanger-Receiver-Modul-Arduino-Wireless-Transmitter/232682854622
kann man ja arbeiten, die nutze ich selber, die dazugehörigen Empfänger 
sind für den Elektronik Schrott!

https://www.ebay.de/itm/253065971465
gerade bestellt, meine anderen liegen in der Werkstatt!

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


Lesenswert?

Joachim B. schrieb:
> Frank M. schrieb:
> Die hat gar keinen,
>
> also nur ein FB Gehäuse?
> Das verstehe ich gerade nicht!

Ich meinte: Die FB hat keine Möglichkeit, etwas anzulernen. Die Codes, 
die sie absendet, sind fix.

> "Ist der Funkkanal des Empfängers bekannt, stellen Sie die Fernbedienung
> wie unten beschrieben auf den entsprechenden
> Funkkanal ein.

Brauchst Du nicht zu machen, die Dinger funktionieren out-of-the-box. 
Einfach Batterien rein und fertig.

> Wie soll denn mit IRSND eine RF IR Brücke werden?

RF-Sender -----> RF-Empfänger -----> IR-Sender -------> TV

Den RF-Empfänger und IR-Sender packst Du mittels IRMP/IRSND auf einen 
µC.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Joachim B. schrieb:

> also sowas:
> https://www.ebay.de/i/173291278318

Jepp, die RXB6-Module (Stichwort Superheterodyne) sind ganz gut, vor 
allem sind sie trennschärfer als die Pendelaudion-Empfänger, welche auch 
den ganzen Müll mit aufsaugen. Allerdings haben sie einen kleinen 
Nachteil: Sie verschlucken meist die ersten ein bis zwei Bits vom ersten 
gesandten Frame. Es dauert wohl ein wenig, bis sie sich eingeschossen 
haben. Macht aber nichts: Alle RF-Sender, die ich kenne, wiederholen die 
Daten ständig, solange Du den Finger auf dem Knopf hältst. Der zweite 
Frame wird dann von IRMP einwandfrei erkannt.

> Mit den Sendern:
> Ebay-Artikel Nr. 232682854622
> kann man ja arbeiten, die nutze ich selber, die dazugehörigen Empfänger
> sind für den Elektronik Schrott!

Ja, das sind die Pendelaudion-Empfänger, die sehr störanfällig sind. 
Allerdings verschlucken sie keine Daten wie die RXB6. IRMP wird durch 
die vielen Störimpulse zwar etwas mehr beschäftigt, kann aber bereits 
den ersten Frame sauber erkennen. Die Decodierung ist hier also ein 
wenig schneller.

Insgesamt plädiere ich auch für die Superheterodyne-Empfänger. Muss aber 
nicht unbedingt ein RXB6 sein, die RXB8-Module sollen ähnlich gut sein, 
sind aber von mir noch ungetestet.

Ein Stück Draht von 17 cm Länge als Antenne hilft ungemein, wenn man 
mehr als nur 1-2 Meter überbrücken möchte.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Johann L. schrieb:
> RC5 allerdings nicht,
> z.B.00000000000000011111111111100000000000000111111111111000000000000000 
000000000000
> 001111111111110000000000000011111111111100000000000000011111111111100000 
00000000
> 001111111111100000000000000011111111111100000000000000011111111111100000 
00000000
> 011111111111100000000000000011111111111100000000000000011111111111100000 
00000000
> 0111111111111111111111111100000000000000011111111111111111111
>

Ich habe gerade mal die obigen Daten in einer Text-Datei "d.txt" 
gespeichert und irmp drüber laufen lassen:
1
./irmp-15kHz < d.txt
2
1100000000001 p= 7 (RC5), a=0x0000, c=0x0001, f=0x00

Dein RC5-Frame wird also einwandfrei erkannt. Ich kann mir da nur zwei 
Konstellationen vorstellen:

1. RC5 ist nicht freigeschaltet in irmpconfig.h

2. Du hast noch weitere Protokolle freigeschaltet, wobei eines der 
anderen bzgl. Startbit als Kriterium zur Protokollauswahl in Konflikt 
mit RC5 steht.

Mir ist allerdings kein anderes Protokoll aus dem Kopf bekannt, welches 
mit RC5 bzgl. Startbit kollidiert. Hier wäre interessant zu wissen, 
welche IR-Protokolle Du in irmpconfig.h freigeschaltet hast.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Klaus R. schrieb:
> Ich denke schon länger eher über einen BT -> IR / RF Hub
> nach...allerdings sind die Protokolle meiner Funksteckdose eher komplex
> und ne SCHÖNE BT app braucht auch Zeit. Dann wär endlich alles übers
> smartphone Bedienbar und die FB immer "dabei".
>
> Gibts da schon ein Projekt?

Ich habe so etwas mal gemacht vor 5 Jahren:

https://www.mikrocontroller.net/articles/Remote_IRMP

Das Projekt könnte man nochmal aufleben lassen.

Zu den "komplexen RF-Protokollen" Deiner Funksteckdose: Du könntest mit 
dem aktuellen IRMP mal Samples erstellen.

Einen RF-Empfänger an den aktuellen IRMP und
1
#define IRMP_LOGGING     1
2
#define IRMP_HIGH_ACTIVE 1

einstellen und dann die gesampelten Frames per Terminalemulation (PuTTY) 
kopieren.

: Bearbeitet durch Moderator
von Johann L. (gjlayde) Benutzerseite


Angehängte Dateien:

Lesenswert?

Frank M. schrieb:
> Johann L. schrieb:
>> RC5 allerdings nicht,
>>
> z.B.00000000000000011111111111100000000000000111111111111000000000000000 
000000000000
>> 001111111111110000000000000011111111111100000000000000011111111111100000 
00000000
>> 001111111111100000000000000011111111111100000000000000011111111111100000 
00000000
>> 011111111111100000000000000011111111111100000000000000011111111111100000 
00000000
>> 0111111111111111111111111100000000000000011111111111111111111
>>
>
> Ich habe gerade mal die obigen Daten in einer Text-Datei "d.txt"
> gespeichert und irmp drüber laufen lassen:
1
> ./irmp-15kHz < d.txt
2
> 1100000000001 p= 7 (RC5), a=0x0000, c=0x0001, f=0x00
> Dein RC5-Frame wird also einwandfrei erkannt. Ich kann mir da nur zwei
> Konstellationen vorstellen:
>
> 1. RC5 ist nicht freigeschaltet in irmpconfig.h

Ich hab den default verwendet (bis auf BAUD), und da ist RC5 wohl nicht 
daber...

Nochwas zum Coding:

Die Variablen im Static Storage sind meist frei flottierende 8-Bit, 
16-Bit oder 32-Bit Werte.  Fasst man dieser zu einer Struktur zusammen 
und greift indirekt darauf zu, kann man einiges an Code(größe) sparen 
ohne den Code langsamer zu machen.

Beispiel für AVR ATmega168 mit allen Protokollen aktiviert (und Warings 
ignoriert):

Direkter Zugriff: 8256 Bytes
Indirekt Zugriff: 6964 Bytes (85% Codegröße)

Aktiviere ich nur NEC, das Protokoll auf das ich's abgesehen hab, dann:

Direkter Zugriff: 1978 Bytes
Indirekt Zugriff: 1656 Bytes (84% Codegröße)

Compiliert mit avr-gcc-v8 -Os (ohne LTO).

Anbei ein Delta, welches das Prinzip zeigt.

Zugriff ist:
1
    irmp_t *ir = &irmp;
2
    __asm ("" : "+r" (ir));
3
4
    if (ir->ir_detected)
5
    {
6
        switch (ir->protocol)
7
        ...
etc. anstatt auf irmp_protocol im Original

Das __asm dient dazu, die Adresse von irmp vor GCC zu verstecken. 
Kommentiert man das __asm aus, etwa per
1
#define __asm(...) (void) 0
so steigt die Codegröße auf den Wert für (direkter Zugriff) weil GCC 
trotz indirekter Adressierung die Adresse kenn (bzw. Offset auf Symbol 
irmp ).

_______________

Und es gibt ganz viele Codestellen ähnlich der folgenden:
1
#ifdef ANALYZE
2
                    ANALYZE_PRINTF("Info IR60: got start instruction frame\n");
3
#endif // ANALYZE
wobei
1
#ifdef ANALYZE
2
...
3
#  define ANALYZE_PRINTF(...)                   { if (verbose)              { printf (__VA_ARGS__); } }
4
...
5
#else
6
...
7
#  define ANALYZE_PRINTF(...)
8
...
9
#endif

Man könnte den Code alse etwas kompakter schreiben, indem man das #ifdef 
ANALYZE einfach rauswirft.

Je nach Code kann das Warnings geben, etwa wenn die einzige Verwendung 
einer (lokalen) Variablen als Argument von ANALYZE_PRINTF ist.  In dem 
Fall kann man folgendes machen:
1
#ifdef ANALYZE
2
static const bool analyze = true;
3
#else
4
static const bool analyze = false;
5
#endif
6
7
#define ANALYZE_PRINTF(...) \
8
    do { \
9
       if (analyze) if (verbose) printf (__VA_ARGS__); } \
10
    while (0)

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Johann L. schrieb:
> Zugriff ist:    irmp_t *ir = &irmp;

Danke erstmal für den Tipp.

> Das __asm dient dazu, die Adresse von irmp vor GCC zu verstecken.
> Kommentiert man das __asm aus, etwa per#define __asm(...) (void) 0
> so steigt die Codegröße auf den Wert für (direkter Zugriff) weil GCC
> trotz indirekter Adressierung die Adresse kenn (bzw. Offset auf Symbol
> irmp ).

Das klappt dann aber nur für avr-gcc. Für die anderen µCs lasse ich dann 
das asm-Statement weg - wobei dann für diese µCs nichts gewonnen ist, 
richtig?

> Man könnte den Code alse etwas kompakter schreiben, indem man das #ifdef
> ANALYZE einfach rauswirft.

Genau das_ hatte ich vorher genau _so gemacht, nämlich so:
1
#else
2
#  define ANALYZE_PUTCHAR(a)
3
#  define ANALYZE_ONLY_NORMAL_PUTCHAR(a)
4
#  define ANALYZE_PRINTF(...)
5
#  define ANALYZE_ONLY_NORMAL_PRINTF(...)
6
#  define ANALYZE_NEWLINE()

Dann konnte man einfach schreiben:
1
   ...
2
   analyze_printf (foo, bar);
3
   ...

Du findest diese leeren Macros sogar noch in irmp.c, aber nur nur noch 
in auskommentierter Form:
1
/*******************************                not every C compiler knows variadic macros :-(
2
#else
3
#  define ANALYZE_PUTCHAR(a)
4
#  define ANALYZE_ONLY_NORMAL_PUTCHAR(a)
5
#  define ANALYZE_PRINTF(...)
6
#  define ANALYZE_ONLY_NORMAL_PRINTF(...)
7
#  endif
8
#  define ANALYZE_NEWLINE()
9
*********************************/
10
#endif

Das Problem: Nicht jeder Compiler kennt Variadic Macros, z.B. der 
PIC-Compiler. Aus diesem Grund hatte ich dann nachträglich alle Aufrufe 
von irgendwelchen analyze_printf() nochmal durch diese wirklich 
unschönen Blöcke
1
#ifdef ANALYZE
2
   analyze_printf (foo, bar);
3
#endif // ANALYZE
zusätzlich gekapselt, was den Source dann richtig hässlich macht.

Sag mir, wie ich das durch einen NON-gcc in der Variante, dass ANALYZE 
"#undefed" ist, bekomme und ich machs - sogar sehr gern.

P.S.
Beispiel: Der PIC-Compiler XC8 kann "nur" C89, Variadic Macros gibt es 
erst ab C99.

: Bearbeitet durch Moderator
von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Ich habe hier

  https://stackoverflow.com/questions/27663053/variadic-macros-alternative-in-ansi-c

eine Alternative zu Variadic Macros gefunden, die auch mit C89-Dialekt 
funktioniert:
1
#ifdef ANALYZE
2
#define analyze_printf(args)        printf args
3
#else
4
#define analyze_printf(args)        (void) args
5
#endif

Der Aufruf eines solchen Makros müsste dann immer mit Doppelklammern 
erfolgen, also:
1
    analyze_printf ((foo, bar));

Das wäre aber nicht dramatisch.

Wer hat einen XC8-Compiler für PIC und möchte das mal mit mir zusammen 
testen? Ich würde dann eine modifizierte Variante von irmp.c zur 
Verfügung stellten.

Ziel ist es, diese analyze_printf() -Aufrufe samt Evaluierung aller 
Argumente vom Compiler komplett eliminieren zu lassen. Ich hoffe, dass 
der nicht gerade durch "Intelligenz" bestechende XC8 das packt. Nicht, 
dass er die Parameter noch ausrechnet oder gar Stringkonstanten im Flash 
hinterlegt, obwohl sie dann gar nicht genutzt werden.

EDIT:
Alternative wäre, in die Steinzeit zurückzugehen, und für jede 
verschiedene Anzahl von Argumenten ein eigenes analyze_printf() zu 
bauen, also
1
#define analyze_printf1(fmt)     printf(fmt)
2
#define analyze_printf2(fmt,a)   printf(fmt,a)
3
#define analyze_printf3(fmt,a,b) printf(fmt,a,b)
4
usw.

Aber schön ist das nicht, zumindest auf dem Host (Linux, Windows) könnte 
man die Variadic Macros bzw. die oben skizzierte Alternative durchaus 
nutzen.

: Bearbeitet durch Moderator
von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Frank M. schrieb:
> Johann L. schrieb:
>> Zugriff ist:    irmp_t *ir = &irmp;
>
> Danke erstmal für den Tipp.
>
>> Das __asm dient dazu, die Adresse von irmp vor GCC zu verstecken.
>> Kommentiert man das __asm aus, etwa per#define __asm(...) (void) 0
>> so steigt die Codegröße auf den Wert für (direkter Zugriff) weil GCC
>> trotz indirekter Adressierung die Adresse kenn (bzw. Offset auf Symbol
>> irmp ).
>
> Das klappt dann aber nur für avr-gcc. Für die anderen µCs lasse ich dann
> das asm-Statement weg - wobei dann für diese µCs nichts gewonnen ist,
> richtig?

Ich glaub nicht dass das für andere µCs was bringt.  Je nachdem wie 
schlecht der Compiler optimiert könnte es sogar kontraproduktiv sein.

>> Man könnte den Code also etwas kompakter schreiben, indem man das #ifdef
>> ANALYZE einfach rauswirft.
> [...]
> Das Problem: Nicht jeder Compiler kennt Variadic Macros, z.B. der
> PIC-Compiler.

> Sag mir, wie ich das durch einen NON-gcc in der Variante, dass ANALYZE
> "#undefed" ist, bekomme und ich machs - sogar sehr gern.

Evtl. so? Braucht dann auch keine 2fach-Klammerung, ist allerdings nur 
ein "normales" Makro, kein function-like:
1
#ifdef ANALYZE
2
#define analyze_printf printf
3
#else
4
#define analyze_printf (void)
5
#endif // ANALYZE

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Nochwas: Kann man irgendwie Platz sparen, wenn nur 1 Protokoll genbaucht 
wird und dieses zur Compilezeit bekannt ist? In irmp_ISR() gibt's ja 
folgendes:
1
    if (ir->isr.start_bit_detected)
2
    {
3
        memcpy_P (&irmp.param, irmp_param_p, sizeof (IRMP_PARAMETER));

Der Inhalt von irmp.param ändert sich also nicht (mehr) und ist zur 
Compilezeit bekannt weil irmp_param_p zur Compilezeit bekannt ist?

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Johann L. schrieb:
> Ich glaub nicht dass das für andere µCs was bringt.  Je nachdem wie
> schlecht der Compiler optimiert könnte es sogar kontraproduktiv sein.

Hm, dann ist es wohl nicht sinnvoll, wenn ich allgemein auf
1
    irmp_t *ir = &irmp;

umstelle. Zwei unterschiedliche Schreibweisen im gleichen Source machen 
den Code dann noch unansehlicher. Ich könnte mir da höchstens einen 
Trick per Preprocessor-Makro vorstellen. Irgendwann besteht der Code aus 
mehr Preprocessor-Makros als aus C-Code ;-)

> Evtl. so? [...]
> #define analyze_printf (void)

Danke, das ist schön einfach und ohne Ecken und Kanten. Gefällt mir!

Ich habe es nun so gemacht:
1
#ifdef ANALYZE
2
#  define ANALYZE_PUTCHAR(a)               { if (! silent)             { putchar (a);          } }
3
#  define ANALYZE_ONLY_NORMAL_PUTCHAR(a)   { if (! silent && !verbose) { putchar (a);          } }
4
#  define ANALYZE_PRINTF(...)              { if (verbose)              { printf (__VA_ARGS__); } }
5
#  define ANALYZE_ONLY_NORMAL_PRINTF(...)  { if (! silent && !verbose) { printf (__VA_ARGS__); } }
6
#  define ANALYZE_NEWLINE()                { if (verbose)              { putchar ('\n');       } }
7
static int                                 silent;
8
static int                                 time_counter;
9
static int                                 verbose;
10
#else
11
#  define ANALYZE_PUTCHAR(a)
12
#  define ANALYZE_ONLY_NORMAL_PUTCHAR(a)
13
#if defined (__XC8)                        // XC8 does not support variadic macros
14
#  define ANALYZE_PRINTF                   (void)
15
#  define ANALYZE_ONLY_NORMAL_PRINTF       (void)
16
#else
17
#  define ANALYZE_PRINTF(...)
18
#  define ANALYZE_ONLY_NORMAL_PRINTF(...)
19
#endif
20
#  define ANALYZE_NEWLINE()
21
#endif

Meines Wissens nach ist XC8 der einzige Compiler, der "nur" C89. Sollten 
doch noch andere betroffen sein, kann man die ja noch anfügen.

Damit sind die Blöcke
1
#ifdef ANALYZE
2
...
3
#endif // ANALYZE
weggefallen und es konnten ca. 350 Zeilen eingespart werden :-)

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Johann L. schrieb:
> Kann man irgendwie Platz sparen, wenn nur 1 Protokoll genbaucht wird und
> dieses zur Compilezeit bekannt ist?

Puh, um festzustellen, ob genau ein Protokoll aktiviert ist, müsste man 
alle IRMP_SUPPORT_XXX-Konstanten zusammenaddieren, also:
1
#if IRMP_SUPPORT_SIRCS_PROTOCOL     + \
2
    IRMP_SUPPORT_NEC_PROTOCOL       + \
3
    ...                             + \
4
    IRMP_SUPPORT_RF_X10_PROTOCOL == 1
5
#define IRMP_ONLY_ONE_PROTOCOL_USED 1
6
#else
7
#define IRMP_ONLY_ONE_PROTOCOL_USED 0
8
#endif
Heftig!

> In irmp_ISR() gibt's ja folgendes:
> if (ir->isr.start_bit_detected)
>     {
>         memcpy_P (&irmp.param, irmp_param_p, sizeof (IRMP_PARAMETER));
>
> Der Inhalt von irmp.param ändert sich also nicht (mehr) und ist zur
> Compilezeit bekannt weil irmp_param_p zur Compilezeit bekannt ist?

Ich mache übrigens den memcpy()-Call, um die anschließenden Zugriffe auf 
die Daten zu beschleunigen, da meiner Erfahrung nach ein Pointerzugriff 
im allgemeinen langsamer ist. Ich hätte nämlich hier auch einfach einen 
Pointer setzen können.

Meinst Du, der Aufwand rechtfertigt so etwas? Da kann man alternativ 
auch einen IRMP-Codegenerator schreiben, der einem den IRMP-Source aus 
der Konfiguration generiert. Der könnte dann auch µC-spezifisch 
optimiert werden, wie zum Beispiel Dein ir-Pointer für AVR. Auf die 
Preprocessor-Schlacht könnte man dann größtenteils verzichten.

: Bearbeitet durch Moderator
von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Frank M. schrieb:
> Johann L. schrieb:
>> Kann man irgendwie Platz sparen, wenn nur 1 Protokoll gebraucht wird und
>> dieses zur Compilezeit bekannt ist?
>
> Puh, um festzustellen, ob genau ein Protokoll aktiviert ist, müsste man
> alle IRMP_SUPPORT_XXX-Konstanten zusammenaddieren, also:

Ich dachte eher an sowas: Ich weiß dass ich nur 1 Protokoll verwende 
und wollte fragen, was ich lokal bei mir ändern muss um (noch mehr) 
Platz zu sparen.

Wprd gerne nen ATtiny24 verwenden.  Der Code passt da zwar locker rein, 
aber es soll ja mehr auf den µC als IR-Auswertung...

>> In irmp_ISR() gibt's ja folgendes:
>> if (ir->isr.start_bit_detected)
>>     {
>>         memcpy_P (&irmp.param, irmp_param_p, sizeof (IRMP_PARAMETER));
>>
>> Der Inhalt von irmp.param ändert sich also nicht (mehr) und ist zur
>> Compilezeit bekannt weil irmp_param_p zur Compilezeit bekannt ist?
>
> Ich mache übrigens den memcpy()-Call, um die anschließenden Zugriffe auf
> die Daten zu beschleunigen, da meiner Erfahrung nach ein Pointerzugriff
> im allgemeinen langsamer ist. Ich hätte nämlich hier auch einfach einen
> Pointer setzen können.

irmp.param const zu machen funktioniert nicht, bzw. da werden wohl 
einige Werte gepatcht :-(

Verwenden würde ich __flash.  Das ist im Gegensatz zu pgm_read_xxx 
nämlich transparent: Zum Beispiel compiliert
1
typedef struct { int a, b, c; } abc_t;
2
3
const __flash abc_t abc = { 1234, 5678, 9012 }; 
4
5
int add (int x)
6
{
7
    const __flash abc_t *p = &abc;
8
    return x + p->b + 1;
9
}
zu:
1
add:
2
  subi r24,-47
3
  sbci r25,-23
4
  ret
d.h. der Wert muss zu Laufzeit garnicht mehr aus dem Flash geladen 
werden und kann in Immediates versacken wie hier.

> Meinst Du, der Aufwand rechtfertigt so etwas? Da kann man alternativ
> auch einen IRMP-Codegenerator schreiben, der einem den IRMP-Source aus
> der Konfiguration generiert.

Was dann freilich ein komplett neues Projekt wäre... Und nicht unbedingt 
übersichtlicher? Unterschiedliche Protokolle, unterschiedliche 
Controller / Hosts, unterschiedliche Compiler, ...

> Der könnte dann auch µC-spezifisch
> optimiert werden, wie zum Beispiel Dein ir-Pointer für AVR. Auf die
> Preprocessor-Schlacht könnte man dann größtenteils verzichten.

Ja, das würe es auf jeden Fall übersichtlicher machen. Und in welcher 
Sprache? Python?

von Joachim B. (jar)


Lesenswert?

Johann L. schrieb:
> Python?

ich bekomme Angst, wenn ich an die unterschiedliche Einrückung denke 
TABS SPACES, mal mehr mal weniger Python v2 v3?

neee Python NEVER

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


Lesenswert?

Johann L. schrieb:
> Aktiviere ich nur NEC, das Protokoll auf das ich's abgesehen hab, dann:
>
> Direkter Zugriff: 1978 Bytes
> Indirekt Zugriff: 1656 Bytes (84% Codegröße)

Ich komme mit avr-gcc V4.7.2 für ATtiny24 und nur NEC mit dem 
Original-Source aus dem SVN auf:
1
avr-size irmp.elf
2
   text    data     bss     dec     hex filename
3
   1284       4      39    1327     52f irmp.elf
(LTO eingeschaltet)

Das sind 64% Codegröße. Mit Deiner Optimierung über den direkten Zugriff 
dürfte das noch besser ausfallen.

Sind die neueren avr-gcc sooo viel schlechter geworden?

Protokoll:
1
avr-gcc  -mmcu=attiny24 -Wall -gdwarf-2 -std=gnu99        -flto   -DF_CPU=8000000UL -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -MD -MP -MT irmp.o -MF dep/irmp.o.d  -c  ../irmp.c
2
avr-gcc -mmcu=attiny24 -Os -flto  -Wl,-Map=irmp.map irmp.o irmp-main-avr.o     -o irmp.elf
3
avr-objcopy -O ihex -R .eeprom -R .fuse -R .lock -R .signature  irmp.elf irmp.hex
4
avr-objcopy -j .eeprom --set-section-flags=.eeprom="alloc,load" --change-section-lma .eeprom=0 --no-change-warnings -O ihex irmp.elf irmp.eep || exit 0
5
avr-objdump -h -S irmp.elf > irmp.lss

Johann L. schrieb:
> Wprd gerne nen ATtiny24 verwenden.  Der Code passt da zwar locker rein,
> aber es soll ja mehr auf den µC als IR-Auswertung...

Immer diese Selbstquälerei, nimm einfach einen ATtiny44 ;-)

Okay, ich schaue noch, was sich machen ließe. Ich habe mal testweise den 
memcpy_P() auskommentiert, um zu sehen, was man maximal rausholen 
könnte. Brachte 60 Bytes Ersparnis, also nicht die Welt.

Ich persönlich halte den avr-gcc 4.7.2 immer noch für den besten. Alle 
neuere Versionen erzeugen größeren Code.

: Bearbeitet durch Moderator
von Joachim B. (jar)


Lesenswert?

Frank M. schrieb:
> Ich persönlich halte den avr-gcc 4.7.2 immer noch für den besten. Alle
> neuere Versionen erzeugen größeren Code.

ist mir auch aufgefallen, ich hatte gerade mal die Versionnummer 
ausgeben lassen, der Alte macht das schon gut!

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Joachim B. schrieb:
> Johann L. schrieb:
>> Python?
>
> ich bekomme Angst, wenn ich an die unterschiedliche Einrückung denke
> TABS SPACES, mal mehr mal weniger

Mit einem vernünftigen Editior wie z.B. Emacs merkst du davon überhaupt 
nix.  Emacs etwa erkennt automatisch wie eingerückt wurde und verwendet 
dieses Einrück-Schema.

Einrückung als Teil der Semantik ist vielleicht keine Sternstunde des 
eines Sprachdesigns, aber immerhin vermeidet es Flame-Wars was denn die 
richtige Einrückung sei und wo { oder } zu klatzieren seien.

Emacs fügt bei TAB auch kein Tab ein, sondern geht zu der entsprechenden 
Einrückung (auch in C / C++ etc.).  Falls die Syntax mehrere 
Möglichkeiten bietet, iteriert Emacs sie bei TAB durch.

Alles easy und transparent.  Vielleicht etwas ungewohnt, aber deshalb 
schreiend vor einer Spache wegrennen...?

> Python v2 v3?

Schreib den Code einfach so, dass er für Python v2.7 und v3 passt.  Bei 
> 95% der Anwendungen genügt dafür als erste Zeile (nach einem evtl. 
Shebang)
1
from __future__ import print_function
so dass print in v3-Syntax zu stehen hat.

> neee Python NEVER

Während man in VillalC++ noch in Spezifikation, cppreference.com und 
cplusplus.com wühlt und sich die Haare rauft, ist man in VillaPython 
schon am feiern :-)

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Frank M. schrieb:
> Johann L. schrieb:
>> Aktiviere ich nur NEC, das Protokoll auf das ich's abgesehen hab, dann:
>>
>> Direkter Zugriff: 1978 Bytes
>> Indirekt Zugriff: 1656 Bytes (84% Codegröße)
>
> Ich komme mit avr-gcc V4.7.2 für ATtiny24 und nur NEC mit dem
> Original-Source aus dem SVN auf:
>
1
> avr-size irmp.elf
2
>    text    data     bss     dec     hex filename
3
>    1284       4      39    1327     52f irmp.elf
4
>
> (LTO eingeschaltet)
>
> Das sind 64% Codegröße. Mit Deiner Optimierung über den direkten Zugriff
> dürfte das noch besser ausfallen.
>
> Sind die neueren avr-gcc sooo viel schlechter geworden?

Hier mal meine Codegrößen (in Byte), mit den indirekten Zugriffen wie 
oben:
1
v4.7: 1618
2
v4.9: 1576
3
v7:   1558
4
v8:   1552
Der kleinste Code ist also mit v8, und v4.7 liefert den größten.

Übersetzt für einen ATmege168 weil sich irmp-main-avr-uart.c nicht ohne 
weiters für einen ATtiny24/44/84 übersetzen lässt, vermutlich wegen USI.

Optimierungsoptionen:
1
-Os -flto -ffunction-sections -fdata-sections -mrelax -Wl,--gc-sections
für irmp.c und irmp-main-avr-uart.c.

> Okay, ich schaue noch, was sich machen ließe. Ich habe mal testweise den
> memcpy_P() auskommentiert, um zu sehen, was man maximal rausholen
> könnte.

Das problem ist nicht das memcpy_p, das brauch ja ein paar 
Instruktionen.

Der Haken ist wie gesagt, dass pgm_read_xxx nicht transparent ist, d.h. 
Flash-Zugriffe auf bekannte Adressen im Gegensatz zu __flash nicht 
wegoptimiert werden (können).

> Brachte 60 Bytes Ersparnis, also nicht die Welt.

> Ich persönlich halte den avr-gcc 4.7.2 immer noch für den besten. Alle
> neuere Versionen erzeugen größeren Code.

Siehe oben.

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Frank M. schrieb:
> Johann L. schrieb:
>> Würd gerne nen ATtiny24 verwenden.  Der Code passt da zwar locker rein,
>> aber es soll ja mehr auf den µC als IR-Auswertung...
>
> Immer diese Selbstquälerei, nimm einfach einen ATtiny44 ;-)

Hab hier noch nen ATtiny24 und 'nen LED-Streifen anzusteuern ist ja 
keine Rocket-Science...

Wird ausgenutzt, dass nur 1 Protokoll (NEC) verwendet wird, schrumpft 
der Code um 150 Bytes, und ohne UART wird er um weitere 300 Byte 
kleiner.

Das memcpy_P ist dabei noch nicht aufgelöst; "Problem" von NEC ist, dass 
es eigentlich 2 Protokolle sind: eines für "normale" Codes und eines für 
Widerholungen.  Löse ich die Gemainsamkeiten von nec_param und 
nec_rep_param auch noch auf, komme ich auf unter 1000 Bytes Code.  Wird 
also lockerst in einen ATtiny24 passen :-)

von Lorand U. (Gast)


Lesenswert?

Schönes Projekt!

Nur aus Interesse:
Gibt es einen bestimmten Grund warum der Receiver Pin so oft abgefragt 
wird (10-20kHz), anstatt die Pegeländerungen mit einem Interrupt zu 
detektieren und in der Interrupt Routine die Zeit zwischen den Aufrufen 
zu messen?
Könnte man sich da nicht einiges an Prozessorlast sparen?

von Armin J. (arminj)


Lesenswert?

Lorand U. schrieb:
> Gibt es einen bestimmten Grund warum der Receiver Pin so oft abgefragt
> wird (10-20kHz), anstatt die Pegeländerungen mit einem Interrupt zu
> detektieren und in der Interrupt Routine die Zeit zwischen den Aufrufen
> zu messen?
> Könnte man sich da nicht einiges an Prozessorlast sparen?

1. Nicht alle Protokolle lassen sich mit der Interrupt Methode erkennen, 
das Problem ist die Erkennung wann das Protokoll zu Ende ist.
2. Die Arduino Library Version von IRMP https://github.com/ukw100/IRMP 
hat die Interrupt Methode eingebaut!

von Lorand U. (Gast)


Lesenswert?

Armin J. schrieb:
> 1. Nicht alle Protokolle lassen sich mit der Interrupt Methode erkennen,
> das Problem ist die Erkennung wann das Protokoll zu Ende ist.

Das versteh ich nicht.
Wenn eine gewisse Zeit lang kein Pinchange mehr passiert, weiß ich dass 
das Signal zuende ist.
Genauso ist es aber auch wenn ich alle 50µs (20kHz) den Pin abfrage. 
Erst wenn eine gewisse Zeit der Pin nicht mehr auf LOW geht, weiß ich 
dass das Signal zuende ist.
Außer ich hab das Protokoll schon so weit analysiert, dass ich schon 
weiß, dass nichts mehr kommen wird. Aber das ist auch bei beiden 
Methoden gleich.

Überseh ich da irgendwas?

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Lorand U. schrieb:
> Wenn eine gewisse Zeit lang kein Pinchange mehr passiert, weiß ich dass
> das Signal zuende ist.

Das ist korrekt:

Mit einer Kombination aus Pinchange-Interrupt und zusätzlichem Timer 
als Timeout-Detector kann man die Prozessor-Last durchaus reduzieren. 
Ohne Timer geht es aber nicht, weil sonst diverse Timeouts (z.B. bei 
gleichzeitigem Verfolgen von verschiedenen Protokollen bzw. 
Frame-Längen) nicht erkannt werden können und die Statemachine dann 
"steckenbleiben" kann.

Das IRMP-Projekt ist allerdings vor mehr als 10 Jahren entstanden, da 
hatten noch längst nicht alle AVRs beliebig viele Pins, die man für 
Pinchange-Detektion einsetzen konnte. Da gab es beispielsweise nur INT0 
(und INT1), z.B. für den damals doch recht beliebten ATmega8.

So habe ich mich damals für die alleinige Timer-Nutzung entschieden, 
damit IRMP möglichst breit einsetzbar ist. Das betrifft nicht nur eine 
Prozessorfamilie (z.B. AVRs), sondern auch die Portierung auf andere µC 
Architekturen. Der Code würde heute durch zusätzliche Verwendung von 
Pinchange-Interrupts noch komplizierter werden, als er schon ist: Für 
jede Prozessorfamilie kämen dann nochmal die Interrupt-Handler hinzu.

Die Prozessorlast ist auch tatsächlich niedriger, als die Programmgröße 
es vermuten lässt. Es werden pro Timeraufruf jeweils nur kleine 
Bruchstücke der recht umfangreichen Statemachine durchlaufen. So hält 
sich die Prozessorlast doch sehr in Grenzen.

Du kannst natürlich gern die entsprechenden Interrupt-Handler für die 
aktuell unterstützten µCs beisteuern und den dazugehörenden 
Timer-Interrupt neu erstellen. Ich freue mich dann auf Deinen Code :-)

von Armin J. (arminj)


Lesenswert?

Frank M. schrieb:
> Die Version 3.2.0 ist online.
> - 22.06.2020: Unterstützung von 433MHz Funkprotokollen (RF)

Ich habe mal die Medion PC Fernbedienung 20018071, die man schon ab 3€ 
bei Ebay(Kleinanzeigen) bekommt, analysiert.
Mit den folgenden Werten läuft es gut, ich habe dafür einach mal die 
Telefunken Definition missbraucht. Es läuft übrigens mit allen 40 
anderen IR Protokollen aus dem AllProtocol Example gleichzeitig, man 
muss sie nicht disablen.
1
#define TELEFUNKEN_START_BIT_PULSE_TIME         3960.0e-6                       // 4 ms usec pulse
2
#define TELEFUNKEN_START_BIT_PAUSE_TIME         610.0e-6                        // 610 usec pause
3
#define TELEFUNKEN_PULSE_TIME                   570.0e-6                        //  560 usec pulse
4
#define TELEFUNKEN_1_PAUSE_TIME                 1700.0e-6                       // 1700 usec pause
5
#define TELEFUNKEN_0_PAUSE_TIME                 560.0e-6                        //  560 usec pause
6
#define TELEFUNKEN_FRAME_REPEAT_PAUSE_TIME      5000.0e-6                       // frame repeat after 5 ms
7
#define TELEFUNKEN_ADDRESS_OFFSET               8                               // skip 0 bits
8
#define TELEFUNKEN_ADDRESS_LEN                  12                              // read 12 address bits
9
#define TELEFUNKEN_COMMAND_OFFSET               0                               // skip 8 bits
10
#define TELEFUNKEN_COMMAND_LEN                  8                               // read 8 bits
11
#define TELEFUNKEN_COMPLETE_DATA_LEN            20                              // complete length
12
#define TELEFUNKEN_STOP_BIT                     1                               // has stop bit
13
#define TELEFUNKEN_LSB                          0                               // LSB...MSB
14
#define TELEFUNKEN_FLAGS                        0                               // flags
Die Daten müssen aber anders als oben spezifiziert interpretiert werden:
Die oberen 8 Bit der Adresse sind die Command + 0x2B also Checksum oder 
Plausi und die letzten 4 Bit der Adresse sind immer 0.
Command sind die ersten Bits, da sind die oberste Taste dann 01, 02 und 
die Zahlen Tasten sind (Zahl + E1).
Wie kann mas das in IRMP aufnehmen, und sollte man das überhaupt?
Gruß
Armin

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Armin J. schrieb:

> Ich habe mal die Medion PC Fernbedienung 20018071, die man schon ab 3€
> bei Ebay(Kleinanzeigen) bekommt, analysiert.

Ist das die X10 von Pollin für 75 Cent oder ein ähnliches Modell? Nach 
den Anleitungen/Bildern, die ich für Deine PC Fernbedienung gefunden 
habe, scheint sie sehr ähnlich zu arbeiten, nur mit anderen Timings.

Die Beschreibung, wie der Funkkanal geändert werden kann, entspricht der 
X10 von Pollin, welches übrigens auch ein Medion-Modell ist.

> Die Daten müssen aber anders als oben spezifiziert interpretiert werden:
> Die oberen 8 Bit der Adresse sind die Command + 0x2B also Checksum oder
> Plausi und die letzten 4 Bit der Adresse sind immer 0.

Das passt zwar besser als meine erste Beschreibung, stimmt aber trotzdem 
nicht ganz. ;-)

Mittlerweile habe ich die X10 mittlerweile vollständig entschlüsselt, 
nachdem ich mal testweise die Funkkanäle gewechselt habe. Wie das geht, 
steht in der Anleitung von Pollin.

Heraus kommt der folgende Aufbau:

 - 1 toggle bit
 - 7 checksum bits
 - 1 toggle bit
 - 7 command bits
 - 4 channel bits

Die letzten 4 Bits sind nur dann 0, wenn Funkkanal 1 eingestellt ist. 
Für die Funkkanäle 1-16 findest Du in den letzten 4 Bits nämlich die 
entsprechenden Werte 0-15, wenn Du mal den Funkkanal wechselst.

Dabei gilt für die Checksum:
1
checksum = (command + 0x0055 + (channel << 4)) & 0x7F

Anhand des Ausprobierens verschiederner Funkkanäle konnte ich 
feststellen, dass das Kommando beileibe nicht vorne im Frame steckt, 
sondern erst die Checksum kommt, dann das Kommando und am Ende der 
Funkkanal.

Zweite wichtige Erkenntnis: Der Wert der Checksum ist abhängig vom 
gewähltem Funkkanal! (siehe auch "Formel" oben)

> Wie kann mas das in IRMP aufnehmen, und sollte man das überhaupt?

Ich habe es in der neuen Fassung für die X10 folgendermaßen gemacht:
1
In der ISR:
2
1. Checksum in irmp_address gespeichert
3
2. Kommando inkl. 4 Funkkanal-Bits in irmp_command gespeichert
4
5
In irmp_get_data():
6
1. Checksum nach obiger Regel geprüft.
7
2. 4 Funkkanal-Bits nach irmp_address kopiert
8
3. Kommando um 4 Bits nach rechts geschoben

Damit wird in irmp_addr der Funkkanal gespeichert. Diesen bekommt man 
dann per irmp_get_data() frei Haus mitgeliefert.

Ich kann meine Änderungen dafür mal heute abend einchecken, dann kannst 
Du das entsprechend für Deine FB machen, die ja offenbar nur ein 
abweichendes Timing hat und die Formel für die Checksum eventuell eine 
andere ist.

: Bearbeitet durch Moderator
von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Armin J. schrieb:
> Es läuft übrigens mit allen 40 anderen IR Protokollen aus dem
> AllProtocol Example gleichzeitig, man muss sie nicht disablen.

Es macht aber keinen Sinn, RF- und IR-Signale gleichzeitig zuzulassen. 
Es gibt im irmp nur einen Input-Pin. Daran schließt Du entweder einen 
RF-Empfänger (active high) oder einen IR-TSOP (active low) an.

Okay, man könnte nun durch entsprechende Vorkehrungen (Transistor am 
RF-Empfänger-Ausgang) dafür sorgen, dass das RF-Signal active low wird 
und gleichzeitig über dieselbe Open-Collector-Eigenschaft wie ein TSOP 
verfügt. Dann könnte man sogar beide Signale an demselben µC-Eingangspin 
anschließen.

Aber diese Konstruktion sehe ich schon als sehr "exotisch" an.

von Armin J. (arminj)


Angehängte Dateien:

Lesenswert?

Hier ein Bild des IC's.
Eine Select Taste für den Funkkanal gibt es nicht, oder ist nicht 
verdrahtet.

: Bearbeitet durch User
von Lorand U. (Gast)


Lesenswert?

Danke für die ausführliche Antwort zum Pinchange-Interrupt :)
Das macht Sinn!

von Armin J. (arminj)


Lesenswert?

Und noch was zur Medion PC Fernbedienung 20018071.
Der Code wird mindestens 5 mal gesendet, auch wenn man nur kurz auf die 
Taste drückt.
Kann man das irgendwo spezifizieren?

von Joachim B. (jar)


Lesenswert?

Frank M. schrieb:
> Es macht aber keinen Sinn, RF- und IR-Signale gleichzeitig zuzulassen.
> Es gibt im irmp nur einen Input-Pin.

OK, in einem Post erwähntest du das IRMP nun x10 dekodieren kann, ich 
wollte es gerade mal aufbauen und stolpere schon (ich nutze ja am 
Arduino immer noch deine Version von 2015 weil ich sie besser kenne und 
sie am mega328p und am mega1284p unter Arduino gut läuft.

Nun habe ich in der Arduino IDE 1.8.9 unter Bib. Verwalter 
nachinstalliert und bekomme nur die 3.0.0 aber es heisst ja im Artikel
Ab Version 3.2 kann IRMP auch RF-Funkprotokolle (433 MHz) dekodieren.

Erste Hürde!
Dann heisst es auch für den ESP32, der ist im Beispiel der 3.0.0 nicht 
mal wählbar?

Also muss ich die LIB für den ESP32 nun händisch einbinden? und wo?
Normalerweise ja in Sketchverzeichnis aber unter Hardware wird ja dort 
verzweigt nach tools, bin leicht verwirrt.

Eines fiel mir schon auf im Beispiel der v3.0.0:
1
void setup()
2
{   Serial.begin(115200);
3
#if defined(__AVR_ATmega32U4__)
4
    while (!Serial); //delay for Leonardo, but this loops forever for Maple Serial
5
#endif
6
#if defined(SERIAL_USB) || defined(SERIAL_PORT_USBVIRTUAL)
7
    delay(2000); // To be able to connect Serial monitor after reset and before first printout
8
#endif
9
#if defined(__ESP8266__)
10
    Serial.println(); // to separate it from the internal boot output
11
#endif

ESP32 nicht wählbar?

Serial.begin(115200); mit brutalen 115k OK wer kann, bei mir klemmts an 
wUSB und USB Server LAN100/400 von sharkoon, ich mag da lieber das es 
funktioniert mit 19k2

Dann fiel mir auf das der alte Müll in der Schnitte nicht entsorgt wird 
nach Serial.begin....

finde das so etwas geschmeidiger
1
  Serial.begin(19200);
2
  Serial.flush();
3
  /*while(Serial.available()) // alternativ
4
    Serial.read();*/

würde mich nun über Antworten freuen wie ich weiter vorgehen kann.

LG jar

: Bearbeitet durch User
von Armin J. (arminj)


Lesenswert?

Joachim B. schrieb:
> Erste Hürde!
> Dann heisst es auch für den ESP32, der ist im Beispiel der 3.0.0 nicht
> mal wählbar?

Wie möchtest Du ihn denn auswählen?
LG Armin

von Joachim B. (jar)


Lesenswert?

Armin J. schrieb:
> Wie möchtest Du ihn denn auswählen?

nun darfst du raten warum ich frage, im ersten Moment dachte ich an

Joachim B. schrieb:
> #if defined(ESP32)

aber da die LIB erst 3.0.0 ist und Frank schrieb ab 3.2.0 ist der ESP32 
drin.....

Warum fragst du? hilft mir das?

Vielleicht gibt der Autor eine Antwort, eilt ja nicht ich dachte ich 
probiere es mal aber wenn ich über den Bib. Verwalter nicht rankomme 
scheint es ja nicht so wichtig zu sein.

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


Lesenswert?

Joachim B. schrieb:
> aber da die LIB erst 3.0.0 ist und Frank schrieb ab 3.2.0 ist der ESP32
> drin.....

Es könnte sein, dass die Versionsnummerierung des Arduino-Ports von der 
Nummerierung der Original-Version abweicht. Auskunft könnte Dir Armin 
geben, den Du gerade abgeschmettert hast. Er ist maßgeblicher Supporter 
des Arduino-Ports von IRMP.

Ich persönlich kann überhaupt keine Auskunft geben, wenn es konkret um 
den Arduino-Port geht. Da stecke ich zuwenig drin.

von Joachim B. (jar)


Lesenswert?

Frank M. schrieb:
> Auskunft könnte Dir Armin
> geben, den Du gerade abgeschmettert hast. Er ist maßgeblicher Supporter
> des Arduino-Ports von IRMP.

und wie half dann?

Armin J. schrieb:
> Wie möchtest Du ihn denn auswählen?
> LG Armin

ich kann das doch nicht riechen und wenn er der Supporter ist hätte er 
doch richtig antworten können, warum 3.0.0 genannt wird und 3.2.0 
aktuell ist.

Du weisst ja selbst wie hier ständig mit Gegenfragen vom Thema 
abgewichen wird!
Gegenfragen sind nun mal keine Antworten!

von Jörg R. (jrie)


Lesenswert?


von Joachim B. (jar)


Lesenswert?

Jörg R. schrieb:
> Guck mal da:

ich habe schon überall geschaut,

für Arduino wurde einiges stark geändert, aus *.c wurde *.c.h

Ich tippe mal ins Blaue die C-Sourcen wurden als Header eingebunden 
(traurigerweise was mir hier mal als VÖLLIGE Ahnungslosigkeit 
unterstellt wurde!)

Es scheint so als wenn nur die Anzeige noch auf version 3.0.0 steht, 
möglicherweise ist der Code sogar aktuell, aber ich kann jetzt nicht 
anfangen jede Zeile zu prüfen, dazu bin ich aus dem Source Code seit 
2015 zu lange raus.

von Joachim B. (jar)


Lesenswert?

Frank M. schrieb:
> Auskunft könnte Dir Armin
> geben, den Du gerade abgeschmettert hast. Er ist maßgeblicher Supporter
> des Arduino-Ports von IRMP.

muss ich nun auf die Knie fallen und um Vergebung bitten?

Du hattest ja die Version 3.2.0 erwähnt die ich unter der Arduino IDE 
eben nicht einbinden konnte!
Ich verstehe auch nicht warum die Arduino IDE nur die Version 3.0.0 
anbietet und nennt!

Meine Frage wurde nicht beantwortet und warum ein mir bis dahin 
unbekannter Armin auf meine Frage eine Gegenfrage stellt bleibt auch 
unklar.

Aber danke dafür!
Das sagt viel aus!

IRMP ist schon irgendwie genial, aber wie heisst es doch Genie und 
Wahnsinn liegen dicht beieinander!

: Bearbeitet durch User
von 900ss (900ss)


Lesenswert?

Joachim B. schrieb:
> muss ich nun auf die Knie fallen und um Vergebung bitten?

Du hast schon eine sonderbare Art um Hilfe zu bitten zumal du hier schon 
etwas geschenkt bekommen hast. Rumpöbeln und sich beschweren wenn keine 
(wenig) Hilfe kommt.
Ja sicher, es ist nicht vollkommen, das Geschenk für dich, aber du nutzt 
es doch freiwillig.

: Bearbeitet durch User
Beitrag #6358263 wurde vom Autor gelöscht.
von Joachim B. (jar)


Lesenswert?

900ss D. schrieb:
> Du hast schon eine sonderbare Art um Hilfe zu bitten zumal du hier schon
> etwas geschenkt bekommen hast.

ja ich bin ein Mensch mit Fehler, aber ich gestehe das auch Autoren zu 
die auf eine Frage mit einer Gegenfrage antworten!

Selbst Moderatoren gestehe ich Fehler zu (auch dem Frank, er wird sich 
erinnern RTC3231 Ladeschaltung & CR, da hat er mich auch 
irrtümlicherweise rund gemacht) das sie in der Arduino IDE nicht 
involviert sind, aber das kann kein Grund sein nun nicht zu antworten 
ausser sie wollen halt nicht.

OK habe ich öfter erlebt und scheint oft der Grund zu sein warum Arduino 
in gewissen Kreisen verpönt ist.
Ich mag Arduino sehr, habe das öfter geschrieben aber so kann ich auch 
mittlerweile Arduino Hasser verstehen!

Wollen die Arduino LIB Ersteller echt helfen oder nur ihrem EGO frönen?

min 2 Möglichkeiten, Neustart meinen "Tonfall" abhaken und eine 
verständliche Antwort geben:

wie kann ich in der Arduino IDE die Version 3.2.0 einbinden?

oder mich weiter ignorieren, das sagt auch was aus!

von Armin J. (arminj)


Lesenswert?

Frank M. schrieb:
> Ich kann meine Änderungen dafür mal heute abend einchecken, dann kannst
> Du das entsprechend für Deine FB machen, die ja offenbar nur ein
> abweichendes Timing hat und die Formel für die Checksum eventuell eine
> andere ist.

Hallo Frank, bin erst jetzt dazu gekommen das mal zu testen.
mit dem Timing
1
#define RF_X10_START_BIT_PULSE_TIME             3960.0e-6    // 2850 usec pulse
2
#define RF_X10_START_BIT_PAUSE_TIME              610.0e-6    // 1710 usec pulse
3
#define RF_X10_0_PULSE_TIME                      570.0e-6    //  570 usec pulse
4
#define RF_X10_0_PAUSE_TIME                      570.0e-6    // 1000 usec pause
5
#define RF_X10_1_PULSE_TIME                      570.0e-6    // 1000 usec pulse
6
#define RF_X10_1_PAUSE_TIME                     1710.0e-6    //  500 usec pause
7
8
#define RF_X10_FRAME_REPEAT_PAUSE_TIME          5000.0e-6    // frame repeat after 4460 usec
tuts das auf Anhieb, die Checksum Funktion brauchte ich nicht zu ändern.
Willst Du das jetzt als RF_MEDION aufnehmen?

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Hallo Armin,

Armin J. schrieb:
> Willst Du das jetzt als RF_MEDION aufnehmen?

Ja, mache ich noch heute.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Neue IRMP-Version 3.2.3:

Änderung: Neues RF-Protokoll: RF_MEDION

Viel Spaß!

von Armin J. (arminj)


Lesenswert?

Hallo Frank,
gibt es einen Grund, warum irmp_get_data() uint_fast8_t und nicht bool 
ist?
Ist das noch historisch?
Ich versuche das gerade zu dokumentieren:
https://github.com/ukw100/IRMP#api
1
// Main check for result function used in loop() - returns TRUE or FALSE
2
uint_fast8_t irmp_get_data (IRMP_DATA *)

Und das wäre einfacher zu verstehen, wenn der Returnwert bool wär.
Ich weiss, dass das denselben Assembler Code gibt, aber verwirrend ist 
es erstmal.

Könnte man das eventuell nur für #ifdef ARDUINO auf bool setzen?

von Lê Q. (l_q)


Lesenswert?

Hello everyone,
I am try to make IR learning remote by using microcontroller ( my item
is EFR32 of Silicon labs)
I used to refer IRMP_English and IRSND to decoder and encoder IR signal
and I was successful with protocols which are available in the IRMP
Protocols.
but it will not work with strange protocols.
Do we need to decode it to be able to save it and emit it?
Is there any way we could capture the infrared signal, then save it and
emit it without encoding end decoding it? because if encoding and
recording will not work if there is a strange protocol.
I searched a lot of information on various forums but couldn't find it.

von Armin J. (arminj)


Lesenswert?

For just recording and replay you should consider to use the IRremote 
library.
See example 
https://github.com/z3t0/Arduino-IRremote/blob/master/examples/IRrecord/IRrecord.ino

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Hi Armin,

Armin J. schrieb:
> gibt es einen Grund, warum irmp_get_data() uint_fast8_t und nicht bool
> ist?
> Ist das noch historisch?

Ja, das ist historisch und ich würde es für C auch nicht ohne zwingende 
Not ändern wollen. In C ist "stdbool.h" zwar mittlerweile Standard, aber 
ich weiß nicht, welchen (älteren) C-Compiler ich damit ausschließen 
würde. Daher habe ich das auch nie geändert. Die Verwendung von "bool" 
ergibt (in C) auch keinen verwertbaren Vorteil. Und wer weiß? Vielleicht 
gibt ja irmp_get_data() irgendwann aus irgendwelchen Gründen auch andere 
Werte als 0 und 1 zurück?!? ;-)

In C++ (wie Arduino) ist die Verwendung von bool natürlich überhaupt 
kein Problem. Daher könnte man das durchaus für Arduino oder besser noch 
mittels
1
#ifdef __cplusplus
2
...
3
#endif
so einstellen.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Armin J. schrieb:
> For just recording and replay you should consider to use the IRremote
> library.

I already had contact with l_q by mail in the last days. He wants to 
decode the Daikin protocol (air conditioning) with IRMP. But as I 
learned on https://github.com/blafois/Daikin-IR-Reverse meanwhile, this 
protocol consists of at least 15 bytes, not bits! Therefore it is 
impossible to handle the protocol with IRMP. IRMP is not prepared for 
such frame lengths.

@l_q: IRMP is the wrong tool here because Daikin's IR frames are much 
too long. Perhaps https://github.com/blafois/Daikin-IR-Reverse is the 
better tool for you.

: Bearbeitet durch Moderator
von Armin J. (arminj)


Lesenswert?

Frank M. schrieb:
> In C++ (wie Arduino) ist die Verwendung von bool natürlich überhaupt
> kein Problem. Daher könnte man das durchaus für Arduino oder besser noch
> mittels
>
1
> #ifdef __cplusplus
2
> ...
3
> #endif
4
>
> so einstellen.

Das wäre SUUUUUUUPER
Danke
P.s. und für irmp_ISR (void); bitte auch :-)

: Bearbeitet durch User
von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Frank M. schrieb:
> Armin J. schrieb:
>> gibt es einen Grund, warum irmp_get_data() uint_fast8_t und nicht
>> bool ist? Ist das noch historisch?
>
> Ja, das ist historisch und ich würde es für C auch nicht ohne zwingende
> Not ändern wollen. In C ist "stdbool.h" zwar mittlerweile Standard,

bool bzw. stdbool.h gibt's seit C99...

> aber ich weiß nicht, welchen (älteren) C-Compiler ich damit ausschließen
> würde. Daher habe ich das auch nie geändert. Die Verwendung von "bool"
> ergibt (in C) auch keinen verwertbaren Vorteil. Und wer weiß? Vielleicht
> gibt ja irmp_get_data() irgendwann aus irgendwelchen Gründen auch andere
> Werte als 0 und 1 zurück?!? ;-)

...wobei uint_fast8_t bzw. stdint.h ebenfalls C99 sind.

Problem wären also Compiler, die C99 nur teilweise unterstützen.

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Was ist eigentlich der Grund dafür, dass die Voreinstellung nur ein 
einziges IR-Protokoll aktiviert hat, nämlich NEC?

Ist NEC der neue Quasi-Standard, also sozusagen das neue RC5?

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Johann L. schrieb:
> bool bzw. stdbool.h gibt's seit C99...

Da magst Du recht haben. Wenn Du mir nur einen Grund nennst, was ich 
durch Verwendung von bool gegenüber uint8_t als Rückgabewert einer 
Funktion gewinne, kann ich das gerne ändern. Der erzeugte Assembler-Code 
ist jedenfalls derselbe und ich halte mir so die Option offen, noch 
andere Werte als true oder false zurückliefern zu können - ohne etwas am 
Interface ändern zu müssen.

Johann L. schrieb:
> Was ist eigentlich der Grund dafür, dass die Voreinstellung nur ein
> einziges IR-Protokoll aktiviert hat, nämlich NEC?

Es sind 4 Protokolle, die standardmäßig aktiviert sind, nämlich:
1
#define IRMP_SUPPORT_SIRCS_PROTOCOL             1
2
#define IRMP_SUPPORT_NEC_PROTOCOL               1
3
#define IRMP_SUPPORT_SAMSUNG_PROTOCOL           1
4
#define IRMP_SUPPORT_KASEIKYO_PROTOCOL          1

(siehe irmpconfig.h)

> Ist NEC der neue Quasi-Standard, also sozusagen das neue RC5?

Siehe 3. Abschnitt am Anfang des IRMP-Artikels, nämlich unter 
https://www.mikrocontroller.net/articles/IRMP#IR-Protokolle :

"Heutzutage wird (auch vornehmlich bei japanischen Geräten) das 
NEC-Protokoll verwendet - und zwar von den unterschiedlichsten (Marken- 
und auch Noname-)Herstellern. Ich schätze den "Marktanteil" auf ca. 80% 
beim NEC-Protokoll. Fast alle Fernbedienungen im alltäglichen Einsatz 
verwenden bei mir den NEC-IR-Code. Das fängt beim Fernseher an, geht 
über vom DVD-Player zur Notebook-Fernbedienung und reicht bis zur 
Noname-MultiMedia-Festplatte - um nur einige Beispiele zu nennen."

RC5 ist längst tot. Philips hatte zwar nochmal eine Wiederauferstehung 
mit RC6 versucht, ist aber damit längst nicht so erfogreich geworden wie 
damals mit RC5.

NEC als universelles Protokoll findest Du dagegen fast überall. Im oben 
genannten Kapitel des Artikels wird auch noch über die anderen oft am 
Markt anzufindenden Protokolle geschrieben, nämlich über Kaseikyo 
(vornehmlich in Asien) und Sony.

von 900ss (900ss)


Lesenswert?

Frank M. schrieb:
> bool gegenüber uint8_t als Rückgabewert einer Funktion gewinne, kann

Ich habe nicht selten Kollegen erlebt, die waren der Meinung in bool 
kann es nur 0 oder 1 (false oder true) geben. Wunderten sich dann als 
ein Vergleich mit true nicht klappte, weil 5 drin stand. :)
bool gehört abgeschafft.

von Joachim B. (jar)


Lesenswert?

900ss D. schrieb:
> bool gehört abgeschafft

wegen falscher Benutzung?

soweit ich weiss ist false immer NULL und true immer !false wobei es 
nicht interessiert was in true steht.

Gut ist doch das man true(!false) auch nutzen kann für Ergebnisse.

: Bearbeitet durch User
von Armin J. (arminj)


Lesenswert?

Aber wenn der Rückgabewert der Funktion (irmp_ir_detected) nur mit
1
irmp_ir_detected = FALSE;
und
1
irmp_ir_detected    = TRUE;
belegt wird, ist es doch transparenter, die Funktion als bool zu 
deklarieren, wenn es sonst keine Gründe (Compiler kann es nicht) gibt. 
Oder?

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Frank M. schrieb:
> Johann L. schrieb:
>> bool bzw. stdbool.h gibt's seit C99...
>
> Da magst Du recht haben. Wenn Du mir nur einen Grund nennst, was ich
> durch Verwendung von bool gegenüber uint8_t als Rückgabewert einer
> Funktion gewinne, kann ich das gerne ändern.

Es war nur eine Anmerkung meinerseits, dass es sowohl uint8_t o.ä. als 
auch bool seit C99 gibt, ohne irgendeine Empfehlung.

Allerdings steht in der Doku zu irmp_get_data():
1
 *  @return    true: successful, false: failed

> Der erzeugte Assembler-Code ist jedenfalls derselbe und ich halte mir
> so die Option offen, noch andere Werte als true oder false zurückliefern
> zu können - ohne etwas am Interface ändern zu müssen.

Anstatt "failed" würde ich eher sagen "nothing here", d.h. es wurde noch 
nichts bzw. nichts mehr empfangen seit dem letzten Datensatz?  "failed" 
würde ich interpretieren als Fehler im Protokoll bzw. irgendwas 
Unbekanntes.

900ss D. schrieb:
> Ich habe nicht selten Kollegen erlebt, die waren der Meinung in bool
> kann es nur 0 oder 1 (false oder true) geben.

Ist auch so, zumindenst in C99+ und C++.

> Wunderten sich dann als ein Vergleich mit true nicht klappte,
> weil 5 drin stand. :) bool gehört abgeschafft.

Dann war's irgendein Hack wie
1
#define bool unsigned char

Das bool von C/C++ kann sich aber aber niemals nich so verhalten wie ein 
unsigned char weil in C99
1
bool x = 5; // Set x to true.

: Bearbeitet durch User
von 900ss (900ss)


Lesenswert?

Johann L. schrieb:
> Ist auch so, zumindenst in C99+ und C++

C++ ist bei uns verboten, ja :( Da funktioniert es mit bool, ja. Aber 
eben nicht in C. Und ich kenne wirklich einige, die nicht wissen das in 
C bool nicht wirklich bool ist. Es ist da nur irreführend.

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

900ss D. schrieb:
> Johann L. schrieb:
>> Ist auch so, zumindenst in C99+ und C++
>
> C++ ist bei uns verboten, ja :( Da funktioniert es mit bool, ja. Aber
> eben nicht in C. Und ich kenne wirklich einige, die nicht wissen das in
> C bool nicht wirklich bool ist. Es ist da nur irreführend.

Dann ist es nicht dass bool von C (also von C99) sondern was 
hausbackenes.

Beispiel avr-gcc:

C99:
1
#include <stdbool.h>
2
3
bool global_5 = 5;
4
5
bool bool_5 (void)
6
{
7
    return 5;
8
}

Präprozessiert:
1
_Bool global_5 = 5;
2
3
_Bool bool_5 (void)
4
{
5
    return 5;
6
}
d.h. bool ist effektiv ein Typ mit eigener, nicht-int Semantik!

Assembly:
1
.global  bool_5
2
  .type  bool_5, @function
3
bool_5:
4
  ldi r24,lo8(1)
5
  ret
6
  .size  bool_5, .-bool_5
7
8
.global  global_5
9
  .section  .data.global_5,"aw",@progbits
10
  .type  global_5, @object
11
  .size  global_5, 1
12
global_5:
13
  .byte  1
d.h. in beiden Fällen wird true (1) gespeichert und eben NICHT 5.

Wenn du GCC verwendest, und bool wird nicht auf _Bool abgebildet wird 
(das übrigens älter als C99 ist) dann habt ihr selber was gebastelt und 
unzureichend dokumentiert...

Natürlich wird der Vergleich "if (global_5 == 5)" nie zutreffen, weil es 
nach den Promotion-Rules ein Vergleich 2er int ist, und global_5 immer 0 
oder 1 ist.  Damit der Vergleich zutrifft, müsste man sowas wie "if 
(global_5 == (bool) 5)" machen.

von 900ss (900ss)


Lesenswert?

Johann L. schrieb:
> Dann ist es nicht dass bool von C

Das müsste ich prüfen. Weiß ich nicht im Kopf. Vielleicht wird auch 
nicht C99 verwendet sondern älter. Es ist alles soo alt in dem Projekt 
;)

: Bearbeitet durch User
von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Noch ne Frage zum NEC-Protokoll:

https://techdocs.altium.com/display/FPGA/NEC+Infrared+Transmission+Protocol

spezifiziert den Payload eines Frames als 4 Bytes:

1. Adresse (little Endian)
2. 1er Complement von 1.
3. Commando (little Endian)
4. 1er Complement von 3.

Demnach werden nur Adressen 0x0...0xff unterstützt.  Ich bekomme aber 
für meine Bleil-Schrott-Fernbedienung eine Adresse von 0xEF00.

In IRMP: Fernbedienungen sind noch viele andere NEC Geräte 
aufgelistet, und deren Adressen sind auch keine 8-Bit Adressen...

Wo ist da mein Denkfehler?

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


Lesenswert?

Johann L. schrieb:
> Noch ne Frage zum NEC-Protokoll:
>
> https://techdocs.altium.com/display/FPGA/NEC+Infrared+Transmission+Protocol
>
> spezifiziert den Payload eines Frames als 4 Bytes:
>
> 1. Adresse (little Endian)
> 2. 1er Complement von 1.
> 3. Commando (little Endian)
> 4. 1er Complement von 3.

Das gilt nur für das Standard-NEC-Protokoll. NEC wurde später nochmals 
erweitert, genannt "Extended NEC". Dabei wurde das Complement der 
vormaligen Adresse aufgegeben und Byte #2 als zweites Adress-Byte 
erklärt.

Damit wird das Standard-NEC-Protokoll nur noch ein Spezialfall vom 
Extended-NEC-Protokoll. IRMP betrachtet NEC immer als Extended NEC und 
gibt deshalb eine 16-Bit-Adresse zurück, aber nur einen 
8-Bit-Kommando-Code - wobei das Complement vorher selbstverständlich 
überprüft wird.

Das steht aber auch im IRMP-Artikel, vergleiche bitte: 
https://www.mikrocontroller.net/articles/IRMP#NEC_.2B_extended_NEC

Auszug:
1
Daten NEC   8 Adress-Bits + 8 invertierte Adress-Bits + 8 Kommando-Bits + 8 invertierte Kommando-Bits
2
Daten ext. NEC   16 Adress-Bits + 8 Kommando-Bits + 8 invertierte Kommando-Bits

> Demnach werden nur Adressen 0x0...0xff unterstützt.  Ich bekomme aber
> für meine Bleil-Schrott-Fernbedienung eine Adresse von 0xEF00.

Dann ist das klar eine Adresse aus dem "Extended-NEC-Protokoll".

: Bearbeitet durch Moderator
von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Johann L. schrieb:
> Frank M. schrieb:
>> Johann L. schrieb:
>>> Würd gerne nen ATtiny24 verwenden.  Der Code passt da zwar locker rein,
>>> aber es soll ja mehr auf den µC als IR-Auswertung...
>>
>> Immer diese Selbstquälerei, nimm einfach einen ATtiny44 ;-)
>
> Hab hier noch nen ATtiny24 und 'nen LED-Streifen anzusteuern ist ja
> keine Rocket-Science...

Hab den Code jetzt auf 'nen ATtiny24 umgezogen. Ein "leerer" 
IRMP-Empfänger nur mit NEC Protokoll belegt knapp 1kB inclusive 
Vectortabelle und Startup-Code etc.  Den RGB-Streifen anzusteuern 
braucht dann zusätzlich noch knapp 800 Bytes, passt also locker in die 
2KiB Flash rein.

Die Ansteuerung ist auch besser als im Original: Ausgewogenere Farben 
und höhere PWM-Frequenz, nämlich 1 kHz bei 60 Helligkeitsstufen für jede 
Farbkomponente.  Weil es Software-PWM ist ergibt sich eine relative hohe 
IRQ-Last von 45% für Timer0 nur für die RGB Ansteuerung.  IRMP 
funktioniert problemlos mit dieser hohen IRQ-Last und mit F_CPU = 8 MHz.

Danke nochmal für den Code und die Hintergrundinformationen!

von 900ss (900ss)


Lesenswert?

Johann L. schrieb:
> passt also locker in die 2KiB Flash rein

Da bekommst du doch bestimmt noch ein Spiel rein, gesteuert von der 
Fernbedienung ;)

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Johann L. schrieb:
> IRMP funktioniert problemlos mit dieser hohen IRQ-Last und mit F_CPU = 8
> MHz.

Danke für das Feefdback, freut mich, dass es so läuft!

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

900ss D. schrieb:
> Johann L. schrieb:
>> passt also locker in die 2KiB Flash rein
>
> Da bekommst du doch bestimmt noch ein Spiel rein, gesteuert von der
> Fernbedienung ;)

Wird dann aber ein ödes Spiel, wenn das "Display" nur ein LED-Streifen 
ist...

Hab spaßeshalber mal 'nen eigenen NEC-Decoder implementiert, der spart 
gegenüber dem bereits optimierten und kastrierten IRMP immerhin 550 
Bytes ein.

Hab allerdings geplant, einen "Supportmodus" einzubauen:

Der LED-Streifen sind im Schlafzimmer an Fußleisten etc.  Mein 
selbstgebautes Bett steht auf 2 Zeilen Glasbausteinen an den Flanken, 
und unter dem Bett und hinter den Glasbausteinen sind 4 (rot, grün, 
blau, gelb/weiß) Lichterketten.  Diese dienen als Nachtlicht und können 
über 4 Schalter am Kopfende an- und ausgeschaltet werden; die 
LED-Streifen hängen am 5. Schalter.

"Supportmodus" bedeutet, dass die LED-Streifen dem Zustand der 
Lichterketten folgen.  Wenn z.B. die rote Lichterkette an ist, sollen 
die LED-Streifen auch rot sein, und zwar ohne dass man diese fummelige 
Bleil billig-Fermbedienung betätigen muss.

Ein Knopf der Fernbedienung würde diesen Supportmodus betätigen, danach 
folgt die Farbe bzw. an / aus den 230V~ Schalten am Bett.

In die verbliebenen 300 Bytes Flash passt das lockerst rein :-)

Frank M. schrieb:
> Johann L. schrieb:
>> IRMP funktioniert problemlos mit dieser hohen IRQ-Last und mit F_CPU = 8
>> MHz.
>
> Danke für das Feefdback, freut mich, dass es so läuft!

Tut auch noch bei 90% CPU-Last der RGB-PWM-ISR, d.h. PWM-Frequenz von 2 
kHz.  Ist auch klar: Jitter der IRMP-ISR bleibt wie bei 1 kHz (ca. 60 
Ticks), und die IRMP-ISR ist nicht unterbrechbar; funktioniert also 
unverändert.

von Klaus R. (klaus2)


Lesenswert?


von Armin J. (arminj)


Lesenswert?

Hallo Frank,

ich habe mal eine Testprogramm geschrieben, das alle Protokolle sendet 
und die dann mit AllProtocols auf einem anderen Arduino empfangen.

https://github.com/ukw100/IRMP/blob/master/examples/SendAllProtocols/SendAllProtocols.ino

dabei ist mir ein Fehler aufgefallen:

es steht
1
#if IRSND_SUPPORT_GRUNDIG_PROTOCOL == 1
2
        case IRMP_GRUNDIG_PROTOCOL:
3
        {
4
            command = bitsrevervse (irmp_data_p->command, TELEFUNKEN_COMMAND_LEN);
statt
1
#if IRSND_SUPPORT_GRUNDIG_PROTOCOL == 1
2
        case IRMP_GRUNDIG_PROTOCOL:
3
        {
4
            command = bitsrevervse (irmp_data_p->command, GRUNDIG_COMMAND_LEN);
nach der Änderung tat es das auch.

Einige Protokolle z.B. RECS80, RC6, RECS80EX, RC6A, lassen sich nur mit 
einem guten Empfänger IC decodieren, aber viele gehen so.
Ich habe auch  die direkte Verbindung getestet, das geht jetzt mit 
IRSND_GENERATE_NO_SEND_RF aber da klappt sogar NEC nicht.

Die Protokolle A1TVBOX + TELEFUNKEN + ab FAN bis IRMP16 können gar nicht 
decodiert werden.
Bei FDC und SIEMENS bekomme ich das Protokoll zwar erkannt, aber das 
Comand stimmt nicht.

Ich hab noch nicht alle überprüft, aber die Inkonsistenzen sind doch 
hoch.

Hast Du eine Erklärung dafür? Hab ich was übersehen? Hast Du mal alle 
getestet?
LG Armin

von Armin J. (arminj)


Lesenswert?

Gibt es einen Grund, warum der struct Name "IRMP_PACKED_STRUCT" in der 
32 bit Version fehlt (irmpsystem.h Zeile 227ff.)?
Und wo ist der Unterschied zwischen beiden?
1
#if IRMP_32_BIT == 1
2
3
typedef struct
4
{
5
    uint8_t                             protocol;                                   // protocol, e.g. NEC_PROTOCOL
6
    uint16_t                            address;                                    // address
7
    uint32_t                            command;                                    // command
8
    uint8_t                             flags;                                      // flags, e.g. repetition
9
} IRMP_DATA;
10
11
#else // not IRMP_32_BIT == 1
12
13
#if defined(PIC_C18)
14
#  define IRMP_PACKED_STRUCT
15
#else
16
#  ifndef IRMP_PACKED_STRUCT
17
#    define IRMP_PACKED_STRUCT          __attribute__ ((__packed__))
18
#  endif
19
#endif
20
21
typedef struct IRMP_PACKED_STRUCT
22
{
23
    uint8_t                             protocol;                                   // protocol, e.g. NEC_PROTOCOL
24
    uint16_t                            address;                                    // address
25
    uint16_t                            command;                                    // command
26
    uint8_t                             flags;                                      // flags, e.g. repetition
27
} IRMP_DATA;
28
29
#endif // IRMP_32_BIT == 1

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Hi Armin,

ich habe Deine Mail mit gleichlautendem Text bereits erhalten, hatte 
aber noch keine Zeit, alle Fragen zu beantworten. Ich fange mal hier an.

Armin J. schrieb:

> ich habe mal eine Testprogramm geschrieben, das alle Protokolle sendet
> und die dann mit AllProtocols auf einem anderen Arduino empfangen.
>
> 
https://github.com/ukw100/IRMP/blob/master/examples/SendAllProtocols/SendAllProtocols.ino

Habe ich mir noch nicht angeschaut.

> dabei ist mir ein Fehler aufgefallen:

Danke, werde ich korrigieren fürs nächste Release.

> Einige Protokolle z.B. RECS80, RC6, RECS80EX, RC6A, lassen sich nur mit
> einem guten Empfänger IC decodieren, aber viele gehen so.

Was heißt "guter Empfänger"? Von der Frequenz her passender?

> Ich habe auch  die direkte Verbindung getestet, das geht jetzt mit
> IRSND_GENERATE_NO_SEND_RF aber da klappt sogar NEC nicht.

Diese Änderung IRSND_GENERATE_NO_SEND_RF ist offenbar von Dir. Wenn 
sogar NEC nicht geht, muss die Implementierung fehlerhaft sein.

> Die Protokolle A1TVBOX + TELEFUNKEN + ab FAN bis IRMP16 können gar nicht
> decodiert werden.

dito.

> Bei FDC und SIEMENS bekomme ich das Protokoll zwar erkannt, aber das
> Comand stimmt nicht.

dito.

> Ich hab noch nicht alle überprüft, aber die Inkonsistenzen sind doch
> hoch.

In einer Unix-Pipe "irsnd ... | irmp ..." funktionieren sie alle, wenn 
man diejenigen Protokolle, welche zueinander in "Konkurrenz" stehen, 
speziell betrachtet.

> Hast Du eine Erklärung dafür? Hab ich was übersehen? Hast Du mal alle
> getestet?

Ich teste immer mit oben angegebener Pipe, ist im Artikel auch so 
dokumentiert.

von Armin J. (arminj)


Lesenswert?

Frank M. schrieb:
> Was heißt "guter Empfänger"? Von der Frequenz her passender?

Ein TSOP 31238 Modul, nicht die VS1838B Module vom Chinesen.
Das 31238 ist aber eigentlich schlechter, da es die Marks um 60 statt 
-20 Microsekunden wie bei VS1838B verlängert.

> Diese Änderung IRSND_GENERATE_NO_SEND_RF ist offenbar von Dir. Wenn
> sogar NEC nicht geht, muss die Implementierung fehlerhaft sein.

Ist klar!
In dem Fall IRSND_GENERATE_NO_SEND_RF wird nur ein Low ausgegeben, statt 
dem 38 kHz Signal. Sooo viel falsch machen kann man da gar nicht.

Aber vielleicht liegt es daran, dass ich zum Senden 19 kHz benutze und 
zum Empfangen die standard 15 kHz?
Die ersten 8 Protokolle (einschliesslich DENON) klappen bei 
IRSND_GENERATE_NO_SEND_RF, nur NEC wird als Siemens erkannt (eigentlich 
sehr komisch, aber wahr!), danach gibt es teilweise unerkannte 
Protokolle.
Mit IR Übertragung (da kommt das Pulse Shaping des Empfängers Moduls 
dazu), klappt NEC und RC6, aber dafür RECS80 nicht.

> Ich teste immer mit oben angegebener Pipe, ist im Artikel auch so
> dokumentiert.

Ist das der Grund, warum der Telefunken Fehler bisher nicht aufgefallen 
ist?

Ausserdem konnte ich die Dokumentation auch nach längerem Suchen nicht 
finden :-(

IRMP ist schon eine tolle Library, aber wenn man damit einen Sender 
bauen will, ist es doch wohl nur eingeschränkt zu empfehlen, was sehr 
schade ist.

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


Lesenswert?

Armin J. schrieb:
> Mit IR Übertragung (da kommt das Pulse Shaping des Empfängers Moduls
> dazu), klappt NEC

Wenn NEC über IR funktioniert, dann sehe ich wirklich nicht, warum das 
über Draht nicht funktionieren soll - im Gegenteil.

Ich habe hier auf µc.net auch schon einigen Anwendern empfohlen, für 
Kabel-Übertragungen NEC zu verwenden, habe ihnen auch die entsprechenden 
Tipps gegeben, wie sie im Source die Modulation abstellen können. Es hat 
bei allen auch so perfekt funktioniert. Allerdings waren das allesamt 
reinrassige AVR-Anwendungen ohne Arduino-Laufzeitsystem.

Ich weiß von Hörensagen, dass Arduino selbst einige Timer in Beschlag 
nimmt. Kann es sein, dass diese Arduino-Timer dafür sorgen, dass der 
IRSND-Output einen Jitter hat?

> Aber vielleicht liegt es daran, dass ich zum Senden 19 kHz benutze und
> zum Empfangen die standard 15 kHz?

Kommt auf das Protokoll an. Warum nimmst Du ausgerechnet 19kHz?

> aber dafür RECS80 nicht.

RECS80 verwendet sehr kurze Pulse, es könnte sein, dass 15KHz dafür zu 
wenig ist. Bei 15kHz sind das höchstens 4 Low-Messungen für einen Puls. 
Ich habe auch in Erinnerung, dass ich dafür früher als Empfehlung 20kHz 
in irmpconfig.h geschrieben habe. Ich habe auch nochmal nachgeschaut. 
Jetzt steht da 15kHz drin... sollte ich wieder ändern.

Schaue Dir bitte auch mal IR-Data/recs80-15kHz.txt an. Da siehst Du die 
extrem kurzen Pulse (4 Nullen).

> Ist das der Grund, warum der Telefunken Fehler bisher nicht aufgefallen
> ist?

Keine Ahnung, warum. Es könnte sein, dass der Fehler sich erst nach den 
Telefunken-Tests eingeschlichen hat.

> In dem Fall IRSND_GENERATE_NO_SEND_RF wird nur ein Low ausgegeben, statt
> dem 38 kHz Signal. Sooo viel falsch machen kann man da gar nicht.

Okay, dann schalte auf der IRMP-Seite das Logging ein und schicke mir 
die Scans. Dann kann ich mehr dazu sagen.

> IRMP ist schon eine tolle Library, aber wenn man damit einen Sender
> bauen will, ist es doch wohl nur eingeschränkt zu empfehlen, was sehr
> schade ist.

Armin, dieser Allgemeinplatz stimmt so nicht. Du testest das unter 
Bedingungen, die ich nicht kenne. Und das nicht nur mit eigenhändigen 
Source-Änderungen, sondern auch unter einer Arduino-Laufzeitumgebung, wo 
es (für mich) viele Unbekannte gibt.

Ich kann Dir auch gern die notwendigen Änderungen schicken, um dem IRSND 
in der  nativen Umgebung (ohne Arduino) die Modulation abzugewöhnen. 
Vielleicht entdeckt man dann ja im Verhalten einen Unterschied.

> Ausserdem konnte ich die Dokumentation auch nach längerem Suchen nicht
> finden :-(

Siehe Kapitel IRMP: IRMP unter Linux und Windows und 
IRSND: IRSND unter Linux und Windows, speziell den Abschnitt "IRSND 
unter Windows".

Dort steht:
1
Nun kann man direkt mit IRMP anschließend testen, ob das erzeugte Telegramm auch korrekt ist:
2
3
           ./irmp-15kHz < nec.txt
4
5
bzw. unter Windows:
6
7
           irmp.exe < nec.txt
8
9
Das Ganze geht auch ohne Zwischendatei, nämlich:
10
11
           ./irsnd-15kHz 2 00FF 0001 | ./irmp-15kHz
12
13
bzw. unter Windows:
14
15
           irsnd.exe 2 00FF 0001 | irmp.exe
16
17
IRMP gibt dann als Ergebnis folgendes aus:
18
19
           11111111000000001000000001111111 p =  2, a = 0x00ff, c = 0x0001, f = 0x00
20
21
IRMP konnte also aus dem von IRSND generierten Frame wieder das Protokoll 2, Adresse 0x00FF und Kommando 0x0001 decodieren.

Ich muss zugeben, dass die Überschrift "IRSND unter Windows" hier falsch 
ist. Da fehlt eine Zwischenüberschrift, da der zitierte Text für IRSND 
für Linux und Windows gilt. Offenbar ist diese beim Split des 
IRMP-Artikels vor langer Zeit verlorengegangen.

Also bitte:

Schicke mir die Scans und ich sage Dir mehr.

: Bearbeitet durch Moderator
von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Ich muss da nochmal nachhaken:

Armin J. schrieb:
> Die ersten 8 Protokolle (einschliesslich DENON) klappen bei
> IRSND_GENERATE_NO_SEND_RF, nur NEC wird als Siemens erkannt (eigentlich
> sehr komisch, aber wahr!),

Du hast geschrieben, dass Du IRMP mit 15kHz laufen lässt und dann 
SIEMENS statt NEC erkannt wird.

Das ist eigentlich unmöglich:
1
cc -Wall -DF_INTERRUPTS=10000 irmp.c -o irmp-10kHz
2
In file included from irmp.c:23:0:
3
irmp.h:212:4: warning: #warning F_INTERRUPTS too low, SIEMENS protocol disabled (should be at least 15000) [-Wcpp]

Für SIEMENS muss eine höhere Frequenz eingestellt werden, damit das 
Protokoll überhaupt aktiviert wird.

von Armin J. (arminj)


Lesenswert?

Frank M. schrieb:
> Siehe Kapitel IRMP unter Linux und Windows und
> IRSND unter Linux und Windows, speziell den Abschnitt "IRSND unter
> Windows".

Die Links sind für mich leer :-(
1
IRMP unter Linux und Windows
2
Aus der Mikrocontroller.net Artikelsammlung, mit Beiträgen verschiedener Autoren (siehe Versionsgeschichte)
3
4
Diese Seite enthält momentan noch keinen Text. Du kannst sie erstellen, ihren Titel auf anderen Seiten suchen oder die zugehörigen Logbücher betrachten.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Armin J. schrieb:
> Gibt es einen Grund, warum der struct Name "IRMP_PACKED_STRUCT" in der
> 32 bit Version fehlt (irmpsystem.h Zeile 227ff.)?

Weil derjenige, der die 32-Bit-Version in IRMP eingebaut hat, eine Menge 
außer acht gelassen hat. Nein, das war nicht ich. Leider ist es meistens 
so, dass diejenigen, die mir Source-Änderungsvorschläge zukommen lassen, 
das große Ganze dabei nicht im Blick haben und nur ihre konkrete Lösung 
für ihr meist ganz spezifisches Problem sehen.

Dann kommt da eine unvollständige Lösung raus, die erst ein halbes Jahr 
später bemerkt wird. Mittlerweile bin ich da auch viel skeptischer und 
baue Änderungsvorschläge nur mit Unwillen ein, weil ich meist auch nicht 
übersehen kann, an welcher Ecke das Ganze dann nach hinten losgeht.

Und das, obwohl ich da mittlerweile eine umfangreiche Test-Suite unter 
IR-Data gebaut habe, die jedes Mal, bevor ich ein Release rausgebe, 
komplett durchlaufen muss.

Ich werde wohl in der nächsten Version die 32-Bit-Variante wieder 
entfernen. Diese wurde lediglich dafür eingebaut, um eine ganz spezielle 
Fernbedienung mit 32-Bit-Merlin-Protokoll vollständig dekodieren zu 
können - ohne dabei zu bedenken, dass dabei alle anderen FBs, welche das 
16-Bit-Merlin-Protokoll verwenden, dann nicht mehr decodiert werden 
können. Auf Deutsch: Dieser Patch ist unbrauchbar. Also fliegt er in der 
nächsten Version wieder raus.

von Armin J. (arminj)


Lesenswert?

Frank M. schrieb:
> Kommt auf das Protokoll an. Warum nimmst Du ausgerechnet 19kHz?

Weil das die Hälfte von 38 kHz ist. Ich mache beim Senden bit banging 
mit 76 kHz. Im Oszilloskop sind die Impulse und Pausen 580 us statt 560 
us lang. Bei 15 kHz wären es 600 us.

> Für SIEMENS muss eine höhere Frequenz eingestellt werden, damit das
> Protokoll überhaupt aktiviert wird.
15000 reichen aber, 14999 vielleicht nicht...

> Armin, dieser Allgemeinplatz stimmt so nicht. Du testest das unter
> Bedingungen, die ich nicht kenne. Und das nicht nur mit eigenhändigen
> Source-Änderungen, sondern auch unter einer Arduino-Laufzeitumgebung, wo
> es (für mich) viele Unbekannte gibt.
Na Ja soooo unbekannt sind die Arduino Bedingungen auch nicht und die 
Hardware ist unter 5€ zu haben.
Aber als Experte kann ich dir sagen, dass der einzige Interrupt 1 mal 
pro Millisekunde für 15 Mikrosekunden ist, sonst hast Du für IRMP nur 
nacktes Blech.
Die Timer werden auch unter Arduino von Hand gestrichelt. und das Bit 
setzen mit digitalWriteFast ist 1 clock.

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


Lesenswert?

Armin J. schrieb:
> Die Links sind für mich leer

Sorry, mein Fehler, ich hatte sie zu stark gekürzt. Ich habe das jetzt 
im Beitrag korrigiert. Hier nochmal:

IRMP: IRMP unter Linux und Windows
IRSND: IRSND unter Linux und Windows

von Armin J. (arminj)


Lesenswert?

Armin J. schrieb:
> gestrichelt
->gestreichelt

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Armin J. schrieb:
> Weil das die Hälfte von 38 kHz ist. Ich mache beim Senden bit banging
> mit 76 kHz. Im Oszilloskop sind die Impulse und Pausen 580 us statt 560
> us lang. Bei 15 kHz wären es 600 us.

Ich schaue mir Deine Änderungen dazu an und vergleiche es mit meinen 
Änderungen bzgl. Kabelübertragung, die nachweislich funktioniert haben - 
gerade für NEC.

> Für SIEMENS muss eine höhere Frequenz eingestellt werden, damit das
> Protokoll überhaupt aktiviert wird.
>
> 15000 reichen aber, 14999 vielleicht nicht...

Ich habe solche Sperren nicht ohne Grund in den Source eingebaut. Dabei 
habe ich auch die nötigen Toleranzen in die Bewertung, ob 15000 für ein 
Protokoll reicht, einfließen lassen. Kann ja sein, dass eine bestimmte 
SIEMENS-FB auch mit 15000 erkannt wird. Es kann aber auch sein, dass 
eine andere SIEMENS-FB nicht damit funktioniert oder das Aktivieren von 
SIEMENS sogar die Erkennung eines anderen Protokolls aufgrund der 
"schlechten Auflösung" behindert!

Wenn Du solche Sperren wieder entfernst, warum soll ich mich dann Deiner 
Meinung nach noch hier rechtfertigen?

Wird denn NEC erkannt, wenn Du SIEMENS manuell deaktivierst?

Schicke mir bitte IRMP-Scans

1. NEC von einer NEC-FB (als Zeitreferenz)
2. NEC von kabelgebundenem IRSND
3. RS80 von kabelgebundenem IRSND

> Na Ja soooo unbekannt sind die Arduino Bedingungen auch nicht und die
> Hardware ist unter 5€ zu haben.

Ich benutze Arduino nicht - schon gar nicht für AVRs. Nur ab und zu 
gezwungenermaßen für ESP8266, weil es da keine richtige Alternative 
gibt. Und ich werde mir Arduino nicht aufzwingen lassen. Ich finde ja 
Deine Motivation gut, Dich für IRMP/IRSND unter Arduino einzusetzen, 
aber ich kann Dir nur sagen, dass mich überhaupt nichts motivert, das 
selber unter Arduino zum Laufen zu bringen. Sonst hätte ich das längst 
schon gemacht!

von Armin J. (arminj)


Lesenswert?

Frank M. schrieb:
> Wenn Du solche Sperren wieder entfernst, warum soll ich mich dann Deiner
> Meinung nach noch hier rechtfertigen?

Hallo, was ist denn das?
Ich habe F_INTERRUPTS  auf 15000 so wie im standard!
Und dann greift die Sperre F_INTERRUPTS < 15000
num mal nicht!!!

von Armin J. (arminj)


Lesenswert?

Frank M. schrieb:
> das selber unter Arduino zum Laufen zu bringen. Sonst hätte ich das längst
> schon gemacht!
IDE Installieren, Library laden https://www.ardu-badge.com/IRMP, 
Beispiel auswählen, übersetzen und hochladen. Serial Monitor anwerfen, 
freuen.
Bis auf den ersten Schritt mache ich alles in unter 2 Minuten 
(initial!).
Das nächste Beispiel dauert dann nur noch eine Minute :-)

Schade, dass viele noch glauben, Arduino sei nur Bastelkram. Einen AVR 
kann man bis auf den Bootloader komplett in Arduino auf dem nackten 
Blech programmieren, auch den 1 ms Timer kann man auschalten.
Man kann aber auch die Arduino Annehmlichkeiten verwenden, wenn man sie 
benötigt.
Und das flashen eines Programms geht schon super schnell.
Der Compiler und die Flags werden auch gepflegt!

Die IDE insbesondere der Editor is zugegebenermaßen grottig, aber wer 
eine bessere IDE sucht, nimmt eben das Eclipse Plugin Sloeber 
https://eclipse.baeyens.it.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Armin J. schrieb:
> Hallo, was ist denn das?
> Ich habe F_INTERRUPTS  auf 15000 so wie im standard!
> Und dann greift die Sperre F_INTERRUPTS < 15000
> num mal nicht!!!

Okay, sorry, mein Fehler. Ich habe hier ein Makefile unter Linux, 
welches irmp direkt für 10kHz, 15kHz und 20kHz übersetzt.
1
make -f makefile.lnx
2
cc -Wall -DF_INTERRUPTS=10000 irmp.c -o irmp-10kHz
3
In file included from irmp.c:23:0:
4
irmp.h:212:4: warning: #warning F_INTERRUPTS too low, SIEMENS protocol disabled (should be at least 15000) [-Wcpp]
5
cc -Wall -DF_INTERRUPTS=15000 irmp.c -o irmp-15kHz
6
cc -Wall -DF_INTERRUPTS=20000 irmp.c -o irmp-20kHz

Die Fehlermeldung kommt lediglich für 10000 kHz, ich hatte mich da in 
der Zeile verguckt. Du hast recht, für 15kHz wird SIEMENS nicht 
ausgeschlossen.

Nichtsdestotrotz: Wenn die Verbindung IRSND -> IRMP via IR einwandfrei 
funktioniert, warum sollte das bei Kabelverbindung (welche ein besseres 
Medium ist) nicht gehen?

Wie schon gesagt: Ich schaue mir Deine Nicht-Modulations-Routinen im 
IRSND an und werde sie mit meinen vergleichen. Ich hatte die dafür 
notwendigen Modifikationen für Kabelvariante bereits mehrfach hier im 
Forum gepostet - muss nicht unbedingt in diesem Thread gewesen sein.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Armin J. schrieb:
> IDE Installieren, Library laden https://www.ardu-badge.com/IRMP,
> Beispiel auswählen, übersetzen und hochladen. Serial Monitor anwerfen,
> freuen.

IDE habe ich bereits wegen ESP8266, okay. Aber warum muss ich mir noch 
eine Plattform ans Bein binden, wenn ich sie nicht brauche? Ich bin 
mittlerweile komplett auf STM32 übergegangen und da brauche ich Arduino 
als Programmierumgebung weiß-gott-nicht.

> Bis auf den ersten Schritt mache ich alles in unter 2 Minuten
> (initial!).

Ich muss erstmal:

- Eine halbe Stunde suchen, um überhaupt noch 2 AVRs zu finden
- Mir 2 Platinen löten oder Steckbretter aufbauen
- 2 Programmieradapter dranbauen
- Meinen alten AVR-Flasher suchen
- Testen

Dann sind 2-3 Stunden um, die mir persönlich überhaupt nichts bringen, 
sondern mir meine wertvolle Freizeit rauben.

Da schaue ich lieber in Deinen Source, wie Du die IR-Modulation durch 
Bit-Banging ersetzt hast. Das geht schneller.

> Das nächste Beispiel dauert dann nur noch eine Minute :-)

Und dann? Schmeiße ich die Arduino-Boards in die Ecke oder verkaufe die 
an Dich? Ich brauche die nicht. Verkaufst Du anderen auch 
Waschmaschinen, obwohl sie einen Herd suchen?

> Schade, dass viele noch glauben, Arduino sei nur Bastelkram.

Das ist mir wirklich vollkommen egal, ob das Bastelkram ist. Ich brauche 
es einfach nicht, genauso, wie ich gerade keine Waschmaschine brauche - 
weil ich bereits eine habe. Ich weiß nur, dass viele Arduino-Anwender 
sich einfach irgendwelche Libs ohne Sinn und Verstand zusammenklicken. 
Und dann nennen sie das "Programmieren". Dann schlagen sie im Forum auf 
- ohne überhaupt Ahnung davon zu haben, was sie da eigentlich gemacht 
haben. Sie können dann noch nichtmals ihre Probleme konkret schildern.

Okay, es mag da Ausnahmen geben - Dich natürlich eingeschlossen. ;-)

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Frank M. schrieb:
> Da schaue ich lieber in Deinen Source, wie Du die IR-Modulation durch
> Bit-Banging ersetzt hast.

Armin, wo finde ich Deine Änderungen bzgl. IRSND_GENERATE_NO_SEND_RF? 
Auf github finde ich nix in irsnd.c.h.

Hier ein paar Links, wo die User irsnd.c ohne Modulation, entweder über 
Kabel und/oder RF433 MHz erfolgreich getestet haben - nachdem Sie meine 
Tipps zur Entfernung der Modulation im Source umgesetzt hatten. 
Funktionierte selbstverständlich auch mit NEC:

Beitrag "IRMP und IRSND als Protokoll für 433 MHz Sender/Empfänger funktioniert nicht so ganz"
Beitrag "IRSND Ausgabesignal invertieren"
Beitrag "IRSND läuft nicht (richtig)"

Tipp: Um die Modulation herauszuwerfen, sind Anpassungen in irsnd_on(), 
irsnd_off() und irsnd_init() nötig - letzteres auch wegen komplementärem 
Ruhepegel.

von Armin J. (arminj)


Angehängte Dateien:

Lesenswert?

Dass Du jetzt auf STM32 bist, kann ich gut verstehen, damit hab ich 
damals angefangen :-). Das war mir aber gar nicht so klar, und du hast 
Recht, dafür ist Arduino ziemlich Schrott.

> Armin, wo finde ich Deine Änderungen bzgl. IRSND_GENERATE_NO_SEND_RF?
> Auf github finde ich nix in irsnd.c.h.

Ich habe mein Zeug alles in den irmpArduino*, irsndArduino* und den 
IRTimer* Dateien gekapselt, um Dich nicht zu ärgern ;-)


Kannst Du mal deine Tests mit unterschiedlichen Frequenzen laufen 
lassen?

Wenn Ich Siemens ausschalte, wird NEC erkannt.

Ich hänge mal eine Datei mit den Sende und Empfangsprotokoll ran. Da ist 
nur beim Empfang Siemens ausgeschaltet. Daran kann man die 
Inkonsistenzen, die ich meine, schwarz auf weiss sehen.
Das mit dem Bit bang beim Senden mache ich um einen 2. Timer für die 38 
kHz Erzeugung zu sparen.
Das ganze wird aber auf den STM32 auch nicht anders sein.

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


Lesenswert?

Armin J. schrieb:
> Ich habe mein Zeug alles in den irmpArduino*, irsndArduino* und den
> IRTimer* Dateien gekapselt, um Dich nicht zu ärgern ;-)

Ah, okay, werde ich mir anschauen. Vielleicht schaffe ich dies dieses 
Wochenende.

> Kannst Du mal deine Tests mit unterschiedlichen Frequenzen laufen
> lassen?

Du meinst, unter Linux? Die Pipe gibt keine Timestamps mit rüber, 
sondern nur Nullen und Einsen - genau wie es IRMP_LOGGING auch tut. Aus 
diesem Grunde funktioniert die Pipe nur bei IRSND und IRMP, welche mit 
gleicher Frequenz übersetzt wurden.

Aber Deine angehängte Log-Datei ist ganz interessant. Schon ein 
Querlesen zeigt mir, dass da noch nachgebessert werden muss: Es macht 
zum Beispiel keinen Sinn, einen größeren Wert für command vorzusehen, 
als das Protokoll überhaupt zur Verfügung hat.

Beispiel: Nikon hat fürs Kommando nur 2 Bits. Ein command mit dem Wert 
0x54 wird dann bereits im IRSND gekürzt auf 2 Bits und damit 0x00. Was 
dann IRMP auch korrekt mit command=0x00 anzeigt ;-)

Aber ich sehe auch noch was anderes, zum Beispiel dieses:
1
Protocol=FAN  Address=0x61 Command=0x61 Repeats=1         P=NUBERT  A=0x0 C=0x30

Wie ich erst Monate nach Implementierung von FAN und NUBERT erkannt 
habe, handelt es sich hier um dasselbe Protokoll - aber von IRMP auf 
verschiedene Weise aufgrund der dürftigen Datengrundlage interpretiert, 
was das letzte Bit angeht. Das erklärt auch die Diskrepanz von
1
C = 0x30 * 2 + 1 = 0x61
Ich werde beide Protokolle bei Gelegenheit zusammenführen und ihm dann 
wahrscheinlich den Namen NUBERT geben. FAN entfällt dann.

Auch Deine anderen mit Fragezeichen gekennzeichneten Zeilen werde ich 
mir genauer anschauen, wobei ich mir aber ziemlich sicher bin, dass es 
sich hier größtenteils um Protokoll-Konflikte handelt, die ich mit der 
Statemachine, welche on-the-fly dekodiert, nicht mehr auflösen kann. 
Vermutlich kann man auch hier durch gezieltes Deaktivieren von 
bestimmten Protokollen die anderen auch zum Leben erwecken ;-)

Wirklich alle Protokolle auf IRMP einzuschalten ist schlicht unmöglich. 
Aber das kann man nun wirklich nicht IRSND anlasten - egal ob 
kabelgebunden oder über IR.

Auch meine Test-Suite setzt zwar alle Protokolle in irmpconfig.h auf 1, 
lässt aber durchaus den Compiler diejenigen Protokolle wieder 
zurücksetzen, welche in Konflikt mit anderen stehen. Um das allumfassend 
zu lösen, muss man den Gedanken der On-The-Fly-Dekodierung fallenlassen 
und stattdessen erst den kompletten Frame einlesen und dann als 
Gesamtheit dekodieren. Dann kann man durch Versuch-und-Irrtum immer 
wieder von vorn anfangen, also den Frame "zurückspulen". Das geht aber 
On-The-Fly nicht.

Jetzt kommt die Frage nach Nutzen vs. Aufwand. Die meisten IRMP-Anwender 
interessieren sich für Dekodierung eines konkreten Protokolls, manche 
für gleichzeitige Dekodierung einer Handvoll Protokolle. Es gibt 
eigentlich keinen, der eine eierlegende Wollmilchsau will, also alle 
unterstützten Protokolle zur gleichen Zeit dekodieren möchte. Ich lege 
mir jedenfalls keine 50 Fernbedienungen gleichzeitig auf den 
Wohnzimmertisch ;-)

Noch etwas zu:
1
IRMP16  Address=0x27 Command=0x27            P=ONKYO  A=0x27 C=0x27

Das IRMP16-Protokoll habe ich "erfunden", um damit effizient und 
möglichst fehlerfrei Daten zwischen 2 Mikrocontrollern via IR zu 
übertragen. Da hier ein konkretes Szenario vorliegt, wo man 
praktischerweise nur dieses eine Protokoll aktiviert und alle anderen 
deaktiviert, habe ich auf etwaige Konflikte wie z.B. ONKYO keine 
Rücksicht genommen. Von daher halte ich den Einsatz von IRMP16 in einem 
ALL-Protocols-Test für nicht sinnvoll.

Mein Fazit:

Dein All-Protocols-Ansinnen ist ein Anspruchdenken, was prinzipbedingt 
nicht hundertprozentig erfüllt werden kann - und auch gar nicht erfüllt 
sein muss. Es reicht, wenn die Anwender(!) das bekommen, was sie wollen.

> Wenn Ich Siemens ausschalte, wird NEC erkannt.

Aha. IRSND ist also vermutlich gar nicht schuld. :)

Fragt sich nur noch, warum IRMP kabelgebunden auf SIEMENS beharrt. Die 
Timings sind hier durchaus unterscheidbar und sollten auch nicht in 
Konflikt stehen.

Hier helfen wirklich nur Scans weiter. Wäre klasse, wenn Du hier welche 
mittels IRMP_LOGGING erstellen könntest. Die kann ich dann direkt in den 
IRMP unter Linux reinschicken und das Verhalten debuggen.

Übrigens wurden mit dieser Vorgehensweise mindestens 80% aller von IRMP 
unterstützten Protokolle in den IRMP eingebaut: Die Leute haben mir ihre 
Scans geschickt, ich habe sie mit
1
     irmp-15kHz -a < scan.txt
analysiert, dann das Protokoll implementiert, mit
1
     irmp-15kHz -v < scan.txt
debuggt und letztendlich mit
1
     irmp-15kHz < scan.txt
den Abschluss-Test gemacht. Dafür brauchte ich weder eine Fernbedienung 
noch einen µC nebst TSOP.

> Das mit dem Bit bang beim Senden mache ich um einen 2. Timer für die 38
> kHz Erzeugung zu sparen.

Das ist ja auch richtig, wenn der Pegelwechsel auch mit dem 1. Timer 
angesteuert wird. Deine Angabe von 580us statt 560us bei 19kHz ist auch 
kalkulierbar:
1
Raster ist: 1 / 19000 = 52,6315 us
Der an 560 nächstgelegene ganzzahlige Wert als Multiplikator ist 11:
1
11 * 52,6315 us = 579 us

Ebenso kann man auch den Fehler für 15kHz berechnen:
1
Raster ist: 1 / 15000 = 66,6667 us
Der an 560 nächstgelegene ganzzahlige Wert als Multiplikator ist 9:
1
9 * 66,6667 us = 600 us
Obwohl eigentlich
1
8 * 66,6667 us = 533 us
noch minimal besser ist. Hmmm, werde ich bei Gelegenheit mal 
untersuchen.

Aber 580 oder 600 us für NEC sind kein Problem, denn IRMP arbeitet hier 
mit Toleranzen von satten 30%.

> Das ganze wird aber auf den STM32 auch nicht anders sein.

Hast Du Dir mal meine Links auf die verschiedenen IRSND-Threads 
angeschaut? Da hatte ich die entsprechenden Tipps gegeben, wie man für 
AVR (nicht STM32!) die Modulation ausschaltet. Wichtig ist auch die 
Einstellung des Ruhepegels in irsnd_init(), denn der Pin muss hier für 
eine Kabelverbindung auf HIGH statt LOW gestellt werden. Zumindest ist 
das für den ersten zu sendenden Frame wichtig. Danach sollte der 
Ruhepegel sowieso korrekt stehen.

: Bearbeitet durch Moderator
von Armin J. (arminj)


Lesenswert?

Wow, soviel Text, ich könnte das nicht und bin ehrlich beeindruckt!

> Auch Deine anderen mit Fragezeichen gekennzeichneten Zeilen werde ich mir 
genauer anschauen, wobei ich mir aber ziemlich sicher bin, dass es sich hier 
größtenteils um Protokoll-Konflikte handelt, die ich mit der Statemachine, welche 
on-the-fly dekodiert, nicht mehr auflösen kann.

Verstehe ich das richtig, dass die Statemachine da auf der falschen 
Fährte ist und dann nicht fertig werden kann?
Dann muss ich die aus den 39 gleichzeitig zu Empfangenden rausnehmen.
Vielleicht kann man ja die Konflikte dann auch per #error ausgeben.

> Die meisten IRMP-Anwender interessieren sich für Dekodierung eines konkreten 
Protokolls
Es gibt aber auch viele Anwender, die eine FB haben und das Signal 
verarbeiten wollen, ohne das Protokoll zu kennen. Dafür ist das mit den 
39 gleichzeitig eben perfekt!
Und es ist einfach schön sagen zu können "seht her, diese super Library 
kann 39 Protokolle simultan empfangen" (was übrigens der Grund ist, dass 
es in Tasmota integriert werden soll :-))
Du siehst, ich bin auch ein bischen stolz auf Deinen Code.

> Das IRMP16-Protokoll habe ich "erfunden",...
Ich habs schon aus der All Liste entfernt.

> Aha. IRSND ist also vermutlich gar nicht schuld. :)
Schuld ist eh keiner, nur wundert es mich auch, warum die Statemachine 
gerade dabei auf die falsche Fährte gelockt wird.

> Dafür brauchte ich weder eine Fernbedienung noch einen µC nebst TSOP.
Aber die Scans enthalten ja das Verhalten des unbekannten User 
Empfängers, also das Verlängern des Marks / Verkürzen des Spaces. Und 
mit einem anderen Empfänger gibt es dann Probleme, die sind echt sehr 
unterschiedlich, wie ich oben schon geschrieben habe, also von 60 bis 
-20 us Verlängerung des Marks. Und ausserdem sendet man ja dann die 
verlängerten Marks, die dann vom Empfänger wieder verlängert werden.
Ist schwierig, ich weiss, andere Libraries haben dafür z.B. #define 
MARK_EXCESS_MICROS    100, die sie beim Timing berücksichtigen. Ist nur 
kompliziert, das nachträglich einzubauen.

> Hast Du Dir mal meine Links auf die verschiedenen IRSND-Threads angeschaut?
Hab ich nicht, aber ich habs wahrscheinlich genau so umgesetzt wie dort 
beschrieben, es funktioniert ja auch :-).

Den Scan mache ich jetzt, aber stört da die serielle Ausgabe nicht das 
Timing?

von Armin J. (arminj)


Angehängte Dateien:

Lesenswert?

Hier die Tabelle mit einem STM32 BluePill als Empfänger, der Sender ist 
immer noch ein AVR. Es gibt merkwürdigerweise einige Unterschiede.

von Armin J. (arminj)


Lesenswert?

Das mit den Scans geht nicht. Die ANALYZE_PRINTF5 etc schreiben auf 
stdout und den gibts ohne Runtime nicht.

von Jörg R. (jrie)


Lesenswert?

Hallo Armin und Frank,

ich habe auch mal getestet, auf zwei STM32F103 über IR mit TSOP4838 aus 
China.
Dabei waren alle mit 20kHz möglichen Protokolle an.
So wie bei Armin geht A1TVBOX und MITSU_HEAVY nicht, SIEMENS wird als 
A1TVBOX erkannt, SAMSUNG48 wird verdoppelt/wiederholt erkannt, bei DENON 
und FDC keine Wiederholung.
Im Gegensatz zu Armin geht TELEFUNKEN, aber FDC nicht.
BANG_OLUFSEN, Lego gehen auch nicht.
RECS80 und RECS80EX gehen selten.

Wenn ich bescheiden bin, und nur die ersten ca. 15 nicht-exotischen 
Protokolle aktiviere, geht fast alles. Nur SIEMENS wird nicht erkannt 
und bei SIRCS und DENON stimmt die Adresse nicht. IRSND muss mit 20kHz 
laufen, mit 15 kHz wird fast nichts erkannt.

Bei den Tests habe ich die Firmware aus 
https://github.com/j1rie/IRMP_STM32 benutzt.

Was ganz anderes: Es gibt von mir auch einen Tastatur-IR-Empfänger:
https://www.vdr-portal.de/forum/index.php?thread/132289-irmp-auf-stm32-ein-usb-hid-keyboard-ir-empf%C3%A4nger-einschalter-mit-wakeup-timer/
https://github.com/j1rie/IRMP_STM32_KBD
Das wäre vielleicht was für die Link-Sammlung.

von Klaus R. (klaus2)


Lesenswert?

Jörg R. schrieb:
> BANG_OLUFSEN, Lego gehen auch nicht.

...interessant, hatte mit nämlich mal ne universal FB gebaut, die zwar 
alles mögliche kann, aber das eigentliche Ziel, eine "kleine Kopie" des 
B&O MCP5500 Monsters nicht hinbekommen hat.

Klaus.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Jörg R. schrieb:

> Dabei waren alle mit 20kHz möglichen Protokolle an.
> So wie bei Armin geht A1TVBOX und MITSU_HEAVY nicht, SIEMENS wird als
> A1TVBOX erkannt, SAMSUNG48 wird verdoppelt/wiederholt erkannt, bei DENON
> und FDC keine Wiederholung.
> Im Gegensatz zu Armin geht TELEFUNKEN, aber FDC nicht.
> BANG_OLUFSEN, Lego gehen auch nicht.
> RECS80 und RECS80EX gehen selten.

Danke, werde ich mir bei Gelegenheit anschauen.

> Was ganz anderes: Es gibt von mir auch einen Tastatur-IR-Empfänger:
> 
https://www.vdr-portal.de/forum/index.php?thread/132289-irmp-auf-stm32-ein-usb-hid-keyboard-ir-empf%C3%A4nger-einschalter-mit-wakeup-timer/
> https://github.com/j1rie/IRMP_STM32_KBD
> Das wäre vielleicht was für die Link-Sammlung.

Sicher, nehme ich auf :)

Gruß und Dank,

Frank

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Klaus R. schrieb:
> Jörg R. schrieb:
> BANG_OLUFSEN, Lego gehen auch nicht.
>
> ...interessant, hatte mit nämlich mal ne universal FB gebaut, die zwar
> alles mögliche kann, aber das eigentliche Ziel, eine "kleine Kopie" des
> B&O MCP5500 Monsters nicht hinbekommen hat.

B&O läuft mit 455(!) kHz Modulation, das ist mit einem 38kHz-TSOP bei 
bestem Willen nicht zu empfangen. Als ich damals B&O eingebaut habe, hat 
das bei einem User, der für mich das B&O-Protokoll scannte, auch 
funktioniert - aber nur mit diesem speziellen TSOP. Die Bezugsquelle 
wurde auch genannt. Meiner Erinnerung nach war das in diesem Thread.

von Klaus R. (klaus2)


Lesenswert?

...ja, das weiß ich - natürlich habe ich den korrekten TSOP. Die FB 
quittiert auch den korrten Empfang. Nur reagiert die B&O nicht drauf. 
Bei allen anderen geräten im haushalt geht die Universal-FB...aber mgl, 
dass B&O MCP5500 ein anderes Protokoll verwendet...denn die FB ist IR, 
aber *bi*-direktional :)

Klaus.

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


Lesenswert?

Klaus R. schrieb:
> Bei allen anderen geräten im haushalt geht die Universal-FB...aber mgl,
> dass B&O MCP5500 ein anderes Protokoll verwendet.

Kann IRMP denn die Original-B&O-FB dekodieren? Wenn nicht, ist das wohl 
ein abweichendes Protokoll.

von Jörg R. (jrie)


Lesenswert?

Nachtrag zu den nicht-exotischen Protokollen: Bei SIRCS, DENON und IR60 
geht die Wiederholung nicht.

von Jörg R. (jrie)


Lesenswert?

Meine Ergebnisse der nicht-exotischen Protokolle:
1
gesendet      empfangen    Fehler
2
01001f003f00  010000003f00 SIRCS keine Adresse
3
02001f003f00  02001f003f00 OK
4
03001f003f00  03001f003f00 OK
5
04001f003f00  04001f003f00 OK
6
05001f003f00  05001f003f00 OK
7
07001f003f00  07001f003f00 OK
8
08001f003f00               DENON geht nur manchmal
9
09001f003f00  09001f003f00 OK
10
0f001f003f00  0f0000003f00 OK
11
10001f003f00  10001f003f00 OK
12
11001f003f00               SIEMENS geht nicht
13
14001f003f00  14000f003f00 OK
14
15001f003f00  15001f003f00 OK
15
18001f003f00  180000003f00 OK
16
1b001f003f00  1b001f003f00 OK
17
1c001f003f00  1c001f003f00 OK
18
gesendet     empfangen                  Fehler
19
01001f003f01 010000003f00 010000003f01  SIRCS keine Adresse
20
02001f003f01 02001f003f00 02001f003f01  OK
21
03001f003f01 03001f003f00 03001f003f01  OK
22
04001f003f01 04001f003f00 04001f003f01  OK
23
05001f003f01 05001f003f00 05001f003f01  OK
24
07001f003f01 07001f003f00 07001f003f01  OK
25
08001f003f01 08001f03c000               DENON geht nur manchmal, Kommando falsch
26
09001f003f01 09001f003f00 09001f003f01  OK
27
0f001f003f01 0f0000003f00 0f0000003f01  OK
28
10001f003f01 10001f003f00 10001f003f01  OK
29
11001f003f01                            SIEMENS geht nicht
30
14001f003f01 14000f003f00 14000f003f01  OK
31
15001f003f01 15001f003f00 15001f003f01  OK
32
18001f003f01 180000003f00               OK
33
1b001f003f01 1b001f003f00 1b001f003f01  OK
34
1c001f003f01 1c001f003f00 1c001f003f01  OK

von Jörg R. (jrie)


Lesenswert?

Ich habe meine Universal Fernbedienung auf Siemens gestellt. Erkannt 
wird mal Siemens, mal Grundig, mal Ruwido.
Sony wird als Sony erkannt, aber auch mit Adresse 0.
Denon wird als  NEC erkannt.
Die letzten beiden könnten an der Fernbedienung liegen oder an 
IRSND/IRMP.
Bei Siemens scheint sowohl bei IRSND als auch bei IRMP der Wurm drin zu 
sein.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Jörg R. schrieb:
> 11001f003f00               SIEMENS geht nicht

Jörg R. schrieb:
> Ich habe meine Universal Fernbedienung auf Siemens gestellt. Erkannt
> wird mal Siemens, mal Grundig, mal Ruwido.

Für Siemens hatte ich mal vor langer Zeit eine testweise Änderung 
gemacht. Warum, weiß ich nicht mehr, ist zu lange her. Jedenfalls hatte 
damals diese Änderung den Weg ins Release gefunden - wohl eher 
versehentlich.

Das war für 15kHz auch kein Problem, erst bei 20kHz machen sich dann die 
Unterschiede bemerkbar.

Am besten macht man meine Änderung in *irmpprotocols.h* wieder 
rückgängig.
Alt:
1
/*-------------------------------------------------------------------------
2
 * SIEMENS & RUWIDO:
3
 *------------------------------------------------------------------------- */
4
5
#if 0
6
#define SIEMENS_OR_RUWIDO_START_BIT_PULSE_TIME    275.0e-6                      //  275 usec pulse
7
...

Neu:
1
/*-------------------------------------------------------------------------
2
 * SIEMENS & RUWIDO:
3
 *------------------------------------------------------------------------- */
4
5
#if 1
6
#define SIEMENS_OR_RUWIDO_START_BIT_PULSE_TIME    275.0e-6                      //  275 usec pulse
7
...


Also einfach aus "if 0" ein "if 1" machen.

Ich werde das so fürs nächste Release ebenso anpassen.

Klaus, kannst Du das mal mit Deiner Siemens-FB testen?

: Bearbeitet durch Moderator
von Klaus R. (klaus2)


Lesenswert?

Frank M. schrieb:
> Klaus, kannst Du das mal mit Deiner Siemens-FB testen?

...ich habe nur B&O MCP5500, aber der ist gerade eingemottet.

Klaus.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Klaus R. schrieb:
> Frank M. schrieb:
>> Klaus, kannst Du das mal mit Deiner Siemens-FB testen?
>
> ...ich habe nur B&O MCP5500, aber der ist gerade eingemottet.

Sorry, ich meinte Jörg, er hatte das ja mit einer Universal-FB getestet.

von Jörg R. (jrie)


Lesenswert?

Mit der Änderung ist es leider wie zuvor, Siemens mit IRSND -> IRMP geht 
nicht und Fernbedienung -> IRMP bringt mal Siemens, mal Grundig, mal 
Ruwido (es könnte sein, dass jetzt öfter Siemens kommt als vorher).

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Jörg R. schrieb:
> Mit der Änderung ist es leider wie zuvor, Siemens mit IRSND -> IRMP geht
> nicht und Fernbedienung -> IRMP bringt mal Siemens, mal Grundig, mal
> Ruwido (es könnte sein, dass jetzt öfter Siemens kommt als vorher).

Danke für den Test. Kannst Du bei Gelegenheit ein paar Scans per 
IRMP_LOGGING erzeugen?

von eku (Gast)


Lesenswert?

Hallo Frank,

> Kannst Du bei Gelegenheit ein paar Scans per IRMP_LOGGING erzeugen?

Du hast urprünglich für meine M740AV das SIEMENS implementiert. Die 
Scans dazu müsstest Du noch haben.

Die M740AV sind seit längerem entsorgt, die FB besitze ich aber noch. 
Bei Bedarf erstelle ich Logs. Aber eigentlich hast Du die schon.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

eku schrieb:
> Du hast urprünglich für meine M740AV das SIEMENS implementiert. Die
> Scans dazu müsstest Du noch haben.

Ja, die 15kHz-Scans von Dir habe ich noch und werden im Ordner IR-Data 
mit ausgeliefert. Die laufen einwandfrei durch - mit 15kHz. Diese Daten 
sind auch  meine Referenz für Siemens.

Der obige Patch war auch für die Variante mit 20kHz - da konnte der IRMP 
die von IRSND erzeugten Frames nicht mehr erkennen. Nach dem Patch 
(exakteres Timing) ging das wieder.

Offenbar gibt es bei Siemens aber mitunter stärker abweichende Timings - 
jedenfalls bei der Universal-FB von Jörg. Deshalb bat ich ihn um Scans, 
um Unterschiede feststellen und eventuell berücksichtigen zu können.

@Jörg: Mit welcher Frequenz wurde der IRMP übersetzt? Mit 20kHz oder 
15kHz?

von Jörg R. (jrie)


Lesenswert?

IRSND und IRMP waren auf 20 kHz.
Bis ich dazu komme, Scans zu machen, kann es aber etwas dauern.
Möchtest du Scans mit 15 kHz oder mit 20 kHz?

Die Frage ist auch, wie aussagekräftig Scans meiner URC 7541 sind.
Vielleicht wären Scans von eku's M740AV FB mit 20 kHz interessanter?

Ich bin übrigens deshalb bei IRMP auf 20 kHz, weil ich neben den 
nicht-exotischen auch RCMM an habe (das wurde im VDR Umfeld so gewünscht 
von Fujitsu-Siemens Activy Besitzern). Ich hatte aber zuerst ohne RCMM 
getestet, und ob mit oder ohne RCMM gab es bei der Erkennung keinen 
Unterschied.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Jörg R. schrieb:
> IRSND und IRMP waren auf 20 kHz.

Gut zu wissen.

> Bis ich dazu komme, Scans zu machen, kann es aber etwas dauern.
> Möchtest du Scans mit 15 kHz oder mit 20 kHz?

Vielleicht sind Deine geschilderten Probleme mit 15kHz weg? Von daher 
erscheinen mir 20er sinnvoller.

Jörg R. schrieb:
> Die Frage ist auch, wie aussagekräftig Scans meiner URC 7541 sind.

Sehr: Du hast Probleme mit Deiner FB. Die kann ich nur lösen, wenn ich 
davon Scans habe. Außerdem ist ein Vergleich mit der "Referenz" auf 
jeden Fall sinnvoll.

> Vielleicht wären Scans von eku's M740AV FB mit 20 kHz interessanter?

Die kann ich leicht in einen 20kHz-Scan umwandeln, indem ich die Anzahl 
der 0en und 1en mit 1,33 multipliziere.

von Jörg R. (jrie)


Lesenswert?

OK.
Mal eine Verständnisfrage,

Frank M. schrieb:
> Das war für 15kHz auch kein Problem, erst bei 20kHz machen sich dann die
> Unterschiede bemerkbar.

ich hätte gedacht 20kHz ist "besser" als 15kHz, wieso kann 20kHz 
Probleme machen, die bei 15kHz nicht auftreten?

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


Lesenswert?

Jörg R. schrieb:
> ich hätte gedacht 20kHz ist "besser" als 15kHz, wieso kann 20kHz
> Probleme machen, die bei 15kHz nicht auftreten?

Wie ich oben geschrieben habe, hatte ich abweichende Timings in 
irmpprotocols.h mit "#if 1" reingestellt - warum, weiß ich nicht mehr. 
Durch die Umrechnung von Zeiten in Längen, die abhängig von der 
Abtastfrequenz sind, kommen natürlich Rundungen rein. Dann wird zum 
Beispiel aus  gerechneten 6,4 Tastungen ein Wert von 6. Bei 15kHz war 
diese Umrechnung (per Macros in irmp.c) noch im Rahmen der Toleranz.

Bei 20kHz, wo die Umrechnung genauer wird, fielen die Längen aus ekus 
Referenz-Scans raus. Da wird dann zum Beispiel eine 8,5 zur 9 als 
Mindestlänge. Wenn dann eine Länge von 8 gemessen wurde, wurde 
Ruwido/Siemens verworfen.

Wie gesagt: Es waren einfach schlechte Timing-Werte, die bei gröberer 
(15kHz) Tastung nicht aufgefallen sind.

: Bearbeitet durch Moderator
von Andreas S. (1ras)


Angehängte Dateien:

Lesenswert?

Hallo Frank,

danke für dieses tolle Projekt!

Da ich heuer die Beleuchtung meiner Weihnachtskrippe mit der 
Fernbedienung der Weihnachtsbaumkerzen mitschalten möchte, bin ich auf 
IRMP gestoßen. Nur leider benutzt diese Fernbedienung ein bisher nicht 
implementiertes Protokoll. Ich habe es deshalb dokumentiert und als 
Untergruppe von NEC implementiert, da das Anfangstiming sehr ähnlich ist 
und es sich so gleichzeitig aktivieren lässt.

Die Zeiten sind mit dem Oszi gemessen und über die Daten zweier 
Fernbedienungen gemittelt. Die Weihnachtsbaumkerzen mit dieser 
Fernbedienung stammen von Melinera (Lidl, 
https://www.lidl.de/de/melinera-15-led-weihnachtsbaumkerzen/p311723).

Vielleicht kannst du damit etwas anfangen und es in IRMP aufnehmen.

Grüße

Andreas

von Malte _. (malte) Benutzerseite


Angehängte Dateien:

Lesenswert?

Hallo,
vielen dank für IRMP. Ich habe damit eine kleine Platine entwickelt, mit 
der ich meine Osram LED Deckenlampen und meinen Lg Beamer ansteuern 
kann. Beide verwenden das NEC Protokoll. Und weil das meine erste 
Schaltung mit einem STM32 statt eines AVRs war, brauchte ich 3,3V. 
Leider ist mir hier gleich einen Fehler unterlaufen, so dass jetzt ein 
Spannungsregler im TO-92 Gehäuse als Workaround notwendig ist.
Bei IRSND sind alle Protokolle aktiviert, bei IRMP die ersten 15. Damit 
werden ca 26KiB Flash benötigt. Wenn man die STM HAL Lib rauswirft, 
wären noch 3-4KiB zusätzlich für Erweiterungen frei. Mit 12MHz Takt 
läuft der IRPM Interrupt mit 20kHz problemlos. Mit maximal 48MHz hätte 
der STM32 hier auch noch Reserven.
Wie genau muss eigentlich das Timing bei Infrarot sein? Ursprünglich 
wollte ich einen pinkompatiblen STM32L082KZT6 nehmen und hatte den auch 
schon gekauft - dann aber im letzten Moment festgestellt, dass dieser in 
dem Gehäuse keinen externen high speed Quarz (kein HSE, nur LSE) 
unterstützt. Der hätte mit 192KiB Flash mehr als genug Reserve für 
weitere Protokolle.

Falls jemand Interesse hat, ich hätte 4 Platinen, hergestellt bei 
Aisler, zum Selbstkostenpreis von 3,20€ + Porto (0€ Selbstabholung in 
Bielefeld, 1€ als Brief - maximal eine Platine - das Risiko trägt der 
Empfänger, oder bevorzugt 3,20€ als Einwurfeinschreiben - da gibts eine 
Trackingnummer) abzugeben.
Das komplette Projekt gibt es hier:
https://github.com/Solartraveler/irusb

Ein Fehler ist mir beim Zusammenspiel von IRSND und IRMP aufgefallen:
Setzt man IRMP_32_BIT in irmpconfig.h, so bleibt irsnd bei der 16Bit 
Definition und je nach dem welches Include man als erstes eingebunden 
hat, ist dann command in IRMP_DATA 16 oder 32Bit und damit erhält IRSND 
oder IRMP falsche Daten. Einfach die Definition von IRMP_32_BIT in 
irsndconfig.h hinzufügen (wie bei irmpconfig.h) reichte nicht, da 
irsnd.h, im Gegensatz zu irmp.h, erst irmpsystem.h inkludiert und danach 
irsndconfig.h. Hier die Reihenfolge der Inkludes zu vertauschen war auch 
keine Lösung, da irsndconfig.h die ARM_STM_HAL Definition aus 
irmpsystem.h benötigt. Als Workaround habe ich dann ARM_STM_HAL noch mal 
in irsndconfig.h definiert.

von Andreas S. (1ras)


Angehängte Dateien:

Lesenswert?

Bezüglich der Fernbedienung der Melinera (Lidl) Weihnachtsbaumkerzen, 
hier noch eine größere Menge an IR-Daten mit 20kHz, damit lässt sich das 
Timing noch etwas genauer bestimmen. Ich komme dann auf

Start Bit: 8800µs pulse, 4100µs pause
0 Bit: 440µs pulse, 590µs pause
1 Bit: 970µs pulse, 1140µs pause

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Hallo Andreas,

Andreas S. schrieb:
> Ich habe es deshalb dokumentiert und als
> Untergruppe von NEC implementiert

Sehr saubere Arbeit! Vielen Dank! Ich integriere Deine Erweiterungen in 
das nächste Release.

Andreas S. schrieb:
> hier noch eine größere Menge an IR-Daten mit
> 20kHz, damit lässt sich das Timing noch etwas genauer bestimmen.

Super, danke, je mehr Input, desto besser.

: Bearbeitet durch Moderator
von Jörg R. (jrie)


Angehängte Dateien:

Lesenswert?

Meine Scans liefern merkwürdige Ergebnisse, ich finde den Fehler nicht.
Scan1 habe ich etwas editiert, der passt zu den IRMP Ergebnissen.
Scan2 ist uneditiert.
Mit HTerm über einen PL2303 empfangen.

von Jörg R. (jrie)


Angehängte Dateien:

Lesenswert?

Da ich dachte, irgendwo wäre ein Fehler in meinem Versuchsaufbau, habe 
ich jetzt noch mal komplett von vorne angefangen.
Ein anderes STM32-Board, neu gebaut, neu geflasht, neu zusammengesteckt.
Die Ergebnisse haben aber wieder dasselbe Strickmuster.
HTW_.txt ist mit Hyperterminal unter Windows, cutecom.log3 mit cutecom 
unter Linux. Die sind so ähnlich, dass sie einander bestätigen.
Zum Vergleich noch mit RC5 und demselben Aufbau, cutecom.log.RC5, der 
ist so wie erwartet.
Es waren jeweils die Tasten 0, 1, 2, ... bis 9.

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


Lesenswert?

Jörg R. schrieb:
> Die Ergebnisse haben aber wieder dasselbe Strickmuster.

Danke erstmal, Jörg. Ich bin da etwas ratlos, das ist irgendwie eine 
Mischung aus Siemens, Grundig und Ruwido. Nicht nur IRMP kommt da ins 
Schleudern, sondern ich auch, wenn ich die Muster "per Hand" mit den mir 
vorliegenden Daten abgleiche.

Rätselhaft sind auch die kurzen Frames dazwischen, die ich überhaupt 
nicht zuordnen kann. Ob das eine Buffer-Beschränkung der 
Logging-Funktion ist, welche aufgrund der hohen Sample-Rate "vollläuft"?

Sehen die Scans mit 15kHz genauso verrückt aus, entsprechend um die 
Längen gekürzt? Hier würde mir ein kurzer Test mit einer oder zwei 
Tasten reichen.

Wenn der 15kHz-Test dasselbe Chaos liefert, nehme ich an, dass die 
Universal-FB einfach fehlerhafte Frames erzeugt. Oder kannst Du damit 
tatsächlich ein Siemens-Gerät ansteuern?

Ich werde aber noch ein paar Analysen vornehmen, vielleicht fällt bei 
mir noch der Groschen, wie man die Daten "einordnen" kann.

von Jörg R. (jrie)


Angehängte Dateien:

Lesenswert?

Ein Scan mit 15kHz anbei.
Ich habe kein Siemens-Gerät.
Ich bin auch überhaupt nicht sicher, was die FB da wirklich sendet (mir 
ging es ja auch eigentlich um das von IRSND gesandte Siemens und die FB 
habe ich nur zur Differentialdiagnose eingesetzt).

Ich habe auch Scans von per IRSND gesendetem Siemens gemacht (mit 
20kHz). Dabei (cutecom.log.irsnd.siemens) wird Siemens und A1TVBOX 
erkannt (A1TVBOX ist falsch). Das ist auch mit 15kHz so 
(cutecom.log.irsnd.siemens3.15k).

: Bearbeitet durch User
von Jörg R. (jrie)


Angehängte Dateien:

Lesenswert?

Und noch ein Scan von Sony per IRSND, auch bei 15kHz verschwindet die 
Adresse.
Denon per IRSND geht mit 15kHz (mit 20kHz ging es nur manchmal).

von Jörg R. (jrie)


Angehängte Dateien:

Lesenswert?

Noch ein Scan mit allen Protokollen von 1 bis 49.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Super, vielen Dank! Damit habe ich nun genügend Hausaufgaben zu tun ;-)

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Jörg R. schrieb:
> Ich habe auch Scans von per IRSND gesendetem Siemens gemacht (mit
> 20kHz).

Danke, den Fehler habe ich beseitigen können. Es lag am nicht gerade 
optimal ausgelegten Biphase-Decoder (Manchester Codes). Von daher muss 
ich hier mit den Toleranzen anders arbeiten als zum Beispiel bei 
Pulse-Distance. Ich habe das für SIEMENS nun angepasst, werde das im 
Laufe der Zeit auch für andere Biphase-Protokolle nachholen.

Jörg R. schrieb:
> Und noch ein Scan von Sony per IRSND, auch bei 15kHz verschwindet die
> Adresse.

Welche Adresse hast Du denn benutzt?

Die Sony-Codierung ist etwas speziell, da sie variable Bitlängen 
benutzt. Die Mindest-Bitlänge ist 12. Hier ist die Adresse immer 0. 
Später hat das Sony dann das Protokoll um Adress-Bits erweitert und die 
Länge des kompletten Frames variabel gestaltet. Diese kommen aber erst 
zum Tragen, wenn die Bitlänge größer als 12 ist. Dabei hat Sony das 
Protokoll abwärtskompatibel erweitert, was einen ziemlich komplizierten 
Aufbau des Frames zur Folge hat.

Eine Adresse kommt erst zum Tragen, wenn die Bitlänge größer als 12 ist, 
man also eine zusätzliche Bitlänge definiert. Diese zusätzliche Länge 
wird bei IRSND im oberen Byte der 16-Bit-IRMP-Adresse angegeben.

Ist die IRMP-Adresse also größer 0x0100, dann wird die Sony-Adresse im 
unteren Byte auch ausgewertet, sonst nicht. Die maximale zusätzliche 
Bitlänge ist 8. So ergibt sich für IRMP-Adressen der Wert 0x0000, sonst 
ein Wert zwischen 0x01nn bis 0x08nn, wobei nn die eigentliche 
"physikalische" Sony-Adresse ist.

Beispiel:

Die IRSND-Adresse 0x030A bedeutet: Zusatzliche Bitlänge ist 3, also ist 
die resultierende Bitlänge 12 + 3 = 15. Die Sony-Adresse ist das untere 
Byte der IRSND-Adresse, also 0x0A.

IRMP beim Decodieren macht das dann umgekehrt: Kommt ein Frame mit der 
Bitlänge 15, dann wird im oberen Byte der IRMP-Adresse 0x0300 gesetzt. 
Anschließend wird die Sony-Adresse 0x0A wieder draufaddiert. Resultat 
ist dann ebenso 0x030A als empfangene IRMP-Adresse.

So ist das ganze dann auch transparent für IRSND und IRMP anwendbar.

Fazit: Du kannst eine Sony-Adresse erst ab der IRMP-Adresse 0x0100 frei 
verwenden. Offenbar hast Du jedoch eine IRMP-Adresse verwendet, welche 
kleiner als 0x0100 ist. Damit ist die zusätzliche Bitlänge für IRSND 
null und damit wird auch keine Sony-Adresse im Frame verwendet. In 
diesem Fall stehen alle 12 Bits im Frame für das Kommando zur Verfügung.

Ja, das ist kompliziert. Aber es ist konsistent ;)

: Bearbeitet durch Moderator
von Jörg R. (jrie)


Lesenswert?

Frank M. schrieb:
> Danke, den Fehler habe ich beseitigen können.

Danke für's Fehler beseitigen :-)

Frank M. schrieb:
> Du kannst eine Sony-Adresse erst ab der IRMP-Adresse 0x0100 frei
> verwenden. Offenbar hast Du jedoch eine IRMP-Adresse verwendet, welche
> kleiner als 0x0100 ist.

So ist es. Danke für die Erklärung.

Jörg R. schrieb:
> Denon per IRSND geht mit 15kHz (mit 20kHz ging es nur manchmal).

Aber auch da ist das Kommando falsch (0x003f wird zu 0x03c0). Oder ist 
das auch ein Spezialfall?

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Jörg R. schrieb:
> Jörg R. schrieb:
>> Denon per IRSND geht mit 15kHz (mit 20kHz ging es nur manchmal).
>
> Aber auch da ist das Kommando falsch (0x003f wird zu 0x03c0). Oder ist
> das auch ein Spezialfall?

Das schaue ich mir heute im Laufe des Tages an.

Allgemein gilt, dass man mit den meisten Protokollen nicht transparent 
Werte von 0x0000 bis 0xFFFF übertragen kann, da der Wertebereich 
(Bitlänge) von Adresse bzw. Kommando das gar nicht abdeckt.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Jörg R. schrieb:
> Jörg R. schrieb:
>> Denon per IRSND geht mit 15kHz (mit 20kHz ging es nur manchmal).
>
> Aber auch da ist das Kommando falsch (0x003f wird zu 0x03c0). Oder ist
> das auch ein Spezialfall?

Viele IR-Protokolle haben Spezialfälle. Ja, hier ist noch einer.

Denon sendet sicherheitshalber immer 2 Frames, wobei beim zweiten Frame 
die Kommando-Bits invertiert werden. Dabei gilt die Regel, dass das 
unterste Bit beim Senden zunächst 0 ist und im Wiederholungsframe dann 
1.

Daraus folgt, dass nur gerade Kommando-Werte erlaubt sind. 0x003F ist es 
nicht.

Ja, ich war hier inkonsequent: Eigentlich nehme ich solche 
protokollspezifischen Bits nicht mit ins Kommando rein, sondern 
generiere diese im IRSND normalerweise automatisch. Umgekehrt beim 
Dekodieren im IRMP werden diese Regeln zwar geprüft, aber solche Bits 
werden dann ausgeblendet und wandern nicht mit in das Kommando-Wort. 
Hier habe ich es damals aber getan - warum, weiß ich auch nicht mehr. 
Vermutlich, weil dann die Kommando-Codes besser mit einschlägig 
zugängliche Quellen/Tabellen für Denon-und Sharp-Fernbedienungen 
vergleichbar waren.

P.S.
Das zweitunterste Bit im Kommando entscheidet übrigens darüber, ob es 
sich um ein Denon- oder ein Sharp-Gerät handelt: 0 = Denon, 1 = Sharp

: Bearbeitet durch Moderator
von Mampf F. (mampf) Benutzerseite


Lesenswert?

Unterstützt IRMP auch 8051er Derivate (SDCC compiler)? :)

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Mampf F. schrieb:
> Unterstützt IRMP auch 8051er Derivate (SDCC compiler)? :)

Nicht, dass ich wüsste. Du kannst das aber gern umsetzen. IRMP braucht 
einen Timer und einen GPIO-Pin. Das ist alles.

von Mampf F. (mampf) Benutzerseite


Lesenswert?

Frank M. schrieb:
> Mampf F. schrieb:
>> Unterstützt IRMP auch 8051er Derivate (SDCC compiler)? :)
>
> Nicht, dass ich wüsste. Du kannst das aber gern umsetzen. IRMP braucht
> einen Timer und einen GPIO-Pin. Das ist alles.

Werd ich ausprobieren :)

Neulich hab ich mal ein paar Zeilen Änderungen für einen STM32F3xx 
eingebaut ... Wenn das Projekt auf github/gitlab gehostet wäre, hätte 
ich schon einen PR submittiert.

Aber svn fass ich nicht mehr an :)

*edit*: vermutlich kommt SDCC mit den Makros nicht klar ... ich schau 
mal, wie das dann gehen könnte.

*edit2*: Wahrscheinlich müsste man den GCC Präprozessor nutzen und den 
Output per SDCC kompilieren. Sollte machbar sein :)

*edit3*: IRMP unterstützt SDCC mit STM8 ("__SDCC_stm8") - nice^2

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


Lesenswert?

Mampf F. schrieb:

> Neulich hab ich mal ein paar Zeilen Änderungen für einen STM32F3xx
> eingebaut ... Wenn das Projekt auf github/gitlab gehostet wäre, hätte
> ich schon einen PR submittiert.

Schick mir die diffs, ich baue sie ein.

> *edit*: vermutlich kommt SDCC mit den Makros nicht klar ... ich schau
> mal, wie das dann gehen könnte.

Die einzigen Macros, die Probleme machen könnten, sind die Variadic 
Macros. Diese habe vor einigen Monaten durch mehrere ersetzt. Von daher 
sehe ich kein Problem.

> *edit2*: Wahrscheinlich müsste man den GCC Präprozessor nutzen und den
> Output per SDCC kompilieren. Sollte machbar sein :)

Bevor Du so einen Hack anfängst, sag mir besser, welche Makros nicht 
funktionieren. Da kann man bestimmt noch etwas anpassen.

von Mampf F. (mampf) Benutzerseite


Lesenswert?

Frank M. schrieb:
> Mampf F. schrieb:
>
>> Neulich hab ich mal ein paar Zeilen Änderungen für einen STM32F3xx
>> eingebaut ... Wenn das Projekt auf github/gitlab gehostet wäre, hätte
>> ich schon einen PR submittiert.
>
> Schick mir die diffs, ich baue sie ein.

Hmmmmm ... in der aktuellen Version ist F3xx schon eingebaut - das kann 
ich mir also sparen :)

Vor 2-3 Jahren meine ich, hab ich auch mal Änderungen für zB den 
STM32L151 gemacht.

Ich kuck mal, ob ich da noch was rausziehen kann.

von Mampf F. (mampf) Benutzerseite


Lesenswert?

Hmmmm ... Für einen 8051er (128Byte RAM):
1
Internal RAM layout:
2
      0 1 2 3 4 5 6 7 8 9 A B C D E F
3
0x00:|0|0|0|0|0|0|0|0|a|a|a|a|a|a|b|b|
4
0x10:|b|b|b|b|b|b|b|b|b|b|b|b|b|b|b|b|
5
0x20:|b|b|b|b|b|b|b|b|b|b|b|b|b|b|b|b|
6
0x30:|b|b|b|b|b|b|b|b|b|Q|Q|Q|Q|Q|Q|Q|
7
0x40:|Q|Q|Q|Q|S|S|S|S|S|S|S|S|S|S|S|S|
8
0x50:|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|
9
0x60:|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|
10
0x70:|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|
11
0x80:|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|
12
0x90:|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|
13
0xa0:|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|
14
0xb0:|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|
15
0xc0:|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|
16
0xd0:|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|
17
0xe0:|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|
18
0xf0:|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|
19
0-3:Reg Banks, T:Bit regs, a-z:Data, B:Bits, Q:Overlay, I:iData, S:Stack, A:Absolute
20
21
Stack starts at: 0x44 (sp set to 0x43) with 188 bytes available.
22
No spare internal RAM space left.
23
24
Other memory:
25
   Name             Start    End      Size     Max     
26
   ---------------- -------- -------- -------- --------
27
   PAGED EXT. RAM                         0      256   
28
   EXTERNAL RAM                           0    65536   
29
   ROM/EPROM/FLASH  0x0000   0x0505    1286    65536

Fast 1.3kB mit IRMP alleine. Der Register-Verbrauch sieht sehr gut aus.

Leider fehlt mir noch die Hardware, das auch wirklich auszuprobieren - 
aber es sieht vielversprechend aus :)

Falls ich es hinbekomme, gibts ein diff von mir :)

*edit*: Gerade gesehen - der SDCC hat jetzt hier 256Byte RAM angenommen. 
Mal kucken, wie man das umstellt. Ist ja kein 8052er^^

: Bearbeitet durch User
von Armin J. (arminj)


Lesenswert?

Frank M. schrieb:
> Ja, das ist kompliziert. Aber es ist konsistent ;)

Danke für die Aufklärung!
Kann man das ganze irgendwo in den Sourcen kommentieren, damit Du in 4 
Jahren nicht dieselbe Frage nochmal gestellt bekommst?
Z.B. ab Line 1100 von irmp.c
Das wäre super.

von Jörg R. (jrie)


Angehängte Dateien:

Lesenswert?

Frank M. schrieb:
> Daraus folgt, dass nur gerade Kommando-Werte erlaubt sind.

Danke für die Info. Damit funktioniert Denon.
Eine Doku für die ganzen Spezialfälle wäre echt gut :)

Der Scan von A1TVBOX über IRSND sieht ganz anders aus als der 
Referenzscan. Ich vermute, da stimmt was bei IRSND nicht?

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Jörg R. schrieb:
> Eine Doku für die ganzen Spezialfälle wäre echt gut :)

Normalerweise bildet man mit IRSND existente Original-Fernbedienungen 
nach. Da die Adressen und Kommandos, die man mit IRMP erhält, 1:1 dem 
IRSND zum Fraß vorgeworfen werden können, passen die realen Werte immer. 
Ich sehe jetzt eigentlich keinen Anwendungsfall, wo man sich Adressen + 
Kommandos einfach mal so ausdenkt und dann auf die Nase fliegt, weil 
diese dann nicht passen.

Klar könnte man trotzdem diese Spezialfälle dokumentieren, aber das ist 
Knochenarbeit.

> Der Scan von A1TVBOX über IRSND sieht ganz anders aus als der
> Referenzscan

Sehr merkwürdig, bei Deinen Ausgaben stimmen weder Timings noch Anzahl 
der Bits.

Ich habe gerade mit irsnd-20kHz einen Frame unter Linux ausgeben lassen:
1
000001111110000011100000111000001110000000000111111000001110000011100000111000001110000011100000111000000000011111100000111000001110000011100000111111111111111111111

Dieser wird von irmp-20kHz auch wieder einwandfrei erkannt.

: Bearbeitet durch Moderator
von Jörg R. (jrie)


Lesenswert?

Mein Scan deines Codes (gesendet 2000d0001000):
1
000001111110000000000000000000111110000000000011111000000000000000000000000000000000000000000000000000000000011111100000000000000000000000000000011111111111111111111
Da fehlt Einiges. Aber warum?

von Jörg R. (jrie)


Lesenswert?

Ich wollte Mitsubishi-Heavy testen:
./irsnd-20kHz 49 0x00d0 0x0010 > 49
./irmp-20kHz < 49
Das wird nicht erkannt.

von Jörg R. (jrie)


Lesenswert?

IRSND sendet FDC nur, wenn die flags 0x00 sind. Mit 0x01 geht es nicht.
Soll das so sein?

von Jörg R. (jrie)


Lesenswert?

Manchmal hängt es von der Reihenfolge, in der gesendet wird, ab, ob 
richtig erkannt wird.
Beispiel:
Wenn ich RC5, dann NEC16, dann NEC42 sende, wird es auch so erkannt.
Wenn ich aber IR-60, dann NEC16, dann NEC42 sende, wird NEC16 und NEC42 
als Siemens erkannt.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Jörg R. schrieb:
> Wenn ich RC5, dann NEC16, dann NEC42 sende, wird es auch so erkannt.
> Wenn ich aber IR-60, dann NEC16, dann NEC42 sende, wird NEC16 und NEC42
> als Siemens erkannt.

Soweit ich mich erinnere, kommt irsnd_send(&irmp_data, TRUE) zurück, 
wenn der Frame komplett rausgeschickt ist. Eigentlich ist das nicht ganz 
korrekt, denn zu jedem IR-Protokoll gehört auch eine gewisse Pause nach 
Aussenden des Frames. Ich habe darauf verzichtet, damit der µC auch noch 
was anderes machen kann, also die Pause abzuwarten. Eventuell erweitere 
ich irsnd_send() noch um einen weiteren Parameter.

Baue da bitte mal nach dem irsnd_send() ein Delay von 50msec ein und 
schaue, ob sich das Problem damit erledigt.

von Jörg R. (jrie)


Lesenswert?

Ich hatte zwischen den  irsnd_send_data() ein delay von 300ms drin und 
ich hatte mit irsnd_send_data(irmp_data_p, 1) gesendet.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Jörg R. schrieb:
> IRSND sendet FDC nur, wenn die flags 0x00 sind. Mit 0x01 geht es
> nicht.

IRSND sendet nicht oder IRMP empfängt/dekodiert nicht?

Mein Test unter Linux:
1
$ ./irsnd-20kHz 18 0 40 2 | ./irmp-20kHz
2
0000000000000000000000000010000011011111 p=18 (FDC), a=0x0000, c=0x0004, f=0x00, asc=0x33, key='3'
3
0000000000000000000011110010000011011111 p=18 (FDC), a=0x0000, c=0x0084, f=0x00
4
0000000000000000000011110010000011011111 p=18 (FDC), a=0x0000, c=0x0084, f=0x01

Wiederholungen werden also durchaus übertragen und empfangen...

Schalte mal im IRMP alle anderen Protokolle bis auf die Standards ab. 
Vielleicht ist es ein Empfangsproblem, weil FDC mit irgendwas anderem 
kollidiert. Gerade mit RC5 zusammen ist da eine Sonderbehandlung im 
IRMP-Code, siehe auch Kommentar in irmpconfig.h:
1
 * If you want to use FDC or RCCAR simultaneous with RC5 protocol, additional program space is required.
2
 * If you don't need RC5 when using FDC/RCCAR, you should disable RC5.

: Bearbeitet durch Moderator
von Jörg R. (jrie)


Lesenswert?

Jörg R. schrieb:
> IRSND sendet FDC nur, wenn die flags 0x00 sind. Mit 0x01 geht es nicht.

Das habe ich falsch interpretiert.
Tatsächlich geht bei mir FDC nur manchmal. (Und als ich auf 0x00 
umgestellt hatte ging es, aber das war nur Zufall.)

Frank M. schrieb:
> If you don't need RC5 when using FDC/RCCAR, you should disable RC5.

RC5 hat bei mir höhere Priorität. Falls FDC und RC5 nicht zusammen 
gehen, lasse ich lieber FDC weg.

Hier 
https://github.com/M-Reimer/irmp2keyboard/blob/master/irmp2keyboard/src/irmp/irmpconfig.h 
scheint aber beides zusammen zu gehen.

von Jörg R. (jrie)


Angehängte Dateien:

Lesenswert?

Lego wird auch nur manchmal erkannt. Die Scans sind dann aber OK und 
werden korrekt erkannt.

Und noch was interessantes zu FDC, ein Scan von 5 einzelnen Sendungen 
per IRSND. Alle 5 sehen sehr ähnlich aus. Der Erste wird aber als 
A1TVBOX erkannt und der letzte gar nicht. Die mittleren drei werden 
korrekt erkannt.
Kannst du daraus sehen, was falsch läuft?

Edit: Beim Ersten und beim Letzten Scan sind ähnlich wie beim 
A1TVBOX-Scan ein paar 1111 verschluckt worden, aber so wenige, dass man 
genau hingucken muss, um das zu sehen. Wieso werden die verschluckt?

Es wäre schön, wenn jemand das mal gegentesten würde, ob das nur bei mir 
so ist oder reproduzierbar. Also Scans von per IRSND gesendetem A1TVBOX 
und FDC.

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


Lesenswert?

Jörg R. schrieb:
> Und noch was interessantes zu FDC, ein Scan von 5 einzelnen Sendungen
> per IRSND. Alle 5 sehen sehr ähnlich aus. Der Erste wird aber als
> A1TVBOX erkannt

Der erste ist kaputt:
1
0000000000000000000000000000000000000000000011111111111111111100000111110000001111000000111100000111110000001111000000111100000011110000001111000000111100000000000000001111000001111100000111110000001111000000111100000011110000000111000001111100000111110000001111000000111100000000000000001111000000111100000011111111111111000000011111111111110000000111000001111100000011110000001111000000111100000011110000001111000001111100000011111111111111000000011111111111110000011111111111111100000011111111111111000000111111111111110000011111111111111100000011111111111111111111

Die Pulse (Nullen) dürfen nur 3-10 Stellen lang sein. Die elfte Gruppe 
von Nullen ist aber 16 Stellen lang. Dadurch wird FDC verworfen und der 
Rest dann fälschlicherweise als A1TVBOX erkannt. Kannst Du diese 
Fehlstelle mit IRSND reproduzieren? Ich kann es nicht.

Du kannst das auch gut sehen, wenn Du irmp-20KHz mit Option -v aufrufst:
1
./irmp-20kHz -v <fdc-20kHz.log | less

Output ist dann:
1
   0.050ms [starting pulse]
2
   3.150ms [start-bit: pulse = 44, pause = 18]
3
protocol = FDC, start bit timings: pulse:  39 -  44, pause:  17 -  20
4
pulse_1:   3 -  10
5
pause_1:  10 -  18
6
pulse_0:   3 -  10
7
pause_0:   1 -   6
8
command_offset: 20
9
command_len:     12
10
complete_len:    40
11
stop_bit:         1
12
   3.650ms [bit  0: pulse =   5, pause =   5] 0
13
   4.150ms [bit  1: pulse =   6, pause =   4] 0
14
   4.650ms [bit  2: pulse =   6, pause =   4] 0
15
   5.150ms [bit  3: pulse =   5, pause =   5] 0
16
   5.650ms [bit  4: pulse =   6, pause =   4] 0
17
   6.150ms [bit  5: pulse =   6, pause =   4] 0
18
   6.650ms [bit  6: pulse =   6, pause =   4] 0
19
   7.150ms [bit  7: pulse =   6, pause =   4] 0
20
   7.650ms [bit  8: pulse =   6, pause =   4] 0
21
   8.650ms [bit  9: pulse =  16, pause =   4] error 3: timing not correct: data bit 9,  pulse: 16, pause: 4
22
   9.150ms [start-bit: pulse =  5, pause =  5]
23
protocol = A1TVBOX, start bit timings: pulse:   4 -   8, pause:   5 -   8

> und der letzte gar nicht.

Hier dasselbe: Wieder ein Puls, der 16 Stellen lang ist. Es wird dann 
auch wieder (später im Frame bei Bit 26) auf A1TVBOX umgestellt, 
allerdings reichen die nachfolgenden Bits nicht mehr komplett aus, um 
einen A1TVBOX-Frame vollständig zu empfangen. Daher wird der komplette 
Frame verworfen.

von Jörg R. (jrie)


Lesenswert?

IR Empfänger sind für verschiedene Burst/Gap Längen ausgelegt.
Beim TSOP1738 mindestens 10/14 laut Datenblatt. Das sind 263 bzw. 368 
us.
Beim TSOP 4838 mindestens 10/12 macht 263 bzw. 316 us.
Beim TSOP 32138 mindestens 6/10 macht 158 bzw. 263 us.
Beim TSOP 93138 mindestens 6/6 macht 158 bzw. 158 us.

Das könnte erklären, warum bei Armin der TSOP31238 besser als der VS1738 
funktioniert, und warum A1TVBOX mit 250 us Puls und 150 us Pause nicht 
erkannt wird und warum bei mir mit dem TSOP4838 FDC mit 300 us Puls und 
220us Pause beim 0-Bit grenzwertig ist.

Mit einem Oszi könnte man messen, was bei der Sendediode rein geht und 
was am TSOP raus kommt. Ich habe leider keines.

von Armin J. (arminj)


Lesenswert?


von Jörg R. (jrie)


Lesenswert?

Ich habe TSOP 312xx und TSOP 321xx durcheinander gebracht.
Der TSOP31238 ist mit 10/10 noch etwas schlechter.
Wenn ich Zeit habe, versuche ich es mit Soundkarten-Oszi.

von Jörg R. (jrie)


Lesenswert?

Statt zu testen, was welcher TSOP raus filtert, habe ich lieber mit 
direkter Verbindung (also ohne Modulation) getestet:
1
gesendet       empfangen      Protokoll, Fehler
2
01081f003f01   01081f003f00
3
               01081f003f01
4
02001f003f01   02001f003f00
5
               02001f003f01
6
03001f003f01   03001f003f00
7
               03001f003f01
8
04001f003f01   04001f003f00
9
               04001f003f01
10
05001f003f01   200055007a00   Kaseikyo Protokoll
11
               05001f003f00
12
06001f003f01   060007003f00
13
               060007003f01
14
07001f003f01   07001f003f00
15
               07001f003f01
16
08001f003e01   08001f003e00
17
               08001f003e01
18
09001f003f01   09001f003f00
19
               09001f003f01
20
0a001f003f01   0a001f003f00
21
               0a001f003f01
22
0b001f003f01   0b001f003f00
23
               0b001f003f01
24
0c001f003f01   0c000f003f00
25
               0c000f003f01
26
0d001f003f01   0d0000003f00
27
               0d0000003f01
28
0e001f003f01                  Bang & Olufsen geht nicht               
29
0f001f003f01   0f0000000000   Grundig Kommando
30
               0f0000000001
31
10001f003f01   10001f003f00
32
               10001f003f01
33
11001f003e01   20005500aa00   Siemens Protokoll
34
               20005500aa01
35
12001f003f01   120000000300   FDC Adresse, Kommando
36
               120000008300
37
13001f003f01   130003003f00   RC Car (Adresse)
38
               130003003f01
39
14001f003f01   14000f003f00   JVC (Adresse)
40
               14000f003f01
41
15001f003f01   15001f003f00
42
               15001f003f01
43
16001f003f01   160000000300
44
               160000000301
45
18001f003f01   180000003f00   IR60 Wiederholung
46
1b001f003f01   1b001f003f00
47
               1b001f003f01
48
1c001f003f01   1c001f003f00
49
               1c001f003f01
50
1d001f003f01   1d0000003f00
51
               1d0000003f01
52
1e001f003f01   1e000f003f00   Thomson (Adresse)
53
               1e000f003f01
54
1f001f003f01   1f0000003f00
55
               1f0000003f01
56
20001f003f01   2000df003f00   A1 TV Box Adresse
57
               2000df003f01
58
22001f003f01   220000003f00
59
               220000003f01
60
27001f003f01   270000003f00
61
               270000003f01
62
28001f003f01   28001f003f00
63
               28001f003f01
64
29001f003f01   29001f003f00
65
               29001f003f01
66
               29001f003f01
67
               29001f003f01
68
31001f003f01                  Mitsubishi-Heavy geht nicht

: Bearbeitet durch User
von Jörg R. (jrie)


Lesenswert?

Bang & Olufsen:
irsnd-20kHz 14 0 1 > 0e
irmp-20kHz < 0e
Das wird nicht erkannt.

Edit:
Ich habe ein Skript für alle Protokolle:
 ./irsnd-20kHz ${irdata} | ./irmp-20kHz
Da wird kaum was erkannt. Wieso?

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


Lesenswert?

Jörg R. schrieb:
> Bang & Olufsen:
> irsnd-20kHz 14 0 1 > 0e
> irmp-20kHz < 0e
> Das wird nicht erkannt.

Bei mir schon:
1
$ ./irsnd-20kHz 14 0 1 | ./irmp-20kHz
2
000000000000000001 p=14 (BANG OLU), a=0x0000, c=0x0001, f=0x00
Allerdings habe ich zusätzlich zu den Standard-Protokollen nur Bang & 
Olufsen aktiviert. Ich vermute mal, dass Du alles eingeschaltet hast und 
nach der Startbit-Erkennung ein anderes Protokoll von IRMP den Vorzug 
bekommt. Sehen kannst Du das mit der Option -v.

Also probiere mal:
1
$ ./irmp-20kHz -v < 0e

und berichte, in welches Protokoll IRMP sich verrennt. Dann kann ich 
prüfen, ob und wie ich die beiden auseinanderhalten kann.

> Edit:
> Ich habe ein Skript für alle Protokolle:
>  ./irsnd-20kHz ${irdata} | ./irmp-20kHz
> Da wird kaum was erkannt. Wieso?

Kannst Du das Script mal anhängen? Am besten auch irmpconfig.h und 
irsndconfig.h.

von Jörg R. (jrie)


Lesenswert?

Frank M. schrieb:
> Ich vermute mal, dass Du alles eingeschaltet hast

Ja.

Frank M. schrieb:
> Kannst Du das Script mal anhängen?

Erst in ein paar Tagen, wenn ich wieder zu hause bin.
Ich habe da einfach dieselben IR-Daten wie in 
Beitrag "Re: IRMP - Infrared Multi Protocol Decoder" 
vom  16.12.2020 19:10 genommen.
Wieso das mit direkter Verbindung ohne Modulation von uC zu uC  besser 
ging als per
1
./irsnd-20kHz ${irdata} | ./irmp-20kHz
 auf einem PC ist mir rätselhaft.
Am 16.12. konnte ich das gute Ergebnis mehrmals hintereinander 
reproduzieren, am nächste Tag dann allerdings gab es schlechtere 
Ergebnisse und das gute nur noch einmal. Gibt es da einen 
Zufalls-Faktor?

Sobald es ein neues Release gibt, werde ich Alles noch mal sorgfältig 
neu bauen und testen.

von Mampf F. (mampf) Benutzerseite


Lesenswert?

Mal so nebenbei - wieso unterstützt IRMP keine externen Interrupts als 
alternative zur Sampling-Methode? 🙈

von Armin J. (arminj)


Lesenswert?

Mampf F. schrieb:
> Mal so nebenbei - wieso unterstützt IRMP keine externen Interrupts als
> alternative zur Sampling-Methode? 🙈
Schon mal in die Arduino Version geschaut?
https://github.com/ukw100/IRMP/tree/master/examples/Interrupt

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Mampf F. schrieb:
> Mal so nebenbei - wieso unterstützt IRMP keine externen Interrupts
> als alternative zur Sampling-Methode? 🙈

IRMP sollte auf möglich vielen µCs laufen. Die externen Interrupts 
erfordern dann eine Abstraktionsebene mehr. Das ist eine Menge Arbeit, 
das für alle µCs und alle unterstützten Protokolle umzusetzen. Zudem 
schränken Interrupts auf vielen µCs die Anzahl der möglichen Pins ein.

Außerdem ist es mit externen Interrupts allein nicht getan. Bei vielen 
Protokollen arbeitet IRMP mit Timeouts.

Hier ein einfaches Beispiel:

NEC16 hat 16 Bits
NEC hat 32 Bits
NEC42 hat 42 Bits

Die Timingwerte sind aber identisch, hier kommt es nur auf die Länge des 
Frames an. Kommt nach 16 Bits kein Timeout, schwenkt IRMP auf NEC32 um, 
kommt dann nach 32 Bit immer noch kein Timeout, schwenkt IRMP auf NEC42 
um.

Auch Sony hat eine variable Anzahl von Bits im Frame. Da gibt es auch 
noch jede Menge anderer (weitaus komplizierterer) Beispiele, wo ein 
zusätzlicher Timer auch bei Verwendung von externen Interrupts dringend 
vonnöten ist.

Da die Timer-ISR eine Statemaschine ist, wo immer nur kurze Abschnitte 
des Codes durchlaufen wird, ist die Verweildauer in der ISR immer recht 
kurz, so dass die CPU-Auslastung weitaus geringer ist als angenommen. 
Falk hatte damit im Zusammenhang mit AVR & WS2812 einige Messungen 
gemacht und belegt, dass IRMP das Verhalten bei der zeitkritischen 
Ansteuerung der WS2812-LEDs überhaupt nicht stört.

Du kannst das gern auf Interrupts umstellen, dann mach das bitte auch 
für alle unterstützten µCs. Eine halbherzige Lösung (z.B. exklusiv für 
AVRs) ist hier nicht zielführend. Hier wäre dann auch eine entsprechende 
Konfiguration der Interrupt-Pins in der irmpconfig.h nötig.

Armin J. schrieb:
> Schon mal in die Arduino Version geschaut?
> https://github.com/ukw100/IRMP/tree/master/examples/Interrupt

Läuft das für alle µCs, die Du mit der Arduino-Version unterstützt? Hast 
Du dort auch schon die oben beschriebenen nötigen Timeout-Behandlungen 
implementiert, oder fallen da dann einfach einige der Protokolle hinten 
runter?

P.S.

Ich überlege schon seit längerem, die ISR auf das reine Speichern von 
Puls- und Pausenlängen zu kürzen, so dass die Ermittlung und Dekodierung 
des empfangenen Frames außerhalb der ISR erfolgen kann.

Vorteil wäre, dass IRMP mehrere Stränge von möglichen Protokollen bei 
gleichen Startbits nacheinander verfolgen kann, er damit innerhalb des 
Frames "zurückspulen" kann, wenn er merkt, dass er sich 
irrtümlicherweise in einen falschen Strang "verheddert" hat. IRMP könnte 
also viel mehr konkurrierender Protokolle abhandeln und damit wäre die 
Trefferquote wesentlich höher.

Nachteil wäre jedoch ein größerer Ram-Verbrauch.

Wenn man aber mal darüber nachdenkt, wofür man IRMP eigentlich einsetzt, 
dann geht es meist um eine Fernbedienung und damit auch um ein 
Protokoll, das man nutzt. Da gibt es dann überhaupt keine Konkurrenz zu 
anderen ähnlichen exotischen Protokollen. Hier ist die IRMP-Trefferquote 
dann 100%. Der Fall, dass jemand alle Protokolle einschaltet, weil er 60 
IR-FBs, Keyboards usw. in einem Anwendungsfall einlesen will, ist 
überhaupt nicht praxisrelevant.

: Bearbeitet durch Moderator
von Armin J. (arminj)


Lesenswert?

Frank M. schrieb:
> Läuft das für alle µCs, die Du mit der Arduino-Version unterstützt? Hast
> Du dort auch schon die oben beschriebenen nötigen Timeout-Behandlungen
> implementiert, oder fallen da dann einfach einige der Protokolle hinten
> runter?

Es läuft auf allen Plattformen, und natürlich fallen einige Protokolle 
raus, wie Du sehr gut erklärt hast.

> Ich überlege schon seit längerem, die ISR auf das reine Speichern von
> Puls- und Pausenlängen zu kürzen, so dass die Ermittlung und Dekodierung
> des empfangenen Frames außerhalb der ISR erfolgen kann.

Bitte nicht, das machen schon alle anderen IR Libraries, gerade das on 
the Fly dekodieren ist ein Alleinstellungsmerkmal von IRMP!!!

von Mampf F. (mampf) Benutzerseite


Lesenswert?

Armin J. schrieb:
> Bitte nicht, das machen schon alle anderen IR Libraries, gerade das on
> the Fly dekodieren ist ein Alleinstellungsmerkmal von IRMP!!!

Ehrlich gesagt, sehe ich auch nicht den Vorteil darin.

Alleinstellungsmerkmale müssen nicht zwangsläufig optimal sein^^

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Armin J. schrieb:
> Es läuft auf allen Plattformen, und natürlich fallen einige Protokolle
> raus, wie Du sehr gut erklärt hast.

Läuft das deshalb, weil die Arduino-Runtime-Lib Pin-Interrupts 
abstrahiert oder hast Du das für jeden µC hardwarespezifisch umgesetzt?

Das mit dem Rausfallen von Protokollen könnte man vermeiden, wenn man 
zusätzlich noch einen Timer für Timeouts verwendet. Ich denke mal drüber 
nach.

> Bitte nicht, das machen schon alle anderen IR Libraries, gerade das on
> the Fly dekodieren ist ein Alleinstellungsmerkmal von IRMP!!!

Es würde auch nur das gleichzeitige Erkennen aller Protokolle auf einmal 
garantieren, was - wie ich oben schrieb, eigentlich nicht praxisrelevant 
ist.

Aber ich habe da eine andere Idee: Ich könnte online ein Formular 
bereitstellen, wo der User seine Scans reinkopiert und das Formular dem 
User mitteilt, welches Protokoll er dafür in irmpconfig.h freischalten 
muss. Das würde das Trial-and-Error-Verfahren für irmpconfig.h erheblich 
reduzieren.

Übrigens habe ich seit ein paar Tagen einen Intel NUC mit eingebautem 
IR-Emfänger. Ich habe darafhin die Linux-Version von IRMP dahingehend 
erweitert, dass IRMP die Raw-Werte aus /dev/lirc0 liest und dann die 
empfangenen Frames entweder protokollieren und/oder dekodieren kann. 
Kommt im nächsten Release.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Jörg R. schrieb:
> Am 16.12. konnte ich das gute Ergebnis mehrmals hintereinander
> reproduzieren, am nächste Tag dann allerdings gab es schlechtere
> Ergebnisse und das gute nur noch einmal. Gibt es da einen
> Zufalls-Faktor?

Ich vermute, es hat damit zu tun, was alles an Protokollen eingeschaltet 
ist und was nicht. Wenn Du alles einschaltest, werden automatisch einige 
Protokolle abgeschaltet, weil sie in Konflikt mit anderen Protokollen 
stehen.

Du siehst dann so etwas als Compiler-Warnung:
1
 #  warning KASEIKYO protocol conflicts wih PANASONIC, please enable only one of both protocols
2
 #  warning PANASONIC protocol disabled

Das automatische Abschalten ist auch noch teilweise abhängig von der 
Abtastfrequenz.

Gib mal unter Linux
1
make -f makefile.lnx test
ein. Da werden insgesamt 82 Sample-Files mit der aktuellen IRMP-version 
getestet. Dabei müssen die Werte in den Kommentaren übereinstimmen mit 
den Werten, die IRMP ermittelt.

Am Ende muss da stehen:
1
all tests successful

Diesen Test mach ich hier regelmäßig nach jeder Änderung im IRMP, um 
sicherzustellen, dass alle Protokolle weiterhin erkannt werden.

: Bearbeitet durch Moderator
von Jörg R. (jrie)


Angehängte Dateien:

Lesenswert?

Ich habe noch mal neu gebaut und es sieht jetzt ziemlich gut aus:
1
gesendet          empfangen                                     Fehler
2
01 081f 003f 01   p= 1 (SIRCS), a=0x081f, c=0x003f, f=0x00
3
                  p= 1 (SIRCS), a=0x081f, c=0x003f, f=0x01
4
02 001f 003f 01   p= 2 (NEC), a=0x001f, c=0x003f, f=0x00
5
                  p= 2 (NEC), a=0x001f, c=0x003f, f=0x01
6
03 001f 003f 01   p= 3 (SAMSUNG), a=0x001f, c=0x003f, f=0x00
7
                  p= 3 (SAMSUNG), a=0x001f, c=0x003f, f=0x01
8
04 001f 003f 01   p= 4 (MATSUSH), a=0x001f, c=0x003f, f=0x00
9
                  p= 4 (MATSUSH), a=0x001f, c=0x003f, f=0x01
10
05 001f 003f 01   p= 5 (KASEIKYO), a=0x001f, c=0x003f, f=0x00
11
                  p= 5 (KASEIKYO), a=0x001f, c=0x003f, f=0x01
12
06 001f 003f 01   p= 6 (RECS80), a=0x0007, c=0x003f, f=0x00
13
                  p= 6 (RECS80), a=0x0007, c=0x003f, f=0x01
14
07 001f 003f 01   p= 7 (RC5), a=0x001f, c=0x003f, f=0x00
15
                  p= 7 (RC5), a=0x001f, c=0x003f, f=0x01
16
08 001f 003e 01   p= 8 (DENON), a=0x001f, c=0x003e, f=0x00
17
                  p= 8 (DENON), a=0x001f, c=0x003e, f=0x01
18
09 001f 003f 01   p= 9 (RC6), a=0x001f, c=0x003f, f=0x00
19
                  p= 9 (RC6), a=0x001f, c=0x003f, f=0x01
20
10 001f 003f 01   p=10 (SAMSG32), a=0x001f, c=0x003f, f=0x00
21
                  p=10 (SAMSG32), a=0x001f, c=0x003f, f=0x01
22
11 001f 003f 01   p=11 (APPLE), a=0x001f, c=0x003f, f=0x00
23
                  p=11 (APPLE), a=0x001f, c=0x003f, f=0x01
24
12 001f 003f 01   p=12 (RECS80EX), a=0x000f, c=0x003f, f=0x00
25
                  p=12 (RECS80EX), a=0x000f, c=0x003f, f=0x01
26
13 001f 003f 01   p=13 (NUBERT), a=0x0000, c=0x003f, f=0x00
27
                  p=13 (NUBERT), a=0x0000, c=0x003f, f=0x01
28
14 001f 003f 01   p=14 (BANG OLU), a=0x0000, c=0x003f, f=0x00
29
                  p=14 (BANG OLU), a=0x0000, c=0x003f, f=0x01
30
15 001f 003f 01   p=15 (GRUNDIG), a=0x0000, c=0x003f, f=0x00
31
                  p=15 (GRUNDIG), a=0x0000, c=0x003f, f=0x01
32
16 001f 003f 01   p=16 (NOKIA), a=0x001f, c=0x003f, f=0x00
33
                  p=16 (NOKIA), a=0x001f, c=0x003f, f=0x01
34
17 001f 003e 01   p=32 (A1TVBOX), a=0x0055, c=0x00aa, f=0x00   Siemens, Protokoll
35
                  p=32 (A1TVBOX), a=0x0055, c=0x00aa, f=0x01
36
18 001f 003f 01   p=18 (FDC), a=0x0000, c=0x0003, f=0x00       Adresse, Kommando
37
                  p=18 (FDC), a=0x0000, c=0x0083, f=0x00
38
19 001f 003f 01   p=19 (RCCAR), a=0x0003, c=0x003f, f=0x00     (Adresse)
39
                  p=19 (RCCAR), a=0x0003, c=0x003f, f=0x01
40
20 001f 003f 01   p=20 (JVC), a=0x000f, c=0x003f, f=0x00
41
                  p=20 (JVC), a=0x000f, c=0x003f, f=0x01       (Adresse)
42
21 001f 003f 01   p=21 (RC6A), a=0x001f, c=0x003f, f=0x00
43
                  p=21 (RC6A), a=0x001f, c=0x003f, f=0x01
44
22 001f 003f 01   p=22 (NIKON), a=0x0000, c=0x0003, f=0x00
45
                  p=22 (NIKON), a=0x0000, c=0x0003, f=0x01
46
24 001f 003f 01   p=24 (IR60), a=0x0000, c=0x003f, f=0x00      Wiederholung fehlt
47
27 001f 003f 01   p=27 (NEC16), a=0x001f, c=0x003f, f=0x00
48
                  p=27 (NEC16), a=0x001f, c=0x003f, f=0x01
49
28 001f 003f 01   p=28 (NEC42), a=0x001f, c=0x003f, f=0x00
50
                  p=28 (NEC42), a=0x001f, c=0x003f, f=0x01
51
29 001f 003f 01   p=29 (LEGO), a=0x0000, c=0x003f, f=0x00
52
                  p=29 (LEGO), a=0x0000, c=0x003f, f=0x01
53
30 001f 003f 01   p=30 (THOMSON), a=0x000f, c=0x003f, f=0x00   (Adresse)
54
                  p=30 (THOMSON), a=0x000f, c=0x003f, f=0x01
55
31 001f 003f 01   p=31 (BOSE), a=0x0000, c=0x003f, f=0x00
56
                  p=31 (BOSE), a=0x0000, c=0x003f, f=0x01
57
32 001f 003f 01   p=32 (A1TVBOX), a=0x00df, c=0x003f, f=0x00    Adresse
58
                  p=32 (A1TVBOX), a=0x00df, c=0x003f, f=0x01
59
34 001f 003f 01   p=34 (TELEFUNKEN), a=0x0000, c=0x003f, f=0x00
60
                  p=34 (TELEFUNKEN), a=0x0000, c=0x003f, f=0x01
61
39 001f 003f 01   p=39 (SPEAKER), a=0x0000, c=0x003f, f=0x00
62
                  p=39 (SPEAKER), a=0x0000, c=0x003f, f=0x01
63
40 001f 003f 01   p=40 (LGAIR), a=0x001f, c=0x003f, f=0x00
64
                  p=40 (LGAIR), a=0x001f, c=0x003f, f=0x01
65
41 001f 003f 01   p=41 (SAMSG48), a=0x001f, c=0x003f, f=0x00
66
                  p=41 (SAMSG48), a=0x001f, c=0x003f, f=0x01
67
                  p=41 (SAMSG48), a=0x001f, c=0x003f, f=0x01
68
                  p=41 (SAMSG48), a=0x001f, c=0x003f, f=0x01
69
49 001f 003f 01                                                 Mitsubishi-Heavy geht nicht
Die vielen Protokolle gehen gut zusammen. (Abgesehen von ein paar 
Schönheitsfehlern.)

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


Lesenswert?

Jörg R. schrieb:
> Ich habe noch mal neu gebaut und es sieht jetzt ziemlich gut aus:

Danke, ich schaue mir die verbliebenen Fehler im Laufe der Woche an.

von Jörg R. (jrie)


Lesenswert?

Mitsubishi-Heavy steht laut
1
./irsnd-20kHz 49 1f 3f 01 | ./irmp-20kHz -v
vermutlich in Konflikt mit Kaseikyo.

von Jörg R. (jrie)


Angehängte Dateien:

Lesenswert?

Jörg R. schrieb:
> Am 16.12. konnte ich das gute Ergebnis mehrmals hintereinander
> reproduzieren, am nächste Tag dann allerdings gab es schlechtere
> Ergebnisse und das gute nur noch einmal. Gibt es da einen
> Zufalls-Faktor?

Das lag vermutlich daran, dass am nächsten Tag Logging an war und am Tag 
zuvor nicht. Mit Logging wird die Erkenung jedenfalls deutlich 
schlechter.

Zu den mit Draht von uC zu uC zusätzlich auftretenden Problemen:

gesendet: 0x0e001f003f01 erkannt: nichts Log: cutecom.log.0e
 ./irmp-20kHz < cutecom.log.0e geht aber.
Merkwürdig. Gibt es dafür eine Erklärung?

gesendet: 05001f003f05 erkannt: 200055007a00 05001f003f00 05001f003f01
Log: cutecom.log.05
./irmp-20kHz < cutecom.log.05 erkennt dasselbe
./irmp-20kHz -v < cutecom.log.05 erkennt erst Speaker und schaltet dann 
um auf  A1TVBOX, erst später wird Kaseikyo korrekt erkannt. Wieso?

Diese beiden gehen ja mit ./irsnd-20kHz ${irdata} | ./irmp-20kHz

: Bearbeitet durch User
von Armin J. (arminj)


Lesenswert?

Hi Frank, mir fällt gerade auf, dass ein Protokoll wohl Kasiekyo und 
nicht Kaseikyo heisst.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Jörg R. schrieb:
> Das lag vermutlich daran, dass am nächsten Tag Logging an war und am Tag
> zuvor nicht. Mit Logging wird die Erkenung jedenfalls deutlich
> schlechter.

Bei Logging ist die Intention, ein unbekanntes Protokoll einzulesen und 
nicht ein IR-Protokoll zu dekodieren. Der Output über die serielle 
Schnittstelle geschieht innerhalb der Timer-ISR. Da hier nicht mit 
UART-Interrupts und einem Output-FIFO gearbeitet wird, wird innerhalb 
der ISR das Busy-Flag des UARTs gepollt. Das verfälscht das 
Zeitverhalten.

Okay, man könnte das Logging besser machen, zumindest sollte dann der 
serielle Output außerhalb der Timer-ISR erzeugt werden. Aber das ist 
nicht ist nicht sooo wichtig, denn:

Man sollte einfach, wenn man IR-Protokolle dekodieren möchte, auch das 
Logging abschalten.

Ich schaue mal, wie einfach es ist, das Decoding komplett zu 
deaktivieren, wenn IRMP_LOGGING gesetzt ist.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Armin J. schrieb:
> Hi Frank, mir fällt gerade auf, dass ein Protokoll wohl Kasiekyo
> und nicht Kaseikyo heisst.

Es wird wohl lediglich vereinzelt Kasiekyo geschrieben. Das scheint 
abhängig von der jeweiligen japanischen Übersetzung zu sein. Google 
zeigt jedenfalls wesentlich mehr Treffer, wenn man nach Kaseikyo sucht 
und nicht nach Kasiekyo.

Von daher sehe ich Kaseikyo als die treffendere Bezeichnung.

von Jörg R. (jrie)


Lesenswert?

Zur Frage wie viele Protokolle gleichzeitig an sein sollen:
Die Nutzer von meinem Projekt wünschen sich natürlich, dass wenn sie 
eine andere Fernbedienung benutzen wollen, nicht die Firmware neu 
kompiliert und geflasht werden muss, sondern dass es so geht, wie es 
ist. Je mehr Protokolle gleichzeitig desto besser, zumindest jedoch die 
halbwegs gebräuchlichen. Für optimalen Empfang muss dann eventuell der 
TSOP gewechselt werden.
Und wie meine Tests zeigen, geht das ja auch :-)  (vorausgesetzt die 
benannten Fehler können behoben werden und falls nicht, weiß man dann 
zumindest welche Protokolle bei „möglichst viele“ zusammen gehen).

von Armin J. (arminj)


Lesenswert?

Frank M. schrieb:
> Es wird wohl lediglich vereinzelt Kasiekyo geschrieben. Das scheint
> abhängig von der jeweiligen japanischen Übersetzung zu sein. Google
> zeigt jedenfalls wesentlich mehr Treffer, wenn man nach Kaseikyo sucht
> und nicht nach Kasiekyo.
>
> Von daher sehe ich Kaseikyo als die treffendere Bezeichnung.
Du hast Recht, da bin ich wohl auf einen Tippfehler (an prominenter 
Stelle) reingefallen.

Ich hab da noch eine Frage zu Bose:
1
#if IRMP_SUPPORT_BOSE_PROTOCOL == 1
2
            case IRMP_BOSE_PROTOCOL:
3
                if ((irmp_command >> 8) == (~irmp_command & 0x00FF))
4
                {
5
                    irmp_command &= 0xff;
6
                    rtc = TRUE;
7
                }
8
                break;
9
#endif
Mir scheint -aber vielleicht blick ich es auch nur nicht- hier wird das 
invertierte Kommando als Resultat gespeichert.

Frohes neues Jahr
Armin

von Christian S. (roehrenvorheizer)


Angehängte Dateien:

Lesenswert?

Hallo,

ich habe mal die Codes einer LEGO-Fernbedienung eingescannt mittels 
IRMP. Den Fotos nach gehört sie wohl zu einer Lego-Modellbahn. Die Taste 
oben rechts hupt. Scan ist in der beigefügten Datei. Vielleicht kann 
dies jemandem nützlich sein. Das bereits eingepflegte Lego-Protokoll 
reagiert darauf jedenfalls nicht.

mit freundlichem Gruß

von Christian S. (roehrenvorheizer)


Angehängte Dateien:

Lesenswert?

Datei vergesen, war klar.

von Armin J. (arminj)


Lesenswert?

Danke für die Bilder, sie sind für mich sehr interessant, da ich gerade 
das Lego Protokoll in IRremote überarbeite. Sie zeigen, dass das mit der 
von Lego dokumentierten Parity leider nicht immer stimmt.
Ist das Signal am Sender oder am Empänger abgegriffen?

Die Scans sind leider so gar nicht zu gebrauchen, wenn man die in ein 
Bild rückübersetzt kommt was raus, was keinem Lego IR Code entspechen 
kann siehe z.B. die Passagen
00000001111111111111111
und die noch längeren 111... Passagen

von Jörg R. (jrie)


Lesenswert?

Falls da ein TSOP im Spiel war, hat er möglicherweise die kurzen Pulse 
raus gefiltert (wie bei mir weiter oben).

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Christian S. schrieb:
> ich habe mal die Codes einer LEGO-Fernbedienung eingescannt mittels
> IRMP.

Mit einem 38kHz-TSOP?

Die Pausen sehen verdächtig kurz aus gegenüber den Pulsen. Das ist 
ziemlich unüblich bei IR.

von Christian S. (roehrenvorheizer)


Angehängte Dateien:

Lesenswert?

Zur Anwendung als Empfänger kam ein integrierter IR-Empfänger, wie er 
auf allen meinen Schaltungen mit IR drauf ist. Den genauen Typen kann 
ich vielleicht nicht einmal zurückverfolgen, wenn er nicht direkt drauf 
steht, da ich mehrere Tütchen habe, aus denen er stammen könnte. 
Zumindest RC5 und NEC kommen damit immer perfekt an, auch wenn man gegen 
die Zimmerdecke fernbedient. Das Oszilloskopsignal stammt von genau 
diesem integrierten Empfänger direkt vom Ausgang. Den Sender habe ich 
nicht weiter zerlegt.

Wegen der Mittenfrequenz müßte ich nochmal die bei mir bevorrateten 
Typen durchgehen, ich habe 36 kHz in Erinnerung.

Was den Scan anbetrifft, ist es die Terminalausgabe nach den 
entsprechenden Tastendrücken. Version ist diese von 2020. Ich habe mir 
über die Ausgabe keine weiteren Gedanken gemacht.


mit freundlichem Gruß

von Christian S. (roehrenvorheizer)


Lesenswert?

Die Datei sollte nicht nochmals erscheinen...

von Derek, Chen (Gast)


Lesenswert?

Hi Frank,

I used "AllProtols.ino" on arduino, test remote controller of sony 
projector.
The sony ir-code address and command are incorrect.

I refer the website 
"http://picprojects.org.uk/projects/sirc/sonysirc.pdf";.

Turn some values in "irmpprotocols.h"

#define SIRCS_AUTO_REPETITION_PAUSE_TIME          45.0e-3
#define SIRCS_FRAME_REPEAT_PAUSE_TIME             45.0e-3
#define SIRCS_ADDRESS_OFFSET                      7
#define SIRCS_ADDRESS_LEN                         13
#define SIRCS_COMMAND_LEN                         7

Then, address and command  are decoded well.

I hope. can add bits-info for "SIRCS". Because sony ir-code have three 
version of the protocol; sony12, sony15 and sony20.

Derek

von Armin J. (arminj)


Lesenswert?

Hi Derek,
you know that the minimal command duration is 17 ms?
Plus the original 25 ms we get 42 ms which is not so far from the 45 in 
the specification!
So your new values are wrong, since they are gap/pause values and not 
period values.
And why
1
#define SIRCS_COMMAND_LEN                         7
 ???
For sony they are 5!
And your other values are specifically for Sony20!
But if you succeed with your values, be happy, but please do not claim 
that others are wrong.

Armin

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


Lesenswert?

Derek, Chen schrieb:
> I hope. can add bits-info for "SIRCS". Because sony ir-code have three
> version of the protocol; sony12, sony15 and sony20.

SIRCS is even more general, it provides for:

7 command bits + 5 address bits + up to 8 additional bits

Thus, the command can be between 7 and 15 bits long. So there is not 
only Sony-12, Sony-15 and Sony-20, but everything between 12 and 20 
bits. To map this variable format in general, IRMP stores the 
information on how many additional bits are needed in the upper half of 
the address when decoding.

So it is not surprising that you get different values - at least for the 
address.

> #define SIRCS_ADDRESS_LEN 13
> #define SIRCS_COMMAND_LEN 7

This saves the additional bits in the address, but the information about 
the length of the frame is lost. Without this, IRSND can no longer 
reproduce the frame correctly.

IRMP stores the up to 8 additional bits in the command code. It is 
therefore not surprising that you also determine something different 
with regard to the command code.

Thus, the general data structure in IRMP for SIRCS is:

address: higher byte = additional length, lower byte = SIRCS address
command: 7 bits + optional up to 8 bits

: Bearbeitet durch Moderator
von Jörg R. (jrie)


Angehängte Dateien:

Lesenswert?

Mit einem TSOP 34338 (der nichts herausfiltern sollte) gibt es ein paar 
neue Fehler:
1
gesendet       empfangen      empfangen      empfangen      neue Fehler
2
01081f003f01   01081f003f00   01081f003f00   01081f003f00
3
               01081f003f01   01081f003f01   01081f003f01
4
02001f003f01   02001f003f00   02001f003f00   02001f003f00
5
               02001f003f01   02001f003f01   02001f003f01
6
03001f003f01   03001f003f00   03001f003f00   03001f003f00
7
               03001f003f01   03001f003f01   03001f003f01
8
04001f003f01   04001f003f00   04001f003f00   04001f003f00
9
               04001f003f01   04001f003f01   04001f003f01
10
05001f003f01   05001f003f00   05001f003f00   05001f003f00
11
               05001f003f01   05001f003f01   05001f003f01
12
06001f003f01   060007003f00   060007003f0    060007003f00
13
               060007003f01   060007003f0    060007003f01
14
07001f003f01   07001f003f00   07001f003f00   07001f003f00
15
               07001f003f01   07001f003f01   07001f003f01
16
08001f003e01   08001f003e00   08001f003e0    08001f003e00
17
               08001f003e01   08001f003e0    08001f003e01
18
09001f003f01   09001f003f00   09001f003f00   09001f003f00
19
               09001f003f01   09001f003f01   09001f003f01
20
0a001f003f01   0a001f003f00   0a001f003f00   0a001f003f00
21
               0a001f003f01   0a001f003f01   0a001f003f01
22
0b001f003f01   0b001f003f00   0b001f003f00   0b001f003f00
23
               0b001f003f01   0b001f003f01   0b001f003f01
24
0c001f003f01   0c000f003f00   0c000f003f00   0c000f003f00
25
               0c000f003f01   0c000f003f01   0c000f003f01
26
0d001f003f01   0d0000003f00   0d0000003f0    0d0000003f00
27
               0d0000003f01   0d0000003f0    0d0000003f01
28
0e001f003f01                                               
29
0f001f003f01   0f0000003f00   0f0000003f00   0f0000003f00   
30
               0f0000003f01   0f0000003f01   0f0000003f01
31
10001f003f01   10001f003f00   10001f003f00   10001f003f00
32
               10001f003f01   10001f003f01   10001f003f01
33
11001f003e01   20005500ca00   20005400290    20009a004b00  
34
               20005500aa00                  200054004900
35
12001f003f01   120000000300   12000000030    120000008300   FDC Wiederholung nur
36
               120000008300   12000000830                   manchmal
37
13001f003f01   130003003f00   130003003f0    130003003f00   
38
               130003003f01   130003003f0    130003003f01   
39
14001f003f01   14000f003f00   14000f003f00   14000f003f00
40
               14000f003f01   14000f003f01   14000f003f01
41
15001f003f01   15001f003f00   15001f003f00   15001f003f00
42
               15001f003f01   15001f003f01   15001f003f01
43
16001f003f01   160000000300   16000000030    160000000300
44
               160000000301   16000000030    160000000301
45
18001f003f01                  170095002a0                   IR60 Protokoll
46
1b001f003f01   1b001f003f00   1102aa015a0    1102aa015a00   NEC16 Protokoll nur
47
               1b001f003f01   1102aa015a0    1102aa015a01   manchmal
48
                              1102aa015a0    1102aa015a01   
49
1c001f003f01   1c001f003f00   1c001f003f00   1c001f003f00   NEC42 Wiederholung
50
               1c001f003f01                                 nur manchmal
51
1d001f003f01                                                Lego Protokoll
52
1e001f003f01   1e000f003f00   1e000f003f00   1e000f003f00   Thomson Wiederholung
53
                              1e000f003f01   1e000f003f01   nur manchmal
54
1f001f003f01   1f0000003f00   1f0000003f00   1f0000003f00   
55
               1f0000003f01   1f0000003f01   1f0000003f01
56
20001f003f01   2000df00bf00   2000df00bf00   2000df00af00   A1TV Kommando,
57
               2000df003f00   2000df003f00                  Wiederholung nur  
58
22001f003f01   220000003f00   220000003f0    220000003f00   manchmal
59
               220000003f01   220000003f0    220000003f01   
60
27001f003f01   270000003f00   270000003f0    270000003f00
61
               270000003f01   270000003f0    270000003f01
62
28001f003f01   28001f003f00   28001f003f00   28001f003f00
63
               28001f003f01   28001f003f01   28001f003f01
64
29001f003f01   29001f003f00   29001f003f00   29001f003f00
65
               29001f003f01   29001f003f01   29001f003f01
66
               29001f003f01   29001f003f01   29001f003f01
67
               29001f003f01   29001f003f01   29001f003f01
Anbei der Scan von Lego und IR60. Da A1TV geht und geringfügig kürzere 
Timings hat als Lego, kann es nicht am Filtern liegen, dass Lego nicht 
geht, sondern vermutlich an schlechteren Timings.

Der Nutzen der Tests mit irsnd ${irdata} | irmp besteht in der Erkennung 
vorher unbekannter Fehler (hauptsächlich Kommando und Adresse) und 
zusätzlicher Verifizierung.
Mit  µC-Draht-µC werden weitere Fehler herausgefunden (vermutlich weil 
ein µC langsamer ist als eine CPU und dadurch kritische Timings 
deutlicher sichtbar werden, betrifft eigentlich nur B&O).
Mit nicht filterndem TSOP werden noch mehr Fehler sichtbar (vermutlich 
weil die Timings weiter verschlechtert werden, manche Protokolle gehen 
nicht mehr, andere nur noch manchmal).
Deswegen glaube ich, es wäre nützlich, zu deinem Test noch die drei 
weiteren Tests hinzuzufügen, um mehr Fehler zu erkennen und 
praxisgerecht zu testen.

Wenn man sich die Verschlechterung in diesen Schritten:
Scans → IRMP
Irsnd → IRMP
µC → Draht → µC
µC → IR_Diode → TSOP → µC
anschaut, fällt auf, dass es vor allem durch den TSOP schlechter wird. 
Vielleicht muss man da wie schon von Armin vorgeschlagen etwas 
kompensieren:
"When received, marks tend to be too long and spaces tend to be too 
short. To compensate for this, MARK_EXCESS_MICROS is subtracted from all 
marks, and added to all spaces."
https://www.analysir.com/blog/2014/03/27/infrared-receivers-signal-lag/
https://github.com/Arduino-IRremote/Arduino-IRremote/issues/266
Was bringt es, wenn die Scans gehen, aber der TSOP die Timings so 
verändert, dass dadurch weniger geht?
(Die bisherige Theorie, dass das an zuviel gleichzeitigen Protokollen 
liegt, ist ja durch meine Versuche widerlegt.)

Insgesamt ist das Jammern auf hohem Niveau, denn das meiste geht ja sehr 
gut :)

von Jörg R. (jrie)


Lesenswert?

Zum Vergleich Lego (nur der Anfang) gesendet mit irsnd (obere Zeile) und 
nach dem TSOP gescannt (untere zwei Zeilen):
1
000111111111111111111111000111110001111100011111000111110001111100011111000111111111110001111111
2
000011111111111111111111000011110000011100001111000011110000111100001111000011111111110000111111
3
000011111111111111111111000111110000111100001111000011110000111100001111000011111111110000111111
Man sieht, dass meistens um eine Null verlängert wird und dafür eine 
Eins fehlt (manchmal sind es zwei oder keine).
Das erklärt aber noch nicht, warum nicht erkannt wurde. Denn irmp-20kHz 
erkennt den Scan.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Jörg R. schrieb:
> Zum Vergleich Lego (nur der Anfang) gesendet mit irsnd (obere Zeile) und
> nach dem TSOP gescannt

Danke für das anschauliche Beispiel. Mich würden ja mal die 
Größenordnungen interessieren. Hast Du einen Logic-Analyzer oder ein 
Oszi, um mal genauer zu messen?

> Denn irmp-20kHz erkennt den Scan.

LEGO habe ich nach Dokumentation implementiert, also nicht empirirsch 
mittels IRMP-Scans. Das heisst, die Lego-Timings in irmpprotocols.h sind 
die, welche am Sender entstehen.

Dass IRMP das Lego-Protokoll am TSOP trotzdem erkennt, liegt wohl an den 
Toleranzen, mit denen IRMP arbeitet. Diese sind auch unbedingt 
notwendig.

Ich habe schon viele FBs in der Hand gehabt. Dass welche mit demselben 
Protokoll arbeiten, sagt überhaupt nichts über das abweichende 
Timingverhalten der einen oder anderen Fernbedienung aus. Jede FB hat 
Timing-Abeweichungen nach oben oder unten. Ich habe da schon 
Abweichungen im zweistelligen Prozentbereich gesehen. Aus diesem Grund 
sind auch für alle Protokolle Toleranzen in irmp.c angegeben - bis zu 30 
Prozent (oder mehr) für einige Protokolle.

: Bearbeitet durch Moderator
von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Kleiner Exkurs über die Toleranzen:

IRMP zeigt in der Linux-Version beim Scannen eines Protokolls die 
erkannten Timings inkl. Toleranzen an, wenn man die Option "-v" 
verwendet.

Beispiel für NEC:
1
$ ./irmp-10kHz -v < IR-Data/nec.txt
2
  13.800ms [start-bit: pulse = 97, pause = 44]
3
protocol = NEC, start bit timings: pulse:  62 - 118, pause:  30 -  60
4
pulse_1:   3 -   8
5
pause_1:  11 -  23
6
pulse_0:   3 -   8
7
pause_0:   3 -   8
8
command_offset: 16
9
command_len:     16
10
complete_len:    32

Das heisst:
1
- NEC erkannt
2
- Für das Start-Bit werden folgende Längen akzeptiert:
3
     62 - 118  Nullen
4
     30 - 60   Einsen
5
- Für die Daten werden folgende Längen akzeptiert:
6
     3 -  8    Nullen
7
     3 -  8    Einsen oder
8
    11 - 23    Einsen

Wie man hier schön sieht, sind die von IRMP verwendeten Toleranzen schon 
enorm. Diese sind aber auch notwendig, wie man aus der Praxis bzw. aus 
den an mich eingeschickten Scans (liegen im Unterverzeichnis IR-Data) 
sehr gut nachvollziehen kann.

von Jörg R. (jrie)


Lesenswert?

Frank M. schrieb:
> Hast Du einen Logic-Analyzer oder ein
> Oszi, um mal genauer zu messen?
Nein. Ich könnte es mit einem Soundkarten-Oszi probieren. Dazu müsste 
ich aber erst einen Adapter löten, das kann dauern.
Wäre es eigentlich möglich, die Scan-Funktion und IRMP mit z.B. 38kHz 
(oder noch mehr) laufen zu lassen (auf STM32F103 mit 72MHz) für genauere 
Scans?

.
Frank M. schrieb:
> Dass IRMP das Lego-Protokoll am TSOP trotzdem erkennt,
Falls das ein Mißverständnis ist, ich meinte  ./irmp-20kHz < 
cutecom.log.lego am PC funktioniert. Aber der µC erkennt nichts.

.
Wie debuggt man die Fehler am besten? printf's vom µC? Genauere Scans 
nach dem TSOP am PC auswerten?

Wie weit kommst du eigentlich damit hinterher, die Fehler, mit denen ich 
dich überschütte, zu beheben? Ist ja viel auf einmal.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Jörg R. schrieb:
> Wie debuggt man die Fehler am besten? printf's vom µC? Genauere Scans
> nach dem TSOP am PC auswerten?

Ich machs am PC mit der Option -v. Da sieht man eigentlich ganz genau, 
wo der IRMP sich entweder in ein anderes Protokoll verrennt oder sich 
über Timing-Fehler beklagt.

> Wie weit kommst du eigentlich damit hinterher, die Fehler, mit denen ich
> dich überschütte, zu beheben? Ist ja viel auf einmal.

Auf jeden Fall verschiebt jede Fehlermeldung das nächste Release um 
weitere 2 Wochen nach hinten ;-)

Ich habe bereits zweimal angesetzt, ein neues Release rauszugeben und 
das beide Male dann doch wieder verschoben.

von Jörg R. (jrie)


Lesenswert?

Dann mal zur Beschleunigung des nächsten Releases ein gutes Ergebnis ;-)
Alle mit 38kHz gesendet, mit 38 kHz über den TSOP 34338 empfangen die 
nächsten 5 Spalten, mit 19kHz über den TSOP 34338 empfangen die letzte 
Spalte (dabei geht Lego nicht).
Außer einmal Sony umgekippt in Siemens (habe ich schon öfter gesehen) 
und einmal keine Wiederholung bei Denon keine neuen Fehler (im Vergleich 
zu  28.12.2020 11:13).
1
gesendet      empfangen     empfangen     empfangen     empfangen     empfangen     empfangen   
2
01081f003f01  1102aa015a00  01081f003f00  01081f003f00  01081f003f00  01081f003f00  01081f003f00
3
              01081f003f00  01081f003f01  01081f003f01  01081f003f01  01081f003f01  01081f003f01
4
02001f003f01  02001f003f00  02001f003f00  02001f003f00  02001f003f00  02001f003f00  02001f003f00
5
              02001f003f01  02001f003f01  02001f003f01  02001f003f01  02001f003f01  02001f003f01
6
03001f003f01  03001f003f00  03001f003f00  03001f003f00  03001f003f00  03001f003f00  03001f003f00
7
              03001f003f01  03001f003f01  03001f003f01  03001f003f01  03001f003f01  03001f003f01
8
04001f003f01  04001f003f00  04001f003f00  04001f003f00  04001f003f00  04001f003f00  04001f003f00
9
              04001f003f01  04001f003f01  04001f003f01  04001f003f01  04001f003f01  04001f003f01
10
05001f003f01  05001f003f00  05001f003f00  05001f003f00  05001f003f00  05001f003f00  05001f003f00
11
              05001f003f01  05001f003f01  05001f003f01  05001f003f01  05001f003f01  05001f003f01
12
06001f003f01  060007003f00  060007003f00  060007003f00  060007003f00  060007003f00  060007003f00
13
              060007003f01  060007003f01  060007003f01  060007003f01  060007003f01  060007003f01
14
07001f003f01  07001f003f00  07001f003f00  07001f003f00  07001f003f00  07001f003f00  07001f003f00
15
              07001f003f01  07001f003f01  07001f003f01  07001f003f01  07001f003f01  07001f003f01
16
08001f003e01  08001f003e00  08001f003e00  08001f003e00  08001f003e00  08001f003e00  08001f003e00
17
              08001f003e01  08001f003e01                08001f003e01  08001f003e01  08001f003e01
18
09001f003f01  09001f003f00  09001f003f00  09001f003f00  09001f003f00  09001f003f00  09001f003f00
19
              09001f003f01  09001f003f01  09001f003f01  09001f003f01  09001f003f01  09001f003f01
20
0a001f003f01  0a001f003f00  0a001f003f00  0a001f003f00  0a001f003f00  0a001f003f00  0a001f003f00
21
              0a001f003f01  0a001f003f01  0a001f003f01  0a001f003f01  0a001f003f01  0a001f003f01
22
0b001f003f01  0b001f003f00  0b001f003f00  0b001f003f00  0b001f003f00  0b001f003f00  0b001f003f00
23
              0b001f003f01  0b001f003f01  0b001f003f01  0b001f003f01  0b001f003f01  0b001f003f01
24
0c001f003f01  0c000f003f00  0c000f003f00  0c000f003f00  0c000f003f00  0c000f003f00  0c000f003f00
25
              0c000f003f01  0c000f003f01  0c000f003f01  0c000f003f01  0c000f003f01  0c000f003f01
26
0d001f003f01  0d0000003f00  0d0000003f00  0d0000003f00  0d0000003f00  0d0000003f00  0d0000003f00
27
              0d0000003f01  0d0000003f01  0d0000003f01  0d0000003f01  0d0000003f01  0d0000003f01
28
0e001f003f01                                                                                    
29
0f001f003f01  0f0000003f00  0f0000003f00  0f0000003f00  0f0000003f00  0f0000003f00  0f0000003f00
30
              0f0000003f01  0f0000003f01  0f0000003f01  0f0000003f01  0f0000003f01  0f0000003f01
31
10001f003f01  10001f003f00  10001f003f00  10001f003f00  10001f003f00  10001f003f00  10001f003f00
32
              10001f003f01  10001f003f01  10001f003f01  10001f003f01  10001f003f01  10001f003f01
33
11001f003e01  11001f003e00  11001f003e00  11001f003e00  11001f003e00  11001f003e00  11001f003e00
34
                                          11001f003e01                              11001f003e01
35
12001f003f01  120000000300  120000000300  120000000300  120000000300  120000000300  120000000300
36
              120000008300  120000008300  120000008300  120000008300  120000008300  120000008300
37
13001f003f01  130003003f00  130003003f00  130003003f00  130003003f00  130003003f00  130003003f00
38
              130003003f01  130003003f01  130003003f01  130003003f01  130003003f01  130003003f01
39
14001f003f01  14000f003f00  14000f003f00  14000f003f00  14000f003f00  14000f003f00  14000f003f00
40
              14000f003f01  14000f003f01  14000f003f01  14000f003f01  14000f003f01  14000f003f01
41
15001f003f01  15001f003f00  15001f003f00  15001f003f00  15001f003f00  15001f003f00  15001f003f00
42
              15001f003f01  15001f003f01  15001f003f01  15001f003f01  15001f003f01  15001f003f01
43
16001f003f01  160000000300  160000000300  160000000300  160000000300  160000000300  160000000300
44
              160000000301  160000000301  160000000301  160000000301  160000000301  160000000301
45
18001f003f01  180000003f00  180000003f00  180000003f00  180000003f00  180000003f00  180000003f00
46
1b001f003f01  1b001f003f00  1b001f003f00  1b001f003f00  1b001f003f00  1b001f003f00  1b001f003f00
47
              1b001f003f01  1b001f003f01  1b001f003f01  1b001f003f01  1b001f003f01  1b001f003f01
48
1c001f003f01  1c001f003f00  1c001f003f00  1c001f003f00  1c001f003f00  1c001f003f00  1c001f003f00
49
              1c001f003f01  1c001f003f01  1c001f003f01  1c001f003f01  1c001f003f01  1c001f003f01
50
1d001f003f01  1d0000003f00  1d0000003f00  1d0000003f00  1d0000003f00  1d0000003f00              
51
              1d0000003f01  1d0000003f01  1d0000003f01  1d0000003f01  1d0000003f01              
52
1e001f003f01  1e000f003f00  1e000f003f00  1e000f003f00  1e000f003f00  1e000f003f00  1e000f003f00
53
              1e000f003f01  1e000f003f01  1e000f003f01  1e000f003f01  1e000f003f01  1e000f003f01
54
1f001f003f01  1f0000003f00  1f0000003f00  1f0000003f00  1f0000003f00  1f0000003f00  1f0000003f00
55
              1f0000003f01  1f0000003f01  1f0000003f01  1f0000003f01  1f0000003f01  1f0000003f01
56
20001f003f01  2000df003f00  2000df003f00  2000df003f00  2000df003f00  2000df003f00  2000df00bf00
57
              2000df003f01  2000df003f01  2000df003f01  2000df003f01  2000df003f01  2000df00bf01
58
22001f003f01  220000003f00  220000003f00  220000003f00  220000003f00  220000003f00  220000003f00
59
              220000003f01  220000003f01  220000003f01  220000003f01  220000003f01  220000003f01
60
27001f003f01  270000003f00  270000003f00  270000003f00  270000003f00  270000003f00  270000003f00
61
              270000003f01  270000003f01  270000003f01  270000003f01  270000003f01  270000003f01
62
28001f003f01  28001f003f00  28001f003f00  28001f003f00  28001f003f00  28001f003f00  28001f003f00
63
              28001f003f01  28001f003f01  28001f003f01  28001f003f01  28001f003f01  28001f003f01
64
29001f003f01  29001f003f00  29001f003f00  29001f003f00  29001f003f00  29001f003f00  29001f003f00
65
              29001f003f01  29001f003f01  29001f003f01  29001f003f01  29001f003f01  29001f003f01
66
              29001f003f01  29001f003f01  29001f003f01  29001f003f01  29001f003f01  29001f003f01
67
              29001f003f01  29001f003f01  29001f003f01  29001f003f01  29001f003f01  29001f003f01

von Derek, Chen (Gast)


Lesenswert?

Hi Frank,
Thank you for your reply, I have benefited a lot.
Derek

von Jörg R. (jrie)


Angehängte Dateien:

Lesenswert?

Frank M. schrieb:
> Hast Du einen Logic-Analyzer oder ein
> Oszi, um mal genauer zu messen?
Mit einem buck50 (https://github.com/thanks4opensource/buck50) habe ich 
Lego gescannt (lego.vcd). Man sieht die verlängerten Pulse und die 
verkürzten Pausen. Die verlängerten Pulse und die verkürzten Pausen 
hängen auch vom Protokoll ab, bei RC5 sind sie nur im Bereich 14-18µs, 
bei Lego 34-40µs.

von Jörg R. (jrie)


Lesenswert?

Fix für Lego (LEGO_1_PAUSE_LEN_MIN darf nur 25%, entsprechend auch 
LEGO_0_PAUSE_LEN_MAX nur 30%, sonst kippt so manche Null in Eins, da die 
sich vorher überlappt haben):
1
#define LEGO_1_PAUSE_LEN_MIN                    ((uint_fast8_t)(F_INTERRUPTS * LEGO_1_PAUSE_TIME * MIN_TOLERANCE_25 + 0.5) - 1)
2
#define LEGO_0_PAUSE_LEN_MAX                    ((uint_fast8_t)(F_INTERRUPTS * (LEGO_0_PAUSE_TIME * MAX_TOLERANCE_30 + 0.5) + 1)

: Bearbeitet durch User
von Jörg R. (jrie)


Lesenswert?

Zu den verlängerten Pulsen und den verkürzten Pausen:
Ich finde es nicht erstrebenswert, eine Kompensation für den 
IR-Empfänger (TSOP) einzuführen, denn dann bräuchte man für jeden 
IR-Empfänger und für jedes Protokoll eine andere Firmware. Der 
vorhandene Ansatz mit großzügigen Toleranzen gefällt mir besser und 
funktioniert ja auch gut.

Ich habe auch einen Scan von Recs80 analysiert, weil da auch 158µs Pulse 
sind. Die Pausen sind aber viel länger, und das "beruhigt" den TSOP, die 
Abweichungen der empfangenen Längen untereinander sind jedenfalls viel 
kleiner als bei Lego.

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


Lesenswert?

Jörg R. schrieb:
> Die verlängerten Pulse und die verkürzten Pausen
> hängen auch vom Protokoll ab, bei RC5 sind sie nur im Bereich 14-18µs,
> bei Lego 34-40µs.

Danke für die Info. Die Protokollabhängigkeit kann ich mir nur mit den 
unterschiedlichen Modulationsfrequenzen erklären. RC5: 36kHz, Lego: 
38Khz (meines Wissens nach). Kann es sein, dass das ein 36kHz-TSOP war, 
so nach dem Motto: Je unpassender die Modulationsfrequenz, desto größer 
die Verkürzungen/Verlängerungen?

Da bei INTERRUPTS=15000 die Auflösung gerad mal 67µs beträgt, ist das 
unterhalb des Radars. Bei INTERRUPTS=20000 sind es 50µs - auch nicht 
viel besser.

Jörg R. schrieb:
> Fix für Lego (LEGO_1_PAUSE_LEN_MIN darf nur 25%, entsprechend auch
> LEGO_0_PAUSE_LEN_MAX nur 30%, sonst kippt so manche Null in Eins, da die
> sich vorher überlappt haben):

Danke für den Tipp, werde ich so übernehmen.

Jörg R. schrieb:
> Zu den verlängerten Pulsen und den verkürzten Pausen:
> Ich finde es nicht erstrebenswert, eine Kompensation für den
> IR-Empfänger (TSOP) einzuführen,

Es wird auch kaum eine höhere Genauigkeit bringen. Ich sehe in den Scans 
oft auch Timing-Abweichungen von ein und derselben Fernbedienung. Von 
daher liegen die Verlängerungen/Verkürzungen eigentlich unterhalb der 
Wahrnehmungsgrenze und beeinflussen den Zählvorgang von Pulsen/Pausen 
höchstens um den Wert 1. Das liegt dann immer innerhalb der Toleranzen.

Die Kunst besteht eindeutig in der richtigen Einstellung der Toleranzen. 
Sie dürfen nicht zu groß sein, dass Konflikte entstehen, sie dürfen aber 
auch nicht zu klein sein, dass Ungenauigkeiten das Decoding unmöglich 
machen.

: Bearbeitet durch Moderator
von Jörg R. (jrie)


Lesenswert?

Frank M. schrieb:
> Die Protokollabhängigkeit kann ich mir nur mit den
> unterschiedlichen Modulationsfrequenzen erklären. RC5: 36kHz, Lego:
> 38Khz (meines Wissens nach). Kann es sein, dass das ein 36kHz-TSOP war,
> so nach dem Motto: Je unpassender die Modulationsfrequenz, desto größer
> die Verkürzungen/Verlängerungen?

Es war ein TSOP34338 mit 38kHz, also genau umgekehrt.
Aber meine Versuche zeigen, dass bei mit 19kHz senden und empfangen mehr 
Protokolle erkennt werden als bei mit 20 kHz  senden und enpfangen. Und 
die allermeisten Protokolle haben ja 38kHz.
Deswegen sollten die Abfragen für RCMM und Lego von 20000 auf 19000 
gesenkt werden.

Bleibt noch die Frage, wieso die Erkennung bei mit 38kHz gesendet 
deutlich besser ist als bei mit 19kHz gesendet, bzw. ob man bei mit 
19kHz senden noch was verbessern kann.

An welchen Baustellen sitzt du eigentlich noch (damit ich nicht an 
Sachen ran gehe, die du schon gemacht hast)?

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Jörg R. schrieb:
> Es war ein TSOP34338 mit 38kHz, also genau umgekehrt.

Ich habs befürchtet.

> Aber meine Versuche zeigen, dass bei mit 19kHz senden und empfangen mehr
> Protokolle erkennt werden als bei mit 20 kHz  senden und enpfangen. Und
> die allermeisten Protokolle haben ja 38kHz.

2 x 19 = 38. Vermutlich ist ein Verhältnis mit ganzem Teiler besser, 
weils dann weniger solcher "Kipper" gibt: Mal ein Puls eine Zeiteinheit 
länger, mal kürzer.

> Deswegen sollten die Abfragen für RCMM und Lego von 20000 auf 19000
> gesenkt werden.

Das ist eine gute Idee.

> Bleibt noch die Frage, wieso die Erkennung bei mit 38kHz gesendet
> deutlich besser ist als bei mit 19kHz gesendet, bzw. ob man bei mit
> 19kHz senden noch was verbessern kann.

Du hast tatsächlich IRSND mit INTERRUPTS=38000 betrieben? Hm, habe ich 
das oben irgendwo überlesen?

> An welchen Baustellen sitzt du eigentlich noch (damit ich nicht an
> Sachen ran gehe, die du schon gemacht hast)?

Die Baustellen, an denen ich werkele, haben nichts mit IRMP zu tun ;-)

Du kannst also gern fröhlich weitere Verbesserungen einbauen. Vielleicht 
sollte ich den aktuellen Stand mal einchecken?

von Jörg R. (jrie)


Lesenswert?

Jörg R. schrieb:
> Alle mit 38kHz gesendet,
Frank M. schrieb:
> Du hast tatsächlich IRSND mit INTERRUPTS=38000 betrieben?
Ja.

.
Frank M. schrieb:
> Vielleicht
> sollte ich den aktuellen Stand mal einchecken?
Ja, bitte :)

von Jörg R. (jrie)


Lesenswert?

Spricht eigentlich irgendwas dagegen, 38 kHz zu benutzen, wenn der µC 
das schafft? Ich habe sogar mal 76 kHz getestet, dann gehen manche 
Protokolle noch gut, andere nicht mehr. Ich werde durch Verbessern der 
Timings versuchen, ob auch alles 19 kHz Gesendete optimal dekodiert 
werden kann. Bei einigen Protokollen ist 10% vielleicht zu eng.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Jörg R. schrieb:
> Spricht eigentlich irgendwas dagegen, 38 kHz zu benutzen, wenn der µC
> das schafft?

Von mener Seite aus nicht. Ein STM32 sollte das locker schaffen. Bei 
AVRs wirds dann wohl eng...

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Es gibt sowohl für IRMP als auch für IRSND eine neue Version 
3.2.6:

Änderungen:

    - Neues IR-Protokoll: MELINERA
    - Protokoll LEGO: Timing verbessert
    - Protokoll RUWIDO: Timing verbessert
    - Protokoll NEC: Senden von Repetition-Frames ermöglicht

Zum letzten Punkt:

Dies ist eine spezielle Erweiterung für IR-Repeater. Hier kann es in 
Einzelfällen sinnvoll sein, dass IRSND nicht automatisch 
Wiederholungsframes erzeugt, sondern dass die Applikation gezielt 
Wiederholungsframes senden kann. Dies ist speziell für das NEC-Protoll 
sinnvoll.

Erklärt wird die Anwendung hier: 
https://www.mikrocontroller.net/articles/IRSND#Wiederholungsframes_f.C3.BCr_NEC

Viel Spaß,
Frank

von Jörg R. (jrie)


Angehängte Dateien:

Lesenswert?

Danke für das neue Release :)

Angehängter Patch ermöglicht Logging mit STM32F30x.

Auf meiner TODO Liste sind Protokolle betreffend:
* Sony kippt manchmal in Siemens um
* Logi kippt öfter in Ruwido um
* Thomson hat öfter keine Wiederholung
* IR60 hat nie Wiederholung
* Denon hat selten keine Wiederholung

von Armin J. (arminj)


Lesenswert?

Jörg R. schrieb:
> * Denon hat selten keine Wiederholung
Bei mir (AVR) tuts das einwandfrei!
Du weisst schon, dass Denon 1*Autorepeat hat?

von Jörg R. (jrie)


Angehängte Dateien:

Lesenswert?

Wenn Sony als Siemens erkannt wird, liegt das daran, dass am Anfang ca. 
18 Nullen fehlen. cutecom.log.x_sony wird als Siemens (und die zwei 
Wiederholungen als Sony) erkannt. Wenn man vorne 18 Nullen einfügt, wird 
es korrekt nur als Sony erkannt.
Woran kann das liegen, dass da beinahe 1 ms an Nullen "verschluckt" 
wird?
Gescannt und gesendet mit 19kHz.

: Bearbeitet durch User
von Jörg R. (jrie)


Lesenswert?

Dass Lego manchmal als Ruwido oder Siemens oder gar nicht erkannt wird, 
liegt daran, dass im Erkennungsfall das Startbit als 3 Nullen + 19 
Einsen geloggt wird, im Fehlerfall aber als 4 Nullen + 18 Einsen geloggt 
wird. Letzteres wird als Ruwido erkannt.
Mit folgender Änderung wird sowohl Lego als auch Siemens korrekt nach 
dem TSOP erkannt:
1
 #define SIEMENS_OR_RUWIDO_START_BIT_PULSE_LEN_MIN       ((uint_fast8_t)(F_INTERRUPTS * SIEMENS_OR_RUWIDO_START_BIT_PULSE_TIME * MIN_TOLERANCE_00 + 0.5) - 0)
Jetzt kann ich auch verstehen, warum es anderen Siemens Code mit 
längerem SIEMENS_OR_RUWIDO_START_BIT_PULSE_TIME gab.
Und warum sollte 4,5 bis 5,49 auf 4 gerundet werden?
Bei 19kHz ist F_INTERRUPTS * SIEMENS_OR_RUWIDO_START_BIT_PULSE_TIME 
nämlich 5,225 und da passt 5 besser als 4.

von Jörg R. (jrie)


Angehängte Dateien:

Lesenswert?

Bei Denon ist (bei mir) der Wurm drin.
1
Gesendet: 08001f003f00 Gescannt: cutecom.log.denon_00
1
Gesendet: 08001f003f01 Gescannt: cutecom.log.denon_01
Erkannt wird nur das mit Wiederholung gesendete, aber das nur als 
einfach.
Auch alles mit 19 kHz.

.
Armin J. schrieb:
> Bei mir (AVR) tuts das einwandfrei!
Auch mit deinem STM32 BluePill? Dann wäre ein Scan zum Vergleich 
interessant.

von Jörg R. (jrie)


Angehängte Dateien:

Lesenswert?

Bei IR60 geht mit der Wiederholung etwas total schief. Zum Vergleich ein 
Scan mit (cutecom.log.ir60_01) und ohne ( cutecom.log.ir60_00) 
Wiederholung. Das bei mit Wiederholung zusätzlich Gesendete ergibt bei 
der Erkennung Müll.

von Jörg R. (jrie)


Lesenswert?

Dass Thomson öfter keine Wiederholung hat, kann ich gerade nicht 
reproduzieren. Allerdings habe ich zwecks besserem Scannen alle 
Protokolle abgeschaltet, denn mir scheint, dann funktioniert das Scannen 
besser.
Bei allen Scans von heute lief also keine Erkennung parallel.

von Jörg R. (jrie)


Lesenswert?

Bei Denon hatte ich vergessen, dass das Kommando gerade sein muss.
Mit geradem Kommando kann ich die selten fehlende Wiederholung auch 
nicht reproduzieren.

von Jörg R. (jrie)


Angehängte Dateien:

Lesenswert?

Bei IR60 wird der Start-Frame verdoppelt statt der Daten-Frame, und 
deswegen geht die Wiederholung nicht. Denn der  Daten-Frame wird zuerst 
gesendet und dann der Start-Frame. Der Fix steht aber schon im Code und 
muss nur aktiviert werden.
Wenn in Zeile 1533 if 0 durch if 1 ersetzt wird, geht die Wiederholung.
Gesehen habe ich das mit dem buck50 (i2.vcd).
Das Loggen funktioniert selbst ohne aktive Protokolle nicht zuverlässig, 
da fehlte Einiges (cutecom.log.ir60_01, weiter oben).

Bei 12 Versuchen mit 19 kHz gingen alle 33 Protokolle (ausser einmal 
keine Wiederholung bei RCCAR). Ich habe noch folgendes drin: 
irmp.c.diff, bessere Timings für Thomson (deshalb ging es jetzt) und für 
Siemens (bin nicht sicher ob die nötig sind, aber damit geht es).

von Jörg R. (jrie)


Lesenswert?

Bei A1TV werden mit folgender Änderung die Adressen und Kommandos 
richtig erkannt. Vorher wurde manchmal eine lange Pause als kurze Pause 
erkannt.
1
#define A1TVBOX_BIT_PAUSE_LEN_MAX               ((uint_fast8_t)(F_INTERRUPTS * A1TVBOX_BIT_PAUSE_TIME * MAX_TOLERANCE_20 + 0.5) + 1)
(Toleranz von 30% auf 20% gesenkt.)

von Jörg R. (jrie)


Lesenswert?

Bei 200 Mal die 33 Protokolle senden (das dauert eine Stunde) gab es nur 
noch einige Male Probleme mit Siemens und A1TVBox. Alle anderen waren 
tadellos. Getestet mit 
https://github.com/j1rie/IRMP_STM32/tree/master/test-suite
Siemens kippt manchmal in A1TVBox, und A1TVBox hat manchmal falsche Bits 
oder wird nicht erkannt.

von Jörg R. (jrie)


Angehängte Dateien:

Lesenswert?

Mit dem angehängtem Patch gibt es bei 200 Mal die 33 Protokolle senden 
keine Fehler mehr :)

von Jörg R. (jrie)


Angehängte Dateien:

Lesenswert?

An den Stelllen, an denen ich mit festen Werten korrigiert habe, muss 
noch in Prozent umgerechnet werden, damit es auch mit anderer Interrupt 
Frequenz geht. An einer Stelle ist das nicht möglich, da weiß ich noch 
nicht.
Ich werde dann auch mit 20, 15 und 10 kHz testen.

Edit: Hab's ausgerechnet und angehängt.
Wieso bei aufrunden noch 1 addiert wird bzw. bei abrunden noch 1 
subtrahiert wird, verstehe ich aber nicht.

: Bearbeitet durch User
von Jörg R. (jrie)


Angehängte Dateien:

Lesenswert?

Jörg R. schrieb:
> Woran kann das liegen, dass da beinahe 1 ms an Nullen "verschluckt"
> wird?

Das passiert immer beim ersten Mal Senden nach Firmware Start. Mit einem 
Logic Analyzer sehe ich, dass dann an der Sendediode der erste Puls 0,9 
ms zu kurz ist.

von Jörg R. (jrie)


Lesenswert?

Jörg R. schrieb:
> Ich werde dann auch mit 20, 15 und 10 kHz testen.

irsnd-20kHz | irmp-20kHz funktioniert tadellos, aber beim gründlichen 
Test 200x33 gibt es viele Fehler.
Mit irsnd-15kHz | irmp-15kHz fallen mehr Protokolle aus, als von den
Kommentaren im Code erwartet, und mit irsnd-10kHz | irmp-10kHz nochmals
mehr. Darum habe ich keinen gründlichen Test mit 15kHz oder mit
10kHz gemacht.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Erstmal danke für Deine unermüdliche Arbeit, Jörg. Ich werde Deinen diff 
fürs nächste Release vorsehen. Das kann allerdings etwas dauern, weil 
Andreas das SVN hier nicht mehr weiter anbieten wird. IRMP wird daher 
endgültig auf github umziehen.

Da die Arduino-Version, welche Armin immer aus den IRMP-Releases 
generiert, schon seit längerem auf github ist, wird dort dann demnächt 
eine gemeinsame Version weitergeplegt. Dazu werde ich Deinen diff-Output 
in die Arduino-Verion einarbeiten, damit Armin nicht immer wieder aufs 
neue IRMP auf Arduino portieren muss. Um sowohl die Arduino- als auch 
die Non-Arduino-Version aus einem Repository anzubieten, bedarf es noch 
ein paar Gedanken über die zukünftige Organisation des Source-Codes. In 
der Arduino-Version heißt irmp.c nämlich irmp.c.h, welches als Include 
genutzt wird. Dies gilt auch noch für weitere IRMP-/IRSND-Quelldateien. 
Diesen eklatanten Unterschied gilt es für eine gemeinsame Version 
abzustellen.

von 900ss (900ss)


Lesenswert?

Frank M. schrieb:
> nämlich irmp.c.h
Ist das jetzt eine C Datei mit C Source oder eine Headerdatei?
Was für ein Graus in diesem Arduino-Zeugs.

Sorry aber mir rollen sich die Fußnägel auf. Schade um das schöne 
Produkt IRMP.
Halte es in einem getrennten Repo. Wer das gerne in Arduino nutzen 
möchte, kann das auch ohne dass es eine Arduino konforme Einbindung hat. 
Der, der das nicht beherrscht, wird auch nicht IRMP benutzen da mehr als 
LED-Blinky eh nicht drin ist.

von Klaus R. (klaus2)


Lesenswert?

applaus

Klaus.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

900ss D. schrieb:
> Ist das jetzt eine C Datei mit C Source oder eine Headerdatei?

Armin hat daraus eine Header-Datei gemacht. Das war ein technischer 
Kunstgriff.

> Halte es in einem getrennten Repo.

Du kannst Dir sicher sein, dass es auch zukünftig ein irmp.c geben wird. 
Ich werde mit Armin darüber diskutieren, wie wir sowohl Arduino als auch 
Non-Arduino unter einen Hut bekommen.

von Jörg R. (jrie)


Lesenswert?

Ich habe meinen Patch noch etwas erweitert und in mein github gelegt:
https://github.com/j1rie/IRMP/commits/master

von Micha (Gast)


Lesenswert?

Gehe ich recht in der Annahme, dass ich mit IRSND gesendete Kommandos 
mit IRMP testen kann indem ich die ISR so schreibe?
1
ISR(TIMER1_COMPA_vect)
2
{
3
  irsnd_ISR();            // call irsnd ISR
4
  irmp_ISR();             // call irmp ISR
5
  // call other timer interrupt routines...
6
}

von Micha (Gast)


Lesenswert?

Micha schrieb:
> Gehe ich recht in der Annahme, dass ich mit IRSND gesendete Kommandos
> mit IRMP testen kann indem ich die ISR so schreibe?

Mir geht es hauptsächlich um einen Test des Hardware-Sendepfads. Dass 
der Empfang funktioniert sehe ich durch Tests mit verschiedenen 
Fernbedienungen.

von Jörg R. (jrie)


Lesenswert?

Jörg R. schrieb:
> Das passiert immer beim ersten Mal Senden nach Firmware Start. Mit einem
> Logic Analyzer sehe ich, dass dann an der Sendediode der erste Puls 0,9
> ms zu kurz ist.

Die schlechte Nachricht: Es ist noch schlimmer, bei kurzen Pulsen wird 
gar nichts gesendet. Da geht der Timer einfach nicht an. Also z.B. 
beliebig oft Recs80 senden und nichts wird gesendet. Ich hatte schon 
Zweifel, ob mein Board bzw. der Timer defekt wäre.
Der Timer wird erst durch Senden eines hinreichend langen Pulses 
"geheilt". Da ich in meinen Tests mit Sony angefangen habe, hat bereits 
der erste Frame genügt und das Problem ist nur beim ersten Mal 
aufgetreten.

Die gute Nachricht: Ich habe den Fehler gefunden und behoben. Das war 
eine harte Nuss. Code analysiert, Manual gelesen und Versuch und Irrtum. 
Es steht zwar alles irgendwo bei STM, aber leicht verständlich ist was 
anderes.
https://github.com/j1rie/IRMP/commit/8db0981aa544a6bc2ef098b72839dcc169513a50

von Micha (Gast)


Lesenswert?

Frank M. schrieb:
> In der Arduino-Version heißt irmp.c nämlich irmp.c.h, welches als Include
> genutzt wird.

In diesem Fall könnte man wohl in der irmp.c.h ein #include "irmp.c" 
platzieren. Ob das in allen Fällen geht, kann ich nicht einschätzen. Und 
schön ist es auch nicht.

von Micha (Gast)


Lesenswert?

GCC meckert, dass nec_param in irmp.c unbenutzt ist wenn (nur) die 
folgenden Protokolle aktiviert sind:
1
#define IRMP_SUPPORT_SIRCS_PROTOCOL             1
2
#define IRMP_SUPPORT_NEC_PROTOCOL               1
3
#define IRMP_SUPPORT_SAMSUNG_PROTOCOL           1
4
#define IRMP_SUPPORT_NEC16_PROTOCOL             1
5
#define IRMP_SUPPORT_NEC42_PROTOCOL             1
6
#define IRMP_SUPPORT_RC5_PROTOCOL               1
7
#define IRMP_SUPPORT_RC6_PROTOCOL               1

von Micha (Gast)


Lesenswert?

Wo ist der letzte Stand zu finden, jetzt wo es das SVN repo nicht mehr 
gibt?

von 900ss (900ss)


Lesenswert?

In Github, oben müsste der Link irgendwo sein.

von Micha (Gast)


Lesenswert?

D.h. den letzten Stand gibt es derzeit nur für Arduino. Schade.

von 900ss (900ss)


Lesenswert?

Nein, im Artikel ist auch ein Download

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

von Jörg R. (jrie)


Lesenswert?

Bis es von Frank was Neues gibt, empfehle ich 
https://github.com/j1rie/IRMP, da sind etliche Verbesserungen eingebaut.

von Micha (Gast)


Lesenswert?

900ss D. schrieb:
> Nein, im Artikel ist auch ein Download
> https://www.mikrocontroller.net/articles/IRMP#Download

Das weiß ich. Das ist Version 3.2.6 und in ukws github ist Version 
3.4.1. Daher die Annahme, dass es die neuste Version nur für Arduino 
gibt.

Jörg R. schrieb:
> Bis es von Frank was Neues gibt, empfehle ich
> https://github.com/j1rie/IRMP, da sind etliche Verbesserungen eingebaut.

Schaue ich mir mal an, danke. Funktioniert IRSND da mit der HAL Lib ohne 
das Cube-Gedöns?

von 900ss (900ss)


Lesenswert?

Micha schrieb:
> Das weiß ich

Entschuldige bitte dass ich mir die Mühe machte im Artikel nach einem 
Download zu schauen.

von Micha (Gast)


Lesenswert?

So war das nicht gemeint, bitte entschuldige! Vielen Dank für deine 
Mühe!

Aktuell scheint Frank nicht viel Zeit für das Projekt zu haben, was zwar 
schade, aber natürlich auch verständlich ist. Ich hoffe, dass sich das 
wieder ändert oder er zumindest noch etwas Zeit findet um bspw. die 
Sache mit dem Repo geradezuziehen.

von 900ss (900ss)


Lesenswert?

Micha schrieb:
> So war das nicht gemeint

Schon gut, alles ok. Im Artikel scheint es aber die letzte offizielle 
Version von Frank zu sein. Was da im Arduinoableger passiert, ist mir 
persönlich herzlich egal. Was ich davon halte schrieb ich dort schon:

Beitrag "Re: IRMP - Infrared Multi Protocol Decoder"

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Es wird noch in diesem Monat ein neues Release geben, welches auch die 
Non-Arduino-Umgebungen umfasst. Bis dahin empfehle ich, wenn es denn 
unbedingt die allerneueste Version sein soll, auf das Repository von 
Jörg (jrie) zurückzugreifen.

P.S.
Die Versionsnummmerierung in der Arduino-Variante weicht von der 
Originalversion ab und ist daher nicht vergleichbar.

von Joachim B. (jar)


Lesenswert?

Frage was wäre denn die optimale Kombi für einen IRMP universal Scanner?

Der ESP32 hat schon mal mehr flash und mehr SRAM als ein nano328p

Einige Codes beissen sich ja und auch nicht jede IRQ Rate ist optimal.
Ich möchte gerne die Daten einer Fernsteuerung vom Proscenic m8pro 
Staubsauger Roboter lernen, müsste dazu noch mal aufbauen.

LG

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Joachim B. schrieb:

Ich beantworte mal die Fragen in umgekehrter Reihenfolge:

> Ich möchte gerne die Daten einer Fernsteuerung vom Proscenic m8pro
> Staubsauger Roboter lernen, müsste dazu noch mal aufbauen.

Das macht man am besten mit einem AVR, z.B. ATmega328 oder STM32 mit 
eingeschaltetem Logging, also IRMP_LOGGING. Suche nach diesem 
Schlüsselwort im IRMP-Artikel. IRMP spuckt dann auf der seriellen 
Schnittstelle die Signale aus, die man als nächstes dann analysieren 
kann. Oder Du schickst mir den Output und ich baue das Protokoll in IRMP 
ein.

> Frage was wäre denn die optimale Kombi für einen IRMP universal
> Scanner?
> Der ESP32 hat schon mal mehr flash und mehr SRAM als ein nano328p

Ein 328er reicht dafür vollkommen aus. Die Arduino-Version von IRMP kann 
kein IRMP_LOGGING, sodass der ESP32 sowieso zum "Lernen" nicht verwendet 
werden kann.

> Einige Codes beissen sich ja und auch nicht jede IRQ Rate ist optimal.

Ja, da muss man Kompromisse eingehen. Jörg hatte in der Vergangenheit da 
einige Tests in der Richtung unternommen und dabei die Zeitkonstanten 
für viele Protokolle optimiert, so dass möglichst wenig Konflikte der 
Protokolle entstehen. Blättere einfach mal ein paar Beiträge hoch. Diese 
überarbeiteten Zeitkonstanten habe ich aus diversen Gründen (u.a. wegen 
Wegfall des SVNs auf µc.net) noch nicht übernommen, werde das aber in 
den nächsten Tagen nachholen. Wenn Du nicht solange warten kannst: Jörg 
hat oben seinen github-Link gepostet.

: Bearbeitet durch Moderator
von Joachim B. (jar)


Lesenswert?

Frank M. schrieb:
> Wenn Du nicht solange warten kannst

kein Problem, kann warten!

von Johannes S. (Gast)


Lesenswert?

Frank M. schrieb:
> P.S.
> Die Versionsnummmerierung in der Arduino-Variante weicht von der
> Originalversion ab und ist daher nicht vergleichbar.

ich habe auch mal wieder IRMP rausgekramt um eine FB zu bauen. Eine 
ältere Version von 2016 hat auch ad hoc auf einem H743 mit Mbed 
funktioniert, jetzt wollte ich mal sehen was es da Neues gibt. In dem 
IRMP Artikel sind die Codebeispiele tote Links, da hatte ich in deinem 
github Repo nachgesehen. Jetzt sehe ich das die Versionsnummern da sehr 
unterschiedlich sind, ist die Arduino Version tatsächlich eine eigene? 
Ist etwas verwirrend, der Download der irmp.zip über den Artikel 
funktioniert aber noch.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Johannes S. schrieb:
> Jetzt sehe ich das die Versionsnummern da sehr
> unterschiedlich sind, ist die Arduino Version tatsächlich eine eigene?

Ja, ist so. Ich habe noch keine Zeit dafür gefunden, die Arduino-Version 
mit dem Original-IRMP wieder zu vereinigen.

> Ist etwas verwirrend, der Download der irmp.zip über den Artikel
> funktioniert aber noch.

Ja, das ist auch der maßgebliche Download für Non-Arduino. Andreas hatte 
das SVN-Repository vor einiger Zeit geschloassen. Im wesentlichen sind 
in der Arduino-Version lediglich Arduino-spezifische Verbesserungen und 
Erweiterungen.

Ich werde das irgendwann wieder vereinheitlichen. Einen 
Qualitätsnachteil gibt es mit der Zip-Datei aus dem IRMP-Artikel 
jedoch nicht.

von Johannes S. (Gast)


Lesenswert?

ok, Danke.

von Frank K. (f_klee)


Lesenswert?

Hallo Frank,
bislang nutzte ich die "normale" IRMP. Da ich ein KONNEKTING-Gerät mit 
IRMP ausstatten möchte, habe ich die Arduino-Version installiert und die 
Anwendung (noch ohne KONNEKTING) programmiert. Bei den Tests fiel mir 
auf, dass der Prozessor ab und zu scheinbar hing. Wie ich dann 
herausfand, schickt IRMP, nachdem es wegen schlechten Empfangs Müll 
dekodiert hatte, nur noch einen Siemens-Datensatz (ich nutze NEC), trotz 
ausreichendem Empfang. Das geht so lange weiter, bis der Empfang wieder 
zu schlecht war und ein paar Müll-Datensätze ankommen. Dann wird, bei 
ausreichendem Empfang, wieder ordnungsgemäß NEC geliefert. Ich habe 
Siemens deaktiviert und es kommt weder Müll noch permanent ein falscher 
Siemens-Code.
Meine Testplatine arbeitet mit 8MHz bei 3,3V und internem RC-Oszillator. 
Vielleicht spielt das ja eine Rolle. Die eigentliche Applikationsplatine 
bekommt aber einen Quarz.

Ich wollte das nur zurück melden. Ich kann ohne Siemens-Protokoll leben. 
Übrigens, super Arbeit.

Gruß
Frank

von Jörg R. (jrie)


Lesenswert?

IRMP kann jetzt auch opencm3 (https://github.com/j1rie/IRMP).

von Armin J. (arminj)


Lesenswert?

Frank K. schrieb:
> Wie ich dann
> herausfand, schickt IRMP, nachdem es wegen schlechten Empfangs Müll
> dekodiert hatte, nur noch einen Siemens-Datensatz (ich nutze NEC), trotz
> ausreichendem Empfang. Das geht so lange weiter, bis der Empfang wieder
> zu schlecht war und ein paar Müll-Datensätze ankommen. Dann wird, bei
> ausreichendem Empfang, wieder ordnungsgemäß NEC geliefert.

Hallo Frank M.,
das Problem habe ich auch!
Kannst Du mal danach schauen?

Gruß
Armin

von Frank K. (f_klee)


Lesenswert?

Frank K. schrieb:
> Meine Testplatine arbeitet mit 8MHz bei 3,3V und internem RC-Oszillator.
> Vielleicht spielt das ja eine Rolle. Die eigentliche Applikationsplatine
> bekommt aber einen Quarz.

Inzwischen ist die Applikation fertig und läuft mit einem 8MHz-Quarz. 
Geändert hat das nichts, so dass ich Siemens deaktiviert habe. Dadurch 
läuft die Applikation einwandfrei.

Gruß
Frank

von Armin J. (arminj)


Lesenswert?

Armin J. schrieb:
> das Problem habe ich auch!
> Kannst Du mal danach schauen?

Ich hab gerade mal die Timing Änderungen von Jörg R. übernommen, jetzt 
läufts besser :-)
Ist in der Arduino Version 3.6.0 drin.

von Jörg R. (jrie)


Lesenswert?

Armin J. schrieb:
> das Problem habe ich auch!

Ein Scan wäre hilfreich.
Was für einen IR Empfänger verwendest du?
Beitrag "Re: IRMP - Infrared Multi Protocol Decoder"

Edit: Wir haben uns überschnitten.

Edit2: Tipp: Wenn du in die Commit-Message ein @j1rie einbaust, 
verwandelt es github automatisch in einen Link auf mein Repo.

: Bearbeitet durch User
von Frank K. (f_klee)


Lesenswert?

Ich verwende den TSOP 31238. Allerdings ist nicht das Problem, dass das 
IR-Signal nicht oder schlecht erkannt wird. Würde einfach ein schwaches 
NEC-Signal als Siemens erkannt, dann passiert nichts und man probiert es 
als Anwender noch einmal. Wenn dann aber trotz ausreichendem Signal 
weiterhin Siemens dekodiert wird, dann sieht es für den Anwender so aus, 
als hätte sich die Applikation aufgehängt. Irgendwie ist IRMP quasi 
blockiert, wobei die Blockade durch weitere schwache (NEC-)Signale 
wieder aufgehoben wird.

Meine Platine liegt übrigens zum Testen auf dem Fußboden mit Blick nach 
oben. Wenn ich mit der Fernbedienung zur Decke "ziele", empfängt er 
problemlos (Siemens deaktiviert).

von Rossi (Gast)


Lesenswert?

Hallo,

bin begeistert von dem Projekt. Lob für die Umsetzung.

Wird meine "Lieblingsfernbedienung" (Sky) mit eigenwillige Bitanordnung 
unterstützt?

Laut dieser Quelle:
https://www.mikrocontroller.net/articles/IRMP#RC6_+_RC6A

kommen:
Daten RC6A Pace (Sky): "1" + 3 Mode-Bits ("110") + 1 Toggle-Bit(UNUSED 
"0") + 16 Bit + 1 Toggle(!) + 15 Kommando-Bits

Danke
Rossi

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Rossi schrieb:
> Wird meine "Lieblingsfernbedienung" (Sky) mit eigenwillige Bitanordnung
> unterstützt?

Alle im Artikel aufgeführten Protokolle werden unterstützt - auch RC6 
bzw. RC6A. Du musst jedoch in irmpconfig.h das Protokoll erst 
aktivieren. Wie das geht, ist im IRMP-Artikel beschrieben.

von Jörg R. (jrie)


Lesenswert?

Rossi benutzt meine Firmware, und da ist RC6 aktiviert.
https://github.com/j1rie/IRMP_STM32_KBD/blob/master/STM32F103/patches/irmp.patch#L34 
und
https://www.vdr-portal.de/forum/index.php?thread/123572-irmp-auf-stm32-ein-usb-ir-empf%C3%A4nger-sender-einschalter-mit-wakeup-timer/&postID=1351559#post1351559
RC6 geht auch, aber seine Fernbedienung mit Sky-Protokoll geht nicht.
In https://www.mikrocontroller.net/articles/IRMP#RC6_und_RC6A-Protokoll 
unterscheidest du RC6, RC6A und RC6A Pace (Sky). Sollten alle drei 
gehen, wenn RC6 aktiviert ist?
Falls ja, bleibt noch die Frage warum seine Fernbedienung mit 
Sky-Protokoll nicht erkannt wird.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Jörg R. schrieb:
> In https://www.mikrocontroller.net/articles/IRMP#RC6_und_RC6A-Protokoll
> unterscheidest du RC6, RC6A und RC6A Pace (Sky).

Das sind lediglich Literaturhinweise zu dem RC6(A)-Protokoll.

Jörg R. schrieb:
> Sollten alle drei gehen, wenn RC6 aktiviert ist?

RC6A Pace (Sky) kenne ich nicht. IRMP unterstützt lediglich RC6 und das 
"normale" RC6A. Da müsste ich mir erstmal die Unterschiede zu RC6A Pace 
anschauen. Außerdem wäre zum Test eine mit IRMP_LOGGING=1 erstellte 
Scan-Datei sinnvoll. Diese könnte Rossi erstellen.

von Jörg R. (jrie)


Angehängte Dateien:

Lesenswert?

Rossi hat mir eine seiner URC-1635 geschickt, anbei ein Scan mit 19 kHz.
Der Unterschied zu RC6A: nur 28 Daten-Bits, kürze Pause am Ende (ca. 
1053 µs), falls das letzte Daten-Bit eine 1 ist, verschluckt die Pause 
am Ende die Pause der 1.

von Jörg R. (jrie)


Lesenswert?

Pausen am Ende müssten eigentlich irrelevant sein.
Insofern reicht es, wenn man in RC6A ist und nach dem 28. Daten-Bit 
nichts mehr kommt, dies als "RC6A Sky Q" (englisch) oder "RC6A Sky+ Pro" 
(deutsch) auszugeben.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Jörg R. schrieb:
> Insofern reicht es, wenn man in RC6A ist und nach dem 28. Daten-Bit
> nichts mehr kommt, dies als "RC6A Sky Q" (englisch) oder "RC6A Sky+ Pro"
> (deutsch) auszugeben.

Danke, werde ich mir anschauen. Wenns wirklich so einfach ist, werde ich 
es "RC6A28" nennen.

von Jörg R. (jrie)


Lesenswert?

Ich habe RC6A20 und RC6A28 eingebaut 
(https://github.com/j1rie/IRMP/commit/b3dd18760c80ed40da17c52321a498f2fdb56b81).
Falls RC6A wird nur über die Endpause das Ende erkannt und über die 
Länge welches Protokoll.
Dadurch kann man ganz leicht weitere RC6A-Längen einbauen (habe ich aber 
mangels Fernbedienung zum Testen nicht gemacht).
Die Testsuite in IR-Data läuft erfolgreich durch und die RC6A28 Codes 
der Fernbedienung werden erkannt.

Frank, ist das gut so oder kann man das noch verbessern?

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Jörg R. schrieb:
> Ich habe RC6A20 und RC6A28 eingebaut

Prima.

> Die Testsuite in IR-Data läuft erfolgreich durch und die RC6A28 Codes
> der Fernbedienung werden erkannt.

Sehr gut!

> Frank, ist das gut so oder kann man das noch verbessern?

Ich wüsste nicht, wie man das verbessern sollte. Genauso wäre ich auch 
vorgegangen. Du bist mir aber zuvorgekommen. :-)

von Sven (svesch)


Lesenswert?

Hallo Frank und alle anderen!

wie ist der Stand der Dinge? Welches Git-Repo ist das "richtige" Repo? 
Kommt ein IRMP2? Oder gibt es einen Merge zwischen Jörgs und Armins 
Repo? Wer ist überhaupt noch aktiv dabei?

Viele Grüße,

Sven

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.