Pages: [1] 2 3   Go Down
Author Topic: [RESOLU] lire état d'une sortie digitale  (Read 3168 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
God Member
*****
Karma: 12
Posts: 912
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Est-il possible de connaitre l'état d'une sortie digitale?

Autrement dit est-ce qu'un digitalread(pin) fonctionne sur un pin paramétré en OUTPUT?

Ou bien je n'ai pas d'autre choix que de gérer l'état de ma sortie par un flag?


EDIT: Après discussion sur ce topic très intéressant, il s'avère que l'on peut effectivement faire un digitalread() sur un pin déclaré en OUTPUT. Et que c'est le moyen le plus simple.
« Last Edit: January 30, 2013, 03:15:47 am by john_lenfr » Logged

france
Offline Offline
God Member
*****
Karma: 15
Posts: 872
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Je ne comprends pas trop la question.
C'est ton programme qui décide ce que sort la sortie digitale, donc tu sais déjà ce qu'il doit y avoir dessus.
Logged

Christian

Ales
Offline Offline
Faraday Member
**
Karma: 39
Posts: 3643
Do or DIY
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Au pire tu te sers d'un boolean

Code:
boolean etat;
...
digitalWrite(pin,etat);
Serial.print("Le pin n°");
Serial.print(pin);
Serial.print(" est ");
if(etat) {
Serial.print("HIGH");
 } else { Serial.print("FALSE");
}


Logged


Offline Offline
God Member
*****
Karma: 12
Posts: 912
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

En fait je suis en I2C entre une arduino UNO et une NANO.

Mon arduino UNO est la "Master"
Mon arduino NANO est la "Slave"

La NANO pilote des relais, la master gère le LCD+Ethernet+DS1307

Ce qu'il se passe, c'est que la NANO reçoit les ordres de la UNO, mais si l'ordre n'est pas bien reçu, je n'ai aucun moyen de savoir si la sortie pour laquelle j'ai demandé qu'elle soit à HIGH y est bien?

Donc si je pouvais lire l'état d'une sortie de la NANO, pour remonter l'info à la UNO par l'intermédiaire de l'I2C cela me rassurerait au niveau contrôle de l'application.

Parce que les flags c'est bien gentil, mais si j'ai une coupure quelconque, il se peut que j'ai un décalage entre un flag qui est situé dans la partie Master du programme, et un flag qui est situé dans la partie Slave du programme.

Ce que je fais en ce moment c'est de passer les paramètres de flag entre les deux cartes par l'intermédiaire du bus I2C.

Mais si j'ai par exemple un flag qui est à "true" d'un coté, et "false" de l'autre coté, comment je sais quel est le bon sans pouvoir scrutter réellement la sortie?

Ou alors la solution serait de réinjecter le signal des OUTPUTS sur d'autres pin déclarés en INPUTS pour connaitre l'état des sorties?

Est-ce que j'ai été clair parce que je suis un peu dans mon truc donc pas évident à expliquer...
 smiley-mr-green
Logged

Offline Offline
Faraday Member
**
Karma: 34
Posts: 5083
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

En fait je suis en I2C entre une arduino UNO et une NANO.

Mon arduino UNO est la "Master"
Mon arduino NANO est la "Slave"

La NANO pilote des relais, la master gère le LCD+Ethernet+DS1307

Ce qu'il se passe, c'est que la NANO reçoit les ordres de la UNO, mais si l'ordre n'est pas bien reçu, je n'ai aucun moyen de savoir si la sortie pour laquelle j'ai demandé qu'elle soit à HIGH y est bien?

Donc si je pouvais lire l'état d'une sortie de la NANO, pour remonter l'info à la UNO par l'intermédiaire de l'I2C cela me rassurerait au niveau contrôle de l'application.

Parce que les flags c'est bien gentil, mais si j'ai une coupure quelconque, il se peut que j'ai un décalage entre un flag qui est situé dans la partie Master du programme, et un flag qui est situé dans la partie Slave du programme.

Ce que je fais en ce moment c'est de passer les paramètres de flag entre les deux cartes par l'intermédiaire du bus I2C.

Mais si j'ai par exemple un flag qui est à "true" d'un coté, et "false" de l'autre coté, comment je sais quel est le bon sans pouvoir scrutter réellement la sortie?

Ou alors la solution serait de réinjecter le signal des OUTPUTS sur d'autres pin déclarés en INPUTS pour connaitre l'état des sorties?

Est-ce que j'ai été clair parce que je suis un peu dans mon truc donc pas évident à expliquer...
 smiley-mr-green
bonjour
peut etre en  lisant les ports concernés
voir
http://www.arduino.cc/en/Reference/PortManipulation
Logged

Offline Offline
God Member
*****
Karma: 12
Posts: 912
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Bonjour Artouste,

Je ne vois aucune différence pour mon problème.

Le seul avantage à utiliser les fonctions de ton lien c'est de povoir activer/désactiver/initialiser des pins en même temps.

Mais je ne trouve pas de fonction pour tester l'état d'un output?
Logged

France
Offline Offline
God Member
*****
Karma: 4
Posts: 971
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Bonjour
Quote
Autrement dit est-ce qu'un digitalread(pin) fonctionne sur un pin paramétré en OUTPUT?
As-tu testé ?
Si ça ne fonctionne pas (je ne suis pas actuellement en mesure de tester pour répondre) alors l'accès global au Port concerné dont parle Artouste devrait en principe permettre de contourner une limite (éventuelle) d'Arduino.
Par exemple x=PINB donnera dans x l'état logique 'réel' des 8 pins du Port B, y compris celles qui sont en sortie. Un masque suffit à isoler la pin à surveiller.

ça peut meme donner des choses surprenantes : une sortie mise à l'état haut mais débitant trop de courant sera lue comme étant à l'état bas (tension inférieure au seuil)

D'après le schéma donnant la structure des Ports le retour d'information en provenance de la pin est maintenu lorsque celle ci est configurée en sortie.
« Last Edit: January 29, 2013, 04:55:11 am by al1fch » Logged

Offline Offline
Faraday Member
**
Karma: 34
Posts: 5083
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Bonjour Artouste,

Je ne vois aucune différence pour mon problème.

Le seul avantage à utiliser les fonctions de ton lien c'est de povoir activer/désactiver/initialiser des pins en même temps.

Mais je ne trouve pas de fonction pour tester l'état d'un output?
re
Je me plante peut etre ou je n'ai pas bien compris, mais je ne vois pas ce qui interdirait de lire le(s) port utilisé en sortie pour tes relais
Etat_B=PORTB;
normalement ça recopie l'etat du PORTB dans la variable Etat_B
Logged

Offline Offline
God Member
*****
Karma: 12
Posts: 912
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Mais pour faire du "PINB" ne faut-il pas que les pins soient déclarés en INPUTS?

Quote
PINB is the input register variable It will read all of the digital input pins at the same time.

Bon de toute façon je testerais tout ça pour voir si ça fonctionne ce soir.

Quote
Bonjour
Quote
Autrement dit est-ce qu'un digitalread(pin) fonctionne sur un pin paramétré en OUTPUT?
As-tu testé ?

Ben non pas encore du coup, j'avais peur de griller mon arduino  smiley-sweat
Logged

Offline Offline
God Member
*****
Karma: 12
Posts: 912
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Bonjour Artouste,

Je ne vois aucune différence pour mon problème.

Le seul avantage à utiliser les fonctions de ton lien c'est de povoir activer/désactiver/initialiser des pins en même temps.

Mais je ne trouve pas de fonction pour tester l'état d'un output?
re
Je me plante peut etre ou je n'ai pas bien compris, mais je ne vois pas ce qui interdirait de lire le(s) port utilisé en sortie pour tes relais
Etat_B=PORTB;
normalement ça recopie l'etat du PORTB dans la variable Etat_B

A oui tu as raison, j'ai lu trop vite et n'ai pas fait attention à la différence qu'il y a entre PORTD et PORTB ?!

C'est bizarre j'ai l'impression que dans l'article ils mélangent les deux également non? :
Quote
PORTB is the register for the state of the outputs. For example;
PORTD = B10101000; // sets digital pins 7,5,3 HIGH

Dommage que je n'ai pas d'arduino sous la main sinon j'aurais testé tout de suite à midi...

?:
« Last Edit: January 29, 2013, 05:11:02 am by john_lenfr » Logged

France
Offline Offline
God Member
*****
Karma: 4
Posts: 971
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Oui, l'article n'est ni complet ni parfait !
En principe , pour une sortie, PORTB et PINB devrait renvoyer  la même valeur binaire. (je testerai dès que possible)
La nuance c'est que PORTB renvoie l'état de la bascule, l'état 'voulu' en quelque sorte et que PINB renvoie une information prélevée plus près de la broche de sortie, l'état logique 'réel' existant sur la broche elle même.
L'article cité simplifie les choses  et n'évoque pas le maintien du retour d'info par PINB dans le cas d'une sortie.
On ne peut reprocher cela à l'article qui est naturellement simplificateur : une voie pour la sortie, une autre pour l'entrée, pas de mélange des genres pour ne pas embrouiller.
Si le schéma te dis quelquechose  j'ai mis en bleu la sortie par PORTB vers la broche (jaune) et le retour par PINB (le même retour que pour une entrée) en orange.


* Port et Pin pour une sortie.jpg (35.51 KB, 529x455 - viewed 45 times.)
« Last Edit: January 29, 2013, 06:01:35 am by al1fch » Logged

Offline Offline
Faraday Member
**
Karma: 34
Posts: 5083
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset


Dommage que je n'ai pas d'arduino sous la main sinon j'aurais testé tout de suite à midi...

re
test rapide sur un duemilanove (black widow 1.0) je n'ai que ça sous la main

avec ce code je recupere pb sur le serial 0 32 0 32 0 32 0 32 ...
Code:
/*
  Blink
  Turns on an LED on for one second, then off for one second, repeatedly.
 
  This example code is in the public domain.
 */
 
// Pin 13 has an LED connected on most Arduino boards.
// give it a name:
int led = 13;
byte pb;
// the setup routine runs once when you press reset:
void setup() {                
  // initialize the digital pin as an output.
  pinMode(led, OUTPUT);  
Serial.begin(9600);  

  
}

// the loop routine runs over and over again forever:
void loop() {
  digitalWrite(led, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(1000);               // wait for a second
  pb=PORTB;
  Serial.println(pb);
  digitalWrite(led, LOW);    // turn the LED off by making the voltage LOW
  pb=PORTB;
  Serial.println(pb);
  delay(1000);               // wait for a second
}
Logged

Offline Offline
God Member
*****
Karma: 12
Posts: 912
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Oui, l'article n'est ni complet ni parfait !
En principe , pour une sortie, PORTB et PINB devrait renvoyer  la même valeur binaire. (je testerai dès que possible)
La nuance c'est que PORTB renvoie l'état de la bascule, l'état 'voulu' en quelque sorte et que PINB renvoie une information prélevée plus près de la broche de sortie, l'état logique 'réel' existant sur la broche elle même.
L'article cité simplifie les choses  et n'évoque pas le maintien du retour d'info par PINB dans le cas d'une sortie.
On ne peut reprocher cela à l'article qui est naturellement simplificateur : une voie pour la sortie, une autre pour l'entrée, pas de mélange des genres pour ne pas embrouiller.
Si le schéma te dis quelquechose  j'ai mis en bleu la sortie par PORTB vers la broche (jaune) et le retour par PINB (le même retour que pour une entrée) en orange.


Ok, pas évident à comprendre tout ça. Mais je vois la différence, merci pour le shéma smiley-wink

re
test rapide sur un duemilanove (black widow 1.0) je n'ai que ça sous la main

avec ce code je recupere pb sur le serial 0 32 0 32 0 32 0 32 ...
Code:
/*
  Blink
  Turns on an LED on for one second, then off for one second, repeatedly.
 
  This example code is in the public domain.
 */
 
// Pin 13 has an LED connected on most Arduino boards.
// give it a name:
int led = 13;
byte pb;
// the setup routine runs once when you press reset:
void setup() {                
  // initialize the digital pin as an output.
  pinMode(led, OUTPUT);  
Serial.begin(9600);  

  
}

// the loop routine runs over and over again forever:
void loop() {
  digitalWrite(led, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(1000);               // wait for a second
  pb=PORTB;
  Serial.println(pb);
  digitalWrite(led, LOW);    // turn the LED off by making the voltage LOW
  pb=PORTB;
  Serial.println(pb);
  delay(1000);               // wait for a second
}

Tu reçois donc 0 pour un état HIGH et 32 pour un état LOW?
32 en binaire ça nous donne: 0b100000

Comment interpréter le résultat?
« Last Edit: January 29, 2013, 06:35:50 am by john_lenfr » Logged

Offline Offline
Faraday Member
**
Karma: 34
Posts: 5083
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset


Tu reçois donc 0 pour un état HIGH et 32 pour un état LOW?
32 en binaire ça nous donne: 0b100000

Comment interpréter le résultat?
Non c'est l'inverse (j'ai debuté par 0 alors que c'etait 32 )
petit code modifié juste pour voir
sortie
Quote
LED ON  32
LED OFF 0
LED ON  32
LED OFF 0
LED ON  32
LED OFF 0
LED ON  32
LED OFF 0
LED ON  32
LED OFF 0
LED ON  32
LED OFF 0
LED ON  32
LED OFF 0
LED ON  32
Code:
/*
  Blink
 Turns on an LED on for one second, then off for one second, repeatedly.
 
 This example code is in the public domain.
 */

// Pin 13 has an LED connected on most Arduino boards.
// give it a name:
int led = 13;
byte pb;
// the setup routine runs once when you press reset:
void setup() {                
  // initialize the digital pin as an output.
  pinMode(led, OUTPUT);  
  Serial.begin(9600);  
}
// the loop routine runs over and over again forever:
void loop() {
  digitalWrite(led, HIGH);   // turn the LED on (HIGH is the voltage level)

  pb=PORTB;
  Serial.print("LED ON  ");
  Serial.println(pb);
  delay(1000); // wait for a second
  digitalWrite(led, LOW);    // turn the LED off by making the voltage LOW
  pb=PORTB;
  Serial.print("LED OFF ");
  Serial.println(pb);
  delay(1000);               // wait for a second
}
« Last Edit: January 29, 2013, 06:51:06 am by Artouste » Logged

Offline Offline
Faraday Member
**
Karma: 34
Posts: 5083
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Et complement pour repondre a al1fch

avec PINB à la place de PORTB

Quote
LED ON  60
LED OFF 28
LED ON  60
LED OFF 28
LED ON  60
LED OFF 28
LED ON  60
LED OFF 28
LED ON  60
LED OFF 28
LED ON  60
LED OFF 28
LED ON  60
LED OFF 28
LED ON  60
LED OFF 28
Logged

Pages: [1] 2 3   Go Up
Jump to: