Forum: Mikrocontroller und Digitale Elektronik Doppelverwendung ICSP-Port


von Christian T. (rmt-christian)


Angehängte Dateien:

Lesenswert?

Hallo liebe Forumsmitglieder,

Mein Name ist Christian.
Ich bin neu hier im Forum, habe Eure Diskussionen aber schon häufig 
interessiert mitverfolgt. Nun hab ich mich auch angemeldet um dem hier 
vorhandenen geballten Wissen auch meine Fragen vorzuführen, und im 
Gegenzug auch anderen bei "leichteren" Problemen Hilfe zu leisten.

Ich melde mich aber nicht nur, um Hallo zu sagen, ich habe auch schon 
die erste Frage:

Bei meinem aktuellen Projekt kämpfe ich leider mal wieder mit einem 
Mangel an GPIOs

Ich verwende den PIC18F45K80 da ich ein Modul aufbauen muss, welches 
seine Anweisungen via CAN-Bus erhält und dieser Controller 
dankenswerterweise den CAN-Controller gleich mit an Bord hat.

Adressiert wird das Modul über einen 4 Bit Drehcodierschalter (0...F) 
womit ich einen vordefinierten Adressbereich auswählen kann.

Zum GPIO-Sparen beabsichtige ich nun den ICSP-Port doppelt zu verwenden.
Einmal zur Programmierung und einmal eben für drei der 4 Bits des 
Schalters.

Ich habe eine Handskizze angefertigt, in der ich mal aufgezeichnet habe, 
wie ich mir das vorstelle.

Damit ich das Modul nicht nur in den Adressbereichen 0 und 1 
Programmieren kann, habe ich je einen Vorwiderstand von 10K in die 4 
Datenleitungen des Schalters geschleift (hab grad bemerkt, für Bit 1 ist 
das nicht notwendig).

Da ich noch nicht weiß, ob diese Codierschalter die Ausgänge auch ohne 
Com-Verbindung untereinander kurzschließen (was ich eigentlich eher 
ausschließe), habe ich die Dioden optional vorgesehen, um ein 
übersprechen unter den ICSP-Leitungen zu vermeiden.

Die interne Strombegrenzung meines Programmers (Pickkit 3) regelt bei 
500mA ab, das reicht vollkommen, um das "heiße Ende" der 10k Widerstände 
hochzuziehen. Ob das der PIC18F... auch kann, weiß ich noch nicht, so 
weit hab ich im Datenblatt noch nicht nachgesehen. Ich denke aber schon, 
schließlich saugen die 10k nur 5µA bei 5V

Der MCLR wird übrigens Software-seitig deaktiviert, sonst würd's ja 
sowie nicht funktionieren. Die entsprechenden WPUs werden auch gesetzt. 
Damit erspar ich mir auch die empfohlene Peripherie an diesen Pins 
(insbes. MCLR) - Richtig??


Zusammengefasst meine Fragen:

1.) Kann man das so machen??
2.) Ist der Pickkit3 Ausreichend kurschlussfest, um die Widerstände 
gleich wegzulassen. Ich weiß, das ist eher eine brutale Lösung, aber da 
nur ich Firmwareaktualisierungen durchführe weiß ich damit auch, dass 
dies nur bei Adresse 0 und 1 möglich ist. Die Frage ist dann eben nur, 
schieß ich mir den Pickkit sofort ins Jenseits, wenn ich mal 
unabsichtlich eine andere Adresse eingestellt habe?

Schon mal herzlichen Dank für Eure Beiträge.

LG
Christian

von Jens M. (schuchkleisser)


Lesenswert?

Christian T. schrieb:
> 1.) Kann man das so machen??

Theoretisch ja.
Am MCLR ist aber kein Pullup drin, den musst du einbauen.
Mit den Widerständen sollte es auch gehen, aber 10k ist ein wenig viel, 
kann sein das der interne Pullup zu luschig ist und die Pegel 
grenzwertig werden.
Da musst du nochmal nachmessen.

Christian T. schrieb:
> 2.) Ist der Pickkit3 Ausreichend kurschlussfest, um die Widerstände
> gleich wegzulassen.

Nein. Dann klappt das proggen nicht, und am MCLR kommen auch mehr als 5V 
an, d.h. im Progger ist ein Spannungswandler, und der mag Kurze nicht.
Durch die Widerstände ist aber die Geschichte so gesichert, das auch 
andere Adressen problemlos sind.

Es gibt im übrigen im Datenblatt vieler PICs eine Schaltung, die die 
"Isolation" der ICSP-Pins erläutert. Wenn du dich daran orientierst, 
klappt das auf jeden Fall.

von Christian T. (rmt-christian)


Lesenswert?

Hallo Jens,

Vielen Dank für Deine sehr rasche Antwort!

> Am MCLR ist aber kein Pullup drin, den musst du einbauen.

Achja, stimmt, hab übersehen, dass der ja im Register E angesiedelt ist.

> ...aber 10k ist ein wenig viel, kann sein das der interne Pullup zu luschig ist 
und die Pegel  grenzwertig werden. Da musst du nochmal nachmessen.

Okay?? ich wäre sogar noch höher gegangen. Wenn ich es richtig 
verstanden habe würden den Pickkit auch 100 Ohm von der Kommunikation 
nicht abhalten. Wenn allerdings der PIC antworten möchte, weiß ich 
nicht, ob er diese Barriere überwinden schafft. Wie auch immer ... 
drinnen sind die Rs jedenfalls im Layout. Der Wert lässt sich 
nachträglich immer anpassen. Testmessungen, wie Du richtig angemekrt 
hast, werden an der Beta ohnehin durchgeführt. Das Ding muss 
letztendlich auch noch durch EMV- und ESD-Tests, da kann eh noch so 
einiges an Problemen - im wahrsten Sinne - aufflackern.

Die Dioden kann ich getrost weglassen oder??
Bzw. anders gefragt, was passiert hinsichtlich ICSP, wenn ich zwischen 
PGC und PGD einen 10k R hänge?? Normalerweise nix, schließlich sind die 
ausgänge sowohl vom Pickkit als auch vom µC zumindest Dual-State, oder??
"Dass dann hinsichtlich Adressauswahl Bit 1 und 2 immer gemeinsam 
ankommen würden is mir eh klar."

> Es gibt im übrigen im Datenblatt vieler PICs eine Schaltung, die die "Isolation" 
der ICSP-Pins erläutert.

Vielen Dank für den Hinweis, danach werde ich gleich suchen.

LG
Christian

: Bearbeitet durch User
von Jens M. (schuchkleisser)


Lesenswert?

Christian T. schrieb:
> ich wäre sogar noch höher gegangen. Wenn ich es richtig
> verstanden habe würden den Pickkit auch 100 Ohm von der Kommunikation
> nicht abhalten.

Ja, beim programmieren wäre ein höherer Widerstand am Schalter besser.
Aber was ist im 99,9%-Normalfall? Dann hast du internen Pullup von 
einigen zig k gegen externen 10k, und je nach Wetterlage, Laune, 
Bierpreis, Mondstand und Laune ist der Eingang bei geschlossenem 
Schalter nicht low genug.

Christian T. schrieb:
> Wenn allerdings der PIC antworten möchte, weiß ich
> nicht, ob er diese Barriere überwinden schafft.

Die Ausgänge des PICs schaffen einige mA, die kümmert auch 1k Pull nicht 
wirklich.

Christian T. schrieb:
> Die Dioden kann ich getrost weglassen oder??

Würd ich sagen, ja.

Christian T. schrieb:
> zw. anders gefragt, was passiert hinsichtlich ICSP, wenn ich zwischen
> PGC und PGD einen 10k R hänge?? Normalerweise nix, schließlich sind die
> ausgänge sowohl vom Pickkit als auch vom µC zumindest Dual-State, oder??

Einer von beiden treibt immer, mit einer Push/Pull-Endstufe.
Du hast außerdem jeweils 10k gegen Masse, nicht 10k gegeneinander. Das 
macht aber nix, beide Seiten können dagegen H und L treiben.
Zur Laufzeit musst du aber Pullups aktivieren bzw. einbauen, weil der 
Schalter ja nur Low kann.

von Christian T. (rmt-christian)


Angehängte Dateien:

Lesenswert?

Hallo Jens,

So, ich hab mir nun mal Deine Ratschläge zu Herzen genommen und den 
Schaltplan überarbeitet.

Ich hab die Serienwiderstände jetzt auf 1k umgezeichnet. schließlich 
arbeiten die eh nur im ungünstigsten Fall beim Programmieren dagegen, 
und da beim Programmieren sonst keine anderen Ausgänge dauerhaft aktiv 
sind, muss ich auf die Gesamtstrombelastung aller Ausgänge in diesem 
Fall ohnehin nicht achten.

Muss ich sowieso nicht, die 8 Optotriacs die angesteuert werden ziehen 
je 5mA und die restlichen Aktoren liegen überhaupt nur im 2 stellige µA 
Bereich ... Mir is gerade aufgefallen, dass ich einen der Optitriacs am 
Port A hab. Das muss ich ändern, der Port A schafft nur 2 mA auf den 
Pins 0:5.

Den RE3 (disabled MCLR) hab ich jetzt mal mit 100K hochgezogen.
Die 47 Ohm Widerstände hab ich aus ESD-Schutzzwecken drinnen.

Sollte jetzt eigentlich alles so passen.

von Jens M. (schuchkleisser)


Lesenswert?

Ich würd sagen "kann man so bauen, und dann mal sehen".
Für's erste denke ich das das geht. EMV/ESD wird sicher noch spannend.

von GayWin (Gast)


Lesenswert?

Das haut hin. Sowas ähnliches mache ich auch.

von Christian T. (rmt-christian)


Lesenswert?

Vielen Dank für Eure Hilfe!!

Ich hab jetzt in der endgültigen Schaltung die 3 Stk. 47 Ohm Widerstände 
auf die andere Seite der Pullup-Rails (also nun zwischen Pullup und 
Portpin) gesetzt, dass sollte nur eine geringfügige Änderung bewirken. 
Ich glaube es ist so sogar besser, da aber der Unterschied höchstens 
homöopathischer Natur sein dürfte isses ohnehin egal. Kurz gesagt tu ich 
mir so beim Routen leichter, ich hab auf der Platine nämlich eine 
ziemlich hohe Bauteildichte.

Jens M. schrieb:
> EMV/ESD wird sicher noch spannend.

Ja, das Denk ich auch. Hab heute leider einen Rückruf von Würth 
Elektronik verpasst. Sonst hätte ich jetzt schon eine Rückmeldung ob 
mein Layout-Design EMV/ESD konform sein könnte.

Da werd ich wohl bis Montag warten müssen. :(

Schönes Wochenende!!

von Frank K. (fchk)


Lesenswert?

Denke daran, dass das PICKIT am MCLR irgendwas um die 9V anlegen wird, 
um den Chip in den Programmiermodus zu bekommen. Wenn Du den Pin für 
irgendwas anderes benutzt, musst die Außenbeschaltung die Spannung 
abkönnen, und VCC darf dadurch NICHT nennenswert hochgezogen werden.

fchk

von Christian T. (rmt-christian)


Lesenswert?

Frank K. schrieb:
> Denke daran, dass das PICKIT am MCLR irgendwas um die 9V anlegen wird,
> um den Chip in den Programmiermodus zu bekommen. Wenn Du den Pin für
> irgendwas anderes benutzt, musst die Außenbeschaltung die Spannung
> abkönnen, und VCC darf dadurch NICHT nennenswert hochgezogen werden.
>
> fchk

Hallo Frank,

vielen Dank für den Hinweis ... ich denke es sind sogar 12 Volt, kann 
mich aber auch irren. Dass der MCLR mit einer höheren Spannung aus einem 
Boostkonverter versorgt wird ist mir klar. In meinem Fall hängt am MCLR 
nur ein Codierschalter dran. Also entweder schwebt der MCLR, oder er 
wird gegen GND gezogen, welcher ebenfalls mit dem Pickit verbunden ist. 
Mit den von mir eingezeichneten Serienwiderständen wird die Leistung 
darin verbraten. Ohne Widerstand brät wohl das Pickit, sofern das keine 
interne Strombegrenzung oder ähnliche Schutzschaltung hat, wovon Jens 
und ich hier auch mal nicht ausgehen.

Genau aus dem von Dir geschilderten Grund, würde ich den MCLR auch nicht 
active high verwenden. Natürlich kann man unerwünschten Phänomenen mit 
Schutzdioden entgegen wirken, aber das gemeine an Dioden ist halt, dass 
die, vorausgesetzt es sind noch bedrahtete Reste von ihr vorhanden, nach 
ihrem Tod meißtens in beide Richtungen leiten. Bei seriellen 
Schutzdioden komm ich dabei obendrein immer erst dann drauf, wenn sie 
nicht mehr geschützt haben - also zu spät. Ein Widerstand is mir da 
schon lieber, dessen Erbschaft nach seinem Dahinscheiden ist meistens 
unendlich hoch"ohmig".

Da bei mir VCC-Seitig Verbraucher drauf sind, welche auch ohne 
µC-Aktivität zumindest ein paar wenige mA ziehen, schafft es das Pickit 
nicht, den VCC-Pegel über den Pullup des MCLR hochzuziehen. Da ich das 
aber bedacht habe, habe ich trotzdem sicherheitshalber einen Pullup von 
stattlichen 100k gewählt, da reicht der Kriechstrom der MBRS140 im 
LM2594-er Konverter schon, um den Pegel unten zu halten.

Ein weiterer Grund, warum ich gerne gegen Masse Schalte ist, dass ich an 
Open-Collector bzw. Drain gewöhnt bin, die schalten meistens auch alles 
gegen Masse.

Einzig bei sehr langsamen Signalen von außerhalb der Module kommt es 
gelegentlich vor, dass ich mit den 24 VAC geschützt mittels TVS über 
einen hochohmigen RC Lowpass 10-100k und 10-100nF direkt auf den Portpin 
fahre. Das is für Schalter ein?, oder Schalter aus? vollkommen 
ausreichend. Darüber hinaus, man mag es kaum glauben, hält diese 
Variante sogar EMV und ESD-Tests stand :)

LG
Christian

von GayWin (Gast)


Lesenswert?

Frank K. schrieb:
> Denke daran, dass das PICKIT am MCLR irgendwas um die 9V anlegen wird,
> um den Chip in den Programmiermodus zu bekommen. Wenn Du den Pin für
> irgendwas anderes benutzt, musst die Außenbeschaltung die Spannung
> abkönnen, und VCC darf dadurch NICHT nennenswert hochgezogen werden.
>
> fchk

O. Wie intelligent. Er hat doch die Schaltung geposter. Du Legasteniker.

von Peter D. (peda)


Lesenswert?

Ich könnte mir vorstellen, daß andere IO-Funktionen besser für die 
Mehrfachnutzung geeignet sind, z.B. ICSP und SPI. SPI-ICs sind 
hochohmig, solange alle /CS über einen Pullup deaktiviert sind.
Oder man nimmt R2R für das Einlesen von 4 Bits am ADC.

von Jens M. (schuchkleisser)


Lesenswert?

Peter D. schrieb:
> Ich könnte mir vorstellen, daß andere IO-Funktionen besser für die
> Mehrfachnutzung geeignet sind, z.B. ICSP und SPI.

Noch unproblematischer als ein Schalter mit hohen Widerständen davor 
sind nur offene Pins.
ICs haben oft Schutzdioden, und SPI mag keine hohen Widerstände in Serie 
wegen der hohen Frequenzen; LEDs sind zu niederohmig.

Peter D. schrieb:
> Oder man nimmt R2R für das Einlesen von 4 Bits am ADC.

Klappt m.W. nicht, weil man dazu einen Schalter bräuchte, der H & L 
schaltet, teuer und selten.

von Peter D. (peda)


Lesenswert?

Jens M. schrieb:
> SPI mag keine hohen Widerstände in Serie

Die braucht es eben nicht, da hochohmig, wenn /CS = 1. MISO, MOSI, SCK 
können daher problemlos noch anderweitig verwendet werden.

von Jens M. (schuchkleisser)


Lesenswert?

achja stimmt.

von Christian T. (rmt-christian)


Lesenswert?

Peter D. schrieb:
> Ich könnte mir vorstellen, daß andere IO-Funktionen besser für die
> Mehrfachnutzung geeignet sind, z.B. ICSP und SPI. SPI-ICs sind
> hochohmig, solange alle /CS über einen Pullup deaktiviert sind.

In dem Fall also mit Software SPI.
Tatsächlich nutze ich SPI zur Kommunikation des Boards (als Slave) mit 
optionalen Stand-Alone Controllern als Aufsteckerweiterungen) Diese 
werden treffenderweise auch direkt auf jenen 10 poligen Pfostenstecker 
aufgesteckt, an welchem auch die ICSP-Pins anliegen. Beim Stecker war 
kein (Platz-)Sparbedarf gegeben, ich hab noch ca 500 dieser Stecker, 
welche von einem eingestampften Projekt noch übrig sind.  Die musste ich 
also sowieso noch irgendie anbringen. Ein Software SPI zu programmieren 
wollte ich mir letztendlich auch sparen.Ich bin beim Programmieren noch 
Neuling, und um mir alles noch fehlende Wissen bei diesem einen Projekt 
anzueignen fürchte ich, reicht die Zeit nicht.
Ja, vermutlich gibt's für sowas eh schon fertige header-Files ... Aber 
ich dachte mir, dass alleine schon der CAN-Bus genug Herausforderung für 
ein Projekt ist.

> Oder man nimmt R2R für das Einlesen von 4 Bits am ADC.

An sowas ähnliches dachte ich auch.
Geht aber nur als Spannungsteiler mit dazuschaltbaren Widerständen.
Dabei würde ich einen exponentiellen Spannungsverlauf für die einzelnen 
Adressen erhalten, und dass könnte ein Problem werden (Siehe weiter 
unten), weshalb ich die Idee letztendlich verworfen habe.

Realisiert hätte ich es so:

10k als PullUp.
und am Drehcodierschalter folgende Werte schaltbar gegen Masse:
Bit 0 2k2
Bit 1 3k3
Bit 2 4k7
Bit 3 6k8

Daraus ergibt sich ein variabler Spannungsteiler mit folgenden 
Verhältnissen.

Adresse   -   Spannungsteiler
F         -   10k : 895R
E         -   10k : 1k227
D         -   10k : 1k508

usw.

Die Analogspannungen würden wie folgt aussehen:

Adresse    -   Spannung
F          -   0,4107...V
E          -   0,5019...V
D          -   0,6552...V

Zwischen den beiden größten Verhältnissen ergibt sich rechnerisch der 
geringste Spannungssprung das wären dann zwischen Adresse F und E nur 
91,2mV

Das könnte ich zwar bereits mit einem 8 Bit A/D-Wandler ausreichend 
genau abfragen, allerdings wird die Adresse des Moduls unmittelbar nach 
Einschalten der gesamten Anlage abgefragt und gespeichert. Die ganzen 
Ventile die da Schalten und Motoren die sich in dem Moment drehen, der 
Hauptcontroller der bootet, ... über all diese Einflüsse auf meine 
dadurch vielleicht geringfügig schwankende 5 Volt Versorgung, von den 
EMV- Effekten mal ganz abgesehen, wollte ich echt nicht nachdenken. (Die 
gesamte Anlage wird dummerweise auch aus einem gemeinsamen 24V Trafo 
versorgt) Einfach die Startroutine meines Controllers zu verzögern war 
mir da zu wenig Sicherheit und alles andere hätte, noch zusätzlich zum 
Programmieraufwand der Min/Max-Spannungs-array der Adressen, mehr 
Aufwand bereitet, als die jetzige Lösung.

Jens M. schrieb:
> Klappt m.W. nicht, weil man dazu einen Schalter bräuchte, der H & L
> schaltet, teuer und selten.

... und von den Drehcodierschaltern gibt's eine H/L Version in der 
benötigten Bauform glaub ich überhaupt net.


Ich hoffe ich hab jetzt nicht nur Blödsinn von mir gegeben.
Und bitte steinigt mich nicht, falls ich mich gerade irgendwo verrechnet 
habe. Die Notizen welche ich damals gemacht habe, find ich grad nicht, 
weshalb ich ein paar der wesentlichen Werte jetzt, um kurz nach 
Mitternacht, schnell nochmals ausgerechnet hab.

Vielen Dank für Euer Interesse und die guten Vorschläge.
Liebe Grüße und gute Nacht!

Christian

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.