Forum: Mikrocontroller und Digitale Elektronik MCP23S17 - komisches Verhalten


von René P. (speedy909)


Lesenswert?

Hallo zusammen,

ich habe ein komisches Verhalten des MCP23S17 festgestellt.
Entweder übersehe ich etwas oder meine beiden MCP23S17 sind defekt! 
(wäre etwas komisch, da sie beide NEU sind)

Ich habe einen Testaufbau mit einem Raspberry aufgebaut (um mir das 
Testen etwas leichter zu ermöglichen).

Das Test-Programm ist recht simpel gestaltet (python).
-> Der Eingangs-Zustand von PortA soll auf PortB dargestellt werden.
-> Wenn ich mein Programm teste, bekomme ich aber folgendes Verhalten...

Port A = Eingänge
Port B = Ausgänge

Eingang  Ausgang
00000000  11111111
00000001  11111101
00000010  11111011
00000100  11110111
00001000  11101111
00010000  11011111
00100000  10111110
01000000  01111101
10000000  01111110

Wenn ich die Ports untereinander tausche (Software und Hardware), 
funktioniert alles problemlos! -> (B = Eingänge & A = Ausgänge)

Habe das ganze mit zwei Stück MCP23S17 getestet -> das Verhalten ist 
identisch!

Hinweis:
Ich habe es auch nicht hin bekommen die Pullups auf "255" zu setzen.
Wenn ich die Pullups auf 255 setze (überprüft mit Oszilloskop) und dann 
den Wert der Pullups wieder auslese, bekomme ich 254 zurück!

1
#!/usr/bin/python
2
3
import spidev
4
import time
5
6
spi = spidev.SpiDev()
7
spi.open(0, 0)
8
spi.max_speed_hz = 7629
9
10
r = 0x41
11
w = 0x40
12
13
spi.xfer([w, 0x01, 0x00])    #PORTB auf Ausgang schalten
14
time.sleep(0.2)
15
spi.xfer([w, 0x0C, 0xFF])    #PORTA Pullups aktivieren
16
time.sleep(0.2)
17
18
19
while 1:
20
  data = spi.xfer([r, 0x12, 0x00])  #PORTA Eingang abfragen
21
  time.sleep(0.01)
22
  spi.xfer([w, 0x13, data[2]])    #PORTB setzen
23
  time.sleep(0.01)


Hat jemand eine Idee an was es liegen könnte? (was ich übersehen habe)


Gruß
René

von Teo D. (teoderix)


Lesenswert?

René P. schrieb:
> Hat jemand eine Idee an was es liegen könnte? (was ich übersehen habe)

Fehlerhafte config!?
3.5.2 INPUT POLARITY REGISTER

René P. schrieb:
> Wenn ich die Pullups auf 255 setze (überprüft mit Oszilloskop) und dann
> den Wert der Pullups wieder auslese, bekomme ich 254 zurück!

0-254?!

von Maxim B. (max182)


Lesenswert?

René P. schrieb:
> Hat jemand eine Idee

PCB unsauber gemacht, mit Kurzschluß?

von René P. (speedy909)


Lesenswert?

Teo D. schrieb:
> Fehlerhafte config!?
> 3.5.2 INPUT POLARITY REGISTER

Das IPOLA bzw B sollte nach einem Reset den Status ‚00000000‘ haben 
(reset wurde durchgeführt)

Teo D. schrieb:
> 0-254?!

Für mich hat der Port 8 Bit, somit muss ich um alle Pullups zu 
aktivieren, das Register mit 255 bzw. 0xFF beschreiben oder liege ich da 
etwa falsch?

Maxim B. schrieb:
> PCB unsauber gemacht, mit Kurzschluß?

Die Schaltung ist auf einem nahezu neuen Steckboard aufgebaut!
Habe auch schon die Position auf dem Steckboard verändert um Fehlerhafte 
Kontakte auszuschließen.

von Teo D. (teoderix)


Lesenswert?

René P. schrieb:
> Für mich hat der Port 8 Bit, somit muss ich um alle Pullups zu
> aktivieren, das Register mit 255 bzw. 0xFF beschreiben oder liege ich da
> etwa falsch?

Das war nur ein Schnellschuss (push) auf die üblichen Fehlerquellen. 
Also NÖ. :/
Zu meinem ersten Hinweis, steh ich aber noch, wenn nicht sowas in frage 
kommt:

Maxim B. schrieb:
> PCB unsauber gemacht, mit Kurzschluß?

Naja, was bleib dann noch...

von Maxim B. (max182)


Lesenswert?

Teo D. schrieb:
> Naja, was bleib dann noch...

Speisung und Kondensatoren.

> Die Schaltung ist auf einem nahezu neuen Steckboard aufgebaut!

Steckboard ist nicht besonders gut für manche IC, da Speiseleitungen zu 
lange (und zu induktiv) sind. Manchmal können Keramik-Kondensatoren 
helfen.  Es kann auch sein, daß die Erde derart hochinduktiv ist, daß 
SPI nicht mehr korrekt arbeiten kann.

Man kann versuchen, Keramik-Kondensator so ca. 100n direkt an Pins 
einzulöten (Pin 9 und 10 ). Manchmal hilft aber nur PCB mit guter 
Speisung.

: Bearbeitet durch User
von Jan H. (janiiix3)


Lesenswert?

Ich habe dafür erst kürzlich was kleines geschrieben.
Solltest du Interesse haben, schreib mich an.

von S. Landolt (Gast)


Lesenswert?

Falls noch nicht geklärt, Vorschlag:

in
 spi.xfer([w, 0x13, data[2]])    #PORTB setzen
stattdessen OLATB=0x15 probieren.

von René P. (speedy909)


Lesenswert?

Hallo,

sorry für die späte Antwort...
Es scheint tatsächlich ein Problem mit der Verwendung des Steckboards zu 
sein. (habe ich bei der sehr niedrigen SPI Geschwindigkeit nicht 
erwartet)


Habe die Schaltung nun nochmals (auf dem gleichen Steckboard) aufgebaut 
und siehe da... auf einmal hat es funktioniert.


Ist also mehr ein Zufall ob es auf einem Steckboard funktioniert oder 
nicht.
Somit habe ich wieder etwas dazugelernt. (vertraue nie einem Steckboard)

Danke an alle für die Tipps.


Gruß
René

von Michael U. (amiga)


Lesenswert?

Hallo,

René P. schrieb:
> Habe die Schaltung nun nochmals (auf dem gleichen Steckboard) aufgebaut
> und siehe da... auf einmal hat es funktioniert.

ich nutze durchaus auch Steckbretter, auch für ESP32 und Display mit 
20MHz SPI-Clock. Kurze Verbindungen sind da dann schon angebracht, keine 
langen Dupont-Strippen.
https://www.amazon.de/Washati-Breadboard-Strommodul-Steckverbindern-Steckbr%C3%BCcken/dp/B00MQTFM60/ref=sr_1_5_sspa?ie=UTF8&qid=1538419368&sr=8-5-spons&keywords=steckbrett+verbinder+set&psc=1
als Beispiel: das Verbinderset in der Plasteschachtel ist gut, die 
flexiblen Verbinder sind Garantie für Fehler...
Das Steckbrett auf dem BGild mag ich auch nicht.

https://www.amazon.de/com-four-Breadboard-MB102-Steckplatine-Anschlusskontakten/dp/B01FMKZQAG/ref=sr_1_63?s=ce-de&ie=UTF8&qid=1538419577&sr=1-63&keywords=elektronik+steckbrett
diese Bauform hat mir bisher kaum Probleme bereitet.

Gruß aus Berlin
Michael

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.