Forum: Mikrocontroller und Digitale Elektronik Peripheral Pins Select PPS beim 18ner PIC


von BL (Gast)


Lesenswert?

Hallo,

beim PIC gibt's ja nun (auch) diese PIN-Auswahl. Ich finde dazu leider 
keine kurze und schnell nachvollziehbare Beschreibung zu. Man kann ins 
Datenblatt schauen -tu ich auch- aber das ist da doch etwas sehr 
verwirrend. Kennt jemand eine Literatirstelle, wo man mal kompakt 
nachlesen könnte, wie man beispielsweise beim PIC18F06Q40 den SCL und 
den SDA untereinander vertauscht? Oder könnte das hier jemand mal kurz 
beschreiben, einfach welches Register wie zuerst, welches dann etc.?

Besten Dank im Voraus!

von M. Th. (Gast)


Lesenswert?

Hallo BL
Soweit mir bekannt ist kann man SCL U. SDA nicht mit anderen Pins 
tauschen weil SCL U. SDA bidirectonale Pins sind und diese Funktion 
nicht an allen Pins zur Verfügung steht.
M. Th.

von Manfred T. (mth09)


Lesenswert?

M. Th. schrieb:
> Hallo BL
> Soweit mir bekannt ist kann man SCL U. SDA nicht mit anderen Pins
> tauschen weil SCL U. SDA bidirectonale Pins sind und diese Funktion
> nicht an allen Pins zur Verfügung steht.
> M. Th.

Schau Dir auch mal das Blockdiagramm an. Dort sieht man die interne 
Logic der Pins. SCL U. SDA werden von den internen FETs nach
Masse gezogen u. von der internen Logik getrennt verarbeitet. Ein Tausch 
ist deshalb nicht vorgesehen.

von Frank K. (fchk)


Lesenswert?

BL schrieb:

> beim PIC gibt's ja nun (auch) diese PIN-Auswahl. Ich finde dazu leider
> keine kurze und schnell nachvollziehbare Beschreibung zu. Man kann ins
> Datenblatt schauen -tu ich auch- aber das ist da doch etwas sehr
> verwirrend.

Ähn, nein.

PPS funktioniert so:

Ausgangssignale:
1. Such Dir einen Pin aus, den Du mit einem Signal belegen willst, z.B. 
RB4
2. Such Dir auf Seite 335 (21.9 Register Summary: Peripheral Pin Select 
Module) das zugehörige Register raus -> RB4PPS
3. Such Dir auf Seite 328/329 (Table 21-2. PPS Output Selection Table) 
das passende Signal raus, z.B. I2C1_SDA und merke Dir den Wert in der 
ersten Spalte (RxyPPS) -> 0x22
4. Schreib den gemerkten Wert ins passende PPS-Register -> RB4PPS=0x22;
5. erledigt.

Eingangssignale:
1. Such Dir auf Seite 327/328 das zu mappende Eingangssignal raus (z.B. 
I2C1 Data) und merke Dir das zugehörige Register in Spalte 2 -> 
I2C1SDAPPS
2. Such Dir auf Seite 335 (21.9 Register Summary: Peripheral Pin Select 
Module) das zugehörige Register raus -> I2C1SDAPPS
3. Such Dir einen Pin aus, den Du mit einem Signal belegen willst, z.B. 
RB4
4. Bits 5..3 des Registers sind auf den Port zu setzen: (A=000, B=001, 
C=010), für RB4 also 0b001
5. Bits 2..0 enthalten das Portbit, bei RB4 also 0b100=4
6. In das Register muss also der Wert 0b00'001'100 =0x0c geschrieben 
werden
-> I2C1SDAPPS=0x0c;
7. fertig.

Natürlich musst du die PPS-Register vorher unlocken, aber das steht ja 
im Datenblatt.

Bei bidirektionalen Signalen wie I2C musst Du sowohl die 
Eingangsrichtung als auch die Ausgangsrichtung programmieren, und zwar 
so, dass beide zueinander passen.

So funktioniert das bei allen 8 und 16 Bit PICs mit PPS.

fchk

: Bearbeitet durch User
von Wolfgang W. (Gast)


Lesenswert?

Zu den PIC18F06Q40 habe ich Vorabbemerkungen:

Die neuen PIC18F06Q40 und ...Q41 haben meines Wissens keine 
Unterstützung durch Include-Files des bisherigen Assemblers, der bis 
MPLABX 5.35 dabei war.
D. h. wenn Du mit diesem Assembler unterwegs bist, bleibt Dir z. B. nur 
ein eigenes Inlude File aus z. B. P18F26Q43.inc zu editieren. Ich habe 
das für einen PIC18F16Q41 gemacht.

Nun zu Deiner PPS-Frage (stammt aus einem Source File für PIC18F16Q41):

  Ursprünglich:

  MOVLW  010000B    ; REDIRECT INPUT RC0 TO I2C1 SCL
  MOVWF  I2C1SCLPPS
  MOVLW  010001B    ; REDIRECT INPUT RC1 TO I2C1 SDA
  MOVWF  I2C1SDAPPS

  MOVLW  100001B    ; REDIRECT OUTPUT I2C1 SCL TO RC0
  MOVWF  RC0PPS
  MOVLW  100010B    ; REDIRECT OUTPUT I2C1 SDA TO RC1
  MOVWF  RC1PPS


  oder vertauscht:

  MOVLW  010000B    ; REDIRECT INPUT RC0 TO I2C1 SDA
  MOVWF  I2C1SDAPPS
  MOVLW  010001B    ; REDIRECT INPUT RC1 TO I2C1 SCL
  MOVWF  I2C1SCLPPS

  MOVLW  100010B    ; REDIRECT OUTPUT I2C1 SDA TO RC0
  MOVWF  RC0PPS
  MOVLW  100001B    ; REDIRECT OUTPUT I2C1 SCL TO RC1
  MOVWF  RC1PPS

Da die Pins RC0 und RC1 speziell schon Vorkehrungen bezüglich Pegel und 
Pull-up haben, gehe ich davon aus, dass Du nur SCL und SDA vertauschen 
willst.

MfG Wuff_W

von Wolfgang W. (Gast)


Lesenswert?

Du hattest nach weiterer Literatur gefragt. Hier gibts Infos zu den 
neuen I2C_Interfaces, wie in den PIC18F06Q40:
http://ww1.microchip.com/downloads/en/DeviceDoc/MSSP-to-the-Stand-Alone-I2C-Module-Migration-40002020A.pdf
Ansonsten ist im Datenblatt alles gut beschrieben.

MfG Wuff_W

von BL (Gast)


Lesenswert?

Moin,


allerbesten Dank für die Antworten! Ihr habt mir sehr geholfen. Ich zieh 
mir das jetzt mal in aller Ruhe rein und dann sehen wir mal, ob ich es 
hinkriege. Falls ich noch eine speziellere Frage hab, würde ich mir 
diese hier noch mal erlauben.

Ich mach das übrigens im XC8. Dazu mußte ich den MPLAB X erst auf 
Version 5.50 upgraden. Mit 5.30 hat er den IC nicht gekannt. Ich will 
das mit dem MCC machen und bin erst in dem Stadium, den richtig 
einzustellen. Ich hatte vorher einen PIC16F15325 eingesetzt und dafür 
die Software auch fast fertig. Aber die 7kB Flash sind bei dem einfach 
zu wenig. Deshalb wollte ich den 18F06Q40 einsetzen.

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.