Hallo Leute, Ich kämpfe gerade mit einem komischen Effekt den ich mir noch nicht so ganz erklären kann und hatte gehofft jemand von euch kann mich vielleicht auf die richtige Fährte bringen. An meinem PIC42FJ16GA ist über die SPI Schnittstelle ein ADC (AD7680) angeschlossen, der mir die Werte eines analogen Drucksensors wandelt. Liegt am Sensor kein Druck an, liefert mir dieser eine Offsetspannung von ca. 0.8V. Der Wert den mir der ADC liefert entspricht (mit etwas rauschen) ziemlich genau diesen 0.8V (um 2 Positionen geschiftet). Erhöhe ich nun den Druck auf den Sensor, steigt die Spannung von 0.8V auf 1.6V an (Test mit 2bar Druck). Der Wert den mir der ADC liefert (mit Oszilloskop betrachtet) entspricht zwar diesen 1.6V aber die Werte die im SPI Buffer liegen sehen ganz anders aus. Es scheint als schieben sich die Daten im Buffer immer mehr nach links, je höher der ausgegebene Wert ist. Ich muss dazu noch erwähnen, dass ich das Chip Select Signal "manuell" steure, da ich mehr als 16 Bit über SPI einlesen möchte. Der Ablauf in meiner SPI Interrupt Subroutine sieht dann wie folgt aus: - CS auf Eins setzen (ADC Sampling beenden) - SPI Interrupt Flag auf Null setzen - SPI Buffer solange auslesen, bis keine Daten mehr vorhanden sind -> while(SPI2STATbits.SRXMPT == 0) - Daten werden verarbeitet - CS auf Null setzen (nächster ADC Sample wird gestartet) - 3 Dummybyte in SPI Buffer schreiben um den nächsten Wert einzulesen (3, weil ich 24 Bit einlesen möchte) Ich bin mir nicht sicher ob ich im Ablauf meiner Subroutine noch einen Fehler drin habe oder ob die SPI Schnittstelle mir hier einen Strich durch die Rechnung macht. Hat jemand eine Idee wie sich dieser Effekt ergeben kann?
Ich dachte, CS müßte auf low (0) gesetzt werden, um einen Transfer einzuleiten. Von daher verstehe ich den Algorithmus nicht so ganz.
Das ist richtig. Wird die Interrupt Subroutine ausgelöst, wurde auf der SPI Schnittstelle gelesen/geschrieben. Als erstes setze ich also, am Anfang der ausgelösten Interrupt Subroutine, CS auf high (1) (lesen/schreiben ist ja jetzt beendet). Ich kann jetzt die Daten in der Subroutine zum weitersenden verarbeiten. Um den Lese-/Schreibvorgang erneut zu initialisieren setze ich am Ende der Subroutine das CS wieder auf low (0) und schreibe in den Buffer um so den nächsten Lese-/Schreibvorgang auszulösen. Die Interrupt Subroutine wird nach Beenden dieses Vorgangs erneut ausgelöst.
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.