Bienvenue aux nouveaux arrivants sur FantasPic !
- Pensez à lire les règles durant votre visite, il n'y en a pas beaucoup, mais encore faut-il les respecter .
- N’hésitez pas à faire des remarques et/ou suggestions sur le Forum, dans le but de l'améliorer et de rendre vos prochaines visites plus agréables.
- Vous pouvez regarder votre "panneau de l'utilisateur" afin de configurer vos préférences.
- Un passage par "l'utilisation du forum" est recommandé pour connaître les fonctionnalités du forum.
--- L’équipe FantasPic ---
- Pensez à lire les règles durant votre visite, il n'y en a pas beaucoup, mais encore faut-il les respecter .
- N’hésitez pas à faire des remarques et/ou suggestions sur le Forum, dans le but de l'améliorer et de rendre vos prochaines visites plus agréables.
- Vous pouvez regarder votre "panneau de l'utilisateur" afin de configurer vos préférences.
- Un passage par "l'utilisation du forum" est recommandé pour connaître les fonctionnalités du forum.
--- L’équipe FantasPic ---
Modérateur : Gérard
Oled 128x64 piloté avec un PIC en Mikrobasic
Bonsoir pspic, francois77, satinas, paulfjujo, et tout le forum,
donc... territoire neutre
Je peux dans la semaine que réponde à des heures tardif, à causse du taf... sorry
pspic, et tu sur de ton adresse I2c
Sinon on peut faire une recherche automatique en basic, comme dans mon programme... et de plus ça te servira pour tes futurs programme.
Effectivement c'est une bonne déduction, comme à ton habitude mais on va remédier à ça par la suite, je regarde le code et je trouve que le code est bon, maintenant il faut créer une routine pour positionner le départ de l'écran, la même que celle fait en ASM
Dans cette exemple la variable posx représente la longueur, et posy représente le hauteur.
Il est impérative de créer une routine de positionnement, parce que certain écran OLED (en particulier les écrans chinois) écrive en dehors de l'écran.
Après, comme je ne suis pas un spécialise de MikroBasic, est ce que les registres sont configurer correctement.
Dans mon exemple ma vitesse est de 64 Mhz, donc activation de la PLL comme ceci
Coté I2c les registres son configuré comme ceci
Tout ça est à vérifier, excuse pour les routines ASM mi en section Langage BASIC & PASCAL, c'est Gérard qui va être content ....
A+
paulfjujo a écrit :Source du message because parce que c'est du basic !
donc... territoire neutre
Je peux dans la semaine que réponde à des heures tardif, à causse du taf... sorry
pspic, et tu sur de ton adresse I2c
Sinon on peut faire une recherche automatique en basic, comme dans mon programme... et de plus ça te servira pour tes futurs programme.
satinas a écrit :Source du message Il n'a encore envoyé aucune data à l'afficheur, pourquoi voulez-vous qu'il affiche quoi que ce soit ?
Ou alors on n'a pas tout le programme.
Effectivement c'est une bonne déduction, comme à ton habitude mais on va remédier à ça par la suite, je regarde le code et je trouve que le code est bon, maintenant il faut créer une routine pour positionner le départ de l'écran, la même que celle fait en ASM
Code : Tout sélectionner
;-------------------------------- "position de y et x avec page" -------------------------------
i2c_position
rcall i2c_commande ; mode commande (0x00)
movf posx,W ; longueur de l'écran 0 à 127 (128 pixels(colonnes))
andlw B'00001111' ;
rcall i2c_ecrit
movf posx,W ;
swapf WREG,W ;
andlw B'00000111' ;
bsf WREG,4 ;
rcall i2c_ecrit
movf posy,W
addlw 0xB0 ; hauteur de l'écran 0 à 7 pages(8 lignes)
rcall i2c_ecrit ;
rcall i2c_stop ;
return
Dans cette exemple la variable posx représente la longueur, et posy représente le hauteur.
Il est impérative de créer une routine de positionnement, parce que certain écran OLED (en particulier les écrans chinois) écrive en dehors de l'écran.
Après, comme je ne suis pas un spécialise de MikroBasic, est ce que les registres sont configurer correctement.
Dans mon exemple ma vitesse est de 64 Mhz, donc activation de la PLL comme ceci
Code : Tout sélectionner
;******************** "configuration de l'oscillateur du microcontrôleur" **********************
movlw B'01110100' ; oscillateur à 16 Mhz, fréquence stable avec PLL (16 * 4)= 64 Mhz
movwf OSCCON
;-----------------------------------------------------------------------------------------------
movlw B'00000000' ;
movwf OSCCON2 ;
;**************************** configuration du registre OSCTUNE ********************************
movlw B'01000000' ; bit 6 à 1 : PLL * 4
movwf OSCTUNE ;
Coté I2c les registres son configuré comme ceci
Code : Tout sélectionner
;**************************** configuration du registre SSP1STAT *******************************
movlw B'10000000' ; b7 = mode maître, 1 Mhz, 400 khz, 100 khz selon la
movwf SSP1STAT ; configuration du registre SSPADD
;**************************** configuration du registre SSP1CON1 *******************************
movlw B'00101000' ; bit 5 (SSPEN) = 1, bit 3 (SSPM3) = 1, bit 2 (SSPM2) = 0
movwf SSP1CON1 ; bit 1 (SSPM1) = 0, bit 0 (SSPM0) = 0
;************************* configuration du registre SSPADD en bank 1 **************************
movlw B'10011111' ; SSPADD = Quartz(64 000 000 Hz) / (4*100 000)) - 1 = 159
movwf SSPADD ; vitesse I2c (100 khz)
Tout ça est à vérifier, excuse pour les routines ASM mi en section Langage BASIC & PASCAL, c'est Gérard qui va être content ....
A+
Oled 128x64 piloté avec un PIC en Mikrobasic
Oled 128x64 piloté avec un PIC en Mikrobasic
Oled 128x64 piloté avec un PIC en Mikrobasic
- paulfjujo
Expert- Messages : 2598
- Âge : 73
- Enregistré en : juillet 2015
- Localisation : 01800
- Contact :
bonsoir à tous,
un morceau qui tourne sur mon mini oled 128x64 SSD1306
affichage du caractere special Degré C
La version mikrobasic limitée de 2K ne permet pas de rajouter toute la table ascii
ATTENTION :
à l'init FOSC !
aux ANSEL x , car entree ANA par defaut !
toujours faire clignoter une led en tete de programme ..pour voir si celui ci demarre et tourne
Difficile de passer du C au basic !
un morceau qui tourne sur mon mini oled 128x64 SSD1306
affichage du caractere special Degré C
La version mikrobasic limitée de 2K ne permet pas de rajouter toute la table ascii
ATTENTION :
à l'init FOSC !
aux ANSEL x , car entree ANA par defaut !
toujours faire clignoter une led en tete de programme ..pour voir si celui ci demarre et tourne
Difficile de passer du C au basic !
Code : Tout sélectionner
program test_Oled2
'PIC 18F46K22, osc 16 MHz, librairie I2C
'SCL sur RC3 et SDA sur RC4
' rev paulfjujo 21/02/2023
dim bc as byte
dim i,j,k as integer
dim Soft_I2C_Scl as sbit at RC3_bit
Soft_I2C_Sda as sbit at RC4_bit
Soft_I2C_Scl_Direction as sbit at TRISC3_bit
Soft_I2C_Sda_Direction as sbit at TRISC4_bit
dim Led_R as sbit at LATA4_bit
dim Led_R_Dir as sbit at TRISA4_bit
Const DegreC as byte[8]=($0F,8,15,0,$F8,$88,$88,$88)
sub procedure WriteCmd (dim cmd as byte)
I2C1_Start()
I2C1_Wr($78) 'Adresse module
I2C1_Wr($00)
I2C1_Wr(cmd)
I2C1_Stop()
end sub
sub procedure WriteDat (dim donnee as byte)
I2C1_Start()
I2C1_Wr($78) 'Adresse module
I2C1_Wr($40)
I2C1_Wr(donnee)
I2C1_Stop()
end sub
sub Procedure Affiche_Degre_Car_8x8 (dim posX as byte , dim PosY as byte)
dim k as integer
WriteCmd($20)
WriteCmd($00) ' // horizontal mode
WriteCmd($21) ' // On configre la largeur de l'ecran
' pour forcer, limiter le retournement horizontal voir DS figure 10.5
WriteCmd(0+posX)' // Colonne minimum
WriteCmd(7+posX)' // Colonne MAximum;
WriteCmd($22) '
'// positionement vertical entre page 1 et 3 H=16 pixels
WriteCmd(PosY)
WriteCmd(PosY+1)
for k=0 to 7
WriteDat(DegreC[k])
next k
' pour forcer, limiter le retournement horizontal voir DS figure 10.5
' modif 20-08-2020
WriteCmd($20)
WriteCmd($00) 'WriteCmd($00); // horizontal mode
WriteCmd($21) ' On configre la largeur de l'ecran
WriteCmd(0) ' Colonne minimum x=0
WriteCmd(127) ' Colonne MAximum x=127
WriteCmd($22)
end sub
sub procedure OLED_Init()
'SSD1306.pdf
'Software Configuration
WriteCmd(0xAE)' 'display off
Delay_ms(200)'
WriteCmd(0xAF)' 'display on
Delay_ms(100)'
WriteCmd(0xB0)'' Set GDDRAM Page start adresse [2:0] 0 à 7
WriteCmd(0x00)' ' mini 0
WriteCmd(0x03)' ' maxi
' WriteCmd(0x07)' ' maxi pour 128x64
WriteCmd(0x20)' 'Set Horizontal Memory Addressing Mode
'A[1:0] = 00b, Horizontal Addressing Mode
'A[1:0] = 01b, Vertical Addressing Mode
'A[1:0] = 10b, Page Addressing Mode (RESET)
'A[1:0] = 11b, Invalid
WriteCmd(0x02)' ' Page Addressing Mode (RESET)
WriteCmd(0x21)' ' Setup column start and end address
WriteCmd(0)' 'A[6:0] : Column start address, range : 0-127d,(RESET=0d)
WriteCmd(0x7F)' ' B[6:0]: Column end address, range : 0-127d,(RESET =127d)
WriteCmd(0x22)'' Setup page start and end address
' A[2:0] : Page start Address, range : 0-7d,
' (RESET = 0d)
' B[2:0] : Page end Address, range : 0-7d,
' (RESET = 7d)
WriteCmd(0x00)'
WriteCmd(0x03)' 'was 0x07
' WriteCmd(0xA0)' '--set segment re-map colum 0 to SEG 0 de droite -> gauche
WriteCmd(0xA1)' '--set segment re-map to 127 de gauche -> droite
WriteCmd(0xA4)''command enable display outputs according to the GDDRAM contents.
' WriteCmd(0xA5)''command forces the entire display to be “ON”, regardless of the contents of the display data RAM.
WriteCmd(0xA6)''normal display
' WriteCmd(0xA7)''reverse display
WriteCmd(0xC8)' 'Set COM Output Scan Direction
'C0h, X[3]=0b: normal mode (RESET) Scan from COM0 to COM[N –1]
'C8h, X[3]=1b: remapped mode. Scan from COM[N-1] to COM0
WriteCmd(0xD3)' '--set start line address 40h = set to 0
WriteCmd(0x3F)' '0x40 ou 0x3F
' was WriteCmd(0x00)'
'0xD3,0x3F, ' DISPLAY offset ROW0 - L0xD3,0x00,leaves one row of pixels at top. 0xD3,0x3F is better
WriteCmd(0xD5)' '--set display clock divide ratio/oscillator frequency
WriteCmd(0x80)' '--set divide ratio 80h
WriteCmd(0xA8)' '--set multiplex ratio to 63
WriteCmd(0x3F)' ' was 3F
WriteCmd(0xD6)' '-- This command is to set the vcommon signals padconfiguration.
WriteCmd(0x80)' ' --set divide ratio 80h
WriteCmd(0xD9)' '--set display clock divide ratio/oscillator frequency
' A[3:0] : Phase 1 period of up to 15 DCLK clocks 0 is invalid entry(RESET=2h)
' A[7:4] : Phase 2 period of up to 15 DCLKclocks 0 is invalid entry(RESET=2h )
WriteCmd(0x1F)' ' 22h --reset values 22h
' WriteCmd(0x1F)' ' 44h --reset values 22h
'0xDA, (C.OLED_HEIGHT==64)?0x12:0x02,
WriteCmd(0xDA)' '--set com pins hardware configuration
WriteCmd(0x20)' ' was 0x02 32
' WriteCmd(0x00)' ' was 0x02 32
' WriteCmd(0x12)' ' 0x12h 64
' A[4]=0b, Sequential COM pin configuration
' A[4]=1b(RESET), Alternative COM pin configuration
' A[5]=0b(RESET), Disable COM Left/Right remap
' A[5]=1b, Enable COM Left/Right remap
' WriteCmd(0xE0)' ' Read-Modify-Write start
WriteCmd(0xEE)' ' Read-Modify-Write end.
WriteCmd(0x81)' '--set contrast control register
WriteCmd(0x7F)' ' 0x00~0xff
WriteCmd(0x2E)' ' no scrolling
WriteCmd(0xDB)' '--set VComH deselect level
' WriteCmd(0x35)' '--POR =35h
WriteCmd(0x40)' ' 20H => 0.77x Vcc (Reset value)
WriteCmd(0x8D)' '--set DC-DC enable Charge Pump Setting
WriteCmd(0x14)' ' 0x14 Enable Charge Pump
WriteCmd(0xAF)' '--turn on oled panel
end sub
sub procedure CRLF1()
UART1_Write(13)
UART1_Write(10)
end sub
sub procedure OLED_SetPos(dim x as byte,dim y as byte)
WriteCmd(0xB0+y) ' set GDDRAM Page start adresse [2:0] 0 à 7
WriteCmd(x and 0x0F)
WriteCmd(((x AND 0xF0)>>4)+ 0x10)
end sub
sub procedure OLED_CLS()
dim m , n as byte
WriteCmd(0x21) ' Setup column start and end address
WriteCmd(0) 'A[6:0] : Column start address, range : 0-127d,(RESET=0d)
WriteCmd(127) ' B[6:0]: Column end address, range : 0-127d,(RESET =127d)
WriteCmd(0x22)
WriteCmd(0)
WriteCmd(3) ' was 7
WriteCmd(0xD3) '-set display offset
WriteCmd(0x40) 'page 0 à 3
OLED_SetPos(0,0)
for m=0 to 4
WriteCmd(0xB0+m) 'page0-page1
WriteCmd(0x01) 'low column start address
WriteCmd(0x10) 'high column start address
Delay_us(10)
for n=0 to 128
WriteDat(0x00)
Delay_us(10)
next n
next m
WriteCmd(0x2E)
OLED_SetPos(0,0)
end sub
'Main sub procedure
main:
' Force System Clock Select (SCS) bits to zero. See note [1] below.
OSCCON.SCS0 = 0
OSCCON.SCS1 = 0
' Select 16MHz internal oscillator frequency.
OSCCON.IRCF0 = 1
OSCCON.IRCF1 = 1
OSCCON.IRCF2 = 1
' Enable PLL frequency multiplier (x4).
OSCTUNE.PLLEN = 0
delay_ms(1000)
PORTC=0
LATC=0
ANSELC=0
TRISC = $80
ANSELA=0
PORTA=0
Led_R_Dir=0
for i=0 to 4
Led_R=1
delay_ms(500)
Led_R=0
delay_ms(500)
next i
UART1_init (19200)
UART1_Write_Text("Test OLED SSD1306")
CRLF1()
UART1_Write_Text("affiche le sigle de degre C")
CRLF1()
I2C1_Init(100000) ' Init Soft I2C
delay_ms(1000)
OLED_Init()
OLED_Cls()
Affiche_Degre_Car_8x8(10,10)
Delay_ms(2000)
end.
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
Modifié en dernier par paulfjujo le mar. 21 févr. 2023 18:24, modifié 1 fois.
Oled 128x64 piloté avec un PIC en Mikrobasic
-
francois77
Passionné- Messages : 307
- Enregistré en : avril 2022
Oled 128x64 piloté avec un PIC en Mikrobasic
- paulfjujo
Expert- Messages : 2598
- Âge : 73
- Enregistré en : juillet 2015
- Localisation : 01800
- Contact :
francois77 a écrit :Bonjour
A priori tu n'as pas la bonne adresse ?
A+
Francois
pourquoi ?
Au depart , avec le programme initial , la led (témoin rajouté sur RA4) ne clignotait meme pas ...
donc pas la peine d'aller plus loin ..
nota : Affiche_Degre_Car_8x8(x,y)
X de 0 à 120
y de 0 à 3 (page ou ligne )
Affiche_Degre_Car_8x8(10,0)
Affiche_Degre_Car_8x8(40,1)
Affiche_Degre_Car_8x8(80,2)
Affiche_Degre_Car_8x8(110,3)
Oled 128x64 piloté avec un PIC en Mikrobasic
Oled 128x64 piloté avec un PIC en Mikrobasic
Oled 128x64 piloté avec un PIC en Mikrobasic
Retourner vers « Langage BASIC & PASCAL »
Qui est en ligne
Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 104 invités