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; ...
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
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
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.
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.
Es gibt kein Programm ohne Fehler... Es gibt kein Prozessor ohne Fehler... Mit Fehler muss man sich arrangieren... Dabei hilfst Erfahrung.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.