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!
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.
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.
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
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.