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

Lecture des mots de config MCU,par programme
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 2589
Âge : 73
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#1 Message par paulfjujo » ven. 9 juin 2017 16:11

bonjour à tous,

Je viens de tester la possibilité de lire les mots de config MCU d'un PIC16F1847
Ceux ci ne sont pas accessible directement .
mais cela m'a permis de faire un mixte ASM - C
(certainement ameliorable par les pros de l'ASM ... qui pourront me dire ou est mon bug )

Là ou j'ai ramé un peu, c'est sur la difference de Mot de config vue par Pickit2 et celle Lue par mon programme..
ou definit dans le projet mikroC
Coté Pickit2 , on peut voir des bits NON affectés , ce qui explique cela.

Pour l'utilisation des 4 mots USER ID ,
Il est dommage que ceux-ci soient sur 14 bits et non 16 !
(on lit d'ailleur FF3F et non pas FFFF )
car on ne peut pas loger 2 ascii dans un mot ..
Il est donc possible de personaliser/ signer ses PIC en inscrivant une sorte de code PIN ...
via le programme d'application
et pour les appli distantes ..via GSM ou Radio..un test de plus possible pour eviter le piratage / detournement de commande.

Je me suis servi des details en asm de la Datasheet pour en arriver là.

Le Code :

Code : Tout sélectionner



... init diverses ...


 void Ecriture_ID_USER_Register( unsigned char Rg)
 {
   PROG_ADDR_LO=Rg ;
   if (Rg<4)
   {
 _asm{
    MOVLB 0 ; Select Bank 0
    MOVF _PROG_ADDR_LO
,;
    MOVLB 3 ; Select Bank 3
    MOVWF EEADRL 
; Store LSB of address
    CLRF EEADRH 
; Clear MSB of address
    BSF EECON1
,CFGS ; Select Configuration Space
    
    MOVLB 0
    MOVF _PROG_DATA_LO
,W
    MOVLB 3
    MOVWF EEDATL
;
    
    MOVLB 3
;
    BSF EECON1, WREN
    MOVLW 0x55 
; // sequence amorce
    MOVWF EECON2;
    MOVLW 0xAA
    MOVWF EECON2
;
    BSF EECON1,WR ; Initiate Write
    NOP
;
    BCF EECON1, WREN
    NOP
 B1
:
    BTFSC EECON1,WR ;
    GOTO B1 ;
    NOP;
    NOP;
    

    MOVLB 0 
; Select Bank 0
    MOVF _PROG_ADDR_LO
,;
    MOVLB 3 ; Select Bank 3
    MOVWF EEADRL 
; Store LSB of address
    
    MOVLB 0
    MOVF _PROG_DATA_HI
,W
    MOVLB 3
    MOVWF EEDATH
;
    NOP


    BSF EECON1
, WREN
    MOVLW 0x55 
; // sequence amorce
    MOVWF EECON2;
    MOVLW 0xAA
    MOVWF EECON2
;
    BSF EECON1,WR ; Initiate Write
    NOP
;
    BCF EECON1, WREN
    NOP
 B2
:
    BTFSC EECON1,WR ;
    GOTO B2 ;
    NOP;
    MOVLB 0 ; Select Bank 0
   
}
   }
 }


 void Lecture_Registre_CPU_OVER_8000H( unsigned char Rg)
 {
   PROG_ADDR_LO=Rg ;
   if (Rg<9)
   {
 
  _asm
{
    MOVLB 0 ; Select Bank 0
    MOVF _PROG_ADDR_LO
,;
    MOVLB 3 ; Select Bank 3
    MOVWF EEADRL 
; Store LSB of address
    CLRF EEADRH 
; Clear MSB of address
    BSF EECON1
,CFGS ; Select Configuration Space
    NOP
;
    NOP;
    ;BCF INTCON,GIE ; Disable interrupts
    BSF EECON1
,RD ; Initiate read
    NOP 
;
    NOP ;
    ;BSF INTCON,GIE ; Restore interrupts
    MOVF EEDATL
,; Get LSB of word
    MOVLB 0 
; Select Bank 0
    MOVWF _PROG_DATA_LO 
; Store in user location
    MOVLB 3 
; Select Bank 3
    MOVF EEDATH
,; Get MSB of word
    MOVLB 0 
; Select Bank 0
    MOVWF _PROG_DATA_HI 
; Store in user location
   
}
   }
   else
   
{
     PROG_DATA_LO=0xFF;
     PROG_DATA_HI=0xFF;

   }
   
 
}
 

void Decompile_byte
(unsigned char un)
{
 unsigned char masque;
 masque = 0x80;
 while (masque > 0u )
 {
   if ((un & masque)>0)
       UART1_Write(49u);  //  '1'
    else
       UART1_Write
(48u);  //  '0'
    masque =masque >>1;
  }
}

void main()
 {
  // Internal FOSC is 500Khz by default !
  #ifdef OSCILLATEUR_INTERNE
  OSCCON =0;        // PLL disbled
  // 8 MHz
  OSCCON.IRCF3=1;
  OSCCON.IRCF2=1;
  OSCCON.IRCF1=1;
  OSCCON.IRCF0=0;

  //-- 4 MHz ------
  /*
  OSCCON.IRCF3=1;
  OSCCON.IRCF2=1;
  OSCCON.IRCF1=0;
  OSCCON.IRCF0=1;
 */
  OSCCON.SCS1=1;  // internal FOSC

  #endif

  Init_Hardware() ;


  Delay_ms(1000);

  txt=TEXTE; // init pointeur
  UART1_Init(19200); // Hardware UART init won't work with RB2 as RX  , and  RB5 as TX is OK
  Delay_ms(100);
  // ecraser la config UART precedente.. à faire Apres, sinon RX RB2 mal configuré
  Special_Init_UART1_RB2_RB5();
  Delay_ms(100);
  while(PIR1.RCIF==1) c1 = RCREG;
  UART1_Write(CLS);
  Delay_ms(500);
  UART1_Write_CText("\r\n Init Speciale UART: Rx RB2 et TX RB5\r\n");
  for (i=1;i<3;i++)  UART1_Write_CText(Messages[i]);
  CRLF1();
  UART1_Write_CText(" Version "Version"\r\n");
  CRLF1();
  txt=&TEXTE[0];

  CRLF1();
 // UART1_Write_CText(" Init ADC EA0 gamme 2,048V + diviseur par 2\r\n");
 // ADC_Init_Advanced(_ADC_INTERNAL_FVRH2); // 2,048V
 
 
   Delay_ms
(100);
   CRLF1();
   UART1_Write_Text(" Exploration des  Registre CPU Zone 8000h .. 8008h \r\n");
   UART1_Write_Text(" voir DS page47 para 4.5) :\r\n");
   CRLF1();
  
   UART1_Write_Text
(" Zone USER ID Locations 8000h..8003h:\r\n");
   for (r=0;r<4;r++)
   {
    Lecture_Registre_CPU_OVER_8000H(r);
    strConstRamCpy(txt," USER ID location 8000h");
    *(txt+21)=r+48;
    UART1_Write_Text(txt);  UART1_Write('=');
    ByteToHex(PROG_DATA_LO,CRam1);  UART1_Write_Text(CRam1);
    ByteToHex(PROG_DATA_HI,CRam1);  UART1_Write_Text(CRam1);
    CRLF1();
    }
    CRLF1();
    
    Lecture_Registre_CPU_OVER_8000H
(6);
    strConstRamCpy(txt," ID location 8006h (page 48 para 4.7)");
    k=(PROG_DATA_HI <<3)  + (PROG_DATA_LO>>) ;
    UART1_Write_CText(" ID location 8006h : \r\n DEVICE ID =");
    WordToHex(k,CRam1);
    UART1_Write_Text(CRam1);
    UART1_Write_CText(" soit "); Decompile_byte(& 0x00FF) ;
    CRLF1();
    UART1_Write_CText(" ID Revision =" );
    ByteToHex(PROG_DATA_LO & 0x1F,CRam1);
    UART1_Write_Text(CRam1); 
    UART1_Write_CText
(" soit "); Decompile_byte(PROG_DATA_LO& 0x1F) ;
    CRLF1(); CRLF1();
   

    UART1_Write_CText
(" ID Config Word Location 8007h et 8008h (page 110 para 11.2)");
    UART1_Write_CText(" ID location 8007h : \r\n Word Config1 =");
    Lecture_Registre_CPU_OVER_8000H(7);
    ByteToHex(PROG_DATA_HI & 0X3F,CRam1);  UART1_Write_Text(CRam1);
    ByteToHex(PROG_DATA_LO,CRam1);  UART1_Write_Text(CRam1);
    UART1_Write_CText(" soit ");
    Decompile_byte(PROG_DATA_HI); UART1_Write(' ');
     Decompile_byte(PROG_DATA_LO);
    CRLF1();
    
    UART1_Write_CText
(" ID location 8008h : \r\n Word Config2 =");
    Lecture_Registre_CPU_OVER_8000H(8);
    ByteToHex(PROG_DATA_HI,CRam1); UART1_Write_Text(CRam1);
    ByteToHex(PROG_DATA_LO,CRam1); UART1_Write_Text(CRam1);
    UART1_Write_CText("\r\n soit apres masquage des bits inutiles\r\n ");
    UART1_Write_CText(" voir Config bits editor du Pickit2 ! \r\n ");
    PROG_DATA_HI=(PROG_DATA_HI & 0x37);
    PROG_DATA_LO=(PROG_DATA_LO & 0x03);
    ByteToHex(PROG_DATA_HI,CRam1); UART1_Write_Text(CRam1); UART1_Write(' ');
    ByteToHex(PROG_DATA_LO,CRam1); UART1_Write_Text(CRam1); UART1_Write(' ');
    UART1_Write_CText(" soit ");
    Decompile_byte(PROG_DATA_HI);UART1_Write(' ');
    Decompile_byte(PROG_DATA_LO);
    CRLF1();
    
   UART1_Write_CText
(" Modif Ecriture dans USER ID location 8000 <- P A U L \r\n");
   UART1_Write_CText(" Rappel: mot de 14 bits ..on ne peut pas ecrire 2 ascii par mot\r\n");
   
   PROG_DATA_HI
=' ';
   PROG_DATA_LO='P';
   Ecriture_ID_USER_Register(0);
   PROG_DATA_HI=' ';
   PROG_DATA_LO='A' ;
   Ecriture_ID_USER_Register(1);
   PROG_DATA_HI=' ';
   PROG_DATA_LO='U'  ;
   Ecriture_ID_USER_Register(2);
   PROG_DATA_HI=' ' ;
   PROG_DATA_LO='L' ;
   Ecriture_ID_USER_Register(3);
   CRLF1();
   
    UART1_Write_Text
(" Relecture Zone USER ID Locations 8000h..8003h:\r\n");
   // RAZ buffer  UserID
   strConstRamCpy(UserID,"    ");
   for (r=0;r<4;r++)
   {
    Lecture_Registre_CPU_OVER_8000H(r);
    strConstRamCpy(txt," USER ID location 8000h");
    *(txt+21)=r+48;
    UART1_Write_Text(txt);  UART1_Write('=');
    ByteToHex(PROG_DATA_LO,CRam1);  UART1_Write_Text(CRam1);
    ByteToHex(PROG_DATA_HI,CRam1);  UART1_Write_Text(CRam1);
    *(UserID+r)=PROG_DATA_LO;

    CRLF1();
    }
    CRLF1();
    UART1_Write_Text(" Nouvelle ID =");
    UART1_Write_Text(UserID);
    CRLF1();
    UART1_Write_Text("\r\n Rem : bug sur 1ere valeur PROG_DATA_HI ??? \r\n");

    
     while
(1)  ;              // endless Loop
 }



Resultat sur display (UART)

Init Speciale UART: Rx RB2 et TX RB5
Compilateur : MikroC 7.0.1
Directory :C:\_MikroC\_MesProjets_MikroC\_16F1847_1827

Version 170608

Exploration des Registre CPU Zone 8000h .. 8008h
voir DS page47 para 4.5) :

Zone USER ID Locations 8000h..8003h:
USER ID location 8000h=FF3F
USER ID location 8001h=FF3F
USER ID location 8002h=FF3F
USER ID location 8003h=FF3F

ID location 8006h :
DEVICE ID =00A5 soit 10100101
ID Revision =02 soit 00000010

ID Config Word Location 8007h et 8008h (page 110 para 11.2) ID location 8007h :
Word Config1 =39E4 soit 00111001 11100100
ID location 8008h :
Word Config2 =1EFF
soit apres masquage des bits inutiles
voir Config bits editor du Pickit2 !
16 03 soit 00010110 00000011
Modif Ecriture dans USER ID location 8000 <- P A U L
Rappel: mot de 14 bits ..on ne peut pas ecrire 2 ascii par mot

Relecture Zone USER ID Locations 8000h..8003h:
USER ID location 8000h=5000
USER ID location 8001h=4120
USER ID location 8002h=5520
USER ID location 8003h=4C20

Nouvelle ID =PAUL

Rem : bug sur 1ere valeur PROG_DATA_HI ! valeur 00H aul lieu dé 20h
Why ???

Si on fait un reset, on retrouvera P A U L dans les User config bits ( au lieu de FFFFFFFF)

Init Speciale UART: Rx RB2 et TX RB5
Compilateur : MikroC 7.0.1
Directory :C:\_MikroC\_MesProjets_MikroC\_16F1847_1827

Version 170608

Exploration des Registre CPU Zone 8000h .. 8008h
voir DS page47 para 4.5) :

Zone USER ID Locations 8000h..8003h:
USER ID location 8000h=5000
USER ID location 8001h=4120
USER ID location 8002h=5520
USER ID location 8003h=4C20

Aide toi, le ciel ou FantasPic t'aidera

Lecture des mots de config MCU,par programme
Temps-x
Avatar de l’utilisateur
Expert
Expert
Messages : 2595
Enregistré en : juillet 2016
Localisation : Terre

#2 Message par Temps-x » sam. 10 juin 2017 16:06

Bonjour paulfjujo, et bonjour à tous,

Intéressant, mais est ce que on peu changer la config du Pic, qui est bien de 14 bits pour un 16F.

Et dans le fichier d’extension *.hex, ou commence t'il ?

car on ne peut pas loger 2 ascii dans un mot ..


ben ouais, 2 x 8 bits, un mot est égal à 8 bits, donc pas possible.

Il est donc possible de personaliser/ signer ses PIC en inscrivant une sorte de code PIN ..


ça c'est intéressant, ça permets de déposer un droit d'auteur, sans que l'individu le sache.

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

Lecture des mots de config MCU,par programme
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 2589
Âge : 73
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#3 Message par paulfjujo » sam. 10 juin 2017 19:35

bonsoir à tous,


Temps-x a écrit :Intéressant, mais est ce que on peu changer la config du Pic, qui est bien de 14 bits pour un 16F.


NON , pas par le programme applicatif..


Et dans le fichier d’extension *.hex, ou commence t'il ?




rappel:
Word Config1 =39E4 soit 00111001 11100100
ID location 8008h :
Word Config2 =1EFF
soit apres masquage des bits inutiles
voir Config bits editor du Pickit2 !
16 03 soit 00010110 00000011


dans le *.HEX , recupéré,capturé via relecture avec Pickit2 :
Relecture_16F1847_test_IDlocation.hex

en fond de fichier :
- config Bits
- User ID

Code : Tout sélectionner



:020000040000FA
:10000000542AFF3FFF3F23009E18082800000328C2
:100010002400260823009A00080022001D179D16C0
:100020009D171E1423009F1020009E0121000D1516
:10003000080012001E00F003031D1928F103031D20
:100040001928080022006C082000A00009302200B6
:100050006C0203183E282000200823009100920122
... etc ..


:
10E1C000FF00FF00FF00FF00FF00FF00FF00FF0057
:10E1D000FF00FF00FF00FF00FF00FF00FF00FF0047
:10E1E000FF00FF00FF00FF00FF00FF00FF00FF0037
:10E1F000FF00FF00FF00FF00FF00FF00FF00FF0027
:020000040001F9
:04000E00E439FF1EB4     <-----   E439 => 39E4      FF1E -> 1EFF -> apres  masquage => 1603
:020000040001F9
:080000005000412055204C2066   <---- 50 00 41 20 55 20 4C 20 66  =>   P A U L 
:00000001FF

Aide toi, le ciel ou FantasPic t'aidera

Lecture des mots de config MCU,par programme
Temps-x
Avatar de l’utilisateur
Expert
Expert
Messages : 2595
Enregistré en : juillet 2016
Localisation : Terre

#4 Message par Temps-x » mar. 13 juin 2017 01:24

Bonjour paulfjujo, et bonjour à tous,

Je vais faire un essai avec un 16F1847, le temps de le recevoir, et je t'en dirais plus.

Merci pour les rappelles, que j'avais complétement oublié.

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


Retourner vers « Langage C »

Qui est en ligne

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