Forum: Mikrocontroller und Digitale Elektronik PIC - erkennen ob Ausgang belegt


von Jochen (Gast)


Lesenswert?

Hallo,

ich möchte mit einem PIC mehrere Ausgänge (= LEDs eines Signals) 
ansteuern. Das ganze soll aber möglichst so allgemein gehalten sein, 
dass ich beim Programmstart zunächst mal überprüfe, welche LED überhaupt 
angeschlossen sind und welche nicht, und abhängig davon nur das schalte 
was auch da ist.

An jedem Ausgang hängt also entweder eine LED mit Vorwiderstand oder es 
hängt nichts dran.

Hab ich da eine Möglichkeit, das per Programm zu ermitteln ob da was 
dran hängt oder nicht?

Welcher PIC das genau wird ist noch nicht festgelegt, es muss halt einer 
mit mindestens 8 Ports werden. Weitere Randbedingungen erst mal keine.

Gruß

Jochen

von Karl H. (kbuchegg)


Lesenswert?

Meiner Meinung nach geht das ohne Zusatzhadware nicht, da du nicht 
feststellen kannst, ob durch einen Portpin Strom fliesst oder nicht.

Aber warum willst du das überhaupt?
Ein Portpin, an dem nichts angeschlossen ist, verbraucht auch keinen 
(oder nur minimalst) Strom. Da liegt ja kein geschlossener Stromkreis 
vor. Auf der anderen Seite ist der Aufwand in der Programmlogik dafür 
nicht unbeträchtlich und auch der Aufwand, die Ansteuerung im Programm 
dann entsprechend anzupassen ist nicht unerheblich.

von Teo D. (teoderix)


Lesenswert?

Man könnte den "read modify write" Effekt nutzen?!
aber wie Karl Heinz schon sagte, das macht keinen Sinn, außer der Weg 
ist das Ziel :)

von Tom P. (booner)


Lesenswert?

Hei,

die Macher vom Mikrokopter machen das mit einer LED.
Die erkennen damit die Version der Platine auf der der vorprogrammierte 
Atmel µC eingelötet wird.

Geht das bei einem Pic nicht auch?
Zuerst mal den PIN auf Eingang schalten und auf HIGH oder LOW 
überprüfen.
Danach auf Ausgang schalten...


Grüße,

Tom

von Karl H. (kbuchegg)


Lesenswert?

Tom P. schrieb:
> Hei,
>
> die Macher vom Mikrokopter machen das mit einer LED.
> Die erkennen damit die Version der Platine auf der der vorprogrammierte
> Atmel µC eingelötet wird.

Dann sieh dir halt mal die Schaltung an, wie die LED verbaut ist.

> Geht das bei einem Pic nicht auch?
> Zuerst mal den PIN auf Eingang schalten und auf HIGH oder LOW
> überprüfen.

Probiers aus

von d&g (Gast)


Lesenswert?

Sollte gehen. Zeig mal Deine Beschaltung.
Ist's ne LED + Vorwiderstand nach Masse, so sollte es eventuell gehen, 
wenn Du die internen PullUp Widerstände kurz aktivierst (falls das bei 
dem µC geht). Dann ist's eher eine Frage, ob die Spannung als LOW 
erkannt wird.

von Tom P. (booner)


Lesenswert?

Karl Heinz schrieb:
> Tom P. schrieb:
>> Geht das bei einem Pic nicht auch?
>> Zuerst mal den PIN auf Eingang schalten und auf HIGH oder LOW
>> überprüfen.
>
> Probiers aus

Wenn man zu einem Thema nur Halbwissen hat, so wie ich hier, dann 
schreit man am Besten nicht: "Ja geht!", sondern gibt nur einen Hinweis, 
wo man evtl. eine Lösung finden könnte.
Mich selbst interessiert das momentan weniger, als dass ich es bei 
meiner knappen Freizeit ausprobieren möchte...


Grüße,

Tom

von Karl H. (kbuchegg)


Lesenswert?

Tom P. schrieb:
> Karl Heinz schrieb:
>> Tom P. schrieb:
>>> Geht das bei einem Pic nicht auch?
>>> Zuerst mal den PIN auf Eingang schalten und auf HIGH oder LOW
>>> überprüfen.
>>
>> Probiers aus
>
> Wenn man zu einem Thema nur Halbwissen hat, so wie ich hier, dann
> schreit man am Besten nicht: "Ja geht!", sondern gibt nur einen Hinweis,
> wo man evtl. eine Lösung finden könnte.

Entschuldigung. Ich hab dich mit dem TO verwechselt.
Der springende Punkt ist, dass ich auch nicht mit Sicherheit aus der 
hohlen Hand heraus sagen kann, wie die das gemacht haben.
Die Frage ist: was macht die Spannung am "nicht angeschlossenen" Ende 
einer LED, bzw. das was d&g anregt, reicht das um ein eindeutiges Low zu 
kriegen. Ich weiß es nicht.

von Jochen (Gast)


Lesenswert?

Karl Heinz schrieb:
> Aber warum willst du das überhaupt?

Es geht darum, dass ich verschiedene (HL-)Signalbilder schalten will. 
D.h. wenn ein Signal mit günem und gelbem Lichtbalken ausgestattet ist, 
dann will ich 100 km/h signalisieren (grüner Balken an); ist der Balken 
nicht vorhanden dann stattdessen 60 km/h (gelber Balken an).
Also: PIC bekommt den Befehl 100 km/h anzeigen, kann das aber nicht, 
also wird auf 60 km/h runtersignalisiert.

Klar, ich könnte einen PIC mit mehr I/O-Ports nehmen und für jeden 
Ausgang zusätzlich noch einen Eingang als Konfiguration schalten. Aber 
ich wollte das nicht zu groß werden lassen.

Am Ende soll eine Schaltung rauskommen, bei der halt unterschiedlich 
bestückte Signale angeschlossen werden können und das nicht über eine 
Programmänderung im PIC angepasst werden muss.

Den Ansatz mit dem erst Eingang schalten, Wert auslesen, und dann 
Ausgang schalten hatte ich auch schon gedacht, nur weiß ich noch nicht 
wie ich die unterschiedlichen Pegel auf den Eingang bekomme.

Gruß

Jochen

von Karl H. (kbuchegg)


Lesenswert?

Jochen schrieb:

> Den Ansatz mit dem erst Eingang schalten, Wert auslesen, und dann
> Ausgang schalten hatte ich auch schon gedacht, nur weiß ich noch nicht
> wie ich die unterschiedlichen Pegel auf den Eingang bekomme.

So wie ich das verstanden habe, funktioniert die Idee so.

Du schaltest den Pin auf Eingang und schaltest den Pullup Widerstand an 
dem Pin ein. So weit so gut.
Ist da nichts angeschlossen, dann kriegst du ein sauberes High, weil ja 
keine Aussenbeschaltung da ist, die den Pin Low ziehen könnte.

Ist da aber eine LED (nach Masse verschaltet), dann reicht zwar der 
Pullup-Widerstand nicht aus, dass die LED nennenswert leuchtet. 
Allerdings 'zieht' die LED genug Strom, so dass die Spannung trotz 
Pullup-Widerstand einbricht und am Pin ein Low-Pegel entsteht.

Soweit zur 'Theorie'. Ob das funktioniert? Keine Ahnung. Noch nie 
ausprobiert.

von Dietrich L. (dietrichl)


Lesenswert?

Jochen schrieb:
> Den Ansatz mit dem erst Eingang schalten, Wert auslesen, und dann
> Ausgang schalten hatte ich auch schon gedacht, nur weiß ich noch nicht
> wie ich die unterschiedlichen Pegel auf den Eingang bekomme.

Dann sollte man mindestens eine Widerstand parallel zur LED spendieren. 
Dimensionierung: genügend hochohmiger Pull-Up, genügend niederohmige 
LED-Beschaltung. Und das ganze mit den Port-Daten (Low-/High-Pegel) und 
Herrn Ohm durchrechnen.

Gruß Dietrich

von F. F. (foldi)


Lesenswert?

Was ist denn mit Strom messen?
Jeden Pin einmal schalten (wenn sie als Ausgang dienen) und über die 
gemeinsame Masse den Strom messen. Ein shunt dürfte nicht all zu viel 
Hardwareaufwand sein.

von Helmut L. (helmi1)


Lesenswert?

F. Fo schrieb:
> Ein shunt dürfte nicht all zu viel
> Hardwareaufwand sein.

Hebt dir aber dein GND Potential an.

von Frank M. (frank_m35)


Lesenswert?

Anstatt einen PIC mit 8 Ports zu suchen, kannst du auch einen 
Port-Expander verwenden. Bspw.
http://ww1.microchip.com/downloads/en/DeviceDoc/21919e.pdf
bzw.
http://ww1.microchip.com/downloads/en/DeviceDoc/21952b.pdf
hat 8/16 I/O und 8 können damit bei I2C an einem Bus hängen. D.h. du 
brauchst gerade einmal 2 Pins am uC wenn du I2C verwendest.

Ich gehe mal davon aus, dass du diese 64 LEDs nicht direkt an den uC 
anschließt sondern über einen Transistor schaltest (1.3A durch den PIC 
sind nicht gut). Daher wird dieser Pull-Up, selbst wenn er mit einer LED 
direkt am Pin funktionieren mag, bei dir nicht funktionieren.

Du könntest den gesamten Stromverbrauch deiner LEDs messen. Ein kleiner 
Shunt in die Stromversorgung, ein OpAmp zum Verstärken und dann mit 
einem analogen Eingang die Spannung messen.
Danach schaltest du zu Beginn kurz jede LED nacheinander ein und misst 
die Spannung am Shunt. Ändert sie sich, ist die LED angeschlossen, 
ansonsten nicht.

von Dietrich L. (dietrichl)


Lesenswert?

Helmut Lenzen schrieb:
> F. Fo schrieb:
>> Ein shunt dürfte nicht all zu viel
>> Hardwareaufwand sein.
>
> Hebt dir aber dein GND Potential an.

Wenn das wenig genug ist, juckt das die LEDs nicht. Zur Messung des 
Stroms muss man halt einen ADC-Kanal spendieren + ggf. einen Verstärker.

Gruß Dietrich

von Der Rächer der Transistormorde (Gast)


Lesenswert?

Jochen schrieb:
> Das ganze soll aber möglichst so allgemein gehalten sein,
> dass ich beim Programmstart zunächst mal überprüfe, welche LED überhaupt
> angeschlossen sind und welche nicht, und abhängig davon nur das schalte
> was auch da ist.

Gibt jede Menge Möglichkeiten.

1. Du legst die Led auf einen Eingang den du auch analog abfragen 
kannst.

2. Ein Pic hat 2 Port abfragen. Die erste hängt direkt am Port, die 
zweite geht über ein Register. Gab mal zu Urzeiten ein read modify write 
Problem das so gelöst wurde, das kannst dir zu nutze machen.

Wenn du den Port auf Ausgang schaltest liegt nicht die high Spannung an 
sondern was an der Led abfällt. Muss du mal gucken ob man damit high low 
Potential abfragen kannst

3. Nimm nen Kondensator parallel und schau ob und wie schnell er sich 
entlädt

Das geht mit 1. und 2.

4. Miss die Stromaufnahme vor und nach Led einschalten

5. Leds sind gleichzeitig Fotozellen. Du kannst eine Spannung messen 
wenn Licht darauf fällt (geht mit 1.)

6. Schalte bei Ports mit WPU (weak pull up) diese an und aus, wenn ne 
Led dranhängt wird sich evtl. der Pegel ändern.


7. Nutze Charlieplexing und 2.

von Helmut L. (helmi1)


Lesenswert?

Dietrich L. schrieb:
> Wenn das wenig genug ist, juckt das die LEDs nicht.

Denn LEDs mit Sicherheit nicht, aber der uC ist ja nicht allein auf der 
Welt und steht mit anderen Pins damit in Kontakt und die wollen sauber 
HiLo Pegel.

Dietrich L. schrieb:
> Zur Messung des
> Stroms muss man halt einen ADC-Kanal spendieren + ggf. einen Verstärker.

Etwas aufwendig das ganze wenn dem TO ein paar Jumper noch zuviel sind.

Jochen schrieb:
> Klar, ich könnte einen PIC mit mehr I/O-Ports nehmen und für jeden
> Ausgang zusätzlich noch einen Eingang als Konfiguration schalten. Aber
> ich wollte das nicht zu groß werden lassen.

von Carsten H. (blaubaer77)


Lesenswert?

Eine einfache Möglichkeit ist, den Pin kurzzeitig auf Ausgang stellen, 
auf High setzen, dann wieder auf Input und den Wert zurück lesen.
Dann das Ganze nochmal mit Ausgang auf Low.
Wenn die eingelesenen Pegel in beiden Fällen übereinstimmen, ist der 
Eingang offen.

Die Eingangskapazität reicht, um den Eingangspegel ein paar ms zu 
halten.

Ist eine Ausgangsbeschaltung vorhanden, dann wird diese entweder den 
High oder Lowpegel verfälschen.

Hab ich mit AVR schon gemacht. Sollte aber auch beim PIC funktionieren.

Gruß Carsten

von Dietrich L. (dietrichl)


Lesenswert?

Helmut Lenzen schrieb:
> Dietrich L. schrieb:
>> Wenn das wenig genug ist, juckt das die LEDs nicht.
>
> Denn LEDs mit Sicherheit nicht, aber der uC ist ja nicht allein auf der
> Welt und steht mit anderen Pins damit in Kontakt und die wollen sauber
> HiLo Pegel.

Der Shunt müsste natürlich nur im GND-Pfad der LEDs liegen. Also "im 
Prinzip" ging das. Ob es auch vom Aufwand her sinnvoll ist, ist 
natürlich eine andere Frage.

von Reinhard Kern (Gast)


Lesenswert?

Hallo,

wenn man Analogeingänge übrig hat (bin allerdings kein AVR-Spezialist): 
die Spannung an der LED-Beschaltung analog einlesen, dann den Pin 
umprogrammieren auf digital out.

Gruss Reinhard

von Michael L. (michaelx)


Lesenswert?

Jochen schrieb:
> Karl Heinz schrieb:
>> Aber warum willst du das überhaupt?
>
> Es geht darum, dass ich verschiedene (HL-)Signalbilder schalten will.
> D.h. wenn ein Signal mit günem und gelbem Lichtbalken ausgestattet ist,
> dann will ich 100 km/h signalisieren (grüner Balken an); ist der Balken
> nicht vorhanden dann stattdessen 60 km/h (gelber Balken an).
> Also: PIC bekommt den Befehl 100 km/h anzeigen, kann das aber nicht,
> also wird auf 60 km/h runtersignalisiert.

Ich verstehe gut, was du erreichen willst. Aber warum so kompliziert? 
Willst du EINEN Decoder für alle möglichen Signalbegriffe bauen? Warum 
nimmst du nicht einfach eine Konfigurationsvariable (CV) oder auch zwei, 
in der du dem Decoder die physisch vorhandenen Signallampen des 
angeschlossenenen Signals mitteilst!? Und die Decoder-Software kann 
daraus ableiten, welche alternativen Signalbegriffe sie anzeigen muss, 
wenn der gewünschte Begriff nicht darstellbar ist.


Moba-Grüße.

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.