Forum: Mikrocontroller und Digitale Elektronik Unbenutzte Pins vom Mikroprozessor als Fehlerquelle.


von skorpionx (Gast)


Lesenswert?

Schon am Anfang meiner  Abenteuer mit Mikroprozessor habe ich bemerkt 
etwas seltsames.
Beim Beruhigen mit Finger vom Gehäuse vom meinem PIC18F2680 kam zum 
seltsamen   verschiedenen Störungen. Mein „System“ wuchs ständig. Letzte 
Erweiterung war Multiplexer
dankt dem habe ich zu Verfügung genug I/O´s (16 digitale Ausgänge, 8 
Analoge und
8 digitale Eingänge). Fast alle Ports meines Mikroprozessor waren im 
Einsatz. Von
Störungen war nicht zu merken. In der letzte Zeit habe ich auch 
Temperaturmessung mit  MAX6675 Modul integriert. Der Dialog per SPI mit 
MAX6675 lief einwandfrei.
Jetzt wollte ich mein Mikroprozessorsystem für Steuerung von einem 
Elektroofen
verwenden. Ich brauchte nicht so viele IO´s und als erste habe ich alles 
was den
Multiplexer steuert (Pins vom Port A...) vom Programmcode entfernt. 
Und... Jetzt
funktionierte   Temperaturmessung über  MAX6675 Modul nicht mehr 
richtig. Es
kamen richtige Messwerte aber dazwischen auch viele Fehler. Einfluss von
„beruhigenden Finger „ war wider da...Analyse... Signal PinNoSelect für 
MAX6675
kommt von PORT A. Andere Pins von PORT A waren vorher für Multiplexer 
verwendet.
Jetzt waren sie i Programmcode nicht mehr da und hardwaremäßig in der 
„Luft“.
Defaultmäßig waren sie als Eingänge definiert. Die  Lösung: Am Anfang 
muss man
alle Ports vom Mikroprozessorsystem als Ausgänge definieren und sie auf 
0 setzen.
So schließt man das System gegen Störungen. Und meinen Anfänger Fehler 
kann
man auch so verstehen. Man sieht nur die Pins die man braucht...
 Meine main Funktion wird immer so aussehen:

void main(void)
 {
//Deklarationen
LATA=0;
TRISA=0;
LATB= 0;
TRISB = 0;
LATC = 0;
TRISC = 0;
...

von Peter D. (peda)


Lesenswert?

skorpionx schrieb:
> Am Anfang muss man alle Ports vom Mikroprozessorsystem als Ausgänge definieren 
und sie auf 0 setzen.

Auf keinen Fall!

Man darf nur die Pins auf Ausgang setzen, die keine Eingänge sind, sonst 
kämpfen sie ja gegen die Quelle des Eingangssignals, z.B. gegen einen 
anderen IC.
Und bevor man Ausgänge auf Ausgang setzt, muß man sie erst in den 
inaktiven Zustand setzen. D.h. auf 1, wenn die Last low aktiv ist.

Wenn Dein MC bei offenen Anschlüssen verückt spielt, dann hast Du einen 
Fehler in Deinem Programm, d.h. Dein Programm wertet diese Anschlüsse 
aus. Vermutlich wurden sie mal benutzt und Du hast nicht alle Stellen 
der Benutzung entfernt.

Auf ein sauber erstelltes Programm haben offene Eingänge keinen Einfluß. 
Nur die Stromaufnahme kann sich leicht erhöhen.
Man kann für unbenutzte Pins den Pullup einschalten, um sie auf 
definiertem Pegel zu halten.

: Bearbeitet durch User
von jdfmnbklugj (Gast)


Lesenswert?

skorpionx schrieb:
> Die  Lösung: Am Anfang
> muss man
> alle Ports vom Mikroprozessorsystem als Ausgänge definieren und sie auf
> 0 setzen.

Nein, so einfach ist das nicht.
Man muss dafuer sorgen, dass die keinen Einfluss haben.
Unbenutzte Pins duerfen keine Interrupts ausloesen koennen.
Diese duerfen nicht in irgendwelchen Auswertungen mit beruecksichtigt 
werden z.B. if(PIND == 0) anstelle von if((PIND & 0x01)==0)... wenn nur 
Pin D0 betrachtet werden soll.

jdfmnbklugj

von skorpionx (Gast)


Lesenswert?

jdfmnbklugj schrieb:
> Unbenutzte Pins duerfen keine Interrupts ausloesen koennen.

ch benutze beide Interrupts vom PIC. Auch Hardware Interrupt.
Wie kann man einzeln jedem Pins verbieten einen Interrupts
auszulesen? Es sind ziemlich viele Pins...
Das die nicht benutzte Pins nichts in Auswertung kommen das ist
klar. Klar am Anfang kann man die Pins die als Eingänge verdrahten
sind aus-maskieren. In jedem Fall die Pins, die in der Luft hängen als 
Ausgänge auf 0 setzen.

von Soul E. (Gast)


Lesenswert?

skorpionx schrieb:

> Defaultmäßig waren sie als Eingänge definiert. Die  Lösung: Am Anfang
> muss man
> alle Ports vom Mikroprozessorsystem als Ausgänge definieren und sie auf
> 0 setzen.
> So schließt man das System gegen Störungen. Und meinen Anfänger Fehler
> kann
> man auch so verstehen. Man sieht nur die Pins die man braucht...

Das ist eine Grundregel, kein Logikeingang darf undefiniert offen 
bleiben. Insbesondere bei CMOS-Bauteilen.

Du kannst
* die Pins auf Eingang schalten und auf Masse legen
* die Pins auf Eingang schalten und über Pullups/-downs auf High oder 
Low ziehen. Bei geringen EMV-Anforderungen reichen die internen Pullups, 
sofern vorhanden
* die Pins auf Ausgang schalten

Was für Dich besser bzw einfacher ist hängt von Deiner Anwendung ab.

Für Profis:
* in einem Port einen Pin als Output High und einen als Output Low 
schalten und dort einen Abblockkondensator dranhängen. Beruhigt die 
anderen Pins des Portes (bzw des chip-internen power rails).
* in einem Port einen Pin als Output High und einen als Output Low 
schalten und mit VDD bzw Gnd verbinden. Stützt die Versorgung der 
anderen Pins ordentlich ab. Liefert aber auch Diskussionsbedarf im 
Review.

von skorpionx (Gast)


Lesenswert?

Es gibt kein Programm ohne Fehler... Es gibt kein Prozessor ohne 
Fehler...
Mit Fehler muss man sich arrangieren...   Dabei hilfst  Erfahrung.

von skorpionx (Gast)


Lesenswert?

soul e. schrieb:
> Das ist eine Grundregel, kein Logikeingang darf undefiniert offen
> bleiben. Insbesondere bei CMOS-Bauteilen.

Und das habe ich nicht gewusst und das war Fehlerquelle am Anfang
bei mir. Ich habe mich nur für Pins interessiert die ich im Programm 
verwendet habe. Vielleicht passiert das
auch bei Anderen. Meine Bemerkung kann vielleicht helfen.

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.