Problem mit PIC-Controller

Hallo!

Ich war sehr unsicher, was die Wahl des Brettees betrifft; Alternativvorschläge sind daher willkommen.

Ausgangslage: Eine kleine Schaltung mit einem dsPIC33FJ12GP201. Der Controller hat nur 28 Pins und verwendet das wohl recht neue Mapping mit „Peripheral Pin Select“. Ich möchte mit dem Gerät per SPI kommunizieren und betreibe es als Slave. Natürlich möchte ich das integrierte SPI-Modul verwenden. Programmiert wird mit MPLAB unter C.

Was funktioniert: Ich habe die entsprechenden Pins zugeordnet und kann auch Daten an den Master übertragen.

Das Problem: Wenn ich Daten vom Master übertragen will, wird zwar das Flag SPIRBF gesetzt, der Wert in SPI1BUF ist jedoch stets 0, egal, was ich sende. Die Signale sehen am Oszilloskop richtig aus.

Meine Überlegungen: Mir scheint es, dass die Signale zwar am Pin richtig ankommen, von dort aber nicht an das SPI-Modul weitergegeben werden. Da ich den Pin (Ich habe zwischenzeitlich auch einen anderen Pin versucht) richtig gemappt ist, kann eigentlich nur eine andere Funktion mit höherer Priorität auf dem Pin aktiviert sein. Laut Datenblatt kommt dafür nur ein Analog-Eingang in Frage. Ich benutze aber nur einen Analog-Eingang, der natürlich auf einem anderen Pin liegt und nur dessen Bit in AD1PCFGL gesetzt. Außerdem habe ich den ADC zunächst gar nicht eingeschaltet. Folgende Funktionen sind für den Pin 15 angegeben: RP14, AN7, CN12, RB14.

Habt Ihr noch eine Idee, wo es hängen könnte??
Vielen Dank schonmal!

Gruß,
Arndt

Hallo,

mögliche Ursache: bei vielen Controllern sind die Ausgänge open drain und mit dem Eingang zusammengeschaltet - d.h. um einen Pin als Eingang zu benutzen, muss im Ausgangsregister 1 stehen, sonst wird der Pin auf GND festgehalten.

Gruss Reinhard

Hallo Reinhard,

Danke für Deinen Tipp!
Das Problem ist mir schon öfter begegnet, und darauf hatte ich schon geachtet.
Die Lösung kam heute Morgen per Mail von Microchip: Im Datenblatt ist das Verhalten des Registers AD1PCFGL, das die Verwendung der Pins als digitale I/O oder AD-Eingänge steuert, falsch beschrieben. Man muss die entsprechenden Bits auf 0 setzen, für einen Analog-Eingang. Im Ref.-Man. ist es richtig beschrieben.
Also habe ich den Wert einfach negiert, und es läuft! :smile:

Gruß,
Arndt