Forum: Mikrocontroller und Digitale Elektronik port IRMP to Arduino


von füyys (Gast)


Angehängte Dateien:

Lesenswert?

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!

von füyys (Gast)


Lesenswert?

Niemand eine Idee?
Kann das sonst einmal jemand ausprobieren und, wenn es klappt, seine 
Compile- und Linkeroptions zeigen?

von füyys (Gast)


Lesenswert?

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

von füyys (Gast)


Lesenswert?

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.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

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.

von füyys (Gast)


Lesenswert?

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.

von Joachim B. (jar)


Lesenswert?

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.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

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.

von Joachim B. (jar)


Lesenswert?

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.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

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. ;-)

von Joachim B. (jar)


Lesenswert?

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.

von füyys (Gast)


Lesenswert?

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.

von Joachim B. (jar)


Lesenswert?

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

von füyys (Gast)


Angehängte Dateien:

Lesenswert?

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.

von Joachim B. (jar)


Lesenswert?

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

von Einer K. (Gast)


Lesenswert?

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.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

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.

von Joachim B. (jar)


Lesenswert?

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.

von Einer K. (Gast)


Lesenswert?

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

von füyys (Gast)


Lesenswert?

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.

von Joachim B. (jar)


Angehängte Dateien:

Lesenswert?

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
von füyys (Gast)


Lesenswert?

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.

von Joachim B. (jar)


Lesenswert?

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

von füyys (Gast)


Lesenswert?

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.

von Joachim B. (jar)


Lesenswert?

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?

von füyys (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.