Hallo,
Wiso labelst du Pin38 als CS?,ist der Mega nicht an Pin 53 (laut Datenblatt) gebunden?
Wenn man nur ein einziges SPI Gerät am SPI Bus hat, kann man den Pin53 verwenden. Aber jedes SPI Gerät benötigt seinen eigenen Chip-Select Pin. Sonst wird das nichts. Sonst reden alle durcheinander auf der Leitung. Aber egal ob man Pin53 nutzt oder nicht, der muß unbedingt als Ausgang definiert sein. Wenn man das Hardware SPI nutzt. Wenn man kein Hardware SPI nutzt, kann man ihn für sonstwas verwenden.
Der Part, in welchem der MCP3550 als long deklariert wird:
Was passiert mit der variable "value", die den Wert Null erhält? Sehe ich das nur nicht, oder wird darauf tatsächlich nicht mehr zurückgegriffen?
Das übersiehst Du.
Das ist in der eigentlichen Funktion.
In der Variablen value landet am Ende der reine ausgelesene Rohwert vom SPI Gerät. Immer beim Aufruf der Funktion wird diese vorbeugend genullt. Es werden 3 einzelne Bytes vom SPI Bus gelesen. Danach wird jedes Byte an Ort und Stelle gerückt wo es hingehört und mit ODER zusammengesetzt und das ganze Gebilde wird in value gespeichert und dann mit return zurück an die aufrufende Funktion in loop geliefert.
Wenn "MISO == HIGH" gelten soll, muss der Pin dann nicht entsprechend angesteuert werden?,oder werden Input Pins generell durch angeklemmte Sensoren auf High gesetzt?
Du meinst
while(digitalRead(MISO) == HIGH) ....
MISO wird am Anfang als Input definiert. Mit digitalRead lese ich den Zustand ein. Einen Eingang kann man nicht mit High oder Low ansteuern. Es ist ein Eingang und kein Ausgang. Beim Eingang bin ich abhängig was mir irgendwer, ob ein Taster oder hier das IC, für ein Signal liefert. Das muß man abfragen und entsprechend darauf reagieren. Solange das Signal in dem Fall High ist, wird eine extra 1ms lang gewartet. Bei Low gehts weiter mit der Code Abarbeitung.
Vielleicht übersiehst Du etwas anderes. Der Operator == ist nicht das gleiche wie =.
Mit = übergibt man einen Wert zum Bsp. einer Variablen. x = 10; Die Variabel x hat nun den Wert 10 gespeichert.
Mit x == 10; vergleiche ich ob die Variable den Wert 10 hat.
Das ist ein großer Unterschied. Aber keine Sorge, damit hat wohl jeder Probleme gehabt. Später weis man das einfach wenn man sowas sieht. Beim Code schreiben kommt es jedoch immer wieder mal vor das man statt == nur = tippt und sich wundert das der Code nicht funktioniert. Dann kommen unzählige Serial.print() Befehle rein zum debuggen. ![]()
Arbeite erst seit Anfang des Monats mit Arduino und muss gerade festellen wie schnell das Ganze an Komplexität zulegt, je mehr man damit versucht.
Das ging mir genauso. Aber das wird mit der Zeit. Manchmal eine Pause einlegen tut auch gut um wieder das große Ganze zu sehen.
Nach ca 1 Jahr fange ich nun an eigene Funktionen zu schreiben. Hätte ich mir auch nie träumen lassen. Der nächste Plan ist die Funktion in eine Library zu verpacken. Mal sehen ob das klappt.
Übrigens findest Du die aktuelle Funktion zum MCP3550 hier:
http://forum.arduino.cc/index.php?topic=242576.new;topicseen#new
Man muß nur die Spannung an AREF dem Funktionsaufruf mit übergeben in mV. Falls man einen schnelleren MCP3550... hat, kann man in der Funktion das delay(80) der Convertion Time entsprechend verkürzen. Diese Zwangspause möchte ich auch noch wegbekommen. Mit der Funktion werden nun postive und negative Spannungswerte ausgegeben. Kommt ja darauf an was zwischen Vin+ und Vin- für eine Differenz anliegt.
Alles klar?