Sterrenhemel

Dit topic is gesloten

Bavelt

Golden Member

Ik denk ik doe het anders.

Ik laat de I2C even achterwege en probeer of ik SPI2 aan de praat kan krijgen (dan kan ik later altijd nog I2C1 er aan toevoegen).

Maar dat lukt me niet.

Ik heb:

pic basic code:

 Dim
    SCKPin        As sbit at PORTB.1          'pin 22  SCK - SPI1
    SDOPin        As sbit at PORTB.2          'pin 23  SDO - SPI1

TRISB      = %00010010         

RB2PPS     = 0x17                             'Transfer SDO2 to B.2

Unlock_IOLOCK()
PPS_Mapping(_RB2, _OUTPUT, _SDO2)
Lock_IOLOCK()                                  

spi2_remappable_Init()
---
---
---

Ik gebruik voor SCK2 de default pin (b.1).
Dan de SDO2 (0x17) naar pin B.2
(staat wellicht dubbel in het programma)

Vervolgens de spi2_Remappable routines zoals Init en write, etc.

Maar dit gaat niet goed (matrixen doen niks /raar).

Wat zit hier nu fout?

Fouten zijn het bewijs dat je het probeert..
Bavelt

Golden Member

Op 15 januari 2021 15:42:05 schreef Arco:
Voor de SPI moet je dan ook de remappable functies gebruiken...
Als je een output wilt remappen die al ergens aan vast zit, moet je die oude pin ook weer 'unmappen':

pic basic code:


Unlock_IOLOCK()
PPS_Mapping(_RB1, _OUTPUT, _NULL) 'Unmap RB1
Lock_IOLOCK()

Paramater NULL kent de compiler niet (staat wel in de help genoemd bij deze functie)...

Fouten zijn het bewijs dat je het probeert..
Bavelt

Golden Member

Na alle geëxperimenteer en bijna een volle dag met SPI bezig ( ;(), even terug naar de basis.
Terug naar een werkend programma, met SPI1.

Daar zit de SCK op Port C.3 en de SDO is naar B.2 geschoven.
Dit alles werkt met de SPI1_Init (de 'gewone').

Dus dacht ik: nu ga ik alleen de Clock, SCK1 verhuizen naar een andere pin, bijvoorbeeld C.1
Dan zou alles gewoon moeten werken.
(het nare is wel dat wanneer je SCK verhuist, de SCl ook 'meegaat'. Die zijn niet gescheiden.)

RC1PPS = 0x14

Maa dat wil niet werken...Dan doet de SPI niks.

Fouten zijn het bewijs dat je het probeert..
Arco

Special Member

Paramater NULL kent de compiler niet (staat wel in de help genoemd bij deze functie)...

Dan vul je gewoon '0' in... (help klopt vaak niet, wordt niet goed bijgehouden schijnbaar...)
Dat SCK en SCL tegelijk verhuizen is logisch, het is 1 module (en je gebruikt er toch maar eentje van de twee)

[Bericht gewijzigd door Arco op vrijdag 15 januari 2021 18:10:30 (22%)

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
Bavelt

Golden Member

Ik wilde ze gewoon scheiden, om geen afhankelijkheid meer te hebben. Maar Ok. ze zitten bij elkaar.

Blijft het probleem dat ik de SCK1 niet kan verhuizen (de SDO1 wel, maar die heeft geen standaard pin, die moet wel worden geremapped).
Lastige materie dit..

Fouten zijn het bewijs dat je het probeert..
Bavelt

Golden Member

Het laat me nog niet los.. ;(

Het vreemde is dat SPI1 werkt met:
- De default SCK1 op RC3
- SDO1 naar RB2 met

pic basic code:

RB2PPS  = 0x15

Maar SPI2 niet met:
- Default SCK2 op RB1
- SDO2 naar RB2 met

pic basic code:

RB2PPS  = 0x17

Dat zou toch gewoon moeten werken?
:?

Fouten zijn het bewijs dat je het probeert..
Bavelt

Golden Member

Eureka... :)

Ik dacht laat ik de SCK2 maar eens naar bv RC2 brengen.
En dan doet-ie het wel...

Rara..

Fouten zijn het bewijs dat je het probeert..
Bavelt

Golden Member

Te vroeg gejuigd...
SPI2 doet het weliswaar op de verhuisde pin. Maar als ik dan I2C1 erbij in zet, dan bijt het elkaar weer... :(

Zou het misschien beter zijn om, nu die SPI en I2C niet naast elkaar werkend te krijgen zijn, bv gebruik te maken van I2C via de MSSP (hardware dus) en Software I2C?

Fouten zijn het bewijs dat je het probeert..
Bavelt

Golden Member

Wat ik bedoel met 'elkaar bijten' is het nu zo dat de I2C1_INIT() en de SPi elkaar verdragen.

Het gaat bij de I2C mis bij:

pic basic code:

'========================================================================================
 Sub procedure Read_DS3221()                         'Read Date in RTC registers
'========================================================================================
  While Not (I2C1_Is_Idle) Wend
  I2C1_Start()
  I2C1_Wr(0xD0)
  I2C1_Wr(0x00)
  I2C1_Repeated_Start()
  I2C1_Wr(0xD1)
  Time[0] = Bcd2Dec(I2C1_Rd(1))
  Time[1] = Bcd2Dec(I2C1_Rd(1))
  Blink(3)
  Time[2] = Bcd2Dec(I2C1_Rd(1) And 0x3F)
  Time[3] = Bcd2Dec(I2C1_Rd(1))
  Time[4] = Bcd2Dec(I2C1_Rd(1))
  Time[5] = Bcd2Dec(I2C1_Rd(1) And 0x7F)
  Time[6] = Bcd2Dec(I2C1_Rd(0))
  I2C1_Stop()
 End Sub

Bij de eerste 'read': Time[0] = Bcd2Dec(I2C1_Rd(1)) Blijft de controller hangen...

Fouten zijn het bewijs dat je het probeert..
Arco

Special Member

Natuurlijk kan het werken, i2c in software moet je niet willen als het niet echt moet...
heb je wel alles goed gezet?

pic basic code:


- RxxPPS     = 0x14    'map pin to SCL1 (output)
- RxxPPS     = 0x15    'map pin to SDA1 (output)         
- SSP1CLKPPS = yy      'map SCL1 to pin (input)
- SSP1DATPPS = yy      'map SDA1 to pin (input)  
- RC3PPS     = 0       'unmap SDA1 from RC3 
- RC4PPS     = 0       'unmap SCL1` from RC4

xx = poortnaam (A1, A2,...) en yy de poortwaarde uit de tabel

Je moet ook wel alle remappable i2c functies gebruiken (zoals I2C1_remappable_wr() ) als je de pinnen remapped, anders gaat het geheid fout...

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
Bavelt

Golden Member

Ik heb de I2C niet gemapped, omdat ik gebruik maak van de default pinnen:

SCL1 zit op RC3, pin 14
SDA1 zit op RC4, pin 15

Beide met 4k7 Pullup naar de + 5V
Tris op Input.

(Alleen de SPI is gemapped. Daar gebruik ik ook _Remappable_ routines en dat werkt wel).

Ik heb even het SPI er uit gehaald om alleen de I2C1 te testen.
En met een ledje te kijken hoe ver hij komt.

Door

pic basic code:

While Not (I2C1_Is_Idle) Wend

komt hij niet heen...

Haal ik deze weg, dan hangt hij op de eerste de beste I2C1_Rd().

Fouten zijn het bewijs dat je het probeert..
Arco

Special Member

Met een scoop (of je LA) kun je controleren of de i2c signalen op de juiste pinnen naar buiten gaan...

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
Bavelt

Golden Member

Dat wilde ik al net vragen...

Wat zou ik op de scope moeten zien als het goed gaat?

De Clock? De I2C1 wordt toch eventjes aangeroepen?

Fouten zijn het bewijs dat je het probeert..
Arco

Special Member

Ja, op de clockline zie je de clockpulsen, en op de dataline de data (laag of hoog).
Scoop kun je laten triggeren op neergaande flank.

Ik doe dat altijd met scoop of LA in moeilijke gevallen, anders wordt 't een eindeloze zoektocht.
('t is nu met proberen in code net alsof je een vlieg probeert dood te slaan in een donkere kamer... ;) )

[Bericht gewijzigd door Arco op zaterdag 16 januari 2021 00:22:09 (44%)

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
Bavelt

Golden Member

Ik zie de clockpulsen als ik de 'While Not (I2C1_Is_Idle) Wend' weghaal...

Met een duty-cycle van 5,5 uS

Correctie: 11 uS

Datalijn is hoog..

Fouten zijn het bewijs dat je het probeert..
Bavelt

Golden Member

Is de frequentie van I2C1_Init trouwens nog van invloed? (Staat nu op 100000)

pic basic code:

I2C1_init(100000)                                            'Init i2c1 port 100kHz

Ik heb al gezien dat de clockpulsen hierdoor worden aangepast.
Dit is dus de frequentie van de INIT()

[Bericht gewijzigd door Bavelt op zaterdag 16 januari 2021 00:40:29 (22%)

Fouten zijn het bewijs dat je het probeert..
Bavelt

Golden Member

Maar het feit dat hij niet 'idle' is (en ook niet komt) geeft toch al aan dat er iets niet deugt?

Fouten zijn het bewijs dat je het probeert..
Bavelt

Golden Member

Vandaag toch maar weer eens de draad opgepakt

Omdat het probleem zich manifesteert rond de I2C van deze PIC, heb ik een nieuw zeer klein programmaatje gemaakt:

pic basic code:

Program TestI2C
  Dim Time         As Byte[7]
  SCLPin           As sbit at PORTC.3          'pin 14   SCL - I2C1
  SDAPin           As sbit at PORTC.4          'pin 15  SDA - I2C1

 Main:


  ANSELC     = %00000000
  TRISC      = %00011000                       'C3, C4 Input
  OSCTUNE    = %00001111                       '32MHz internal

  I2C1_Init(100000)
  While True Wend
 End.

Dit gaat meteen al fout bij het compileren:

"Unresolved external PPS-Mapping".

Maar er valt niks te remappen, ik gebruik gewoon de standaard SCL / SDA pin van de controller.
(C3 / C4)

Dat begint alweer lekker vandaag... :(

Fouten zijn het bewijs dat je het probeert..
Bavelt

Golden Member

Hier ben ik al achter: ik moet de Periphal_Pin_Select library aanvinken.

Maar het probleem blijft dus dat de I2C1 niet 'idle' wordt...

Fouten zijn het bewijs dat je het probeert..
Bavelt

Golden Member

Ik las nog in de errata dat er een probeem was wanneer je bij deze Pic en i2C- LF Devices meer dan 3 V gebruikt.

Maar in dit geval helpt dat ook niet...
Het probleem zit hem waarschijnlijk al vóór het schrijven, vanwege de niet-idle status).

[Bericht gewijzigd door Bavelt op zaterdag 16 januari 2021 12:59:19 (21%)

Fouten zijn het bewijs dat je het probeert..
Bavelt

Golden Member

i2c1_Is_Idle() geeft volgens MB een '1' als de bus vrij is, een 0 bij bezet.

Dat test ik met:

pic basic code:


lata.7 = i2c1_Is_Idle 

Komt keurig een '1' uit.

Maar:

pic basic code:

  
While Not (i2c1_Is_Idle) Wend

blijft in de loop hangen.
Dat kan toch niet? Hij is toch een '1'?

Fouten zijn het bewijs dat je het probeert..
Arco

Special Member

NOT is een bitwise operator: alle bits worden omgekeerd. Aangezien het resultaat een byte is, kan dat onverwachte resultaten geven. Beter zo:

pic basic code:


  
While 
  i2c1_Is_Idle = 0 
Wend
Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
Bavelt

Golden Member

Op 16 januari 2021 14:48:36 schreef Arco:
NOT is een bitwise operator: alle bits worden omgekeerd. Aangezien het resultaat een byte is, kan dat onverwachte resultaten geven. Beter zo:

pic basic code:


  
While 
  i2c1_Is_Idle = 0 
Wend

Dit werkt inderdaad.

Maar wat niet werkt en ik gewoon maar niet voor elkaar krijg is om SPI2 aan de praat te krijgen bij deze PIC 16F18857.

Dit werkt wel:

SPI1:
Clock op RC3 (default Port)
SDO1 naar RB0 met RB0PPS = 0x15
Latch naar Port B.3
Alle modulen SPI1_

Maar dit werkt niet:
SPI2:
Clock op RB1 (default Port)
SDO2 naar RB0 met RB0PPS = 0x17
Latch naar Port B.3
Alle Modulen SPI2_

In deze setting slaan de matrixen (MAX7329) op hol en knipperen maar wat..

Ik krijg er de vinger niet achter... Wat is hier nu aan de hand?

Fouten zijn het bewijs dat je het probeert..
Bavelt

Golden Member

Na wederom een dag ploeteren en zuchten, 'remappen', pinnen veranderen in elke denkbare combinatie, rest mij geen andere conclusie dat bij deze PIC16F18857 de hardwarematige I2C en SPI uit de MSSP modulen niet tegelijk kunnen worden gebruikt.
Dit in tegenstelling tot de PIC6F1847 waarbij dat redelijk moeiteloos gaat.

Ik heb er nog geen publicatie over kunnen vinden. Als ik de datasheet volgt werkt het in ieder geval niet.
(Tenzij er ergens diep in het document iets staat wat ik niet heb opgemerkt).

Daarom ben ik nu (helaas) voor één van de twee, c.q. de I2C overgestapt naar de softwarematige I2C. Dat werkte overigens meteen.

In deze setting werkt het:

pic basic code:


Dim
    SCKPin        As sbit at PORTB.7          'pin 28  SCK - SPI2
    SDOPin        As sbit at PORTB.0          'pin 21  SDO - SPI2
    Latch         As sbit at LATB.3           'pin 24  CS
    Soft_I2C_Scl  As sbit at RC3_bit          'pin 14  Soft_SCL
    Soft_I2C_SDA  As sbit at RC4_bit          'pin 15  Soft_SDA
    Soft_I2C_Scl_Direction As sbit at TRISC3_bit
    Soft_I2C_Sda_Direction As sbit at TRISC4_bit

De Sofwarematige I2C zal ongetwijfeld véél meer ruimte in beslag nemen, de keerzijde is dat deze PIC héél ruim in zijn ROM /RAM jasje zit.

Wellicht dat ik nog op een regenachtige dag er met een testprogrammaatje nog even naar kijk...

Fouten zijn het bewijs dat je het probeert..
Arco

Special Member

Als de niet werkende complete code post wil ik wel eens kijken...

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com

Dit topic is gesloten