Pages: 1 [2]   Go Down
Author Topic: 32Bit-Zahl als Bit-Array / --> Einlesen eines Absolutwertgebers  (Read 1309 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Sr. Member
****
Karma: 1
Posts: 353
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hi,

komisch, hatte gestern nacht noch mal ein Posting mit Erfolgsmeldung nachgeschoben. Irgendwie ist das weg????
Zum OsziBild: Takt ist gelb (6 Pakete a 4 Takte) , Data ist blau. Leider sieht man auf dem Bild nur ca. 75% des gesamten Telegramms. Sonst wäre nichts zu erkennen gewesen.

Das deaktivieren des Interrupts hat nichts gebracht. Das mit den Neusetzen der Zeit in der Int hab ich auch mal probiert. Aber ich wollte in der Int so wenig Code wie möglich halten. Drum nur das Setzen des newdata

Die zündende Idee war wie folgt:

Ich hab am Ende der Loop noch ein delay(1) eingefügt. Dann war auf jeden Fall sicher gestellt, daß im Falle einer Datenübertragung einmal die Int-Routine durchlaufen wird.
Anscheinend gab es Zustände, wo das Hauptprogramm "zu schnell" war.
Der Code sieht jetzt so aus:

Code:
const int data = 3;
boolean newdata = LOW;
int ctr;
unsigned long time;
long distance = 0;
float Position;


void setup(){
  Serial.begin (57600);
  pinMode(data, INPUT);
  attachInterrupt(0, INT01, RISING);   //(UNO: Int0 = PIN 2)
}

void loop(){
  X_Achse();
  delay(1);
}

void X_Achse() {
  if (newdata) {
    time = millis();
  }
  newdata = LOW; 

  if ((millis() - time) >= 20 ) {
     if (ctr == 24) {
       distance = distance >>1;      // erstes Bit verwerfen
       if bitRead(distance,20) {     // negativer Wert??
         bitWrite(distance,20,0);
         Position = float(distance/-100.0);  // Wert auf mm normieren
       }
       else {
         Position = float(distance/100.0);
       }
      Serial.println (Position);
    }
    ctr = 0;
  } 
 
}

void INT01() {
  newdata = HIGH;
  bitWrite(distance, ctr, !digitalRead(data));
  ctr=ctr+1;
}

Jetzt bekomm ich alle 130 ms einen RICHTIGEN (24Bit langen) Wert :-)

Quote
Ausserdem sollten distance und ctr als volatile deklariert werden. ( Damit der compiler berücksichtigt, dass Takt() und loop() gleichzeitig laufen und er keine falschen Optimierungen vornimmt.)
OK.... sagt mir momentan nichts, werd mich aber mal zu volatile einlesen.


Danke für deine geduldigen Antworten.
Sorry nur nochmal dass das posting von gestern Nacht irgendwie weg war.
Logged

Arduino 1.0.5 | Arduino UNO & MEGA | Arduino 1.54r2 mit DUE

Pages: 1 [2]   Go Up
Jump to: