AIUTOO!! consiglio comando da PLC ad arduino Due o mega CONTINUA

salve al vecchio ide ho aggiunto la gestione pin motori attraverso easy driver, ho aggiunto anche l'istruzione if ma me la da sbaglia, ripropongo anche l'altra domanda, la conversione da binario a intero l'ho fatta correttamente? grazie. non userò la seriale

int PinA=31; //primo pin che arriva dal plc 
int PinB=33; //secondo pin che arriva dal plc
int PinC=35; //terzo pin che arriva dal plc
int PinD=37; //quarto pin che arriva dal plc
int PinE=39; //quinto pin che arriva dal plc
int PinF=41; //sesto pin che arriva dal plc
int PinG=43; //settimo pin che arriva dal plc
int PinH=45; //ottavo pin che arriva dal plc
int Pinaser=30; //pin che va collegato al relè per alimentazione laser
int ConvertToInt=0; 
int conversione(bool BIT0,bool BIT1 ,bool BIT2,bool BIT3,bool BIT4,bool BIT5,bool BIT6,bool BIT7);
int stepmot1=10;
int stepmot2=4;
int dirmot1=9;
int dirmot2=3;
bool BIT0=0,BIT1=0,BIT2=0,BIT3=0,BIT4=0,BIT5=0,BIT6=0,BIT7=0; // assegnazione come variabile booleana a bit
void setup() 
  {
      pinMode(stepmot1, OUTPUT);
      pinMode(stepmot2, OUTPUT);
      pinMode(dirmot1, OUTPUT);
      pinMode(dirmot2, OUTPUT);
      
      
      pinMode(PinA, INPUT); //dichiarazione pin come input
      pinMode(PinB, INPUT); //dichiarazione pin come input
      pinMode(PinC, INPUT); //dichiarazione pin come input
      pinMode(PinD, INPUT); //dichiarazione pin come input
      pinMode(PinE, INPUT); //dichiarazione pin come input
      pinMode(PinF, INPUT); //dichiarazione pin come input
      pinMode(PinG, INPUT); //dichiarazione pin come input
      pinMode(PinH, INPUT); //dichiarazione pin come input
      pinMode(30, OUTPUT); //dichiarazione pin come uscita

      digitalWrite(9,LOW); //assegnazione stato zero come valore inziale
      digitalWrite(10,LOW); //assegnazione stato zero come valore iniziale
      digitalWrite(3,LOW); //assegnazione stato zero come valore iniziale
      digitalWrite(4,LOW); //assegnazione stato zero come valore iniziale

      
      digitalWrite(30,LOW); //assegnazione stato zero come valore inziale
      digitalWrite(31,LOW); //assegnazione stato zero come valore iniziale
      digitalWrite(33,LOW); //assegnazione stato zero come valore iniziale
      digitalWrite(35,LOW); //assegnazione stato zero come valore iniziale
      digitalWrite(37,LOW); //assegnazione stato zero come valore iniziale
      digitalWrite(39,LOW); //assegnazione stato zero come valore iniziale
      digitalWrite(41,LOW); //assegnazione stato zero come valore iniziale
      digitalWrite(43,LOW); //assegnazione stato zero come valore iniziale
      digitalWrite(45,LOW); //assegnazione stato zero come valore iniziale
     
      int ConvertToInt=0; //richiamo sottoprogramma conversione e assegnazione valore inizale a zero
 
   }

void loop() 
 
   if (ConvertToInt == 0){
  digitalWrite(30,LOW);
    }
   else (conversione!=0);
   {
      digitalWrite(30,HIGH);
      delay(40000);
      digitalWrite(30,LOW);
    }

    
    {
    BIT0=digitalRead(PinA); //assegnazione bit a pin che arriva dal plc
    BIT1=digitalRead(PinB); //assegnazione bit a pin che arriva dal plc
    BIT2=digitalRead(PinC); //assegnazione bit a pin che arriva dal plc
    BIT3=digitalRead(PinD); //assegnazione bit a pin che arriva dal plc
    BIT4=digitalRead(PinE); //assegnazione bit a pin che arriva dal plc
    BIT5=digitalRead(PinF); //assegnazione bit a pin che arriva dal plc
    BIT6=digitalRead(PinG); //assegnazione bit a pin che arriva dal plc
    BIT7=digitalRead(PinH); //assegnazione bit a pin che arriva dal plc
    switch(conversione(BIT0,BIT1,BIT2,BIT3,BIT4,BIT5,BIT6,BIT7)) //comando switch
      {
        case 1:
          {
            
          }
        break;
        case 2:
          {
            
          }
        break;
        case 3:
          {
            
          }
        break;
        default:;
      };

    
  }
int conversione(bool BIT0,bool BIT1 ,bool BIT2,bool BIT3,bool BIT4,bool BIT5,bool BIT6,bool BIT7) //dichiarazione variabile booleana a bit
  {
    ConvertToInt=(BIT0*(2^0))+(BIT1*(2^1))+(BIT0*(2^2))+(BIT1*(2^3))+(BIT0*(2^4))+(BIT1*(2^5))+(BIT0*(2^6))+(BIT1*(2^7)); //conversione da binario a digitale
  }
if (ConvertToInt == 0){
  digitalWrite(30,LOW);
    }
   else (conversione!=0);
   {
      digitalWrite(30,HIGH);
      delay(40000);
      digitalWrite(30,LOW);
    }

Se metti else da solo, non puoi mettere una condizione aggiuntiva. Se vuoi metterla devi usare else if. E quel puntoevirgola dopo la condizione non ci vuole.

Per inciso quelle linee credo compilino comunque, ma sicuramente non fanno quello che vuoi!

ragazzi ecco l'ide aggiornato, sapere dirmi se la conversione e il suo richiamo va bene? non userò la seriale per la comunicazione plc/arduino ecco perchè ho utilizzato questo metodo (8 relè che vanno a zero e ad uno)

int PinA=31; //primo pin che arriva dal plc 
int PinB=33; //secondo pin che arriva dal plc
int PinC=35; //terzo pin che arriva dal plc
int PinD=37; //quarto pin che arriva dal plc
int PinE=39; //quinto pin che arriva dal plc
int PinF=41; //sesto pin che arriva dal plc
int PinG=43; //settimo pin che arriva dal plc
int PinH=45; //ottavo pin che arriva dal plc
int PinLaser=30; //pin che va collegato al relè per alimentazione laser
int ConvertToInt=0; 
int ConvertToInt1=0; 
int conversione(bool BIT0,bool BIT1 ,bool BIT2,bool BIT3,bool BIT4,bool BIT5,bool BIT6,bool BIT7);
int stepmot1=10;
int stepmot2=4;
int dirmot1=9;
int dirmot2=3;
bool BIT0=0,BIT1=0,BIT2=0,BIT3=0,BIT4=0,BIT5=0,BIT6=0,BIT7=0; // assegnazione come variabile booleana a bit
void setup() 
  {
      pinMode(stepmot1, OUTPUT);
      pinMode(stepmot2, OUTPUT);
      pinMode(dirmot1, OUTPUT);
      pinMode(dirmot2, OUTPUT);
      
      
      pinMode(PinA, INPUT); //dichiarazione pin come input
      pinMode(PinB, INPUT); //dichiarazione pin come input
      pinMode(PinC, INPUT); //dichiarazione pin come input
      pinMode(PinD, INPUT); //dichiarazione pin come input
      pinMode(PinE, INPUT); //dichiarazione pin come input
      pinMode(PinF, INPUT); //dichiarazione pin come input
      pinMode(PinG, INPUT); //dichiarazione pin come input
      pinMode(PinH, INPUT); //dichiarazione pin come input
      pinMode(PinLaser, OUTPUT); //dichiarazione pin come uscita

      digitalWrite(9,LOW); //assegnazione stato zero come valore inziale
      digitalWrite(10,LOW); //assegnazione stato zero come valore iniziale
      digitalWrite(3,LOW); //assegnazione stato zero come valore iniziale
      digitalWrite(4,LOW); //assegnazione stato zero come valore iniziale

      
      digitalWrite(30,LOW); //assegnazione stato zero come valore inziale
      digitalWrite(31,LOW); //assegnazione stato zero come valore iniziale
      digitalWrite(33,LOW); //assegnazione stato zero come valore iniziale
      digitalWrite(35,LOW); //assegnazione stato zero come valore iniziale
      digitalWrite(37,LOW); //assegnazione stato zero come valore iniziale
      digitalWrite(39,LOW); //assegnazione stato zero come valore iniziale
      digitalWrite(41,LOW); //assegnazione stato zero come valore iniziale
      digitalWrite(43,LOW); //assegnazione stato zero come valore iniziale
      digitalWrite(45,LOW); //assegnazione stato zero come valore iniziale
     
    }

void loop()
{ 
    BIT0=digitalRead(PinA); //assegnazione bit a pin che arriva dal plc
    BIT1=digitalRead(PinB); //assegnazione bit a pin che arriva dal plc
    BIT2=digitalRead(PinC); //assegnazione bit a pin che arriva dal plc
    BIT3=digitalRead(PinD); //assegnazione bit a pin che arriva dal plc
    BIT4=digitalRead(PinE); //assegnazione bit a pin che arriva dal plc
    BIT5=digitalRead(PinF); //assegnazione bit a pin che arriva dal plc
    BIT6=digitalRead(PinG); //assegnazione bit a pin che arriva dal plc
    BIT7=digitalRead(PinH); //assegnazione bit a pin che arriva dal plc
   ConvertToInt1=conversione(BIT0,BIT1,BIT2,BIT3,BIT4,BIT5,BIT6,BIT7);  //richiamo sottoprogramma conversione e assegnazione valore inizale a zero
  
   if (ConvertToInt1 == 0)
   {
     digitalWrite(30,LOW);
    }
   else 
   {
      digitalWrite(30,HIGH);
      //delay(40000);
      //digitalWrite(30,LOW);
    }

    
    
  
    switch(ConvertToInt1) //comando switch
      {
        case 1:
          {
            
          }
        break;
        case 2:
          {
            
          }
        break;
        case 3:
          {
            
          }
        break;
        default:;
      };

    
  }
int conversione(bool BIT0,bool BIT1 ,bool BIT2,bool BIT3,bool BIT4,bool BIT5,bool BIT6,bool BIT7) //dichiarazione variabile booleana a bit
  {
    ConvertToInt=(BIT0*(2^0))+(BIT1*(2^1))+(BIT0*(2^2))+(BIT1*(2^3))+(BIT0*(2^4))+(BIT1*(2^5))+(BIT0*(2^6))+(BIT1*(2^7)); //conversione da binario a digitale
    return ConvertToInt;
  }

Collegati, meglio se con dei fotoaccoppiatori, ad un singolo PORT della Mega, p.e. PORTC pin da 37 a 30 (PC0 = 37, ... , PC7 = 30), così non devi fare nessuna conversione, basta che leggi il port per avere il valore.

Vedo solo ora questo:

int conversione(bool BIT0,bool BIT1 ,bool BIT2,bool BIT3,bool BIT4,bool BIT5,bool BIT6,bool BIT7) //dichiarazione variabile booleana a bit
 {
   ConvertToInt=(BIT0*(2^0))+(BIT1*(2^1))+(BIT0*(2^2))+(BIT1*(2^3))+(BIT0*(2^4))+(BIT1*(2^5))+(BIT0*(2^6))+(BIT1*(2^7)); //conversione da binario a digitale
   return ConvertToInt;
 }

Immagino che ti aspetti che ^ sia l'operatore di elevamento a potenza, ma non è così. Tale operatore non esiste in C. ^ rappresenta il bitwise xor, che fa ben altro.

Ti suggerisco di fare come dice astro, così elimini il problema alla radice. Se proprio vuoi andare per la tua strada puoi usare l'operatore di shift a sinistra, visto che tale operazione equivale a moltiplicare per la base:

ConvertToInt= (BIT0 * (1 << 0)) + (BIT1 * (1 << 1)) + (BIT2 * (1 << 2)) ...;

Oppure inserire direttamente 1, 2, 4, 8... nella tua formula.

PS: Perché nella tua formula usi sempre e solo BIT0 e BIT1???

mi scuso per l'aver inserito solo il bit 0 e bit 1 lo correggo subito, inoltre mi potete spiegare meglio come si fa ad utilizzare il metodo che toglie il problema alla radice dato che non ne sono a conoscenza? grazie.

Te lo avevo gia' spiegato di la'

http://forum.arduino.cc/index.php?topic=386277.msg2662374#msg2662374

si ma non ho capito il comando DDRA non lo trovo, scusa la mia ignoranza ma sono un neofita, grazie x la comprensione

Difatti, al momento, NON è cosa per te ...
... guardati piuttosto le funzioni bitSet(), bitClear(), ecc. che trovi tra le Bits and Bytes nel reference di Arduino ... :wink:

Guglielmo

P.S.: ... per gli altri ... tenete conto dell'attuale preparazione di paolo_tudisco ... che, al momento, non è certo quella che gli permette di lavorare a livello registri e porte. :confused:

credo non sia il modo corretto di trattare chi vuole imparare e vuole farsi aiutare da chi sa piu' di lui, x la cronaca ho gia visto quelle funzioni, ma purtroppo per come mi è stato detto di eseguire il progetto, non posso utilizzarle, sono finito con lo scrivere sul forum perchè so che è pieno di persone che oltre a usare arduino come hobby lo usano per lavoro. e quindi riescono a capire cosa vuol dire impostare le cose ''seguendo le specifiche di progetto''.

scusa, ma nel precedente post esordivi cosi'

ciao ragazzi sono un softwarista che si sta affacciando alla ''serie'' arduino, dovrei.............

Quindi la manipolazione delle porte non mi sembrava fantascienza.

credo non sia il modo corretto di trattare chi vuole imparare e vuole farsi aiutare da chi sa piu' di lui, x la cronaca ho gia visto quelle funzioni, ma purtroppo per come mi è stato detto di eseguire il progetto, non posso utilizzarle,

A quali funzioni ti riferisci ?
e cosa significa "per come mi è stato detto di eseguire il progetto", perche' se devi leggere dei bit e convertirli in un intero, come lo fai non mi pare che vada fuori specifiche

volevo solo avere la conferma, si mi e stato detto di eseguire un progetto e mantanere il più vergine possibile il plc cercando di fare un qualcosa di semplice senza troppi ''smanettamenti'', premettendo che è il primo programma che scrivo tante cose non le so fare, inoltre dato che mi è stato detto di usare arduino e dato che già mi stavo affascinando allo stesso volevo imparare... tutto qui!.

paolo_tudisco:
volevo solo avere la conferma, si mi e stato detto di eseguire un progetto e mantanere il più vergine possibile il plc cercando di fare un qualcosa di semplice senza troppi ''smanettamenti'',

Posso capire che ti hanno chiesto di non "toccare" il plc cercando di interfacciarti al suo esterno, ti ho già consigliato di usare dei fotoaccoppiatori invece dei relè, però questo non vuol dire che non sei libero di fare come ti pare a livello software su Arduino.
La soluzione più semplice è quella che ti ho indicato io, la metti in pratica semplicemente settando come input tutti i pin di PORTC della Mega2560, lo puoi fare nel classico modo di Arduino con la pinmode, pin da 30 a 37, e poi basta che leggi PORTC in questo modo:

byte miodato;

miodato = PINC;

Dove "miodato" è una variabile di un byte (byte = unsigned char) e PINC è il nome simbolico del registro corrispondente a PORTC, tutti concetti chiaramente spiegati sul reference di Arduino.

ora finalmente ho capito, grazie!

paolo_tudisco:
credo non sia il modo corretto di trattare chi vuole imparare e vuole farsi aiutare da chi sa piu' di lui

Guarda che stavo solo cercando di farti arrivare alle cose per gradi, non certo di sminuirti o trattarti male ...

... ma se invece preferisci ti dico "prenditi il datasheet del ATmega328P e guardati come si fa !" ... anche se questo non mi sembra il modo corretto ... ::slight_smile:

Guglielmo