Go Down

Topic: Compréhension code (Read 3673 times) previous topic - next topic

icare

Aug 13, 2013, 04:02 am Last Edit: Aug 15, 2013, 12:20 pm by icare Reason: 1
Bonjour,
Dans un programme de gestion de 4 afficheurs 7 segments (qui fonctionne) le programme fait appel à des fonctions contenues dans un fichier .h.
Pourriez-vous me dire ce que font les deux lignes en rouge ?
Code: [Select]

#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
.......
[color=red]
#define sbi(PORT, bit) (PORT |= (1<<bit))
#define cbi(PORT, bit) (PORT &=~(1<<bit))
[/color]
.........

Pour la ligne ci-dessous équivalence est-elle vraie ?
Code: [Select]
number %= 1000;
number = number % 1000;

Merci
Voici j'ai un autre cas que j'ai du mal à comprendre : http://forum.arduino.cc/index.php?topic=182429.msg1354169#msg1354169
2B OR NOT(2B) = FF
Arduino 1.0.5 à 1.8.5 + gEdit + Ubuntu 18.04 LTS

fdufnews

#1
Aug 13, 2013, 07:08 am Last Edit: Aug 13, 2013, 12:46 pm by fdufnews Reason: 1
Code: [Select]
#define sbi(PORT, bit) (PORT |= (1<<bit))
#define cbi(PORT, bit) (PORT &=~(1<<bit))


sbi positionne à 1 un bit dans un port d'entrée/sortie. sbi = Set BIt
cbi positionne à 0 un bit dans un port d'entrée/sortie. cbi = Clear BIt

PORT = adresse du registre à modifier
bit     = n° du bit (valeur de 0 à 7) à modifier dans le registre

Je parle de port d'entrée/sortie parce que le mot PORT apparaît dans le define mais en fait cette macro fonctionne aussi bien avec n'importe quel registre accessible en lecture/écriture

Code: [Select]
number %= 1000;
number = number % 1000;

Oui cette équivalence est vraie.

Pour info les mises en forme ne fonctionnent pas entre les balises code.

icare

Bonsoir,
Merci fdufnews pour ces explications.
2B OR NOT(2B) = FF
Arduino 1.0.5 à 1.8.5 + gEdit + Ubuntu 18.04 LTS

icare

Bonjour
Décidément, encore un cas où j'ai du mal.
Code: [Select]
void PCF8574::pullUp(int pin){
if((pin >= 0) && (pin < 8)){
PCFPULL[pin] == 1;  //<- Que fait cette ligne ********************************
i2cRead();
bitWrite(PCFPORTA,pin,1);
i2cSend(PCFPORTA);
}
}

Je croyais que == était un opérateur de comparaison
2B OR NOT(2B) = FF
Arduino 1.0.5 à 1.8.5 + gEdit + Ubuntu 18.04 LTS

fdufnews

En l'état cette ligne ne fait rien.
Il faudrait quand même savoir ce qu'est ce PCFPULL pour mieux comprendre

icare

Re,
La variable est déclarée dans le fichier PCF8574.h comme suit :
Code: [Select]
volatile int PCFPULL[8];

A tout hasard j'ai joint les fichiers PCF8574.h et .ccp
2B OR NOT(2B) = FF
Arduino 1.0.5 à 1.8.5 + gEdit + Ubuntu 18.04 LTS

fdufnews

On dirait bien une erreur et elle se répète 2 fois
Code: [Select]
void PCF8574::pullUp(int pin){
if((pin >= 0) && (pin < 8)){
PCFPULL[pin] == 1;
i2cRead();
bitWrite(PCFPORTA,pin,1);
i2cSend(PCFPORTA);
}
}

void PCF8574::pullDown(int pin){
if((pin >= 0) && (pin < 8)){
PCFPULL[pin] == 2;
i2cRead();
bitWrite(PCFPORTA,pin,0);
i2cSend(PCFPORTA);
}
}


D'ailleurs plus loin ce tableau est utilisé dans un test (pour de vrai cette fois)
Code: [Select]
void PCF8574::i2cSend(){
PCFBUFFER = i2cRead(0x00);
for(int i=0;i<8;i++){
if(bitRead(PCFTRISA,i) == INPUT)
bitWrite(PCFPORTA,i,bitRead(PCFBUFFER,i));
if(PCFPULL[i] == 1) bitWrite(PCFPORTA,i,1); // Required for unblock pull level
if(PCFPULL[i] == 2) bitWrite(PCFPORTA,i,0); // Required for unblock pull level
}
Wire.beginTransmission(PCFaddress);
Wire.write(PCFPORTA);
Wire.endTransmission();
}



Quand on voit cette dernière fonction on s'aperçoit que le tableau sert à mémoriser l'état des pullup en sortie. Donc il faut bien renseigner le tableau lorsque leur état change.
A mon sens les 2 premières fonctions devraient être écrite comme ça:
Code: [Select]
void PCF8574::pullUp(int pin){
if((pin >= 0) && (pin < 8)){
PCFPULL[pin] = 1;
i2cRead();
bitWrite(PCFPORTA,pin,1);
i2cSend(PCFPORTA);
}
}

void PCF8574::pullDown(int pin){
if((pin >= 0) && (pin < 8)){
PCFPULL[pin] = 2;
i2cRead();
bitWrite(PCFPORTA,pin,0);
i2cSend(PCFPORTA);
}
}



skywodd

Pour info le zip vient de mon blog : http://skyduino.wordpress.com/librairie-arduino-pcf8574-pcf8575/

Icare quand je te dit que le code de cette librairie est buggé c'est pas pour rien (cf ton autre topic) ...
La preuve il y a deux ans j'avais même pas vu une erreur aussi basique qu'une "assignation-test".
(j'ai des circonstances atténuantes Mr le juge, j'étais un jeune con "codant" en BASIC sur Cubloc :smiley-mr-green:)

Donc je le répète encore une fois : cette librairie NE MARCHE PAS (du moins pas les interruptions).
Faudrait tout reprendre de zéro, en l'état cette librairie est un bourbier infâme.

fdufnews pour les deux fonctions c'est bien comme ça quelles auraient toujours du être écrites.
Mais mon principe d'un buffer "PCFPULL" pour les pullup / pulldown est à revoir, ça n'as pas de sens.
Des news, des tutos et plein de bonnes choses sur http://skyduino.wordpress.com !

icare

Bonjour,

Pour info le zip vient de mon blog : http://skyduino.wordpress.com/librairie-arduino-pcf8574-pcf8575/

Icare quand je te dit que le code de cette librairie est buggé c'est pas pour rien (cf ton autre topic) ...
La preuve il y a deux ans j'avais même pas vu une erreur aussi basique qu'une "assignation-test".
(j'ai des circonstances atténuantes Mr le juge, j'étais un jeune con "codant" en BASIC sur Cubloc :smiley-mr-green:)

Skywodd je n'ai jamais dit que ton code était buggé, je n'ai pas la compétence pour affirmer ce genre de chose. j'essaye juste de comprendre ce qui a été écrit. Et je remercie au passage tous les membres du forum pour leur aide précieuse.
"M le Juge moi aussi j'ai des circonstances atténuantes car je fais parti des vieux qui essayent de rester dans la course de l'évolution technique"


Donc je le répète encore une fois : cette librairie NE MARCHE PAS (du moins pas les interruptions).
Faudrait tout reprendre de zéro, en l'état cette librairie est un bourbier infâme.

Tu sais avec l'âge on entend un peu moins bien et il faut souvent répéter les choses, en l'occurrence pour cette librairie qui m'intéresse beaucoup d'un point de vue interruption. Alors j'essaye d'y mettre le peu d'énergie et de temps qui me reste.
A défaut d'avoir une solution qui fonctionne, j'essaye de tout comprendre alors il faudra s'attendre à ce que je pose des questions (essayez de repenser à vos débuts).
Si mes questions vous importunent, vous m'en voyez navré, ce n'est en aucun cas le but. Il suffit de me le faire savoir et je me retire sur la pointe des pieds.
En tout cas merci pour votre aide.
Peut être à bientôt
2B OR NOT(2B) = FF
Arduino 1.0.5 à 1.8.5 + gEdit + Ubuntu 18.04 LTS

skywodd


Skywodd je n'ai jamais dit que ton code était buggé, je n'ai pas la compétence pour affirmer ce genre de chose. j'essaye juste de comprendre ce qui a été écrit. Et je remercie au passage tous les membres du forum pour leur aide précieuse.

C'est moi qui le dit ;)
Cette librairie est une catastrophe, j'avais même pas eu le courage à l'époque de faire la transition 0022 -> 1.0 :smiley-roll-sweat:


"M le Juge moi aussi j'ai des circonstances atténuantes car je fais parti des vieux qui essayent de rester dans la course de l'évolution technique"

Objection votre honneur ! C'était ma réplique ça :smiley-mr-green:


Tu sais avec l'âge on entend un peu moins bien et il faut souvent répéter les choses, en l'occurrence pour cette librairie qui m'intéresse beaucoup d'un point de vue interruption. Alors j'essaye d'y mettre le peu d'énergie et de temps qui me reste.
A défaut d'avoir une solution qui fonctionne, j'essaye de tout comprendre alors il faudra s'attendre à ce que je pose des questions (essayez de repenser à vos débuts).
Si mes questions vous importunent, vous m'en voyez navré, ce n'est en aucun cas le but. Il suffit de me le faire savoir et je me retire sur la pointe des pieds.

Pas besoin de me vouvoyez ;)
Et ça me dérange pas, ya pas de probléme.

Pour les interruptions le plus simple pour avoir des info sur leurs fonctionnements c'est la doc officielle ;)
http://www.nxp.com/documents/data_sheet/PCF8574.pdf
-> Diagramme 7 page 9 pour le schéma de principe
-> Chapitre 7.2 page 12 pour les explications sur les interruptions
Sinon ce WE je reprend le code, ça promet vu les boulettes déjà citées plus haut :smiley-mr-green:
Des news, des tutos et plein de bonnes choses sur http://skyduino.wordpress.com !

Go Up