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 sur le langage C !

Modérateur : Jérémy

OLED GC9A01 et SPI Hardw 18F27K42
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 2589
Âge : 73
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#31 Message par paulfjujo » lun. 20 mars 2023 17:54

bonjour,


A chaque jour suffit sa peine ...


si SPI SCLK =8Mhz
1 bit -> 125nS
8 clock pour 1 byte => 125nS * 8= 1000nS => 1µS
=> 1 000 000 bytes en 1sec
ou 1000 bytes / mS
pour effacer l'écran il faut envoyer 115200 bytes ( 240x240 pixels et couleur 16 bits)

Code : Tout sélectionner



void Ecran_Noir
(void)
Word i;
  
SendCmd(0x2A);
  
SendData(0);SendData(0); SendData(0);SendData(0xEF);
  
SendCmd(0x2B);  SendData(0);SendData(0); SendData(0);SendData(0xEF);
  
SendCmd(0x2C);  for (i=0;i<57600;i++)  { SendData(0);SendData(0);}

 


donc 115200/ 1000 => 115.2 mS
or je trouve :

Code : Tout sélectionner


     CPrint
(" Test duree Ecran Noir (SPI 8MHz!) \r\n"); 
     
Start_SMT1();
     
Ecran_Noir();
     
Stop_SMT1(); 


resultat sur terminal:
(17:26:01.821) Test duree Ecran Noir (SPI 8MHz!)
(17:26:02.121) Stop. SMT1=1886824 ,soit 29481 uS <----- soit 29,4mS


:mur: il y a ici une incohérence ou un meli mélo de neurones..

je verifie alors avec un coup d'oscillo (Tektro TDS2002C 1Gs/s 70MHz !)
j'ai bien un signal SPI SCLCK sur RC3 à 8Mhz !
periode mesuré : 126 ns
amplitude de 3,36V cr cr (alim MCU =3,5V)

Nota: l'ecran s'efface bien en Noir
testé aussi avec couleur SendData(0x55);SendData(0x55); .. efface avec un joli gris bleu

oops une idée ?
Où est-ce que je me fourvoie ?
Aide toi, le ciel ou FantasPic t'aidera

OLED GC9A01 et SPI Hardw 18F27K42
satinas
Expert
Expert
Messages : 1225
Enregistré en : novembre 2015

#32 Message par satinas » lun. 20 mars 2023 18:11

Bonjour,
Tu fais une boucle de 260 effacements, si ça dure 30 secondes, le module de mesure du pic se trompe.
Si cela dure 8 secondes, cela confirme que le pic se prépare pour les jeux olympiques.
Les modules SPI et SMT utilisent-ils la même source d'horloge ?
L'oscillo indique combien pour la durée totale de l'effacement ?
Modifié en dernier par satinas le lun. 20 mars 2023 18:33, modifié 1 fois.

OLED GC9A01 et SPI Hardw 18F27K42
francois77
Passioné
Passioné
Messages : 307
Enregistré en : avril 2022

#33 Message par francois77 » lun. 20 mars 2023 18:30

Hello

En mode SPI, l'affichage d'un écran prend 670ms en 249 *249

Si tu fait une règle de 3 avec ta version a 8MHZ tu devrais avoir un temps de 123ms en partant de ton calcul de 1.47MHZ

A+

OLED GC9A01 et SPI Hardw 18F27K42
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 2589
Âge : 73
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#34 Message par paulfjujo » lun. 20 mars 2023 19:18

A chaque fois que tu m'interpelles, ça fait remonter des problemes déja vécus
merçi Satinas...

en particulier le débordement SMT1 !
j'ai donc rajouté 2 tests , apres le 1er à 50mS
250mS et un 3em avec 350mS...

(18:28:11.651) Init et Test Compteur 24 bits SMT1 sur FOSC 64MHz
(18:28:11.651) Mesure SMT1 pour __delay_ms(50);
(18:28:11.681) Stop. SMT1=3200024 ,soit 50000 uS <--- OK
(18:28:11.700)
(18:28:11.700) Mesure SMT1 pour __delay_ms(250);
(18:28:11.942) Stop. SMT1=16000024 ,soit 250000 uS <--- OK
(18:28:11.956)

(18:28:16.326)
(18:28:16.326) Mesure SMT1 pour __delay_ms(350); <-- BAD
(18:28:16.677) Stop. SMT1=5622808 ,soit 87856 uS
(18:28:16.688)


CPrint(" Mesure SMT1 pour __delay_ms(350);\r\n");
Start_SMT1();
__delay_ms(350);
Stop_SMT1();

=> modif prescaler dans l' init SMT1

j'etais à PS[1:0]: SMT Prescale Select bits 1/1 => passé à 1/2
ou gerer le flag debordement comme dans Frequencemetre à base de SMT1

à suivre ...
Aide toi, le ciel ou FantasPic t'aidera

OLED GC9A01 et SPI Hardw 18F27K42
satinas
Expert
Expert
Messages : 1225
Enregistré en : novembre 2015

#35 Message par satinas » lun. 20 mars 2023 19:33

J'ai pas utilisé le module SMT. Si c'est un compteur 24 bits avec retour à 0 sur débordement, en stockant les valeurs du compteur dans des uint24_t, pour calculer une durée :
duree = (Ustop - Ustart) * durée_cycle_compteur
Formule restant valable s'il y a eu un seul débordement et Ustop n'a pas rattrapé Ustart, sinon il faut faire en plus:
duree += (Nb_Débordement - (Ustop < Ustart)) * 0x1000000 * durée_cycle_compteur

C'est bien sûr plus simple de remettre à zéro le compteur à chaque début de mesure. En le faisant tourner en permanence on a le temps de fonctionnement du pic depuis le reset, avec un unsigned 32 bit auquel on ajoute 0x1000000 à chaque débordement SMT. On peut alors mesurer une durée avec des valeurs 32 bits.

OLED GC9A01 et SPI Hardw 18F27K42
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 2589
Âge : 73
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#36 Message par paulfjujo » mar. 21 mars 2023 09:18

bonjour à tous,

In fine, j'ai modifié la source horloge 64MHz -> FOSC/4=16MHz pour le timer SMT1
c'est moins precis, mais la gamme de mesure est largement etendue ... testé à 1sec (sans debordement!)
( ou 2sec avec débordement)..
au dela ..le chrono Stamp de YAT terminal est suffisant ..

rajouté la detection de debordement via le flag SMT1IF ..
on pourrait traité LES debordements via l'interrupt associée pour les cumuler
mais une precision de +- 62,5nS est inutile au delà de quelques mS
à 16MHz on est quand meme à +-0,25 µS

Code : Tout sélectionner



void SMT1_Init
(void)
{
//04-04-2021 rev 21-03-2023
// registre  SMT1CON0
SMT1CON0bits.SMT1EN =1;    // SMT enabled
SMT1CON0bits.WPOL=0; // Window Polarity
SMT1CON0bits.SPOL=0; // Signal Polarity
SMT1CON0bits.CPOL=0; // Clock Polarity
// prescaler pour Compteur only, ne pas valider pour timer
SMT1CON0bits.SMT1PS1=0; // PS<1:0>: SMT Prescale Select bits = 1/1
SMT1CON0bits.SMT1PS0=0;    // 11=1/8  10=1/4  01=1/2 00=1/1
SMT1CON0bits.SMT1EN =1;    // SMT enabled
SMT1CON0bits.SMT1STP=0;    // 0 =reset 1=STOP;
SMT1CON1bits.SMT1GO=0;     // 1= suit l'entree   0=stop suivi
SMT1CON1bits.SMT1REPEAT=0; // 0= Single  Acquisition   1=repeat mode
// REGISTER 25-4: SMT1CLK: SMT CLOCK SELECTION REGISTER 16MHz
//     000=FOSC/4    001=FOSC  010=HINTOSC 16MHz  100=MFINTOSC 500Khz
// 500KZ    => resolution +-2µS
// SMT1CLKbits.CSEL2=  1;
// SMT1CLKbits.CSEL1=  0;  //was 001
// SMT1CLKbits.CSEL0=  0;
// 64MHZ
//SMT1CLKbits.CSEL2=  0;
//SMT1CLKbits.CSEL1=  0;  
//SMT1CLKbits.CSEL0=  1;
// FOSC/4 =16MHZ
SMT1CLKbits.CSEL2=  0;
SMT1CLKbits.CSEL1=  0; 
SMT1CLKbits
.CSEL0=  0;
// 25.7.1 PW (Pulse Width) AND PR (Periode Read)  ACQUISITIONI NTERRUPTS
PIR1bits.SMT1PRAIF=0;
PIE1bits.SMT1PRAIE=0;
//  25.7.2  PERIOD MATCHI NTERRUPT
PIR1bits.SMT1IF=0;
PIE1bits.SMT1IE=0;
// init  compteur
SMT1PRU=0xFF;
SMT1PRH=0xFF;
SMT1PRL=0xFF;
// MODE de fonctionnement TIMER  page 396
//   0000=Timer   0100=windowed measure  1000=counter
//SMT1CON1=0;
SMT1CON1bits.MODE3=0;
SMT1CON1bits.MODE2=0;
SMT1CON1bits.MODE1=0;
SMT1CON1bits.MODE0=0;
}

void Start_SMT1()
{
   txt=&TEXTE[0];
    SMT1_Measure=0;
   //PIR1 SMT1PWAIF SMT1PRAIF SMT1IF C1IF ADTIF ADIF ZCDIF INT0IF 138 
    PIR1bits.SMT1IF=0;
    SMT1CON0bits.SMT1STP=0;
    SMT1STATbits.RST=1;   // init FFFFFF
    SMT1CON1bits.SMT1GO=1;
}

void Stop_SMT1()
{
    SMT1CON1bits.SMT1GO=0;
    *(ST)=  SMT1TMRL;
    *(ST+1)=SMT1TMRH;
    *(ST+2)=SMT1TMRU;
    *(ST+3)=0;
    if (PIR1bits.SMT1IF==1) 
    
{
         CPrint("\r\n Over !\r\n");
         SMT1_Measure=SMT1_Measure+0x1000000;
    }   
    PIR1bits
.SMT1IF=; 
    sprintf
(txt, " Stop. SMT1=%lu ,soit ",SMT1_Measure);
    Print(txt);
    // pour fosc 500Khz
    //L1= SMT1_Measure <<1 ; // *2
    //pour FOSC=64MHz
    //L1= SMT1_Measure >>6 ; //64
     //pour FOSC=16MHz
    L1= SMT1_Measure >>; //16
    sprintf(txt, "%lu uS\r\n",L1); 
    Print
(txt);
    CRLF1();  
 
}


resultats YAT terminal

(08:38:00.377) Init et Test Compteur 24 bits SMT1 CLOCK sur 16MHz
(08:38:00.377) Mesure SMT1 pour __delay_ms(50);
(08:38:00.426) Stop. SMT1=800006 ,soit 50000 uS <-- OK
(08:38:00.448)
(08:38:00.448) Mesure SMT1 pour __delay_ms(350);
(08:38:00.787) Stop. SMT1=5600006 ,soit 350000 uS <--- OK
(08:38:00.820)
(08:38:00.820) Mesure SMT1 pour __delay_ms(1000);
(08:38:01.798) Stop. SMT1=16000006 ,soit 1000000 uS <-- verif OK à 1sec.
(08:38:01.837)
(08:38:01.837) My_Init SPI1
(08:38:01.837) TEST signaux SCLK et MOSI SPI Hardware avec SQA analyser (RA3=Synchro capture)
(08:38:01.837) SPI HARDW Sequence : 0x01 0x10 0X20 0x40 0x80 0xAA 0x0F 0x55 0xF0
(08:38:01.837) Armer la capture dans 3 sec !
(08:38:04.816)
(08:38:04.816) Init OLED Rond CG9A01
(08:38:04.849) Start SMT1 pour Init_CG9A01();
(08:38:05.599) Stop. SMT1=12401421 ,soit 775088 uS <--- 775mS
(08:38:05.609)
(08:38:05.609) fin d'init LCD
(08:38:05.609)
(08:38:05.609) Clear_LCD()
(08:38:05.902)
(08:38:05.902) Test duree Ecran Noir (SPI 8MHz!)
(08:38:06.197) Stop. SMT1=4666010 ,soit 291625 uS <-- 292mS
(08:38:06.232)
(08:38:06.232)
(08:38:06.232) Ecran Noir
(08:38:06.495) Rectangles Pleins Vert, Beige
(08:38:09.414) Rectangles Pleins Bleu,Blanc,Rouge
(08:38:11.538) put 8 big pixels
(08:38:13.537) Affichage voltmetre.bmp 240x240 65K couleurs .. OK
(08:38:13.554) Image datas organisee en 2 tables de 57600 Bytes
(08:38:13.554) partie 1 lignes 0 a 119
(08:38:13.554) puis partie 2 lignes 120 a 232
(08:38:13.602) Start chrono SQA dans 3 sec
(08:38:16.547)
(08:38:16.547) Test Duree de Chargement image Voltmetre.bmp <--- 395mS
(08:38:16.950) Stop. SMT1=6321619 ,soit 395101 uS
(08:38:16.995)
(08:38:16.995)
(08:38:16.995) ..fin Affichage Image voltmetre

(08:47:46.114) Mesure SMT1 pour __delay_ms(2000);
(08:47:48.107) Over !
(08:47:48.154) Stop. SMT1=32000006 ,soit 2000000 uS <-- 2 sec (avec debordement détecté)
Aide toi, le ciel ou FantasPic t'aidera

OLED GC9A01 et SPI Hardw 18F27K42
satinas
Expert
Expert
Messages : 1225
Enregistré en : novembre 2015

#37 Message par satinas » mar. 21 mars 2023 10:13

Bonjour,

Dans le fichier header du pic, il y a

Code : Tout sélectionner

extern volatile __uint24                SMT1TMR             __at(0x3F12);

Donc tu peux faire, si cela passe selon paramétrage xc8

Code : Tout sélectionner

unsigned long L = SMT1TMR;

Cela simplifie le code C, le code asm reste le même.

OLED GC9A01 et SPI Hardw 18F27K42
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 2589
Âge : 73
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#38 Message par paulfjujo » mar. 21 mars 2023 11:56

j' obtiens !
main.c:95:19: error: initializer element is not a compile-time constant
unsigned long L = SMT1TMR;

donc j'ai gardé ma variable
static uint32_t SMT1_Measure=0;

que je peux utiliser
SMT1_Measure=SMT1TMR;
à la place de:
// *(ST)= SMT1TMRL;
// *(ST+1)=SMT1TMRH;
// *(ST+2)=SMT1TMRU;
// *(ST+3)=0;

c'est effectivement un peu plus "élegant"
Aide toi, le ciel ou FantasPic t'aidera

OLED GC9A01 et SPI Hardw 18F27K42
satinas
Expert
Expert
Messages : 1225
Enregistré en : novembre 2015

#39 Message par satinas » mar. 21 mars 2023 12:24

unsigned long L = SMT1TMR;
Cela passe si on le met dans le main ou dans une fonction, car c'est le code compilé. Dans le cas d'une variable globale ou statique, c'est du pré-code d'initialisation qui ne veut que des constantes, le main n'a pas encore démarré.
C'est peut être plus court en asm car il sait qu'il initialise 4 octets consécutifs.

OLED GC9A01 et SPI Hardw 18F27K42
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 2589
Âge : 73
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#40 Message par paulfjujo » mer. 22 mars 2023 09:20

voir test à 16MHz coté ASM ....

:-D OSONS!
init SPI clock à 32MHZ
verif à l'oscillo ..periode 31,2nS 32,05MHz
le clock parait plutot sinusoidal ... mais mon oscillo n'à que 1GS/sec et 70MHz de bande passante

SPI1CLK = 0; // CLKREF =0 ->FOSC=64MHz
SPI1BAUD = 0; // SPI Speed 64MHz / (2x(0+1)) = 64/2 = 32MHz
ne pas oublier : inhibition du Slow Rate
SLRCONC=0;
SLRCONB=0;

surprise ... L'OLED arrive à suivre ..

malgré un montage sur breadboard et filerie de 8cm entre MCU et OLED
(on ne parle pas ici de probleme CEM!)

(09:11:59.855) Init OLED Rond CG9A01
(09:11:59.906) Start SMT1 pour Init_CG9A01();
(09:12:00.637) Stop. SMT1=12400952 ,soit 775059 uS .... inchangé 775mS
voir explication coté ASM

(09:12:00.852) Test duree Ecran Noir (SPI 8MHz!)
(09:12:01.064) Stop. SMT1=3283477 ,soit 205217 uS ..... 205mS( 292mS at 8MHz)

(09:12:09.247) Test Duree de Chargement image Voltmetre.bmp
(09:12:09.548) Stop. SMT1=4939218 ,soit 308701 uS .... 308mS ( 395ms at 8MHz)
(09:12:09.558)
(09:12:09.558)
(09:12:09.558) ..fin Affichage Image voltmetre
Aide toi, le ciel ou FantasPic t'aidera


Retourner vers « Langage C »

Qui est en ligne

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