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.
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
}
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?
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
typedefstruct
2
{
3
uint8_tprotocol;// protocol, i.e. IRMP_NEC_PROTOCOL
4
uint16_taddress;// address
5
uint16_tcommand;// 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:
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
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.
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.
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
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
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.
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
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)
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:
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
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
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
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
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.
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
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
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. ;)
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
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.
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
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.
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.
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
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
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.
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
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
@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.
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
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
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"
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
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.
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
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
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
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
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
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!
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
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
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.
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
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
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.
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.
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
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
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.
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
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
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
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
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
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
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
Wie testest du das eigentlich? Hast du von jedem Protokoll ne
Fernbedienung zuhause? ;) Oder haste bei nem Pollin
1kg-Fernbedienungspaket zugegriffen hehe.
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
> 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
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
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
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
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 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.
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
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
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
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
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
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. :)
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
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
...
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
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
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.
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
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.
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
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
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
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
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
typedefstruct
2
{
3
uint8_tprotocol;// protocol, i.e. NEC_PROTOCOL
4
uint16_taddress;// address
5
uint16_tcommand;// command
6
uint8_trepetition;// repetition frame
7
}IRMP_DATA;
an der entsprechenden Stelle für die Erkennung von repetition frames:
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
> 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
typedefstruct
6
{
7
uint8_tprotocol;// protocol, i.e. NEC_PROTOCOL
8
uint16_taddress;// address
9
uint16_tcommand;// command
10
uint8_tflags;// 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:
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.
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
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.
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.
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
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
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?
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
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
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
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
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
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
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
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
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
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
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 :)
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
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
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
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
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
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)
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
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
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
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
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
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
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 */
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.
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
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
@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
:(
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?
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.
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
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!
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
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!
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?
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.
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
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.
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
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
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
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.:
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
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
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.
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
charprotocol[10];
7
charaddress[10];
8
charcommand[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
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.
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
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:>
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 ;-).
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.
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
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
staticuint16_t
2
lsb_neu(uint16_tx)
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
returnx;
9
}
Nur arbeitet hat das Ding einen Nachteil: es arbeitet konstant mit der
Länge 16 ;-)
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
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
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.
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
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
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
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
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
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
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
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
@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
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
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
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?
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.
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
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
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
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
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
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
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
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
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
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
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
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.
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.
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
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
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
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.
@ 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
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...
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
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.
>> 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
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
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
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.
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
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
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ß
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,- =)
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
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
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.
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.
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.
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
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
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
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
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
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...
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
enumzahl{NU_LL,EINS,ZWEI,DREI,VIER};
2
3
uint8_t
4
funktion(enumzahlxx)
5
{
6
xx>>=4;
7
returnxx;
8
}
Dann steht in der lss-Datei:
1
00000046<funktion>:
2
uint8_tfunktion(enumzahlxx)
3
{
4
xx>>=4;
5
returnxx;
6
}
7
46:8295swapr24
8
48:8f70andir24,0x0F;15
9
4a:0895ret
Die lss-Datei ist dann identisch beim Code von:
1
uint8_tfunktion(uint8_txx)
2
{
3
xx>>=4;
4
returnxx;
5
}
Die Variable xx ist also in beiden Fällen 8 Bit breit.
Beispiel B:
1
enumzahl{NU_LL=-2,EINS,ZWEI,DREI,VIER};
2
3
uint8_t
4
funktion(enumzahlxx)
5
{
6
xx>>=4;
7
returnxx;
8
}
Jetzt braucht die Beispiel-Funktion wesentlich mehr Speicherplatz:
1
00000046<funktion>:
2
uint8_t
3
funktion(enumzahlxx)
4
{
5
xx>>=4;
6
returnxx;
7
}
8
46:8595asrr24
9
48:8595asrr24
10
4a:8595asrr24
11
4c:8595asrr24
12
4e:0895ret
EDIT:
Hier wird 4x mittels asr geschoben, weil nun int8_t statt uint8_t
verwendet wird.
Beispiel C:
1
enumzahl{NU_LL=300,EINS,ZWEI,DREI,VIER};
2
3
uint8_t
4
funktion(enumzahlxx)
5
{
6
46:24e0ldir18,0x04;4
7
48:9695lsrr25
8
4a:8795rorr24
9
4c:2a95decr18
10
4e:e1f7brne.-8;0x48<funktion+0x2>
11
xx>>=4;
12
returnxx;
13
}
14
50:0895ret
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
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
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
[...]
>> @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
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
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
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
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
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
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
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
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
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
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
caseIRMP_NEC_PROTOCOL:
2
{
3
...
4
}
Darunter einfügen (also noch vor dem #endif:
1
caseIRMP_APPLE_PROTOCOL:
2
{
3
irsnd_protocol=IRMP_NEC_PROTOCOL;// APPLE protocol is NEC with fix bitmask instead of inverted command
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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.
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
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
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
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
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.
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
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
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
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
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
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
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
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
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
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
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
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!
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
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
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?
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.
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)
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
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
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
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?
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.
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
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
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
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.
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
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
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:
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
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
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
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
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
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
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
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
ä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 ?
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
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
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
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
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
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
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ß
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
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?
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
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
>#errorF_CPUtolarge
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
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.
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?
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
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.
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
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.
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
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
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
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:
#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
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:
#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):
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
>>@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...
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.
>>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,....
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
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
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:
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
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 :-)
eku schrieb:> Nun sei doch nicht su ungeduldig :-) Kommt Zeit, kommt Scan :-)
Och, lass mich doch... das ist spannender als Sudoku-Spielen ;-)
Gruß,
Frank
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
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.
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
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
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.
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:
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.
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:
(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:
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:
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.
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
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
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'.
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
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
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.
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ß
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
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
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
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
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
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.
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:
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
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.
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
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.
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.
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 ?
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
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
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:
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
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
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
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.
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 ?
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.
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:
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:
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
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
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
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
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ß
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
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:
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
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....
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
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
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
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
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.
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
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,
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
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
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?
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?
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.
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
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:
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 ;-)
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
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
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!
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
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
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.
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
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.
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_ti;
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.
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
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
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
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.
#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?
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?
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
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
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!
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
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
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.
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
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!
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
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
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?
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
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"...
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
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!
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!
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
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.
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
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
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)
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
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
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
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
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
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
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
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
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 ;-)
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....
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 :|
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
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
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
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
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
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
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
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
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
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
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
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
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
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 ?
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
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
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
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 ?
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
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
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 :-)
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
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
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
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
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
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
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
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
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.
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
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
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
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
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
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
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
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
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.....
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
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
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
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
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
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
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.htmlhttp://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
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
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
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
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
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
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
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
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
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
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
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
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
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
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/A1156http://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
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
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:
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
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
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
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
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 ?
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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ß
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
VerzeichnisvonC:\Programme\atmel
2
3
10.12.200801:11<DIR>.
4
10.12.200801:11<DIR>..
5
07.01.201021:50<DIR>AVRTools
6
17.03.200820:32<DIR>BASCOM-AVR
7
02.09.200814:23432.040CodeCompareSetup.exe
8
25.11.200801:00<DIR>Grafikkonverter
9
07.03.200821:01<DIR>PonyProg2000
10
04.03.200820: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
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
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
Hey,
super geile Sache.
Wollt nur kurz mitteilen das meine LG Fernbedienung vom TV und BluRay
Player mit dem Samsung(32) Protokoll einwandfrei funktionieren.
Ahhh noch was vergessen,
meine beiden Fernbedienungen (sind verschiedene) der Marke Smart
Electronics (Receiver usw.) funktionieren mit dem NEC Protokoll.
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
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?
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
voidtimer0_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
voidtimer0_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
voidtimer0_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
staticvoid
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
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
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
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.
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.
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
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
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
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.
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
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).
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
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:>
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
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
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?
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.
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
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
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
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:
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]
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").
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):
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
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.
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:
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
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.
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
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
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
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
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
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
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
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
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
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
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
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
<#defineIRMP_PORTPORTC
2
<#defineIRMP_DDRDDRC
3
<#defineIRMP_PINPINC
4
<#defineIRMP_BIT0// use PB6 as IR input on AVR
5
---
6
>#defineIRMP_PORTPORTB
7
>#defineIRMP_DDRDDRB
8
>#defineIRMP_PINPINB
9
>#defineIRMP_BIT6// use PB6 as IR input on AVR
irsndconfig.h
1
<#defineIRSND_PORTPORTB// port D
2
<#defineIRSND_DDRDDRB// ddr D
3
<#defineIRSND_BIT3// OC2A
4
---
5
>#defineIRSND_PORTPORTD// port D
6
>#defineIRSND_DDRDDRD// ddr D
7
>#defineIRSND_BIT7// OC2A
Damals hattest Du es wohl angepasst (siehe obige Unterschiede), dieses
Mal hast Du das offenbar versäumt.
Gruß,
Frank
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.
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
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
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
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.
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
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:
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
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
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
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
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
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
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
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
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.
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
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.
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 ;-)
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
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
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
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
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.
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] ?
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
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.
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
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.>
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
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
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
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
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
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
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
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
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
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
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
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#DENONhttp://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:
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
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.
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
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
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
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
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
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
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
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
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
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:
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
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
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
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
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:
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
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
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
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:
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
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
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
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 :)
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?
Bastian F. schrieb:> HTerm zeigt mir jedoch bei keiner einzigen Fernbedienung irgendeinen> Ausgabe.
Zeig mal Deine irmpconfig.h und deine main-Funktion.
Gruß,
Frank
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
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?
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
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
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
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
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
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
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
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
@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
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
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
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!
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
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
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
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
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
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
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
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
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
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_DATAirmp_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
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:
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
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
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
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
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
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
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'
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
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
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
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
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
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
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
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
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
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".
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
Frank M. schrieb:> Wie ist bei Dir protocol, address und command definiert? Bitte zeige die> ganze main-Funktion.
1
main(void)
2
{
3
charprotocol[10];
4
charaddress[10];
5
charcommand[10];
6
7
IRMP_DATAirmp_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.
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
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.
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
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.
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
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
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
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.
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.
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
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
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
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
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
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
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
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
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
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
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
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
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"
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
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
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
voidtimer0_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
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
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.
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
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
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?
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
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...
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
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
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 :-)
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
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
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
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
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 ?
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.
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 ?
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?
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
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
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
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
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
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:
> 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
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
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
@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
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
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
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
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
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.
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
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
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
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
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
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
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
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
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 ..
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....
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
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
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
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
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
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
Joachim B. schrieb:> ich hatte mir was überlegt, aber das scheint auch nicht zu klappen
1
>voidfb(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
voidfb(void)
2
{
3
staticuint16_ttoggle_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
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.
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 ;-)))
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:
> 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! :-)
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
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.
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
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.
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.
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
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
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
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?
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
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
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
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
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
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.
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
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.
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
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
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 ?
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.
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.
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.
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".
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
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
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
volatileuint8_tir_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
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
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.
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.
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
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.
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
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....
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.
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?
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
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
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.
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
{caseir_hoch:Taste=t_hoch;break;
8
caseir_runter:Taste=t_runter;break;
9
caseir_links:Taste=t_links;break;
10
caseir_rechts:Taste=t_rechts;break;
11
caseir_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ß
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....
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 :-)
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.
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.....
>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.
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:
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 ?
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? ;-)
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.....
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.
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
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:
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.
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 ?
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
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
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?
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
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)
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 ?
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
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 ?
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
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
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
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
#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
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_DATAirmp_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
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
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
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
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.
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 ;-)
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.
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
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
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.
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.
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_DATAirmp_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
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
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
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
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
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
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
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
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ß
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
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
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
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ß
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.
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ß
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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 ?
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
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
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
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
@ 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
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
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 ???
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
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 :-)
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
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
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
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
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.
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
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.
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!
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
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.
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
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 ?
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 ?
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
typedefstruct
5
{
6
chardevicename[MAXDEVICENAMELEN+1];
7
charkeyname[MAXKEYNAMELEN+1];
8
IRMP_DATAirmp_data;
9
}EXT_IRMP_DATA;
Dann kann man zum Beispiel folgendermaßen drauf zugreifen:
1
EXT_IRMP_DATAext;
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
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
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.
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
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 ?
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
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
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
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
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
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
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
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
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
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?
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
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
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
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
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
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....
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
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.
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.
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
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
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.
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
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
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
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.
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
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
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
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
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
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
Es steht eine neue Version 2.0.3 von IRMP + IRSND zum Download bereit.
Download über Artikel:
http://www.mikrocontroller.net/articles/IRMP#Downloadhttp://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
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
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
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
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.
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
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
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
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
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
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 hastFrank 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
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
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/
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.pdfhttp://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
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
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
@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.
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 ;-)
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
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
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.
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
elseif((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
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
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
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
elseif((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
elseif((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?
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
>> 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
elseif(...)
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
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
>> 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.
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.
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
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
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
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?
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
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
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?
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
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?
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
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
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
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?
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.
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
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?
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?
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
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
}
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
...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ß
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
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
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
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
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
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
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:
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
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
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
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.
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.
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
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.
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:
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
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:
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
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
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
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
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
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
Es steht eine neue Version 2.2.0 von IRMP + IRSND zum Download bereit.
Download über Artikel:
http://www.mikrocontroller.net/articles/IRMP#Downloadhttp://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.
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
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?
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
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
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?
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ß
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
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
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.
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
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
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?
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
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?
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
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
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
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
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
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
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
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?
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
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
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
// 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
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
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
# 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
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)
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
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
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
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
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
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.
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...
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.
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?
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" :-)
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?
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)
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).
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
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!
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
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 ?
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 ;-)
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
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
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
@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 $
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
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 :)
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.
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.
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.
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
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.
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
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.
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:
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
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
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 &= ~
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.
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
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
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
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
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?
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
> 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
intresult;
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
intresult;
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.
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
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.
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?
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!
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
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....
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:
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....
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!!
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.
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
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
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.....
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
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
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
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:
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:
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:
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
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
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.
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
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
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
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?
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.
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?
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_DATAirmp_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((unsignedchar)irmp_data.command)
19
{
20
case3: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
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?
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
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_DATAirmp_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.
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 :(
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.
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.
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 ;-)
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.
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...
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.
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
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 :?
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.
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.
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
charbuf[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?
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.
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.
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
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
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 :-)
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
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
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?
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.
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
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
externvoidirmp_init(void);
2
externuint8_tirmp_get_data(IRMP_DATA*);
3
externuint8_tirmp_is_busy(void);
4
externuint8_tirmp_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
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.
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
voidtestfunc_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
voidmain(){
26
27
IRMP_DATAirmp_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
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
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
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
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)
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:
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?
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
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
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?
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
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
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?
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
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
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....
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!!!
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.
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.
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"
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.
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 ?
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
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
#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:
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
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
voidtimer0_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
> 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.
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
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.
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
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?
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
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
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
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:
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):
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):
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
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:
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!
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).
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
:)!
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
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?
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.
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
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"
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...
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
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
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...
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 ?
@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?
@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...?
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.
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.
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.
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
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
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.
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
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:
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:
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.
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
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
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).
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
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 ?
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
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
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
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
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
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.
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?
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
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
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.
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
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
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.
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
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....
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
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.
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
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.
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
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.
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
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
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
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
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
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
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.
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:
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
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)
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
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 ?
ü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
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.
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 ;-)
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 ?
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.
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)
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)
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
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.
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
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.
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
voidtimer0_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
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.
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?
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
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
... 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.
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
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.
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
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.
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.
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
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:
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
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
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.
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
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
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
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
@ 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?
>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
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
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
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
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.
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.
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 !
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.
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
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
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
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
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
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
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
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
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
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
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 :-)
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
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
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
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
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
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)..
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
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
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
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
staticvoid
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
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
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
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
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.
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ß
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.
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
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
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!
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
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.
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
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
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
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
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.
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.
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
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 ;-)
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!
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ß!
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
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.
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 ?
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.
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"
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.
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.
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.
...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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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
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)
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.
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 ;-) -
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 ;-)
...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.
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?
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.
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?
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.
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
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.
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?
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:
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).
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
/*----------------------------------------------------------------------
------------------------------------------------------------------------
-----
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
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.....
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
;-)
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....
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.
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.
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.
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
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
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...
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.
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
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
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
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.
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.
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:
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".
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
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.
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.
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.
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
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
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
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
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
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
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.
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
>> 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:
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
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:
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.
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.
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?
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 :-)
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.
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?
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.
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/]
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:
#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_DATAirmp_data;
149
unsignedcharbuf[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((unsignedchar*)"protocol: 0x");
162
itoxx(buf,irmp_data.protocol);
163
uart_puts(buf);
164
165
uart_puts((unsignedchar*)" 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((unsignedchar*)" 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((unsignedchar*)" flags: 0x");
178
itoxx(buf,irmp_data.flags);
179
uart_puts(buf);
180
181
uart_puts((unsignedchar*)"\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!).
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.
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.
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.
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 :-)
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.
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
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:
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
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.
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 !?
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
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
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:
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?
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:
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
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 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!
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 :-))) !
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
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.
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
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
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:
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
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.
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
NICinit: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 ....
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
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.
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
charbuffer[]="Hello World";
oder
1
charbuffer[64];
2
strcpy(buffer,"Es ist egal, wie dieser String in diesen Buffer gelangte");
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
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 ;-)
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
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 ?
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
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.
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 !
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.
>> 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)
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.
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?
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 ;-)
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
Karol Babioch schrieb:> Ein Grund mehr für den Einsatz einer Versionsverwaltung. Ohne ist das> Selbstmord auf Raten.SVNist 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.
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
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.
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.
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_tii;
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
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?
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.
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.
> 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!
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
> 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.
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.
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 ;-)
> 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>
Bruno M. schrieb:> protocol: 0x05 YO address: 0x2002 command: 0x90A0 flags:> 0x00<\r><\n>
Du hast jetzt auch die irmp.c-Version, wo
1
staticconstcharproto_unknown[]PROGMEM="UNKNOWN";
2
usw.(vielePROGMEM-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.
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.
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:
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
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.
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
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.
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:
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
staticconstcharproto_unknown[]PROGMEM="UNKNOWN";
2
staticconstcharproto_sircs[]PROGMEM="SIRCS";
3
staticconstcharproto_nec[]PROGMEM="NEC";
4
...
... und zum anderen das Array selbst:
1
constchar*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
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
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.
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?
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.
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
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.
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
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.
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
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 ;-)
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?"
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.
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
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
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.
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
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.
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 ?
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.
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....
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
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
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
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
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:
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
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 !
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
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:
>> 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
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:
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:>>
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.
:-)
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.
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
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
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:
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).
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:
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
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 :-)
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:
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.
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:
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.
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:
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:
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:
-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.
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
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
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
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
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
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:
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?
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
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
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
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
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
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
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
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
staticuint8_tlast_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
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
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
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. :-)
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
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....
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 ;-)
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
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 ;-)
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?
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!
> Gibt es einen einfacheren Weg als die halbe Lib umzuschreiben?
Naja, ich würde diese klitzekleine Änderung nicht unbedingt "halbe Lib
umschreiben" nennen ;-)
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.
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.
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)?
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 ;)
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).
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
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".
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ß !
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.
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.
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.
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.
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.
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.
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.
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.
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?
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 :-)
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?
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
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.
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
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...
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)
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.
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.
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.
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
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
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 :-)
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
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.
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
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.
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!
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.
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.
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.
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.
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?
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
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?
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.
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
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
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.
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.
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.
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
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.
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.
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:
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_trtc;
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.
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.
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.
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?
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.
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.
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.
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?
> 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
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.
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^^
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.
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.
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?
> 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 tuthttp://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.
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.
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 ;-(
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.
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
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 ;-)
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.
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?
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
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
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
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
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
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
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.
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.
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.
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.
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).
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
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
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
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
voidinit_USART(void)
2
{
3
//Alle Level für Prioritätensteuerung der Interrupts freigeben
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().
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.
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
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
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
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
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.
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
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 :-/
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.
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
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>
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
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
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,
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
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
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!
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 ;-)
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.
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.
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:
(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.
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-layerFrank 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.
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.
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.
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
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.
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
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
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.
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?
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.
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.
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.
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.
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
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.
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.
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.
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.
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.
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
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
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.
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
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.
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.
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)
// 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
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! :-)
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
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.
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.
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
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?
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.
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!
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.
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.
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.
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.
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:
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.
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.
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:
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:
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>
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
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.
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
staticvoid
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
staticvoid
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
staticvoid
29
irsnd_set_freq(IRSND_FREQ_TYPEfreq)
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.
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?
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:
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 :)
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.
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
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
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
DigitalOutled(P0_14,1);
8
DigitalOutflash(P0_12,1);
9
10
Tickert;
11
12
// only for performance test
13
TimertimerPerfTest;
14
inttimeISRMax=0;
15
floattimeISRAvg;
16
inttimeISRAvgSum=0;
17
intcountISRCalls=0;
18
19
voidirmpISR(void)
20
{
21
intt1=timerPerfTest.read_us();
22
23
irmp_ISR();// call irmp ISR
24
25
inttimeISR=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
intmain(){
33
printf("IRMP on mbed\n");
34
35
led=LED_OFF;
36
timerPerfTest.start();
37
38
IRMP_DATAirmp_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)
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.
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.
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.
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?
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.
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.
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
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.
Ich habe nun IRSND von IRMP abgetrennt und jeweils Duplikate für die
englischsprachige Variante angelegt.
Übersicht:
IRMPIRSNDIRMP - englishIRSND - 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
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...
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.
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.
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
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! :-)
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?
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
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!
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
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.
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
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!!!
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.
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
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?
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.
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.
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
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 :-)
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
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.
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
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
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:
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
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
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
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
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.
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?
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)
...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.
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
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.
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.
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.
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
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
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.
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.
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
*/
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
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.
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
voidtimer1_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?
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
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?
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.
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.
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. :-)
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
> 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?
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.
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.
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.
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…
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.
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.
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.
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.
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.
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
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.
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:
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.
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!
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 :-)
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.
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.
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.
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.
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.
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.
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
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>
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.
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
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.
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
}
}
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.
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.
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.
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:
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.
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.
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.
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
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?!?
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.
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
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.
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.
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
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
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.
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:
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.
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
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).
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...
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?
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
namespaceIrmp{
2
extern"C"{
3
structIrmpData{
4
uint8_tprotocol;// protocol, e.g. NEC_PROTOCOL
5
uint16_taddress;// address
6
uint16_tcommand;// command
7
uint8_tflags;// flags, e.g. repetition
8
}__attribute__((__packed__));
9
10
typedefstructIrmpDataIRMP_DATA;
11
12
externvoidirmp_init(void);
13
externuint_fast8_tirmp_get_data(IRMP_DATA*);
14
externuint_fast8_tirmp_ISR(void);
15
16
}
17
constexpruint8_tRepetition=0x01;
18
19
}
einfach innerhalb des namespaces die (neue) Headerdatei inkludieren (mit
Ausnahme des constexpr ...).
Ganz am Ende(!) meiner (einzigen) Implmentierungsddatei kommt dann:
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
namespaceIrmp{
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:
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!
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.
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.
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?
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.
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. :-)
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
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.
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
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
@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
???
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.
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.
>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...
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
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
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
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
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.
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.
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
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
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
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:
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...
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
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.
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 :-)
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!
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
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.
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!
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.
...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.
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 :-)
Klaus R. schrieb:> Das mit der LED als Receiver hat sich vermtl nie umsetzen lassenLED 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.
...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!
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.
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 :-)
...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.
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 ;-)
...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.
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.
...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.
...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.
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 ;)
...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.
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
returnADC_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.
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.
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.
...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.
...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.
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:
...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_DATAid;
7
8
if(irmp_get_data(&id))// ... receive IR signal again
9
{
10
if(id.flags==1)// it's a repeated frame, store it!
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.
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.
...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.
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?
...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.
...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.
...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.
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.
...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.
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
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.
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!
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.
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
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!
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.
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?
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.
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.
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.
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!". :)
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:
+ // 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.
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?
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.
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:
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:
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.
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.
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.)
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.
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 :-)
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/
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
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
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)?
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.
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
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
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
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.
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
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
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.
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
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.
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.
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.
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.
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…
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
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
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…
> 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
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
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:
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
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"
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.
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...
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.
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.
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.
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
>#defineMETZ_LSB1
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 :
>>> 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
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
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:
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.
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.
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.
...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.
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.
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
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
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:
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:
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
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.
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)?
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.
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
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
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.
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
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.
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
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
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)
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]
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
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.
@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
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?
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
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?
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…
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.
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.
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.
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....
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.....
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.
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.
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.
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. :)
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.
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.
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
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.
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.
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.
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.
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.
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.
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
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.
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?
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.
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
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?
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
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:
# 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:
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.
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?
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.
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.
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.
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
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.
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.
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.
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
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 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.
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.
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.
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 ^^.
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
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)
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.
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
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:
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.
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.
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.
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.
[ 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.
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.
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
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.
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....
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.
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.
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?
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 ;-)
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?
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.
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.
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.
[ 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.
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
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
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
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.
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:
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
[ 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).
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.
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/27https://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
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.
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?
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.
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
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.
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.
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.
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
@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. :)
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
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.
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.
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
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.
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).
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?
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.
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?
@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.
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.
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.
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.
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."
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.
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.
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.
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
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
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/
@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!
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 ...
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?
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:
> 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:
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.
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.
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.
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.
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
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
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...
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.
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'
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
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.
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
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:
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.
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.
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?
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.
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.
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.
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.
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
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.
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?
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?
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.
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.
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.
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.
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:
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.
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.
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:
> 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:
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
staticconstboolanalyze=true;
3
#else
4
staticconstboolanalyze=false;
5
#endif
6
7
#define ANALYZE_PRINTF(...) \
8
do { \
9
if (analyze) if (verbose) printf (__VA_ARGS__); } \
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.
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.
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:
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:
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:
#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 :-)
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.
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
typedefstruct{inta,b,c;}abc_t;
2
3
const__flashabc_tabc={1234,5678,9012};
4
5
intadd(intx)
6
{
7
const__flashabc_t*p=&abc;
8
returnx+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?
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
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:
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.
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!
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 :-)
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:
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.
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 :-)
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?
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!
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?
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 :-)
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
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
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:
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.
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.
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?
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
voidsetup()
2
{Serial.begin(115200);
3
#if defined(__AVR_ATmega32U4__)
4
while(!Serial);//delay for Leonardo, but this loops forever for Maple Serial
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
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
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.
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.
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!
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.
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!
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.
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!
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
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?
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.
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
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.
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 :-)
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.
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?
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.
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.
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.
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
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.
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
boolglobal_5=5;
4
5
boolbool_5(void)
6
{
7
return5;
8
}
Präprozessiert:
1
_Boolglobal_5=5;
2
3
_Boolbool_5(void)
4
{
5
return5;
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.
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
;)
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?
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:
> 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".
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!
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!
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.
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
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?
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.
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.
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.
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.
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.
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.
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.
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!
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!!!
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.
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.
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.
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. ;-)
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.
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.
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:
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
IRMP16Address=0x27Command=0x27P=ONKYOA=0x27C=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.
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?
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.
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.
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.
...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.
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.
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.
Jörg R. schrieb:> 11001f003f00 SIEMENS geht nichtJö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:
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?
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.
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).
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?
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.
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?
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.
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.
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?
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.
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
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.
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
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.
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.
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.
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.
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).
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 ;)
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?
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.
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
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.
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
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.
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.
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^^
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.
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?
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:
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.
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.
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:
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.
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.
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.
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:
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:
> 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.
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.
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.
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?
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.
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.
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.
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!!!
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^^
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.
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.
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.
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
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.
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.
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).
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
caseIRMP_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
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ß
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
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.
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ß
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
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
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
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 :)
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.
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.
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:
- 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.
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.
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.
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).
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.
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):
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.
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.
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)?
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?
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 :)
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.
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...
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
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
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.
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:
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.
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.
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.
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.
Bei Denon hatte ich vergessen, dass das Kommando gerade sein muss.
Mit geradem Kommando kann ich die selten fehlende Wiederholung auch
nicht reproduzieren.
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).
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.
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.
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.
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.
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.
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.
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.
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.
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
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.
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?
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.
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"
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.
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
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.
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.
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.
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
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
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
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.
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.
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).
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
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.
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.
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.
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.
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.
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?
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. :-)
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
Ich hätte mal eine kurze Frage:
Ich habe einen Fernseher von LG mit einer Fernbedienung AKB73655802,
letztere geht jetzt so ihrem Ende entgegen, aufmachen und reinigen hilft
nur noch für 1 Woche oder so.
Jetzt möchte ich die mit Hilfe von IRMP nachbauen, anbei mal die Sequenz
der Power-Taste mit Pulseview, das sieht mir nach NEC-Protokoll aus:
konstante Pulslänge, variable Pause, die Bitlängen passen auch.
Seht Ihr das auch so?
Kaufen ginge natürlich auch, macht aber weniger Spass.
Stephan S. schrieb:> Seht Ihr das auch so?
Auf den ersten Blick passt NEC. Mit IRMP köntest Du alle Tasten
aufnehmen, mit IRSND dann diese auf einem neuen µC per Tastendruck
wieder "abspielen".
Viel Spaß!
Noch ne Frage: läuft das aktuelle IRMP/IRSND auch noch auf PIC12F1840,
das ist eher meine Welt als die Atmels.
Vorab schon mal danke für diese tolle Arbeit!
Stephan S. schrieb:> Noch ne Frage: läuft das aktuelle IRMP/IRSND auch noch auf PIC12F1840,
Laut dem Artikel IRMP (1. Kapitel: Unterstützte µCs) wird dieser µC
auch unterstützt. Die Portierung auf PIC ist aber nicht von mir, deshalb
kann ich da nicht mehr dazu sagen.