Go Down

Topic: Arduino / pinMode (Read 1 time) previous topic - next topic

temucin

Hallo,

für eine Erweiterungs Karte muss ich die Pins mithilfe von `PinMode` im `Void Loop` ändern. Aber egal was ich versuche. Der Arduino weigert sich hartnäckig. Ich habe den Verdacht das PinMode im VoidLoop garnicht funktioniert. Weis da jemand was genaueres oder gibt es da einen Trick?

Gruss Turgut

HaWe

#1
Jul 25, 2014, 04:01 pm Last Edit: Jul 25, 2014, 04:04 pm by HaWe Reason: 1
hallo,
poste mal bitte deinen Code, ohne das kann man kaum was sagen, was falsch läuft.
Außerdem wären die  wortwörtliche Formulierung der Anleitung und ein paar Infos über die Karte (abgetippt oder gepasted) gut.
Gruß,
Helmut

Peter_n

No tricks are needed, and it works all the time.

Code: [Select]

pinMode (2, OUTPUT);  // set as output, default will be low
digitalWrite (2, HIGH);  // make output high
delay (1000);
pinMode (2, INPUT);  // set pin as input
Octal is 7 bits. Octet is 8 bits. An Octopus has four pairs of arms. October is the tenth month. An Octillion can be 10^27 or 10^48. An Octave is the interval between notes of half or twice the frequency. And last but not least: Octyl on its own is not really something.

jurs


für eine Erweiterungs Karte muss ich die Pins mithilfe von `PinMode` im `Void Loop` ändern.


Bei welcher Erweiterungskarte?


Aber egal was ich versuche. Der Arduino weigert sich hartnäckig.


Nein, ein Arduino-Board ist kein Revoluzzer mit Verweigerungshaltung.


Ich habe den Verdacht das PinMode im VoidLoop garnicht funktioniert.


Falsch.


gibt es da einen Trick?


Nein. Höchstens wenn Du den pinMode extrem schnell umschalten müßtest, oder der pinMode an mehreren Pins eines Portregisters in genau derselben Nanosekunde gleichzeitig statt nacheinander geändert werden soll, könnte man anstelle von pinMode direkt die Register des Controllers programmieren, falls Du das als "Trick" bezeichnen möchtest.

temucin

Hallo,

die Karte baue ich gerade und teste die Technischen Möglichkeiten.

Code: [Select]

/*
  Programm : I/O Verstärker
  Einen I/O als Eingang und als Ausgang
  verwenden.
  Code by Temucin LE at 2014
*/

// Programm Spezifische Variablen

String PROGRAMM = "I/O Verstärker" ;

//-------------------------------

int IO_1 = 12;           
int IO_1_Status;
int IO_1_Mode;

int led = 13;
int led_t =0;
long timer = 0;

unsigned long mil_1 =0;
unsigned long mil_2 =0;
int timer_div =0;

int inByte = 0;
String comand ;
long wert = 0;
String pars ;
int par_count;
int parstep;
String param ;
byte par1;
byte par2;
byte par3;
byte par4;
byte par5;
byte par6;
int intstep;

// the setup routine runs once when you press reset:
void setup() {               
 
  // initialize the digital pin
 
  Serial.begin(57600);
 
  pinMode(led, OUTPUT);
 
  pinMode(IO_1, INPUT);
  digitalWrite(IO_1,HIGH);
  IO_1_Mode=0;
 
}

// the loop routine runs over and over again forever:
void loop() {
 
  // -------------------------------------------------------------------------- 
  // millis() count und überlauf prüfung, in timer_div steht die anzahl verstrichener millis
 
  mil_2 = mil_1;
  mil_1 = millis(); // da sich der überlauf der millis auch innerhalb eines loops an einer zufälligen stelle ereignen kann, wird dieser zwischen gespeichert. 
  if (mil_1<mil_2) //  das neue mil ist kleiner wie das alte, dann muss ein überlauf stadt gefunden haben
  {
    timer_div=1;
  }
  else
  {
    timer_div=mil_1-mil_2;   
  }
 
  // -------------------------------------------------------------------------- 
  // Lebenslicht Blinker
 
  if (timer>0)
  {
    timer=timer-timer_div;
    if (timer<0) timer=0;
  }
  if (timer==0) // Lebenslicht des Programms
  {
    timer=1000;
   
    if (led_t==0)
    {
      led_t=1;
      digitalWrite(led, HIGH);   // turn the LED on (HIGH is the voltage level)
      //digitalWrite(IO_1, HIGH);
    }
    else
    {
      led_t=0;
      digitalWrite(led, LOW);    // turn the LED off by making the voltage LOW
      //digitalWrite(IO_1, LOW);
    }
  }

  // ---------------------------------------------------------------------------
  // Serielle Komunikation
 

    // send data only when you receive data:
    if (Serial.available() > 0) {
      // read the incoming byte:
      comand="";
      wert=0;
      param="";
      pars="";
      inByte = Serial.read();
     
      if (inByte == 47)
      {
        delay (5);
               
        for (int x = 0 ; x<15 ; x++)
        {
          inByte = Serial.read();
          if (inByte>31 && inByte<128)
          {
            pars=pars+char(inByte);
          }
        }
       
        comand=pars;
       
        if (comand=="info")
        {
          Serial.print  ("PROGRAMM : ");
          Serial.println(PROGRAMM);
          Serial.println("Temucin LE / SPS-12");
          Serial.println("");
           
        }
        if (comand=="set")
        {
          Serial.println("SET: "+param);
        }
      }
    }

 
  // ---------------------------------------------------------------------------
  // Funktionen
 
  IO_1_Status=digitalRead(IO_1);
  if(IO_1_Status==LOW && IO_1_Mode==0){
   
   Serial.println("IO_1 = LOW");   
   
   pinMode(IO_1, OUTPUT);
   digitalWrite(IO_1, HIGH);
   IO_1_Mode=1;
   
  }
 
}



Das ist das Test Programm. Der IO wird als Eingang Inizialisiert und der PullUp aktiviert.
Dann warte ich bis der IO auf Low runter gezogen wird.
Dann sollte der selbe Auf OUTPUT gestellt werden und Auf High damit der Asugang Aktiv ist.


Soweit die Teorie.

Hier noch ein improvisiertes Schaltbild.




Peter_n

You can use INPUT_PULLUP
http://arduino.cc/en/Reference/pinMode

I don't understand the drawing (schaltbild) at all. Is there an Arduino in there ?
Did you use 24V near the Arduino ? Perhaps that pin is damaged.
Octal is 7 bits. Octet is 8 bits. An Octopus has four pairs of arms. October is the tenth month. An Octillion can be 10^27 or 10^48. An Octave is the interval between notes of half or twice the frequency. And last but not least: Octyl on its own is not really something.

jurs


die Karte baue ich gerade und teste die Technischen Möglichkeiten.


Was soll das werden, wenn es fertig ist?

Ich sehe da einen "Taster" an Minus und eine "Last" an Plus.
Wenn der "Taster" geschlossen ist, ist die "Last" eingeschaltet.
Wenn der "Taster" offen ist, ist die "Last" ausgeschaltet.

Alles weitere in der Schaltung sieht mir nach reinem Tinnef ohne Funktion aus.

Wo soll der Arduino mit seinem Input angeschlossen sein, der ist nirgends im Schaltbild zu sehen?! Ich vermute mal, unten das grüne offene Ende zwischen den beiden 10 K Widerständen soll zum Arduino Eingang führen? Aber was möchtest Du bezwecken?

sschultewolter


I don't understand the drawing (schaltbild) at all.
Is there an Arduino in there ?

I'm in your opinion. No Arduino.

Bitte poste ein richtiges Schaltbild.
Keinen technischen Support über PN!

temucin

Hallo,

Ich möchte den Pin des Arduino in beiden Richtungen Galvanisch trennen. Das ist der Kern der Bemühung. Aber ich denke ich habe da ein grundsätzliches Verständniss Problem.

nu kommt schon .... so schlecht ist das Schaltbild nu auch wider nicht. Unten der Blaue Rahmen Representirt den Arduino Pin wo die PullUp and Down Widerstände zugeschaltet werden können.

Wenn der Taster betätigt wird, wird  die Last geschaltet und der Optokoppler zieht den Pin auf LOW. Durch den PullUp ist er normalerweise High.

das erkennen des Tasters funktioniert.

Erkennt der Sketsh das der Eingang auf low herunter gezogen wird. Dann wechselt er den Pin Mode und schaltet diesen auf HIGH.
Nun Sollte der Linke Optokoppler die Last übernehmen da er ja jetzt direkt das High vom Pin und nicht über den PullUp bekommt. Macht er aber nicht.

Gruss Turgut

PS: Jeder hat mal klein angefangen :-)

Wenn ich jede Richtung separat teste funktioniert es .... aber zusammen ist der Wurm drin.

jurs


nu kommt schon .... so schlecht ist das Schaltbild nu auch wider nicht. Unten der Blaue Rahmen Representirt den Arduino Pin wo die PullUp and Down Widerstände zugeschaltet werden können.


Ein Arduino hat zwar einen schaltbaren eingebauten PullUp-Widerstand.

Aber es gibt keinen schaltbaren PullDown-Widerstand.
PullDown-Widerstände können nur "extern" fest verbaut werden.
Ein mit pinMode INPUT geschalteter Eingang ist immer "schwebend", d.h. dieser Eingang kann wahlweise zwischen HIGH und LOW hin und her pegeln, je nachdem, welche zufälligen Störungen er auffängt.


Ich möchte den Pin des Arduino in beiden Richtungen Galvanisch trennen. Das ist der Kern der Bemühung. Aber ich denke ich habe da ein grundsätzliches Verständniss Problem.


Aber was soll das werden, wo soll geschaltet werden und wo sollen Signale ankommen?

Möchtest Du die "Last" manuell am "Schalter" ein und aus schalten und der Arduino soll ein Signal am Eingang erhalten, ob die Last ein- oder ausgeschaltet ist?

Oder möchtest Du mit einen "Schalter" einen Arduino-Eingang HIGH/LOW setzen und der Arduino soll daraufhin eine "Last" schalten?

temucin

Hallo,

ich habe hier einige Bücher die was anderes erzählen. Wenn dem so ist, erklärt das natürlich einiges.

Wie oben schon angedeutet soll die Schaltung folgendes machen.

Wenn der Taster betätigt wird soll die Last für eine Zeit X vom Arduino gehalten werden.
Der knackpunkt ist ...... Galvanisch getrennt und über einen Pin.

LG Turgut

PS : alle anderen Varianten kenne ich schon.

sschultewolter

Warum muss es ein Pin sein?
Keinen technischen Support über PN!

temucin

Hallo,

zum einen weil es Pins Spart, wenn Eingänge mit feedback verwendet werden. So kann ich zum beispiel einen Taster zum einschalten einer Maschine mit einer Lampe koppeln die solange Leuchtet wie die Maschine läuft. Ich arbeite in der Lift Technik und dort ist das Standart.

LG Turgut

PS: Bei 30 Motoren macht das schon einen Unterschied ob ich 30 oder 60 Pins brauche.

sschultewolter

#13
Jul 25, 2014, 10:28 pm Last Edit: Jul 25, 2014, 10:34 pm by sschultewolter Reason: 1
Pins sparen braucht man bei µC im Gegensatz zu den meisten SPS nicht. Hier heißt es nicht, wenn 5 Eingänge mehr benötigt werden, einmal bitte 100€ für die nächste Karte.

http://www.youtube.com/watch?v=6ySF4BhYw48
Keinen technischen Support über PN!

uwefed

Mittels Port Expander, Shiftregister hönnen die Ausgänge/ Eingänge fast beliebig erweitert werden.
Ich finde es sinnvoller Ausgänge von Eingängen zu trennen.
Grüße Uwe

Go Up