Forum: Mikrocontroller und Digitale Elektronik MCP23S17 Bit für Bit auslesen


von Dirk S. (thetuner)


Lesenswert?

Hallo werte Kollegen,

ich stehe mal wieder auf dem Schlauch…
Ich habe mehrere MCP23S17 und möchte diese Bit für Bit auslesen und dann 
Integer Werte (0 bzw 1 )in einem Array ablegen um diese zu bearbeiten um 
sie später auf andere MCP´s zu schreiben.
Hier habe ich natürlich auch wider das Problemchen diese Integer wider 
zusammenzusetzen und zu schreiben…

Die Programiersprache ist C für den MBED.

Hat mir jemand einen Lösungsansatz?

Mit Bits und Bytes kenne ich noch gar nicht aus, seid also nachsichtig 
mit meiner Unkenntnis.

In diesem sinne Danke ich euch für eure Hilfe

Euer Dirk

: Bearbeitet durch User
von NichtWichtig (Gast)


Lesenswert?

Schau Dir an was SPI bedeutet und wie es im MCP23S17 realisiert ist.

Stichwort: Es werden immer komplette Ports eingelesen, A, B oder A und B

Auch das Schreiben erfolgt Byteweise.

Falls Du Port A UND Port B als Inputs konfiguriert hast kannst Du beide 
in einem 4 Byte Zyklus einlesen wenn der Registercounter auf 
AutoIncrement steht.

von Axel S. (a-za-z0-9)


Lesenswert?

Dirk S. schrieb:
> Ich habe mehrere MCP23S17 und möchte diese Bit für Bit auslesen und dann
> Integer Werte (0 bzw 1 )in einem Array ablegen

Das ist doch Unsinn. Diese IC werden über SPI angeschlossen, das ist auf 
einer gewissen Ebene in der Tat "Bit für Bit". Allerdings mit

> Programiersprache ist C

kriegst du aus dem SPI immer nur Worte von 8 (oder mehr, hängt vom µC 
ab, den du nicht nennst) Bits raus. Wenn du die in Einzelbits zerlegen 
willst, kannst du das natürlich tun. Auch wenn es mir wenig sinnvoll 
erscheint.

> Mit Bits und Bytes kenne ich noch gar nicht aus, seid also nachsichtig

Warum soll ich nachsichtig sein, wenn du - statt an deiner Unkenntnis zu 
arbeiten und etwas zu lernen - hier im Forum Fragen stellst, deren 
Antwort du in praktisch jedem C-Lehrbuch nachlesen könntest? Soll ich 
wirklich glauben, daß du eine Antwort lesen und dir Mühe geben wirst sie 
zu verstehen, wenn du die gleiche Antwort anderswo nicht lesen willst?

Na egal, lies hier: Bitmanipulation

von Veit D. (devil-elec)


Lesenswert?

Hallo,

@ TO:

du musst wissen was für dich besser ist. Willst du wirklich Bit für Bit 
auslesen und schreiben, dann geht das nur mittels Bit-Banging. Sprich 
ohne die SPI Hardwareeinheit des µC.

Möchtest du das der SPI Hardwareinheit überlassen, dann kannst du nur 
Byteweise lesen und schreiben. Natürlich auch mehrere Bytes 
hintereinander. Dann kannst du hinterher (bzw. vorher) die Bits 
aussortieren (bzw. einsortieren).

Ich würde sagen, versuche es erstmal mit Bit-Banging, weil das erstmal 
einfacher ist. Du musst erstmal nichts konfigurieren. Wenn das läuft, 
machste das nochmal mit der SPI Hardwareinheit, dann biste "of Speed". 
:-)

von Einer K. (Gast)


Lesenswert?

Dirk S. schrieb:
> Hat mir jemand einen Lösungsansatz?

1. C lernen
2. Wikipedia SPI Artikel lesen und verstehen
3. Datenblatt des MCP lesen und verstehen
4. Datenblatt des verwendeten µC lesen und verstehen

Natürlich könnte ich jetzt die Punkte 1 bis 4 durchführen.
Aber das hilft dir nicht aufs Pferd.
Keinen Millimeter.

Denn: Selber lesen, macht selber schlau.

von Philipp K. (philipp_k59)


Lesenswert?

So wie ich es verstanden habe geht es dem TO um eine einfache 
Bit-Manipulation..

also zum Beispiel, zum Array:
1
int bitarray[8]={0,0,0,0,0,0,0,0};
2
byte x= MCP.getIOPortA();
3
4
for(int i=0;i<8;i++)
5
 {
6
     if(((1 << i) & x)!=0)
7
     bitarray[i]=1;
8
}

: Bearbeitet durch User
von Maxim B. (max182)


Lesenswert?

Alles einfach. Jeder Datenaustausch mit MCP23S17 braucht 3 bytes per 
SPI.
CS runter - IC-Adresse mit bit wr/rd + Register-Adresse + Date (lesen 
oder schreiben) - CS rüber. Byte lesen, erwünschte bit ändern, byte 
zurück schreiben. 3x 3 bytes pro bit. Wenn man nicht gleich alle 8 
manipulieren will.

Es kann auch sinnvoll sein, Variablen, byte pro MCP23S17-Register, zu 
deklarieren und dort aktuelle Zustand von MCP23S17-Port lagern. Dann 
braucht man nur in var etwas zu ändern und dann per SPI schreiben (außer 
wenn man Pin-Eingang zu lesen braucht). Ähnlich wie mit HC595. Das geht 
3x so schnell als mit Lesen.

: Bearbeitet durch User
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.