Compréhension code

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 ?

#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 ?

number %= 1000;
number = number % 1000;

Merci
Voici j'ai un autre cas que j'ai du mal à comprendre : Compréhension code - #4 by icare - Français - Arduino Forum

#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

number %= 1000;
number = number % 1000;

Oui cette équivalence est vraie.

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

Bonsoir,
Merci fdufnews pour ces explications.

Bonjour
Décidément, encore un cas où j'ai du mal.

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

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

Re,
La variable est déclarée dans le fichier PCF8574.h comme suit :

volatile int PCFPULL[8];

A tout hasard j'ai joint les fichiers PCF8574.h et .ccp

PCF8574.zip (1.69 KB)

On dirait bien une erreur et elle se répète 2 fois

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)

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:

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);
	}
}

Pour info le zip vient de mon blog : [Librairie Arduino] PCF8574 – PCF8575 | Skyduino - Le DIY à la française

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 :grin:)

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.

Bonjour,

skywodd:
Pour info le zip vient de mon blog : [Librairie Arduino] PCF8574 – PCF8575 | Skyduino - Le DIY à la française

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 :grin:)

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"

skywodd:
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

icare:
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 :wink:
Cette librairie est une catastrophe, j'avais même pas eu le courage à l'époque de faire la transition 0022 -> 1.0 :cold_sweat:

icare:
"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 :grin:

icare:
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 :wink:
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 :wink:
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 :grin: