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...
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...
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...
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)
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'...
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?
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)
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
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
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.
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?
Special Member
SDI (serial data in, soms ook uitgelegd als slave data in) wordt niet gebruikt.
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?
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.
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.
Special Member
Chipselect van de SSD moet een output zijn, zeker geen input. (waarschijnlijk staat er wat anders verkeerd)
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...
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%)
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.
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%)
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...
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)
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
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
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)
Golden Member
Dus het tweede voorbeeld is beter begrijp ik. Of sterker: zo moet het. De strings horen bij elkaar. Klopt he?