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.Arco
Special Member
Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
"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?
Arco
Special Member
Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
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.
-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 SubEn
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 i1Op 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
Arco
Special Member
Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
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.
Arco
Special Member
Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
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 - I2C1Moet 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
Arco
Special Member
Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
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?