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.
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
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? :
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...
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.
john_lenfr:
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 ...
/*
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
}
al1fch:
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
Artouste:
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 ...
/*
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
john_lenfr:
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
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
/*
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
}
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
Bonjour Artouste et merci
60-28=32 le compte est bon !!
je ferai un test en chargeant un peu trop une sortie de manière a obtenir sur la pin une tension traduite comme 'état bas' par PINx alors que PORTx est à l'état haut.
Ok, je vois que PORTB et PORTD et PINB fonctionnent.
Mais comment interpréter ces résultats?
Mon but étant de savoir si une sortie X est à l'état HIGH ou LOW, comment utiliser les résultats que l'on a pour mon application?
En considérant 32 "HIGH"=0b100000 cela veut dire que le pin 5 est à l'état haut. Mais comment on fait la relation entre le pin 5 du PORTD et le pin 13 de l'arduino?
john_lenfr:
Ok, je vois que PORTB et PORTD et PINB fonctionnent.
Mais comment interpréter ces résultats?
Mon but étant de savoir si une sortie X est à l'état HIGH ou LOW, comment utiliser les résultats que l'on a pour mon application?
En considérant 32 "HIGH"=0b100000 cela veut dire que le pin 5 est à l'état haut. Mais comment on fait la relation entre le pin 5 du PORTDB et le pin 13 de l'arduino?
ça depend de ta carte arduino,
dans l'exemple La led13 est sur le connecteur 13 de l'arduino qui est relié par routage PCB sur la pin 19 de l'atmel 168 qui est le bit 5 du PORTB
ça depend de ta carte arduino,
dans l'exemple La led13 est sur le connecteur 13 de l'arduino qui est relié par routage PCB sur la pin 19 de l'atmel 168 qui est le bit 5 du PORTB
Ok, cette fois ci j'ai tout compris.
Si je suis le schéma et les indication de la page "Port Manipulation" on aurait:
PORTD maps to Arduino digital pins 0 to 7
PORTD 0b00000001 (1 en DEC)=>pin 0
PORTD 0b00000010 (2 en DEC)=>pin 1
PORTD 0b00000100 (4 en DEC)=>pin 2
PORTD 0b00001000 (8 en DEC)=>pin 3
PORTD 0b00010000 (16 en DEC)=>pin 4
PORTD 0b00100000 (32 en DEC)=>pin 5
PORTD 0b01000000 (64 en DEC)=>pin 6
PORTD 0b10000000 (128 en DEC)=>pin 7
PORTB maps to Arduino digital pins 8 to 13
PORTB 0b00000001 (1 en DEC) =>pin 8
PORTB 0b00000010 (2 en DEC)=>pin 9
PORTB 0b00000100 (4 en DEC)=>pin 10
PORTB 0b00001000 (8 en DEC)=>pin 11
PORTB 0b00010000 (16 en DEC)=>pin 12
PORTB 0b00100000 (32 en DEC)=>pin 13
PORTB 0b01000000 =>crystal pin not usable
PORTB 0b10000000 =>crystal pin not usable
Dans notre exemple on a bien demandé l'état en faisant du PORTB sur la pin 13, ce qui nous a bien renvoyé 32 en DEC soit 0b00100000
Bon maintenant que c'est bon pour les PORTX, attaquons les PINX que nous conseille al1fch car au plus "près" de la réalité de l'état de la sortie.
al1fch:
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.
PINB - The Port B Input Pins Register - read only (maps to Arduino digital pins 8 to 13 The two high bits (6 & 7) map to the crystal pins and are not usable)
On a vu qu'on a, avec du PINB interrogeant la sortie pin13 de l'arduino (soit PB5 broche 19 de l'atmega):
LED ON 60
LED OFF 28
Ce qui nous donne:
ON: 60 en DEC => 0b00111100
OFF:28 en DEC => 0b00011100
Heu, la je fais plus le rapprochement entre le résultat et le pin en question?
john_lenfr:
Heu oui, PORTB bien sur
...
Ce qui nous donne:
ON: 60 en DEC => 0b00111100
OFF:28 en DEC => 0b00011100
Heu, la je fais plus le rapprochement entre le résultat et le pin en question?
ici il faut raisonner en bit
le seul bit qui change est bien le bit 5 du port B qui change par le blink , le programme ne fait que ça = faire clignoter la led13
Donc cela veut dire que je ne peux pas utiliser PINX pour connaitre l'état d'une sortie car si je veux le faire je suis obligé de changer sont état pour connaitre la différence et interpréter de quelle sortie il s'agit?
Je dois donc rester sur du PORTX, même si c'est moins précis cela me renseignera sur l'état de la sortie et son pin.