Arduino pulseIn()-Funktion funktioniert nicht mit Pin D9 (PB1)

#7024873
Lesenswert?

Hallo,

versuche von einem Modellbauempfänger (FB mit 14 Kanälen) mit einem 
Arduino Nano und der pulseIn()-Funktion 9 der 14 Kanäle der 
RC-Fernbedienung einzulesen (und später zu verarbeiten).
Das Einlesen funktioniert auch für 8 der Kanäle, aber eben bei einem 
nicht. Der Kanal, der mit Pin D9 (PB1) verbunden war. Es kommt einfach 
nur der Rückgabewert 0 - also Timeout :( .

Aufbau ist der Folgende:

PC <--USB-Kabel -> Arduino Nano < - Signal, 5V, GND (Servokabel) --> 
RC-Empfänger

Erst dachte ich, dass es
a) An einer schlechten Lötstelle der Stiftleiste am Arduino Nano liegt, 
aber das habe ich schon nachgelötet.
b) Es an einem defekten Arduino Nano liegt, aber ich habe es mit 2 
anderen Arduino Nano auch probiert - gleiches Problem. Einem anderen mit 
ATmega328 und einem mit ATmega168. Jedoch alle Chinaklons
c) Es an genau dem Kanal des Empfängers liegt, also ein Problem des 
Empfängers. Ist es aber auch nicht. Verbinde ich den Kanal mit D10 wird 
er gelesen. Und wenn ich einen anderen Kanal des Empfängers mit D9 
verbinde geht wird dieser auch nicht eingelesen und es wird 0 als Wert 
geliefert. Bei einem anderen Empfänger+Sender habe ich das gleiche 
Problem.
d) Es irgendwie zu viele Kanäle sind, die gleichzeitig gelesen werden 
müssen und die Funktion dafür nicht geeignet ist. Das habe ich aber 
dadurch überprüft, dass ich nur noch den einen Kanal eingelesen habe.

Schlussendlich habe ich das Oszi an den Pin D9 geklemmt und gemerkt, 
dass der Impulse des RC-Empfängers, wenn er mit dem Pin verbunden ist, 
keine 400mV Amplitude hat hat und bei den andere Pins an denen die 
anderen Kanäle hängen deutlich mehr ankommt (irgendwas über 3,2V bei 
direkter Versorgung der 5V-Line (Arduino und Empfänger mit 5V von 
Labornetzteil).
Wenn ich einfach das Arduino Beispiel "DigitalReadSerial" auf den 
Arduino draufspiele und statt Pin D2 im Orignalbeispiel meinen Pin D9 
für das einzulesende Digitalsignal auswähle und den Empfänger weiterhin 
sein Signal auf den Pin übertragen lasse, dann ist der Puls auch bei 
3,2V. Was könnte der Grund sein?
Angehängte Dateien:
#7024928
Lesenswert?

Das klingt doch sehr danach, dass du in deinem Code irgendwo Peripherie 
aktivierst die den PB1 verwendet:

"OC1A/PCINT1 – Port B, Bit 1
OC1A, output compare match output: The PB1 pin can serve as an external 
output for the Timer/Counter1 compare match
A. The PB1 pin has to be configured as an output (DDB1 set (one)) to 
serve this function. The OC1A pin is also the output
pin for the PWM mode timer function.
PCINT1: Pin change interrupt source 1. The PB1 pin can serve as an 
external interrupt source"

Wenn du sagst, dass es bei dem Bsp. "DigitalReadSerial" funktioniert, 
würde ich auf sowas tippen.
#7024929
Lesenswert?

EAF schrieb:
> Vermutlich übersiehst du irgendwas wichtiges. Und darum teilst du uns
> das auch nicht mit.

Das möglicherweise was von mir übersehen wird, ist ja der Grund, warum 
ich meine bisherigen Erkenntnisse hier poste. Mitteilen kann ich nur, 
was ich weiß und gemessen habe.

Noch was zu meinen Screenshots:

DigitalReadD9.png:
Verwendet wurde DigitalReadSerial.ino von den Arduino Beispielen mit D9 
statt D2.
 Oszi-Kanal1 (gelb): Signal gemessen am D9 Pin des Arduino Nano
 Oszi-Kanal2 (pink): 5V Versorgung 5V Pin des Arduino Nano (und am 
Empfänger 5V Pin)

PulseInD9_D10.png
Verwendet wurde PulseInTest.ino siehe Anhang
 Oszi-Kanal1 (gelb): Signal gemessen am D9 Pin des Arduino Nano
 Oszi-Kanal2 (pink): 5V Versorgung 5V Pin des Arduino Nano (und am 
Empfänger 5V Pin)
 Oszi-Kanal3 (blau): Signal gemessen am D10 Pin des Arduino Nano

Beachte: Kanal1 und Kanal2 haben 200mV/div und 2V/div !!!
Gast #7025004
Lesenswert?

Timo N. schrieb:
> Schlussendlich habe ich das Oszi an den Pin D9 geklemmt und gemerkt,
> dass der Impulse des RC-Empfängers, wenn er mit dem Pin verbunden ist,
> keine 400mV Amplitude hat hat und bei den andere Pins an denen die
> anderen Kanäle hängen deutlich mehr ankommt (irgendwas über 3,2V bei
> direkter Versorgung der 5V-Line (Arduino und Empfänger mit 5V von
> Labornetzteil).
> Wenn ich einfach das Arduino Beispiel "DigitalReadSerial" auf den
> Arduino draufspiele und statt Pin D2 im Orignalbeispiel meinen Pin D9
> für das einzulesende Digitalsignal auswähle und den Empfänger weiterhin
> sein Signal auf den Pin übertragen lasse, dann ist der Puls auch bei
> 3,2V. Was könnte der Grund sein?

Die 400mV sind ein deutliches Zeichen dafür, daß bei deinem ersten Test 
aus irgendeinem Grund PB1 als Ausgang konfiguriert ist und das 
Eingangssignal auf GND zieht.

Hast du uns wirklich das komplette Programm gezeigt?
Falls du die Arduino IDE nutzt, hast du auch das richtige Board und den 
richtigen Prozessor ausgewählt?
Beitrag #7025018 wurde von einem Moderator gelöscht.
#7025133
Lesenswert?

Adam P. schrieb:
> Hab es jetzt mal bissel durchprobiert.
> Das solltest du ändern, damit es "erstmal" funktioniert:
> - unsigned long rc_in_vals[RC_IN_SIZE];
> - Die Init. for-Schleife für Ausgänge entfernen
>
> Bei mir funktioniert PB1.
>
> Wenn die Impulse langsamer sind als dein RC_CYCLE, dann bekommst du
> natürlich auch 0.

Es funktioniert, wenn ich
1
  //Ausgänge intialisieren
2
  for (int i = 0; i < RC_OUT_SIZE; i++){
3
    pinMode(rc_out_pins[i], OUTPUT);
4
  }

rausnehme. Es könnte tatsächlich damit zu tun haben, dass man A6 und A7 
nicht verwenden darf. Wenn ich A6 und A7 nicht als Ausgänge definiere, 
dann zeigt er mir zumindest in der seriellen Ausgabe alle 9 Kanäle 
richtig an.
"Unsigned long" oder "Int" zu verwenden hat keine Auswirkungen.
Bei unsigned long muss ich halt in der sprintf-Funktion statt %d überall 
%ul verwenden.

Warum kann man A6 und A7 nicht als Ausgang verwenden?

Danke nochmal an alle, die mir geholfen haben
Gast #7025160
Lesenswert?

Timo N. schrieb:
> Es kommt halt keine Compiler-Warnung, wenn ich A6 und A7 einfach im
> Array als Ausgang definiere.

Die Pinnumschlüsseling wird über PROGMEM Arrays zur Laufzeit gemacht.
Der Compiler kann also gar nicht melden!

Ein Arrayzugriff über die Grenzen hinaus mündet in ein undefined 
behavior. Also alles in Ordnung mit dem Compiler.

https://de.wikipedia.org/wiki/Undefiniertes_Verhalten
Gast #7025215
Lesenswert?

Timo N. schrieb:
> Wusste nicht, wie das beim Arduino gemacht wird.

Ich, privat, mache das bei Arduino etwas anders (mich stört die 
Zugriffsgeschwindigkeit), da würde eine Meldung dann so aus sehen:
1
E:\Programme\arduino\portable\sketchbook\libraries\CombiePin\src/ArchAvr.h:120:33: error: static assertion failed: Pin Nr invalid
2
  120 |         static_assert(arduinoPin<NUM_DIGITAL_PINS,"Pin Nr invalid");
3
E:\Programme\arduino\portable\sketchbook\libraries\CombiePin\src/ArchAvr.h:120:33: note: '(21 < 20)' evaluates to false

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren