Go Down

Topic: Programmierhilfe für mein Projekt (Read 1 time) previous topic - next topic

robert_m6789

Hallo. ich habe folgendes vor. ich möchte selbstgelötete Kabel testen, ob beim Löten alles geklappt hat und keine Zinnbrücken zwischen einzelnen Pin's entstanden sind. Nun habe ich die Adern das einen Endes des Kabels auf eine Klemmleiste gelegt, welche dann auf 10 Pin's des Boards gehen und das andere Ende über eine D-Sub Buchse ebenfalls auf weitere 10 Kontakte des Boards gelegt. Außerdem verwende ich 10 Weitere Kontakte zur Ansteuerung von 10 LED's.
Dazu verwande ich ein Arduino Mega 2560.
Mein Gedanke war 10 Pin's als Output und 10 als Input festzulegen, also die Adern des einen Kabelendes auf Output und das andere Ende auf Input zu legen.
Nun wollte ich nacheinander ein High-Signal auf jeweils eine Ader legen und prüfen ob auch nur auf einen Eingang ein High-Signal ankommt. Dies wollte ich zudem noch über 10 LED's anzeigen lassen und im Fehlerfall den Ablauf stoppen um zu sehen zwischen welchen Pin's eine Verbindung liegt...Brauche dabei dringend Hilfe zwecks der Programmierung, oder eine Info ob das so überhaupt möglich ist.
Danke schonmal...
Robert

jurs


Mein Gedanke war 10 Pin's als Output und 10 als Input festzulegen, also die Adern des einen Kabelendes auf Output und das andere Ende auf Input zu legen.
Nun wollte ich nacheinander ein High-Signal auf jeweils eine Ader legen und prüfen ob auch nur auf einen Eingang ein High-Signal ankommt. Dies wollte ich zudem noch über 10 LED's anzeigen lassen und im Fehlerfall den Ablauf stoppen um zu sehen zwischen welchen Pin's eine Verbindung liegt...Brauche dabei dringend Hilfe zwecks der Programmierung, oder eine Info ob das so überhaupt möglich ist.


Im Prinzip müßte es "fast so" möglich sein - wenn Dir eine teilweise geringe Aussagefähigkeit des Tests ausreicht.

Zunächst zur Beschaltung und Programmlogik: Wenn es nicht sichergestellt ist, dass es keine Kurzschlüsse im Kabel gibt, dann darfst Du auf keinen Fall "10 Pin's als Output festlegen...und nacheinander ein High-Signal auf jeweils eine Ader legen".

Falls nämlich ein Kurzschluß existiert (was Du ja testen möchtest), würde der eine auf High geschaltete Output seine Ausgangsspannung mit einem auf Low geschalteten anderen Output kurzschließen, dadurch würden viel zu hohe unerlaubte Ströme durch diese beiden Pins des Mikrocontrollers fließen, so dass in der Folge mindestens diese beiden Pins ausfallen und defekt werden könnten (teilzerstörter Mikrocontroller).

Die korrekte Logik müßte so aussehen, daß nacheinander:
- alle 20 Anschlüsse auf INPUT geschaltet werden
- nur ein Anschluss zur Zeit wird auf OUTPUT geschaltet (19 bleiben auf INPUT)
- und der zu diesem Anschluss gehörende Gegen-Pin (und nur der) muß seinen Pegel wechseln, wenn der Pegel des OUTPUT-Pins wechselt.

Aus demselben Grund drohende Kurzschlußgefahr dürftest Du auch nicht einen eventuellen Masseanschluss des Kabels an Ground beim Arduino anschließen, sondern Du müßtest den Masseanschluß des Kabels wie eine normale Leitung des Kabels betrachten, und müßtest beide Ende der Kabel-Masse ebenfalls an zwei Pins des Arduino anschließen und in den Leitungstest einbeziehen. D.h. mit 20 Arduino-Pins kannst Du bei einem Kabel 9 Leitungen plus Kabel-Masse = 10 Leitungen gesamt testen.

Weiterhin mußt Du berücksichtigen, dass INPUT Pins in einer Digitalschaltung nur funktionieren, wenn sie auf einen definierten Pegel gezogen werden, Du kannst einen INPUT nicht "frei in der Luft hängen" lassen oder einfach nur mit einem anderen INPUT verbinden und erwarten, dass es dann einen auslesbaren HIGH oder LOW Pegel gibt, stattdessen sind die Werte an freihängenden INPUTs unbestimmt und die Schaltung benötigt PullUp- oder PullDown-Widerstände, um den Pegel eines unverbundenen Pins auf einen bestimmten Wert (0V oder 5V) zu ziehen. D.h. Deine 20 Pins brauchen in der Schaltung auch noch 20 Widerstände, die als PullUp- oder PullDown-Widerstände an den 20 Mess-Pins geschaltet sind.

Soweit die schlechte Nachricht.
Die gute Nachricht: Atmega-Mikrocontroller haben eingebaute PullUp-Widerstände an jedem Input-Pin, die Du einfach per Software aktivieren kannst:
Statt "pinMode(testPin, INPUT);" schreibst Du einfach "pinMode(testPin, INPUT_PULLUP);" in Deinem Programm, und schon werden die PullUp-Widerstände aktiviert und Du sparst das Einlöten und Verdrahten von 20 Widerständen in Deiner Schaltung.

Dadurch verstauscht sich allerdings die Programmlogik, alle INPUT_PULLUP gesetzten Pins haben einen HIGH-Pegel von Haus aus, wenn sie nirgends angeschlossen sind, und zum Testen müßtest Du über einen OUTPUT Pin ein LOW erzeugen, damit dann der Pegel am Input auf LOW wechselt.

Alles klar soweit? Sieht für mich sehr machbar aus.

Abschließend noch zur oben von mir erwähnten "geringen Aussagefähigkeit des Tests":
Der Test hat eine sehr gute Aussagefähigkeit bei der Erkennung von Kurzschlüssen zwischen den Kabeln, diese werden zu 100% sicher erkannt. Die geringe Aussagefähigkeit bezieht sich auf die Erkennung "kalter Lötstellen", also wenn eine Verbindung nicht wirklich niederohmig verlötet ist und es einen Übergangswiderstand an einer Lötstelle gibt: Selbst bei 100 Ohm Widerstand im Kabel würde der Pegel in der Testschaltung wechseln und somit "gut" anzeigen, auch wenn es sich um sehr schlechte kalte Lötstellen mit einem hohen Übergangswiderstand handelt. Das so aufgebaute Testgerät wäre also hauptsächlich ein Gerät, das zuverlässig auf Kurzschlussbrücken testet, das aber nur wenig über die Qualität der Lötstellen aussagt.

Was mir gerade einfällt: Wenn Du einen zweistufigen Test machst, dann müßtest Du zum Testen des Kabels auch mit nur 10 Pins auskommen.

Meine Idee dazu, mit der halben Pin-Anzahl auszukommen (bei etwas umständlicherer Bedienung): Du bastelst Dir für das eine Ende des zu testenden Kabels einen "Teststecker" als Kurzschlußstecker, an dem je zwei Kabel verbunden sind: Leitung-1 mit Leitung-2, Leitung-3 mit Leitung-4, Leitung-5 mit Leitung-6 u.s.w.. Am anderen Ende des Kabels sind die 10 Leitungen mit Pins am Arduino verbunden. Das auf Leitung-1 gegebene Signal muss also auf Leitung-2 wieder zurückkommen, etc.

1. Stufe des Tests bei abgezogenem Teststecker: Der Arduino testet jede Leitung einzeln per Output mit Pegelwechsel, der Pegel darf sich an keiner anderen Leitung ändern (Kurzschlusstest).

2. Stufe des Tests bei aufgesetztem Teststecker: Der Arduino testet jede Leitung einzeln per Output mit Pegelwechsel, der Pegel darf sich nur an der dazugehörenden anderen Leitung ändern (Verbindungstest).

Wenn sowohl der 10-pol Kurzschlußtest (ohne Teststecker) als auch der 10-pol Verbindungstest (mit Teststecker) bestanden werden, entspricht das in der Aussagekraft dem 20-pol Test, der in einem Rutsch abgearbeitet werden kann.

Udo Klein

Wie Du schon richtig bemerkst musst Du eigentlich nur ein Lauflicht programmieren und die andere Seite des Kabels an LEDs anklemmen. Das Lauflicht muß eben statt zwischen HIGH und LOW zwischen HIGH und HIGH-Z wechseln. Alles was Du dazu brauchst findest Du eigentlich in meinem Blog.

http://blog.blinkenlight.net/experiments/basic-sketches/all-high-z/
http://blog.blinkenlight.net/experiments/basic-sketches/all-high/

http://blog.blinkenlight.net/experiments/basic-effects/bouncing-ball/

Wichtig ist nur beim Umschalten zwischen high und high-z über pullup zu wechseln und nicht über low.



Code: [Select]

// HIGH --> HIGH-Z
pinMode(pin, INPUT);
digitalWrite(pin, LOW);


// HIGH-Z --> HIGH
digitalWrite(pin, HIGH);
pinMode(pin, OUTPUT);
Check out my experiments http://blog.blinkenlight.net

robert_m6789




Falls nämlich ein Kurzschluß existiert (was Du ja testen möchtest), würde der eine auf High geschaltete Output seine Ausgangsspannung mit einem auf Low geschalteten anderen Output kurzschließen, dadurch würden viel zu hohe unerlaubte Ströme durch diese beiden Pins des Mikrocontrollers fließen, so dass in der Folge mindestens diese beiden Pins ausfallen und defekt werden könnten (teilzerstörter Mikrocontroller).

Würden hierbei Dioden Abhilfe schaffen?

robert_m6789

Ist es denn Möglich während einem Programmablauf meine Pin's zwischen Input und Output wechseln zu lassen?

Go Up