OLED display met ST7789 en MikroBasic

Arco

Special Member

Je kunt resultaat van beide operaties eens op het display zetten en bekijken...
Kan zijn dat de (onnodige) haakjes invloed hebben. Vermenigvuldigen van een Word geeft ook meestal een Dword als resultaat...

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

Golden Member

Je kunt resultaat van beide operaties eens op het display zetten en bekijken...

Da's een goeie. Meteen geprobeerd met een testje:

pic basic code:



lIndex = 3
  Lcd_WrCmd(0x00)
  Lcd_WrCmd(0x10)
  Lcd_WrDat(lindex)
 
  Lcd_WrDat(0x00)
  
  Lindex = 3
  lIndex = (lIndex << 2) + (lIndex << 1)
  Lcd_WrDat(lindex)

  Lcd_WrDat(0x00)
  
  Lindex = 3
  lIndex = (lIndex * 6)
  Lcd_WrDat(lindex)

Geeft beide hetzelde resultaat:
input: lindex = 3 (000011)
Output: 010010 (=18).

Dat klopt dus.

Maar deze routine geeft wel een ander resultaat:

pic basic code:

'==================================================================================================
Sub Procedure Lcd_Char_6x8(Dim px, py, pchar As Byte)           'Write one character
'==================================================================================================
  Dim lIndex As Word
  Lcd_SetPos(px, py)
  lIndex = pChar - 0x20
  lIndex = (lIndex << 2) + (lIndex << 1)
  'lIndex = (lIndex * 6)
  Lcd_WrDat(Char6x8[lIndex+0])
  Lcd_WrDat(Char6x8[lIndex+1])
  Lcd_WrDat(Char6x8[lIndex+2])
  Lcd_WrDat(Char6x8[lIndex+3])
  Lcd_WrDat(Char6x8[lIndex+4])
  Lcd_WrDat(Char6x8[lIndex+5])
End Sub

Tja... :?

Fouten zijn het bewijs dat je het probeert..
Bavelt

Golden Member

Tenzij het programma door een andere oorzaak de zaak laat crashen waardoor het resultaat anders wordt (hele scherm gaat aan de haal met de vermenigvuldiging-variant)

Fouten zijn het bewijs dat je het probeert..
Arco

Special Member

Ik zou in ieder geval de (onnodige) haakjes weglaten bij LIndex = (LIndex * 6)
Nu bestaat de mogelijkheid dat de compiler wat tussen de haakjes staat als expressie ziet en evalueert als 'true' of 'false'...

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

Golden Member

Op 1 april 2020 14:01:38 schreef Bavelt:
[...]

pic basic code:

'==================================================================================================
Sub Procedure Lcd_Char_6x8(Dim px, py, pchar As Byte)           'Write one character
'==================================================================================================
  Dim lIndex As Word
  Dim tIndex As Word
  Lcd_SetPos(px, py)
  tIndex = pChar - 0x20
  lIndex = (tIndex << 2) + (tIndex << 1)
  'lIndex = (lIndex * 6)
  Lcd_WrDat(Char6x8[lIndex+0])
  Lcd_WrDat(Char6x8[lIndex+1])
  Lcd_WrDat(Char6x8[lIndex+2])
  Lcd_WrDat(Char6x8[lIndex+3])
  Lcd_WrDat(Char6x8[lIndex+4])
  Lcd_WrDat(Char6x8[lIndex+5])
End Sub

Tja... :?

Kun je de bovenstaande versie eens proberen ?
Misschien dat MikroBasic al in die lIndex zit te schrijven tijdens het berekenen, dus voordat alle shift functies uitgevoerd zijn ?

P.S. Klopt dat schrijven van karakters wel voor het weergeven van een Dword ? Hoe wordt een Dword in het geheugen gezet, toch niet als een rijtje ASCII karakters?

Arco

Special Member

Misschien dat MikroBasic al in die lIndex zit te schrijven tijdens het berekenen, dus voordat alle shift functies uitgevoerd zijn ?

De shifts gaan juist wel goed... ;)
Dit soort berekeningen doe ik vaak, nooit een probleem. (ik laat wel de haakjes weg indien onnodig om problemen te voorkomen)

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

Golden Member

Ik probeerde een andere uc: De PIC16F887.

Maar het is niet mijn geluksdag vandaag, krijg het display niet aan de praat (zwart scherm).

Het zou toch moeten kunnen met de ingebouwde SPI van de 887?

pic basic code:

Dim SSel     As sBit At PORTC.1         'pin 16                   'Display select
    D_C      As sBit At PORTC.7         'pin 26                   'Data/Command
    ClockPin As sbit at PORTC.3         'pin 18                   'Clock
    Datapin  As sbit at PORTC.5         'pin 24                   'SDO

Reset aan de +5V

Fouten zijn het bewijs dat je het probeert..
RAAF12

Golden Member

Op 31 maart 2020 00:54:13 schreef Bavelt:
Het is dat de paracetamol is uitverkocht, anders had ik er eentje genomen ;)

OT
De AH webwinkel heeft voorraad... https://www.ah.nl/zoeken?query=paracetamol
/OT

Bavelt

Golden Member

Is het wellicht nodig om de MSSP module aan te zetten voor een PIC16F887?

Het lijkt er nl op dat de SPI niks doet.

Fouten zijn het bewijs dat je het probeert..
Bavelt

Golden Member

Ik ben bang dat ik het niet goed doe:

Het programma heeft een Clock, Data en Ssel

Moet die datapin van het programma nu op SDO (Port C.5, pin 24) of SDI (Port C.5, pin23)?

M.a.w. gebruik je Of de SDO of de SDI?

Fouten zijn het bewijs dat je het probeert..
Arco

Special Member

SDI (serial data in, soms ook uitgelegd als slave data in) wordt niet gebruikt.

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

Golden Member

Dus dan heb ik nu

C.5 - SDO naar de Data-ingang (D1) van de Oled
C.3 - CLK naar de Clock ingang (D0) van de Oled

De de D/C kan je elke poort voor kiezen, niet?
In mijn geval C.7

Hetzelfde voor de CS, in mijn geval C.1

Dit zou juist zijn?

Fouten zijn het bewijs dat je het probeert..
Bavelt

Golden Member

Dit is het (vereenvoudigde) programma om überhaupt iets op de display te zien gebeuren.

Met een Ledje test ik of de processor werkt op de juiste frequentie en of hij door de loop loopt.

Maar er gebeurt niks op de display, Ledje doet het wel.

pic basic code:

Program OledSPI_887

'==================================================================================================
' Project name: OledSPI_887
' MCU:          PIC16F887
' Oscillator:   Clock 8 Mhz
'==================================================================================================

Dim SSel     As sBit At PORTC.1         'pin 16                   'Display select
    D_C      As sBit At PORTC.7         'pin 26                   'Data/Command
    ClockPin As sbit at PORTC.3         'pin 18                   'Clock
    Datapin  As sbit at PORTC.5         'pin 24                   'SDO
    Led      As sbit at PORTC.2         'pin 17                   'LED

    i1 as byte
    Dim lx, ly As Byte

'====================================================================================================
Sub Procedure Lcd_WrCmd(Dim pCmd As Byte)                       'Write command to display
'====================================================================================================
  D_C = 0
  Spi1_Write(pCmd)
End Sub

'====================================================================================================
Sub Procedure Lcd_WrDat(Dim pDat As Byte)                       'Write data to display
'====================================================================================================
  Dim lCnt As Byte
  D_C = 1
  Spi1_Write(pDat)
End Sub

'===============================================================================
Sub Procedure Display_Init()
'===============================================================================
  Lcd_WrCmd(0xAF)                                 'Turn OLED panel off
  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:                                                            'Main program
'====================================================================================================
  TRISC   =  %01111001                                          'PortC.1, PortC.2 and PORTC.7 output
  OSCCON =   %01110000                                          '8Mhz internal

  SPI1_Init()
  Delay_ms(100)
  Display_Init()
  Delay_ms(100)

  Lcd_WrCmd(0xAF)                                                'Turn OLED panel on

  SSel = 0
  delay_ms(500)
  SSEL = 1                                           'Only for 0.96", for 1.3" remove it
  
  'Test Led blinks
  For i1 = 0 to 2
    Led = 1
    Delay_ms(500)
    Led = 0
    Delay_ms(500)
  Next i1

   while true
   Led = 0                   'test LED Off
   
  'Blank all pixels
   For ly = 0 To 7
    Lcd_WrCmd(0xB0+ly)
    Lcd_WrCmd(0x00)          'start at column 0
    Lcd_WrCmd(0x10)          'Return to column 0 at the end
    For lx = 0 to 127
      Lcd_WrDat(0x00)
      delay_ms(2)
    Next lx
  Next ly

   Delay_ms(100)
   For ly = 0 To 7
    Lcd_WrCmd(0xB0+ly)
    Lcd_WrCmd(0x00)          'start at column 0
    Lcd_WrCmd(0x10)          'Return to column 0 at the end
    For lx = 0 to 127
      Lcd_WrDat(0x01)
      delay_ms(2)
    Next lx
  Next ly
  Led = 1                   'test LED on
  Delay_ms(1000)

  Wend
End.
Fouten zijn het bewijs dat je het probeert..
Bavelt

Golden Member

Heb zelf al iets gevonden: Ssel moet input zijn (kan ik niet helemaal verklaren, omndat je een waarde uit stuurt naar de poort).

pic basic code:

TRISC   =  %01111011

Maar dan komt er al beweging in.

Fouten zijn het bewijs dat je het probeert..
Arco

Special Member

Chipselect van de SSD moet een output zijn, zeker geen input. (waarschijnlijk staat er wat anders verkeerd)

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

Golden Member

Op 1 april 2020 23:34:05 schreef Arco:
Chipselect van de SSD moet een output zijn, zeker geen input. (waarschijnlijk staat er wat anders verkeerd)

Dat dacht ik dus ook. Poort C.1 = SSel.

Deze doet het

pic basic code:

TRISC   =  %01111011

pic basic code:

TRISC   =  %01111001

Deze niet... :?

Fouten zijn het bewijs dat je het probeert..
Bavelt

Golden Member

Ik denk dat ik het heb.

Om de display te laten werken (ik heb er maar eentje) moet de Chip select op low staan.

Klopt toch, niet?

In het programma was het andersom: ik eindigde met Ssel hoog.
Nu ik het heb veranderd in Ssel = 0 werkt het en ook met de poort als output.
:)

[Bericht gewijzigd door Bavelt op donderdag 2 april 2020 01:31:00 (75%)

Fouten zijn het bewijs dat je het probeert..
Bavelt

Golden Member

Alles Paletti nu. :) ;)

Het draait nu mooi én stabiel.

De CS constant Low en de RES high en het loopt als een zonnetje.

Hierbij de code met test-tekstje.

Processor: PIC17F887, Oled-SPI 0,96".

pic basic code:

 Program OledSPI_887
'====================================================================================================
' Project name: OledSPI_887
' MCU:          PIC16F887
' Oscillator:   Internal 16 MHz
' Display: Oled SPI 0,96"
' SDO:          PORT C.5                 Pin 24
' CLK:          PORT C.3                 Pin 18
' D/C:          PORT C.7                 Pin 26
' RES:          High
' CS:           Low
'====================================================================================================

Const Char6x8 As Byte[570] = (       'Character table
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  ' sp
0x00, 0x00, 0x00, 0x2f, 0x00, 0x00,  ' !
0x00, 0x00, 0x07, 0x00, 0x07, 0x00,  ' "
0x00, 0x14, 0x7f, 0x14, 0x7f, 0x14,  ' #
0x00, 0x24, 0x2a, 0x7f, 0x2a, 0x12,  ' $
0x00, 0x62, 0x64, 0x08, 0x13, 0x23,  ' %
0x00, 0x36, 0x49, 0x55, 0x22, 0x50,  ' &
0x00, 0x00, 0x05, 0x03, 0x00, 0x00,  ' '
0x00, 0x00, 0x1c, 0x22, 0x41, 0x00,  ' (
0x00, 0x00, 0x41, 0x22, 0x1c, 0x00,  ' )
0x00, 0x14, 0x08, 0x3E, 0x08, 0x14,  ' *
0x00, 0x08, 0x08, 0x3E, 0x08, 0x08,  ' +
0x00, 0x00, 0x00, 0xA0, 0x60, 0x00,  ' ,
0x00, 0x08, 0x08, 0x08, 0x08, 0x08,  ' -
0x00, 0x00, 0x60, 0x60, 0x00, 0x00,  ' .
0x00, 0x20, 0x10, 0x08, 0x04, 0x02,  ' /
0x00, 0x3E, 0x51, 0x49, 0x45, 0x3E,  ' 0
0x00, 0x00, 0x42, 0x7F, 0x40, 0x00,  ' 1
0x00, 0x42, 0x61, 0x51, 0x49, 0x46,  ' 2
0x00, 0x21, 0x41, 0x45, 0x4B, 0x31,  ' 3
0x00, 0x18, 0x14, 0x12, 0x7F, 0x10,  ' 4
0x00, 0x27, 0x45, 0x45, 0x45, 0x39,  ' 5
0x00, 0x3C, 0x4A, 0x49, 0x49, 0x30,  ' 6
0x00, 0x01, 0x71, 0x09, 0x05, 0x03,  ' 7
0x00, 0x36, 0x49, 0x49, 0x49, 0x36,  ' 8
0x00, 0x06, 0x49, 0x49, 0x29, 0x1E,  ' 9
0x00, 0x00, 0x36, 0x36, 0x00, 0x00,  ' :
0x00, 0x00, 0x56, 0x36, 0x00, 0x00,  ' ;
0x00, 0x08, 0x14, 0x22, 0x41, 0x00,  ' <
0x00, 0x14, 0x14, 0x14, 0x14, 0x14,  ' =
0x00, 0x00, 0x41, 0x22, 0x14, 0x08,  ' >
0x00, 0x02, 0x01, 0x51, 0x09, 0x06,  ' ?
0x00, 0x32, 0x49, 0x59, 0x51, 0x3E,  ' @
0x00, 0x7C, 0x12, 0x11, 0x12, 0x7C,  ' A
0x00, 0x7F, 0x49, 0x49, 0x49, 0x36,  ' B
0x00, 0x3E, 0x41, 0x41, 0x41, 0x22,  ' C
0x00, 0x7F, 0x41, 0x41, 0x22, 0x1C,  ' D
0x00, 0x7F, 0x49, 0x49, 0x49, 0x41,  ' E
0x00, 0x7F, 0x09, 0x09, 0x09, 0x01,  ' F
0x00, 0x3E, 0x41, 0x49, 0x49, 0x7A,  ' G
0x00, 0x7F, 0x08, 0x08, 0x08, 0x7F,  ' H
0x00, 0x00, 0x41, 0x7F, 0x41, 0x00,  ' I
0x00, 0x20, 0x40, 0x41, 0x3F, 0x01,  ' J
0x00, 0x7F, 0x08, 0x14, 0x22, 0x41,  ' K
0x00, 0x7F, 0x40, 0x40, 0x40, 0x40,  ' L
0x00, 0x7F, 0x02, 0x0C, 0x02, 0x7F,  ' M
0x00, 0x7F, 0x04, 0x08, 0x10, 0x7F,  ' N
0x00, 0x3E, 0x41, 0x41, 0x41, 0x3E,  ' O
0x00, 0x7F, 0x09, 0x09, 0x09, 0x06,  ' P
0x00, 0x3E, 0x41, 0x51, 0x21, 0x5E,  ' Q
0x00, 0x7F, 0x09, 0x19, 0x29, 0x46,  ' R
0x00, 0x46, 0x49, 0x49, 0x49, 0x31,  ' S
0x00, 0x01, 0x01, 0x7F, 0x01, 0x01,  ' T
0x00, 0x3F, 0x40, 0x40, 0x40, 0x3F,  ' U
0x00, 0x1F, 0x20, 0x40, 0x20, 0x1F,  ' V
0x00, 0x3F, 0x40, 0x38, 0x40, 0x3F,  ' W
0x00, 0x63, 0x14, 0x08, 0x14, 0x63,  ' X
0x00, 0x07, 0x08, 0x70, 0x08, 0x07,  ' Y
0x00, 0x61, 0x51, 0x49, 0x45, 0x43,  ' Z
0x00, 0x00, 0x7F, 0x41, 0x41, 0x00,  ' [
0x00, 0x55, 0x2A, 0x55, 0x2A, 0x55,  ' \
0x00, 0x00, 0x41, 0x41, 0x7F, 0x00,  ' ]
0x00, 0x04, 0x02, 0x01, 0x02, 0x04,  ' ^
0x00, 0x40, 0x40, 0x40, 0x40, 0x40,  ' _
0x00, 0x00, 0x01, 0x02, 0x04, 0x00,  ' '
0x00, 0x20, 0x54, 0x54, 0x54, 0x78,  ' a
0x00, 0x7F, 0x48, 0x44, 0x44, 0x38,  ' b
0x00, 0x38, 0x44, 0x44, 0x44, 0x20,  ' c
0x00, 0x38, 0x44, 0x44, 0x48, 0x7F,  ' d
0x00, 0x38, 0x54, 0x54, 0x54, 0x18,  ' e
0x00, 0x08, 0x7E, 0x09, 0x01, 0x02,  ' f
0x00, 0x18, 0xA4, 0xA4, 0xA4, 0x7C,  ' g
0x00, 0x7F, 0x08, 0x04, 0x04, 0x78,  ' h
0x00, 0x00, 0x44, 0x7D, 0x40, 0x00,  ' i
0x00, 0x40, 0x80, 0x84, 0x7D, 0x00,  ' j
0x00, 0x7F, 0x10, 0x28, 0x44, 0x00,  ' k
0x00, 0x00, 0x41, 0x7F, 0x40, 0x00,  ' l
0x00, 0x7C, 0x04, 0x18, 0x04, 0x78,  ' m
0x00, 0x7C, 0x08, 0x04, 0x04, 0x78,  ' n
0x00, 0x38, 0x44, 0x44, 0x44, 0x38,  ' o
0x00, 0xFC, 0x24, 0x24, 0x24, 0x18,  ' p
0x00, 0x18, 0x24, 0x24, 0x18, 0xFC,  ' q
0x00, 0x7C, 0x08, 0x04, 0x04, 0x08,  ' r
0x00, 0x48, 0x54, 0x54, 0x54, 0x20,  ' s
0x00, 0x04, 0x3F, 0x44, 0x40, 0x20,  ' t
0x00, 0x3C, 0x40, 0x40, 0x20, 0x7C,  ' u
0x00, 0x1C, 0x20, 0x40, 0x20, 0x1C,  ' v
0x00, 0x3C, 0x40, 0x30, 0x40, 0x3C,  ' w
0x00, 0x44, 0x28, 0x10, 0x28, 0x44,  ' x
0x00, 0x1C, 0xA0, 0xA0, 0xA0, 0x7C,  ' y
0x00, 0x44, 0x64, 0x54, 0x4C, 0x44,  ' z
0x00, 0x10, 0x6C, 0x82, 0x00, 0x00,  ' {
0x00, 0x00, 0x00, 0xFE, 0x00, 0x00,  ' |
0x00, 0x00, 0x00, 0x82, 0x6C, 0x10,  ' }
0x14, 0x14, 0x14, 0x14, 0x14, 0x14)  ' horiz lines
Dim D_C      As sBit At PORTC.7         'pin 26                   'Data/Command
    ClockPin As sbit at PORTC.3         'pin 18                   'Clock
    Datapin  As sbit at PORTC.5         'pin 24                   'SDO
    i1 as byte
    'Dim lx, ly As Byte
'====================================================================================================
Sub Procedure Lcd_WrCmd(Dim pCmd As Byte)                       'Write command to display
'====================================================================================================
  D_C = 0
  Spi1_Write(pCmd)
End Sub

'====================================================================================================
Sub Procedure Lcd_WrDat(Dim pDat As Byte)                       'Write data to display
'====================================================================================================
  Dim lCnt As Byte
  D_C = 1
  Spi1_Write(pDat)
End Sub

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

'====================================================================================================
Sub Procedure Lcd_Fill(Dim pFill As Byte)                       'Fill display with character pFill
'====================================================================================================
  Dim lx, ly As Byte
  For ly = 0 To 7
    Lcd_WrCmd(0xB0+ly)
    Lcd_WrCmd(0x00)
    Lcd_WrCmd(0x10)
    For lx = 0 to 127
      Lcd_WrDat(pFill)
    Next lx
  Next ly
End Sub

'==================================================================================================
Sub Procedure Lcd_Char_6x8(Dim px, py, pchar As Byte)           'Write one character
'==================================================================================================
  Dim lIndex As Word
  Lcd_SetPos(px, py)
  lIndex = pChar - 0x20
  lIndex = (lIndex << 2) + (lIndex << 1)                        'Multiply lIndex by 6
  Lcd_WrDat(Char6x8[lIndex+0])
  Lcd_WrDat(Char6x8[lIndex+1])
  Lcd_WrDat(Char6x8[lIndex+2])
  Lcd_WrDat(Char6x8[lIndex+3])
  Lcd_WrDat(Char6x8[lIndex+4])
  Lcd_WrDat(Char6x8[lIndex+5])
End Sub

'========================================================================================
Sub Procedure Lcd_String_6x8(Dim px, py As Byte, Dim ByRef pDisp As String) 'Write string
'========================================================================================
  Dim lLen, lCnt As Byte
  lLen = Length(pDisp)
  For lCnt = 0 To (lLen-1)
    If px > 127 Then px = 0 py = py+1 End If
    Lcd_Char_6x8(px, py, pDisp[lCnt])
    px = px + 6
  Next lCnt
End Sub

'===============================================================================
Sub Procedure Display_Init()
'===============================================================================
  Lcd_WrCmd(0xAF)                                 'Turn OLED panel off
  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:                                             'Main program
'====================================================================================================
  TRISC   =  %01111111                            'PORTC.7 output
  OSCCON =   %01110000                            '8Mhz internal

  SPI1_Init()
  Delay_ms(100)
  Display_Init()
  Delay_ms(100)

  Lcd_WrCmd(0xAF)                                 'Turn OLED panel on
  LCD_Setpos(0,0)                                 'Set start Position
  LCD_Fill(0x00)                                  'Blank Screen

  While True

  Delay_ms(500)
  LCD_Setpos(0,0)

  Lcd_String_6x8(0,0,"123456789012345678901")
  Lcd_String_6x8(0,1,"123456789012345678901")
  Lcd_String_6x8(0,2,"123456789012345678901")
  Lcd_String_6x8(0,3,"123456789012345678901")
  Lcd_String_6x8(0,4,"123456789012345678901")
  Lcd_String_6x8(0,5,"123456789012345678901")
  Lcd_String_6x8(0,6,"123456789012345678901")
  Lcd_String_6x8(0,7,"123456789012345678901")

  Delay_ms(500)
  LCD_Setpos(0,0)

  Lcd_String_6x8(0,0,"ABCDEFGHIJKLMNOPQRSTU")
  Lcd_String_6x8(0,1,"ABCDEFGHIJKLMNOPQRSTU")
  Lcd_String_6x8(0,2,"ABCDEFGHIJKLMNOPQRSTU")
  Lcd_String_6x8(0,3,"ABCDEFGHIJKLMNOPQRSTU")
  Lcd_String_6x8(0,4,"ABCDEFGHIJKLMNOPQRSTU")
  Lcd_String_6x8(0,5,"ABCDEFGHIJKLMNOPQRSTU")
  Lcd_String_6x8(0,6,"ABCDEFGHIJKLMNOPQRSTU")
  Lcd_String_6x8(0,7,"ABCDEFGHIJKLMNOPQRSTU")
  
 Wend
 
 End.
Fouten zijn het bewijs dat je het probeert..
Arco

Special Member

De chip select van een peripheral (display) mag alleen tijdens versturen data laag zijn, moet verder altijd hoog zijn!
(dat het dan niet werkt duidt erop dat er ergens wat mis zit in de software...)

[Bericht gewijzigd door Arco op donderdag 2 april 2020 17:49:22 (23%)

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

Golden Member

De chip select van een peripheral (display) mag alleen tijdens versturen data laag zijn, moet verder altijd hoog zijn!
(dat het dan niet werkt duidt erop dat er ergens wat mis zit in de software...)

Nu ja, zie het programma hierboven. Dat is allemaal redelijk eenvoudig gebleven. Of bedoel je wat andere sofware (compiler?)

Ik had het tijdens het speuren ergens gevonden, waarbij de CS aan de GND werd gelegd bij een Oled en de 887. Ik zal eens kijken of ik dat nog kan vinden.

Ik geef toe dat het aansturen van de CS vanuit MB, waarbij de poort als input moest worden gedefiniëerd i.p.v. output (anders werkte het gewoon niet) raar blijft.

Maar met deze opstelling en programma heb ik nog niet eerder zo stabiel gehad...

Fouten zijn het bewijs dat je het probeert..
Arco

Special Member

Je kunt de CS wel aan GND leggen, maar dan blijft de SPI bus altijd 'open' staan.
Buiten dat dit niet normaal is, kun je de SPI bus ook niet meer voor andere toepassingen gebruiken. (ik heb meestal 3...4 zaken aan de SPI bus hangen)

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

Golden Member

Ja, dat is natuurlijk zo. De CS selecteert dus welke Chip (display) actief is, waar je de data heenstuurt. Bij I2C wordt dat bepaald naar welk slave adres het wordt gestuurd, niet?

De chip select van een peripheral (display) mag alleen tijdens versturen data laag zijn, moet verder altijd hoog zijn!

Om dan wat zuiver in de leer te blijven heb ik het zo opgelost:
In de routines die data versturen, zet ik de CS op 0, en na de schrijfopdracht weer hoog (via Poort C.1).
Is dat de juiste methode?

Nu ben je dan wel vaak met de CS aan het schakelen. Of 'mag' je hem ook zetten aan het begin van een schrijf-subroutine met veel schrijfopdrachten en daarna weer gauw hoog maken?.

pic basic code:

'====================================================================================================
Sub Procedure Lcd_WrCmd(Dim pCmd As Byte)                       'Write command to display
'====================================================================================================
  D_C = 0
  C_S = 0
  Spi1_Write(pCmd)
  C_S = 1
End Sub

'====================================================================================================
Sub Procedure Lcd_WrDat(Dim pDat As Byte)                       'Write data to display
'====================================================================================================
  Dim lCnt As Byte
  C_S = 0
  D_C = 1
  Spi1_Write(pDat)
  C_S = 1
End Sub
Fouten zijn het bewijs dat je het probeert..
Bavelt

Golden Member

Dit zou dan dus ook kunnen?

pic basic code:

C_S = 0

Lcd_String_6x8(0,0,"123456789012345678901")
Lcd_String_6x8(0,1,"123456789012345678901")
Lcd_String_6x8(0,2,"123456789012345678901")
Lcd_String_6x8(0,3,"123456789012345678901")
Lcd_String_6x8(0,4,"123456789012345678901")
Lcd_String_6x8(0,5,"123456789012345678901")
Lcd_String_6x8(0,6,"123456789012345678901")
Lcd_String_6x8(0,7,"123456789012345678901")

C_S = 1
Fouten zijn het bewijs dat je het probeert..
Arco

Special Member

Dat gaat niet werken. Soms moet je 2 of (veel) meer bytes sturen die bij elkaar horen, die moeten wel in dezelfde chipselect cycle zitten.
(anders heeft het display geen idee dat de boel bij elkaar hoort en behandelt elke byte los)

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

Golden Member

Dus het tweede voorbeeld is beter begrijp ik. Of sterker: zo moet het. De strings horen bij elkaar. Klopt he?

Fouten zijn het bewijs dat je het probeert..