Schönen guten Abend,
ich habe mir vor kurzem vorgenommen, für den MCP23017 mir eine eigene
Library zu schreiben, da ich auch verstehen möchte, wie der Chip
angesprochen wird, habe bis dato die Library von der Seite benutzt:
http://arduino.alhin.de/index.php?n=83
klappt soweit auch ganz gut aber wie gesagt, ich möchte es selber
schreiben.
ich habe soweit auch alles hin bekommen, nur ich bekomme einen
eigentlich ganz simplen befehl nicht hin:
in der vorhandenen Lib ist es so:
1
mcp.digitalWrite(i,HIGH);
wenn man den pin i high schalten möchte
ich bekomme es nur so hin:
1
Wire.write(0x12);// GPIOA
1
Wire.write(i);// port A
aber damit schalte ich ja alle ports bzw schalte ich die ports quasi
binär auf die werte 0 - 255
wie aber bekomme ich es aber hin, es nicht binär sondern einen pin zu
schalen, ohne andere pin werte abzufragen / ein zuberechen bzw zu
beeinflussen.
ich habe mir die fertige Library angeguckt aber werde nicht schlauer,
wie die es gemacht haben. eigentlich muss doch jeder pin ne eigene
adresse haben, oder sehe ich das falsch.
Bei Arduino gehts auch ohne Wissen über den uC. Irgendwo steckt sicher
die Bitmanipulation, sie ist für dich aber nicht sichtbar.
Ich kenne den MCP nicht, wenn er keine Funktion zum setzen einzelner
Bits hat würde ich den MCP auslesen, das Bit ändern und die geänderten
Daten wider zurückschreiben.
Max H. schrieb:> Bei Arduino gehts auch ohne Wissen über den uC. Irgendwo steckt> sicher die Bitmanipulation, sie ist für dich aber nicht sichtbar.> Ich kenne den MCP nicht, wenn er keine Funktion zum setzen einzelner> Bits hat würde ich den MCP auslesen, das Bit ändern und die geänderten> Daten wider zurückschreiben.
Ich bin mir nicht sicher, da ich beim Datenblatt leichte Probleme habe.
Gibt's hier den niemand, der den MCP einsetzt?
Die Lösungen, die ich bislang gesehen hab, merken sich die komplette
Belegung der Ausgänge als lokalen Zustand (z.B als data member in der
Klasse), manipulieren diese mittels der angesprochenen
Bitmanipulationen, und schreiben den kompletten lokalen Zustand der
Ausgänge dann per SPI in den MCP27017. Man könnte den Zustand auch
abfragen, manipulieren und zurückschreiben, das dauert aber länger und
ist unnötig.
Hilft Dir das weiter?
Tomske
Bitmanipulation ist die gängige Methode. Nur weil du das bei deinem
Arduino-Code nicht sehen kannst, heißt das noch lange nicht, dass das
nicht genauso gehandhabt wird. Ruf mal die Funktion auf, dann siehst du
wie sie funktioniert. Ich bin mir ziemlich sicher, dass dort nichts
anderes gemacht wird.
tomske schrieb:> Die Lösungen, die ich bislang gesehen hab, merken sich die> komplette> Belegung der Ausgänge als lokalen Zustand (z.B als data member in der> Klasse), manipulieren diese mittels der angesprochenen> Bitmanipulationen, und schreiben den kompletten lokalen Zustand der> Ausgänge dann per SPI in den MCP27017. Man könnte den Zustand auch> abfragen, manipulieren und zurückschreiben, das dauert aber länger und> ist unnötig.
1. Ob man eine lokale Variable manipuliert oder den Wert eines
Port-Register sieht macht keinen Unterschied im Code.
2. Ob man eine lokale Variable manipuliert oder den Wert eines
Port-Register sieht macht keinen zeitlichen Unterschied. Vom
Port-Register hat man den Wert genau so schnell, wie vom RAM, eventuell
sogar schneller.
Flex schrieb:> void Adafruit_MCP23017::digitalWrite(uint8_t p, uint8_t d) {>> [ ... ]>> // set the pin and direction> if (d == HIGH) {> gpio |= 1 << p;> } else {> gpio &= ~(1 << p);> }>> [ ... ]>> }
Rate mal, was das ist ;)
Edit: Ok, mir war nicht klar, dass es hier um einen Portexpander geht.
Dann spart eine Variable mit dem Port-Inhalt natürlich schon Zeit, aber
um Bitmanipulation kommst du nicht rum.
> 2. Ob man eine lokale Variable manipuliert oder den Wert eines> Port-Register sieht macht keinen zeitlichen Unterschied. Vom> Port-Register hat man den Wert genau so schnell, wie vom RAM, eventuell> sogar schneller.
Die Port-Register, um die es geht, sind im MCP23017. Also kann man den
Baustein per SPI befragen, welche Belegung die Ausgänge gerade haben,
dann den gewünschten Ausgang lokal manipulieren und das Ergebnis zurück
auf den Baustein senden (wieder per SPI).
Ich sehe diese Schritte im Code oben wieder:
1
// read the current GPIO output latches
2
...
3
// set the pin and direction
4
...
5
// write the new GPIO
Das Auslesen kann man sich sparen, weil man in der Regel lokal auf dem
Prozessor wissen kann (wenn man sich den Zustand merkt), wie die
Ausgänge stehen.
Grüße
Tomske