www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik SCP1000 Drucksensor Problem - Gibt bei höherem Luftdruck einen niedrigeren Wert aus


Autor: Benutzer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!

Ich nutze an einem Arduino Duemilanove den SCP 1000. Angeschlossen ist 
er über 2 Pegelwandler an die SPI Ports (Pin 10-13). DRDY ist nicht 
angeschlossen.

Mit diesem Code habe ich das Problem, dass bei höherem Druck ein 
niedriegerer Wert angezeigt wird.

Wisst ihr woran das liegen kann?

Btw: Sind meine Komentare richtig? Habe mich das erste mal mit SPI 
beschäftigt.

SCP1000:

http://www.sparkfun.com/datasheets/Components/SCP1...

//Pins definieren, werden durchgängig mit diesen Namen benutzt
#define SLAVESELECT 10
#define SPICLOCK 13
#define DATAOUT 11  //MOSI
#define DATAIN 12   //MISO
#define UBLB(a,b)  ( ( (a) << 8) | (b) )
#define UBLB19(a,b) ( ( (a) << 16 ) | (b) )

//Register Adressen
#define REVID 0x00  //ASIC Revision Nummer
#define OPSTATUS 0x04   //Operation Status
#define STATUS 0x07     //ASIC Status
#define START 0x0A      //Konstante Leserate
#define PRESSURE 0x1F   //Druck 3 MSB
#define PRESSURE_LSB 0x20 //Druck 16 LSB
#define TEMP 0x21       //16 bit Temperaut

char rev_in_byte;      
int temp_in;
unsigned long pressure_lsb;
unsigned long pressure_msb;
unsigned long temp_pressure;
unsigned long pressure;

void setup()
{
  byte clr;
  pinMode(DATAOUT, OUTPUT);
  pinMode(DATAIN, INPUT);
  pinMode(SPICLOCK,OUTPUT);
  pinMode(SLAVESELECT,OUTPUT);
  digitalWrite(SLAVESELECT,HIGH); //Sensor ausschalten und neue Konfiguration übernehmen
  
  SPCR = B01010011; //MPIE=0, SPE=1 (on), DORD=0 (MSB first), MSTR=1 (master), CPOL=0 (clock idle when low), CPHA=0 (samples MOSI on rising edge), SPR1=0 & SPR0=0 (500kHz)
  clr=SPSR;
  clr=SPDR;
  delay(10);
  Serial.begin(9600);
  delay(500);

  Serial.println("Initialisiere hohe Leserate");
  write_register(0x03,0x09);
}

void loop()
{
  
  rev_in_byte = read_register(REVID);
  
  pressure_msb = read_register(PRESSURE);
  pressure_msb &= B00000111;
  pressure_lsb = read_register16(PRESSURE_LSB);
  pressure_lsb &= 0x0000FFFF;
  pressure = UBLB19(pressure_msb, pressure_lsb);
  pressure /= 4;
  
  Serial.print("Druck in Pascal [");
  Serial.print(pressure, DEC);  
  Serial.print(" P");
  Serial.print("");
  Serial.println("]");
  
  Serial.print("Druck in Hekto-Pascal [");
  Serial.print(pressure/100, DEC);
  Serial.print(" hPa");
  Serial.print("");
  Serial.println("]");
  
  temp_in = read_register16(TEMP);
  temp_in = temp_in / 20;
  Serial.print("Temperatur in Grad Celcius [");     //Direkte Ausgabe
  Serial.print(temp_in , DEC);
  Serial.println("]");
  
  Serial.println("");
  delay(1500);
  
}

char spi_transfer(volatile char data)
{
  SPDR = data;        // SPDR auf Datenübergabe vorbereiten
  while (!(SPSR & (1<<SPIF)))     // Solange warten bis alle Bytes übertrage wurden
  {
  };
  return SPDR;        // return the received byte
}


char read_register(char register_name)
{
    char in_byte;
    register_name <<= 2;
    register_name &= B11111100; //Register lesen
  
    digitalWrite(SLAVESELECT,LOW); //SPI auswählen
    spi_transfer(register_name); //Datenbyte "in" SPI schreiben
    in_byte = spi_transfer(0x00); //Nichts senden. Gibt Register-Variable aus
    digitalWrite(SLAVESELECT,HIGH);
    delay(10);
    return(in_byte);
  
}

float read_register16(char register_name)
{
    byte in_byte1;
    byte in_byte2;
    float in_word;
    
    register_name <<= 2;
    register_name &= B11111100; //Register lesen

    digitalWrite(SLAVESELECT,LOW); //SPI auswählen
    spi_transfer(register_name); //Datenbyte "in" SPI schreiben
    in_byte1 = spi_transfer(0x00);    
    in_byte2 = spi_transfer(0x00);
    digitalWrite(SLAVESELECT,HIGH);
    in_word = UBLB(in_byte1,in_byte2);
    return(in_word);
}

void write_register(char register_name, char register_value)
{
    register_name <<= 2;
    register_name |= B00000010; //Register lsen

    digitalWrite(SLAVESELECT,LOW); //Datenbyte "in" SPI schreiben
    spi_transfer(register_name); //Send register location
    spi_transfer(register_value); //Send value to record into register
    digitalWrite(SLAVESELECT,HIGH);
} 


Autor: Klaus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Arbeite ich auch grad mit.
So umgerechnet funktionierts.
  press   = 8BitPressureData;
  press <<= 8;
  press  |= 16BitPressureData;
  press <<= 8;
  press  |= 16BitPressureData;
  press  += 2;
  press >>= 2; //dividing / 4

Liefer PA z.B. 100.000
senkt man den Sensor ab, steigt der Luftdruck,
hebt man ihn hoch, sinkt der Luftdruck folglich.

Vg
Klaus

Autor: Benutzer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Super!

Kannst du mir mal deinen kompletten Code posten? Würde ganz gerne beide 
vergleichen und auf meinen Fehler kommen ;)

MFG

Autor: Benutzer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Könntest du mir auch noch knapp erklären wie dein Code funktioniert? 
Find ich ja echt ulkig wieso meine Skale verkehrt herum ist....

MFG

Autor: xmega (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Servus,

Benutzer schrieb:
> Wisst ihr woran das liegen kann?

ich habe dir mal einen funktionierenden Code als Anlage beigelegt.


Gruß XMEGA

Autor: Benutzer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Woah Respekt! Bei mir hat er aber beim Kompilieren irgendwo einen 
Fehler, aber das guck ich mir heute Abend an.

Hast du noch irgend welche Libraries benutzt die nicht Standart sind?

MFG

Autor: xmega (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,


Benutzer schrieb:
> Hast du noch irgendwelche Libraries benutzt die nicht Standard sind?

ich habe den Code auch nur zur Vervollständigung meines Codes 
hergenommen.
Ich arbeite aber mit XMEGAS.

Gruß XMEGA

Autor: Benutzer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hmm daran könnte es bei mir liegen. Ich habe ja den Arduino (atmega 
328). Mal gucken ob ich einen vernünftigen Code zu stande bekomme

MFG

Autor: Benutzer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich hab grad was gefunden:

[LINK]
http://sites.google.com/site/measuringstuff/code-e...
[/LINK]

Ist ein Arduino Mega Code, aber wenn man die Pins auf 10-13 ändert kann 
man den auch mit dem Arduino benutzen. Funktioniert einwandfrei!

MFG

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.