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

Effet de bords avec MikroC
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 2589
Âge : 73
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#1 Message par paulfjujo » mar. 11 janv. 2022 18:41

bonjour,


"A chaque jour suffit sa peine " ..
encore un exemple d'effet de bords inexpliqué ..

Apres un chargement du programme,
je verifie que l'init complete des donnees de mon programme a été faites au moins une fois..
je me sert d'une valeur Eeeprom adresse 0 comme flag pour tester si l'init des parametres application ont été faits
au moins 1 fois !
si contient 99 => init déja faite
si contient 0 ou 0xFF => pas d'init faite

avec le test suivant, tout le reste de mon programme est OK


Code : Tout sélectionner


  c1
=EEPROM_Read(0); Delay_ms(25);
    if (c1==0)
     {
      Toute_Premiere_Init();
     }
     else
     
{
       CPrint(" Restitue Parametrage\r\n");
       Restitue_Parametres_en_Eeprom(); // dont le nb de sabotage !
     }
 


on voit que la 1ere init a été réalisée..OK

Presentation :
Directory :C:\_MikroC\_MesProjets_MikroC\CLAVIER_18F27K42_2021
MikroC pro 7.60
Projet :Clavier_18F27K42_DIGIT_V4-V6_2022-01xx.mcppi
Config bit : P18F27K42_Fosc_interne_with_PLL_64MHz_Vectored_IT.cfgsch
Eeprom: En Flash @ 310 0000 à 310 03FFF.
Source : Clavier_DIGIT4000_18F27K42_V4_V6_2022-0111.c
Clavier Mecanique Matrice 4x3 touches
18F27K42 UART1 115200
NCO output sur RC0 -> Buzzer Piezzo
Usage Interrupt Vectors
Relais Monostables 1,2,3,4 sur 1 sec
Config Application BlueElectronics :
DigitCode_4000_2021-1206.kwl

*V Version 2022-0111*

Etat Pin RB7=0 et Pin RB6= 0
Pas d'extension Entree/Sortie avec RA7
*W *;*U *;*BR0G0B0*;*E *;*O *;*Y *;*LR0G0B0*;*RR0G0B0*;*PR0G0B0*;

Etat Reset Distant=1

Init Generateur de Frequence NCO ,sortie RC0 => Buzzer piezo
Init Timer4_for_Alarme

1ere Init car flag adresse 0x0000 EEprom different de 99

Premiere Init.
Saisir code Progr.0000 (4 digits)
Attente 4 frappes clavier
.Idx=*T 1*;*G0*;



alors qu'avec ce test :

Code : Tout sélectionner


   c1
=EEPROM_Read(0); Delay_ms(25);
    if (c1==99)
    {

       CPrint(" Restitue Parametrage\r\n");
       Restitue_Parametres_en_Eeprom(); // dont le nb de sabotage !
     }
      else
     
{
      Toute_Premiere_Init();
     }


ça bigorne mon texte de presentation ...

Code : Tout sélectionner



 Presentation 
: 
[highlight=yellow]áoÑ+ï×ÐQÎ%ánÑQÏ!ânæjÐ_oÐÐQâÓo¤ï&ðð:8
&
n
[/highlight]
*
V Version 2022-0111*

 Etat Pin RB7=0 et Pin RB6= 0
  Pas d
'extension Entree/Sortie avec RA7 
*W *;*U *;*BR0G0B0*;*E *;*O *;*Y *;*LR0G0B0*;*RR0G0B0*;*PR0G0B0*;

 Etat Reset Distant=1

 Init Generateur de Frequence NCO ,sortie RC0 => Buzzer piezo
 Init Timer4_for_Alarme

 1ere Init car flag adresse 0x0000 EEprom different de 99 

 Premiere Init.
 Saisir code Progr.0000  (4 digits)
 Attente 4 frappes clavier
.Idx=*T    1*;*G0*;
.Idx=*T    2*;*G0*;



si je reduis mon code , juste apres ce test ( mise en commentaire du reste de code ..jusqu'à la fin du main programme)
le déroulement du programme est OK

si je valide le parametrage et fais un reset
je me retouve bien avec 99 dans l'eeprom
et m'affiche les parametres précédement sauvegardés
et ce meme avec le test bigornant ma présentation


Code : Tout sélectionner


 Presentation 
: 
[b]áoÑ+ï×ÐQÎ%ánÑQÏ!ânæjÐ_oÐÐQâÓo¤ï&ðð:8
&
n
[/b]
*
V Version 2022-0111*

 Etat Pin RB7=0 et Pin RB6= 0
  Pas d
'extension Entree/Sortie avec RA7 
*W *;*U *;*BR0G0B0*;*E *;*O *;*Y *;*LR0G0B0*;*RR0G0B0*;*PR0G0B0*;

 Etat Reset Distant=1

 Init Generateur de Frequence NCO ,sortie RC0 => Buzzer piezo
 Init Timer4_for_Alarme

[highlight=yellow] Restitue Parametrage[/highlight]
 Read flag @0x00 =  99
 MSabotage <--  @0x10 = 0
 Restitue datas eeprom :  Cde Progr.  et 4 Cdes Relais 
 Cde #0 @0020   2870     [highlight=yellow]<-- code precedement entré ..OK[/highlight]
 Cde #1 @0024       
 Cde #2 @0028       



Relecture_Eeeprom_Pic_via_MPLAB_IPE.jpg


Décidément .. impossible de savoir si c'est un probleme de compilateur ou de neurones ?
Beaucoup de temps perdu ... je vais donc rester sur le test c1==0
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
Aide toi, le ciel ou FantasPic t'aidera

Effet de bords avec MikroC
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 2589
Âge : 73
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#2 Message par paulfjujo » jeu. 13 janv. 2022 17:21

bonjour,

allez j'en rajoute une couche ..
voir
https://forum.mikroe.com/viewtopic.php?f=88&t=78901

resultat de compilation avec d'une ligne d'erreur de 9606 characteres
Mon ecran de 27" n'est pas assez large !!!!

:mur: bien sur pas moyen de trouver cette erreur !
Aide toi, le ciel ou FantasPic t'aidera

Effet de bords avec MikroC
Jérémy
Administrateur du site
Administrateur du site
Messages : 2722
Âge : 44
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#3 Message par Jérémy » jeu. 13 janv. 2022 18:52

Ah ouais quand même !!! grosse galère la !

Bon courage à toi, je crains ne pas pouvoir t'aider la dessus
C'est en faisant des erreurs, que l'on apprend le mieux !!!

Effet de bords avec MikroC
Temps-x
Avatar de l’utilisateur
Expert
Expert
Messages : 2595
Enregistré en : juillet 2016
Localisation : Terre

#4 Message par Temps-x » jeu. 13 janv. 2022 19:15

Bonsoir Jérémy, paulfjujo, et tout le forum,

:sifflotte: Ta plus cas l'écrire en ASM, là je pourrais t'aider, à titre d'information pour écrire dans l'eeprom et lire dans celle-ci avec un
Pic 18F27K42 voici la routine en version ASM :langue:


Code : Tout sélectionner

;
;
                           la variable : "donner" c'est la donner à écrire sur 8 bits(1 octet), 
;
;  les variables : "adresse_high" et "adresse_low" 16 bits(2 octets), c'
est l'emplacement ou ta "donner" se  trouve dans l'eeprom
;
;
;******************************
 "pour écrit dans l'eeprom" ************************************* 
eeprom_ecriture
      BANKSEL INTCON0                     
; bank 63

      movf INTCON0
,W                      ; sauvegarde du registre INTCON0 vers la variable temps
      movwf temps                         
;

      bcf INTCON0,GIE                     ; couper les interruptions

      btfsc INTCON0
,GIE                   ; contrôl si les interruptions sont bien coupés
      bra 
$-D'4'                          ; remonte à la ligne 2 jusqu'a coupures des interruptions

      BANKSEL NVMCON1                     ; bank 57

      clrf  NVMCON1  

      movf adresse_high,W                 ; adresse du poids fort
      movwf NVMADRH

      movf adresse_low,W                  ; adresse du poids faible
      movwf NVMADRL                       ;

      movf donner,W                       ; donnée à écrit
      movwf NVMDAT                        ;

      bsf NVMCON1,WREN                    ; activer les écritures   
     
      movlw H'
55'                         ; séquence spécifique (c'est comme ça, il faut le savoir)
      movwf NVMCON2                       ; séquence spécifique
      movlw H
'AA'                         ; séquence spécifique 
      movwf NVMCON2                       
; séquence spécifique 

      bsf NVMCON1
,WR                      ; lance une opération d'écriture

      btfsc NVMCON1,WR                    ; on attend que l'
operation d'ecriture soit finie (de l'ordre de la ms
      bra 
$-D'2'                          ; remonte à la ligne 2 jusqu'a fin d'écriture

      bcf NVMCON1
,WREN                    ; interdiction de l'écriture

      BANKSEL INTCON0                     ; bank 63 

      movf temps,W                        ; restaurer la sauvegarde de la variable temps vers le registre INTCON0
      movwf INTCON0                       ; 

      return

;******************************** "pour lire dans l'
eeprom" ************************************ 
eeprom_lecture

      BANKSEL NVMCON1                     ; bank 57

      clrf NVMCON1 

      movf adresse_high,W                 ; adresse du poids fort
      movwf NVMADRH

      movf adresse_low,W                  ; adresse du poids faible
      movwf NVMADRL                       ;

      bsf NVMCON1,RD                      ; lecture de l'EEPROM

      movf NVMDAT,W                       ; la valeur lue dans l'éeprom est placée dans W
      movwf donner                        ; W et placé dans la variable donner

      BANKSEL INTCON0                     ; bank 63 

      return



Content pour toi Jérémy, pour le remplacement de tes Pics, donc ça venait bien des pics défectueux.

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

Effet de bords avec MikroC
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 2589
Âge : 73
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#5 Message par paulfjujo » jeu. 13 janv. 2022 20:32

trouvé une solution :

dans
C:\_MikroC\mikroC PRO for PIC\ findinfiles.ini
94 fichier listé ..mais pas de directory _CLAVIER_18F27K42_2022 ????
je vois bien par contre le directory _CLAVIER_18F27K42_2021
rajouté CLAVIER_18F27K42_2022 dans la liste
enlevé le underscore du nom de dossier
=> nettoyé le directory CLAVIER_18F27K42_2022 de toute trace d' anciens fichiers 2021
rechargement projet
compilation -> plus de grande ligne d'erreur !
mais seulement 2 lignes erreurs (de moins de 80 chars)
1 oubli d'un guillement fermants,
et : en fin de ligne au lieu de ;
corrigé--> compilation OK
0 103 Finished successfully: 13 janv. 2022, 18:44:58 Clavier_18F27K42_DIGIT_V4-V6_2022-01xx.mcppi

je regarde à nouveau le contenu de findinfiles.ini

[frmFindInFiles\ComboBoxPath_Items]
Count=94
Item0=C:\_MikroC\_MesProjets_MikroC\_CLAVIER_18F27K42_2022\
Item1=C:\_MikroC\_MesProjets_MikroC\_18F26K22_Test_OLED_SSD1306_I2C1_0.96_jaune_et_bleu\
Item2=C:\_MikroC\_MesProjets_MikroC\_18F26K42_Oled_I2C_jaune_Bleu_0-96p_2021-02\

..???? encore le underscore du dossier ???? en 1ere position
Item0=C:\_MikroC\_MesProjets_MikroC\_CLAVIER_18F27K42_2022\
je quitte mikroC , relance et recharge le projet

j'ouvre à nouveau le fichier findinfiles.ini
et maintenant j'ai maintenant le BON directory en position 1
mais AUSSI l'ancien que j'avais effacé en position 2 !!!
[frmFindInFiles\ComboBoxPath_Items]
Count=95
Item0=C:\_MikroC\_MesProjets_MikroC\CLAVIER_18F27K42_2022\ <-- OK
Item1=C:\_MikroC\_MesProjets_MikroC\_CLAVIER_18F27K42_2022\ <-- N'EST POURTANT PLUS EXISTANT !
Item2=C:\_MikroC\_MesProjets_MikroC\_18F26K22_Test_OLED_SSD1306_I2C1_0.96_jaune_et_bleu\

:-D No More problemo.


conclusion :
MikroC ne sait pas gerer les fichiers correctement ..
en retard d'une guerre ..
ne s'appuie pas sur la gestion de fichier Windows ou presente un bon bug !

Nota:
MikroC ne digere pas bien le _ underscore dans la creation directory pour projet
bien que ce caratere n'est pourtant pas présent dans la liste des caracteres à exclure !

Rappel:
autre remarque sur l'Eeprom avec mikroC
un bug signalé il ya 2 ans !!

Rappel PB avec EEPROM et MikroC
29/11/2019
ex:
Horloge_V1_PIC18F27K42_Anneau_entier_60leds_4_Matrices_Max7219_1912_eeprom.ihex!
:020000040121D8 <--- Probleme ICI à remplacer par :020000040031C9
:100000003165726520486F726C6F676520416E6E56
.......
* par contre pour recharger le fichier EEprom dans le Tools MikroC
il faut REMETTRE LA BAD ADRESSE !
mettre à jour le fichier sous mikroC avec Tools Eeprom
Ne pas compiler
et .. rechanger l'adresse pour que le programme puisse etre complié correctement
et chargeable avec MPLAB IPE + Pickit4


Mes prochaines appli 18F27K42 se feront avec MPLABX XC8 ....
car MikroC semble bien stopé au niveau des mises à jour et correctifs..
reste utile que pour les anciens MCU ...
Aide toi, le ciel ou FantasPic t'aidera

Effet de bords avec MikroC
Jérémy
Administrateur du site
Administrateur du site
Messages : 2722
Âge : 44
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#6 Message par Jérémy » ven. 14 janv. 2022 18:39

Franchement Bravo pour cette étude remarquable et cette déduction !

Vivement que j’atteigne :sifflotte: ce niveau !!!
C'est en faisant des erreurs, que l'on apprend le mieux !!!

Effet de bords avec MikroC
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 2589
Âge : 73
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#7 Message par paulfjujo » ven. 14 janv. 2022 21:02

bonsoir Jeremy, et à tous,

tout ces problemes me confortent pour le passage à MPLAB XC8 pour les PICs réscents ...
qui permet entre autre, le 18F27Q10 ..j'en ai 4 sous le coude (MikroC ne les gere pas!)
et une carte Curiosity PIC 18F47Q10 .
...à noter : qui est pas trop chere et transfert du *. Hex via un bootloader USB inclus.
+ un debugger incorporé (non encore testé)
.. à suivre ..

je garderais MikroC que pour les anciens Pics dont le fameux 18F26K22...etc..

:!!: MikroC= obsolescence programmée... au bout de 8 ans
(licence MikroC pro achetée en 2014 .. )
Aide toi, le ciel ou FantasPic t'aidera

Effet de bords avec MikroC
Gérard
Avatar de l’utilisateur
Expert
Expert
Messages : 1640
Âge : 65
Enregistré en : septembre 2015
Localisation : Alsace - Haut-Rhin

#8 Message par Gérard » sam. 15 janv. 2022 21:28

Jérémy a écrit :Franchement Bravo pour cette étude remarquable et cette déduction !

Vivement que j’atteigne :sifflotte: ce niveau !!!


Je m'associe à Jérémy pour féliciter Paul. :bravo:

Par contre, moi, je n'aurai jamais ce niveau. :lol:
Le 18/04/19 je suis devenu papy de jumeaux, le 01/09/23 une petite cousine des jumeaux est née.

Effet de bords avec MikroC
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 2589
Âge : 73
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#9 Message par paulfjujo » jeu. 27 janv. 2022 19:17

Effet de bords : effet indesirable pouvant se manisfester ou NON, en fonction du contexte .
Une sorte de SPAM ou ver dormant..
Autant s'adresser à Scully et Mulder plutot qu'aux concepteur de MikroC ..
MikroC en voie d'extinction !

Encore un constaté avec l'utilisation des fonctions string
et le transfert de datas en ROM ( dans le code ) et RAM de travail

pour eviter de complexe et fastidieuse saisie de données au clavier numerique
dans une période de déverminage de mon application Clavier
j'utilise une config forcée de certains parametres de configuration

Code : Tout sélectionner


     strncpy
(Mcd[0],"1287",4);
      strncpy(Mcd[1],"1134",4);
      Code_Modifie[0]=1;    // code progr
      Code_Modifie[1]=1;    // code relais 1
      Config_Mode_Cde_Relais[0]=0;  // pas de relais 0 ici
      Config_Mode_Cde_Relais[1]=1;


Ma presentaion de l'application en tout debut de programme est affectée ...
alors qu'elle ne l'est pas, si j'enleve mon En_TEST ( donc si en saisie manuelle...)
par une simple mise en commentaire :
//#define EN_TESTC'est donc bien cette partie de code qui pose probleme.

:!!: Nota : En aucun cas on peut permettre un programme qui verole des resultats !

Presentation : BIGORNEE !
¾Q¿_,à__¾_èj
"_P__óP &ôP
"èj
"_Àÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ

ce probleme m'interpellait, car déja rencontré (jadis !)

apres d' autres tests

Code : Tout sélectionner


         strcpy
(Mcd[0],"1287");     // BAD  presentation
        strcpy(Mcd[1],"1134");


j'obtiens une bonne présentation avec :

Code : Tout sélectionner

 
       strConstRamCpy
(CRam1,"1287");   //OK
       strcpy(Mcd[0],CRam1);
       strConstRamCpy(CRam1,"1134");
       strcpy(Mcd[1],CRam1);


Presentation programme OK
et finalement

Code : Tout sélectionner

  strConstRamCpy(Mcd[0],"1287");    //OK
        strConstRamCpy(Mcd[1],"1134");   //OK


Presentation OK

Presentation :
Directory :C:\_MikroC\_MesProjets_MikroC\CLAVIER_18F27K42_2021
MikroC pro 7.60
Projet :Clavier_18F27K42_DIGIT_V4-V6_2022-01xx.mcppi
Config bit : P18F27K42_Fosc_interne_with_PLL_64MHz_Vectored_IT.cfgsch
Eeprom: En Flash @ 310 0000 à 310 03FFF.
Clavier_18F27K42_DIGIT_V4-V6_2022-0122.ihex
Source : Clavier_DIGIT4000_18F27K42_V4_V6_2022-0127.c
Clavier Mecanique Matrice 4x3 touches
18F27K42 UART1 115200
NCO output sur RC0 -> Buzzer Piezzo
Usage Interrupt Vectors
Relais Monostables 1,2,3,4 sur 1 sec
Config Application BlueElectronics :
DigitCode_4000_2021-1206.kwl


idea ! La conclusion :
Ne pas utiliser d'affectation directe de données en dur ( dans le code) , mais plutot en RAM.
ou via strConstRamCpy qui va bien !
La gestion des pointeurs RAM et CODE etant différente...
et si en plus on parle de franchissement de bank ... et de la confiance avec le compilateur et ses optimisations ?

si je vous fais part de ce genre de probleme , c'est qu'une telle anomalie peut tres bien rester cachée
tant que votre application aura une petite taille ...
certains exemples de tres courts programme MikroC sont à proscrire !
dont les exemples fournis avec LCD !

pour memoire

Code : Tout sélectionner

// --- Copie le texte depuis FLASH ROM vers RAM
void strConstRamCpy(unsigned char *dest, const code char *source)
 {
  while (*source)*dest++ = *source++ ;
  *dest = 0 ;    // terminateur
}

Aide toi, le ciel ou FantasPic t'aidera

Effet de bords avec MikroC
satinas
Expert
Expert
Messages : 1225
Enregistré en : novembre 2015

#10 Message par satinas » jeu. 27 janv. 2022 20:44

Bonsoir à tous,

Paul, j'ai pas lu en détail, mais on est d'accord que strncpy ne copie pas forcément le 0 de fin de chaîne, contrairement à strcpy. Si tu veux copier la chaîne complète avec le 0 de fin de chaîne, il faut faire strncpy(Mcd[0], "1287", 5)

Remarque à prendre avec réserve, quand je lis ça :
No null-character is implicitly appended at the end of destination if source is longer than num. Thus, in this case, destination shall not be considered a null terminated C string (reading it as such would overflow).
https://www.cplusplus.com/reference/cstring/strncpy/

C'est confirmé là
Si la chaîne source a une taille égale à celle spécifiée en paramètre, alors la chaîne source sera intégralement copiée (y compris le code ASCII 0 terminal)
https://koor.fr/C/cstring/strncpy.wp

J'ai appris quelque chose, super :)


Retourner vers « Langage C »

Qui est en ligne

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