Vielen Dank das war die Lösung.![]()
Im Studio6 gehts so: Reiter Project => Properties => Toolchain => AVR/GNU C Compiler => Directories => IncludePaths===>> ADD ITEM
Vielen Dank das war die Lösung.![]()
Im Studio6 gehts so: Reiter Project => Properties => Toolchain => AVR/GNU C Compiler => Directories => IncludePaths===>> ADD ITEM
Ich bin jetzt schon ein ganzes Stück weiter gekommen und versuche einen DS1621 zu lesen.
Sensordefines:
Einschaltfunct.:PHP-Code:
uint16_t ds16_temperatur;
#define DS1621_Write 0x90
#define DS1621_Read 0x91
void ds1621_einschalten(void)
Daraufhin=>>>PHP-Code:
{
i2c_init();
i2c_start(DS1621_Write);
i2c_write(0xEE);
i2c_stop();
i2c_start(DS1621_Write);
i2c_write(0xAA);
i2c_stop();
_delay_ms(200);
}
Sensorabfrage:
Jetzt noch ==>PHP-Code:
i2c_start(DS1621_Read);
ds16_temperatur = i2c_readAck(); // <== int16_t Rückgabewert
i2c_readNak();
i2c_stop(); // <==
Stringformatierung:
PHP-Code:
char DEES [10];
sprintf(DEES,"DSTEMP: %d",ds16_temperatur);
Soweit so gut. Keine Fehler beim Kompilieren. Einziges Problem ist es kommt immer eine 0 an![]()
Ist doch klar. Die Compiler bringen nach ein Uhr nachts immer wieder Schrott (woran das nur liegen kann???) - nur bei mir liefs gestern nach eins (nach fehlerbehafteten Abenden) sauber - ´n RC-5-Dekoder im Interrupt.
Spass beiseite. Dein guter Wille ist im Code ja schon zu sehen, aber Du musst ziemlich kräftiger wollen, wenn Du bei den Atmels bei EINEM i2c_read ZWEI Bytes (Zitat aus Deinem Code : // <== int16_t Rückgabewert) haben willst. Meine Atmels spendieren dabei immer nur ein Byte : ( .
Abhilfe: lies mal diese Schnippsel (klick) - beachte, dass dabei aus unerfindlichen Gründen (angeblich will ich, dass der Quellcode übersichtlicher ist) teilweise zwei oder drei Befehle in einer einzigen Zeile stehen. Es ist der alte Trick aus zwei Bytes ein Word zu löten. Und achte bitte auch auf die Typdefinitionen uint8_t und uint16_t.
Viel Erfolg.
Geändert von oberallgeier (26.11.2012 um 08:20 Uhr) Grund: Wieder mal Definition und Deklaration geschüttelt
Ciao sagt der JoeamBerg
OK, weiterprobiert...
so müsste es doch klappen???? wenn ich aber TempH und TempL am LCD ausgebe, habe ich für beide den Wert 0...???PHP-Code:
unsigned char ret, TempH, TempL, data, test;
void ds1621_lesen(void)
{
i2c_start(DS1621_Read);
data = i2c_readAck();
TempH = data;
data = i2c_readNak();
TempL = data;
i2c_stop();
}
![]()
Sozusagen experimentelle Softwareentwicklung . . .
Ich kenne Dein dsDingsda nicht, ich will auch nicht DEIN Datenblatt für Dich lesen. Seltsam kommt mir vor, dass Du ab Register Null des Teilchens Deine Daten suchst - stimmt das so? Ich Suche meine Daten in I²C-Satelliten meist an einem bestimmten Registerplatz.
Steht so auch im zitierten Code .Code:// ================================================================================= ... // ---------------------------------------------------------------------------- // Lesen von 6 Registern ab Register 0x02. X, Y, Z-Koordinate ... ret = i2c_start (I2C_BMA_W); ret = i2c_write (0x02); i2c_stop (); // ret = i2c_start (I2C_BMA_R); ret = i2c_read (ACK); x = (int16_t)ret; ret = i2c_read (ACK); x = x | ((int16_t)ret << 8); x /= 64; ... // ----------------------------------------------------------------------------
Ciao sagt der JoeamBerg
Jetzt hab ichs gerafft!!!
Works!PHP-Code:
void ds1621_lesen(void)
{
i2c_start(DS1621_Write);
i2c_write(0xAA);
i2c_stop();
i2c_rep_start(DS1621_Read);
TempH = i2c_readAck();
TempL = i2c_readNak();
i2c_stop();
ret = (TempH * 1 + TempL /256); // <===Noch nicht gut!
}
DANKESCHÖN.
Geändert von Natureengeneer (26.11.2012 um 11:58 Uhr)
Ja, sieht so aus. Es gibt sicher zahllose Beispiele um zwei Bytes zu einem Word zusammenzulöten.... ret = (TempH * 1 + TempL /256); // <===Noch nicht gut! ...
(M)Eines wäre:
Die Makrodefiniton muss halt an irgendeiner Stelle deponiert werden - das ist Deine Freiheit. Ohne Makro gehts natürlich auch.Code:// ============================================================================== = // ============================================================================== = void I2CTST01 (void) // I2C-Testroutine ... uint8_t btst1 = 0; // Read-back-Byte vom Slave uint8_t btst2 = 0; uint8_t btst3 = 0; ... btst2 = i2c_read (ACK); // btst3 = i2c_read (ACK); // ... //#define uniq(LOW,HEIGHT) ((HEIGHT << 8)|LOW) // ###>>> Macro 2x 8Bit --> 16Bit iword = uniq(btst3, btst4); // 2à 8Bit --> 16Bit itoa(iword, zahlwort, 10); // uart_puts("\tWert für Word4high3low\t"); // Ausgabe uart_puts(zahlwort); // ... // === Ende I2CTST01 (void) ============================ // ============================================================================== =
Geändert von oberallgeier (26.11.2012 um 17:00 Uhr) Grund: selber gedankenlos
Ciao sagt der JoeamBerg
Lesezeichen