Guten Morgen,
ich habe in meinem Projekt eine ganz merkwürdige Anomalie, die ich, und
jeden den ich anspreche nicht erklären kann.
Ich habe zwei Arduino Due Boards und einen Quellcode, den ich im Atmel
Studio verwalte und über den, in der Arduino IDE mitgelieferten,
Bootloader "bossac.exe" übertrage. Das erste Arduino Board ist ein
original von der Arduino Foundation, das zweite ein billiger China Klon.
Ich verwende die Boards als Steuerungszentrale für einen Motorprüfstand
und benutze einiges an Peripherie der CPU.
Nun zu dem merkwürdigen Teil: wenn ich meinen Quellcode kompiliere und
auf die Arduinos übertrage, funktioniert es nur auf dem China-Board.
Natürlich könnte man auf die Idee kommen, dass das originale Board
kaputt ist. Das kann ich allerdings ausschließen, weil ich die
betroffenen Pins mit einer älteren Version meines Programms getestet
habe. Auch Beispiele aus der Arduino IDE laufen ohne Probleme.
Es gibt auch ein Unterschied im Baujahr der μCs, das China Board hat
einen Chip von 2015, das Originalboard dagegen 2013. Es gibt Änderungen
in den neuen Revisions - aber keine die mein Projekt betreffen.
Ich hoffe Ihr habt eine Idee, die mich ein bisschen weiter bringt.
Vielen Dank im Voraus!
Ich würde Dir vorschlagen, Dich zunächst auf den Fall zu konzentrieren,
in dem "es nicht funktioniert".
Poste bitte den Schaltplan des fraglichen Boards, sowie den, der darum
herum aufgebauten Schaltung. Bitte auch ein Foto des Aufbaus.
Dazu postest Du bitte, den Quellcode.
Dazu schreibst Du bitte genau auf, was das Programm tun soll. Danach
beschreibst Du, was stattdessen tatsächlich geschieht.
Dann sehen wir mal weiter.
Die beiden Boards haben sicher unterschiedliche Bauteile. ATmega328P ist
nicht gleich ATmega328P, wenn sie aus unterschiedlichen Serien stammen.
Und dann sind da ja auch noch andere Bauteile drauf, die schon sichtbar
unterschiedlich sind.
Häufig ist auch ausschlaggebend, ob sich dein Programm und deine
Hardware an die Vorgaben aus dem Datenblatt hält.
Nur um ein Beispiel zu nennen:
Im Datenblatt des µC steht vielleicht, dass ein Signal mindestens 3V
haben muss, um als High erkannt zu werden. Eine Schaltung, die
stattdessen nur 2,9V liefert, wird dann auf einigen Boards
funktionieren, aber eben nicht auf allen.
Ich denke, das ist jetzt auch genug herum geraten. Für mehr Hilfe
solltest du erst einmal mehr Angaben zu deinem Projekt machen.
Angefangen mit den Schaltplänen DEINER Schaltung und vor allem auch dem
Schaltplan der beiden unterschiedlichen Ardunio Boards. Das Programm ist
sicher auch von bedeutung.
Ich habe zwei ähnliche aber nicht identische Geräte, welche sich unter
bestimmten geheimen Bedingungen irgendwie (das sage ich auch nicht)
unterschiedlich verhalten. Warum?
Die Bezeichnung China-Klon ist selbstverständlich absolut ausreichend
und 100% eindeutig! Es gibt ja nur ein einziges Gerät mit der
Bezeichnung. "China Klon" TM ist ein eigetragenes Warenzeichen der
"Nachmach-ER GmbH".
Bernd K. schrieb:> Stefan U. schrieb:>> ATmega328P ist>> nicht gleich ATmega328P>> Jetzt übertreibst Du aber.
Keineswegs, selbst wenn es sich um Originalchips aus dem selben Werk
handelt. Hast Du schon einmal etwas von Stepping oder Produktrevision
etc. gehört? Im Datenblatt von Atmel gibt es ein Kapitel unter dem Namen
"Errata"
Wozu soll diese Diskussion darüber, ob und welche Unterschiede es gibt
führen? Das es Varianten gibt, ist doch ohnehin völlig unstrittig.
Wollt Ihr die Unterschiede als Anhaltspunkt benutzen um dann über den
unbekannten Fehler zu spekulieren? Ihr wisst ja noch nicht mal welche
Varianten auf den beiden Boards bestückt sind und ob es verschiedene
sind.
Dann nehmt auch gleich die Variationen (spezifiziert und nicht
spezifiziert) der anderen Bauteile, der Platinen, des Wetters und der
Mondphase dazu. Nicht das irgendwas vergessen wird und man eine
Vermutung über den Fehler nicht formuliert.
Lothar schrieb:> Wozu soll diese Diskussion darüber, ob und welche Unterschiede es gibt> führen? Das es Varianten gibt, ist doch ohnehin völlig unstrittig.>> Wollt Ihr die Unterschiede als Anhaltspunkt benutzen um dann über den> unbekannten Fehler zu spekulieren?
Es ging nur darum, daß der "Fehler" ohne detaillierte Angaben nahezu
überall liegen kann, selbst wenn es scheinbar der gleiche Chip ist. Im
Prinzip also genau das was du auch sagst.
Hubert G. schrieb:> Atmel SAM3X8EARM Cortex-M3 CPU.>> Also nichts mit Mega328P.
Ups, da hat uns Stefanus ja einen Bären aufgebunden.^^ Ich hab da auch
nicht weiter nachgeschaut ob es stimmt was er schreibt. So schnell
kann's passieren mit den Details. ;-)
Jo, ich hatte Arduino Uno im Kopf. Keine Ahnung, warum. Vielleicht, weil
der in den letzten Tagen immer wieder genannt wurde. Aber schön, dass
ihr alle meinem Irrweg gefolgt seid :-)
Hallo an alle,
vielen Dank für die vielen Rückmeldungen! Ich entschuldige mich für die
wenigen Details bezüglich meinem Projekt und die des Boards.
Für das chinesische Board habe ich keinen Schaltplan, nehme aber stark
an, dass es den gleichen Layout besitzt. Bei der Webseite, in der ich
das Board bestellt habe gibt es keine Dokumentation dazu außer dem
Vermerk, dass es Revision 3 des Arduino Due Boards ist (wie das
originale).
Mein Projekt beinhaltet eine Kommunikationsschnittstelle über UART und
eine Ansteuerung einer Drehstromsbrücke über die PWM Ausgänge für eine
Asynchronmaschine. Die Kommunikationsschnittstelle hat die Aufgabe
Befehle entgegen zu nehmen und Messdaten von A/D-Eingängen an eine
MATLAB Anwendung zu übertragen.
Dazu was nicht funktioniert:
Wenn ich einen Befehl zum Starten des Motors versende, blickt kurz die
RX LED des Boards auf und es geschieht nichts - ich kann also annehmen,
dass der Empfang einer Botschaft nicht ordnungsgemäß verläuft.
Die Übertragungsrate ist mit 460800 baud/s angesetzt. Habe allerdings
auch 9600 baud/s ausprobiert -- das gleiche traurige Ergebnis.
Den Quellcode als Fehlerquelle kann ich wie gesagt ausschließen, weil er
auf dem anderen Board anstandslos ausgeführt wird.
Den Aufbau meiner Testbench habe ich beigefügt, der Aufbau mit drei LEDs
ist trivial. Die LEDs verwende ich nur als visuelles Feedback für die
Ansteuerung der Drehstrombrücke.
Grüße,
Marat
Marat schrieb:> Das erste Arduino Board ist ein> original von der Arduino Foundation, das zweite ein billiger China Klon.Marat schrieb:> Nun zu dem merkwürdigen Teil: wenn ich meinen Quellcode kompiliere und> auf die Arduinos übertrage, funktioniert es nur auf dem China-Board.
Der "Fehler", also das nicht nachvollziehbare Verhalten, tritt also auf
dem Original Arduino auf.
Marat K. schrieb:> Mein> Problem ist, dass ich nicht verstehen kann warum, weil es auf einem> baugleichen Board funktioniert.
Dann hast Du also doch noch ein zweites Original-Arduino, eines geht
nicht, das Andere schon. Dann ist das Eine wohl defekt.
Oder verwendest du eine Art Bootloader oder so, welcher nicht gewechselt
wird, so daß du deine Software lädst, aber das Gesamtpaket der Software
(deine Software + Sonstiges) eben nicht identisch ist, da du den
Bootloader nicht überschreibst. Dann kann es auch gut sein, daß die
Hardware nur anders initialisiert und konfiguriert wurde.
Marat K. schrieb:> Die Übertragungsrate ist mit 460800 baud/s angesetzt. Habe allerdings> auch 9600 baud/s ausprobiert -- das gleiche traurige Ergebnis.
Wo hast du das von 460800 auf 9600 geändert? Auf dem Arduino oder dem
PC?
Marat K. schrieb:> Dazu was nicht funktioniert:>> Wenn ich einen Befehl zum Starten des Motors versende, blickt kurz die> RX LED des Boards auf und es geschieht nichts - ich kann also annehmen,> dass der Empfang einer Botschaft nicht ordnungsgemäß verläuft. Mein> Problem ist, dass ich nicht verstehen kann warum, weil es auf einem> baugleichen Board funktioniert.
Wie wäre es, wenn du es mal systematisch angehst? Lade mal nur ein
Testprogramm auf den "fehlerhaften" Arduino, welches nur die Aufgabe hat
die Kommunikation über UART zu testen.
Ich glaube, ich muss mal systematisch zusammenfassen, was ich bisher
gemacht habe um den Fehler zu finden.
Ausgangssituation:
- 1x original Arduino Due
- 1x Arduino Due (China Klon, keine weitere Doku verfügbar)
- 1x Quellcode in C (in Atmel Studio) zur Ansteuerung einer
Drehstrombrücke. Befehl- und Datenaustausch über UART zwischen dem
Arduino und einer MATLAB Anwendnung.
PROBLEM: Der Quellcode wird bei gleichen Ausgangsbedingungen nur auf dem
China-Klon ausgeführt.
_____
Schritte, die ich vorgenommen habe, um die Ursache festzustellen:
1. Überprüfung der seriellen Schnittstelle
Ich habe auf den "fehlerbehafteten" Arduino ein Beispielsketch aus der
Arduino IDE übertragen und konnte Daten empfangen (d.h. an der UART-Unit
des uC kann es nicht liegen.
2. Vermindern der UART-Übertragungsrate
Es lag die Vermutung dass der "fehlerhafte" Arduino nicht mit der hohen
Übertragungsrate zurechtkommt - deshalb habe ich im Quellcode die
Baudrate Schritt für Schritt (230400, 115200, ...) vermindert und
getestet mit gleichem Ergebnis - das Board reagiert nicht auf meine
Befehle.
3. Überprüfung der PWM-Ausgänge
Die Ausgänge werden verwendet um IGBT Treiber einer Drehstrombrücke
anzusprechen. Um die Funktionsfähigkeit zu prüfen habe ich diese Pins in
einem neu angelegten Projekt angesprochen. Keine Probleme festgestellt.
_____
Als nächstes werde ich den Bootloader des originalen Arduinos
aktualisieren, mit der Hoffnung auf Besserung. Auch über die Fuse-Bits
in einem uC werde ich mich einlesen und mich hier melden.
Danke für eure Rückmeldung,
viele Grüße
@ Marat
Bei allem Respekt: Du strapazierst meine Geduld (und vermutlich auch die
der einiger Mitleser).
Letztlich aber verursachst Du nur Dir selbst Schwierigkeiten und
Zeitverlust, daher ist es kein Problem, das zu ignorieren.
Ich persönlich ziehe es vor, Dich erstmal im Kreis laufen zu lassen bis
Du erschöpft entweder aufgibst oder Dich reumütig ALLEN Nachfragen und
Anweisungen fügst oder sogar einen Glückstreffer landest.
Denn darum würde es sich im positiven Fall handeln: Nicht um das
Ergebnis systematischer Analyse sondern um einen Zufall.
Dennoch wünsche ich Dir, das Du Erfolg hast. So oder so.
Vorschlag:
Ändere dein Programm so, daß zwischen Kommunikation und Ausführung des
Befehls eine Pause liegt. In der Pause sendest du eine
Empfangsbestätigung zurück oder läßt eine LED leuchten.
Ich habe den Verdacht, daß deine Leistungsstufe den Arduino stört. Die
eine Platine verkaftet das noch, die Andere nicht.