Hallo,
das ist ein AT90CAN128. Der Sensor ist ein Temperatursensor ADT 7301.
Hallo,
das ist ein AT90CAN128. Der Sensor ist ein Temperatursensor ADT 7301.
SPI2X befindet sich im Register SPSR (DORD wäre noch im SPCR Register).
Versuche es einmal zu ändern.
MfG Hannes
Hallo,
das mit dem SPI2X ist mir voll durchgegangen. Ich habe es jetzt mal rausgenommen und lasse das Ganze einfach auf f_clkio/64 laufen nur mit SPR1 gesetzt.
Leider bringt das noch nicht den erwünschten Erfolg. Auch die Einstellung DORD bringt erst einmal scheinbar keine sichtbare Änderung.
Ich habe so langsam das Gefühl, dass es irgendwie an dem Sensor liegt oder eben am Zusammenspiel. Wenn ich den Sensor abnehme und das Programm laufen lasse, habe ich in "data" immer eine "Null" stehen. Wenn ich ihn anschließe, scheinen Daten empfangen zu werden, allerdings nur Müll wie es scheint.
Laut Datenblatt muss das 3te Bit eine 1 sein (Shutdown Bit). Die restlichen 15Bit müssen 0 sein. Bei einem 8Bit Register (wie bei deinem µC) musst du einmal 0x20 senden und dann 0x00.
MfG Hannes
Hallo,
das dient ja nur zum schlafen legen. Ich will den Sensor ja nicht schlafen legen. Ich sende jetzt einfach 0x00. Da nur das 3. Bit wichtig ist, sollen die anderen ja null sein. Das 3. Bit ist dann eben auch null, also der Sensor wird nicht schlafen gelegt.
Ich bin irgendwie soweit, dass ich immer die gleichen Daten empfange, wobei ich allerdings das Gefühl habe, dass der Datenmüll weniger vom Sensor kommt, als mehr durch meine Speicherung und Verarbeitung der Daten.
Code:uint16_t data= 0; unsigned char str[8]; /* Daten auslesen */ PORTE &= ~(1<<PE2); // Sensor aktivieren, CS -> LOW _delay_us(10); // wait SPDR= 0x00; while(!(SPSR & (1<<SPIF))); data= (SPDR<<8) & 0x3FFF; // 8 Bit auslesen SPDR= 0x00; while(!(SPSR & (1<<SPIF))); data+= SPDR; // Weitere 8 Bit auslesen _delay_us(10); // wait PORTE |= (1<<PE2); // Sensor deaktivieren // Daten umrechnen, Formeln aus Datenblatt if ((0x2000 & temp_data) == 0x2000) { data = (int)(data - 16384)/32; } else { data = (int)(data/32); } utoa(data,(char*)str,10); send(str);
Ich würde einmal versuchen 2 einzelne 8Bit variablen zu verwenden. Wenn das funktioniert kann man weiterschauen.
In etwa so:
....
data1=spdr
....
data2=spdr
Anschließend kann man die 2x 8bit in 16bit wandeln (wenn es so funktioniert).
PS: Mit dem Shutdownbit hast du recht. Habe ich falsch gelesen (zu schnell drübergeschaut).
MfG Hannes
Hallo,
an den einzelnen Variablen kann es nicht liegen.
Es werden immer die gleichen Daten ausgelesen, egal, welche Temperatur herscht. Das konnte ich mitlerweile mit einem kleinen LogicAnalyzer überprüfen. Die Clock läuft auch, CS tuts auch.
Anhand der Daten des LogicAnalyzers konnte ich dann eben auch sehen, dass die Daten, die dann rein kommen auch richtig umgerechnet werden. Es kommen aber eben keine sinnvollen Daten rein.
Ich würde sagen, dass es nur an den Einstellungen des SPI liegen kann, aber ich finde den Fehler einfach nicht.
Beste Grüße
Lesezeichen