Ik wilde een OLED 0,96" I2C Schermpje aansturen met een PIC 16F18857.
Volgens de datasheet zou de SCL1 default op Poort C.3 zitten, de SDA op C.4
Nu mag ik in MikroBasic niet de 'gewone' I2c_Init() gebruiken, maar moet dat een I2C_Remappable_Init() worden. Anders krijg ik een 'Unresolved PPS-Mapping'.
Dus dan maar remappen op de standaard pin. En overal Remappable gebruiken, bij de start, stop, write, etc
Ik doe:
SSP1CLKPPS = 0x13 ' RC3->MSSP1:SCL1
RC3PPS = 0x14 ' RC3->MSSP1:SCL1
RC4PPS = 0x15 ' RC4->MSSP1:SDA1
SSP1DATPPS = 0x14 ' RC4->MSSP1:SDA1
Dan werkt het wel...
Maar waarom kan ik niet de gewone Init gebruiken en moet ik remappen, terwijl de pinnen voor I2C1 standaard zijn toegezegen?
[Bericht gewijzigd door Bavelt op (33%)]
Arco
Special Member
Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
Tja,
Men probeert het voor de gebruiker zo makkelijk mogelijk te maken, en daardoor krijg je wel langere code. (1 routine is simpeler als moeten kiezen uit 2)
Libraries zijn nooit al te efficient, omdat ze universeel zijn met veel meestal onnodige code.
Zo gebruikt de PPS mapping functie bijna 2k aan geheugen door de vele verschillende mappings die mogelijk zijn.
(waar je er maar een of een paar van nodig hebt meestal.)
Ik doe de mapping altijd met losse code, dan ben je met 18 bytes klaar... 
Op 25 november 2023 10:00:10 schreef Arco:
Tja,Men probeert het voor de gebruiker zo makkelijk mogelijk te maken, en daardoor krijg je wel langere code. (1 routine is simpeler als moeten kiezen uit 2)
Libraries zijn nooit al te efficient, omdat ze universeel zijn met veel meestal onnodige code.Zo gebruikt de PPS mapping functie bijna 2k aan geheugen door de vele verschillende mappings die mogelijk zijn.
(waar je er maar een of een paar van nodig hebt meestal.)Ik doe de mapping altijd met losse code, dan ben je met 18 bytes klaar...
Wat moet ik me voorstellen bij 'losse' code? Zit je dan al snel op ASM?
Hoe ziet dat er dan uit als dat maar 18 bytes in beslag neemt?
Arco
Special Member
Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
PPS moet altijd in assembly, omdat het lock/unlock van pps tijdkritisch is (er mag niets tussen de instructies komen...)
'========================================================================================
Sub Procedure Set_PPS()
'========================================================================================
Asm 'Unlock PPS
movlb 28 '
movlw 0x55 '
movwf PPSLOCK '
movlw 0xAA '
movwf PPSLOCK '
bcf PPSLOCKED_bit '
End Asm '
'......................................................................................
RA0PPS = %00010010 'MOSI on RA0
RC0PPS = %00010000 'SCLK on RC0
SSPDATPPS = %00000001 'MISO on RA1
'......................................................................................
Asm 'Lock PPS
movlb 28 '
movlw 0x55 '
movwf PPSLOCK '
movlw 0xAA '
movwf PPSLOCK '
bsf PPSLOCKED_bit '
End Asm
End Sub
Ik zal dat eens poberen.
Inmiddels ben ik er ook achter dat ook de 'gewone' I2C1-commando's kunnen worden gebruikt, als ik het in deze volgorde in het programma zet:
SSP1CLKPPS = 0x13 ' RC3->MSSP1:SCL1
RC3PPS = 0x14 ' RC3->MSSP1:SCL1
RC4PPS = 0x15 ' RC4->MSSP1:SDA1
SSP1DATPPS = 0x14 ' RC4->MSSP1:SDA1
I2C1_Init(100000) 'Init i2c1 port
De ASM werkt, ik heb het wel even moeten aanpassen voor de PIC 16F18857:
'========================================================================================
Sub Procedure Set_PPS()
'========================================================================================
Asm 'Unlock PPS
movlb 28 '
movlw 0x55 '
movwf PPSLOCK '
movlw 0xAA '
movwf PPSLOCK '
bcf PPSLOCKED_bit '
End Asm '
'......................................................................................
SSP1CLKPPS = %00010011 '(0x13) ' RC3->MSSP1:SCL1
RC3PPS = %00010100 '(0x14) ' RC3->MSSP1:SCL1
RC4PPS = %00010101 '(0x15) ' RC4->MSSP1:SDA1
SSP1DATPPS = %00010100 '(0x14) ' RC4->MSSP1:SDA1
'......................................................................................
Asm 'Lock PPS
movlb 28 '
movlw 0x55 '
movwf PPSLOCK '
movlw 0xAA '
movwf PPSLOCK '
bsf PPSLOCKED_bit '
End Asm
End Sub
De foutmelkding mbt tot de "unresolved extern PPS-Mapping"
kwam doordat de PPS library niet was aangevinkt.