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 ---
Forum général en BASIC et PASCAL !

Modérateur : Gérard

Oled 128x64 piloté avec un PIC en Mikrobasic
Temps-x
Avatar de l’utilisateur
Expert
Expert
Messages : 2595
Enregistré en : juillet 2016
Localisation : Terre

#21 Message par Temps-x » mar. 21 févr. 2023 01:48

Bonsoir pspic, francois77, satinas, paulfjujo, et tout le forum,

paulfjujo a écrit :Source du message exit because parce que c'est du basic !

:roll: donc... territoire neutre :wink:



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.


:roll: Effectivement c'est une bonne déduction, comme à ton habitude :wink: 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 .... :langue:

==> A+
:roll: Les requins, c'est comme le langage ASM, c'est le sommet de la chaîne alimentaire. :wink:

Oled 128x64 piloté avec un PIC en Mikrobasic
Gérard
Avatar de l’utilisateur
Expert
Expert
Messages : 1640
Âge : 65
Enregistré en : septembre 2015
Localisation : Alsace - Haut-Rhin

#22 Message par Gérard » mar. 21 févr. 2023 17:40

Bonjour à tous,
Je suis les discussions et je plane, pas possible pour moi de participer.
Le 18/04/19 je suis devenu papy de jumeaux, le 01/09/23 une petite cousine des jumeaux est née.

Oled 128x64 piloté avec un PIC en Mikrobasic
pspic
Passioné
Passioné
Messages : 357
Âge : 77
Enregistré en : septembre 2017
Localisation : 68

#23 Message par pspic » mar. 21 févr. 2023 18:01

Bonjour à tous,
J'ai constaté que le programme se fige à la sortie de I2C1_Start()
Ne vous cassez pas la tête, je vais chercher et quand j'aurai trouvé je reviens.
Pour Temps-x, je suis preneur de l'outil pour chercher l'adresse du module.
Bonne soirée.

Oled 128x64 piloté avec un PIC en Mikrobasic
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 2589
Âge : 73
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#24 Message par paulfjujo » mar. 21 févr. 2023 18:22

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 !
idea ! toujours faire clignoter une led en tete de programme ..pour voir si celui ci demarre et tourne


Difficile de passer du C au basic !
TestOled_PSPIC.zip




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.
Aide toi, le ciel ou FantasPic t'aidera

Oled 128x64 piloté avec un PIC en Mikrobasic
francois77
Passioné
Passioné
Messages : 307
Enregistré en : avril 2022

#25 Message par francois77 » mar. 21 févr. 2023 18:23

Bonjour

A priori tu n'as pas la bonne adresse ?

A+
Francois

Oled 128x64 piloté avec un PIC en Mikrobasic
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 2589
Âge : 73
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#26 Message par paulfjujo » mar. 21 févr. 2023 18:27

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)
Aide toi, le ciel ou FantasPic t'aidera

Oled 128x64 piloté avec un PIC en Mikrobasic
pspic
Passioné
Passioné
Messages : 357
Âge : 77
Enregistré en : septembre 2017
Localisation : 68

#27 Message par pspic » mer. 22 févr. 2023 07:39

Bonjour à tous,
Paul tu es le meilleur !
Grâce à toi ça commence à fonctionner et je commence à piger.
Merci à tous pour votre participation.
ImOled0.jpg
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.

Oled 128x64 piloté avec un PIC en Mikrobasic
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 2589
Âge : 73
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#28 Message par paulfjujo » mer. 22 févr. 2023 09:58

bonjour Pierre,

mon ecran mini Oled est un 4 lignes 128x(8x4)
le tien semble etre un 8 lignes , => 8 pages .. 0 à 7
donc à moitié effacé.
... modifs à faire
Aide toi, le ciel ou FantasPic t'aidera

Oled 128x64 piloté avec un PIC en Mikrobasic
pspic
Passioné
Passioné
Messages : 357
Âge : 77
Enregistré en : septembre 2017
Localisation : 68

#29 Message par pspic » mer. 22 févr. 2023 10:32

Salut Paul,
Je vais corriger le nombre de lignes.
J'ai aussi rectifié °C
Const DegreC as byte[8]=($0F,$08,$0F,$00,$F8,$88,$88,$88)
par :
Const DegreC as byte[8]=($0F,$09,$0F,$00,$F8,$88,$88,$88)

En tout cas merci pour ton aide, à moi d'approfondir maintenant.


Retourner vers « Langage BASIC & PASCAL »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 23 invités