affichage binaire DDRx PINx

bonjour :disappointed_relieved:

voilà, je voudrai afficher les registre PINC,DDRC ,PORTC. j'ai le code suivant:

 void setup() {

  Serial.begin(9600);
}


void loop() {
  pinMode(A0,INPUT);
  pinMode(A1,INPUT);
  pinMode(A2,INPUT);
  pinMode(A3,INPUT);
  pinMode(A4,INPUT);

 int val= digitalRead(PINC);
 Serial.print("PINC: ");
 Serial.println(val,BIN);

 int valDDRC= digitalRead (DDRC);
  Serial.print("DDRC: ");
   Serial.println(valDDRC,BIN);
 delay(200);


}

j'arrive à afficher le résultat, mais pas sous forme binaire, malgré BIN . j'ai du oublier quelque chose mais je ne voit pas quoi ??? c'est pour comprendre comment cela marche , pour envoyer par le port série pour un traitement par processing. merci de votre lecture.

Serial.print(DDRC); Serial.print(PINC);

Bonjour,

DDRx, PORTx, PINx ... sont des registres, ou pour être précis des "valeurs pointées" par les adresses de ces registres en RAM. Ce ne sont en aucun cas des numéros de broche "arduino" !

Pour lire la valeur du registre PINC par exemple il suffit de faire :

int val = PINC;

merci pour vos aide. je cherche a envoyer par ex DDRC par le port serie, puis le traiter avec processing sous la forme d'un binaire ( 10101111) pour savoir quel registre est en entrée ou en sortie. Mais est ce possible ou comment faire autrement? merci de votre lecture.

lcd1602: Mais est ce possible ou comment faire autrement?

B@tto t'as déjà donné la réponse !

Serial.println(DDRC, BIN);

MERCI j'ai trouvé ]:D c'est tout simplement que j'ai mis digitalread a la place de analogread :zipper_mouth_face: excusez pour le dérangement :blush:

j'avance , j'avance !!!

est il normale que mon affichage binaire soit fluctuant ? lorsque j'affiche soit DDRC ou DDRB ou DDRD mon chiffre binaire est instable. ex de 10001010 cela passe à la prochaine lecture à 10011011 et ainsi de suite :blush: mon code doit servir à allumer des voyants sur processing donnant l'état des registres (entrée ou sortie), et la je suis en train de créer une guirlande de noël :grin: merci

lcd1602: c'est tout simplement que j'ai mis digitalread a la place de analogread :zipper_mouth_face:

Houla ... tu fait un analogRead(PINC) ? Si oui c'est totalement faux ! C'est certes syntaxiquement juste mais sémantiquement faux.

lcd1602: est il normale que mon affichage binaire soit fluctuant ? lorsque j'affiche soit DDRC ou DDRB ou DDRD mon chiffre binaire est instable.

-> Code complet ;)

Bah si tu branches rien à tes pins ils sont flottants

B@tto: Bah si tu branches rien à tes pins ils sont flottants

Les registres DDRx (configuration entrée/sortie) ne peuvent pas changer de valeur tout seuls ;)

bonjour,
voici le code après maintes tentatives et modifs :astonished:

int val;
int Lec_DDR=1;
void setup() {
  // set 2-12 digital pins to read mode
//  for (int i=2;i<14;i++){
//    pinMode(i, INPUT);
 // }

  Serial.begin(115200);  
}

void loop() {  
  
  if (Lec_DDR !=0) {
  Serial.print(analogRead(DDRC),BIN);
   Serial.print(" ");
  Serial.print (analogRead(DDRB),BIN);
   Serial.print(" ");
   Serial.print (analogRead(DDRD),BIN);
    Serial.print(" ");
     Serial.println();
      Lec_DDR =0 ;}
}

j’ai essayé pas mal de choses, mais rien de concluant.

Houla … tu fait un analogRead(PINC) ?
Si oui c’est totalement faux ! C’est certes syntaxiquement juste mais sémantiquement faux.

comme tu peux le voir.
c’est ce que j’ai trouvé le plus parlant pour m’y retrouver, c’est aussi en essayant que l’on apprend. :fearful:

voilà merci à tous pour votre aide.
bonne journée

Oh là je pense qu’il y a de la confusion dans l’air.

Premièrement la bonne source d’information sur le fonctionnement interne du micro :

  • le site arduino → surement pas, juste pour un aperçu à la rigueur.
  • la datasheet du micro-controleur écrite par le fabricant du micro (Atmel)

Comme un bon dessin vaut mieux qu’un long discours je joins le diagramme qui explique pourquoi tu fais des confusions entre analogRead et digitalRead.
On le trouve page 5 dans la datasheet de l’ATMega328p qui est le micro des cartes UNO.

Dans le digramme on voit clairement que le signal appliqué sur les pins A0 à A5 (carte UNO) peut être dirigé (pin par pin) soit sur le port C qui est digital, les entrées A0 à A5 se comportant alors comme une entrée D0 à D13, soit vers le multiplexeur d’entrée des mesures analogiques.

Dans le cas d’une entrée A0 à A5 comment passe-t-on de l’un à l’autre ?
Nota : les entrée dénommées A0 à A5 par arduino sont en fait les entrées PC0 à PC5 dans la dénomination du constructeur du micro.

Le fait de définir un pinMode() input ou output place l’entrée en mode digital
La fonction digitalRead(), entre autres actions :

  • dirige le signal vers l’entrée correspondante du port Digital
  • regarde si l’entrée est à l’état logique bas ou haut.

La fonction analogRead(), entre autres actions :

  • dirige le signal vers une entrée du multiplexeur
  • positionne le multiplexeur pour acheminer le signal vers l’entrée du convertisseur analogique/digital
  • déclenche une conversion analogique/digitale.

Donc les registres DDRx , PORTy et PINz ne s’appliquent qu’aux entrées digitales (D0 à D13) ou pour les entrées A0 à A5 uniquement à celle qui auront été positionnées en digital par un pinMode().

@68tjs: il semble effectivement y avoir une confusion entre digital/analog de la part de lcd1602. Mais dans tout les cas lire un registre (quel qu'il soit) avec analogRead (ou n'importe quoi d'autre) est déjà une erreur, en plus cela ne devrais pas marcher ...

Avec un peu de chance DDRC/B/D dans le code d'exemple retourne quelque chose compris entre 14 et 20, valeurs correspondant à A0, A1, ... sur une carte UNO ou assimilé, du coup analogRead() marche mais ne fait pas du tout ce qui est voulu.

Serial.print(DDRC, BIN);
Serial.print(" ");
Serial.print (DDRB, BIN);
Serial.print(" ");
Serial.print (DDRD, BIN);
Serial.print(" ");
Serial.println();

bouououououo =(
complétement fourvoyé :~

(je débute , je crois que vous vous en êtes aperçu :grin:)
je cherche à construire un tableau de bord pour arduino ( visualiser les entrées et les sorties avec un vu mètre par entrée ou sortie)
la lecture des registre DDR C,D,B me sera transmise par le port serial à processing.
cette lecture sera décodée pour allumer l’indicateur ad hoc .
comme j’ai déjà une com seriel je voudrai m’appuyer dessus pour ne pas tout réécrire.
com seriel:

int val;

void setup() {
  // set 2-12 digital pins to read mode
  for (int i=2;i<14;i++){
    pinMode(i, INPUT);
  }
  
  Serial.begin(115200);  
}

void loop() {  
  
 
  
  
 // read all analog ports, split by " "
  for (int i=0;i<6;i++){
    Serial.print(analogRead(i));
    Serial.print(" ");
  }
  
  // read all digital ports, split by " "
  for (int i=2;i<14;i++){
    Serial.print(digitalRead(i));
    Serial.print(" ");
  }
  
  // frame is marked by LF
  Serial.println();
 
}

je vous est mis le code purgé de mes tribulations :blush:

merci encore.

bonjour, je n'abandonne pas :(

que pensez vous de ma démarche, quelle serait d’après vous la méthodologie à suivre ? et question subsidiaire : Comment liriez vous les registres DDR ? :roll_eyes: merci de votre lecture. bonne soirée.

lcd1602: que pensez vous de ma démarche, quelle serait d’après vous la méthodologie à suivre ?

Regarde du côté de "firmata" cela pourrait t'intéresser ;) Sinon dans le principe cela ressemble énormément à la "console" que jhelbi avait réalisé fut un temps. Regarde dans la partie "projets finit" du forum ça pourrait te donner des idées.

lcd1602: et question subsidiaire : Comment liriez vous les registres DDR ? :roll_eyes:

Ça fait trois fois qu'on te donne la syntaxe pour lire un registre DDRx ... :roll_eyes:

byte val = DDRC; // met dans "val" la valeur courante du registre DDRC

Ça fait trois fois qu'on te donne la syntaxe pour lire un registre DDRx

Je vais enfoncer le clou !

Les micro controleurs utilisés dans les cartes Arduino sont, comme tu le sais, des micros 8 bits. On dit qu'un micro est un micro 8 bits parce que ses registres sont de longueur 8 bits, soit un seul octet. 8 bits = 1 octets.

Donc en réfléchissant un peu on se dit que pour placer dans une variable le contenu d'un registre 8bits il faut prendre une variable de type octet, ou byte qui signifie octets en anglais.

bonjour, pas taper, pas taper :. :. :. merci pour le lien je vais m' y plonger. a+ bon week