Hallo, ich will IRMP auf einem Arduino zum Laufen bekommen. Aber irgendwie klappt das nicht. Anbei einmal der Code, der aber eigentlich genau dem Beispielcode entspricht. Das interessante ist, dass, wenn ich den gleichen Code manuell compiliere (natürlich main.c mit aber gleichem Code) per avrdude flashe, dann funktioniert alles wie erwartet (LED leuchtet bei passendem IR-Signal). Und noch eine Frage: reicht es, wenn ich IRMP auf einen anderen µC portieren möchte, dass ich einfach nur: a) pin definitionen in irmpconfig.h hinzufüge b) in irmp.h input(x) neu definiere c) in irmp.c in irmp_init() die Initialisierung des Ports umschreibe ? Danke!
Niemand eine Idee? Kann das sonst einmal jemand ausprobieren und, wenn es klappt, seine Compile- und Linkeroptions zeigen?
Ich habe jetzt einmal noch ein Bluepill-Board von mir ausgepackt und es dort versucht. Auch hier klappt es problemlos, wenn ich manuell flashe. Mit Arduino klappt es wieder nicht. Folgende Compile-Options werden verwendet (AVR): C: "/usr/bin/avr-gcc" -c -g -Os -Wall -Wextra -std=gnu11 -ffunction-sections -fdata-sections -MMD -flto -fno-fat-lto-objects -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10805 -DARDUINO_AVR_UNO -DARDUINO_ARCH_AVR "-I/usr/share/arduino/hardware/archlinux-arduino/avr/cores/arduino" "-I/usr/share/arduino/hardware/archlinux-arduino/avr/variants/standard" "/tmp/arduino_build_426261/sketch/irmp.c" -o "/tmp/arduino_build_426261/sketch/irmp.c.o" C++: "/usr/bin/avr-g++" -c -g -Os -Wall -Wextra -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -MMD -flto -fno-devirtualize -fno-use-cxa-atexit -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10805 -DARDUINO_AVR_UNO -DARDUINO_ARCH_AVR "-I/usr/share/arduino/hardware/archlinux-arduino/avr/cores/arduino" "-I/usr/share/arduino/hardware/archlinux-arduino/avr/variants/standard" "/usr/share/arduino/hardware/archlinux-arduino/avr/cores/arduino/new.cpp " -o "/tmp/arduino_build_41764/core/new.cpp.o" Linking: "/usr/bin/avr-gcc" -Wall -Wextra -Os -g -flto -fuse-linker-plugin -Wl,--gc-sections -mmcu=atmega328p -o "/tmp/arduino_build_41764/Sketch.ino.elf" "/tmp/arduino_build_41764/sketch/irmp.c.o" "/tmp/arduino_build_41764/sketch/irmpextlog.c.o" "/tmp/arduino_build_41764/sketch/Sketch.ino.cpp.o" "/tmp/arduino_build_41764/core/core.a" "-L/tmp/arduino_build_41764" -lm
Bitte? Kann es nicht zumindest jemand ausprobieren oder sich an einem Erklärungsansatz versuchen? Ich bin nämlich ehrlich gesagt ziemlich am Verzweifeln und mit meinem Latein/C/C++ echt am Ende.
füyys schrieb: > ich will IRMP auf einem Arduino zum Laufen bekommen. Ich kann Dir zu diesem Thema lediglich einige Links liefern: Beitrag "IRMP "arduino-fähig" gemacht" https://gitorious.org/arduino-addons/irmp-arduino https://github.com/Boman/IRMPforArduino Ich selbst kann dazu nichts sagen, denn ich benutze keinen AVR-Arduino.
Frank M. schrieb: > füyys schrieb: >> ich will IRMP auf einem Arduino zum Laufen bekommen. > > Ich kann Dir zu diesem Thema lediglich einige Links liefern: > > Beitrag "IRMP "arduino-fähig" gemacht" > https://gitorious.org/arduino-addons/irmp-arduino > https://github.com/Boman/IRMPforArduino > > Ich selbst kann dazu nichts sagen, denn ich benutze keinen AVR-Arduino. Erst einmal vielen Dank für deine Antwort. Was hast du denn für Arduinos? Das ging ja nach meinen Versuchen auch mit einem STM32-Arduino nicht, ohne das Arduino-Framework aber schon.
Frank M. schrieb: > Ich selbst kann dazu nichts sagen, denn ich benutze keinen AVR-Arduino. bei den frühen IRMP Versionen "irmp.c,v 1.164 2014/09/15 12:36:28" hatte ich keine Probleme, evtl. den Timer wechseln. Beim letzten Versuch hat IRMP die Arduino IDE gesprengt, zuviele Abhängigkeiten.
füyys schrieb: > Was hast du denn für Arduinos? Gar keine. Ich benutze lediglich die Arduino-IDE für ESP8266, aber nicht für Echtzeit-Anwendungen wie IRMP. Da programmiere ich lieber den Controller direkt. Auch so kann man durchaus portable Sachen programmieren, die prozessorübergreifend funktionieren. IRMP läuft unter anderem nativ auf AVRs und auch STM32. Die Arduino-Unterstützung hat irgendwann mal jemand reingebaut, jedoch bekommt man allein schon davon graue Haare, wenn man sieht, wie man sich bei Arduino in den bereits genutzten Timer1-Interrupt einklinken muss - ohne Garantie, dass das auch so funktionieren wird mit den gewünschten 15000 Interrupts pro Sekunde. Denn wer weiß das schon, was Arduino im Interrupt sonst noch alles treibt. Darf ich den Timer1 bei Arduino und AVR überhaupt in den CTC Mode schalten, ohne die Stabilität der Arduino-Laufzeitumgebung zu gefährden?. Wie siehts bei Arduino und STM32 aus? Bietet der Timer eines ESP8266 überhaupt einen CTC-Mode an? Soviel ich weiß, geht das beim ESP gar nichr. Hier muss ich dann aelber die Zeiten zum nächsten Interrupt immer wieder neu ausrechnen, abhängig davon, wie lange ich gerade jetzt im Interrupt verweilt habe. Die Frage dabei ist: wie funkt mir da die Arduino-Laufzeitumgebung dazwischen? Fragen über Fragen.... Jedenfalls spürt man an dieser Stelle auch die Grenzen bei einer stark abstrahierenden Plattform wie Arduino, denn sie lässt dann ihr Mäntelchen der gelobten Portabilität schnell fallen. IRMP wurde auch nicht für Arduino entwickelt, sondern lediglich auf Arduino portiert. Über die Qualität der Portierung kann ich selbst nichts sagen. Wie gesagt: Ich genieße den Komfort, für den ESP mit Arduino um schnell mal einen Webserver zusammenzuhacken, aber Low-Level-Sachen können dann schon mal zur Qual und Glücksspiel werden. Ich bezweifle nicht, dass IRMP auch mal unter Arduino lief. Leider kenne ich aber nicht die Begleitumstände, um dies reproduzierbar zu einem Erfolg zu führen. Vielleicht überlegst Du, was Du überhaupt erreichen willst und ob Arduino dafür die geeignete Plattform ist. Um auf Deine ursprüngliche Frage zurückzukommen: Ohne Arduino reicht die Anpassung von irmpconfig.h. Mit Arduino sollte man die prozessorabhängigen Low-Level-Schichten in den Arduino-Bibliotheken sehr gut lennen, um eine Antwort auf Deine Frage zu geben. Denn an dieser Stelle kannst Du auf die angebliche Prozessor-Unabhängigkeit von Arduino keinen Pfifferling mehr verwetten.
Frank M. schrieb: > Mit Arduino sollte > man die prozessorabhängigen Low-Level-Schichten in den > Arduino-Bibliotheken sehr gut lennen na so wild ist das nicht, ich bin nun wirklich kein großer Arduino Kenner, Beitrag "Re: Zwei Fragen zur Arduino-IDE" jedenfalls konnte ich unter der Arduino IDE die IRMP von 2014 einbinden ohne auf eine Arduino Funktion zu verzichten, hinter der IRQ im 64µs Raster 15000 Interrupts sogar noch bis 10ms zählen um Taster zu entprellen und DCF77 zu pollen.
Joachim B. schrieb: > jedenfalls konnte ich unter der Arduino IDE die IRMP von 2014 einbinden > ohne auf eine Arduino Funktion zu verzichten, hinter der IRQ im 64µs > Raster 15000 Interrupts sogar noch bis 10ms zählen um Taster zu > entprellen und DCF77 zu pollen. Prima, dann kannst Du auch bestimmt dem TO helfen und ihm sagen, warum das bei ihm unter Arduino nicht läuft und was er machen muss, damit das nicht nur auf dem AVR, sondern auch auf dem STM32 mit Arduino portabel funktioniert. Und bei der Gelegenheit das Ganze auch noch auf dem ESP & Arduino zum laufen bringen. ;-)
Frank M. schrieb: > Prima, dann kannst Du auch bestimmt dem TO helfen und ihm sagen, warum > das bei ihm unter Arduino nicht läuft auch nicht besser als du :) Beitrag "Re: Minutengenaue 24 Stunden-Wortuhr - wer will mitbauen?" ich kann den Source Code meiner Binninger Uhr posten mit deinem IRMP von 2015 NEC Protokoll und RGB Fernbedienung Warum es bei anderen nicht läuft ist mühsam wenn man nicht darn sitzt.
Entschuldigung, dass ich erst jetzt wieder antworte. Ich war recht beschäftigt und habe erst jetzt wieder ein bisschen mehr Zeit. Ich habe jetzt einmal die IRMP Version von 2015 aus diesem Beitrag Beitrag "Re: Minutengenaue 24 Stunden-Wortuhr - wer will mitbauen?" verwendet. In keinem anderen Beitrag aus dem Thread gab es sonst Code. Jedoch funktioniert es auch damit nicht, nicht einmal mehr ohne Arduino-Framework. Außerdem habe ich einmal statt Timer1 Timer0 verwendet mit dem Ergebnis, dass es weiterhin nur ohne Arduino-Framework funktioniert.
füyys schrieb: > Jedoch funktioniert es auch damit nicht, ist ja eine tolle Aussage vielleicht zeigst du mal was nicht funktioniert, jedenfalls deinen vollständigen Code! als Anhang
Joachim B. schrieb: > füyys schrieb: >> Jedoch funktioniert es auch damit nicht, > > ist ja eine tolle Aussage Naja, was soll ich sagen? irmp_get_data gibt nur 0x00 zurück und es wird nichts erkannt. Ohne Arduino-Framework hingegen schon. Was soll ich denn sonst noch sagen? > vielleicht zeigst du mal was nicht funktioniert, jedenfalls deinen > vollständigen Code! als Anhang Mein vollständiger Code ist doch bereits im ersten Post. Oder willst du den mit der alten Version? Den habe ich jetzt einmal angehängt, aber der funktioniert ja noch nicht einmal ohne Arduino-Framework, also kann man den wohl komplett vergessen.
hast du denn irmpconfig.h #if defined (ATMEL_AVR) // use PB6 as IR input on AVR /* # define IRMP_PORT_LETTER B # define IRMP_BIT_NUMBER 6 auskommentiert? wo hängt dein TSOP denn dran für Empfang? oder gehts um send? wie sieht dein Schaltbild aus, Filter aus 100 Ohm und 4,7µF gesetzt? http://www.elektrofanklub.pl/wp-content/uploads/2015/06/TSOP1736-circuits.jpg
Frank M. schrieb: > jedoch > bekommt man allein schon davon graue Haare, wenn man sieht, wie man sich > bei Arduino in den bereits genutzten Timer1-Interrupt einklinken muss - > ohne Garantie, dass das auch so funktionieren wird mit den gewünschten > 15000 Interrupts pro Sekunde. Denn wer weiß das schon, was Arduino im > Interrupt sonst noch alles treibt. Timer1 wird in der Regel nicht von Arduino genutzt. Auch nicht dessen ISRs Wird nur für PWM vorbereitet. Also, den Timer vollständig beschreiben, wenn man ihn für eigene Zwecke nutzen möchte. Frank M. schrieb: > Darf ich den Timer1 bei Arduino und AVR überhaupt in den CTC Mode > schalten, ohne die Stabilität der Arduino-Laufzeitumgebung zu > gefährden? Natürlich! Verzichte auf analogWrite() mit dessen PWM Pins, und alles ist gut. Mit Stabilität hat das nichts zu tun. Frank M. schrieb: > Jedenfalls spürt man an dieser Stelle auch die Grenzen bei einer stark > abstrahierenden Plattform wie Arduino, denn sie lässt dann ihr > Mäntelchen der gelobten Portabilität schnell fallen. Ich bin mir nicht sicher, ob ich in diesem konkreten Fall, auf dein Urteil vertrauen darf.... ------- Zu: Beitrag "Re: port IRMP to Arduino" Das dortige Beispiel nutzt Timer0. Das ist eine schlechte Idee, da dieser schon für Millis, Delay und seine Brüder genutzt wird. Das kracht! (wenn man nicht aufpasst) Zu: Beitrag "port IRMP to Arduino" Dort wird TimerOne verwendet. Also der AVR Timer1. Sollte also grundsätzlich gehen. Quellcode ungetestet, da mir die Hardware fehlt.
Arduino F. schrieb: > Timer1 wird in der Regel nicht von Arduino genutzt. Gut, da habe ich ja damals für IRMP unbewusst den richtigen Timer gewählt. > Das dortige Beispiel nutzt Timer0. > Das ist eine schlechte Idee, da dieser schon für Millis, Delay und seine > Brüder genutzt wird. > Das kracht! Aha. Also doch Glücksspiel. Und wie ist das bei STM32 oder ESP8266 oder ESP32? Ist es auch da Timer1, denn man nicht anfassen sollte? > Ich bin mir nicht sicher, ob ich in diesem konkreten Fall, auf dein > Urteil vertrauen darf.... Ich schrieb ja oben: Wenn man die Interna der Arduino-Laufzeitumgebung kennt (AVR: Timer0, STM32: TimerX, ESP8266: TimerY, ESP32: TimerZ nicht anfassen), dann bekommt man das vielleicht portabel hin. Aber ich dachte, dass Arduino gerade so ausgelegt ist, dass man eben nichts über die Interna wissen muss?!? Naja, ich will das hier nicht in einem Arduino-Krieg ausarten lassen. Wie gesagt, ich nutze Arduino ja selbst für den ESP8266, nämlich WordClock mit WS2812. Daher für mich hier EOD.
Frank M. schrieb: > Aha. Also doch Glücksspiel. manchmal hat man halt Glück, wie gesagt deine IRMP von 2014/15 funktioniert einwandfrei auf dem Arduino nano328p für den mights mini 1284p musste ich den Timer wechseln Frank M. schrieb: > Und wie ist das bei ESP32? Ist es auch da > Timer1, denn man nicht anfassen sollte? da bin ich noch nicht weiter, der Timer IRQ scheint kritischer zu sein, ich lasse die build in LED faden in der IRQ im Sekundentakt alls 10ms eine Stufe hoch und wieder runter aus eine LED Tabelle 10 Stufen wegen LED fading. Kaum funktioniert es und ich ändere nur gaaanz wenig schon steht die Kiste. Kann aber auch an der PWM liegen die ja jedem PIN mit etlichen Kaälen zugewiesen werden kann, vielleicht liegts auch an der PWM Frequenz 5kHz default was keiner braucht bei LED, muss ich alles noch untersuchen.
Frank M. schrieb: > Aber ich dachte, dass Arduino gerade so ausgelegt ist, dass man eben > nichts über die Interna wissen muss?!? Naja, Solange du die Arduino Grundfunktionen nutzen kannst/willst ist das ja auch wahr. Hier möchte aber eine Timer Extrawurst gebacken werden. Eine Hardwarespezifische Extrawurst. Also auch extra Obacht! Wenn man auf loop() und setup() verzichtet, steht auch bei AVR Arduinos Timer0 uneingeschränkt zur Verfügung. Allerdings sind dann auch alle zeitabhängigen Arduino Features außer Betrieb. -- In der *.ino sollte der include wohl noch modifiziert werden.
1 | extern "C" |
2 | {
|
3 | #include "irmp.h" |
4 | }
|
-- Zur Frage ESP-Timer, hilft evtl. dieses, um eine grobe Richtung zu finden: http://www.switchdoc.com/2015/10/iot-esp8266-timer-tutorial-arduino-ide/ Und: https://www.espressif.com/sites/default/files/documentation/2c-esp8266_non_os_sdk_api_reference_en.pdf Seite 6/157
Joachim B. schrieb: > hast du denn > > irmpconfig.h > #if defined (ATMEL_AVR) > // use PB6 as IR input on AVR > /* > # define IRMP_PORT_LETTER B > # define IRMP_BIT_NUMBER 6 > > auskommentiert? Tatsächlich ein doofer Fehler. Bei der neueren Version war dies von Anfang an unauskommentiert. Jetzt funktioniert es ohne Arduino-Framework, mit aber immer noch nicht. > wo hängt dein TSOP denn dran für Empfang? > oder gehts um send? Lediglich receive. Receiver hängt an PB1. > wie sieht dein Schaltbild aus, Filter aus 100 Ohm und 4,7µF gesetzt? > http://www.elektrofanklub.pl/wp-content/uploads/20... Nur ein Widerstand zwischen dem Ausgang und dem Pin. Aber es geht hier ja vor allem darum, dass es ja ohne Arduino-Framework erstaunlicherweise problemlos funktioniert. Arduino F. schrieb: > Zu: Beitrag "Re: port IRMP to Arduino" > Das dortige Beispiel nutzt Timer0. > Das ist eine schlechte Idee, da dieser schon für Millis, Delay und seine > Brüder genutzt wird. > Das kracht! > (wenn man nicht aufpasst) Danke für den Hinweis. Ich habe aber schon Timer1 und Timer0 ausprobiert. Timer1 sowohl über die TimerOne-Lib, wie du auch bemerkt hast, als auch schon direkt über die Register. Arduino F. schrieb: > In der *.ino sollte der include wohl noch modifiziert werden.extern "C" > { > #include "irmp.h" > } Das habe ich direkt in irmp.h mit "#ifdef __cplusplus" hinzugefügt. Aber ja, so wäre es vermutlich sogar noch einfacher. Joachim B. schrieb: > manchmal hat man halt Glück, wie gesagt deine IRMP von 2014/15 > funktioniert einwandfrei auf dem Arduino nano328p für den mights mini > 1284p musste ich den Timer wechseln Könntest du einmal bitte den Quellcode davon zeigen? Sonst würde ich den gerne einmal ausprobieren.
füyys schrieb: > Könntest du einmal bitte den Quellcode davon zeigen? Sonst würde ich den > gerne einmal ausprobieren. ich hoffe ich habe eine funktionierende Version von 2015 gefunden auslesen geht ja nicht, meine beiden Uhren laufen seit dem besser die *.c in *.ino umbenennen dann spart man sich das #include von irmp.c das habe ich erst später rausgefunden nicht vergessen die Ports anzupassen
:
Bearbeitet durch User
Joachim B. schrieb: > füyys schrieb: >> Könntest du einmal bitte den Quellcode davon zeigen? Sonst würde ich den >> gerne einmal ausprobieren. > > ich hoffe ich habe eine funktionierende Version von 2015 gefunden > > auslesen geht ja nicht, meine beiden Uhren laufen seit dem > > besser die *.c in *.ino umbenennen dann spart man sich das #include von > irmp.c > > das habe ich erst später rausgefunden > nicht vergessen die Ports anzupassen Danke. Dein Code funktioniert (sehr stark verkürzt) tatsächlich. Ich werde einmal die alten Dateien untereinander und mit den neuen vergleichen.
füyys schrieb: > Danke. Dein Code funktioniert (sehr stark verkürzt) tatsächlich. > Ich werde einmal die alten Dateien untereinander und mit den neuen > vergleichen. prima, denn sag mal woran es bei dir klemmte
Joachim B. schrieb: > füyys schrieb: >> Danke. Dein Code funktioniert (sehr stark verkürzt) tatsächlich. >> Ich werde einmal die alten Dateien untereinander und mit den neuen >> vergleichen. > > prima, > denn sag mal woran es bei dir klemmte Könnte allerdings eine kleine Weile dauern. Von Montag bis Mittwoch wird wohl wieder eine Arbeitswelle auf mich zukommen. Spätestens dann sollte ich aber die Zeit dafür finden.
füyys schrieb: >> prima, >> denn sag mal woran es bei dir klemmte > > Könnte allerdings eine kleine Weile dauern. > Von Montag bis Mittwoch wird wohl wieder eine Arbeitswelle auf mich > zukommen. Spätestens dann sollte ich aber die Zeit dafür finden. und was gibts neues?
Tut mir wirklich schrecklich leid. Ich bin derzeit durch die Arbeit stark eingespannt und nur selten zu Hause. Außerdem hatte ich jetzt noch ein Problem mit STM32DUINO, das immer noch nicht kompilieren will wegen stm32f10x.h", in dem dann Register doppelt definiert werden. Dem werde ich mich zuerst noch einmal annehmen und danach kommt das. Bei neuen Erkenntnissen werde ich aber auf jeden Fall schreiben, selbst wenn es noch dauert.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.