Sterrenhemel

Bavelt

Special Member

Dank je zeer, Arco! :) :)

Hier heb ik wat aan. :) Ik kan nu verder. Sterker nog: het werkt!
Hier was ik zelf alleen niet uitgekomen.

Pff..

En wéér wat geleerd met SDI en SDO.

Dat de SDO 'los' hangt, is wel iets specifieks van deze PIC?

(Want bv bij de 1847 heeft zowel de SDI als SDO een vast pin assignment).

Man is still the most extraordinary computer of all. JF Kennedy
Bavelt

Special Member

Op 14 januari 2021 16:22:38 schreef Arco:
SDI en SDO zijn twee verschillende dingen: SDI is een input, en SDO is een output van de SPI bus...
SDO valt niks aan te verhuizen, want die zit als gezegd default nergens aan vast. Die moet je met PPS verbinden.
SDO1 naar Latb.7 bijv. is:

pic basic code:


RB7PPS = 0x15

In MikroBasic wordt dat:

pic basic code:


Unlock_IOLOCK()
PPS_Mapping(_RB7, _OUTPUT, _SDO1)
Lock_IOLOCK()

Alleen

pic basic code:


RB7PPS = 0x15

werkte ook...

Man is still the most extraordinary computer of all. JF Kennedy

Hangt ook van de Config setting van de PPS af. Meestal kun je zonder een unlock niets wijzigen...
Bij alle CPU's met een PPS hangen de outputs van peripherals los, die moet je zelf verbinden.

[Bericht gewijzigd door Arco op 14 januari 2021 16:59:33 (33%)]

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

Special Member

Ik krijg nog wel een foutmelding van de compiler:

pic basic code:

PPS_Mapping(_RB7, _OUTPUT, SDO1)

99 303 Identifier "SDO1" was not declared Test1401.mbas

Hij kent SDO1 niet.. (SDO2 wel)

Nu is het aparte dat als je goed kijkt in de datasheet, bij "SDO1" een nul staat (ipv een "O" (Oh) )".

Moet haast een typefout zijn lijkt me.

Man is still the most extraordinary computer of all. JF Kennedy

Bij mijn voorbeeld staat ook _SDO1, niet SDO1...
(en het is een letter 'O' van Output)

SDO is op zich ook altijd een verwarrend iets: ik gebruik altijd de Motorola benaming 'MOSI' in schema's, daar is geen vergissing mee mogelijk)

[Bericht gewijzigd door Arco op 14 januari 2021 17:16:47 (46%)]

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

Special Member

Heb ik ook (met underscore) in het programma.

_SDO1 kent-ie niet...

_SDO2 wel

Man is still the most extraordinary computer of all. JF Kennedy

Dan zal het wel _SDO zijn (is altijd gelijk aan _SDO1)

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

Special Member

Op 14 januari 2021 17:20:52 schreef Arco:
Dan zal het wel _SDO zijn (is altijd gelijk aan _SDO1)

Klopt. Dit pikt-ie wel...

En om het compleet te maken: Het SPI protocol kent dus een SDI (MISO) en SDO (MOSI).

Begrijp ik nu goed dat - zoals in het geval van zenden naar MAX7219, er sprake is vam alleen output (van Master naar Slave), MOSI, dus SDO.
En waneer er input moet komen van een device ("Slave"), MISO, Je de SDI pin gaat definiëren en gebruiken?

Man is still the most extraordinary computer of all. JF Kennedy

Ja,

MISO is Master In Slave Out, en MOSI is Master Out Slave In.
SDI en SDO worden vaak verschillend uitgelegd door diverse fabrikanten.

Sommigen noemen het Slave Data In/Out, anderen Serial Data In/Out.
Sommigen noemen de output (op slave en master) altijd SDO en de input SDI, en sommigen noemen de input op de master ook SDO... :(
(omdat daarop de SDO van de slave moet worden aangesloten...)

Bij bijv. GSM modules van Cinterion staat bij de uart output RX, en bij de input TX.
(daarmee bedoelen ze 'hier moeten rx en tx aangesloten worden'. Het wordt er daardoor niet veel duidelijker mee)

[Bericht gewijzigd door Arco op 14 januari 2021 17:38:27 (20%)]

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

Special Member

Nee, helemaal gelijk. Maar ik begrijp het nu veel beter. :)

Met Mikrobasic heb ik nog wel:

pic basic code:

Unlock_IOLOCK()
PPS_Mapping(_RB7, _OUTPUT, _SDO)
Lock_IOLOCK()

Dit werkt niet. De Matrix doet in dit geval niks meer.
(Toch problemen met SDO en/of SDO1?)

Doe ik alleen dit er in:

pic basic code:


RB7PPS = 0x15

Dan loopt het als een zonnetje....

Man is still the most extraordinary computer of all. JF Kennedy

Ik gebruik altijd dit, is veel korter als de MB library (die is iets van 500 bytes, deze maar 18... ;) )

pic basic code:


'========================================================================================
Sub Procedure Set_PPS()
'========================================================================================
  Asm                                                               'Unlock PPS
    movlb   61                                                      '
    movlw   0x55                                                    '
    movwf   PPSLOCK                                                 '
    movlw   0xAA                                                    '
    movwf   PPSLOCK                                                 '
    bcf     PPSLOCKED_bit                                           '
  End Asm                                                           '

  RB7PPS    = 0x15                                                  'SDO1 on pin RB7

  Asm                                                               'Lock PPS
    movlb   61                                                      '
    movlw   0x55                                                    '
    movwf   PPSLOCK                                                 '
    movlw   0xAA                                                    '
    movwf   PPSLOCK                                                 '
    bsf     PPSLOCKED_bit                                           '
  End Asm                                                           '
End Sub                                                             '

Oeps,
Bank adres nog even aangepast dat verschilt per pic. Bij de 18857 is dat 61, bij mijn 1709 was dat 28...

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

Special Member

Tjonge, je bent echt een ingewijde zeg.
Ik vraag me wel eens af waar je al die kennis vandaan haalt. Bewondering! :D
Ik ga die routine ook maar eens proberen..

(Nu heeft deze PIC heel veel ruimte, maar toch..)

De bijbehorende TRIS van de SDO moet ook als output worden gedefiniëerd merk ik. Anders doet-ie het niet.

(Ik had vroeger een keer begrepen dat je zowel I2C Als SPI de Clock en data altijd als input moest zetten...).
Dat ligt hier dan blijkbaar anders...

Man is still the most extraordinary computer of all. JF Kennedy
Bavelt

Special Member

Deze PIC kan meer, maar is tegelijk ook complexer...

Ik heb in de datasheet gekeken, en volgens mij is het aanzetten van de Timer(2) hetzelfde als bij de 1847:

pic basic code:

PR2        = 49                                             'Timer load value
 GIE_bit    = 1                                              'Enable timer irq
 PEIE_bit   = 1
 TMR2IE_bit = 1                                              'Enable Timer1 overflow interrupt
 TMR2If_bit = 0                                              'Clear Timer1 overflow interrupt flag bit

Er zit alleen geen leven in: Er volgt geen interrupt...

Vast nog iets vergeten vrees ik...

Man is still the most extraordinary computer of all. JF Kennedy

De timer aanzetten wil soms wel eens helpen... ;)

pic basic code:


TMR2ON_bit = 1

Dat er meer moet worden ingesteld is logisch, deze controller kan veel meer...

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

Special Member

Ik had het zo bedacht:

Het TMR2ON_bit zit in het T2Con register.
(bij de 18857 is het bit 7)

Het zou dan moeten zijn:

pic basic code:


T2CON       = %11000000                                      'Pre: 16 - Post:1

Klopt dat?

Er zit nog niet veel leven in...

Man is still the most extraordinary computer of all. JF Kennedy

De timer heeft nog geen clocksource, hangt default ook 'los' in de PPS. (moet nu handmatig worden ingesteld)
Kun je doen door T2INPPS en/of T2CLKCON te wijzigen...

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

Special Member

Op 14 januari 2021 23:59:04 schreef Arco:
De timer heeft nog geen clocksource, hangt default ook 'los' in de PPS. (moet nu handmatig worden ingesteld)
Kun je doen door T2INPPS en/of T2CLKCON te wijzigen...

Tjonge jonge, als ik jou toch niet had, Arco. :)

Met

pic basic code:

T2CLKCON    = %00000001                                     'Fosc / 4

Werkt het als een tierelier. Precies de goede frequentie!

Man is still the most extraordinary computer of all. JF Kennedy
Bavelt

Special Member

Hey 'loshangen' van de diverse functies / pinnen is wel even wennen, maar het biedt natuurlijk ook veel mogelijkheden!

Het geeft je de vrijheid om het helemaal op maat in te richten.

De SDA van I2C lijkt een uitzondering: deze heeft wel een default assginment
(voor I2C2: RB1 en RB2).

Man is still the most extraordinary computer of all. JF Kennedy

Dat komt omdat de i2c pinnen speciale drivers hebben. Als je die naar een andere pin mapped, voldoen ze niet helemaal aan de i2c specs. (maar werkt meestal wel)

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

Special Member

Er zit goede schot in. De Timers, de interrupts werken.

Ik zit nog met één issue:

De I2C en SPI 'bijten' elkaar

Ik heb gekozen voor SPI1 en I2C2.

pic basic code:


Dim SCKPin        As sbit at PORTC.3          'pin 14  SCK - Spi1I
    SDOPin        As sbit at PORTB.0          'pin 21  SDO - Spi1I
    Latch         As sbit at LATB.3           'pin 24  CS
    SCLPin        As sbit at PORTB.1          'pin 22  SCL - I2C2
    SDAPin        As sbit at PORTB.2          'pin 23  SDA - I2C2
	

    TRISB      = %00010110                    'B1, B2, B4 Input
    TRISC      = %00001000                    'C3     Input
    SPI1_Init()
    I2C2_init(100000)                         'Init i2c2 port 100kHz
                                              'Init SpI1

De SPI werkt. Maar na de I2C2 Init() is het gebeurd en hangt de boel.

Draai ik beide om, eerst I2C2_Init() en daarna SPI1_Init(), dan slaan de matrixen op hol...

Ik dacht dat ik ze goed had gescheiden, maar er moet nog iets zijn dat 'iets' in elkaars vaarwater zit...

Man is still the most extraordinary computer of all. JF Kennedy

Je moet wel de i2c2_remappable_xxx functies gebruiken als je remapt, anders gebeuren er (zoals je hebt gemerkt) vreemde en ongewenste dingen... ;)
Als je de gewone i2c2_init gebruikt, mapt die de i2c naar de default pinnen. Als je dan remapt, komt de i2c op de nieuwe en de oude pinnen te zitten...

Heeft een tijdje geduurd voor ik daar achter was, er staat nergens in de help dat init functies ook aan mapping doen. (ook de uart, spi,...)
Kostte me toen een tijdje worstelen met de supportdesk om daar achter te komen...

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

Special Member

Ik heb de I2C2_Remappable gebruikt.

Maar ik gebruik eigenlijk de standaard pins voor I2C2, dus eigenlijk remap ik die niet.

Het enige dat in het programma wordt geremapt is SDO1 van de SPI1. (naar PORTB.0)

Maar toch voor alle zekerheid maar even geremapped (naar de standaard pinnen):

pic basic code:


RB0PPS = 0x15                                               'Transfer SDO to B.0
 RB2PPS = 0x17               'SDA2
 RB1PPS = 0x16               'SCL2 

Dit gaat echter niet goed, het biedt geen soelaas.

pic basic code:

Unlock_IOLOCK()
PPS_Mapping(_RB1, _OUTPUT, _SCL2)
Lock_IOLOCK()

Strandt op het feit dat hij _SCL2 niet kent...

Man is still the most extraordinary computer of all. JF Kennedy

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()

[Bericht gewijzigd door Arco op 15 januari 2021 15:48:53 (62%)]

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

Special Member

Tjeetje...

Nou, maar weer eens proberen.

Maar moet ik nu beide remappen (dus de I2C2 naar zijn eigen standaard pinnen) EN de SPI1?
OF alleen de SPI, die was geremapt?

De ASM module werkt overigens niet:

avr asm code:

'========================================================================================
Sub Procedure Set_PPS()
'========================================================================================
  Asm                                                               'Unlock PPS
    movlb   61                                                      '
    movlw   0x55                                                    '
    movwf   PPSLOCK                                                 '
    movlw   0xAA                                                    '
    movwf   PPSLOCK                                                 '
    bcf     PPSLOCKED_bit                                           '
  End Asm                                                           '

  RB7PPS    = 0x15                                                  'SDO1 on pin RB7

  Asm                                                               'Lock PPS
    movlb   61                                                      '
    movlw   0x55                                                    '
    movwf   PPSLOCK                                                 '
    movlw   0xAA                                                    '
    movwf   PPSLOCK                                                 '
    bsf     PPSLOCKED_bit                                           '
  End Asm                                                           '
End Sub                  

Dit wel:

pic basic code:

RB0PPS = 0x15                                               'Transfer SDO to B.0 
Man is still the most extraordinary computer of all. JF Kennedy

In dat asm voorbeeld staat wel RB7...

Als je voor i2c de standaard pinnen gebruikt hoef je die niet te remappen en kun je de gewone i2c2_init() gebruiken.

Als je wel remapt, moeten de pinnen als ingang en uitgang ingesteld worden, omdat het bidirectionele pinnen zijn.
(zie ook in datasheet bij PPS)

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