Ik heb een vreemd probleempje: ik krijg I2C2 niet aan de praat.
De PIC16F1847 heeft twee I2C modulen aan boord.
I2C1 werkt prima, maar wanneer ik kies voor I2C2 (op poorten B.2 en B.5) dan werkt het niet. Het display doet niks en wanneer ik de spanning terug breng naar 3,3 Volt dan knippert de testled met ca 0,5 sec...
Ook heel raar...

:?

Program I2C_Scanner
'Processor: PIC16F1847
'SDA2:       PORTB.2, Pin 8
'SCL2:       PORTB.5, Pin 11
 Dim i1   As Byte

'==================================================================================================
Sub Procedure Lcd_WrCmd(Dim pCmd As Byte)                       'Write data to display
'==================================================================================================
While Not (i2c2_Is_Idle) Wend
  i2c2_Start()
  i2c2_Wr(0x78)
  i2c2_Wr(0x80)
  i2c2_Wr(pCmd)
  i2c2_Stop()
End Sub

'==================================================================================================
Sub Procedure Lcd_WrDat(Dim pDat As Byte)                       'Write data to display
'==================================================================================================
 While Not (i2c2_Is_Idle) Wend
  i2c2_Start()
  i2c2_Wr(0x78)
  i2c2_Wr(0x40)
  i2c2_Wr(pDat)
  Delay_ms(1)
  i2c2_Stop()
End Sub

'====================================================================================================
Sub Procedure Lcd_SetPos(Dim px, py as Byte)                    'Set write position on display
'====================================================================================================
  Lcd_WrCmd(0xB0 + py)
  Lcd_WrCmd(0xB0 + py)
  Lcd_WrCmd((px  >> 4) Or 0x10)
  Lcd_WrCmd(px And 0x0F)
End Sub

'====================================================================================================
 Sub Procedure LCD_Fill(Dim pFill As Byte)               'Fill display with character pFill
'====================================================================================================
  Dim lx, ly As Byte
  For ly = 0 To 8
  LCD_wrCmd(0xB0 + ly)
  LCD_wrCmd(0x00)
  LCD_wrCmd(0x10)
    For lx = 1 to 128
      Lcd_wrDat(pFill)
    Next lx
  Next ly
 End Sub

'====================================================================================================
Sub Procedure Display_Init()
'====================================================================================================
  Lcd_WrCmd(0xA8)                                 'Multiplex ratio set to
  Lcd_WrCmd(0x3F)                                 '63
  Lcd_WrCmd(0xD3)                                 'Display offset RAM counter
  Lcd_WrCmd(0x00)                                 'none
  Lcd_WrCmd(0x40)                                 'Start line address
  Lcd_WrCmd(0xA1)                                 'Set segment remap rotation to left
  Lcd_WrCmd(0xC8)                                 'Common output scan direction
  Lcd_WrCmd(0xDA)                                 'Common signals pad
  Lcd_WrCmd(0x12)                                 'value
  Lcd_WrCmd(0x81)                                 'Contrast control
  Lcd_WrCmd(0xFF)                                 'value
  Lcd_WrCmd(0xA4)
  Lcd_WrCmd(0xA6)                                 'Normal display
  Lcd_WrCmd(0xD5)                                 'Clock ratio:oscillator frequency
  Lcd_WrCmd(0x80)                                 'oooo:rrrr
  Lcd_WrCmd(0x8D)
  Lcd_WrCmd(0x14)
  Lcd_WrCmd(0x00)                                 'Set lower column address
  Lcd_WrCmd(0x10)                                 'Set higher column address
  Lcd_WrCmd(0xD9)                                 '15 clocks, discharge 1 clock
  Lcd_WrCmd(0xF1)                                 'dddd:pppp
  Lcd_WrCmd(0xDB)                                 'Common output voltage
  Lcd_WrCmd(0x40)                                 'level
  Lcd_WrCmd(0x20)                                 'Addressing mode
  Lcd_WrCmd(0x02)                                 'value
  Lcd_WrCmd(0xAE)                                 'Turn OLED panel off
End Sub

'==============================================================================
main:

'==============================================================================
  ANSELB = %00000000                             'All output/digital
  TRISB  = %00100100                             'PortB.2 and B.5 input, I2C used)
  OSCCON = %01110000                             '8Mhz internal
  Delay_ms(50)
  
  LATB.3 = 0                                     'Test Led

  i2c2_init(100000)                              'Init i2c2 port 100kHz
  Display_Init()
  
  LCD_wrCmd(0xAF)                                'Turn Oled Panel on

  LCD_Setpos(0,0)
  LCD_Fill(0xFF)

 While True 
   LATB.3 = 1
 Wend

End.

Als de led knippert dan reset de pic. Watchdog, LVP of reset niet aangezet per ongeluk?

"MCLR Pin function select" stond op 'enabled'. Als ik deze op disabled zet komt er licht uit de pijp....

Ik heb deze functie in andere projectjes altijd aan staan zonder problemen wat ik nu met de I2C2 heb.

Kan dit toch de oorzaak zijn en wanneer gebruik je deze functie nu precies?

MCLRE op 'on' betekent dat de RA5 pin de reset is.
Als je die aan zet, moet er een 10k pull-up aan en een 100nF c'tje naar Gnd.

10K PullUp naar A.5 had ik er aan zitten op het breadboardje. c-tje niet, zit er nu ook op.

Maar ik heb ineens sowieso problemen met het displaytje aansturen. Ook bij I2C1.
Het 'spul' doet raar. Voorbeeldje: als ik LATB.3 = 0 opgeeft, dan zie je Led flauwtjes branden. Ik meet ook 1,54 Volt bij en Vdd van 3,5 volt. Bij % volt voeding gaat hij naar 1,85 V
Beetje vreemde waarde voor logisch 0 lijkt me.

Probleem al opgelost. Slechte verbinding van pin 5 (VSS naar GND)...

-nvt

[Bericht gewijzigd door Bavelt op (100%)]

Ik heb een programmaatje gemaakt om I2C adressen te scannen. Dat doe ik door gebruik te maken van de ACK die terugkomt van een I2C1_Wr().

 '====================================================================================================
 Sub Function Scan(Dim pAdr as Byte) as Byte                         'Read I2C Adress
'====================================================================================================
  While Not (i2c1_Is_Idle) Wend
  i2c1_Start()
  if i2c1_Wr(pAdr)= 0 then
     Result = 1
  else
     Result = 0
  end if
  i2c1_Stop()
 End Sub

En

For i1 = 0x08 to 0xF0 step 2
        If (i1 <> 0xF8) AND (i1<> 0xF0) then    'Reserved I2C adresses
          Delay_ms(5)
          If Scan(i1) = 1 then
            ByteToHex (i1, Str)
            Lcd_String_8x16(2,4, "Found: 0x" + Str)
            Delay_ms(1500)
            Lcd_String_8x16(2,4, "             ")
          End if
        End if
 Next i1

Op zich werkt het, maar ik vroeg me wel af of dit zo wel goed is en het zomaar mag. Er worden allerlei adressen naar een aangesloten device geschreven, zou het niet kunnen zijn dat je daar iets overschrijft wat niet de bedoeling is?

Zo had ik een DS3231 (hij vond hem op 0xD0), maar wat leter moest ik de batterij er uit halen om het ding weer benaderbaar te maken.

In het kielzog hiervan, mischien heeft het er wel helemaal niks mee te maken, maar mijn Oled 0,96" displaytje toont nu ineens alle even lijnen niet meer.

Als ik alle rijen en daarbinnen elke kolom vul met 0xFF, dan zou het display helemaal moeten zijn gevuld. Maar omdat de even rijen zijn geblankt, zie je dus maar de helft.

Wellicht is er een verband met de settings waarmee het display wordt geinitialiseerd.

Of het display is stuk (helft Ram geheugen weg? Of misschien door mijn ic2-geschrijf?)

'===============================================================================
Sub Procedure Display_Init()
'===============================================================================
  Lcd_WrCmd(0xA8)                                 'Multiplex ratio set to
  Lcd_WrCmd(0x3F)                                 '63
  Lcd_WrCmd(0xD3)                                 'Display offset RAM counter
  Lcd_WrCmd(0x00)                                 'none
  Lcd_WrCmd(0x40)                                 'Start line address
  Lcd_WrCmd(0xA1)                                 'Set segment remap rotation to left
  Lcd_WrCmd(0xC8)                                 'Common output scan direction
  Lcd_WrCmd(0xDA)                                 'Common signals pad
  Lcd_WrCmd(0x12)                                 'value
  Lcd_WrCmd(0x81)                                 'Contrast control
  Lcd_WrCmd(0xFF)                                 'value
  Lcd_WrCmd(0xA4)
  Lcd_WrCmd(0xA6)                                 'Normal display
  Lcd_WrCmd(0xD5)                                 'Clock ratio:oscillator frequency
  Lcd_WrCmd(0x80)                                 'oooo:rrrr
  Lcd_WrCmd(0x8D)
  Lcd_WrCmd(0x14)
  Lcd_WrCmd(0x00)                                 'Set lower column address
  Lcd_WrCmd(0x10)                                 'Set higher column address
  Lcd_WrCmd(0xD9)                                 '15 clocks, discharge 1 clock
  Lcd_WrCmd(0xF1)                                 'dddd:pppp
  Lcd_WrCmd(0xDB)                                 'Common output voltage
  Lcd_WrCmd(0x40)                                 'level
  Lcd_WrCmd(0x20)                                 'Addressing mode
  Lcd_WrCmd(0x02)                                 'value
  Lcd_WrCmd(0xAE)                                 'Turn OLED panel off
End Sub

Doet LCD_Fill() dat ook?

ja,

Lcd_fill(0xFF)

Ik heb er al op gezocht, het schijnt meer voor te komen. Veelal in de Arduino wereld.
De een lost het op (dmv de init, libraries, etc), de ander geeft het op.

Ik dacht misschien is hij wel stuk, maar dan precies de helft? Wel heel toevallig :/
Of wellicht door mijn I2C - aanvallen op alles wat op het board zit...

Of wat ook zou kunnen, door de 5V Voeding.

Ik zou hem nog in een Arduino sketch kunnen stoppen, kijken hoe dat daar gaat.

Niet alle displays hebben een regulator erop gemonteerd. Als die er niet op zit (U2), dan kun je er geen 5v op zetten...
Ik gebruik alleen 3.3v en sloop de regulators er altijd af (doorverbinden), ik heb weinig vertrouwen in een regulator met 3.3v in en 3.3v out...

Er lijkt er inderdaad eentje op te zitten (in 't midden)

Ik werk overigens nu al zo veel als mogelijk met 3,3V

Maar in dit geval is 3,3V in en 3,3V Uit inderdaad niet zo geweldig lijkt me.

Er zijn blijkbaar veel fabrikanten van die dingen waarbij ze dan soms nét iets anders zijn.
Daar komt bij dat dit ding spotgoedkoop was uit de winkel van tante Alie...

[Bericht gewijzigd door Bavelt op (29%)]

Ik denk dat het 0,96" I2C-displaytje idd is overleden (voor de helft dan)
:/

Oók in de Arduino sketches worden de even lijnen geblankt en kunnen niet (meer) worden aangestuurd...

De MSSP modulen van de pIC16F1847 hebben hun standaard poorten.
In principe hoef je die dus niet op te geven in het programma.

Toch heb ik ze er in gezet (afgekeken van andere voorbeelden):


Dim SCKPin   As sbit at PORTB.5          'pin 11                   'SCK - SPI2
    SDOPin   As sbit at LATA.0           'pin 17                   'SDO - SPI2
    SCLPin   As sbit at PORTB.1          'pin 7                    'SCL - I2C1
    SDAPin   As sbit at PORTB.4          'pin 10                   'SDA - I2C1

Moet je dit nu zien als 'Comment only' of heeft het tóch een functie ze te definiëren?

Ter leering ende vermaeck... :)

Hierbij een projectje dat van aangesloten I2C devices de adressen opzoekt en weergeeft.
Het werkt met de PIC16F1847 als microcontroller en maakt gebruik van de SPI module.

Programma in MikroBasic

Dim van die pinnen is als pseudo-commentaar handig: je weet dan dat die pinnen al in gebruik zijn.

Het werkt met de PIC16F1847 als microcontroller en maakt gebruik van de SPI module.

Technisch gesproken gebruik je de MSSP module in I2C mode, geen SPI...
Een gewone zipfile is trouwens een stuk handiger, hoef ik niet eerst mijn oude laptop af te stoffen... ;) (rar is niet erg gebruikelijk bij Windows...)

Technisch gesproken gebruik je de MSSP module in I2C mode, geen SPI...

Ik bedoelde te zeggen dat bij de display waar het resultaat op wordt getoond, SPI wordt gebruikt.
I2C1 wordt gebruikt voor de te scannen devices.

Een gewone zipfile is trouwens een stuk handiger, hoef ik niet eerst mijn oude laptop af te stoffen... ;) (rar is niet erg gebruikelijk bij Windows...)

Zoiets?