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?
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.
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.
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 !!!
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"
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
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.
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
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?
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.
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.
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
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
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
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.
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.
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
EAF schrieb: > Ein Arrayzugriff über die Grenzen hinaus Siehe: https://github.com/arduino/ArduinoCore-avr/blob/master/variants/standard/pins_arduino.h
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.
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 |
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.