Go Down

Topic: RTC, Ethernet(SPI) conflit [Non réglé] (Read 2 times) previous topic - next topic

skizoh

Apr 18, 2012, 02:06 pm Last Edit: Apr 20, 2012, 09:30 am by skizoh Reason: 1
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 ! :smiley-mr-green:
Un tien vaux mieux que deux tu l'auras !

Artouste

#1
Apr 18, 2012, 03:00 pm Last Edit: Apr 18, 2012, 03:01 pm by Artouste Reason: 1

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 ! :smiley-mr-green:


bonjour
à chaud !
conflit de pin

RS495 ?

schema des shields et code utilisé


skizoh

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+b*10;
        }
        else if(i==5){
            int b=(n & B00010000)>>4;
            TimeDate=a+b*10;
        }
        else if(i==6){
            int b=(n & B11110000)>>4;
            TimeDate=a+b*10;
        }
        else{ 
            int b=(n & B01110000)>>4;
            TimeDate=a+b*10;
            }
    }
    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 =)
Un tien vaux mieux que deux tu l'auras !

fdufnews

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.

skizoh

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();) 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 =)
Un tien vaux mieux que deux tu l'auras !

barbudor

#5
Apr 18, 2012, 06:41 pm Last Edit: Apr 18, 2012, 06:44 pm by barbudor Reason: 1
On pourrait avoir au moins un code qui compile ?

Code: [Select]

   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
Barbuduino: Arduino sur Breadboard & VinciDuino: Clone Leonardo // WR703: Mini-routeur hacké // LauchPad MSP430 et Stellaris // Panda II Arduino-like .NetMF sous VisualC#
RTFC: Read That F.....g Code / RTFD: Read That F.....g Doc / RTFDS: Read That F.....g DataSheet / RTFS: Read That F.....g Schematic / Wot da ya wanna D.I.Y. today ?

barbudor

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.
Barbuduino: Arduino sur Breadboard & VinciDuino: Clone Leonardo // WR703: Mini-routeur hacké // LauchPad MSP430 et Stellaris // Panda II Arduino-like .NetMF sous VisualC#
RTFC: Read That F.....g Code / RTFD: Read That F.....g Doc / RTFDS: Read That F.....g DataSheet / RTFS: Read That F.....g Schematic / Wot da ya wanna D.I.Y. today ?

skizoh

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!
Un tien vaux mieux que deux tu l'auras !

skizoh

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?
Un tien vaux mieux que deux tu l'auras !

barbudor

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.
Barbuduino: Arduino sur Breadboard & VinciDuino: Clone Leonardo // WR703: Mini-routeur hacké // LauchPad MSP430 et Stellaris // Panda II Arduino-like .NetMF sous VisualC#
RTFC: Read That F.....g Code / RTFD: Read That F.....g Doc / RTFDS: Read That F.....g DataSheet / RTFS: Read That F.....g Schematic / Wot da ya wanna D.I.Y. today ?

skizoh

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

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é..
Un tien vaux mieux que deux tu l'auras !

skizoh

bon y a du neuf !!  :smiley-sweat:

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...
Un tien vaux mieux que deux tu l'auras !

skizoh

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+b*10;
       }
       else if(i==5){
           int b=(n & B00010000)>>4;
           TimeDate=a+b*10;
       }
       else if(i==6){
           int b=(n & B11110000)>>4;
           TimeDate=a+b*10;
       }
       else{  
           int b=(n & B01110000)>>4;
           TimeDate=a+b*10;
           }
   }
   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
Un tien vaux mieux que deux tu l'auras !

barbudor

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.
Barbuduino: Arduino sur Breadboard & VinciDuino: Clone Leonardo // WR703: Mini-routeur hacké // LauchPad MSP430 et Stellaris // Panda II Arduino-like .NetMF sous VisualC#
RTFC: Read That F.....g Code / RTFD: Read That F.....g Doc / RTFDS: Read That F.....g DataSheet / RTFS: Read That F.....g Schematic / Wot da ya wanna D.I.Y. today ?

skizoh

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 !
Un tien vaux mieux que deux tu l'auras !

Go Up