Go Down

Topic: Verständnis frage --> pinMode (Read 10800 times) previous topic - next topic

sschultewolter

Hab mir noch mal den Sketch oben angeschaut. CLK auf INPUT scheint richtig zu sein, wenn der Messschieber den Master spielt, was er hier ja scheinbar macht.

Bleib am besten bei der ino allgemein. Ich habe kein Plan, wie der Aufbau genau verunstaltet wird.


Code: [Select]

void setup()
{

}

void loop()
{

}


ist in AVR GCC nichts anderes als

Code: [Select]

#include <Arduino.h>

void setup(void)
{
//
}

void loop()
{
//
}




int main(void)
{
setup();

while(1)
{
loop();
}
return 0;
}
[code]
Orginal Atmel AVRISP mkII zu verkaufen. Anfrage per PN ;)

Muecke

OK, ich packe das alles in die .INO Datei rein.

Hoffe das klappt dann. ;-)
- Anfänger in allen Hinsicht - Bilder sichtbar einstellen
1  Bild Hochladen (Attachements); 2 Beitrag Save; 3 Anhang rechter Mausklick; "Adresse des Links kopieren"; 4 Beitrag „Modify"; 5 img-Tags mit dem kopierten Link einfügen; 6 Beitrag Save
DANKE

Serenifly

#17
Nov 21, 2014, 01:10 am Last Edit: Nov 21, 2014, 01:12 am by Serenifly
Habe ich das richtig verstanden. die Datei *.h beinhaltet die Deklaration der Funktionen und die Datei *.c hat die Funktion dann selber? 
Korrekt.

Mehrfach-Inkludierungen sollte eigentlich durch Include-Guards verhindert werden, aber dadurch dass die Arduino Software da viel von sich aus im Hintergrund macht kann man da irgendwo reingelegt werden.

Probier mal in deiner .c/.cpp Datei deinen Header und Arduino.h zu inkludieren und dann inkludierst du deinen Header in der .ino Datei. Das ist der normale Weg.


Alles in .ino Datei zu packen geht bei Arduino natürlich auch. Dann übernimmt die IDE das zusammenkopieren der verschieden Dateien vor dem Kompilieren.

Muecke

Also ich versuche das jetzt alle in der INO Datei.


Doch ich bekomme das nicht hin :-(

1. versuch

Schieber 5 auslesen alles in (Loop) --> Klappt richtig :-) Heppy

also alles aus dem (Loop) nehmen und in die Funktion int Schiber5() packen
und in Loop dann Seriel.Print Schieber5() aufrufen.

jetzt klappt es nicht mehr, ich bekomme immer 0 angezeigt ab und an ist mal ein wert dabei.


Was zum Henker mache ich da Falsch?
ich versuche das jetzt erst mal nicht in eine Externe Datei zu packen sondern bleibe in der INO Datei.


Code wie es Richtig Klappt:
Code: [Select]
unsigned long temp_millis;

void setup()
  {
    Serial.begin(9600);
  }

void loop ()
  {
    int Schieber_5_ClockPin = 24;  // Pin 24 das 2. Bit vom Port A (PINA PA2)
    int Schieber_5_DataPin  = 25;  // Pin 25 das 3. Bit vom Port A (PINA PA3)


    pinMode(Schieber_5_ClockPin, INPUT);
    pinMode(Schieber_5_DataPin,  INPUT);

    while (digitalRead(Schieber_5_ClockPin) == LOW) {}    // wenn CLOCK auf LOW, dann warten bis wieder HIGH
    temp_millis = millis();                               // aktuelle Zeitnahme
    while (digitalRead(Schieber_5_ClockPin) == HIGH) {}   // wenn CLOCK auf HIGH, warten bis wieder LOW
    if ((millis() - temp_millis) > 100)                   // wenn High-Pegel länger wie 100ms war, springe in 'decode' Funktion
      {

        long value = 0;
        byte SIGN_Bit = 0;                          // Vorzeichen Bit 21
     
          for (int i=0;i<24;i++)                    // 24 Durchläufe, 0 bis 23
            {           
              if ( PINA & ( 1 << PA3 ))             // wenn Data (Port.A Bit.3) HIGH ist,
                {                                   // eine 1 in die Variable 'value' an Bitnummer i
                  value |= 1UL << i;                // Syntax Hinweis aus dem Forum, wegen default 16 bit int Arithmetik
                }
                while ( !(PINA & (1 << PA2)))  { }  // solange warten bis Clock (Port.A Bit.2) wieder HIGH ist
                while (   PINA & (1 << PA2 ))  { }  // solange warten bis Clock (Port.A Bit.2) wieder LOW ist
            }  // for Schleifenende
   
           SIGN_Bit = (value >> 21) & B01;          // Vorzeichen Bit 21 separieren
           value = value & 0xFFFF;                  // nur Bit 0 bis Bit 15 behalten, den Rest davor nullen
           value = value >> 1;                      // und alles um ein Bit nach rechts schieben, Startsignal wird entfernt
           if (SIGN_Bit == 1)                       // wenn Vorzeichen-Bit gesetzt war, alles mit -1 multiplizieren
            { value = value * -1; }
           Serial.println((float)value / 100);      // Kommastelle setzen und man erhält den endgültigen Meßwert
//         return (float)value / 100;               // Kommastelle setzen und man erhält den endgültigen Meßwert  (Rückgabe wert)
      }
  }  // ENDE --> void loop



Code wie ich es gerne hätte, doch nicht klappt
 
Code: [Select]
unsigned long temp_millis;

void setup()
  {
    Serial.begin(9600);
  }

void loop ()
  {
    Serial.println(Schieber5());
  }  // ENDE --> void loop







int Schieber5()
  {
    int Schieber_5_ClockPin = 24;  // Pin 24 das 2. Bit vom Port A (PINA PA2)
    int Schieber_5_DataPin  = 25;  // Pin 25 das 3. Bit vom Port A (PINA PA3)


    pinMode(Schieber_5_ClockPin, INPUT);
    pinMode(Schieber_5_DataPin,  INPUT);

    while (digitalRead(Schieber_5_ClockPin) == LOW) {}    // wenn CLOCK auf LOW, dann warten bis wieder HIGH
    temp_millis = millis();                               // aktuelle Zeitnahme
    while (digitalRead(Schieber_5_ClockPin) == HIGH) {}   // wenn CLOCK auf HIGH, warten bis wieder LOW
    if ((millis() - temp_millis) > 100)                   // wenn High-Pegel länger wie 100ms war, springe in 'decode' Funktion
      {

        long value = 0;
        byte SIGN_Bit = 0;                          // Vorzeichen Bit 21
     
          for (int i=0;i<24;i++)                    // 24 Durchläufe, 0 bis 23
            {           
              if ( PINA & ( 1 << PA3 ))             // wenn Data (Port.A Bit.3) HIGH ist,
                {                                   // eine 1 in die Variable 'value' an Bitnummer i
                  value |= 1UL << i;                // Syntax Hinweis aus dem Forum, wegen default 16 bit int Arithmetik
                }
                while ( !(PINA & (1 << PA2)))  { }  // solange warten bis Clock (Port.A Bit.2) wieder HIGH ist
                while (   PINA & (1 << PA2 ))  { }  // solange warten bis Clock (Port.A Bit.2) wieder LOW ist
            }  // for Schleifenende
   
           SIGN_Bit = (value >> 21) & B01;          // Vorzeichen Bit 21 separieren
           value = value & 0xFFFF;                  // nur Bit 0 bis Bit 15 behalten, den Rest davor nullen
           value = value >> 1;                      // und alles um ein Bit nach rechts schieben, Startsignal wird entfernt
           if (SIGN_Bit == 1)                       // wenn Vorzeichen-Bit gesetzt war, alles mit -1 multiplizieren
            { value = value * -1; }
//           Serial.println((float)value / 100);      // Kommastelle setzen und man erhält den endgültigen Meßwert
         return (float)value / 100;               // Kommastelle setzen und man erhält den endgültigen Meßwert  (Rückgabe wert)
        }
  }  // ENDE --> Schieber5



kann das sein das das an dem int liegt?
int Schieber5()
- Anfänger in allen Hinsicht - Bilder sichtbar einstellen
1  Bild Hochladen (Attachements); 2 Beitrag Save; 3 Anhang rechter Mausklick; "Adresse des Links kopieren"; 4 Beitrag „Modify"; 5 img-Tags mit dem kopierten Link einfügen; 6 Beitrag Save
DANKE

Muecke

Nennt mich was Ihr wollt, doch für mich ist das nicht Logisch.

so klappt es jetzt, das der Auslese Code unten Extra in einer Funktion steht.


ich habe das jetzt so abgerufen:
Code: [Select]
    float Ergebnis;
    Ergebnis = Schieber5();
    Serial.println(Ergebnis);



Code: [Select]
unsigned long temp_millis;

void setup()
  {
    Serial.begin(9600);
  }

void loop ()
  {
    float Ergebnis;
    Ergebnis = Schieber5();
    Serial.println(Ergebnis);
  }  // ENDE --> void loop



float Schieber5()
  {
    int Schieber_5_ClockPin = 24;  // Pin 24 das 2. Bit vom Port A (PINA PA2)
    int Schieber_5_DataPin  = 25;  // Pin 25 das 3. Bit vom Port A (PINA PA3)


    pinMode(Schieber_5_ClockPin, INPUT);
    pinMode(Schieber_5_DataPin,  INPUT);

    while (digitalRead(Schieber_5_ClockPin) == LOW) {}    // wenn CLOCK auf LOW, dann warten bis wieder HIGH
    temp_millis = millis();                               // aktuelle Zeitnahme
    while (digitalRead(Schieber_5_ClockPin) == HIGH) {}   // wenn CLOCK auf HIGH, warten bis wieder LOW
    if ((millis() - temp_millis) > 100)                   // wenn High-Pegel länger wie 100ms war, springe in 'decode' Funktion
      {

        long value = 0;
        byte SIGN_Bit = 0;                          // Vorzeichen Bit 21
     
          for (int i=0;i<24;i++)                    // 24 Durchläufe, 0 bis 23
            {           
              if ( PINA & ( 1 << PA3 ))             // wenn Data (Port.A Bit.3) HIGH ist,
                {                                   // eine 1 in die Variable 'value' an Bitnummer i
                  value |= 1UL << i;                // Syntax Hinweis aus dem Forum, wegen default 16 bit int Arithmetik
                }
                while ( !(PINA & (1 << PA2)))  { }  // solange warten bis Clock (Port.A Bit.2) wieder HIGH ist
                while (   PINA & (1 << PA2 ))  { }  // solange warten bis Clock (Port.A Bit.2) wieder LOW ist
            }  // for Schleifenende
   
           SIGN_Bit = (value >> 21) & B01;          // Vorzeichen Bit 21 separieren
           value = value & 0xFFFF;                  // nur Bit 0 bis Bit 15 behalten, den Rest davor nullen
           value = value >> 1;                      // und alles um ein Bit nach rechts schieben, Startsignal wird entfernt
           if (SIGN_Bit == 1)                       // wenn Vorzeichen-Bit gesetzt war, alles mit -1 multiplizieren
            { value = value * -1; }
         return (float)value / 100;               // Kommastelle setzen und man erhält den endgültigen Meßwert  (Rückgabe wert)
        }
  }  // ENDE --> Schieber5



vorher war das ja so:
Code: [Select]
void loop ()
  {
    Serial.println(Schieber5());
  }  // ENDE --> void loop



wie gesagt Logisch ist das für mich nicht, aber gut. es tut jetzt :-).

jetzt mal schauen ob ich es schaffe das Teil in eine Extra Datei zu packen.
- Anfänger in allen Hinsicht - Bilder sichtbar einstellen
1  Bild Hochladen (Attachements); 2 Beitrag Save; 3 Anhang rechter Mausklick; "Adresse des Links kopieren"; 4 Beitrag „Modify"; 5 img-Tags mit dem kopierten Link einfügen; 6 Beitrag Save
DANKE

Serenifly

Die Funktion gibt nicht in allen Pfaden etwas zurück, oder täusche ich mich da? Wenn if ((millis() - temp_millis) > 100)  nicht zutrifft wird nichts zurück gegeben.

Muecke

#21
Nov 21, 2014, 03:23 am Last Edit: Nov 21, 2014, 03:26 am by Muecke
habe gerade noch mal getestet, es klappt immer noch nicht, Arrrrrrr........


Die Funktion gibt nicht in allen Pfaden etwas zurück, oder täusche ich mich da? Wenn if ((millis() - temp_millis) > 100)  nicht zutrifft wird nichts zurück gegeben.
Öm ja, du hast recht, normalerweise wurde da das Ende vom void loop () erreicht und von vorne begonnen.

wie kann ich das abfragen? das wenn kein Wert zurück gegeben wird auch keine Ausgabe erfolgt?


EDIT: bzw. ich muss so lange in der Funktion kreisen bis ich einen Ruten Wert erhalte
also Packe ich alles in einen Loop mit der Bedingung wenn return was drin ist dann Funktion Ende

hmm, noch nie gemacht, ...
- Anfänger in allen Hinsicht - Bilder sichtbar einstellen
1  Bild Hochladen (Attachements); 2 Beitrag Save; 3 Anhang rechter Mausklick; "Adresse des Links kopieren"; 4 Beitrag „Modify"; 5 img-Tags mit dem kopierten Link einfügen; 6 Beitrag Save
DANKE

gsezz

#22
Nov 21, 2014, 08:54 am Last Edit: Nov 21, 2014, 08:56 am by gsezz
Eine Lösung hat dir sschultewolter ja schon gepostet, einfach die Pinnummern der Funktion übergeben anstatt fest hinein zu schrieben, dann brauchst du nur eine Funktion für alle Messschieber.
Ich würde gleich noch einen Schritt weiter gehen und eine Klasse anlegen, dann definierst du zu beginn alle deine Messschieber und hast bequeme Objekte mit denen du arbeiten kannst. Bspw kann man sie dann in ein Array ihres Typs stecken und alle Messwerte in einer Schleife abfragen.
Wenn das ganze dann schon in eigenen Header und Source Dateien steckt hast du quasi schon ein Lib das du später ganz fix in andere Projekte einbinden kannst.

Muecke

So gerne ich das auch machen würde kann ich das leider nicht wie schon erwähnt wird nicht nur die Pin Nr. genommen sondern auch das Register des PIN`s abgefragt und ich habe keinen Plan wie ich das Register übergeben soll.

Wenn jemand sagt das das machbar ist kann er das gerne umstellen, ich wäre Ihn sehr dankbar, doch ich kann es nicht und ich wies auch nicht wie das gehen soll mit meinem Wissensstand daher muss ich eine Lösung suchen die ich hin bekomme, mit dem Umstellen das ich das übergeben kann habe ich mich schon 4 Tage beschäftigt und ein andres Thema geöffnet gehabt da kam raus das das so nicht machbar ist.

z.B. das hier: (alles in der Fungieren später)

Code: [Select]
    pinMode(Schieber_5_ClockPin, INPUT);
    pinMode(Schieber_5_DataPin,  INPUT);

kann übergeben werden. --> JA !

Code: [Select]
              if ( PINA & ( 1 << PA3 ))             // wenn Data (Port.A Bit.3) HIGH ist, ...

wie übergebe ich das PINA?
-> das ist ein Register von Port A, aus Geschwindigkeits gründen wird hier direkt das Register Bit ausgelesen.
Wie übergebe ich das PA3?
--> das ist das Register Bit selbst

Hier habe ich keine Lösung gefunden, und aus dem Grund ist das für mich nicht machbar,
Daher suche ich die Lösung die für mich machbar ist.



daher die Frage ob ich prüfen kann ob etwas im Ruten drin oist oder nicht, oder ob man es auf Richtig / Falsch prüfen kann. oder einen Fehlerwert Sätzen kann, denn ich dann abfragen kann.
- Anfänger in allen Hinsicht - Bilder sichtbar einstellen
1  Bild Hochladen (Attachements); 2 Beitrag Save; 3 Anhang rechter Mausklick; "Adresse des Links kopieren"; 4 Beitrag „Modify"; 5 img-Tags mit dem kopierten Link einfügen; 6 Beitrag Save
DANKE

sschultewolter

PAx zu übergeben bringt nichts. Das ist nur der Verweis, an welcher Stelle des Bytes (PORT) sich der Status befindet, der ausgelesen werden.

Warum hantierst du eigentlich überhaupt mit den Registers, was bei Arduino eher untypisch ist? DigitalRead nicht schnell genug??

Kann dir nachher eine Lösung schicken für die PORT,Pin Übergabe.
Orginal Atmel AVRISP mkII zu verkaufen. Anfrage per PN ;)

Muecke

#25
Nov 21, 2014, 09:57 am Last Edit: Nov 21, 2014, 10:05 am by Muecke
wenn du mir eine Lösung für die Übergabe hast (für die PORT,Pin Übergabe) wäre ich dir dankbar.


Warum ich überhaupt damit arbeite, der Code ist vom Doc_Arduino ursprünglich verfasst worden da er schon solche Schieber ausgelesen hat. Ich habe den Code dann nur umgestellt und an meine Jetzige Situation angepasst.


Ich habe keinen Plan ob DigitalRead schnell genug ist.


Jedoch wenn ich die Daten übergebe bleibt immer noch das Problem das ich den return wert abfangen muss, sonst habe ich wider eine Leer Ausgabe, wie jetzt auch.
- Anfänger in allen Hinsicht - Bilder sichtbar einstellen
1  Bild Hochladen (Attachements); 2 Beitrag Save; 3 Anhang rechter Mausklick; "Adresse des Links kopieren"; 4 Beitrag „Modify"; 5 img-Tags mit dem kopierten Link einfügen; 6 Beitrag Save
DANKE

Doc_Arduino

Hallo,

nein, digitalRead ist leider nicht schnell genug.
Wenn ich Dich richtig verstehe, möchtest Du jetzt mit dem Code statt einem alle 5 Meßschieber auslesen. Dazu müssen nur die angeschlossenen Pins der 5 Schieber der Funktion übergeben werden zum auslesen. Dafür müssen eigentlich nur die zur Zeit festen Pins durch Variablen ersetzt und beim Funktionsaufruf übergeben werden.

Tschau
Doc Arduino '\0'

Messschieber auslesen: http://forum.arduino.cc/index.php?topic=273445
EA-DOGM Display - Demos: http://forum.arduino.cc/index.php?topic=378279

Muecke

#27
Nov 21, 2014, 11:35 am Last Edit: Nov 21, 2014, 11:49 am by Muecke
so ähnlich.

ich möchte mir eine Tabelle ausgeben lassen über den Seriellen Monitor.

Eine neue Zeile soll bei einem tasten druck erstellt werden.
         
Schieber 1   Schieber 2   Schieber 3   Schieber 4   Schieber 5   Dehnungsmessstreifen
0.00 mm0.00 mm0.00 mm0.00 mm0.00 mm1.01 Kg
0.00 mm5.00 mm0.00 mm8.00 mm0.00 mm1.01 Kg
7.00 mm5.00 mm3.00 mm2.00 mm9.00 mm1.01 Kg



Jedoch wenn ich in die Funktion nur die PIN Nr. übergebe dann greife ich doch nicht auf das Richtige Register und das Register Bit zu.


Dazu kommt dann noch das du den Rückgabe wert immer per Serial.println(_Result); ausgegeben hast, sprich wenn es keinen gab dann aht er auch nichts ausgegeben, das muss ich nun abfangen sonst stimmt meine Tabelle ja nicht, ich muss einen Wert zurück bekommen sonst muss der Schieber noch mal abgefragt werden damit das richtige Ergebnis an der Richtigen Stelle der Tabelle steht.

Wenn z.B. Schieber 2 nicht ausgelesen wird bzw. keine Wert zurück gibt dann würde keine Ausgabe erfolgen und in der Tabelle bei Schieber 2 würde das Ergebnis vom Schieber 3 stehen etc.


ich hoffe das man versteht was ich gerne machen möchte.
und ihr erkennt mein Problem was ich gerade habe.



EDIT: mir würde es schon reichen wenn ich für jeden Schieber eine Funktion habe in der Fix die PIN Nr. und die Register drin stehen. jedoch ich immer einen Rückgabe wert bekomme, und nicht immer so viele 0.00 zurück bekomme nur weil die if ((millis() - temp_millis) > 100)  nicht zutrifft.
- Anfänger in allen Hinsicht - Bilder sichtbar einstellen
1  Bild Hochladen (Attachements); 2 Beitrag Save; 3 Anhang rechter Mausklick; "Adresse des Links kopieren"; 4 Beitrag „Modify"; 5 img-Tags mit dem kopierten Link einfügen; 6 Beitrag Save
DANKE

Doc_Arduino

Hallo,

Tabelle, nicht alles auf einmal. Die Ausgabeformatierung kannste später machen.

Genau, weil Register-Bit nicht gleich Arduino Pin ist, muß das alles vorher definiert werden. Eben anders wie jetzt, damit es flexibel wird. Du hast doch einen Arduino Mega 2560? Dann könnten wir die Clock's der Schieber und die Data's der Schieber auf je getrennte Ports legen. Das dürfte die Sache vereinfachen, denke ich.

Tschau
Doc Arduino '\0'

Messschieber auslesen: http://forum.arduino.cc/index.php?topic=273445
EA-DOGM Display - Demos: http://forum.arduino.cc/index.php?topic=378279

Muecke

ja ich habe eine Arduino Mega 2560

wir können das auf verschiedene Ports Sätzen das ist für mich kein Problem, wie oben im EDIT erwähnt muss das auch nicht wirklich Flexibel sein. ich kann ja 5 verschidene Funktionen erstellen ;-) für jeden Schieber eine.


Das Problem ist das die if ((millis() - temp_millis) > 100)  nicht zutrifft ich keinen Rückgabe wert habe, und das darf nicht sein, wenn das der Fall ist muss der Schieber weiter ausgelesen werden.

- Anfänger in allen Hinsicht - Bilder sichtbar einstellen
1  Bild Hochladen (Attachements); 2 Beitrag Save; 3 Anhang rechter Mausklick; "Adresse des Links kopieren"; 4 Beitrag „Modify"; 5 img-Tags mit dem kopierten Link einfügen; 6 Beitrag Save
DANKE

Go Up