Forum: Mikrocontroller und Digitale Elektronik Arduino pulseIn()-Funktion funktioniert nicht mit Pin D9 (PB1)


von Timo N. (tnn85)


Angehängte Dateien:

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?

von EAF (Gast)


Lesenswert?

Timo N. schrieb:
> 400mV Amplitude
Hööö?

Deiner Beschreibung nach, hast du da mit Geistern zu tun.
Denn logisch erscheint mir das nicht, dass da 3 Arduinos auf dem 
gleichen Pin defekt sein sollen.

Vermutlich übersiehst du irgendwas wichtiges. Und darum teilst du uns 
das auch nicht mit.

von Adam P. (adamap)


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.

von Timo N. (tnn85)


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

von Timo N. (tnn85)


Lesenswert?

Adam P. schrieb:
> Das klingt doch sehr danach, dass du in deinem Code irgendwo Peripherie
> aktivierst die den PB1 verwendet:

Code habe ich angehängt. Ich verwende lediglich noch "Serial.println"

von Adam P. (adamap)


Lesenswert?

Timo N. schrieb:
> Adam P. schrieb:
>> Das klingt doch sehr danach, dass du in deinem Code irgendwo Peripherie
>> aktivierst die den PB1 verwendet:
>
> Code habe ich angehängt. Ich verwende lediglich noch "Serial.println"

Ja, Sorry, grad erst gesehen.

: Bearbeitet durch User
von EAF (Gast)


Lesenswert?

Timo N. schrieb:
> Mitteilen kann ich nur,
> was ich weiß und gemessen habe.

Dann teile ich dir wenigstens mit, was ich weiß....

Und zwar dieses:
Pin A6 und A7 können beim Nano nicht als Ausgänge genutzt werden.

Und dieses:
pulseIn() liefert einen unsigned long, keinen int.

von Adam P. (adamap)


Lesenswert?

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.

: Bearbeitet durch User
von Conny (Gast)


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?

von Adam P. (adamap)


Lesenswert?

Conny schrieb:
> Hast du uns wirklich das komplette Programm gezeigt?

Denke ich schon, da sein Code wirklich nicht funktioniert.

Beitrag #7025018 wurde vom Autor gelöscht.
von Peter D. (peda)


Lesenswert?

In Deinem Code verwendest Du 9+11=20 IO-Pins. Dann gehen noch für Reset, 
Quarz, UART 5 Pins weg, macht zusammen 25 IOs. Der ATmega328 hat aber 
nur 23, wo nimmst Du die fehlenden 2 her?

Das Mapping Arduino-Pin zu Portpin kenne ich nicht.

von Timo N. (tnn85)


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

von Timo N. (tnn85)


Lesenswert?

Peter D. schrieb:
> Das Mapping Arduino-Pin zu Portpin kenne ich nicht.

https://www.arduino.cc/en/uploads/Main/Arduino_Nano-Rev3.2-SCH.pdf

von EAF (Gast)


Lesenswert?

Peter D. schrieb:
> wo nimmst Du die fehlenden 2 her?

Sachte ich schon A6 und A7, die gehen nicht als Output. Nur analog in.

Peter D. schrieb:
> Das Mapping Arduino-Pin zu Portpin kenne ich nicht.

Dem kann abgeholfen werden:
https://aws1.discourse-cdn.com/arduino/original/4X/a/d/2/ad22c61b1aafb4dbe0ced6cff51dbafca960e85a.jpeg

von EAF (Gast)


Lesenswert?

Timo N. schrieb:
> Warum kann man A6 und A7 nicht als Ausgang verwenden?
Weil es keine Ausgänge sind.
Sie haben keine Digital Stufe.
Sind nur analoge Eingänge.

von Timo N. (tnn85)


Lesenswert?

Timo N. schrieb:
> Warum kann man A6 und A7 nicht als Ausgang verwenden?

Ok. Gerade mal ins Datenblatt des Chips geschaut. Es sind tatsächlich 
nur ADC-Eingänge und keine General Purpose IOs.
Es kommt halt keine Compiler-Warnung, wenn ich A6 und A7 einfach im 
Array als Ausgang definiere.

von EAF (Gast)


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

von EAF (Gast)


Lesenswert?


von Timo N. (tnn85)


Lesenswert?

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

Verstanden. Wusste nicht, wie das beim Arduino gemacht wird.

von EAF (Gast)


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

von Sebastian (Gast)


Lesenswert?

Hi Timo,

der A*Star 328PB von Pololu benutzt einen Atmega328PB. Dieser erlaubt A6 
und A7 als Ausgänge, und hat dazu noch zwei digitale Port mehr. Ist aber 
nicht mehr für 3 Euro zu bekommen, und für etwas teurer gibt es glaube 
ich auch ein 328PB-Board bei Watterott.

LG, Sebastian

von Peter D. (peda)


Lesenswert?

Ich hätte pinMode() so implementiert, daß bei ungültigen Argumenten ein 
Errorlevel zurück gegeben wird. Es ist aber als void definiert.

Ein Zugriff übers Arrayende liest irgendwas aus dem Programmcode als 
Daten aus. Da kann alles mögliche passieren.

: Bearbeitet durch User
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.