Problèmes du programmeur PIC pour lire et écrire la mémoire de configuration du programme

rifaat magique

Problèmes du programmeur PIC pour lire et écrire la mémoire de configuration du programme


Je faisais un programmeur pour pic16f877a en utilisant arduino à l’aide du document de spécification de programmation car je n’en trouve pas de bon ici à l’époque. J’ai pu écrire du code dans la mémoire du programme utilisateur et le relire en mode de programmation basse tension (et je suis très confiant que ce processus est réussi) mais je n’ai rien écrit dans la mémoire de configuration.

Le projet n’a pas fonctionné (une simple LED clignotante), j’ai donc fait des recherches et trouvé que ce pourrait être les 2 bits du mot de configuration qui définissent le type d’horloge (soi-disant oscillateur RC par défaut) et il doit être changé à un autre type. j’ai donc essayé d’accéder et de modifier le mot de configuration en utilisant les commandes données dans le document mais je ne lis toujours que des zéros quoi que je fasse, même si je fais une commande d’effacement de puce dans la mémoire de configuration.

Je sais que c’est très difficile à répondre car le protocole de programmation est spécifique à l’appareil mais j’apprécierai vraiment si quelqu’un pourrait me donner un indice, et s’il y a des informations manquantes, dites-le moi dans un commentaire et je modifierai le question de les ajouter.

Voici mon code pour accéder et lire le mot de configuration:

 #define  MCLR 8 
 #define  PGM 9 
 #define  DATA 10 
 #define  CLK 11 

   /* MCLR -> MCLR PGM -> RB3 data -> RB7 clk -> RB6 */ 


 void  setup ()   { pinMode ( MCLR ,  OUTPUT ); pinMode ( PGM ,  OUTPUT ); pinMode ( DATA ,  OUTPUT ); pinMode ( CLK ,  OUTPUT ); digitalWrite ( DATA ,  LOW ); digitalWrite ( CLK ,  LOW ); digitalWrite ( PGM ,  LOW ); digitalWrite ( MCLR ,  LOW ); 

   Serial . begin ( 9600 ); 
   while ( Serial . available ()   ==   0 ); 

   // Low voltage programming digitalWrite ( PGM ,  HIGH ); delayMicroseconds ( 1 ); digitalWrite ( MCLR ,  HIGH ); delayMicroseconds ( 10 ); loadConfig (); 
   for   ( int  i =   0 ;  i <   7 ;  i ++) 
   { increment ();  
   } 
   Serial . print ( readData (), DEC ); 

 } 

 void  loop ()   { 
   // no need 

 } 

 void  writeBit ( int  a ) 
 { digitalWrite ( DATA ,  a ); digitalWrite ( CLK ,  HIGH ); delayMicroseconds ( 1 ); digitalWrite ( CLK ,  LOW ); delayMicroseconds ( 1 ); digitalWrite ( DATA ,  LOW ); 
 } byte readBit () 
 { byte _bit ; digitalWrite ( CLK ,  HIGH ); delayMicroseconds ( 1 ); _bit =  digitalRead ( DATA ); digitalWrite ( CLK ,  LOW ); delayMicroseconds ( 1 ); 
   return  _bit ; 
 } 

 void  sendCommand ( char  command ) 
 { 
   for   ( int  i =   1 ;  i <=   0b100000 ;  i *=   2 ) 
   { writeBit (( command &  i )   >=   1 ); 
   } 
 } 
 uint16_t  readData () 
 { sendCommand ( 0b000100 ); delayMicroseconds ( 2 ); 
     uint16_t  value =   0 ; pinMode ( DATA ,  INPUT ); readBit (); 
     for ( int  i =   0 ;  i <   14 ;  i ++) 
     { value =   ( value << 1 )   |  readBit (); 
     } readBit (); pinMode ( DATA ,  OUTPUT ); 
     return  value ; 
 } 

 void  loadConfig () 
 { sendCommand ( 0b000000 ); delay ( 2 ); 
 } 

 void  increment () 
 { sendCommand ( 0b000110 ); delayMicroseconds ( 2 ); 
 } 

En bref, je conduis le MCU en mode de programmation basse tension, qui semble fonctionner, en envoyant une commande pour déplacer le compteur de programme vers la mémoire de configuration, puis en incrémentant le compteur de programme jusqu’à ce qu’il atteigne l’adresse du mot de configuration 2007h, puis en lisant le mot à cette adresse.

Il y a une autre partie pour écrire le code mais je ne l’ai pas ajouté ici.

Tout cela est décrit dans le document de programmation ici

immibis

J’ai fait un programmeur pour une puce différente (PIC12F508) et j’ai eu quelques problèmes avec. Au début, je viens d’utiliser le mode oscillateur RC par défaut et de brancher un oscillateur RC lent. Ensuite, je pouvais dire quand j’avais réussi à changer le mode d’oscillateur parce que la LED clignotait plus rapidement.

rifaat magique

@immibis J’ai réussi à faire quelque chose comme ça et le projet fonctionne avec une vitesse lente et quelques problèmes mais je n’arrive toujours pas à comprendre comment changer le mode oscillateur. J’ai lu tout le document de spécification de programmation et l’ai suivi avec précision mais sans résultat, toujours lu comme des zéros.

Réponses


 rifaat magique

J’ai donc réussi à lire et à écrire le mot de configuration en envoyant un mot de données non programmé (c’est-à-dire écrire un mot de tous les uns ou 0x3FFF comme un mot de 14 bits) juste après la commande de configuration de chargement et avant d’incrémenter sept fois.

Il s’avère que c’est la façon typique d’écrire le mot de configuration et pourtant la spécification de programmation n’a pas pris la peine de le mentionner et j’ai lu la spécification de programmation d’une poignée de modèles différents jusqu’à ce que je trouve cette information.

Donc, mon conseil est si vous avez un problème similaire et que vous ne trouvez pas la solution dans votre fiche technique, allez voir les documents des modèles similaires et peut-être pouvez-vous trouver un indice ou deux pour résoudre votre problème.

 

#de, #et, #la, #pour, Configuration, du, écrire, lire, mémoire, PIC, Problèmes, Programme, programmeur

 

google

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *