Ja,
Je kunt rustig de chipselect voor en na een groep of commando's of strings aan en uitzetten, maar niet na elke byte (geeft ook veel te veel overhead)
Sommige commando's bestaan uit 2 of 3 bytes, die mogen zeker niet onderbroken worden...
Special Member
Ja,
Je kunt rustig de chipselect voor en na een groep of commando's of strings aan en uitzetten, maar niet na elke byte (geeft ook veel te veel overhead)
Sommige commando's bestaan uit 2 of 3 bytes, die mogen zeker niet onderbroken worden...
Golden Member
En dus werd het zo. Werkt ook prima!
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
' CS: PORT C.1 Pin 16
' RES: High
'====================================================================================================
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
C_S As sbit at PORTC.1 'pin 16
i1 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 = %01111101 'PORTC.1 and PORTC.7 output
OSCCON = %01110000 '16 Mhz internal
C_S = 0
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
C_S = 1
While True
Delay_ms(500)
C_S = 0
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(1000)
LCD_Setpos(0,0)
Lcd_String_6x8(0,0,"Nu is het een andere ")
Lcd_String_6x8(0,1,"tekst die wordt ")
Lcd_String_6x8(0,2,"getoond! ")
Lcd_String_6x8(0,3,"De letter zijn nog ")
Lcd_String_6x8(0,4,"behoorlijk scherp. ")
Lcd_String_6x8(0,5,"The Quick Brown Fox ")
Lcd_String_6x8(0,6,"Jumps Over The Lazy ")
Lcd_String_6x8(0,7,"Dog. ")
C_S = 1
Wend
End.
Golden Member
Ik heb nog een zelfde exemplaar Oled hier, ook SPI en 0,96".
Deze heeft echter 2 kleuren, De eerste 2 regels zijn amber, de overige blauw.
Ik neem aan dat je die kleuren ook kunt sturen? (Er zit geen aparte pin voor).
Special Member
Nee, da's gewoon gekleurd in het display, daar kun je niks aan veranderen...
Golden Member
Vermoedde ik al.
Dan probeer ik nog wat te spelen met de lichtopbrengst (contrast)
In mijn onschuld dacht ik dat met 0x81 en daarna een waarde het contrast is te regelen.
Maar het ding reageert hier niet op:
--- Loop
pic basic code:
i1 = i1 + 10
Lcd_WrCmd(0x81) 'Contrast control
Lcd_WrCmd(i1) 'value
Special Member
Geen idee,
Ik heb nog nooit aandrang gehad om het kontrast te verminderen... (hoe meer hoe beter...)
Golden Member
Ik vind de lichtopbrengst nl inderdaad te zwak. Daarom wilde ik het verhogen. je zou volgens de datasheet een waarde tussen 0x00 en 0xFF moeten kunnen geven, maar elke waarde geeft hetzelfde resultaat.
Golden Member
Dan heb ik hier NOG een Oled (TFT scherm) , dat lijkt wel een kruising tussen de I2C en SPI. Volgens de achterzijde is het SPI.
Een SDA, SCL pin (I2C dus), maar ook een DC en RES (en BLK?)
Soms worden de benamingen ook wel eens door elkaar gehaald heb ik al gemerkt. Dan noemt met het CLK, dan Weer SCL.
Golden Member
Special Member
Dan heb ik hier NOG een Oled (TFT scherm) , dat lijkt wel een kruising tussen de I2C en SPI. Volgens de achterzijde is het SPI.
Een SDA, SCL pin (I2C dus), maar ook een DC en RES (en BLK?)
Ze maken meestal maar 1 printje voor i2c en spi. Wat voor text er bij de pinnen staat moet je dan ook niet zo op letten...
Voor aansturen heb je flink wat meer geheugen nodig. (8x zoveel pixels en dat in 3 kleuren...)
Golden Member
Ondertussen heb ik de contrast wijziging ook aan de praat met de Set Contrast Control:
pic basic code:
Lcd_WrCmd(0x81) 'Contrast control
gevolgd door een waarde.
Ondanks dat je 256 niveaus kan instellen, is het effekt minimaal. Zou ook aan de fabrikant kunnen liggen, vermoed ik.
Ik vind het overigens nog steeds heel leuk dat je voor een extreem laag bedrag toch zo'n schermpje kan gebruiken, met toch nog een verrassend goed beeld.
de PIC16F887 heeft maar 1 MSSP begreep ik. Dat zou inhouden dat je óf voor SPI óf voor I2C moet kiezen (als je er bv een extra device I2C aan wilt hangen voor bv een klokje, temp o.i.d dan kan dat niet).
Het zij zo...
Special Member
Voor kleuren moet je de RGB waardes opgeven voor een groep van 3 pixels. (rood, groen, en blauw. Zo ontstaat de gewenste kleur)
[Bericht gewijzigd door Arco op vrijdag 3 april 2020 12:44:08 (11%)
Golden Member
Even nog een klein worstelingetje met het OSCCON register in de 1847:
pic basic code:
5.6 Register Definitions: Oscillator Control
REGISTER 5-1: OSCCON: OSCILLATOR CONTROL REGISTER
R/W-0/0 R/W-0/0 R/W-1/1 R/W-1/1 R/W-1/1 U-0 R/W-0/0 R/W-0/0
SPLLEN IRCF<3:0> — SCS<1:0>
bit 7 bit 0
Legend:
R = Readable bit W = Writable bit U = Unimplemented bit, read as ‘0’
u = Bit is unchanged x = Bit is unknown -n/n = Value at POR and BOR/Value at all other Resets
‘1’ = Bit is set ‘0’ = Bit is cleared
bit 7 SPLLEN: Software PLL Enable bit
If PLLEN in Configuration Words = 1:
SPLLEN bit is ignored. 4x PLL is always enabled (subject to oscillator requirements)
If PLLEN in Configuration Words = 0:
1 = 4x PLL Is enabled
0 = 4x PLL is disabled
bit 6-3 IRCF<3:0>: Internal Oscillator Frequency Select bits
000x = 31 kHz LF
0010 = 31.25 kHz MF
0011 = 31.25 kHz HF(1)
0100 = 62.5 kHz MF
0101 = 125 kHz MF
0110 = 250 kHz MF
0111 = 500 kHz MF (default upon Reset)
1000 = 125 kHz HF(1)
1001 = 250 kHz HF(1)
1010 = 500 kHz HF(1)
1011 = 1MHz HF
1100 = 2MHz HF
1101 = 4MHz HF
1110 = 8 MHz or 32 MHz HF(see Section 5.2.2.1 “HFINTOSC”)
1111 = 16 MHz HF
bit 2 Unimplemented: Read as ‘0’
bit 1-0 SCS<1:0>: System Clock Select bits
1x = Internal oscillator block
01 = Timer1 oscillator
00 = Clock determined by FOSC<2:0> in Configuration Words.
Note 1: Duplicate frequency derived from HFINTOSC.
Het gaat met name om de laatste 2 bits (bits 1-0). Als ik nu 8Mhz frequentie wil, Is het dan
OSCCON =%01110010 of %01110000 ?
Special Member
Kan beide. Bij '1' wordt altijd de interne oscillator gebruikt, bij '0' hangt dat af van de config setting.
Golden Member
Ik heb nog een foutje / onjuistheid ontdekt in mijn eigen programma:
(Even checken of ik het juist heb):
pic basic code:
Dim D_C As sBit at LATB.0 'pin 6 'Data/Command
ClockPin As sbit at PORTB.4 'pin 10 'Clock
Datapin As sbit at PORTB.2 'pin 8 'SDO
C_S As sbit at LATA.4 'pin 3 'Chip Select
RES As sbit at LATB.3 'pin 9 'RESET
Voor de C_S, RES en D/C stond PORT maar moet volgens mij LAT zijn voor de PIC16F1847, omdat het hier output betreft.
Dan had ik de CS aan LATB.1 gekoppeld, omdat ik dacht dat die "vrij" was. Maar ik merkte dat na de SPI1_Init() het moeilijk was om deze poort op logisch hoog te krijgen.
In de Datasheet van de 1847 lees ik dat B.1 ook wordt gebruikt voor de SPI (SDI1).
Daarom leek het me beter een echt 'vrije poort' te kiezen, c.q. A.4
Golden Member
Wat ik me tevens afvroeg: de 1847 heeft twee keer I2C en SPI aan boord.
Maar sommige pinnen zijn gecombineerd.
Zo zie je bijvoorbeeld dat aan Poort B.4 zowel de SCL als SCK wordt toegekend.
Maar mag je wanneer je SPI EN I2C beide gebruikt in een programma, dezelfde pin gebruiken als clock voor SPI én I2C?
Zo nee,dan zou je dus alleen maar 1 keer SPI en 1 keer I2C kunnen gebruiken (en dan ook nog met APFCON poorten aan het verschuiven gaan).
Special Member
Tja,
Als je SPI en I2C beide gebruikt is dat al ongewoon in zo'n klein controllertje. (veel peripherals zijn in i2c en spi te koop)
En de kans dat iemand meer als 1 spi of i2c bus nodig heeft is ook al heel erg klein.
Beter dan een grotere met meer pinnen nemen, dan heb je meer mogelijkheden.
Golden Member
Beter dan een grotere met meer pinnen nemen, dan heb je meer mogelijkheden.
Wat zou dan een redelijk alternatief zijn, die je echter nog wel in een breadbord kan plaatsen?
Golden Member
Nog een issue met het APFCON register en de 1847:
Met APFCON0 = %01000000 verplaats je SDO1 naar Poort A.6
(Default = B.2)
Maar op A.6 zit ook de CLKOUT. Kan dat dan wel?
(het werkt ook idd niet)
Special Member
Je kunt clkout toch gewoon uitzetten? (gebruikt toch bijna niemand)
Golden Member
Op 4 april 2020 20:01:10 schreef Arco:
Je kunt clkout toch gewoon uitzetten? (gebruikt toch bijna niemand)
Ik heb Ckock Out Disabled in de Project Settings...
[Bericht gewijzigd door Bavelt op zondag 5 april 2020 00:48:38 (14%)
Special Member
CONFIG1:CLKOUTEN bit
Golden Member
Ik heb Ckock Out Disabled in de Project Settings...
Is dat niet hetzelfde?
Special Member
Dat denk ik wel ja...