Forum: Mikrocontroller und Digitale Elektronik ATMega328P + Arduino + IRMP => Timing-Probleme


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Thomas F. (tobasco)


Bewertung
1 lesenswert
nicht lesenswert
Schönen guten Abend,

ich nutze zusammen mit der Arduino-Platform die IRMP Library zum 
Empfangen von IR commands auf einem ATMega328P 8MHz intern.
Ich habe eine bi-color LED zwischen PD7 und PB0 angeschlossen.
In der einen Richtung dient sie als IRMP-Feedback-LED, in der anderen 
als Controller-Status-LED.
In einem bestimmten Moment möchte ich die LEDs abwechselnd blinken 
lassen.
Das klappte auch prima, solange ich direkt nach dem 
"irmp_irsnd_LEDFeedback(false)" Aufruf noch ein "Serial.print("...")" 
zum Debuggen hatte.

Als ich diesen entfernte, stellte ich fest, dass nach dem Aufruf von 
"irmp_irsnd_LEDFeedback(false)" IRMP den IRMP_FEEDBACK_LED_PIN nach 
~120ms auf LOW setzt.

Kann ich das unterbinden oder muss ich nach 
"irmp_irsnd_LEDFeedback(false)" noch einige Zeit warten – und falls ja, 
wie lange?

salute
Thomas
1
#include <Arduino.h>
2
3
#define CTRL_LED                       8
4
#define IRMP_LED                       7
5
6
#define IRMP_INPUT_PIN                 6
7
#define IRMP_FEEDBACK_LED_PIN          IRMP_LED
8
#include <irmpSelectMain15Protocols.h>
9
#include <irmp.c.h>
10
IRMP_DATA irmp_data;
11
12
int main(void) {
13
  init();
14
  pinMode(IRMP_LED, OUTPUT);
15
  pinMode(CTRL_LED, OUTPUT);
16
17
  irmp_init();
18
  irmp_irsnd_LEDFeedback(true);
19
20
  bool flipflop = 0;
21
  while (true) {
22
    irmp_irsnd_LEDFeedback(false);
23
    Serial.print("...");
24
    digitalWrite(flipflop ? CTRL_LED : IRMP_LED, HIGH);
25
    delay(1000);
26
    digitalWrite(flipflop ? CTRL_LED : IRMP_LED, LOW);
27
    irmp_irsnd_LEDFeedback(true);
28
    flipflop ^= 1;
29
  }
30
  return 0;
31
}

: Bearbeitet durch User
von Christian S. (roehrenvorheizer)


Bewertung
0 lesenswert
nicht lesenswert
Hallo,

um dies zu erforschen, müßte man in der irmp.c das aufgerufene 
Unterprogramm suchen und dort schauen, ob vielleicht eine Zuweisung 
eines Wertes an den ganzen Port erfolgt und nicht nur an den einen Pin, 
an dem Deine nette zweifarbige LED ihr buntes Schauspiel zum Besten 
gibt. Das Zauberwort heißt verunden und/oder verodern.

Mfg

von Thomas F. (tobasco)


Bewertung
0 lesenswert
nicht lesenswert
Hallo,

Da habe ich schon nachgeschaut. Es wird sofort das statische Flag 
irmp_irsnd_LedFeedbackEnabled auf false gesetzt und dann noch der LED 
Pin auf OUTPUT und LOW gesetzt. Aber scheinbar grätscht der IRMP 
Interrupt nachträglich rein und missachtet das Flag … obwohl der Code 
für mich erst einmal gut aussieht :-/

salute
Thomas

von Christian S. (roehrenvorheizer)


Bewertung
0 lesenswert
nicht lesenswert
Nichts genaues über die Interna der verwendeten Unterprogramme weiß man 
als Außenstehender nicht.

MfG

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.