RTC, Ethernet(SPI) conflit [Non réglé]

Bonjour,

j'ai un problème, un conflit entre mon timer (RTC rs3234 fonctionne en SPI) et une liaison série RS495 (software serial), les deux fonctionnent seul et des qu'il sagit de les mettre dans le même programme la liaison série ne fonctionne plus..

je ne sais pas si c'est déjà arriver pour d'autre module qui aurai crée des conflit en tout K pour ma par, dans le programme il n'y a aucun rapport entre les deux partie.. donc je pense que c'est physiquement que l'un gène l'autre, il ont des broches bien distinct pourtant..

si vous avez des idée ou même des solutions merci de votre aide =)

Skizo ! :grin:

skizoh:
Bonjour,

j'ai un problème, un conflit entre mon timer (RTC rs3234 fonctionne en SPI) et une liaison série RS495 (software serial), les deux fonctionnent seul et des qu'il sagit de les mettre dans le même programme la liaison série ne fonctionne plus..

je ne sais pas si c'est déjà arriver pour d'autre module qui aurai crée des conflit en tout K pour ma par, dans le programme il n'y a aucun rapport entre les deux partie.. donc je pense que c'est physiquement que l'un gène l'autre, il ont des broches bien distinct pourtant..

si vous avez des idée ou même des solutions merci de votre aide =)

Skizo ! :grin:

bonjour
à chaud !
conflit de pin

RS495 ?

schema des shields et code utilisé

RS485 pardon ^^

alors pin utiliser par les deux composant:

RS485 : GND 5V + Numerique pin 3 2
RTC : GND GND 5V (pas de conflit d'alim j'ai éssayer d'alimenter le RS485 apart et aucun résultat :s) SCK MISO MOSI Numerique pin 8

Code:

RTC:
#include <SPI.h>
const int cs=8; //chip select

void setup()
{
RTC_init();
}

int RTC_init(){
pinMode(cs,OUTPUT); // chip select
// start the SPI library:
SPI.begin();
SPI.setBitOrder(MSBFIRST);
SPI.setDataMode(SPI_MODE1); // both mode 1 & 3 should work
//set control register
digitalWrite(cs, LOW);
SPI.transfer(0x8E);
SPI.transfer(0x60); //60= disable Osciallator and Battery SQ wave @1hz, temp compensation, Alarms disabled
digitalWrite(cs, HIGH);
delay(10);
}

String ReadTimeDate(){
String temp;

int TimeDate [7]; //second,minute,hour,null,day,month,year
for(int i=0; i<=6;i++){
if(i==3)
i++;
digitalWrite(cs, LOW);
SPI.transfer(i+0x00);
unsigned int n = SPI.transfer(0x00);
digitalWrite(cs, HIGH);
int a=n & B00001111;
if(i==2){
int b=(n & B00110000)>>4; //24 hour mode
if(b==B00000010)
b=20;
else if(b==B00000001)
b=10;
TimeDate*=a+b;*

  • }*
  • else if(i==4){*
  • int b=(n & B00110000)>>4;*
    TimeDate_=a+b10;_
    _
    }_
    _
    else if(i==5){_
    _
    int b=(n & B00010000)>>4;_
    TimeDate_=a+b10;
    * }
    else if(i==6){
    int b=(n & B11110000)>>4;
    TimeDate=a+b10;

    * }
    else{
    int b=(n & B01110000)>>4;
    TimeDate=a+b10;

    * }
    }
    temp.concat(TimeDate[4]);
    temp.concat("/") ;
    temp.concat(TimeDate[5]);
    temp.concat("/") ;
    temp.concat(TimeDate[6]);
    temp.concat(" ") ;
    temp.concat(TimeDate[2]);
    temp.concat(":") ;
    temp.concat(TimeDate[1]);
    temp.concat(":") ;
    temp.concat(TimeDate[0]);
    return(temp);
    }
    void loop() {
    Serial.println(ReadTimeDate());
    delay(1000);
    }
    RS485:
    #include <SoftwareSerial.h>
    SoftwareSerial portOne(2, 3);
    void setup()
    {
    portOne.begin(2400);
    }
    void loop(){
    portOne.write(reception[ecriture]);
    }*

    voila tout... merci de votre aide =)_

Oui mais là c'est les 2 programmes qui fonctionnent que tu nous mets. Nous on aurait préféré que tu postes celui avec lequel tu as des problèmes.

bas a vrai dire si je le met tout le monde par en courant il fait 950 ligne xDD

mais en gros c'est toute les ligne qui servent a faire fonctionner les deux yen a pas une de plus, mais pour vous aiguiller, des que un RTC init (RTC.init():wink: est la le RS485 ne marche plus, sinon même avec le reste du code rien ne bug.. il suffit que j'enleve le RTC init et la ligne pour lire l'heur et hop le RS485 apparet.. donc c'est l'init qui fait tout foiré.. mais comment contré sa.. Oo

merci de votre aide =)

On pourrait avoir au moins un code qui compile ?

    int TimeDate[7]; //second,minute,hour,null,day,month,year     
....
    TimeDate=a+b*10;

Idem pour le code RS485 où il y a des variables non définies

Une fois corrigé les fôtes de codage, çà tourne chez moi.
-> TimeDate=a+b => TimeDate_=a+b*10;_
-> ajouté Serial.Begin(9600)
-> portOne.write( existe pas) -> portOne.write( "aaa" );
Bon j'ai pas le composant qui va bien donc je ne sais pas ce que je lis mais le code s'exécute et il y a quelque chose qui sort sur la liaison série pin 3.

bas voila le problème c'est que moi aussi sa compile et sa run y a pas de souci mais quand on branche les deux modules ( pour la liaison RS485 j'utilise un max488 ) bas le RTC prend le dessus sur la RS485 et elle ne renvoie plus rien.. désolé si le code compile pas, il manque les variable et un serial begin pour la RTC sinon il y à tout..

je vois toujours pas de solution, j'ai essayé d'enlever chaque ligne indépendamment dans l'init RTC pas moyen de trouver celle qui fait buguer..

si vous voulez le code en entier je peut toujours vous le donner bien que je ne pense pas que sa vous aide à vrai dire :s

merci d’essayer de m'aider quand même =)

Skizo!

petit test de ce matin: prog avec RTC + RS485 niveau matos que la RS485 de brancher et déjà la sa fonctionne pas... alors pourquoi barbudor a tu réussi à le faire fonctionner.. les data qui sortent de ta pin3 tu les a vérifiées? elle sont juste ou tu a juste quelque chose mais on sais pas trop coi?

J'ai juste vérifié que la sortie pin 3 bougeait. Je n'ai rien branché, je vois juste des 0 et des 1 bouger.
Je n'ai pas non plus ton composant RTC donc la lecture sur le SPI se fait dans le vide (je ne lis que des 1).

Est tu sur de ton cablage ?
Il n'y a aucune raison pour que la lib SoftSerial interagisse avec le SPI si tu utilise des broches distinctes.

Donc je pencherait pour un problème de cablage.

PS: Juste un précision de vocabulaire : Si tu utilise un MAX488 tu es donc en full-duplex (figure 2 page 8 de la datasheet Maxim). C'est donc du RS422 et non pas du RS485.

oui je sais pour le RS422 le composant est fait pour sa mais moi jue l'utilise en simplex et il est tout a fait compatible avec le RS485 :slight_smile:

bref bref bref !

le câblage du max est super simple et fonctionne seul et pour le RTC c'est légèrement plus dure mais le RTC fonctionne aussi seul donc.. problème de câblage problème de câblage.. je ne pense pas :x

je désespéré..

bon y a du neuf !! :sweat_smile:

la j'ai fait un mini programme avec juste les deux et effectivement sa fonctionne...

ce qui veut dire que c'est dans mon big programme que sa bug...

bon ba.. le voila:

#include <SPI.h>
#include <Ethernet.h>
#include <SoftwareSerial.h>
#include <EthernetUdp.h>
#include <string.h>

const int cs=8; //chip select
SoftwareSerial portOne(2, 3);
EthernetUDP Udp;

int time_preset_1[6],time_preset_2[6],time_preset_3[6],time_preset_4[6],time_preset_5[6],time_preset_6[6],time_preset_7[6],time_preset_8[6],time_preset_9[6];
int ronde_active=0;
int time_of_ronde=0;
int switch_ronde=1;
int ID_ronde=1;
int ID_dome=1;
int ID_arduino=1;
int heur_rond1_s,heur_rond2_s,heur_rond3_s,heur_rond4_s,heur_rond5_s,heur_rond1_f,heur_rond2_f,heur_rond3_f,heur_rond4_f,heur_rond5_f;
int min_rond1_s,min_rond2_s,min_rond3_s,min_rond4_s,min_rond5_s,min_rond1_f,min_rond2_f,min_rond3_f,min_rond4_f,min_rond5_f;
int temperature_analogique=0;
int ecriture=0;
int tension_can=0;

float tension=0;

boolean ronde1_chrono=0,ronde2_chrono=0,ronde3_chrono=0,ronde4_chrono=0,ronde5_chrono=0;
boolean fin_tempo=1;

char h_start_ronde1[6],h_start_ronde2[6],h_start_ronde3[6],h_start_ronde4[6],h_start_ronde5[6];
char h_fin_ronde1[6],h_fin_ronde2[6],h_fin_ronde3[6],h_fin_ronde4[6],h_fin_ronde5[6];
char temperature[25];

float temp=0;

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xCC };
byte broadcast[] = { 255, 255, 255, 255};
byte trame_ronde[7];
byte reception[16];
byte rcv_pupitre[7];

unsigned int localPort = 1234;
unsigned long time1,time2,temp_act=0,temp_prec=0;

void setup()
{
Ethernet.begin(mac);
portOne.begin(2400);
Udp.begin(localPort);
Serial.begin(2400); // DEBUG
RTC_init();
}

void loop() {
Serial.println(ReadTimeDate());
delay(500);

int packetSize = Udp.parsePacket();
if(packetSize)
{
Udp.read(reception,sizeof(reception));

if ((reception[0]==0x11) && (reception[1]==0x22) && (reception[2]==0x33))
{

ID_dome=(reception[3]<<24)+((reception[4]& 0xFF)<<16)+((reception[5]& 0xFF)<<8)+(reception[6]& 0xFF);
if (ID_dome!=ID_arduino){ }
else
{

ID_ronde=((reception[7])<<24)+((reception[8]& 0xFF)<<16)+((reception[9]& 0xFF)<<8)+(reception[10]& 0xFF);

ronde_active=boolean(reception[11]);

time_preset_1[ID_ronde]=(reception[12]<<24)+((reception[13]& 0xFF)<<16)+((reception[14]& 0xFF)<<8)+(reception[15]& 0xFF);

memset(reception, 0x00, sizeof(reception));
delay(15);
Udp.read(reception,sizeof(reception));

time_preset_2[ID_ronde]=(reception[4]<<24)+((reception[5]& 0xFF)<<16)+((reception[6]& 0xFF)<<8)+(reception[7]& 0xFF);
time_preset_3[ID_ronde]=(reception[8]<<24)+((reception[9]& 0xFF)<<16)+((reception[10]& 0xFF)<<8)+(reception[11]& 0xFF);
time_preset_4[ID_ronde]=(reception[12]<<24)+((reception[13]& 0xFF)<<16)+((reception[14]& 0xFF)<<8)+(reception[15]& 0xFF);

memset(reception, 0x00, sizeof(reception));
delay(15);
Udp.read(reception,sizeof(reception));

time_preset_5[ID_ronde]=(reception[4]<<24)+((reception[5]& 0xFF)<<16)+((reception[6]& 0xFF)<<8)+(reception[7]& 0xFF);
time_preset_6[ID_ronde]=(reception[8]<<24)+((reception[9]& 0xFF)<<16)+((reception[10]& 0xFF)<<8)+(reception[11]& 0xFF);
time_preset_7[ID_ronde]=(reception[12]<<24)+((reception[13]& 0xFF)<<16)+((reception[14]& 0xFF)<<8)+(reception[15]& 0xFF);

memset(reception, 0x00, sizeof(reception));
delay(15);
Udp.read(reception,sizeof(reception));

time_preset_8[ID_ronde]=(reception[4]<<24)+((reception[5]& 0xFF)<<16)+((reception[6]& 0xFF)<<8)+(reception[7]& 0xFF);
time_preset_9[ID_ronde]=(reception[8]<<24)+((reception[9]& 0xFF)<<16)+((reception[10]& 0xFF)<<8)+(reception[11]& 0xFF);

memset(reception, 0x00, sizeof(reception));
delay(15);
Udp.read(reception,sizeof(reception));

switch (ID_ronde)
{

case 1 :
heur_rond1_s=(reception[0]<<24)+((reception[1]& 0xFF)<<16)+((reception[2]& 0xFF)<<8)+(reception[3]& 0xFF);
min_rond1_s=(reception[4]<<24)+((reception[5]& 0xFF)<<16)+((reception[6]& 0xFF)<<8)+(reception[7]& 0xFF);
heur_rond1_f=(reception[8]<<24)+((reception[9]& 0xFF)<<16)+((reception[10]& 0xFF)<<8)+(reception[11]& 0xFF);
min_rond1_f=(reception[12]<<24)+((reception[13]& 0xFF)<<16)+((reception[14]& 0xFF)<<8)+(reception[15]& 0xFF);
break;

case 2 :
heur_rond2_s=(reception[0]<<24)+((reception[1]& 0xFF)<<16)+((reception[2]& 0xFF)<<8)+(reception[3]& 0xFF);
min_rond2_s=(reception[4]<<24)+((reception[5]& 0xFF)<<16)+((reception[6]& 0xFF)<<8)+(reception[7]& 0xFF);
heur_rond2_f=(reception[8]<<24)+((reception[9]& 0xFF)<<16)+((reception[10]& 0xFF)<<8)+(reception[11]& 0xFF);
min_rond2_f=(reception[12]<<24)+((reception[13]& 0xFF)<<16)+((reception[14]& 0xFF)<<8)+(reception[15]& 0xFF);
break;

case 3 :
heur_rond3_s=(reception[0]<<24)+((reception[1]& 0xFF)<<16)+((reception[2]& 0xFF)<<8)+(reception[3]& 0xFF);
min_rond3_s=(reception[4]<<24)+((reception[5]& 0xFF)<<16)+((reception[6]& 0xFF)<<8)+(reception[7]& 0xFF);
heur_rond3_f=(reception[8]<<24)+((reception[9]& 0xFF)<<16)+((reception[10]& 0xFF)<<8)+(reception[11]& 0xFF);
min_rond3_f=(reception[12]<<24)+((reception[13]& 0xFF)<<16)+((reception[14]& 0xFF)<<8)+(reception[15]& 0xFF);
break;

case 4 :
heur_rond4_s=(reception[0]<<24)+((reception[1]& 0xFF)<<16)+((reception[2]& 0xFF)<<8)+(reception[3]& 0xFF);
min_rond4_s=(reception[4]<<24)+((reception[5]& 0xFF)<<16)+((reception[6]& 0xFF)<<8)+(reception[7]& 0xFF);
heur_rond4_f=(reception[8]<<24)+((reception[9]& 0xFF)<<16)+((reception[10]& 0xFF)<<8)+(reception[11]& 0xFF);
min_rond4_f=(reception[12]<<24)+((reception[13]& 0xFF)<<16)+((reception[14]& 0xFF)<<8)+(reception[15]& 0xFF);
break;

case 5 :
heur_rond5_s=(reception[0]<<24)+((reception[1]& 0xFF)<<16)+((reception[2]& 0xFF)<<8)+(reception[3]& 0xFF);
min_rond5_s=(reception[4]<<24)+((reception[5]& 0xFF)<<16)+((reception[6]& 0xFF)<<8)+(reception[7]& 0xFF);
heur_rond5_f=(reception[8]<<24)+((reception[9]& 0xFF)<<16)+((reception[10]& 0xFF)<<8)+(reception[11]& 0xFF);
min_rond5_f=(reception[12]<<24)+((reception[13]& 0xFF)<<16)+((reception[14]& 0xFF)<<8)+(reception[15]& 0xFF);
break;

default :
break;
}
}
}
else
{
while(ecriture<=6)
{
portOne.write(reception[ecriture]);
ecriture=ecriture+1;
}
ecriture=0;
memset(reception, 0x00, sizeof(reception));
}

}

if(ronde_active==1 && ID_ronde!=0 && ID_ronde<6)
{

trame_ronde[1]=byte (ID_dome);
trame_ronde[0]=0xff;
trame_ronde[2]=0x00;
trame_ronde[4]=0x00;
time2=millis();
if (time2 > time1 + time_of_ronde)
{ fin_tempo=1; }

hum hum.. good luck ^^ ( je m'y remet cette aprem aussi parce que la si c'est pas eux qui ce gene qui gene le softserial.. ethernet? Oo udp..? Oo) bref

merci de ton aide barbudor =) (j'ai couper le prog il était trop gros pour un seul message...

fin du prog:

switch (switch_ronde)
{
case 1 :
if (time_preset_1[ID_ronde]>0 && fin_tempo==1)
{
time1=millis();
fin_tempo=0;
time_of_ronde=time_preset_1[ID_ronde]*1000;
trame_ronde[3]=0x07;
trame_ronde[5]=0x01;
trame_ronde[6]=trame_ronde[2]+trame_ronde[3]+trame_ronde[4]+trame_ronde[5]+trame_ronde[1];

while(ecriture<=6)
{
portOne.write(trame_ronde[ecriture]);
ecriture=ecriture+1;
}
ecriture=0;
switch_ronde=2;
}else if (time_preset_1[ID_ronde]<1)
{switch_ronde=9;}
break;

case 9 :
if (time_preset_9[ID_ronde]>0 && fin_tempo==1)
{
time1=millis();
fin_tempo=0;
time_of_ronde=time_preset_9[ID_ronde]*1000;
trame_ronde[3]=0x07;
trame_ronde[5]=0x09;
trame_ronde[6]=trame_ronde[2]+trame_ronde[3]+trame_ronde[4]+trame_ronde[5]+trame_ronde[1];
while(ecriture<=6)
{
portOne.write(trame_ronde[ecriture]);
ecriture=ecriture+1;
}
ecriture=0;
switch_ronde=1;
}else if (time_preset_9[ID_ronde]==0)
{switch_ronde=1;}
break;
}
}

}

int RTC_init()
{
pinMode(cs,OUTPUT); // chip select
// start the SPI library:
SPI.begin();
SPI.setBitOrder(MSBFIRST);
SPI.setDataMode(SPI_MODE3); // both mode 1 & 3 should work
//set control register
digitalWrite(cs, LOW);
SPI.transfer(0x8E);
SPI.transfer(0x60); //60= disable Osciallator and Battery SQ wave @1hz, temp compensation, Alarms disabled
digitalWrite(cs, HIGH);
delay(10);
}

String ReadTimeDate(){
String temp;
int TimeDate [7]; //second,minute,hour,null,day,month,year
for(int i=0; i<=6;i++){
if(i==3)
i++;
digitalWrite(cs, LOW);
SPI.transfer(i+0x00);
unsigned int n = SPI.transfer(0x00);
digitalWrite(cs, HIGH);
int a=n & B00001111;
if(i==2){
int b=(n & B00110000)>>4; //24 hour mode
if(b==B00000010)
b=20;
else if(b==B00000001)
b=10;
TimeDate*=a+b;*

  • }*
  • else if(i==4){*
  • int b=(n & B00110000)>>4;*
    TimeDate_=a+b10;_
    _
    }_
    _
    else if(i==5){_
    _
    int b=(n & B00010000)>>4;_
    TimeDate_=a+b10;
    * }
    else if(i==6){
    int b=(n & B11110000)>>4;
    TimeDate=a+b10;

    * }
    else{
    int b=(n & B01110000)>>4;
    TimeDate=a+b10;

    * }
    }
    temp.concat(TimeDate[4]);
    temp.concat("/") ;
    temp.concat(TimeDate[5]);
    temp.concat("/") ;
    temp.concat(TimeDate[6]);
    temp.concat(" ") ;
    temp.concat(TimeDate[2]);
    temp.concat(":") ;
    temp.concat(TimeDate[1]);
    temp.concat(":") ;
    temp.concat(TimeDate[0]);
    return(temp);
    }*

    voilou_

1er : utilises les balises code pour rendre lisible
2em: Pour un grand code, mieux vaut attacher le fichier a ton post, c'est plus facile a récupérer pour le lire ou le tester dans l'IDE
3em: Heu, j'ai pas que çà a faire de debugguer les applis complètes des autres. Je garantit pas d'avoir le temps d'aller plus loin.

aucun problème ^^ merci de m'avoir aider jusqu'ici j'était résigner et la j'y crois de nouveau ^^ merci bicou bicou =) peace

Skizo !

Dis comme ça tu serais pas un peu court en RAM. Par ce que tu as un beau paquet de tableaux + les librairies.

Là, Arduino Playground - AvailableMemory, tu trouveras des petites fonctions que tu peux intégrer à ton programme pour voir combien il te restes de mémoire libre. Faire imprimer la mémoire disponible au début et à la fin du setup().

je vais essayer merci ( javai aussi un gros doute la dessus c'est pourquoi j'ai acheter un chipkit max 32 mais y a pas ethernet dessus faut que je l'adapte et je sais même pas si le RTC va fonctionner dessus..) bref merci

Skizo

Bon bas, pas concluant du tout je suis à peine à la moitié de la mémoire 16k sur 32k, :s j'ai reussi a faire fonctionner les deux ensemble apres la c'est peu etre l'UDP ou l'Ethernet tout simplement je sais pas... :s

grosse galère, sa fait 3jour que j'avance pas là-dessus je sais plus coi inventer comme excuse à mon patron il crois que je fou rien xDD

bref..

Skizo !

Je crois que j'ai trouvé.. le programme fonctionne.. le conflit c'est avec l'Ethernet, il utilise le SPI, du moins sur tout les schéma de ARDUINO que j'ai vue ( exemple: Arduino Shield List: Arduino Ethernet Shield v5.0 ) parce que moi j'ai le ARDUINO Ethernet (le seul d'on on ne parle jamais -___-) et je me demandai si lui aussi avait besoin de ces pin de sortie SPI pour faire tourner son Ethernet ou si il a plusieur SPI....?

Je crois bien que RTC plus ethernet = F*** -__-

Skizo !

Cette carte là: http://arduino.cc/en/Main/ArduinoBoardEthernet
Le schéma est dans la page. L'Ethernet utilise le SPI. Donc il y a peut être des précautions à prendre car il y a peut être bien des fonctions liées à l'Ethernet qui fonctionnent sous interruption (à vérifier).