[RESOLU]Problème de conception de programme de test BITWISE µC externe

Bonjour,

Je me permets de vous solliciter car je rencontre des problèmes de manipulations sur les fonctions dites "bitwise".

Je suis dans le cadre d'une démarche professionnelle, ou j'ai pris sur moi de développer une maquette de test pour un de nos produit. Il s'agit, en l'état de réaliser un test complet d'une carte UC (unité centrale) . Pour m'aider dans ma tache je dispose d'instructions de test précises édictées par les ingénieurs ayant développés la carte.

Je suis en cours de développement sur les autres fonctions, mais les fonctions de test concernant les ports du µC me posent problème.
Je débute en programmation (2 mois seulement), mon domaine étant plutôt la conception électronique, et la réparation de ces cartes, je vous demanderais donc un peu d'indulgence...

Ce que je veux faire :
-> Tester les ports du micro contrôleur de la carte
référence du µC -> M68HC11E de NXP

Je prend ici pour exemple le port PORTB, qui est le premier du long annuaire que j'ai a tester, car j'ai besoin de comprendre, et de développer un code pour ce port dans un premier temps pour développer le reste des fonctionnalités de test.

La méthodologie que je veux adopter :
-> Me connecter via une extension de port aux broches externe du bus (comme prévu dans le protocole de test original)
-> Contacter une adresse spécifique (ici : 0x0A140)
-> Lire le PORTB (qui doit être à l'état bas 0)
-> Changer successivement les bit 0->1
-> Confirmer l'écriture en relisant ces bits
-> Remettre le port en état initial - Ecriture 1 -> 0
-> Lire une nouvelle fois le résultat.

L'enchainement de ces étapes doit être validé soit : Par un booleen / Par une boucle if-else / Par un while qui doit dire "Le port est dans le bon état + Le port est dans l'état initial"
pour être "PASS" sinon "FAIL"

La finalité :
Avoir un test automatique et fonctionnel qui permet de detecté toute anomalie sur le bus et notamment sur le µC, pour permettre un diagnostic fiable, et des prises de décisions pour la réparation de ces produits.

Etant dans un cadre de confidentialité sur les produits, je ne peux pas vous révéler 100% des informations, mais concernant le sujet cela ne devrait pas poser de soucis.

Concernant le code, ne prenez pas une crise cardiaque, je suis pas à l'aise avec les "bit"...

//PIN
const int local_p =  4;         // PB7 sur u8
const int manqueu_p =  11;      // PB6 sur u8  
const int defaut_vertP1 =  12;  // NE PAS TENIR COMPTE
const int presrad = 5;          // PB5 sur u8
const int coupim = 6;           // PB4 sur u8
const int anobat = 7;           // PB3 sur u8
const int chargbas= 8;          // PB2 sur u8
const int charghaut = 9;        // PB1 sur u8 
const int couprad = 10;         // PB0 sur u8

//ADRESSES
uint16_t  x = 0b10000000;          // Adresse du port cible en HEX 0x0A140
uint16_t  PORTG = 0x0A141;      // Integration future du prochain port 

//BITS
uint16_t bit;                   // Bit de stockage de chaque element du port pour test
uint16_t bit0;
uint16_t bit1;
uint16_t bit2;
uint16_t bit3;
uint16_t bit4;
uint16_t bit5;
uint16_t bit6;
uint16_t bit7;

// PULSE  
unsigned long duration;        // Stockage pour fonction print serial de la valeur du pulse HAUT 
unsigned long lowduration;     // Stockage pour fonction print serial de la valeur du pulse BAS
unsigned long duration1;       // Integration future du prochain port
unsigned long lowduration1;    // Integration future du prochain port

//BIT STATE
int haut = 1;                  // ETAT HAUT BIT
int bas = 0;                   // ETAT BAS BIT
uint16_t verif0;            // Variable de verification initiale de la fonction bitRead()
uint16_t state;            // Test d'un stockage lu en bitRead() pour lui appliquer des opérandes et inverser l'état (ex : !=, ~, ...)
uint16_t verif;            // Variable de verification 1 intermediaire de la fonction bitRead()
uint16_t verif2;            // Variable de verification 2 finale de la fonction bitRead()

void setup()
{
  pinMode(local_p, OUTPUT);
  digitalWrite(local_p, HIGH);

  Serial.begin(9600);
                                
  Serial.println("--------------------------");
  Serial.println("Lecture de l'adresse");       // Je demande à lire l'adresse pour confirmer qu'elle est correcte
  Serial.println(x, BIN);
  delay (1000);
  
  verif0 = (bitRead(x, bit)); 
  state = (bitRead(x, bit)& local_p );         // Partie brouillon car je veux lire mes bit 

  Serial.println("Lecture initiale du port : ");       // Je demande à lire l'adresse pour confirmer qu'elle est correcte
  Serial.println(state, BIN);
  
   bit = (bitWrite(x, 0 , ~state));             //Et remplacer leur valeur par l'inverse = 0->1 et 1-> 0
/*    bit = (bitWrite(x, 1 , !state));
      bit = (bitWrite(x, 2 , !state));
        bit = (bitWrite(x, 3 , !state));
          bit = (bitWrite(x, 4 , !state));
            bit = (bitWrite(x, 5 , !state));
              bit = (bitWrite(x, 6 , !state));
                bit = (bitWrite(x, 7 , !state)); */
          
  pinMode(local_p, INPUT);
   Serial.println("Verification d'ecriture");     // Je demande à lire le résultat
  for (int bit = 0; bit < 7; bit++)
  {
    verif = bitRead(x, bit);
    Serial.print(verif,BIN);

  }
  Serial.println();
  pinMode(local_p, OUTPUT);
  // On recommence exactement de la même façon
  
   bit = (bitWrite(x, 0 , state));             
/*    bit = (bitWrite(x, 1 , !state));
      bit = (bitWrite(x, 2 , !state));
        bit = (bitWrite(x, 3 , !state));
          bit = (bitWrite(x, 4 , !state));
            bit = (bitWrite(x, 5 , !state));
              bit = (bitWrite(x, 6 , !state));
                bit = (bitWrite(x, 7 , !state)); */
          
  pinMode(local_p, INPUT);
   Serial.println("Verification d'ecriture");     // Je demande à lire le résultat
  for (int bit = 0; bit < 7; bit++)
  {
    verif2 = bitRead(x, bit);
    Serial.print(verif2,BIN);

  }
  Serial.println();


  ///////////////////////////////////////           // Je test le pulse du port pour savoir si il est actif (et éviter toute fausse lecture/ecriture)
  Serial.println("--------------------------");
   Serial.println("Si pulse 0 = Carte inactive");
  duration = pulseIn(local_p, HIGH);
  Serial.print("duree du pulse HIGH...");
  Serial.println(duration);
  
  lowduration = pulseIn(local_p, LOW);
  Serial.print("duree du pulse LOW...");
  Serial.println(lowduration);
    /////////////////////////////////////////////// // Je demande une image du port finale pour vérifier que tout est dans le même état qu'à la base
    delay (1000);
  Serial.println("#########################");
  Serial.println("IMAGE LECTURE PORT FINAL");
  Serial.println(bit, BIN);
  Serial.println("INITIALE");
  Serial.println(0b10000000, BIN);
  Serial.println("#########################");

  delay (1000);
if ((lowduration = 0) && (duration = 0)) {
  Serial.println("TEST FAIL...");  
     }
else-(x = verif2);{
  Serial.println("TEST PASS!");
    }
   delay (1000);
  exit(0);
  
}

void loop () {}

Ce que j'attendrais de vous :

  • Des pistes ou des solutions pour rendre mon code opérationnel (car actuellement même si les câbles sont débranchés tout fonctionne => intérêt 0)
  • Des conseils pour m'améliorer sur le domaine de la manipulation de bit
  • Une optimisation de mon code en utilisant notamment le mapping arduino (registre DDR(B,C,D...)
  • Comprendre comment passer de la théorie des opérandes au code (parce que sur internet y'a pas spécialement de code qui me permette de faire le lien, où j'arrive pas à les comprendre...)
    exemple : A ^ (1<<n)

J'espère avoir été complet, dans le cas contraire, n'hésitez pas à me demander des informations supplémentaires.

Ca fait 3 jours que je buche la dessus sans arriver à réellement obtenir un résultat satisfaisant, c'est pour cela que je demande conseil, et je n'ai pas la science infuse, je prendrais donc vos remarques, critiques, conseils avec plaisir!

Merci de votre temps

This is the Arduino forum. When reading your question, I don't understand where Arduino would be involved. Can you please explain?

Si tu fais une comparaison tu dois utiliser == et non =.

2 Likes

Pourquoi n'as-tu pas utilisé un shift right bit dans un int. puis tester le int avec un mask ou si >0 alors il y a un bit a 1 dans le int.
regarde dans les references dans la section "Bitwise Operators".

voir les tables de vérité pour les bits. X0R ^ (OU Exclusif)

1 Like

autre chose à éviter même si la variable est limité dans la boucle "for" il n'est pas recommander d'utiliser le même nom de variable ailleurs dans le code . Cela porte a confusion.

1 Like

Si j'ai bien lu le code, on écrit sur le port 0b10000000 de l'ARDUINO et on vérifie que l'écriture a été effectuée.
Je ne vois pas comment l'ARDUINO pourrait positionner de lui-même des bits sur le port d'un 68HC11E de cette manière.
D'ailleurs 0b10000000 n'est pas égal à 0x0A140 mais à 0x80.
0x80 est pour moi l'adresse du registre TCCR1A de l'ATMEGA328P.

   bit = (bitWrite(x, 0 , state));             

Entre parenthèses bitWrite ne retourne aucune valeur.

1 Like

J'ai déjà développé un banc de test de ce genre.
Cela nécessite une communication (série, pourquoi pas ?) entre l'ARDUINO et le processeur cible (68HC11E dans notre cas).

  • l'ARDUINO envoie un ordre : par exemple "SET PORTA 01010101"
  • le processeur cible reçoit cet ordre et l'exécute
  • le processeur cible renvoie une réponse : par exemple "OK"
  • l'ARDUINO vérifie le bon positionnement des bits à l'aide de 8 entrées digitales

Bien entendu un logiciel de test doit être présent dans le processeur cible.

1 Like

hello
grillé par Henri.
meme question :ton code ne fait qu'érire sur le moniteur.
tu veux te brancher sur le bus d'adesses sur le connecteur de fond de panier.
c'est ok pour s'adresser à une memoire ou un PIA, mais un registre interne du micro...

la data sheet dit que le port B est exclusivement en sortie

il faudrait developper un prg de test specifique à charger dans le 68HC11

1 Like

Je cite :

Pour accéder à ces ports il faut positionner la bonne adresse sur le bus d'adresse (16 bits) et lire le bus de données (8 bits).

Seul le 68HC11 peut réaliser cette opération.

1 Like

+1 le bus Adresse du 68HC11 est sous son contrôle exclusif.

1 Like

Bonjour à tous, déjà je tiens à tous vous remercier de votre temps, et d'avoir pris la peine de répondre à mon message.

Vous confirmez mes craintes, je vais donc voir avec le pôle ingénierie ce qui a été prévu concernant ces tests, ils doivent avoir préparer une capsule de test ou un pavé de test spécifique. pour réaliser ces opérations....

LFRED, post:3, topic:862561, full:true
highness023, post:1, topic:862561"]
if ((lowduration = 0) && (duration = 0)) {

Si tu fais une comparaison tu dois utiliser == et non =.

Je te remercie, tu as totalement raison, je l'avais testé mais je n'avais eu que l'occurence de la boucle else, et pas "pass". Je pensais à tort par ailleurs que cette fonction signifiait "strictement égal". J'ai encore à apprendre.

Pourquoi n'as-tu pas utilisé un shift right bit dans un int. puis tester le int avec un mask ou si >0 alors il y a un bit a 1 dans le int.
regarde dans les references dans la section "Bitwise Operators".

highness023, post:1, topic:862561
Des conseils pour m'améliorer sur le domaine de la manipulation de bit

voir les tables de vérité pour les bits. X0R ^ (OU Exclusif)"

Alors je ne l'ai pas fait car justement je ne sais pas utiliser la fonction, ou tu du moins la coder, j'aurais voulu dans l'idéal réaliser un masque du bit du LSBT au MSBT lire puis utiliser le ^ pour faire mes opérations. Cela aurait été plus simple pour vérifier pas à pas chaque rang. Je vais travailler sur la question pour la suite.

for (int bit = 0; bit < 7; bit++)
{
verif2 = bitRead(x, bit);
Serial.print(verif2,BIN);

}

autre chose à éviter même si la variable est limité dans la boucle "for" il n'est pas recommander d'utiliser le même nom de variable ailleurs dans le code . Cela porte a confusion.

Je tâcherais d'éviter cette erreur, c'est vrai que ça complexifie la lecture, par ailleurs, je compte par la suite faire des bibliothèques à appeler quand j'ai un long code, et subdiviser chaque opération par des (void nom_de_la_fonction {}) puis appeler ces fonctions dans la boucle void setup () pour faire un code simple et clair.

uint16_t x = 0b10000000; // Adresse du port cible en HEX 0x0A140

Si j'ai bien lu le code, on écrit sur le port 0b10000000 de l'ARDUINO et on vérifie que l'écriture a été effectuée.
Je ne vois pas comment l'ARDUINO pourrait positionner de lui-même des bits sur le port d'un 68HC11E de cette manière.
D'ailleurs 0b10000000 n'est pas égal à 0x0A140 mais à 0x80.
0x80 est pour moi l'adresse du registre TCCR1A de l'ATMEGA328P.

bit = (bitWrite(x, 0 , state));             

Entre parenthèses bitWrite ne retourne aucune valeur.

J'ai déjà développé un banc de test de ce genre.
Cela nécessite une communication (série, pourquoi pas ?) entre l'ARDUINO et le processeur cible (68HC11E dans notre cas).

l'ARDUINO envoie un ordre : par exemple "SET PORTA 01010101"
le processeur cible reçoit cet ordre et l'exécute
le processeur cible renvoie une réponse : par exemple "OK"
l'ARDUINO vérifie le bon positionnement des bits à l'aide de 8 entrées digitales
Bien entendu un logiciel de test doit être présent dans le processeur cible.

L'idée est là, je voulais transformer le HEX en quelque chose de lisible, je suis un peu perturbé par l'adresse donné par le document de mon antenne technique, et effectivement je pense que l'arduino l'interprete comme son propre port à appeler ou quelque chose du genre... C'est une évidente erreur de ma part, par manque de connaissance sur ces techniques de codage. Je suis néophyte et ça sent ^^

Mais en aucun cas je pense qu'il ne va sur l'extension de ma carte... Pour l'écriture, j'ai bonant-malant tenté une transcription avec 0b, chose maladroite, car j'avais en lecture quand je tappais 0x0A140 "10000000" donc j'ai tenté de le transcrire... C'était visiblement pas une idée brillante.

Tu as tout compris sur ce que je voulais faire, mais entre avoir l'idée d'un process, et le réaliser quand on est pas super callé codage et que je plonge réellement dans les micro que depuis quelques semaines, ça donne des sueurs froides.

A la lecture de ton commentaire (et de ceux qui ont suivi) je pense que j'ai comme sur d'autre produit un soft de test (ce sont des softs à l'ancienne à plugger) qui ne m'as jamais été mentionné et que je dois pouvoir via une liaison serie pouvoir manipuler le µC.

hello
grillé par Henri.
meme question :ton code ne fait qu'érire sur le moniteur.
tu veux te brancher sur le bus d'adesses sur le connecteur de fond de panier.
c'est ok pour s'adresser à une memoire ou un PIA, mais un registre interne du micro...

la data sheet dit que le port B est exclusivement en sortie

il faudrait developper un prg de test specifique à charger dans le 68HC11

Tres bien vu, j'avais tellement la tête dans le guidon que j'ai pas pris le temps de suffisamment potasser la datasheet, et c'est effectivement stipulé qu'il n'agit qu'en sortie.

Donc je vais voir avec un de mes contact de la LOB si ils ont concu un prog, ou si ils ont une procédure non décrite dans les documents que j'ai pour contourner ce problème.

Je comprends mieux mes echecs, et à vrai dire si je suis venu posté ici, c'est aussi pour qu'on me fasse remonter ce genre de détails. Merci infiniment je ne perdrais pas plus de temps à m'acharner à rentrer sur une sortie du coup !

Je cite :

Pour accéder à ces ports il faut positionner la bonne adresse sur le bus d'adresse (16 bits) et lire le bus de données (8 bits).

Seul le 68HC11 peut réaliser cette opération.

Je t'avoue, que j'avais pas interprêté la phrase comme ça à la base, mais plutot par "connecte toi sur le bus avec une adresse, pour joindre le port cible" dans l'idée. Mais à la lueur de ces développement, ça prend plus de sens ainsi... Merci..

hbachetti, post:9, topic:862561

Pour accéder à ces ports il faut positionner la bonne adresse sur le bus d'adresse (16 bits) et lire le bus de données (8 bits).

Seul le 68HC11 peut réaliser cette opération.

+1 le bus Adresse du 68HC11 est sous son contrôle exclusif.

C'est bien ça le truc emmerdant effectivement , dans tous les cas vous m'avez grandement aidé sur la problèmatique. Merci.


Je tiens à tous vous remercier du temps pris pour me répondre, j'y vois un peu plus clair, et j'ai appris quelques trucs, (comme quoi c'est jamais inutile de demander!). Je vais voir avec les ingénieurs ce qu'ils ont prévu pour réaliser leur test du coup.

Et merci pour votre bienveillance, c'est appréciable.

Bien cdt