Schieblehre - Arduino Versuchsaufbau

Kommt halt darauf an was man mit "wegstreichen" meint

Bit auf 0 setzten: 1001 -> 1000 -> 8 (dec) -- falsch

Nach rechts schieben 1001 -> 0100 -> 4 (dec) -- korrekt

Hallo,

letztes Posting für heute, es geht zur Pullerparty .... :)

@Serenifly: das gleiche gemeint aber verschieden formuliert.

@ Mücke: mit Excel hatte ich auch zu kämpfen. Das macht ab großen Binärzahlen nicht mehr mit. Wenn Du die zurecht gekürzte Binärzahl reinschreibst, stimmts noch.

Hallo,

ich beschäftige mich auch gerade mit dem Thema.
Ich habe mehrere Meßschieber hier, einer arbeitet mit einen 2x24 bit Protokoll zu dem ich folgenden Code gefunden habe:

int i;

int sign;

long value;

float result;

int clockpin = 4;  

int datapin = 5;

unsigned long tempmicros;

 

 

void setup() {
  Serial.begin(9600);
  pinMode(clockpin, INPUT);
  pinMode(datapin, INPUT);
}


 void loop () {
  while (digitalRead(clockpin)==HIGH) {} //if clock is LOW wait until it turns to HIGH
  tempmicros=micros();
  while (digitalRead(clockpin)==LOW) {} //wait for the end of the HIGH pulse
  if ((micros()-tempmicros)>500) { //if the HIGH pulse was longer than 500 micros we are at the start of a new bit sequence
    decode(); //decode the bit sequence
 }
}


void decode() {
  sign=1;
  value=0;

  for (i=0;i<23;i++) {
    while (digitalRead(clockpin)==HIGH) { } //wait until clock returns to HIGH- the first bit is not needed
    while (digitalRead(clockpin)==LOW) {} //wait until clock returns to LOW
    if (digitalRead(datapin)==LOW) {
      if (i<20) {
        value|= 1<<i;
      }
      if (i==20) {
        sign=-1;
      }
    }
  }

  result=(value*sign)/100.00;    
  Serial.println(result,2); //print result with 2 decimals
  delay(100);
  }

Das funktioniert gut, wenn man die beiden Ausgänge vom Meßschieber mit einer einfachen Transistorschaltung invertiert. Die Schaltung hebt gleichzeitig die Pegel auf 5V an.

Leider haben meine anderen Meßschieber das 7xBCD Protokoll. Das habe ich herausgefunden, weil ich die Meßschieber an einer YADRO Platine angeschlossen habe

http://www.yadro.de/digital-messleiste/protokoll.html#a1

Ich habe angefangen eine Auswertesoftware zu schreiben, leider komme ich damit nicht weiter. Ich muss ja mit fallender Flanke die 7 BCD Pakete auslesen und auswerten und da stehe ich auf dem Schlauch.

// für 7 BCD Code

int clockpin = 4;  
int datapin = 5;
float incoming;
unsigned long tempmicros;
 
bool takt = LOW;

void setup() {
  Serial.begin(9600); // seriellen Monitor einstellen
  pinMode(clockpin, INPUT_PULLUP); // Takteingang ist Pin 5 mit eingeschalteten Pullup Widerstand
  pinMode(datapin, INPUT_PULLUP);  // Dateneingang ist Pin 4 mit eingeschalteten Pullup Widerstand
}


 void loop () {
  while(digitalRead(clockpin)==LOW) {} //hier warte ich auf die Lücke LOW zwischen den Protokollen
  tempmicros=micros();                 // bei clockpin = LOW merke ich mir den Zeitstempel
 
 while (digitalRead(clockpin)==HIGH) {} //hier warte ich auf den nächsten HIGH Pegel
  if ((micros()-tempmicros)>80) { //war die Zeit länger als 80 Millisekunden so fängt ein neuer Datenblock an
     decode(); //decode the bit sequence
 }
}


void decode() {  // die Auswertung klappt noch nicht, hier brauch ich Eure Hilfe
  
  if (digitalRead(clockpin)== LOW){takt = HIGH;} 
  if (digitalRead(clockpin)== HIGH){takt = LOW;}
    
  incoming = shiftIn(datapin, takt, LSBFIRST);
  
    Serial.println(incoming, BIN); //print result 
 delay(500);
  }

Könnt Ihr mir da weiter helfen?

Ok ich werde das mal mit dem Excel probieren, … ab Morgen 14 Uhr ist die Schieblehre dann weg :frowning:
oder wird das vom Oszi. nicht mehr benötigt?

Hallo BordIng, leider bin ich bei mir noch nicht mal zu 100% sicher ob ich das richtig verstanden habe,
die Profis hier glaube ich haben das schon verstanden :wink:
die können dir bestimmt auch helfen, jedoch glaube ich das es besser ist wenn du dafür ein Neues Thema auf machst damit die verschiedenen Schieber nicht durcheinander gemischt werden hier im Thema.
wenn du dann noch den Link zu deinem neuen Thema hier Posten würdest wäre das spitze.

EDIT: da das Thema scheinbar mehr gefragt ist als ich mir dachte hier mal den Schieber den ich habe:
Bilder
ich habe den bei Reichelt im 05/13 gekauft

P1170041.JPG
P1170041.JPG

P1170044.JPG
P1170044.JPG

Bildschirmfoto 2014-10-31 um 20.06.02.png
Bildschirmfoto 2014-10-31 um 20.06.02.png

ich habe das noch mal etwas ausgearbeitet.
die Daten im Excel konnte ich richtig darstellen :slight_smile: (dank des Office Forum)

jetzt komme ich so langsam dahinter wie man die Daten interpretieren muss,
es passt auch bis auf die negativen werte :frowning:

Kann da mal jemand drüber schauen und mir sagen was Falsch gemacht wird.

EDIT: Es war ein Formatierungsfehler !!! ich habe ihn ausgebessert und die Excel noch mal hoch geladen,
hier kann man dann auch nachvollziehen wie ich gerechnet habe was ich wie Ignoriert oder interpretiert habe.
habe die Seriellen Daten noch mal neu eingelesen, und siehe an jetzt passt alles.

wie ich die Daten nun auswerten muss habe ich verstanden, wie ich das jedoch in einen Code Umsätze wies ich noch nicht. das kommt noch :slight_smile:
jetzt versuche ich erst mal den Teil:

  for (int i=0; i < bit_Zahl; i++)
    {
      if ( PINA & ( 1 << PA3 ))
        { value |= 1UL << i; }
      while ( !(PINA & (1 << PA2)))  { }
      while ( PINA & ( 1 << PA2 ))   { }                                        
    }  // for Schleifenende

zu verstehen, noch ist mir das immer nicht so richtig klar, … :’( kommt hoffe ich bald.
solange ich das nicht richtig verstehe ist glaube ich das weiter verarbeiten zwecklos für mich.

was für mich noch offen ist, Schieber ans Oszi hegen lassen oder nicht?

Messschieber_Daten.zip (54.8 KB)

Hallo,

hab für Dich den Code fertig gemacht. Ich wünsche mir aber das Du ihn verstehst, damit Du bei der gesamten Sache hier was lernst. Den Code kannste Du und 100py ja mal testen.

Deine Excel ist soweit okay, nur solltest Du Dir angewöhnen die Reihenfolge nicht umzudrehen. Bit 0 ist immer rechts. Die Wertigkeiten werden von rechts nach links immer höher. Nicht umgekehrt. Wer nicht weis das Du sie gespiegelt hast, handiert mit anderen Zahlen wie Du.

@ BordIng:
Wenn Du schon Seiten liest mit Code Beispielen, warum nimmst die dann nicht?
Dein Hauptproblem ist aber, Du nimmst einen Transistor zur Pegelanpassnung, weist das damit das Signal invertiert wird, beachtest das aber nicht im Code.

Dein Kommentar paßt nicht zu dem Befehl davor.

while(digitalRead(clockpin)==LOW) {} //hier warte ich auf die Lücke LOW zwischen den Protokollen

while wartet nicht auf LOW, es wartet auf HIGH. Solange Clock gleich LOW ist, solange verweilt die while Schleife in sich. Erst wenn Clock High ist, wird die while Schleife verlassen. Das macht diese Code Zeile. Du hast aber das Signal invertiert. Also was mußt Du machen?

Wir bleiben erstmal beim 2x24 Bit Meßschieber. Danach kommt der BCD dran. Wobei, wenn Du das hier verstanden hast, kannste den BCD dann auch lösen. Denke ich. Weil das einlesen bleibt fast gleich nur die Interpretation ist anders.

Digitalmessschieber_1x24Bit_Forum.zip (1.89 KB)

das ist ja genial, DANKE DANKE DANKE,

habe es gerade mal getestet und es stimmt zu 100% überein.

DANKE.

Jetzt muss ich es noch richtig verstehen, sonst bringt mir das recht wenig da ich es nicht weiter verarbeiten kann. es sollen ja noch 4 Stück dazu kommen und noch ein Taster, bei mir.

vorab,ich werde meinen Schieber erst mal nicht zum Oszi bringen.

Das mit den bit das die Wertigkeit 0 Rechts ist hatte ich nicht gewusst, dachte das List man von Links nach Rechts, gut zu wissen, fürs nächste mal.

Du musst mir aber noch mal was helfen bei der Erklärung.
ich habe ein 2x24bit Signal vorliegen

das bedeutet für mich
ich bekomme am Pin 24 mal hintereinander in extrem kurzen Abständen ein HIGH - LOW wechsle jedes HIGH interpretiere ich als 1 jedes LOW als 0

jede 0 bzw. 1 ist ein bit

jetzt hast du aber beim einlesen

if ( PINA & ( 1 << PA3 ))  {        // wenn Data (Port.A Bit.3) HIGH ist,

das PINA = Pin nr. 24 (direkt Ansprache ohne Funktion)
was ist das Bit.3 jetzt dort? ich dachte das da entweder HIGH oder LOW anliegen tut.
irgend wie Stehe ich da auf dem Schlauch,

an der Stelle wird doch jedes bit (0 oder 1) der 24bit einzeln eingelesen und dann in die Variable “value” geschrieben?

PINA ist das Port-Eingangsregister. Wenn Bit 3 gesetzt ist, liefert es: 0000 1000

PA3 = Port A, Pin 3. Hat einfach den Wert 3. Wenn man "1" drei mal nach links schiebt hat man: 0000 0001 -> 0000 1000

0000 1000 & 0000 1000 ist ebenfalls 0000 1000. Und das ist "true" (alles ungleich 0 ist true). Damit weiß man dass das Bit gesetzt ist.

Mal einen anderen Fall. PINA hat den Wert 1111 0000

Und man testet ebenfalls ob Bit 3 gesetzt ist: 1111 0000 &

0000 0100

0000 0000

Das ist "false"

Doc_Arduino: Hallo,

hab für Dich den Code fertig gemacht. Ich wünsche mir aber das Du ihn verstehst, damit Du bei der gesamten Sache hier was lernst. Den Code kannste Du und 100py ja mal testen.

Deine Excel ist soweit okay, nur solltest Du Dir angewöhnen die Reihenfolge nicht umzudrehen. Bit 0 ist immer rechts. Die Wertigkeiten werden von rechts nach links immer höher. Nicht umgekehrt. Wer nicht weis das Du sie gespiegelt hast, handiert mit anderen Zahlen wie Du.

[...]

Hey,

funktioniert super! Danke für die tolle Umsetzung!

Serenifly: PINA ist das Port-Eingangsregister. Wenn Bit 3 gesetzt ist, liefert es: 0000 1000

PA3 = Port A, Pin 3. Hat einfach den Wert 3. Wenn man "1" drei mal nach links schiebt hat man: 0000 0001 -> 0000 1000

0000 1000 & 0000 1000 ist ebenfalls 0000 1000. Und das ist "true" (alles ungleich 0 ist true). Damit weiß man dass das Bit gesetzt ist.

Mal einen anderen Fall. PINA hat den Wert 1111 0000

Und man testet ebenfalls ob Bit 3 gesetzt ist: 1111 0000 &

0000 0100

0000 0000

Das ist "false"

ich möchte jetzt nicht, abfällig klingen aber bitte was ist da was?

Lese ich die 24bit alle auf ein mal ein? oder was? ich dachte ich frage nur den zustand ab, also ob Strom anliegt oder nicht.

ich glaube mir fehlt da noch was an Grundwissen zu dem Thema, das ich das verstehen kann. ich versuche das noch mal zu lesen: http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial

Punkt 8 und 9

ich hoffe das mir das irgend wie mal etwas Klarer wird.

Das eine hat doch mit dem anderen erst mal nichts zu tun. Das ist der Code um schnellst möglich abzufragen ob ein I/O Pin High oder Low ist.

Das macht man dann in einer for-Schleife x-mal hintereinander um alle Bits einzulesen.

Ok, also mir fehlt da noch etwas um das zu verstehen. also erst das andere Lesen und dann noch mal Fragen ,-) wenn was unklar ist.

irgend wie sollte ich das verstehen wenn ich 4 weitere Schieber und einen Taster einbauen möchte.

was mein Ziel ist.

so ich glaube meine Frau ist fertig somit bin ich dann mal weg.

Wünsche ein Schönes WE noch.

Hallo,

Serenifly hat schon schön erklärt. :) Ich versuche es nochmal mit meinen Worten.

Es wird mit dem Taktsignal bei LOW das Datensignal abgefragt bzw. eingelesen. Das Taktsignal wird in der Schleife von 0 bis 23 hochgezählt, damit man weis welches Bit man hat in der Reihenfolge und um die Schleife irgendwann beenden zu können.

Da unsere Variabel nach jeden Durchlauf genullt wird, muß ich eine Null vom Datensignal nicht extra reinschreiben an die entsprechende Bitstelle. Also frage ich nur auf logisch 1 ab.

Mit PINA wird der gesamte Port.A abgefragt. Also volle 8 Bit. Wir benötigen aber nur das 3.Bit. Also müssen wir irgendwie einen Vergleich machen, ob Bit 3 logisch 1 ist oder nicht. Vergleichen müssen wir deshalb, weil wir ja nicht wissen ob gerade eine 1 oder eine 0 anliegt. Was folgt ist reine Digitaltechnik bzw. digitale Logik. Wir wollen nur das 3.Bit prüfen ob es 1 ist. Der Rest interessiert uns nicht. Demnach schieben wir ein Bit an die 3. Stelle, das passiert rein im Speicher, und vergleichen das mit dem vollen 8 Bit von Port.A. Den Rest der Umsetzung macht der Compiler.

Der Vergleich ist so wie Serenifly das erklärt hat. Wir nutzen eine UND Verknüpfung. Nur wenn von Port.A an der 3. Stelle das Bit "1" ist, wird danach in unserer Variablen auch eine "1" an die richtige Bitstelle geschrieben. Eine 0 wäre eh schon da, muß man nicht nochmal schreiben.

Vielleicht mußte Dich auch erstmal mit logischen Verknüpfungen beschäftigen. UND, ODER, usw. Der Ursprung der Digitaltechnik war ein NAND Gatter. Damit kann man alles erdenkliche zusammenbauen.

In Deiner Excel haste ja alle Werte binär vorliegen. Damit machste mal paar Übungen rein in Binärschreibweise. Es reichen ja erstmal 4. Bit große Zahlen. Bit 0 bis 3. Daran denken, Bit 0 ist rechts! ;) Damit machste UND, ODER, NAND (negiertes UND), NOR (negiertes ODER). Der Windows-Taschenrechner, kann auch mit Binärzahlen umgehen. Einfach Ansicht auf "Programmierer" wechseln. Damit kannste Deine Rechnung überprüfen.

Hallo Doc_Arduino,

danke erst mal für die Mühe! Ich habe bei dem BCD Modell zwei Transistoren drin, so daß das Signal richtig ankommt. Hab ich vergessen zu erwähnen.

@ BordIng: Wenn Du schon Seiten liest mit Code Beispielen, warum nimmst die dann nicht? Dein Hauptproblem ist aber, Du nimmst einen Transistor zur Pegelanpassnung, weist das damit das Signal invertiert wird, beachtest das aber nicht im Code.

Dein Kommentar paßt nicht zu dem Befehl davor. Code: [Select]

while(digitalRead(clockpin)==LOW) {} //hier warte ich auf die Lücke LOW zwischen den Protokollen

while wartet nicht auf LOW, es wartet auf HIGH. Solange Clock gleich LOW ist, solange verweilt die while Schleife in sich. Erst wenn Clock High ist, wird die while Schleife verlassen. Das macht diese Code Zeile. Du hast aber das Signal invertiert. Also was mußt Du machen?

Leider funktioniert der Code auf den Seiten nur für einen Meßschieber den ich habe. Die anderen drei haben ein anderes (BCD) Signal. Ich werde mal versuchen das 24 Bit Programm auf BCD umzuschreiben.

Hallo,

laut bisherigen Erkenntnissen und lesen im Netz gibt es 3 verschiedene Protokolle, laut meiner Meinung.

a) 7x4 BCD Protokoll, wobei man davon nur 6x4 benötigt b) 2 x 24 Bit Protokoll c) 1x 24 Bit Protokoll

Wobei das 1x24 Bit scheinbar das neueste ist was Verbreitung findet.

Ohne Oszi und ohne Logik-Analyzer würde ich wie folgt vorgehen.

Mit der Wartezeit experimentieren, bis stabile Werte reinkommen. Um nicht laufen neu zu flashen, könnte man auch ein Poti analog anklemmen, den Werte (0 - 1023) durch 4 teilen und den als Wartezeit einstellen. Dann könnte man mit 0 bis 255 live probieren. Den Wert läßt man am Ende mit anzeigen. Klappt aber nur wenn es auch im ms Bereich ist. Bei meinem 2x24 Bit Meßschieber sind µs.

Also, paar Binärwerte mit 24 Bit einlesen. Gut wäre immer +1,00 und -1,00 und paar höhere positiven Werte. Dann guckt man ob man eine Logik erkennt. Folgt die gesamte Zahl nachvollziehbar dem Displaywert oder nicht. Beim BCD Code wird jede Ziffer mit 4 Bit einzeln übertragen. Also müßte man hier 4er Gruppen erkennen die die gewünschte Ziffer jeweils darstellen. Also das was ich hier zu Anfang dachte und von 100py korrigiert wurde.

Wenn Du mit um die 80 bis 500ms nichts reinbekommst, dann könnte Deiner das 2x24 Bit Protokoll haben. Dabei beträgt die Lücke ca. 80µs. Dann könntest meinen Originalcode probieren. Link am Anfang vom Thread und davon wieder am Ende. ;)

Hallo Doc,

mit der Wartezeit habe ich schon so rumprobiert. Das ist aber alles "fishing in the dark". Ich habe mir einen Logic Analyser bestellt, da sollte es was werden.

Gruss BordIng

Hallo,

vernünftige Entscheidung. Kann man immer gebrauchen. Dann wird es wesentlich leichter "zu entschlüsseln" ... :)

Code Erklärung: ich bezweifle nicht das Ihr das wirklich gut macht, das mit dem Register habe ich glaube ich etwas verstanden, auch wenn mir das noch nicht so richtig Logisch in den Kopf will.

auf einem Chip (AVR) habe ich Register in die wird alles und jeder sch.... rein geschrieben. darunter steht in einem Register das nur für den PIN 24 zuständig ist Infos was mit dem PIN ist. Register Blatt 1 = Ein /Ausgang Register Blatt 2 = Einheit Register Blatt 3 = Schwellwert Register Blatt 4 = Echter zustand usw. Ja ich habe das bestimmt in Falscher reihen folge oder Bezeichnung aufgelistet

da ich aber über die Bezeichnung "PINA" Greife ich auf das Register vom Chip zu speziell auf das des Pins 24 und mit der Bezeichnung "PA" Steht wider für das Offene Register und die "3" dahinter sagt welchen Registerblatt gelesen werden soll. In dem Fall ist das Dritte Registerblatt das das den Zustand definiert sprich Schwellwert Überschreiten oder nicht, also 0 oder 1.

Könnte man das mit dem Register so für Doooooffffffeeeee also mich erklären? oder bringe ich da wider etwas durcheinander?

immer schriet für schritt den Code nach unten arbeiten.

Wenn das also Stimmt was ich da oben von mir gegeben habe, Frage ich mich wie ich die Register an eine Pin Nr. Knüpfen kann, Sprich wenn ich Oben angebe PIN 24 & 25 das dann unten im Code das Richtige Register aufgerufen wird. doch das kommt erst dann wenn das was ich oben geschrieben habe stimmt, sonnst weiter schauen und versuchen zu verstehen.

EDIT: habe den ersten Beitrag etwas angepasst damit neue die Ergebnisse etwas besser und schneller finden können. Ich hoffe das stimmt was ich da geschrieben haben, wenn nicht korrigiere ich das gerne.

@BordIng: Könntest du hier im Forum noch Posten von wem der Schieber ist und vielleicht das eine oder andere Bild einstellen. ich würde das dann im ersten Beitrag Verlinken.

Hallo Muecke,

der Meßschieber mit dem 24 Bit Protokoll ist von SINO, das ist ne bekannte Marke. Der hat auch - aud Gehäuse liegen. Die anderen drei Meßschieber haben kein Typenschild, nicht mal einen Hinweis auf den Anleitungen. Die werden von diversen Chinesen produziert und exportiert. Hier liegt +1,5V auf dem Gehäuse.

Bei allen Meßschiebern handelt es sich um Anbaumeßschieber, nicht um die üblichen Handmeßschieber.

Muecke: darunter steht in einem Register das nur für den PIN 24 zuständig ist Infos was mit dem PIN ist.

Nein. Da fängt das Problem schon an.

Für einen Pin braucht man doch nur 1 Bit. Wir haben einen 8-Bit Prozessor, also kann man in einem Register 8 Pins verwalten. Es sind immer 8 Pins zu einen sogenannten "Port" zusammengefasst.

Diese sind mit Buchstaben bezeichnet. Auf dem UNO: B (digital 8 bis 13) C (analog pins) D (digital 0 bis 7)

Auf dem Mega gibt es natürlich mehr. Und da gibt es auch einen Port A. Siehe hier: http://greentechhobby.com/images/Arduino/ArduinoMega.pdf (die gelben Bezeichnungen. z.B. PA1 = Port A, Pin 1)

Jeder Port hat drei Register: DDRx - Data Direction Register -> Richtung PORTx -> Ausgang PINx -> Eingang

Wenn man also ein Register einliest hat man 8 Pins auf einmal (was auch sehr praktisch ist um Pins wirklich parallel zu setzten). Will man nun einen einzelnen Pin herauspicken muss man diesen ausmaskieren. Und das geht wie oben beschrieben mit Schieben und Verunden. Du könntest auch das Arduino Makro bitRead() verwenden. Das macht aber auch nichts anderes. Es gibt auch Prozessoren die auf Assembler-Ebene einzelne Pins direkt ansprechen können. z.B. der 8051/8082. Der AVR hat diese Befehle allerdings nicht, da man hier den Befehlssatz zugunsten größerer Geschwindigkeit reduziert hat (RISC Prozessor).